From 2bf04d1f045f27a265ed1b1916e5eef929c13bae Mon Sep 17 00:00:00 2001 From: Thomas Klausner Date: Sun, 2 Feb 2025 19:07:13 +0100 Subject: [PATCH 001/663] build: do not define _POSIX_C_SOURCE on NetBSD It leads to missing symbols, see #4180. --- Makefile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 0c99eeef..0f5431c7 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,7 @@ ifeq ($(OS),Windows_NT) $(error Windows is not supported) +else + detected_OS := $(shell uname -s) endif VERSION := 0.25.1 @@ -27,7 +29,10 @@ OBJ := $(SRC:.c=.o) ARFLAGS := rcs CFLAGS ?= -O3 -Wall -Wextra -Wshadow -Wpedantic -Werror=incompatible-pointer-types override CFLAGS += -std=c11 -fPIC -fvisibility=hidden -override CFLAGS += -D_POSIX_C_SOURCE=200112L -D_DEFAULT_SOURCE +ifneq ($(detected_OS),NetBSD) +override CFLAGS += -D_POSIX_C_SOURCE=200112L +endif +override CFLAGS += -D_DEFAULT_SOURCE override CFLAGS += -Ilib/src -Ilib/src/wasm -Ilib/include # ABI versioning From 60b76c78347f4bd1a2ca17ee677abae524b65e18 Mon Sep 17 00:00:00 2001 From: Thomas Klausner Date: Sun, 2 Feb 2025 19:16:01 +0100 Subject: [PATCH 002/663] Revert "build: do not define _POSIX_C_SOURCE on NetBSD" This reverts commit 54921453da116356470c51b42dfbf2883a488238. --- Makefile | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 0f5431c7..0c99eeef 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,5 @@ ifeq ($(OS),Windows_NT) $(error Windows is not supported) -else - detected_OS := $(shell uname -s) endif VERSION := 0.25.1 @@ -29,10 +27,7 @@ OBJ := $(SRC:.c=.o) ARFLAGS := rcs CFLAGS ?= -O3 -Wall -Wextra -Wshadow -Wpedantic -Werror=incompatible-pointer-types override CFLAGS += -std=c11 -fPIC -fvisibility=hidden -ifneq ($(detected_OS),NetBSD) -override CFLAGS += -D_POSIX_C_SOURCE=200112L -endif -override CFLAGS += -D_DEFAULT_SOURCE +override CFLAGS += -D_POSIX_C_SOURCE=200112L -D_DEFAULT_SOURCE override CFLAGS += -Ilib/src -Ilib/src/wasm -Ilib/include # ABI versioning From 53119046195f7dd13a6eae33427b103a104230f8 Mon Sep 17 00:00:00 2001 From: Thomas Klausner Date: Sun, 2 Feb 2025 20:26:06 +0100 Subject: [PATCH 003/663] build: fix compilation on NetBSD a different way --- lib/src/portable/endian.h | 6 +++++- lib/src/query.c | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/src/portable/endian.h b/lib/src/portable/endian.h index 6aa4438d..51defc5e 100644 --- a/lib/src/portable/endian.h +++ b/lib/src/portable/endian.h @@ -18,16 +18,20 @@ #if defined(HAVE_ENDIAN_H) || \ defined(__linux__) || \ defined(__GNU__) || \ + defined(__NetBSD__) || \ defined(__OpenBSD__) || \ defined(__CYGWIN__) || \ defined(__MSYS__) || \ defined(__EMSCRIPTEN__) +#if defined(__NetBSD__) +#define _NETBSD_SOURCE 1 +#endif + # include #elif defined(HAVE_SYS_ENDIAN_H) || \ defined(__FreeBSD__) || \ - defined(__NetBSD__) || \ defined(__DragonFly__) # include diff --git a/lib/src/query.c b/lib/src/query.c index 05eddef5..6293bd9f 100644 --- a/lib/src/query.c +++ b/lib/src/query.c @@ -1,3 +1,7 @@ +#if defined(__NetBSD__) && defined(_POSIX_C_SOURCE) +#undef _POSIX_C_SOURCE +#endif + #include "tree_sitter/api.h" #include "./alloc.h" #include "./array.h" From 14647b2a38fb48d5328df1dc11cc8d00b0caa9c3 Mon Sep 17 00:00:00 2001 From: Thomas Klausner Date: Sun, 2 Feb 2025 21:33:18 +0100 Subject: [PATCH 004/663] build: add a comment explaining why we undef _POSIX_C_SOURCE --- lib/src/query.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/src/query.c b/lib/src/query.c index 6293bd9f..eb4e906c 100644 --- a/lib/src/query.c +++ b/lib/src/query.c @@ -1,3 +1,8 @@ +/* + * On NetBSD, defining standard requirements like this removes symbols + * from the namespace; however, we need non-standard symbols for + * endian.h. + */ #if defined(__NetBSD__) && defined(_POSIX_C_SOURCE) #undef _POSIX_C_SOURCE #endif From f95e0e3a56de0b70e06132c5bd65329605f1c438 Mon Sep 17 00:00:00 2001 From: Roberto Huertas Date: Wed, 5 Feb 2025 13:04:08 +0100 Subject: [PATCH 005/663] fix(web): provide type in the exports When using TypeScript projects using other module settings than CommonJs, the types were not correctly exposed, and the compilation failed. This adds the types path to the exports so compilation works for `module: NodeNext` and other variants. --- lib/binding_web/package-lock.json | 4 ++-- lib/binding_web/package.json | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json index 688e971f..a240da31 100644 --- a/lib/binding_web/package-lock.json +++ b/lib/binding_web/package-lock.json @@ -1,12 +1,12 @@ { "name": "web-tree-sitter", - "version": "0.25.0", + "version": "0.25.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "web-tree-sitter", - "version": "0.25.0", + "version": "0.25.1", "license": "MIT", "devDependencies": { "@eslint/js": "^9.19.0", diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json index d394b2f9..23122e06 100644 --- a/lib/binding_web/package.json +++ b/lib/binding_web/package.json @@ -19,11 +19,13 @@ "exports": { ".": { "import": "./tree-sitter.js", - "require": "./tree-sitter.cjs" + "require": "./tree-sitter.cjs", + "types": "./web-tree-sitter.d.ts" }, "./debug": { "import": "./debug/tree-sitter.js", - "require": "./debug/tree-sitter.cjs" + "require": "./debug/tree-sitter.cjs", + "types": "./web-tree-sitter.d.ts" } }, "types": "web-tree-sitter.d.ts", From 1a80a1f41376f862014c4ed0a549d49873921dc1 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Tue, 4 Feb 2025 23:32:29 -0500 Subject: [PATCH 006/663] fix: add `generate` crate to workspace members --- Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.toml b/Cargo.toml index de45d7d2..79aa8835 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ default-members = ["cli"] members = [ "cli", "cli/config", + "cli/generate", "cli/loader", "lib", "lib/language", From 74d7ca8582d187591ec7ecbe1e0ca7ca428be7b0 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sat, 8 Feb 2025 12:44:49 -0500 Subject: [PATCH 007/663] fix(rust): adapt to new clippy lints --- cli/generate/src/render.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/cli/generate/src/render.rs b/cli/generate/src/render.rs index dc8f0825..e369e2c9 100644 --- a/cli/generate/src/render.rs +++ b/cli/generate/src/render.rs @@ -1847,11 +1847,11 @@ impl Generator { '\u{007F}' => "DEL", '\u{FEFF}' => "BOM", '\u{0080}'..='\u{FFFF}' => { - result.push_str(&format!("u{:04x}", c as u32)); + write!(result, "u{:04x}", c as u32).unwrap(); break 'special_chars; } '\u{10000}'..='\u{10FFFF}' => { - result.push_str(&format!("U{:08x}", c as u32)); + write!(result, "U{:08x}", c as u32).unwrap(); break 'special_chars; } '0'..='9' | 'a'..='z' | 'A'..='Z' | '_' => unreachable!(), @@ -1882,11 +1882,9 @@ impl Generator { '\r' => result += "\\r", '\t' => result += "\\t", '\0' => result += "\\0", - '\u{0001}'..='\u{001f}' => result += &format!("\\x{:02x}", c as u32), - '\u{007F}'..='\u{FFFF}' => result += &format!("\\u{:04x}", c as u32), - '\u{10000}'..='\u{10FFFF}' => { - result.push_str(&format!("\\U{:08x}", c as u32)); - } + '\u{0001}'..='\u{001f}' => write!(result, "\\x{:02x}", c as u32).unwrap(), + '\u{007F}'..='\u{FFFF}' => write!(result, "\\u{:04x}", c as u32).unwrap(), + '\u{10000}'..='\u{10FFFF}' => write!(result, "\\U{:08x}", c as u32).unwrap(), _ => result.push(c), } } From a40265cbebfd6401d21eb095e250937915c9c3f7 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sat, 8 Feb 2025 13:06:44 -0500 Subject: [PATCH 008/663] refactor(web): rename `tree-sitter.js` to `web-tree-sitter.js` This is not breaking for consumers of the web bindings, nor the playground as both filenames will be kept in the .github.io repo --- cli/build.rs | 4 +- cli/src/playground.html | 2 +- cli/src/playground.rs | 12 +- docs/src/6-contributing.md | 2 +- docs/src/7-playground.md | 2 +- lib/binding_web/.gitignore | 4 +- lib/binding_web/CONTRIBUTING.md | 2 +- lib/binding_web/README.md | 14 +- ...{tree-sitter.d.ts => web-tree-sitter.d.ts} | 0 lib/binding_web/package-lock.json | 1099 ++++++++++++----- lib/binding_web/package.json | 46 +- lib/binding_web/script/build.js | 16 +- .../script/check-artifacts-fresh.ts | 2 +- lib/binding_web/src/bindings.ts | 2 +- lib/binding_web/src/constants.ts | 2 +- lib/binding_web/vitest.config.ts | 2 +- xtask/src/build_wasm.rs | 12 +- xtask/src/check_wasm_exports.rs | 2 +- xtask/src/main.rs | 2 +- 19 files changed, 853 insertions(+), 374 deletions(-) rename lib/binding_web/lib/{tree-sitter.d.ts => web-tree-sitter.d.ts} (100%) diff --git a/cli/build.rs b/cli/build.rs index 04406487..f0eacefd 100644 --- a/cli/build.rs +++ b/cli/build.rs @@ -53,8 +53,8 @@ fn main() { fn web_playground_files_present() -> bool { let paths = [ "../docs/src/assets/js/playground.js", - "../lib/binding_web/tree-sitter.js", - "../lib/binding_web/tree-sitter.wasm", + "../lib/binding_web/web-tree-sitter.js", + "../lib/binding_web/web-tree-sitter.wasm", ]; paths.iter().all(|p| Path::new(p).exists()) diff --git a/cli/src/playground.html b/cli/src/playground.html index 018c4ced..e4d02ed5 100644 --- a/cli/src/playground.html +++ b/cli/src/playground.html @@ -92,7 +92,7 @@ diff --git a/cli/src/playground.rs b/cli/src/playground.rs index 1fdaa057..bce1a18c 100644 --- a/cli/src/playground.rs +++ b/cli/src/playground.rs @@ -34,8 +34,8 @@ macro_rules! optional_resource { } optional_resource!(get_playground_js, "docs/src/assets/js/playground.js"); -optional_resource!(get_lib_js, "lib/binding_web/tree-sitter.js"); -optional_resource!(get_lib_wasm, "lib/binding_web/tree-sitter.wasm"); +optional_resource!(get_lib_js, "lib/binding_web/web-tree-sitter.js"); +optional_resource!(get_lib_wasm, "lib/binding_web/web-tree-sitter.wasm"); fn get_main_html(tree_sitter_dir: Option<&Path>) -> Cow<'static, [u8]> { tree_sitter_dir.map_or( @@ -79,16 +79,16 @@ pub fn serve(grammar_path: &Path, open_in_browser: bool) -> Result<()> { response(&playground_js, &js_header) } } - "/tree-sitter.js" => { + "/web-tree-sitter.js" => { if lib_js.is_empty() { - redirect("https://tree-sitter.github.io/tree-sitter.js") + redirect("https://tree-sitter.github.io/web-tree-sitter.js") } else { response(&lib_js, &js_header) } } - "/tree-sitter.wasm" => { + "/web-tree-sitter.wasm" => { if lib_wasm.is_empty() { - redirect("https://tree-sitter.github.io/tree-sitter.wasm") + redirect("https://tree-sitter.github.io/web-tree-sitter.wasm") } else { response(&lib_wasm, &wasm_header) } diff --git a/docs/src/6-contributing.md b/docs/src/6-contributing.md index 4584be4c..e53b85a1 100644 --- a/docs/src/6-contributing.md +++ b/docs/src/6-contributing.md @@ -197,7 +197,7 @@ and the tree-sitter module is fetched from [here][js url]. This, along with the [go package]: https://pkg.go.dev/github.com/tree-sitter/go-tree-sitter [go ts]: https://github.com/tree-sitter/go-tree-sitter [highlight crate]: https://crates.io/crates/tree-sitter-highlight -[js url]: https://tree-sitter.github.io/tree-sitter.js +[js url]: https://tree-sitter.github.io/web-tree-sitter.js [lib crate]: https://crates.io/crates/tree-sitter [mdBook]: https://rust-lang.github.io/mdBook [mdbook cli]: https://rust-lang.github.io/mdBook/guide/installation.html diff --git a/docs/src/7-playground.md b/docs/src/7-playground.md index 90f97685..92e219a8 100644 --- a/docs/src/7-playground.md +++ b/docs/src/7-playground.md @@ -102,7 +102,7 @@ you must use at least one capture, like (node_name) @capture-nameLANGUAGE_BASE_URL = "https://tree-sitter.github.io"; diff --git a/lib/binding_web/.gitignore b/lib/binding_web/.gitignore index d7edb1e8..02a02f64 100644 --- a/lib/binding_web/.gitignore +++ b/lib/binding_web/.gitignore @@ -1,6 +1,8 @@ debug/ dist/ -tree-sitter* +web-tree-sitter* +!web-tree-sitter.d.ts +!web-tree-sitter.d.ts.map lib/tree-sitter* lib/*.c lib/*.h diff --git a/lib/binding_web/CONTRIBUTING.md b/lib/binding_web/CONTRIBUTING.md index 7072abe0..b37989f2 100644 --- a/lib/binding_web/CONTRIBUTING.md +++ b/lib/binding_web/CONTRIBUTING.md @@ -120,7 +120,7 @@ npm test ### Debugging You might have noticed that when you ran `npm build`, the build process generated a couple of [sourcemaps][sourcemap]: -`tree-sitter.js.map` and `tree-sitter.wasm.map`. These sourcemaps can be used to debug the library in the browser, and are +`web-tree-sitter.js.map` and `web-tree-sitter.wasm.map`. These sourcemaps can be used to debug the library in the browser, and are shipped with the library on both NPM and the GitHub releases. #### Tweaking the Emscripten build diff --git a/lib/binding_web/README.md b/lib/binding_web/README.md index 3713df5e..7438aa04 100644 --- a/lib/binding_web/README.md +++ b/lib/binding_web/README.md @@ -9,11 +9,11 @@ WebAssembly bindings to the [Tree-sitter](https://github.com/tree-sitter/tree-si ## Setup -You can download the `tree-sitter.js` and `tree-sitter.wasm` files from [the latest GitHub release][gh release] and load +You can download the `web-tree-sitter.js` and `web-tree-sitter.wasm` files from [the latest GitHub release][gh release] and load them using a standalone script: ```html - + - diff --git a/docs/src/assets/js/playground.js b/docs/src/assets/js/playground.js index 73675f72..cebd7b52 100644 --- a/docs/src/assets/js/playground.js +++ b/docs/src/assets/js/playground.js @@ -487,12 +487,12 @@ window.initializePlayground = async (opts) => { const containerHeight = outputContainerScroll.clientHeight; const offset = treeRowHighlightedIndex * lineHeight; if (scrollTop > offset - 20) { - $(outputContainerScroll).animate({ scrollTop: offset - 20 }, 150); + outputContainerScroll.scrollTo({ top: offset - 20, behavior: 'smooth' }); } else if (scrollTop < offset + lineHeight + 40 - containerHeight) { - $(outputContainerScroll).animate( - { scrollTop: offset - containerHeight + 40 }, - 150, - ); + outputContainerScroll.scrollTo({ + top: offset - containerHeight + 40, + behavior: 'smooth' + }); } } } From de141362d5c88b0324b6d1446d6706d623aa0f75 Mon Sep 17 00:00:00 2001 From: Omar-xt Date: Tue, 19 Aug 2025 14:13:50 +0600 Subject: [PATCH 306/663] build(zig): fix package name --- build.zig.zon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.zig.zon b/build.zig.zon index 0dbfa9de..429d4b7e 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -1,5 +1,5 @@ .{ - .name = "tree-sitter", + .name = .@"tree-sitter", .version = "0.25.8", .paths = .{ "build.zig", From 7bc8f76667bb80eb5bc1d18d1a39ce94311bf991 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Aug 2025 06:59:44 +0000 Subject: [PATCH 307/663] build(deps): bump the cargo group with 5 updates Bumps the cargo group with 5 updates: | Package | From | To | | --- | --- | --- | | [anyhow](https://github.com/dtolnay/anyhow) | `1.0.98` | `1.0.99` | | [cc](https://github.com/rust-lang/cc-rs) | `1.2.32` | `1.2.33` | | [clap](https://github.com/clap-rs/clap) | `4.5.44` | `4.5.45` | | [thiserror](https://github.com/dtolnay/thiserror) | `2.0.12` | `2.0.15` | | [ureq](https://github.com/algesten/ureq) | `3.0.12` | `3.1.0` | Updates `anyhow` from 1.0.98 to 1.0.99 - [Release notes](https://github.com/dtolnay/anyhow/releases) - [Commits](https://github.com/dtolnay/anyhow/compare/1.0.98...1.0.99) Updates `cc` from 1.2.32 to 1.2.33 - [Release notes](https://github.com/rust-lang/cc-rs/releases) - [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md) - [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.32...cc-v1.2.33) Updates `clap` from 4.5.44 to 4.5.45 - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.44...clap_complete-v4.5.45) Updates `thiserror` from 2.0.12 to 2.0.15 - [Release notes](https://github.com/dtolnay/thiserror/releases) - [Commits](https://github.com/dtolnay/thiserror/compare/2.0.12...2.0.15) Updates `ureq` from 3.0.12 to 3.1.0 - [Changelog](https://github.com/algesten/ureq/blob/main/CHANGELOG.md) - [Commits](https://github.com/algesten/ureq/compare/3.0.12...3.1.0) --- updated-dependencies: - dependency-name: anyhow dependency-version: 1.0.99 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: cc dependency-version: 1.2.33 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: clap dependency-version: 4.5.45 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: thiserror dependency-version: 2.0.15 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: ureq dependency-version: 3.1.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 44 ++++++++++++++++++++-------------------- Cargo.toml | 8 ++++---- crates/loader/Cargo.toml | 2 +- crates/xtask/Cargo.toml | 2 +- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3cc5f2b9..e0a63e33 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -96,9 +96,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" [[package]] name = "arbitrary" @@ -190,9 +190,9 @@ checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cc" -version = "1.2.32" +version = "1.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2352e5597e9c544d5e6d9c95190d5d27738ade584fa8db0a16e130e5c2b5296e" +checksum = "3ee0f8803222ba5a7e2777dd72ca451868909b1ac410621b676adf07280e9b5f" dependencies = [ "jobserver", "libc", @@ -245,9 +245,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.44" +version = "4.5.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c1f056bae57e3e54c3375c41ff79619ddd13460a17d7438712bd0d83fda4ff8" +checksum = "1fc0e74a703892159f5ae7d3aac52c8e6c392f5ae5f359c70b5881d60aaac318" dependencies = [ "clap_builder", "clap_derive", @@ -286,9 +286,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.41" +version = "4.5.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" +checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" dependencies = [ "heck", "proc-macro2", @@ -1835,11 +1835,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "80d76d3f064b981389ecb4b6b7f45a0bf9fdac1d5b9204c7bd6714fecc302850" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.15", ] [[package]] @@ -1855,9 +1855,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "44d29feb33e986b6ea906bd9c3559a856983f92371b3eaa5e83782a351623de0" dependencies = [ "proc-macro2", "quote", @@ -2067,7 +2067,7 @@ dependencies = [ "serde", "serde_json", "smallbitvec", - "thiserror 2.0.12", + "thiserror 2.0.15", "topological-sort", "tree-sitter", "url", @@ -2079,7 +2079,7 @@ version = "0.26.0" dependencies = [ "regex", "streaming-iterator", - "thiserror 2.0.12", + "thiserror 2.0.15", "tree-sitter", ] @@ -2120,7 +2120,7 @@ dependencies = [ "memchr", "regex", "streaming-iterator", - "thiserror 2.0.12", + "thiserror 2.0.15", "tree-sitter", ] @@ -2166,9 +2166,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "3.0.12" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f0fde9bc91026e381155f8c67cb354bcd35260b2f4a29bcc84639f762760c39" +checksum = "00432f493971db5d8e47a65aeb3b02f8226b9b11f1450ff86bb772776ebadd70" dependencies = [ "base64", "flate2", @@ -2184,9 +2184,9 @@ dependencies = [ [[package]] name = "ureq-proto" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59db78ad1923f2b1be62b6da81fe80b173605ca0d57f85da2e005382adf693f7" +checksum = "c5b6cabebbecc4c45189ab06b52f956206cea7d8c8a20851c35a85cb169224cc" dependencies = [ "base64", "http", @@ -2631,9 +2631,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.8" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" dependencies = [ "rustls-pki-types", ] diff --git a/Cargo.toml b/Cargo.toml index 226cdfab..67c60713 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -104,10 +104,10 @@ codegen-units = 256 [workspace.dependencies] ansi_colours = "1.2.3" anstyle = "1.0.11" -anyhow = "1.0.98" +anyhow = "1.0.99" bstr = "1.12.0" -cc = "1.2.32" -clap = { version = "4.5.44", features = [ +cc = "1.2.33" +clap = { version = "4.5.45", features = [ "cargo", "derive", "env", @@ -149,7 +149,7 @@ smallbitvec = "2.6.0" streaming-iterator = "0.1.9" tar = "0.4.40" tempfile = "3.20.0" -thiserror = "2.0.12" +thiserror = "2.0.15" tiny_http = "0.12.0" toml = "0.8.23" topological-sort = "0.2.2" diff --git a/crates/loader/Cargo.toml b/crates/loader/Cargo.toml index c6ab32cb..bd44f87c 100644 --- a/crates/loader/Cargo.toml +++ b/crates/loader/Cargo.toml @@ -44,7 +44,7 @@ serde_json.workspace = true tar.workspace = true tempfile.workspace = true url.workspace = true -ureq = "3.0.12" +ureq = "3.1.0" tree-sitter = { workspace = true } tree-sitter-highlight = { workspace = true, optional = true } diff --git a/crates/xtask/Cargo.toml b/crates/xtask/Cargo.toml index f5d44350..1b8a73be 100644 --- a/crates/xtask/Cargo.toml +++ b/crates/xtask/Cargo.toml @@ -27,6 +27,6 @@ regex.workspace = true semver.workspace = true serde.workspace = true serde_json.workspace = true -ureq = "3.0.12" +ureq = "3.1.0" notify = "8.2.0" notify-debouncer-full = "0.6.0" From a53058b84dcd6a6cf8e8344e534f667c9c6f414d Mon Sep 17 00:00:00 2001 From: Niklas Koll <43012290+nihklas@users.noreply.github.com> Date: Mon, 10 Mar 2025 15:56:41 +0100 Subject: [PATCH 308/663] build(zig): update build.zig.zon for zig 0.14 (cherry picked from commit 185076211821953f1e765cec4f8b24dbb16f47f6) --- build.zig.zon | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.zig.zon b/build.zig.zon index 429d4b7e..16aa410e 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -1,5 +1,6 @@ .{ - .name = .@"tree-sitter", + .name = .tree_sitter, + .fingerprint = 0x841224b447ac0d4f, .version = "0.25.8", .paths = .{ "build.zig", From dc4e5b59994a0e4b6e708586253e3c613667aea5 Mon Sep 17 00:00:00 2001 From: JacobCrabill Date: Thu, 20 Mar 2025 21:24:43 -0700 Subject: [PATCH 309/663] build(zig): fix package hashes for Zig 0.14 Zig 0.14 changed how package hashes are computed and used, and if the old package hashes are left, every call to `zig build` will re-download every package every time. Updating to the new hash format solves this. (cherry picked from commit e3db212b0b12a189010979b4c129a792009e8361) --- build.zig.zon | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/build.zig.zon b/build.zig.zon index 16aa410e..0e539786 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -13,57 +13,57 @@ .dependencies = .{ .wasmtime_c_api_aarch64_android = .{ .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-android-c-api.tar.xz", - .hash = "12204c77979ad8291c6e395d695a824fb053ffdfeb2cc21de95fffb09f77d77188d1", + .hash = "N-V-__8AAC3KCQZMd5ea2CkcbjldaVqCT7BT_9_rLMId6V__", .lazy = true, }, .wasmtime_c_api_aarch64_linux = .{ .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-linux-c-api.tar.xz", - .hash = "12203a8e3d823490186fb1e230d54f575148713088e914926305ee5678790b731bba", + .hash = "N-V-__8AAGUY3gU6jj2CNJAYb7HiMNVPV1FIcTCI6RSSYwXu", .lazy = true, }, .wasmtime_c_api_aarch64_macos = .{ .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-macos-c-api.tar.xz", - .hash = "122043e8b19079b855b12674b9e3d4a28dc5c399c43b62fbeb8bdf0fdb4ef2d1d38c", + .hash = "N-V-__8AAM1GMARD6LGQebhVsSZ0uePUoo3Fw5nEO2L764vf", .lazy = true, }, .wasmtime_c_api_riscv64gc_linux = .{ .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-riscv64gc-linux-c-api.tar.xz", - .hash = "12209d07031cf33271bf4b0c63df407b535cd5d65c6402bd6f80d99de439d6feb89b", + .hash = "N-V-__8AAN2cuQadBwMc8zJxv0sMY99Ae1Nc1dZcZAK9b4DZ", .lazy = true, }, .wasmtime_c_api_s390x_linux = .{ .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-s390x-linux-c-api.tar.xz", - .hash = "122033f7d9b04f429063d9b2d9ac75a7a00fce02c425e578208f54ddc40edaa1e355", + .hash = "N-V-__8AAPevngYz99mwT0KQY9my2ax1p6APzgLEJeV4II9U", .lazy = true, }, .wasmtime_c_api_x86_64_android = .{ .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-android-c-api.tar.xz", - .hash = "122093cb33df8e09e70b2d1dc09897a0388915b942918389b10bf23f9684bdb6f047", + .hash = "N-V-__8AABHIEgaTyzPfjgnnCy0dwJiXoDiJFblCkYOJsQvy", .lazy = true, }, .wasmtime_c_api_x86_64_linux = .{ .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-linux-c-api.tar.xz", - .hash = "12209210346e94bf6ef8e249fa5d3f1a84f95050ed19665ac8422a15b5f2246d83af", + .hash = "N-V-__8AALUN5AWSEDRulL9u-OJJ-l0_GoT5UFDtGWZayEIq", .lazy = true, }, .wasmtime_c_api_x86_64_macos = .{ .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-macos-c-api.tar.xz", - .hash = "12208f875dd3a89092485762f3b184707b3cccae85a84e2ffd38c138cc3a3fd90447", + .hash = "N-V-__8AANUeXwSPh13TqJCSSFdi87GEcHs8zK6FqE4v_TjB", .lazy = true, }, .wasmtime_c_api_x86_64_mingw = .{ .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-mingw-c-api.zip", - .hash = "1220bea757df3a777b6ec6322fc498e4ece20d466eedc5e2a3610b338849553cd94d", + .hash = "N-V-__8AALundgW-p1ffOnd7bsYyL8SY5OziDUZu7cXio2EL", .lazy = true, }, .wasmtime_c_api_x86_64_musl = .{ .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-musl-c-api.tar.xz", - .hash = "1220c9596e6a63edcc3234c0611d0cbac724bf30ac9a0fbaf402c7da649b278b1322", + .hash = "N-V-__8AALMZ5wXJWW5qY-3MMjTAYR0MusckvzCsmg-69ALH", .lazy = true, }, .wasmtime_c_api_x86_64_windows = .{ .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-windows-c-api.zip", - .hash = "1220440ccb01d72989cf1a47728897a35fc8dd31673cce598f2d62c58e2c3228b0ed", + .hash = "N-V-__8AAG-uVQVEDMsB1ymJzxpHcoiXo1_I3TFnPM5Zjy1i", .lazy = true, }, } From 88e0b4cea489ea9dc86bf06eaaff9f7f81678e2f Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Tue, 19 Aug 2025 12:32:46 +0300 Subject: [PATCH 310/663] docs: change WASM/wasm to Wasm That is the official capitalisation. --- README.md | 2 +- crates/cli/src/main.rs | 8 +-- crates/cli/src/tests/wasm_language_test.rs | 4 +- crates/cli/src/wasm.rs | 6 +- crates/loader/src/loader.rs | 2 +- crates/xtask/src/build_wasm.rs | 6 +- crates/xtask/src/check_wasm_exports.rs | 4 +- crates/xtask/src/generate.rs | 2 +- crates/xtask/src/main.rs | 14 ++-- docs/src/6-contributing.md | 10 +-- docs/src/cli/build.md | 6 +- docs/src/cli/parse.md | 2 +- docs/src/cli/playground.md | 2 +- docs/src/cli/test.md | 2 +- lib/binding_rust/README.md | 6 +- lib/binding_rust/bindings.rs | 4 +- lib/binding_rust/lib.rs | 4 +- lib/binding_rust/wasm_language.rs | 6 +- lib/binding_web/CONTRIBUTING.md | 20 +++--- lib/binding_web/README.md | 8 +-- lib/binding_web/script/build.js | 4 +- lib/binding_web/src/bindings.ts | 4 +- lib/binding_web/src/constants.ts | 4 +- lib/binding_web/src/language.ts | 6 +- lib/binding_web/src/lookahead_iterator.ts | 2 +- lib/binding_web/src/node.ts | 4 +- lib/binding_web/src/parser.ts | 6 +- lib/binding_web/src/query.ts | 2 +- lib/binding_web/src/tree.ts | 2 +- lib/binding_web/src/tree_cursor.ts | 8 +-- lib/binding_web/test/parser.test.ts | 2 +- lib/binding_web/web-tree-sitter.d.cts | 2 +- lib/binding_web/web-tree-sitter.d.ts | 2 +- lib/include/tree_sitter/api.h | 2 +- lib/src/wasm/stdlib.c | 2 +- lib/src/wasm_store.c | 74 +++++++++++----------- 36 files changed, 122 insertions(+), 122 deletions(-) diff --git a/README.md b/README.md index b7119389..b347c880 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Tree-sitter is a parser generator tool and an incremental parsing library. It ca ## Links - [Documentation](https://tree-sitter.github.io) - [Rust binding](lib/binding_rust/README.md) -- [WASM binding](lib/binding_web/README.md) +- [Wasm binding](lib/binding_web/README.md) - [Command-line interface](crates/cli/README.md) [discord]: https://img.shields.io/discord/1063097320771698699?logo=discord&label=discord diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index a0b45ac8..b0931148 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -153,7 +153,7 @@ struct Generate { #[derive(Args)] #[command(alias = "b")] struct Build { - /// Build a WASM module instead of a dynamic library + /// Build a Wasm module instead of a dynamic library #[arg(short, long)] pub wasm: bool, /// No longer used. @@ -205,7 +205,7 @@ struct Parse { /// Produce the log.html file with debug graphs #[arg(long, short = 'D')] pub debug_graph: bool, - /// Compile parsers to wasm instead of native dynamic libraries + /// Compile parsers to Wasm instead of native dynamic libraries #[arg(long)] pub wasm: bool, /// Output the parse data with graphviz dot @@ -302,7 +302,7 @@ struct Test { /// Produce the log.html file with debug graphs #[arg(long, short = 'D')] pub debug_graph: bool, - /// Compile parsers to wasm instead of native dynamic libraries + /// Compile parsers to Wasm instead of native dynamic libraries #[arg(long)] pub wasm: bool, /// Open `log.html` in the default browser, if `--debug-graph` is supplied @@ -520,7 +520,7 @@ struct Playground { /// Don't open in default browser #[arg(long, short)] pub quiet: bool, - /// Path to the directory containing the grammar and wasm files + /// Path to the directory containing the grammar and Wasm files #[arg(long)] pub grammar_path: Option, } diff --git a/crates/cli/src/tests/wasm_language_test.rs b/crates/cli/src/tests/wasm_language_test.rs index dcf8c193..1a84f9a5 100644 --- a/crates/cli/src/tests/wasm_language_test.rs +++ b/crates/cli/src/tests/wasm_language_test.rs @@ -116,7 +116,7 @@ fn test_load_multiple_wasm_languages() { let mut query_cursor = QueryCursor::new(); // First, parse with the store that originally loaded the languages. - // Then parse with a new parser and wasm store, so that the languages + // Then parse with a new parser and Wasm store, so that the languages // are added one-by-one, in between parses. for mut parser in [parser, parser2] { for _ in 0..2 { @@ -226,7 +226,7 @@ fn test_load_wasm_errors() { store.load_language("rust", bad_wasm).unwrap_err(), WasmError { kind: WasmErrorKind::Parse, - message: "failed to parse dylink section of wasm module".into(), + message: "failed to parse dylink section of Wasm module".into(), } ); diff --git a/crates/cli/src/wasm.rs b/crates/cli/src/wasm.rs index 92adb65a..f1142b1c 100644 --- a/crates/cli/src/wasm.rs +++ b/crates/cli/src/wasm.rs @@ -11,7 +11,7 @@ use wasmparser::Parser; pub fn load_language_wasm_file(language_dir: &Path) -> Result<(String, Vec)> { let grammar_name = get_grammar_name(language_dir) - .with_context(|| "Failed to get wasm filename") + .with_context(|| "Failed to get Wasm filename") .unwrap(); let wasm_filename = format!("tree-sitter-{grammar_name}.wasm"); let contents = fs::read(language_dir.join(&wasm_filename)).with_context(|| { @@ -61,7 +61,7 @@ pub fn compile_language_to_wasm( )?; // Exit with an error if the external scanner uses symbols from the - // C or C++ standard libraries that aren't available to wasm parsers. + // C or C++ standard libraries that aren't available to Wasm parsers. let stdlib_symbols = wasm_stdlib_symbols().collect::>(); let dylink_symbols = [ "__indirect_function_table", @@ -100,7 +100,7 @@ pub fn compile_language_to_wasm( if !missing_symbols.is_empty() { Err(anyhow!( concat!( - "This external scanner uses a symbol that isn't available to wasm parsers.\n", + "This external scanner uses a symbol that isn't available to Wasm parsers.\n", "\n", "Missing symbols:\n", " {}\n", diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index a6fb12fd..1c93a54d 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -1068,7 +1068,7 @@ impl Loader { } fs::rename(src_path.join(output_name), output_path) - .context("failed to rename wasm output file")?; + .context("failed to rename Wasm output file")?; Ok(()) } diff --git a/crates/xtask/src/build_wasm.rs b/crates/xtask/src/build_wasm.rs index d1b0f7ab..ed6f5251 100644 --- a/crates/xtask/src/build_wasm.rs +++ b/crates/xtask/src/build_wasm.rs @@ -195,7 +195,7 @@ pub fn run_wasm(args: &BuildWasm) -> Result<()> { fn build_wasm(cmd: &mut Command) -> Result<()> { bail_on_err( &cmd.spawn()?.wait_with_output()?, - "Failed to compile the Tree-sitter WASM library", + "Failed to compile the Tree-sitter Wasm library", )?; Ok(()) @@ -239,7 +239,7 @@ pub fn run_wasm_stdlib() -> Result<()> { .arg("lib/src/wasm/stdlib.c") .output()?; - bail_on_err(&output, "Failed to compile the Tree-sitter WASM stdlib")?; + bail_on_err(&output, "Failed to compile the Tree-sitter Wasm stdlib")?; let xxd = Command::new("xxd") .args(["-C", "-i", "stdlib.wasm"]) @@ -247,7 +247,7 @@ pub fn run_wasm_stdlib() -> Result<()> { bail_on_err( &xxd, - "Failed to run xxd on the compiled Tree-sitter WASM stdlib", + "Failed to run xxd on the compiled Tree-sitter Wasm stdlib", )?; fs::write("lib/src/wasm/wasm-stdlib.h", xxd.stdout)?; diff --git a/crates/xtask/src/check_wasm_exports.rs b/crates/xtask/src/check_wasm_exports.rs index 18c76bca..73ab4ba0 100644 --- a/crates/xtask/src/check_wasm_exports.rs +++ b/crates/xtask/src/check_wasm_exports.rs @@ -25,7 +25,7 @@ const EXCLUDES: [&str; 27] = [ "ts_node_eq", "ts_tree_cursor_current_field_name", "ts_lookahead_iterator_current_symbol_name", - // Not used in wasm + // Not used in Wasm "ts_init", "ts_set_allocator", "ts_parser_set_cancellation_flag", @@ -126,7 +126,7 @@ fn check_wasm_exports() -> Result<()> { if !missing.is_empty() { Err(anyhow!(format!( - "Unmatched wasm exports:\n{}", + "Unmatched Wasm exports:\n{}", missing.join("\n") )))?; } diff --git a/crates/xtask/src/generate.rs b/crates/xtask/src/generate.rs index c0317f95..662fc3b1 100644 --- a/crates/xtask/src/generate.rs +++ b/crates/xtask/src/generate.rs @@ -30,7 +30,7 @@ pub fn run_fixtures(args: &GenerateFixtures) -> Result<()> { println!( "Regenerating {grammar_name} parser{}", - if args.wasm { " to wasm" } else { "" } + if args.wasm { " to Wasm" } else { "" } ); if args.wasm { diff --git a/crates/xtask/src/main.rs b/crates/xtask/src/main.rs index edcc7c37..46c25938 100644 --- a/crates/xtask/src/main.rs +++ b/crates/xtask/src/main.rs @@ -22,14 +22,14 @@ use semver::Version; enum Commands { /// Runs `cargo benchmark` with some optional environment variables set. Benchmark(Benchmark), - /// Compile the Tree-sitter WASM library. This will create two files in the + /// Compile the Tree-sitter Wasm library. This will create two files in the /// `lib/binding_web` directory: `web-tree-sitter.js` and `web-tree-sitter.wasm`. BuildWasm(BuildWasm), - /// Compile the Tree-sitter WASM standard library. + /// Compile the Tree-sitter Wasm standard library. BuildWasmStdlib, /// Bumps the version of the workspace. BumpVersion(BumpVersion), - /// Checks that WASM exports are synced. + /// Checks that Wasm exports are synced. CheckWasmExports(CheckWasmExports), /// Runs `cargo clippy`. Clippy(Clippy), @@ -41,11 +41,11 @@ enum Commands { GenerateBindings, /// Generates the fixtures for testing tree-sitter. GenerateFixtures(GenerateFixtures), - /// Generate the list of exports from Tree-sitter WASM files. + /// Generate the list of exports from Tree-sitter Wasm files. GenerateWasmExports, /// Run the test suite Test(Test), - /// Run the WASM test suite + /// Run the Wasm test suite TestWasm, /// Upgrade the wasmtime dependency. UpgradeWasmtime(UpgradeWasmtime), @@ -120,7 +120,7 @@ struct Clippy { #[derive(Args)] struct GenerateFixtures { - /// Generates the parser to WASM + /// Generates the parser to Wasm #[arg(long, short)] wasm: bool, } @@ -156,7 +156,7 @@ struct Test { /// Don't capture the output #[arg(long)] nocapture: bool, - /// Enable the wasm tests. + /// Enable the Wasm tests. #[arg(long, short)] wasm: bool, } diff --git a/docs/src/6-contributing.md b/docs/src/6-contributing.md index 920563db..862580db 100644 --- a/docs/src/6-contributing.md +++ b/docs/src/6-contributing.md @@ -14,7 +14,7 @@ To make changes to Tree-sitter, you should have: 2. A [Rust toolchain][rust], for compiling the Rust bindings, the highlighting library, and the CLI. 3. Node.js and NPM, for generating parsers from `grammar.js` files. 4. Either [Emscripten][emscripten], [Docker][docker], or [podman][podman] for -compiling the library to WASM. +compiling the library to Wasm. ### Building @@ -25,7 +25,7 @@ git clone https://github.com/tree-sitter/tree-sitter cd tree-sitter ``` -Optionally, build the WASM library. If you skip this step, then the `tree-sitter playground` command will require an internet +Optionally, build the Wasm library. If you skip this step, then the `tree-sitter playground` command will require an internet connection. If you have Emscripten installed, this will use your `emcc` compiler. Otherwise, it will use Docker or Podman: ```sh @@ -76,7 +76,7 @@ Then you can run the tests: cargo xtask test ``` -Similarly, to test the WASM binding, you need to compile these parsers to WASM: +Similarly, to test the Wasm binding, you need to compile these parsers to Wasm: ```sh cargo xtask generate-fixtures --wasm @@ -119,7 +119,7 @@ several packages that are published to package registries for different language * [`tree-sitter-cli`][cli crate] — The command-line tool * JavaScript modules on [npmjs.com][npmjs]: - * [`web-tree-sitter`][web-ts] — A WASM-based JavaScript binding to the core library + * [`web-tree-sitter`][web-ts] — A Wasm-based JavaScript binding to the core library * [`tree-sitter-cli`][cli package] — The command-line tool There are also several other dependent repositories that contain other published packages: @@ -179,7 +179,7 @@ a short delay. Once you've made a change that you're happy with, you can submit The playground page is a little more complicated, but if you know some basic JavaScript and CSS you should be able to make changes. The playground code can be found in [`docs/src/assets/js/playground.js`][playground], and its corresponding css at [`docs/src/assets/css/playground.css`][playground css]. The editor of choice we use for the playground is [CodeMirror][codemirror], -and the tree-sitter module is fetched from [here][js url]. This, along with the wasm module and wasm parsers, live in the +and the tree-sitter module is fetched from [here][js url]. This, along with the Wasm module and Wasm parsers, live in the [.github.io repo][gh.io repo]. [admonish]: https://github.com/tommilligan/mdbook-admonish diff --git a/docs/src/cli/build.md b/docs/src/cli/build.md index dfa5f9af..0ad4a922 100644 --- a/docs/src/cli/build.md +++ b/docs/src/cli/build.md @@ -1,7 +1,7 @@ # `tree-sitter build` The `build` command compiles your parser into a dynamically-loadable library, -either as a shared object (`.so`, `.dylib`, or `.dll`) or as a WASM module. +either as a shared object (`.so`, `.dylib`, or `.dll`) or as a Wasm module. ```bash tree-sitter build [OPTIONS] [PATH] # Aliases: b @@ -18,11 +18,11 @@ will attempt to build the parser in the current working directory. ### `-w/--wasm` -Compile the parser as a WASM module. +Compile the parser as a Wasm module. ### `-o/--output` -Specify where to output the shared object file (native or WASM). This flag accepts either an absolute path or a relative +Specify where to output the shared object file (native or Wasm). This flag accepts either an absolute path or a relative path. If you don't supply this flag, the CLI will attempt to figure out what the language name is based on the parent directory name to use for the output file. If the CLI can't figure it out, it will default to `parser`, thus generating `parser.so` or `parser.wasm` in the current working directory. diff --git a/docs/src/cli/parse.md b/docs/src/cli/parse.md index 04a13bb8..9f76b550 100644 --- a/docs/src/cli/parse.md +++ b/docs/src/cli/parse.md @@ -37,7 +37,7 @@ The graphs are constructed with [graphviz dot][dot], and the output is written t ### `--wasm` -Compile and run the parser as a WASM module. +Compile and run the parser as a Wasm module. ### `--dot` diff --git a/docs/src/cli/playground.md b/docs/src/cli/playground.md index 75ab4588..4f194b9c 100644 --- a/docs/src/cli/playground.md +++ b/docs/src/cli/playground.md @@ -7,7 +7,7 @@ tree-sitter playground [OPTIONS] # Aliases: play, pg, web-ui ``` ```admonish note -For this to work, you must have already built the parser as a WASM module. This can be done with the [`build`](./build.md) subcommand +For this to work, you must have already built the parser as a Wasm module. This can be done with the [`build`](./build.md) subcommand (`tree-sitter build --wasm`). ``` diff --git a/docs/src/cli/test.md b/docs/src/cli/test.md index f5b2f3f5..c1724745 100644 --- a/docs/src/cli/test.md +++ b/docs/src/cli/test.md @@ -47,7 +47,7 @@ The graphs are constructed with [graphviz dot][dot], and the output is written t ### `--wasm` -Compile and run the parser as a WASM module. +Compile and run the parser as a Wasm module. ### `--open-log` diff --git a/lib/binding_rust/README.md b/lib/binding_rust/README.md index f70184fd..39c13b7c 100644 --- a/lib/binding_rust/README.md +++ b/lib/binding_rust/README.md @@ -98,11 +98,11 @@ assert_eq!( ); ``` -## Using WASM Grammar Files +## Using Wasm Grammar Files > Requires the feature **wasm** to be enabled. -First, create a parser with a WASM store: +First, create a parser with a Wasm store: ```rust use tree_sitter::{wasmtime::Engine, Parser, WasmStore}; @@ -114,7 +114,7 @@ let mut parser = Parser::new(); parser.set_wasm_store(store).unwrap(); ``` -Then, load the language from a WASM file: +Then, load the language from a Wasm file: ```rust const JAVASCRIPT_GRAMMAR: &[u8] = include_bytes!("path/to/tree-sitter-javascript.wasm"); diff --git a/lib/binding_rust/bindings.rs b/lib/binding_rust/bindings.rs index 8323bd06..7d912665 100644 --- a/lib/binding_rust/bindings.rs +++ b/lib/binding_rust/bindings.rs @@ -1,4 +1,4 @@ -/* automatically generated by rust-bindgen 0.71.1 */ +/* automatically generated by rust-bindgen 0.72.0 */ pub const TREE_SITTER_LANGUAGE_VERSION: u32 = 15; pub const TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION: u32 = 13; @@ -928,7 +928,7 @@ extern "C" { ) -> *const TSLanguage; } extern "C" { - #[doc = " Get the number of languages instantiated in the given wasm store."] + #[doc = " Get the number of languages instantiated in the given Wasm store."] pub fn ts_wasm_store_language_count(arg1: *const TSWasmStore) -> usize; } extern "C" { diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs index e7d0821f..0dbd021e 100644 --- a/lib/binding_rust/lib.rs +++ b/lib/binding_rust/lib.rs @@ -365,7 +365,7 @@ pub struct QueryCapture<'tree> { /// An error that occurred when trying to assign an incompatible [`Language`] to /// a [`Parser`]. If the `wasm` feature is enabled, this can also indicate a failure -/// to load the wasm store. +/// to load the Wasm store. #[derive(Debug, PartialEq, Eq)] pub enum LanguageError { Version(usize), @@ -3737,7 +3737,7 @@ impl fmt::Display for LanguageError { } #[cfg(feature = "wasm")] Self::Wasm => { - write!(f, "Failed to load the wasm store.") + write!(f, "Failed to load the Wasm store.") } } } diff --git a/lib/binding_rust/wasm_language.rs b/lib/binding_rust/wasm_language.rs index 76aff50a..66df377a 100644 --- a/lib/binding_rust/wasm_language.rs +++ b/lib/binding_rust/wasm_language.rs @@ -135,9 +135,9 @@ impl Drop for WasmStore { impl fmt::Display for WasmError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let kind = match self.kind { - WasmErrorKind::Parse => "Failed to parse wasm", - WasmErrorKind::Compile => "Failed to compile wasm", - WasmErrorKind::Instantiate => "Failed to instantiate wasm module", + WasmErrorKind::Parse => "Failed to parse Wasm", + WasmErrorKind::Compile => "Failed to compile Wasm", + WasmErrorKind::Instantiate => "Failed to instantiate Wasm module", WasmErrorKind::Other => "Unknown error", }; write!(f, "{kind}: {}", self.message) diff --git a/lib/binding_web/CONTRIBUTING.md b/lib/binding_web/CONTRIBUTING.md index 74311f97..eb4e5fc3 100644 --- a/lib/binding_web/CONTRIBUTING.md +++ b/lib/binding_web/CONTRIBUTING.md @@ -13,7 +13,7 @@ To make changes to Web-tree-sitter, you should have: 1. A [Rust toolchain][rust], for running the xtasks necessary to build the library. 2. Node.js and NPM (or an equivalent package manager). 3. Either [Emscripten][emscripten], [Docker][docker], or [podman][podman] for -compiling the library to WASM. +compiling the library to Wasm. ### Building @@ -51,19 +51,19 @@ by visiting the [Rust website][rust] and following the instructions there. #### The C side -There are several components that come together to build the final JS and WASM files. First, we use `emscripten` in our -xtask located at `xtask/src/build_wasm.rs` from the root directory to compile the WASM files. This WASM module is output into the -local `lib` folder, and is used only in [`src/bindings.ts`][bindings.ts] to handle loading the WASM module. The C code that -is compiled into the WASM module is located in at [`lib/tree-sitter.c`][tree-sitter.c], and contains all the necessary +There are several components that come together to build the final JS and Wasm files. First, we use `emscripten` in our +xtask located at `xtask/src/build_wasm.rs` from the root directory to compile the Wasm files. This Wasm module is output into the +local `lib` folder, and is used only in [`src/bindings.ts`][bindings.ts] to handle loading the Wasm module. The C code that +is compiled into the Wasm module is located in at [`lib/tree-sitter.c`][tree-sitter.c], and contains all the necessary glue code to interact with the JS environment. If you need to update the imported functions from the tree-sitter library, -or anywhere else, you must update [`lib/exports.txt`][exports.txt]. Lastly, the type information for the WASM module is +or anywhere else, you must update [`lib/exports.txt`][exports.txt]. Lastly, the type information for the Wasm module is located at [`lib/tree-sitter.d.ts`][tree-sitter.d.ts], and can be updated by running `cargo xtask build-wasm --emit-tsd` from the root directory. #### The TypeScript side -The TypeScript library is a higher level abstraction over the WASM module, and is located in `src`. This is where the -public API is defined, and where the WASM module is loaded and initialized. The TypeScript library is built into a single +The TypeScript library is a higher level abstraction over the Wasm module, and is located in `src`. This is where the +public API is defined, and where the Wasm module is loaded and initialized. The TypeScript library is built into a single ES6 (or CommonJS) module, and is output into the same directory as `package.json`. If you need to update the public API, you can do so by editing the files in `src`. @@ -80,7 +80,7 @@ to the TypeScript source code. This TypeScript code is then compiled into a single JavaScript file with `esbuild`. The build configuration for this can be found in [`script/build.js`][build.js], but this shouldn't need to be updated. This step is responsible for emitting -the final JS and WASM files that are shipped with the library, as well as their sourcemaps. +the final JS and Wasm files that are shipped with the library, as well as their sourcemaps. ### Testing @@ -97,7 +97,7 @@ Optionally, to update the generated parser.c files: cargo xtask generate-fixtures ``` -Then you can build the WASM modules: +Then you can build the Wasm modules: ```sh cargo xtask generate-fixtures --wasm diff --git a/lib/binding_web/README.md b/lib/binding_web/README.md index d6cbc789..08a939dc 100644 --- a/lib/binding_web/README.md +++ b/lib/binding_web/README.md @@ -217,10 +217,10 @@ const Parser = require('web-tree-sitter'); `web-tree-sitter` needs to load the `tree-sitter.wasm` file. By default, it assumes that this file is available in the same path as the JavaScript code. Therefore, if the code is being served from `http://localhost:3000/bundle.js`, then -the wasm file should be at `http://localhost:3000/tree-sitter.wasm`. +the Wasm file should be at `http://localhost:3000/tree-sitter.wasm`. For server side frameworks like NextJS, this can be tricky as pages are often served from a path such as -`http://localhost:3000/_next/static/chunks/pages/index.js`. The loader will therefore look for the wasm file at +`http://localhost:3000/_next/static/chunks/pages/index.js`. The loader will therefore look for the Wasm file at `http://localhost:3000/_next/static/chunks/pages/tree-sitter.wasm`. The solution is to pass a `locateFile` function in the `moduleOptions` argument to `Parser.init()`: @@ -232,8 +232,8 @@ await Parser.init({ }); ``` -`locateFile` takes in two parameters, `scriptName`, i.e. the wasm file name, and `scriptDirectory`, i.e. the directory -where the loader expects the script to be. It returns the path where the loader will look for the wasm file. In the NextJS +`locateFile` takes in two parameters, `scriptName`, i.e. the Wasm file name, and `scriptDirectory`, i.e. the directory +where the loader expects the script to be. It returns the path where the loader will look for the Wasm file. In the NextJS case, we want to return just the `scriptName` so that the loader will look at `http://localhost:3000/tree-sitter.wasm` and not `http://localhost:3000/_next/static/chunks/pages/tree-sitter.wasm`. diff --git a/lib/binding_web/script/build.js b/lib/binding_web/script/build.js index 5d3a39c6..6f2bedd6 100644 --- a/lib/binding_web/script/build.js +++ b/lib/binding_web/script/build.js @@ -6,7 +6,7 @@ const format = process.env.CJS ? 'cjs' : 'esm'; const debug = process.argv.includes('--debug'); const outfile = `${debug ? 'debug/' : ''}web-tree-sitter.${format === 'esm' ? 'js' : 'cjs'}`; -// Copy source files to lib directory - we'll map the wasm's sourecmap to these files. +// Copy source files to lib directory - we'll map the Wasm's sourcemap to these files. async function copySourceFiles() { const sourceDir = '../src'; const files = await fs.readdir(sourceDir); @@ -58,7 +58,7 @@ async function build() { resolveExtensions: ['.ts', '.js', format === 'esm' ? '.mjs' : '.cjs'], }); - // Copy the WASM files to the appropriate spot, as esbuild doesn't "bundle" WASM files + // Copy the Wasm files to the appropriate spot, as esbuild doesn't "bundle" Wasm files const outputWasmName = `${debug ? 'debug/' : ''}web-tree-sitter.wasm`; await fs.copyFile('lib/web-tree-sitter.wasm', outputWasmName); diff --git a/lib/binding_web/src/bindings.ts b/lib/binding_web/src/bindings.ts index fbd63946..359deecb 100644 --- a/lib/binding_web/src/bindings.ts +++ b/lib/binding_web/src/bindings.ts @@ -7,7 +7,7 @@ export let Module: MainModule | null = null; /** * @internal * - * Initialize the Tree-sitter WASM module. This should only be called by the {@link Parser} class via {@link Parser.init}. + * Initialize the Tree-sitter Wasm module. This should only be called by the {@link Parser} class via {@link Parser.init}. */ export async function initializeBinding(moduleOptions?: Partial): Promise { if (!Module) { @@ -19,7 +19,7 @@ export async function initializeBinding(moduleOptions?: Partial LANGUAGE_FUNCTION_REGEX.test(key) && !key.includes('external_scanner_')); if (!functionName) { - console.log(`Couldn't find language function in WASM file. Symbols:\n${JSON.stringify(symbolNames, null, 2)}`); - throw new Error('Language.load failed: no language function found in WASM file'); + console.log(`Couldn't find language function in Wasm file. Symbols:\n${JSON.stringify(symbolNames, null, 2)}`); + throw new Error('Language.load failed: no language function found in Wasm file'); } const languageAddress = mod[functionName](); return new Language(INTERNAL, languageAddress); diff --git a/lib/binding_web/src/lookahead_iterator.ts b/lib/binding_web/src/lookahead_iterator.ts index 028608b5..92b4d28f 100644 --- a/lib/binding_web/src/lookahead_iterator.ts +++ b/lib/binding_web/src/lookahead_iterator.ts @@ -3,7 +3,7 @@ import { Language } from './language'; export class LookaheadIterator implements Iterable { /** @internal */ - private [0] = 0; // Internal handle for WASM + private [0] = 0; // Internal handle for Wasm /** @internal */ private language: Language; diff --git a/lib/binding_web/src/node.ts b/lib/binding_web/src/node.ts index 8fd39f6b..05d23027 100644 --- a/lib/binding_web/src/node.ts +++ b/lib/binding_web/src/node.ts @@ -9,7 +9,7 @@ import { TRANSFER_BUFFER } from './parser'; /** A single node within a syntax {@link Tree}. */ export class Node { /** @internal */ - private [0] = 0; // Internal handle for WASM + private [0] = 0; // Internal handle for Wasm /** @internal */ private _children?: Node[]; @@ -427,7 +427,7 @@ export class Node { } } - // Copy the array of symbols to the WASM heap + // Copy the array of symbols to the Wasm heap const symbolsAddress = C._malloc(SIZE_OF_INT * symbols.length); for (let i = 0, n = symbols.length; i < n; i++) { C.setValue(symbolsAddress + i * SIZE_OF_INT, symbols[i], 'i32'); diff --git a/lib/binding_web/src/parser.ts b/lib/binding_web/src/parser.ts index e4dd4c29..3a49d43f 100644 --- a/lib/binding_web/src/parser.ts +++ b/lib/binding_web/src/parser.ts @@ -88,10 +88,10 @@ export let MIN_COMPATIBLE_VERSION: number; */ export class Parser { /** @internal */ - private [0] = 0; // Internal handle for WASM + private [0] = 0; // Internal handle for Wasm /** @internal */ - private [1] = 0; // Internal handle for WASM + private [1] = 0; // Internal handle for Wasm /** @internal */ private logCallback: LogCallback | null = null; @@ -102,7 +102,7 @@ export class Parser { /** * This must always be called before creating a Parser. * - * You can optionally pass in options to configure the WASM module, the most common + * You can optionally pass in options to configure the Wasm module, the most common * one being `locateFile` to help the module find the `.wasm` file. */ static async init(moduleOptions?: Partial) { diff --git a/lib/binding_web/src/query.ts b/lib/binding_web/src/query.ts index a6028241..d702db49 100644 --- a/lib/binding_web/src/query.ts +++ b/lib/binding_web/src/query.ts @@ -499,7 +499,7 @@ function parsePattern( export class Query { /** @internal */ - private [0] = 0; // Internal handle for WASM + private [0] = 0; // Internal handle for Wasm /** @internal */ private exceededMatchLimit: boolean; diff --git a/lib/binding_web/src/tree.ts b/lib/binding_web/src/tree.ts index 4146e088..e45ca304 100644 --- a/lib/binding_web/src/tree.ts +++ b/lib/binding_web/src/tree.ts @@ -30,7 +30,7 @@ export function getText(tree: Tree, startIndex: number, endIndex: number, startP /** A tree that represents the syntactic structure of a source code file. */ export class Tree { /** @internal */ - private [0] = 0; // Internal handle for WASM + private [0] = 0; // Internal handle for Wasm /** @internal */ textCallback: ParseCallback; diff --git a/lib/binding_web/src/tree_cursor.ts b/lib/binding_web/src/tree_cursor.ts index 61c93006..5d7510d6 100644 --- a/lib/binding_web/src/tree_cursor.ts +++ b/lib/binding_web/src/tree_cursor.ts @@ -7,16 +7,16 @@ import { getText, Tree } from './tree'; /** A stateful object for walking a syntax {@link Tree} efficiently. */ export class TreeCursor { /** @internal */ - private [0] = 0; // Internal handle for WASM + private [0] = 0; // Internal handle for Wasm /** @internal */ - private [1] = 0; // Internal handle for WASM + private [1] = 0; // Internal handle for Wasm /** @internal */ - private [2] = 0; // Internal handle for WASM + private [2] = 0; // Internal handle for Wasm /** @internal */ - private [3] = 0; // Internal handle for WASM + private [3] = 0; // Internal handle for Wasm /** @internal */ private tree: Tree; diff --git a/lib/binding_web/test/parser.test.ts b/lib/binding_web/test/parser.test.ts index aa1dcd1c..7d859827 100644 --- a/lib/binding_web/test/parser.test.ts +++ b/lib/binding_web/test/parser.test.ts @@ -437,7 +437,7 @@ describe('Parser', () => { // The callback is called at the end of parsing, however, what we're asserting here is that // parsing ends immediately as the error is detected. This is verified by checking the offset // of the last byte processed is the length of the erroneous code we inserted, aka, 1002, or - // 1000 + the length of the erroneous code. Note that in this WASM test, we multiply the offset + // 1000 + the length of the erroneous code. Note that in this Wasm test, we multiply the offset // by 2 because JavaScript strings are UTF-16 encoded. expect(offset).toBe((1000 + erroneousCode.length) * 2); expect(tree).toBeNull(); diff --git a/lib/binding_web/web-tree-sitter.d.cts b/lib/binding_web/web-tree-sitter.d.cts index 7aa32dfb..dabf77af 100644 --- a/lib/binding_web/web-tree-sitter.d.cts +++ b/lib/binding_web/web-tree-sitter.d.cts @@ -130,7 +130,7 @@ declare module 'web-tree-sitter' { /** * This must always be called before creating a Parser. * - * You can optionally pass in options to configure the WASM module, the most common + * You can optionally pass in options to configure the Wasm module, the most common * one being `locateFile` to help the module find the `.wasm` file. */ static init(moduleOptions?: EmscriptenModule): Promise; diff --git a/lib/binding_web/web-tree-sitter.d.ts b/lib/binding_web/web-tree-sitter.d.ts index f984485e..3c8b581a 100644 --- a/lib/binding_web/web-tree-sitter.d.ts +++ b/lib/binding_web/web-tree-sitter.d.ts @@ -130,7 +130,7 @@ declare module 'web-tree-sitter' { /** * This must always be called before creating a Parser. * - * You can optionally pass in options to configure the WASM module, the most common + * You can optionally pass in options to configure the Wasm module, the most common * one being `locateFile` to help the module find the `.wasm` file. */ static init(moduleOptions?: EmscriptenModule): Promise; diff --git a/lib/include/tree_sitter/api.h b/lib/include/tree_sitter/api.h index 2bbfe66f..aad67460 100644 --- a/lib/include/tree_sitter/api.h +++ b/lib/include/tree_sitter/api.h @@ -1416,7 +1416,7 @@ const TSLanguage *ts_wasm_store_load_language( ); /** - * Get the number of languages instantiated in the given wasm store. + * Get the number of languages instantiated in the given Wasm store. */ size_t ts_wasm_store_language_count(const TSWasmStore *); diff --git a/lib/src/wasm/stdlib.c b/lib/src/wasm/stdlib.c index e3e59f5d..1ab3440e 100644 --- a/lib/src/wasm/stdlib.c +++ b/lib/src/wasm/stdlib.c @@ -1,5 +1,5 @@ // This file implements a very simple allocator for external scanners running -// in WASM. Allocation is just bumping a static pointer and growing the heap +// in Wasm. Allocation is just bumping a static pointer and growing the heap // as needed, and freeing is mostly a noop. But in the special case of freeing // the last-allocated pointer, we'll reuse that pointer again. diff --git a/lib/src/wasm_store.c b/lib/src/wasm_store.c index d018a68c..f9c7d474 100644 --- a/lib/src/wasm_store.c +++ b/lib/src/wasm_store.c @@ -32,7 +32,7 @@ const char *STDLIB_SYMBOLS[] = { #include "./stdlib-symbols.txt" }; -// The contents of the `dylink.0` custom section of a wasm module, +// The contents of the `dylink.0` custom section of a Wasm module, // as specified by the current WebAssembly dynamic linking ABI proposal. typedef struct { uint32_t memory_size; @@ -43,15 +43,15 @@ typedef struct { // WasmLanguageId - A pointer used to identify a language. This language id is // reference-counted, so that its ownership can be shared between the language -// itself and the instances of the language that are held in wasm stores. +// itself and the instances of the language that are held in Wasm stores. typedef struct { volatile uint32_t ref_count; volatile uint32_t is_language_deleted; } WasmLanguageId; -// LanguageWasmModule - Additional data associated with a wasm-backed +// LanguageWasmModule - Additional data associated with a Wasm-backed // `TSLanguage`. This data is read-only and does not reference a particular -// wasm store, so it can be shared by all users of a `TSLanguage`. A pointer to +// Wasm store, so it can be shared by all users of a `TSLanguage`. A pointer to // this is stored on the language itself. typedef struct { volatile uint32_t ref_count; @@ -64,7 +64,7 @@ typedef struct { } LanguageWasmModule; // LanguageWasmInstance - Additional data associated with an instantiation of -// a `TSLanguage` in a particular wasm store. The wasm store holds one of +// a `TSLanguage` in a particular Wasm store. The Wasm store holds one of // these structs for each language that it has instantiated. typedef struct { WasmLanguageId *language_id; @@ -91,7 +91,7 @@ typedef struct { uint32_t args_sizes_get; } BuiltinFunctionIndices; -// TSWasmStore - A struct that allows a given `Parser` to use wasm-backed +// TSWasmStore - A struct that allows a given `Parser` to use Wasm-backed // languages. This struct is mutable, and can only be used by one parser at a // time. struct TSWasmStore { @@ -115,7 +115,7 @@ struct TSWasmStore { typedef Array(char) StringData; // LanguageInWasmMemory - The memory layout of a `TSLanguage` when compiled to -// wasm32. This is used to copy static language data out of the wasm memory. +// wasm32. This is used to copy static language data out of the Wasm memory. typedef struct { uint32_t abi_version; uint32_t symbol_count; @@ -164,7 +164,7 @@ typedef struct { } LanguageInWasmMemory; // LexerInWasmMemory - The memory layout of a `TSLexer` when compiled to wasm32. -// This is used to copy mutable lexing state in and out of the wasm memory. +// This is used to copy mutable lexing state in and out of the Wasm memory. typedef struct { int32_t lookahead; TSSymbol result_symbol; @@ -252,7 +252,7 @@ static bool wasm_dylink_info__parse( } /******************************************* - * Native callbacks exposed to wasm modules + * Native callbacks exposed to Wasm modules *******************************************/ static wasm_trap_t *callback__abort( @@ -261,7 +261,7 @@ static bool wasm_dylink_info__parse( wasmtime_val_raw_t *args_and_results, size_t args_and_results_len ) { - return wasmtime_trap_new("wasm module called abort", 24); + return wasmtime_trap_new("Wasm module called abort", 24); } static wasm_trap_t *callback__debug_message( @@ -654,7 +654,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { }, }; - // Create all of the wasm functions. + // Create all of the Wasm functions. unsigned builtin_definitions_len = array_len(builtin_definitions); unsigned lexer_definitions_len = array_len(lexer_definitions); for (unsigned i = 0; i < builtin_definitions_len; i++) { @@ -679,7 +679,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindCompile; format( &wasm_error->message, - "failed to compile wasm stdlib: %.*s", + "failed to compile Wasm stdlib: %.*s", (int)message.size, message.data ); goto error; @@ -702,7 +702,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindCompile; format( &wasm_error->message, - "wasm stdlib is missing the 'memory' import" + "Wasm stdlib is missing the 'memory' import" ); goto error; } @@ -718,7 +718,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindAllocate; format( &wasm_error->message, - "failed to allocate wasm memory: %.*s", + "failed to allocate Wasm memory: %.*s", (int)message.size, message.data ); goto error; @@ -737,7 +737,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindAllocate; format( &wasm_error->message, - "failed to allocate wasm table: %.*s", + "failed to allocate Wasm table: %.*s", (int)message.size, message.data ); goto error; @@ -779,7 +779,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindInstantiate; format( &wasm_error->message, - "unexpected import in wasm stdlib: %.*s\n", + "unexpected import in Wasm stdlib: %.*s\n", (int)import_name->size, import_name->data ); goto error; @@ -796,7 +796,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindInstantiate; format( &wasm_error->message, - "failed to instantiate wasm stdlib module: %.*s", + "failed to instantiate Wasm stdlib module: %.*s", (int)message.size, message.data ); goto error; @@ -806,7 +806,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindInstantiate; format( &wasm_error->message, - "trapped when instantiating wasm stdlib module: %.*s", + "trapped when instantiating Wasm stdlib module: %.*s", (int)message.size, message.data ); goto error; @@ -867,7 +867,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindInstantiate; format( &wasm_error->message, - "missing malloc reset function in wasm stdlib" + "missing malloc reset function in Wasm stdlib" ); goto error; } @@ -877,7 +877,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindInstantiate; format( &wasm_error->message, - "missing exported symbol in wasm stdlib: %s", + "missing exported symbol in Wasm stdlib: %s", STDLIB_SYMBOLS[i] ); goto error; @@ -896,7 +896,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindAllocate; format( &wasm_error->message, - "failed to grow wasm table to initial size: %.*s", + "failed to grow Wasm table to initial size: %.*s", (int)message.size, message.data ); goto error; @@ -1063,7 +1063,7 @@ static bool ts_wasm_store__instantiate( wasmtime_error_message(error, &message); format( error_message, - "error instantiating wasm module: %.*s\n", + "error instantiating Wasm module: %.*s\n", (int)message.size, message.data ); goto error; @@ -1072,7 +1072,7 @@ static bool ts_wasm_store__instantiate( wasm_trap_message(trap, &message); format( error_message, - "trap when instantiating wasm module: %.*s\n", + "trap when instantiating Wasm module: %.*s\n", (int)message.size, message.data ); goto error; @@ -1182,17 +1182,17 @@ const TSLanguage *ts_wasm_store_load_language( if (!wasm_dylink_info__parse((const unsigned char *)wasm, wasm_len, &dylink_info)) { wasm_error->kind = TSWasmErrorKindParse; - format(&wasm_error->message, "failed to parse dylink section of wasm module"); + format(&wasm_error->message, "failed to parse dylink section of Wasm module"); goto error; } - // Compile the wasm code. + // Compile the Wasm code. error = wasmtime_module_new(self->engine, (const uint8_t *)wasm, wasm_len, &module); if (error) { wasm_message_t message; wasmtime_error_message(error, &message); wasm_error->kind = TSWasmErrorKindCompile; - format(&wasm_error->message, "error compiling wasm module: %.*s", (int)message.size, message.data); + format(&wasm_error->message, "error compiling Wasm module: %.*s", (int)message.size, message.data); wasm_byte_vec_delete(&message); goto error; } @@ -1213,7 +1213,7 @@ const TSLanguage *ts_wasm_store_load_language( goto error; } - // Copy all of the static data out of the language object in wasm memory, + // Copy all of the static data out of the language object in Wasm memory, // constructing a native language object. LanguageInWasmMemory wasm_language; wasmtime_context_t *context = wasmtime_store_context(self->store); @@ -1442,9 +1442,9 @@ const TSLanguage *ts_wasm_store_load_language( .ref_count = 1, }; - // The lex functions are not used for wasm languages. Use those two fields - // to mark this language as WASM-based and to store the language's - // WASM-specific data. + // The lex functions are not used for Wasm languages. Use those two fields + // to mark this language as Wasm-based and to store the language's + // Wasm-specific data. language->lex_fn = ts_wasm_store__sentinel_lex_fn; language->keyword_lex_fn = (bool (*)(TSLexer *, TSStateId))language_module; @@ -1595,7 +1595,7 @@ static void ts_wasm_store__call( // wasmtime_error_message(error, &message); // fprintf( // stderr, - // "error in wasm module: %.*s\n", + // "error in Wasm module: %.*s\n", // (int)message.size, message.data // ); wasmtime_error_delete(error); @@ -1605,7 +1605,7 @@ static void ts_wasm_store__call( // wasm_trap_message(trap, &message); // fprintf( // stderr, - // "trap in wasm module: %.*s\n", + // "trap in Wasm module: %.*s\n", // (int)message.size, message.data // ); wasm_trap_delete(trap); @@ -1616,7 +1616,7 @@ static void ts_wasm_store__call( // The data fields of TSLexer, without the function pointers. // // This portion of the struct needs to be copied in and out -// of wasm memory before and after calling a scan function. +// of Wasm memory before and after calling a scan function. typedef struct { int32_t lookahead; TSSymbol result_symbol; @@ -1790,8 +1790,8 @@ void ts_wasm_language_release(const TSLanguage *self) { LanguageWasmModule *module = ts_language__wasm_module(self); ts_assert(module->ref_count > 0); if (atomic_dec(&module->ref_count) == 0) { - // Update the language id to reflect that the language is deleted. This allows any wasm stores - // that hold wasm instances for this language to delete those instances. + // Update the language id to reflect that the language is deleted. This allows any Wasm stores + // that hold Wasm instances for this language to delete those instances. atomic_inc(&module->language_id->is_language_deleted); language_id_delete(module->language_id); @@ -1833,8 +1833,8 @@ void ts_wasm_language_release(const TSLanguage *self) { #else -// If the WASM feature is not enabled, define dummy versions of all of the -// wasm-related functions. +// If the Wasm feature is not enabled, define dummy versions of all of the +// Wasm-related functions. void ts_wasm_store_delete(TSWasmStore *self) { (void)self; From 86b9f81ad63732c286348e21471b9b388f0d1e9a Mon Sep 17 00:00:00 2001 From: bfredl Date: Wed, 20 Aug 2025 09:36:16 +0200 Subject: [PATCH 311/663] build(zig)!: upgrade build.zig to zig 0.15 This no longer supports zig 0.14. --- build.zig | 4 ++-- build.zig.zon | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/build.zig b/build.zig index 4062e069..bd5193de 100644 --- a/build.zig +++ b/build.zig @@ -95,7 +95,7 @@ fn wasmtimeDep(target: std.Target) []const u8 { } fn findSourceFiles(b: *std.Build) ![]const []const u8 { - var sources = std.ArrayList([]const u8).init(b.allocator); + var sources : std.ArrayList([]const u8) = .empty; var dir = try b.build_root.handle.openDir("lib/src", .{ .iterate = true }); var iter = dir.iterate(); @@ -106,7 +106,7 @@ fn findSourceFiles(b: *std.Build) ![]const []const u8 { const file = entry.name; const ext = std.fs.path.extension(file); if (std.mem.eql(u8, ext, ".c") and !std.mem.eql(u8, file, "lib.c")) { - try sources.append(b.dupe(file)); + try sources.append(b.allocator, b.dupe(file)); } } diff --git a/build.zig.zon b/build.zig.zon index a1983339..9b565f52 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -2,6 +2,7 @@ .name = .tree_sitter, .fingerprint = 0x841224b447ac0d4f, .version = "0.26.0", + .minimum_zig_version = "0.15.0", .paths = .{ "build.zig", "build.zig.zon", From be888a5fef7688a68d8fbe4d5124a2c03a39d9b4 Mon Sep 17 00:00:00 2001 From: Alexander von Gluck Date: Fri, 22 Aug 2025 11:09:13 +0000 Subject: [PATCH 312/663] fix(c): add Haiku support to endian.h --- lib/src/portable/endian.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/portable/endian.h b/lib/src/portable/endian.h index cfbae6aa..a6560826 100644 --- a/lib/src/portable/endian.h +++ b/lib/src/portable/endian.h @@ -18,6 +18,7 @@ #if defined(HAVE_ENDIAN_H) || \ defined(__linux__) || \ defined(__GNU__) || \ + defined(__HAIKU__) || \ defined(__illumos__) || \ defined(__NetBSD__) || \ defined(__OpenBSD__) || \ From 629093d2c3c841184cc11806170d58b660318390 Mon Sep 17 00:00:00 2001 From: Alexander von Gluck Date: Fri, 22 Aug 2025 11:09:13 +0000 Subject: [PATCH 313/663] fix(c): add Haiku support to endian.h (cherry picked from commit be888a5fef7688a68d8fbe4d5124a2c03a39d9b4) --- lib/src/portable/endian.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/portable/endian.h b/lib/src/portable/endian.h index cfbae6aa..a6560826 100644 --- a/lib/src/portable/endian.h +++ b/lib/src/portable/endian.h @@ -18,6 +18,7 @@ #if defined(HAVE_ENDIAN_H) || \ defined(__linux__) || \ defined(__GNU__) || \ + defined(__HAIKU__) || \ defined(__illumos__) || \ defined(__NetBSD__) || \ defined(__OpenBSD__) || \ From fee50ad0ce3279f9c6f96576af24787601bbdc5f Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Wed, 13 Aug 2025 18:04:53 -0400 Subject: [PATCH 314/663] feat(lib): add lldb pretty-printers for some C lib types --- docs/src/6-contributing.md | 7 ++ lib/lldb_pretty_printers/table_entry.py | 60 +++++++++++ lib/lldb_pretty_printers/tree_sitter_types.py | 64 +++++++++++ lib/lldb_pretty_printers/ts_array.py | 78 ++++++++++++++ lib/lldb_pretty_printers/ts_tree.py | 101 ++++++++++++++++++ 5 files changed, 310 insertions(+) create mode 100644 lib/lldb_pretty_printers/table_entry.py create mode 100644 lib/lldb_pretty_printers/tree_sitter_types.py create mode 100644 lib/lldb_pretty_printers/ts_array.py create mode 100644 lib/lldb_pretty_printers/ts_tree.py diff --git a/docs/src/6-contributing.md b/docs/src/6-contributing.md index 862580db..001d6337 100644 --- a/docs/src/6-contributing.md +++ b/docs/src/6-contributing.md @@ -108,6 +108,13 @@ Additionally, if you want to run a particular _example_ from the corpus, you can cargo xtask test -l javascript -e Arrays ``` +If you are using `lldb` to debug the C library, tree-sitter provides custom pretty printers for several of its types. +You can enable these helpers by importing them: + +```sh +(lldb) command script import /path/to/tree-sitter/lib/lldb_pretty_printers/tree_sitter_types.py +``` + ## Published Packages The main [`tree-sitter/tree-sitter`][ts repo] repository contains the source code for diff --git a/lib/lldb_pretty_printers/table_entry.py b/lib/lldb_pretty_printers/table_entry.py new file mode 100644 index 00000000..f46b9d43 --- /dev/null +++ b/lib/lldb_pretty_printers/table_entry.py @@ -0,0 +1,60 @@ +from lldb import SBValue + +# typedef struct { +# const TSParseAction *actions; +# uint32_t action_count; +# bool is_reusable; +# } TableEntry; + +# TODO: Same inline issue as with `TSTreeSyntheticProvider`. + + +class TableEntrySyntheticProvider: + def __init__(self, valobj: SBValue, _dict): + self.valobj: SBValue = valobj + self.update() + + def num_children(self) -> int: + # is_reusable, action_count, actions + return 2 + max(1, self.action_count.GetValueAsUnsigned()) + + def get_child_index(self, name: str) -> int: + if name == "is_reusable": + return 0 + elif name == "action_count": + return 1 + else: + if self.action_count.GetValueAsUnsigned() == 0: + return 2 + index = name.lstrip("actions[").rstrip("]") + if index.isdigit(): + return int(index) + else: + return -1 + + def get_child_at_index(self, index: int) -> SBValue: + if index == 0: + return self.is_reusable + elif index == 1: + return self.action_count + else: + if self.action_count.GetValueAsUnsigned() == 0: + return self.actions + offset: int = index - 3 + start: int = self.actions.GetValueAsUnsigned() + address: int = start + offset * self.element_type_size + element: SBValue = self.actions.CreateValueFromAddress( + "action[%s]" % (offset), address, self.element_type + ) + return element + + def update(self): + self.is_reusable: SBValue = self.valobj.GetChildMemberWithName("is_reusable") + self.action_count: SBValue = self.valobj.GetChildMemberWithName("action_count") + self.actions: SBValue = self.valobj.GetChildMemberWithName("actions") + + self.element_type: SBType = self.actions.GetType().GetPointeeType() + self.element_type_size: int = self.element_type.GetByteSize() + + def has_children(self) -> bool: + return True diff --git a/lib/lldb_pretty_printers/tree_sitter_types.py b/lib/lldb_pretty_printers/tree_sitter_types.py new file mode 100644 index 00000000..b26c67ac --- /dev/null +++ b/lib/lldb_pretty_printers/tree_sitter_types.py @@ -0,0 +1,64 @@ +import lldb + +# Even though these are "unused", we still need them in scope in order for the classes +# to exist when we register them with the debugger +from ts_tree import TSTreeSyntheticProvider +from table_entry import TableEntrySyntheticProvider +from ts_array import ArraySyntheticProvider, anon_array_recognizer + + +class TreeSitterType(object): + TS_TREE: str = "TSTree" + SUBTREE_ARRAY: str = "SubtreeArray" + MUTABLE_SUBTREE_ARRAY: str = "MutableSubtreeArray" + STACK_SLICE_ARRAY: str = "StackSliceArray" + STACK_SUMMARY: str = "StackSummary" + STACK_ENTRY: str = "StackEntry" + REUSABLE_NODE: str = "ReusableNode" + REDUCE_ACTION_SET: str = "ReduceActionSet" + TABLE_ENTRY: str = "TableEntry" + TS_RANGE_ARRAY: str = "TSRangeArray" + CAPTURE_QUANTIFIERS: str = "CaptureQuantifiers" + CAPTURE_LIST: str = "CaptureList" + ANALYSIS_STATE_SET: str = "AnalysisStateSet" + ANALYSIS_SUBGRAPH_ARRAY: str = "AnalysisSubgraphArray" + STACK_NODE_ARRAY: str = "StackNodeArray" + STRING_DATA: str = "StringData" + + +def ts_type_to_regex(type: str) -> str: + return f"^{type}$|^struct {type}$|^typedef {type}$" + + +# Holds all tree-sitter types defined via the `Array` macro. These types will +# all share the same `ArrayTypeSyntheticProvider` synthetic provider +TS_ARRAY_TYPES = [ + TreeSitterType.REDUCE_ACTION_SET, + TreeSitterType.TS_RANGE_ARRAY, + TreeSitterType.CAPTURE_QUANTIFIERS, + TreeSitterType.ANALYSIS_STATE_SET, + TreeSitterType.CAPTURE_LIST, + TreeSitterType.ANALYSIS_SUBGRAPH_ARRAY, + TreeSitterType.STACK_SLICE_ARRAY, + TreeSitterType.STACK_SUMMARY, + TreeSitterType.SUBTREE_ARRAY, + TreeSitterType.MUTABLE_SUBTREE_ARRAY, + TreeSitterType.STRING_DATA, + TreeSitterType.STACK_NODE_ARRAY, +] + + +def __lldb_init_module(debugger: lldb.SBDebugger, _dict): + debugger.HandleCommand( + f"type synthetic add -l tree_sitter_types.TSTreeSyntheticProvider -x '{ts_type_to_regex(TreeSitterType.TS_TREE)}'" + ) + debugger.HandleCommand( + f"type synthetic add -l tree_sitter_types.TableEntrySyntheticProvider -x '{ts_type_to_regex(TreeSitterType.TABLE_ENTRY)}'" + ) + debugger.HandleCommand( + f"type synthetic add -l tree_sitter_types.ArraySyntheticProvider --recognizer-function tree_sitter_types.anon_array_recognizer" + ) + for type in TS_ARRAY_TYPES: + debugger.HandleCommand( + f"type synthetic add -l tree_sitter_types.ArraySyntheticProvider -x '{ts_type_to_regex(type)}'" + ) diff --git a/lib/lldb_pretty_printers/ts_array.py b/lib/lldb_pretty_printers/ts_array.py new file mode 100644 index 00000000..f51cd0a9 --- /dev/null +++ b/lib/lldb_pretty_printers/ts_array.py @@ -0,0 +1,78 @@ +from lldb import SBValue, SBType +import re + +# define Array(T) \ +# struct { \ +# T *contents; \ +# uint32_t size; \ +# uint32_t capacity; \ +# } + + +class ArraySyntheticProvider: + def __init__(self, valobj: SBValue, _dict): + self.valobj: SBValue = valobj + self.update() + + def num_children(self) -> int: + return 2 + self.size.GetValueAsUnsigned() # size, capacity, and elements + + def get_child_index(self, name: str) -> int: + if name == "size": + return 0 + elif name == "capacity": + return 1 + else: + if self.size.GetValueAsUnsigned() == 0: + return 2 + index = name.lstrip("[").rstrip("]") + if index.isdigit(): + return int(index) + else: + return -1 + + def get_child_at_index(self, index: int) -> SBValue: + if index == 0: + return self.size + elif index == 1: + return self.capacity + else: + if self.size.GetValueAsUnsigned() == 0: + return self.contents + offset: int = index - 2 + start: int = self.contents.GetValueAsUnsigned() + address: int = start + offset * self.element_type_size + element: SBValue = self.contents.CreateValueFromAddress( + "[%s]" % (offset), address, self.element_type + ) + return element + + def update(self): + self.contents: SBValue = self.valobj.GetChildMemberWithName("contents") + self.size: SBValue = self.valobj.GetChildMemberWithName("size") + self.capacity: SBValue = self.valobj.GetChildMemberWithName("capacity") + + self.element_type: SBType = self.contents.GetType().GetPointeeType() + self.element_type_size: int = self.element_type.GetByteSize() + + def has_children(self) -> bool: + return True + + +anon_re = re.compile( + r"struct\s*{$\s*\w+ \*contents;$\s*uint32_t size;$\s*uint32_t capacity;$\s*}", + re.MULTILINE, +) + + +# Used to recognize "anonymous" `Array(T)` types, i.e.: +# struct Foo { +# Array(Bar) bars; // Render this field usign `ArraySyntheticProvider` +# }; +def anon_array_recognizer(valobj: SBType, _dict) -> bool: + type_name = valobj.GetName() + if type_name == "(unnamed struct)": + type_str = str(valobj) + return anon_re.search(type_str) is not None + else: + return False diff --git a/lib/lldb_pretty_printers/ts_tree.py b/lib/lldb_pretty_printers/ts_tree.py new file mode 100644 index 00000000..1f690ebd --- /dev/null +++ b/lib/lldb_pretty_printers/ts_tree.py @@ -0,0 +1,101 @@ +from lldb import SBType, SBValue + +# struct TSTree { +# Subtree root; +# const TSLanguage *language; +# TSRange *included_ranges; +# unsigned included_range_count; +# }; + +# TODO: Ideally, we'd display the elements of `included_ranges` as +# children of `included_ranges` rather than separate items, i.e.: + +# (TSTree) { +# root = ... +# language = ... +# included_range_count = ... +# included_ranges = { +# [0] = { +# ... +# } +# [1] = { +# ... +# } +# ... +# } +# } +# +# instead of the current behavior: +# +# (TSTree) { +# root = ... +# language = ... +# included_range_count = ... +# included_ranges[0] = { +# ... +# } +# included_ranges[1] = { +# ... +# } +# } +# + + +class TSTreeSyntheticProvider: + def __init__(self, valobj: SBValue, _dict): + self.valobj: SBValue = valobj + self.update() + + def num_children(self) -> int: + # root, language, included_range_count, included_ranges + return 3 + self.included_range_count.GetValueAsUnsigned() + + def get_child_index(self, name: str) -> int: + if name == "root": + return 0 + elif name == "language": + return 1 + elif name == "included_range_count": + return 2 + else: + if self.included_range_count.GetValueAsUnsigned() == 0: + return 3 + index = name.lstrip("included_ranges[").rstrip("]") + if index.isdigit(): + return int(index) + else: + return -1 + + def get_child_at_index(self, index: int) -> SBValue: + if index == 0: + return self.root + elif index == 1: + return self.language + elif index == 2: + return self.included_range_count + else: + if self.included_range_count.GetValueAsUnsigned() == 0: + return self.included_ranges + offset: int = index - 3 + start: int = self.included_ranges.GetValueAsUnsigned() + address: int = start + offset * self.element_type_size + element: SBValue = self.included_ranges.CreateValueFromAddress( + "included_ranges[%s]" % (offset), address, self.element_type + ) + return element + + def update(self): + self.root: SBValue = self.valobj.GetChildMemberWithName("root") + self.language: SBValue = self.valobj.GetChildMemberWithName("language") + self.included_range_count: SBValue = self.valobj.GetChildMemberWithName( + "included_range_count" + ) + self.included_ranges: SBValue = self.valobj.GetChildMemberWithName( + "included_ranges" + ) + + self.element_type: SBType = self.included_ranges.GetType().GetPointeeType() + self.element_type_size: int = self.element_type.GetByteSize() + + def has_children(self) -> bool: + return True From 10f5a42fd79a219cea4b8e6b5732856eadb2fbe5 Mon Sep 17 00:00:00 2001 From: John-Philip Taylor Date: Fri, 22 Aug 2025 19:50:45 +0200 Subject: [PATCH 315/663] feat(cli): Version updates (#4179) - `version` on its own displays the current version - `version --bump patch` bumps the patch version - `version --bump minor` bumps the minor version - `version --bump major` bumps the major version - `version 1.2.3` bumps the version directly (existing behaviour) All flavours of version bump displays a string in the form: `Bumping version 1.2.3 to 4.5.6` --- crates/cli/src/main.rs | 26 ++++++++++---- crates/cli/src/version.rs | 75 ++++++++++++++++++++++++++++++++++----- 2 files changed, 86 insertions(+), 15 deletions(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index b0931148..2f816ad4 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -26,7 +26,9 @@ use tree_sitter_cli::{ playground, query, tags::{self, TagsOptions}, test::{self, TestOptions, TestStats}, - test_highlight, test_tags, util, version, wasm, + test_highlight, test_tags, util, version, + version::BumpLevel, + wasm, }; use tree_sitter_config::Config; use tree_sitter_highlight::Highlighter; @@ -53,7 +55,7 @@ enum Commands { Parse(Parse), /// Run a parser's tests Test(Test), - /// Increment the version of a grammar + /// Display or increment the version of a grammar Version(Version), /// Fuzz a parser Fuzz(Fuzz), @@ -327,14 +329,26 @@ struct Test { #[derive(Args)] #[command(alias = "publish")] -/// Increment the version of a grammar +/// Display or increment the version of a grammar struct Version { - #[arg(num_args = 1)] /// The version to bump to - pub version: SemverVersion, + #[arg( + conflicts_with = "bump", + long_help = "\ + The version to bump to\n\ + \n\ + Examples:\n \ + tree-sitter version: display the current version\n \ + tree-sitter version : bump to specified version\n \ + tree-sitter version --bump : automatic bump" + )] + pub version: Option, /// The path to the tree-sitter grammar directory #[arg(long, short = 'p')] pub grammar_path: Option, + /// Automatically bump from the current version + #[arg(long, value_enum, conflicts_with = "version")] + pub bump: Option, } #[derive(Args)] @@ -1314,7 +1328,7 @@ impl Test { impl Version { fn run(self, current_dir: PathBuf) -> Result<()> { - version::Version::new(self.version.to_string(), current_dir).run() + version::Version::new(self.version, current_dir, self.bump).run() } } diff --git a/crates/cli/src/version.rs b/crates/cli/src/version.rs index 11871265..3064ead7 100644 --- a/crates/cli/src/version.rs +++ b/crates/cli/src/version.rs @@ -1,29 +1,86 @@ use std::{fs, path::PathBuf, process::Command}; use anyhow::{anyhow, Context, Result}; +use clap::ValueEnum; use regex::Regex; +use semver::Version as SemverVersion; +use std::cmp::Ordering; use tree_sitter_loader::TreeSitterJSON; +#[derive(Clone, Copy, Default, ValueEnum)] +pub enum BumpLevel { + #[default] + Patch, + Minor, + Major, +} + pub struct Version { - pub version: String, + pub version: Option, pub current_dir: PathBuf, + pub bump: Option, } impl Version { #[must_use] - pub const fn new(version: String, current_dir: PathBuf) -> Self { + pub const fn new( + version: Option, + current_dir: PathBuf, + bump: Option, + ) -> Self { Self { version, current_dir, + bump, } } - pub fn run(self) -> Result<()> { + pub fn run(mut self) -> Result<()> { let tree_sitter_json = self.current_dir.join("tree-sitter.json"); let tree_sitter_json = serde_json::from_str::(&fs::read_to_string(tree_sitter_json)?)?; + let current_version = tree_sitter_json.metadata.version; + self.version = match (self.version.is_some(), self.bump) { + (false, None) => { + println!("Current version: {current_version}"); + return Ok(()); + } + (true, None) => self.version, + (false, Some(bump)) => { + let mut v = current_version.clone(); + match bump { + BumpLevel::Patch => v.patch += 1, + BumpLevel::Minor => { + v.minor += 1; + v.patch = 0; + } + BumpLevel::Major => { + v.major += 1; + v.minor = 0; + v.patch = 0; + } + } + Some(v) + } + (true, Some(_)) => unreachable!(), + }; + + let new_version = self.version.as_ref().unwrap(); + match new_version.cmp(¤t_version) { + Ordering::Less => { + eprintln!("Warning: new version is lower than current!"); + println!("Reverting version {current_version} to {new_version}"); + } + Ordering::Greater => { + println!("Bumping version {current_version} to {new_version}"); + } + Ordering::Equal => { + println!("Keeping version {current_version}"); + } + } + let is_multigrammar = tree_sitter_json.grammars.len() > 1; self.update_treesitter_json().with_context(|| { @@ -80,7 +137,7 @@ impl Version { format!( "{}{}{}", &line[..start_quote], - self.version, + self.version.as_ref().unwrap(), &line[end_quote..] ) } else { @@ -107,7 +164,7 @@ impl Version { .lines() .map(|line| { if line.starts_with("version =") { - format!("version = \"{}\"", self.version) + format!("version = \"{}\"", self.version.as_ref().unwrap()) } else { line.to_string() } @@ -157,7 +214,7 @@ impl Version { format!( "{}{}{}", &line[..start_quote], - self.version, + self.version.as_ref().unwrap(), &line[end_quote..] ) } else { @@ -208,7 +265,7 @@ impl Version { .lines() .map(|line| { if line.starts_with("VERSION") { - format!("VERSION := {}", self.version) + format!("VERSION := {}", self.version.as_ref().unwrap()) } else { line.to_string() } @@ -230,7 +287,7 @@ impl Version { let cmake = fs::read_to_string(self.current_dir.join("CMakeLists.txt"))?; let re = Regex::new(r#"(\s*VERSION\s+)"[0-9]+\.[0-9]+\.[0-9]+""#)?; - let cmake = re.replace(&cmake, format!(r#"$1"{}""#, self.version)); + let cmake = re.replace(&cmake, format!(r#"$1"{}""#, self.version.as_ref().unwrap())); fs::write(self.current_dir.join("CMakeLists.txt"), cmake.as_bytes())?; @@ -248,7 +305,7 @@ impl Version { .lines() .map(|line| { if line.starts_with("version =") { - format!("version = \"{}\"", self.version) + format!("version = \"{}\"", self.version.as_ref().unwrap()) } else { line.to_string() } From 1c640ac2c3c151fc92a360c91dc4d5aa94360537 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Fri, 22 Aug 2025 18:33:50 +0300 Subject: [PATCH 316/663] fix(cli): correct resource paths --- crates/cli/build.rs | 6 +++--- crates/cli/src/playground.rs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/cli/build.rs b/crates/cli/build.rs index 6e744539..45f54634 100644 --- a/crates/cli/build.rs +++ b/crates/cli/build.rs @@ -52,9 +52,9 @@ fn main() { fn web_playground_files_present() -> bool { let paths = [ - "../docs/src/assets/js/playground.js", - "../lib/binding_web/web-tree-sitter.js", - "../lib/binding_web/web-tree-sitter.wasm", + "../../docs/src/assets/js/playground.js", + "../../lib/binding_web/web-tree-sitter.js", + "../../lib/binding_web/web-tree-sitter.wasm", ]; paths.iter().all(|p| Path::new(p).exists()) diff --git a/crates/cli/src/playground.rs b/crates/cli/src/playground.rs index bce1a18c..2344a805 100644 --- a/crates/cli/src/playground.rs +++ b/crates/cli/src/playground.rs @@ -18,7 +18,7 @@ macro_rules! optional_resource { if let Some(tree_sitter_dir) = tree_sitter_dir { Cow::Owned(fs::read(tree_sitter_dir.join($path)).unwrap()) } else { - Cow::Borrowed(include_bytes!(concat!("../../", $path))) + Cow::Borrowed(include_bytes!(concat!("../../../", $path))) } } @@ -41,7 +41,7 @@ fn get_main_html(tree_sitter_dir: Option<&Path>) -> Cow<'static, [u8]> { tree_sitter_dir.map_or( Cow::Borrowed(include_bytes!("playground.html")), |tree_sitter_dir| { - Cow::Owned(fs::read(tree_sitter_dir.join("cli/src/playground.html")).unwrap()) + Cow::Owned(fs::read(tree_sitter_dir.join("crates/cli/src/playground.html")).unwrap()) }, ) } From 4602e60c1b7354be542ce9132e9bab7d10b6ef00 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Fri, 22 Aug 2025 18:14:14 +0300 Subject: [PATCH 317/663] refactor(playground): move style to head --- crates/cli/src/playground.html | 173 ++++++++++++++++----------------- 1 file changed, 86 insertions(+), 87 deletions(-) diff --git a/crates/cli/src/playground.html b/crates/cli/src/playground.html index daa1ade9..1d0e0d81 100644 --- a/crates/cli/src/playground.html +++ b/crates/cli/src/playground.html @@ -7,93 +7,6 @@ sizes="32x32" /> - - - - - - - - - - - - + + + + + + + + + + + From eb5ad7eb26f67510aa289755b53d83116869a826 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Fri, 22 Aug 2025 18:45:01 +0300 Subject: [PATCH 318/663] feat(playground): add a button to copy the tree Co-Authored-By: Firas al-Khalil --- crates/cli/src/playground.html | 5 ++++- docs/src/7-playground.md | 5 ++++- docs/src/assets/js/playground.js | 14 +++++++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/crates/cli/src/playground.html b/crates/cli/src/playground.html index 1d0e0d81..ecf7efc4 100644 --- a/crates/cli/src/playground.html +++ b/crates/cli/src/playground.html @@ -387,7 +387,10 @@
-
Tree
+
+ Tree + +

       
diff --git a/docs/src/7-playground.md b/docs/src/7-playground.md index c9a13123..1d728e98 100644 --- a/docs/src/7-playground.md +++ b/docs/src/7-playground.md @@ -70,7 +70,10 @@ -

Tree

+

+ Tree + +


diff --git a/docs/src/assets/js/playground.js b/docs/src/assets/js/playground.js
index cebd7b52..3a410595 100644
--- a/docs/src/assets/js/playground.js
+++ b/docs/src/assets/js/playground.js
@@ -117,6 +117,7 @@ window.initializePlayground = async (opts) => {
   const queryContainer = document.getElementById("query-container");
   const queryInput = document.getElementById("query-input");
   const accessibilityCheckbox = document.getElementById("accessibility-checkbox");
+  const copyButton = document.getElementById("copy-button");
   const updateTimeSpan = document.getElementById("update-time");
   const languagesByName = {};
 
@@ -174,11 +175,12 @@ window.initializePlayground = async (opts) => {
   queryEditor.on("changes", debounce(handleQueryChange, 150));
 
   loggingCheckbox.addEventListener("change", handleLoggingChange);
-  anonymousNodes.addEventListener('change', renderTree);
+  anonymousNodes.addEventListener("change", renderTree);
   queryCheckbox.addEventListener("change", handleQueryEnableChange);
   accessibilityCheckbox.addEventListener("change", handleQueryChange);
   languageSelect.addEventListener("change", handleLanguageChange);
   outputContainer.addEventListener("click", handleTreeClick);
+  copyButton.addEventListener("click", handleCopy);
 
   handleQueryEnableChange();
   await handleLanguageChange();
@@ -497,6 +499,16 @@ window.initializePlayground = async (opts) => {
     }
   }
 
+  function handleCopy() {
+    const selection = window.getSelection();
+    selection.removeAllRanges();
+    const range = document.createRange();
+    range.selectNodeContents(outputContainer);
+    selection.addRange(range);
+    navigator.clipboard.writeText(selection.toString());
+    selection.removeRange(range);
+  }
+
   function handleTreeClick(event) {
     if (event.target.tagName === "A") {
       event.preventDefault();

From 0d914c860a6df48cd8f6f3fa81194e2aabd2beac Mon Sep 17 00:00:00 2001
From: WillLillis 
Date: Sun, 24 Aug 2025 04:02:42 -0400
Subject: [PATCH 319/663] fix(wasm): delete `var_i32_type` after initializing
 global stack pointer value

---
 lib/src/wasm_store.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lib/src/wasm_store.c b/lib/src/wasm_store.c
index f9c7d474..583655a5 100644
--- a/lib/src/wasm_store.c
+++ b/lib/src/wasm_store.c
@@ -754,6 +754,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) {
   wasmtime_val_t stack_pointer_value = WASM_I32_VAL(0);
   wasmtime_global_t stack_pointer_global;
   error = wasmtime_global_new(context, var_i32_type, &stack_pointer_value, &stack_pointer_global);
+  wasm_globaltype_delete(var_i32_type);
   ts_assert(!error);
 
   *self = (TSWasmStore) {

From 25d63ab7ab1c8bb555f803f572b9acf6f746c47f Mon Sep 17 00:00:00 2001
From: WillLillis 
Date: Sun, 24 Aug 2025 04:02:42 -0400
Subject: [PATCH 320/663] fix(wasm): delete `var_i32_type` after initializing
 global stack pointer value

(cherry picked from commit 0d914c860a6df48cd8f6f3fa81194e2aabd2beac)
---
 lib/src/wasm_store.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lib/src/wasm_store.c b/lib/src/wasm_store.c
index d018a68c..f0c0970d 100644
--- a/lib/src/wasm_store.c
+++ b/lib/src/wasm_store.c
@@ -754,6 +754,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) {
   wasmtime_val_t stack_pointer_value = WASM_I32_VAL(0);
   wasmtime_global_t stack_pointer_global;
   error = wasmtime_global_new(context, var_i32_type, &stack_pointer_value, &stack_pointer_global);
+  wasm_globaltype_delete(var_i32_type);
   ts_assert(!error);
 
   *self = (TSWasmStore) {

From 0a7274678ad55ef44944948965bba2d09d37c3b3 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 26 Aug 2025 13:55:32 +0000
Subject: [PATCH 321/663] build(deps): bump the cargo group with 8 updates

Bumps the cargo group with 8 updates:

| Package | From | To |
| --- | --- | --- |
| [cc](https://github.com/rust-lang/cc-rs) | `1.2.33` | `1.2.34` |
| [filetime](https://github.com/alexcrichton/filetime) | `0.2.25` | `0.2.26` |
| [indexmap](https://github.com/indexmap-rs/indexmap) | `2.10.0` | `2.11.0` |
| [regex](https://github.com/rust-lang/regex) | `1.11.1` | `1.11.2` |
| [regex-syntax](https://github.com/rust-lang/regex) | `0.8.5` | `0.8.6` |
| [serde_json](https://github.com/serde-rs/json) | `1.0.142` | `1.0.143` |
| [tempfile](https://github.com/Stebalien/tempfile) | `3.20.0` | `3.21.0` |
| [thiserror](https://github.com/dtolnay/thiserror) | `2.0.15` | `2.0.16` |


Updates `cc` from 1.2.33 to 1.2.34
- [Release notes](https://github.com/rust-lang/cc-rs/releases)
- [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.33...cc-v1.2.34)

Updates `filetime` from 0.2.25 to 0.2.26
- [Commits](https://github.com/alexcrichton/filetime/commits)

Updates `indexmap` from 2.10.0 to 2.11.0
- [Changelog](https://github.com/indexmap-rs/indexmap/blob/main/RELEASES.md)
- [Commits](https://github.com/indexmap-rs/indexmap/compare/2.10.0...2.11.0)

Updates `regex` from 1.11.1 to 1.11.2
- [Release notes](https://github.com/rust-lang/regex/releases)
- [Changelog](https://github.com/rust-lang/regex/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/regex/compare/1.11.1...1.11.2)

Updates `regex-syntax` from 0.8.5 to 0.8.6
- [Release notes](https://github.com/rust-lang/regex/releases)
- [Changelog](https://github.com/rust-lang/regex/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/regex/compare/regex-syntax-0.8.5...regex-syntax-0.8.6)

Updates `serde_json` from 1.0.142 to 1.0.143
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.142...v1.0.143)

Updates `tempfile` from 3.20.0 to 3.21.0
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Stebalien/tempfile/commits)

Updates `thiserror` from 2.0.15 to 2.0.16
- [Release notes](https://github.com/dtolnay/thiserror/releases)
- [Commits](https://github.com/dtolnay/thiserror/compare/2.0.15...2.0.16)

---
updated-dependencies:
- dependency-name: cc
  dependency-version: 1.2.34
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
- dependency-name: filetime
  dependency-version: 0.2.26
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
- dependency-name: indexmap
  dependency-version: 2.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo
- dependency-name: regex
  dependency-version: 1.11.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
- dependency-name: regex-syntax
  dependency-version: 0.8.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
- dependency-name: serde_json
  dependency-version: 1.0.143
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
- dependency-name: tempfile
  dependency-version: 3.21.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo
- dependency-name: thiserror
  dependency-version: 2.0.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
...

Signed-off-by: dependabot[bot] 
---
 Cargo.lock     | 48 ++++++++++++++++++++++++------------------------
 Cargo.toml     | 16 ++++++++--------
 lib/Cargo.toml |  4 ++--
 3 files changed, 34 insertions(+), 34 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index e0a63e33..65014116 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -190,9 +190,9 @@ checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b"
 
 [[package]]
 name = "cc"
-version = "1.2.33"
+version = "1.2.34"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ee0f8803222ba5a7e2777dd72ca451868909b1ac410621b676adf07280e9b5f"
+checksum = "42bc4aea80032b7bf409b0bc7ccad88853858911b7713a8062fdc0623867bedc"
 dependencies = [
  "jobserver",
  "libc",
@@ -603,14 +603,14 @@ dependencies = [
 
 [[package]]
 name = "filetime"
-version = "0.2.25"
+version = "0.2.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586"
+checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed"
 dependencies = [
  "cfg-if",
  "libc",
  "libredox",
- "windows-sys 0.59.0",
+ "windows-sys 0.60.2",
 ]
 
 [[package]]
@@ -940,9 +940,9 @@ dependencies = [
 
 [[package]]
 name = "indexmap"
-version = "2.10.0"
+version = "2.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661"
+checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9"
 dependencies = [
  "equivalent",
  "hashbrown 0.15.2",
@@ -1511,9 +1511,9 @@ dependencies = [
 
 [[package]]
 name = "regex"
-version = "1.11.1"
+version = "1.11.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
+checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -1534,9 +1534,9 @@ dependencies = [
 
 [[package]]
 name = "regex-syntax"
-version = "0.8.5"
+version = "0.8.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
+checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
 
 [[package]]
 name = "rgb"
@@ -1680,9 +1680,9 @@ dependencies = [
 
 [[package]]
 name = "serde_json"
-version = "1.0.142"
+version = "1.0.143"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7"
+checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a"
 dependencies = [
  "indexmap",
  "itoa",
@@ -1804,15 +1804,15 @@ checksum = "dc12939a1c9b9d391e0b7135f72fd30508b73450753e28341fed159317582a77"
 
 [[package]]
 name = "tempfile"
-version = "3.20.0"
+version = "3.21.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1"
+checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e"
 dependencies = [
  "fastrand",
  "getrandom 0.3.1",
  "once_cell",
  "rustix 1.0.2",
- "windows-sys 0.59.0",
+ "windows-sys 0.60.2",
 ]
 
 [[package]]
@@ -1835,11 +1835,11 @@ dependencies = [
 
 [[package]]
 name = "thiserror"
-version = "2.0.15"
+version = "2.0.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80d76d3f064b981389ecb4b6b7f45a0bf9fdac1d5b9204c7bd6714fecc302850"
+checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0"
 dependencies = [
- "thiserror-impl 2.0.15",
+ "thiserror-impl 2.0.16",
 ]
 
 [[package]]
@@ -1855,9 +1855,9 @@ dependencies = [
 
 [[package]]
 name = "thiserror-impl"
-version = "2.0.15"
+version = "2.0.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44d29feb33e986b6ea906bd9c3559a856983f92371b3eaa5e83782a351623de0"
+checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2067,7 +2067,7 @@ dependencies = [
  "serde",
  "serde_json",
  "smallbitvec",
- "thiserror 2.0.15",
+ "thiserror 2.0.16",
  "topological-sort",
  "tree-sitter",
  "url",
@@ -2079,7 +2079,7 @@ version = "0.26.0"
 dependencies = [
  "regex",
  "streaming-iterator",
- "thiserror 2.0.15",
+ "thiserror 2.0.16",
  "tree-sitter",
 ]
 
@@ -2120,7 +2120,7 @@ dependencies = [
  "memchr",
  "regex",
  "streaming-iterator",
- "thiserror 2.0.15",
+ "thiserror 2.0.16",
  "tree-sitter",
 ]
 
diff --git a/Cargo.toml b/Cargo.toml
index 67c60713..c3813a5c 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -106,7 +106,7 @@ ansi_colours = "1.2.3"
 anstyle = "1.0.11"
 anyhow = "1.0.99"
 bstr = "1.12.0"
-cc = "1.2.33"
+cc = "1.2.34"
 clap = { version = "4.5.45", features = [
   "cargo",
   "derive",
@@ -121,14 +121,14 @@ ctor = "0.2.9"
 ctrlc = { version = "3.4.7", features = ["termination"] }
 dialoguer = { version = "0.11.0", features = ["fuzzy-select"] }
 etcetera = "0.10.0"
-filetime = "0.2.25"
+filetime = "0.2.26"
 flate2 = "1.1.2"
 fs4 = "0.12.0"
 git2 = "0.20.2"
 glob = "0.3.3"
 heck = "0.5.0"
 html-escape = "0.2.13"
-indexmap = "2.10.0"
+indexmap = "2.11.0"
 indoc = "2.0.6"
 libloading = "0.8.8"
 log = { version = "0.4.27", features = ["std"] }
@@ -137,19 +137,19 @@ once_cell = "1.21.3"
 path-slash = "0.2.1"
 pretty_assertions = "1.4.1"
 rand = "0.8.5"
-regex = "1.11.1"
-regex-syntax = "0.8.5"
+regex = "1.11.2"
+regex-syntax = "0.8.6"
 rustc-hash = "2.1.1"
 semver = { version = "1.0.26", features = ["serde"] }
 serde = { version = "1.0.219", features = ["derive"] }
 serde_derive = "1.0.217"
-serde_json = { version = "1.0.142", features = ["preserve_order"] }
+serde_json = { version = "1.0.143", features = ["preserve_order"] }
 similar = "2.7.0"
 smallbitvec = "2.6.0"
 streaming-iterator = "0.1.9"
 tar = "0.4.40"
-tempfile = "3.20.0"
-thiserror = "2.0.15"
+tempfile = "3.21.0"
+thiserror = "2.0.16"
 tiny_http = "0.12.0"
 toml = "0.8.23"
 topological-sort = "0.2.2"
diff --git a/lib/Cargo.toml b/lib/Cargo.toml
index 6be362b8..26e84a78 100644
--- a/lib/Cargo.toml
+++ b/lib/Cargo.toml
@@ -46,8 +46,8 @@ std = ["regex/std", "regex/perf", "regex-syntax/unicode"]
 wasm = ["std", "wasmtime-c-api"]
 
 [dependencies]
-regex = { version = "1.11.1", default-features = false, features = ["unicode"] }
-regex-syntax = { version = "0.8.5", default-features = false }
+regex = { version = "1.11.2", default-features = false, features = ["unicode"] }
+regex-syntax = { version = "0.8.6", default-features = false }
 tree-sitter-language.workspace = true
 streaming-iterator = "0.1.9"
 

From 79177a1cd526cedc2e08deed7b595bbdd17a30b8 Mon Sep 17 00:00:00 2001
From: Quentin LE DILAVREC 
Date: Wed, 27 Aug 2025 10:25:29 +0200
Subject: [PATCH 322/663] fix(rust): EqCapture accepted cases where number of
 captured nodes differed by one

Problem: When using alternations, the `#eq?` predicate does not always use the same capture name.

Solution: Iterate the left and right captured nodes more independently.
---
 crates/cli/src/tests/query_test.rs | 55 ++++++++++++++++++++++++++++++
 lib/binding_rust/lib.rs            |  8 +++--
 2 files changed, 60 insertions(+), 3 deletions(-)

diff --git a/crates/cli/src/tests/query_test.rs b/crates/cli/src/tests/query_test.rs
index f75706a4..02e7c90c 100644
--- a/crates/cli/src/tests/query_test.rs
+++ b/crates/cli/src/tests/query_test.rs
@@ -2999,6 +2999,61 @@ fn test_query_matches_with_deeply_nested_patterns_with_fields() {
     });
 }
 
+#[test]
+fn test_query_matches_with_alternations_and_predicates() {
+    allocations::record(|| {
+        let language = get_language("java");
+        let query = Query::new(
+            &language,
+            "
+            (block
+                [
+                    (local_variable_declaration
+                        (variable_declarator
+                            (identifier) @def.a
+                            (string_literal) @lit.a
+                        )
+                    )
+                    (local_variable_declaration
+                        (variable_declarator
+                            (identifier) @def.b
+                            (null_literal) @lit.b
+                        )
+                    )
+                ]
+                (expression_statement
+                    (method_invocation [
+                        (argument_list
+                            (identifier) @ref.a
+                            (string_literal)
+                        )
+                        (argument_list
+                            (null_literal)
+                            (identifier) @ref.b
+                        )
+                    ])
+                )
+                (#eq? @def.a @ref.a )
+                (#eq? @def.b @ref.b )
+            )
+            ",
+        )
+        .unwrap();
+
+        assert_query_matches(
+            &language,
+            &query,
+            r#"
+            void test() {
+                int a = "foo";
+                f(null, b);
+            }
+            "#,
+            &[],
+        );
+    });
+}
+
 #[test]
 fn test_query_matches_with_indefinite_step_containing_no_captures() {
     allocations::record(|| {
diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs
index 0dbd021e..963469fb 100644
--- a/lib/binding_rust/lib.rs
+++ b/lib/binding_rust/lib.rs
@@ -3355,9 +3355,11 @@ impl<'tree> QueryMatch<'_, 'tree> {
             .iter()
             .all(|predicate| match predicate {
                 TextPredicateCapture::EqCapture(i, j, is_positive, match_all_nodes) => {
-                    let mut nodes_1 = self.nodes_for_capture_index(*i);
-                    let mut nodes_2 = self.nodes_for_capture_index(*j);
-                    while let (Some(node1), Some(node2)) = (nodes_1.next(), nodes_2.next()) {
+                    let mut nodes_1 = self.nodes_for_capture_index(*i).peekable();
+                    let mut nodes_2 = self.nodes_for_capture_index(*j).peekable();
+                    while nodes_1.peek().is_some() && nodes_2.peek().is_some() {
+                        let node1 = nodes_1.next().unwrap();
+                        let node2 = nodes_2.next().unwrap();
                         let mut text1 = text_provider.text(node1);
                         let mut text2 = text_provider.text(node2);
                         let text1 = node_text1.get_text(&mut text1);

From 17cb10a67724dd19b36ef3be215e14701ecbb613 Mon Sep 17 00:00:00 2001
From: Quentin LE DILAVREC 
Date: Wed, 27 Aug 2025 10:25:29 +0200
Subject: [PATCH 323/663] fix(rust): EqCapture accepted cases where number of
 captured nodes differed by one

Problem: When using alternations, the `#eq?` predicate does not always use the same capture name.

Solution: Iterate the left and right captured nodes more independently.
(cherry picked from commit 79177a1cd526cedc2e08deed7b595bbdd17a30b8)
---
 cli/src/tests/query_test.rs | 55 +++++++++++++++++++++++++++++++++++++
 lib/binding_rust/lib.rs     |  8 ++++--
 2 files changed, 60 insertions(+), 3 deletions(-)

diff --git a/cli/src/tests/query_test.rs b/cli/src/tests/query_test.rs
index 05c8a0a1..09aac8a7 100644
--- a/cli/src/tests/query_test.rs
+++ b/cli/src/tests/query_test.rs
@@ -2988,6 +2988,61 @@ fn test_query_matches_with_deeply_nested_patterns_with_fields() {
     });
 }
 
+#[test]
+fn test_query_matches_with_alternations_and_predicates() {
+    allocations::record(|| {
+        let language = get_language("java");
+        let query = Query::new(
+            &language,
+            "
+            (block
+                [
+                    (local_variable_declaration
+                        (variable_declarator
+                            (identifier) @def.a
+                            (string_literal) @lit.a
+                        )
+                    )
+                    (local_variable_declaration
+                        (variable_declarator
+                            (identifier) @def.b
+                            (null_literal) @lit.b
+                        )
+                    )
+                ]
+                (expression_statement
+                    (method_invocation [
+                        (argument_list
+                            (identifier) @ref.a
+                            (string_literal)
+                        )
+                        (argument_list
+                            (null_literal)
+                            (identifier) @ref.b
+                        )
+                    ])
+                )
+                (#eq? @def.a @ref.a )
+                (#eq? @def.b @ref.b )
+            )
+            ",
+        )
+        .unwrap();
+
+        assert_query_matches(
+            &language,
+            &query,
+            r#"
+            void test() {
+                int a = "foo";
+                f(null, b);
+            }
+            "#,
+            &[],
+        );
+    });
+}
+
 #[test]
 fn test_query_matches_with_indefinite_step_containing_no_captures() {
     allocations::record(|| {
diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs
index b37ecf1d..3574391f 100644
--- a/lib/binding_rust/lib.rs
+++ b/lib/binding_rust/lib.rs
@@ -3353,9 +3353,11 @@ impl<'tree> QueryMatch<'_, 'tree> {
             .iter()
             .all(|predicate| match predicate {
                 TextPredicateCapture::EqCapture(i, j, is_positive, match_all_nodes) => {
-                    let mut nodes_1 = self.nodes_for_capture_index(*i);
-                    let mut nodes_2 = self.nodes_for_capture_index(*j);
-                    while let (Some(node1), Some(node2)) = (nodes_1.next(), nodes_2.next()) {
+                    let mut nodes_1 = self.nodes_for_capture_index(*i).peekable();
+                    let mut nodes_2 = self.nodes_for_capture_index(*j).peekable();
+                    while nodes_1.peek().is_some() && nodes_2.peek().is_some() {
+                        let node1 = nodes_1.next().unwrap();
+                        let node2 = nodes_2.next().unwrap();
                         let mut text1 = text_provider.text(node1);
                         let mut text2 = text_provider.text(node2);
                         let text1 = node_text1.get_text(&mut text1);

From e67f9f8f7ad432984136a520d5877bfa3ec09aeb Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sat, 23 Aug 2025 11:36:49 +0300
Subject: [PATCH 324/663] fix(bindings): add tree-sitter as npm dev dependency

npm is supposed to automatically install peer dependencies since v7
but sometimes it's not doing it and we need this dependency for tests
---
 crates/cli/src/init.rs                | 38 +++++++++++++++++++++------
 crates/cli/src/templates/package.json |  3 ++-
 2 files changed, 32 insertions(+), 9 deletions(-)

diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs
index 18f0a22a..8edad41e 100644
--- a/crates/cli/src/init.rs
+++ b/crates/cli/src/init.rs
@@ -285,14 +285,36 @@ pub fn generate_grammar_files(
     };
 
     // Create package.json
-    missing_path(repo_path.join("package.json"), |path| {
-        generate_file(
-            path,
-            PACKAGE_JSON_TEMPLATE,
-            dashed_language_name.as_str(),
-            &generate_opts,
-        )
-    })?;
+    missing_path_else(
+        repo_path.join("package.json"),
+        allow_update,
+        |path| {
+            generate_file(
+                path,
+                PACKAGE_JSON_TEMPLATE,
+                dashed_language_name.as_str(),
+                &generate_opts,
+            )
+        },
+        |path| {
+            let contents = fs::read_to_string(path)?
+                .replace(
+                    r#""node-addon-api": "^8.3.1"#,
+                    r#""node-addon-api": "^8.5.0""#,
+                )
+                .replace(
+                    indoc! {r#"
+                    "prebuildify": "^6.0.1",
+                    "tree-sitter-cli":"#},
+                    indoc! {r#"
+                    "prebuildify": "^6.0.1",
+                    "tree-sitter": "^0.22.4",
+                    "tree-sitter-cli":"#},
+                );
+            write_file(path, contents)?;
+            Ok(())
+        },
+    )?;
 
     // Do not create a grammar.js file in a repo with multiple language configs
     if !tree_sitter_config.has_multiple_language_configs() {
diff --git a/crates/cli/src/templates/package.json b/crates/cli/src/templates/package.json
index d7ac24df..93dc5854 100644
--- a/crates/cli/src/templates/package.json
+++ b/crates/cli/src/templates/package.json
@@ -32,11 +32,12 @@
     "*.wasm"
   ],
   "dependencies": {
-    "node-addon-api": "^8.3.1",
+    "node-addon-api": "^8.5.0",
     "node-gyp-build": "^4.8.4"
   },
   "devDependencies": {
     "prebuildify": "^6.0.1",
+    "tree-sitter": "^0.22.4",
     "tree-sitter-cli": "^CLI_VERSION"
   },
   "peerDependencies": {

From 107bd800b02c8daf1f0f830bbeaf52749a79792c Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sat, 23 Aug 2025 23:53:03 +0300
Subject: [PATCH 325/663] fix(bindings): improve zig dependency fetching logic

Currently, including a tree-sitter parser as a dependency in a zig
project and running `zig build test` on the project will fetch the
zig-tree-sitter dependency declared by the parser. This is a problem
because (a) consumers may not want this dependency for whatever reason
and (b) due to how often Zig breaks everything and how scarcely most
tree-sitter parsers are updated, the zig-tree-sitter version pinned
by the parser module will often be outdated and broken.

The workaround I used was taken from https://ziggit.dev/t/11234
---
 crates/cli/src/init.rs             | 28 ++++++++++++++++++++++------
 crates/cli/src/templates/build.zig | 17 ++++++++++-------
 2 files changed, 32 insertions(+), 13 deletions(-)

diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs
index 8edad41e..bb957c0f 100644
--- a/crates/cli/src/init.rs
+++ b/crates/cli/src/init.rs
@@ -411,6 +411,7 @@ pub fn generate_grammar_files(
                 |path| {
                     let contents = fs::read_to_string(path)?;
                     if !contents.contains("bun") {
+                        eprintln!("Replacing index.js");
                         generate_file(path, INDEX_JS_TEMPLATE, language_name, &generate_opts)?;
                     }
                     Ok(())
@@ -777,8 +778,13 @@ pub fn generate_grammar_files(
             allow_update,
             |path| generate_file(path, BUILD_ZIG_TEMPLATE, language_name, &generate_opts),
             |path| {
-                eprintln!("Replacing build.zig");
-                generate_file(path, BUILD_ZIG_TEMPLATE, language_name, &generate_opts)
+                let contents = fs::read_to_string(path)?;
+                if !contents.contains("b.pkg_hash.len") {
+                    eprintln!("Replacing build.zig");
+                    generate_file(path, BUILD_ZIG_TEMPLATE, language_name, &generate_opts)
+                } else {
+                    Ok(())
+                }
             },
         )?;
 
@@ -787,8 +793,13 @@ pub fn generate_grammar_files(
             allow_update,
             |path| generate_file(path, BUILD_ZIG_ZON_TEMPLATE, language_name, &generate_opts),
             |path| {
-                eprintln!("Replacing build.zig.zon");
-                generate_file(path, BUILD_ZIG_ZON_TEMPLATE, language_name, &generate_opts)
+                let contents = fs::read_to_string(path)?;
+                if !contents.contains(".name = .tree_sitter_") {
+                    eprintln!("Replacing build.zig.zon");
+                    generate_file(path, BUILD_ZIG_ZON_TEMPLATE, language_name, &generate_opts)
+                } else {
+                    Ok(())
+                }
             },
         )?;
 
@@ -798,8 +809,13 @@ pub fn generate_grammar_files(
                 allow_update,
                 |path| generate_file(path, ROOT_ZIG_TEMPLATE, language_name, &generate_opts),
                 |path| {
-                    eprintln!("Replacing root.zig");
-                    generate_file(path, ROOT_ZIG_TEMPLATE, language_name, &generate_opts)
+                    let contents = fs::read_to_string(path)?;
+                    if contents.contains("ts.Language") {
+                        eprintln!("Replacing root.zig");
+                        generate_file(path, ROOT_ZIG_TEMPLATE, language_name, &generate_opts)
+                    } else {
+                        Ok(())
+                    }
                 },
             )?;
 
diff --git a/crates/cli/src/templates/build.zig b/crates/cli/src/templates/build.zig
index 6b9540c2..c2428289 100644
--- a/crates/cli/src/templates/build.zig
+++ b/crates/cli/src/templates/build.zig
@@ -68,13 +68,16 @@ pub fn build(b: *std.Build) !void {
     });
     tests.root_module.addImport(library_name, module);
 
-    var args = try std.process.argsWithAllocator(b.allocator);
-    defer args.deinit();
-    while (args.next()) |a| {
-        if (std.mem.eql(u8, a, "test")) {
-            const ts_dep = b.lazyDependency("tree_sitter", .{}) orelse continue;
-            tests.root_module.addImport("tree-sitter", ts_dep.module("tree-sitter"));
-            break;
+    // HACK: fetch tree-sitter dependency only when testing this module
+    if (b.pkg_hash.len == 0) {
+        var args = try std.process.argsWithAllocator(b.allocator);
+        defer args.deinit();
+        while (args.next()) |a| {
+            if (std.mem.eql(u8, a, "test")) {
+                const ts_dep = b.lazyDependency("tree_sitter", .{}) orelse continue;
+                tests.root_module.addImport("tree-sitter", ts_dep.module("tree-sitter"));
+                break;
+            }
         }
     }
 

From 9504c247d62d85a2c59fec2f51f1e0b01337f4ff Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sat, 23 Aug 2025 23:53:03 +0300
Subject: [PATCH 326/663] fix(bindings): improve zig dependency fetching logic

Currently, including a tree-sitter parser as a dependency in a zig
project and running `zig build test` on the project will fetch the
zig-tree-sitter dependency declared by the parser. This is a problem
because (a) consumers may not want this dependency for whatever reason
and (b) due to how often Zig breaks everything and how scarcely most
tree-sitter parsers are updated, the zig-tree-sitter version pinned
by the parser module will often be outdated and broken.

The workaround I used was taken from https://ziggit.dev/t/11234

(cherry picked from commit 107bd800b02c8daf1f0f830bbeaf52749a79792c)
---
 cli/src/init.rs             | 28 ++++++++++++++++++++++------
 cli/src/templates/build.zig | 17 ++++++++++-------
 2 files changed, 32 insertions(+), 13 deletions(-)

diff --git a/cli/src/init.rs b/cli/src/init.rs
index 4c51bc4b..a47ef637 100644
--- a/cli/src/init.rs
+++ b/cli/src/init.rs
@@ -406,6 +406,7 @@ pub fn generate_grammar_files(
                 |path| {
                     let contents = fs::read_to_string(path)?;
                     if !contents.contains("bun") {
+                        eprintln!("Replacing index.js");
                         generate_file(path, INDEX_JS_TEMPLATE, language_name, &generate_opts)?;
                     }
                     Ok(())
@@ -732,8 +733,13 @@ pub fn generate_grammar_files(
             allow_update,
             |path| generate_file(path, BUILD_ZIG_TEMPLATE, language_name, &generate_opts),
             |path| {
-                eprintln!("Replacing build.zig");
-                generate_file(path, BUILD_ZIG_TEMPLATE, language_name, &generate_opts)
+                let contents = fs::read_to_string(path)?;
+                if !contents.contains("b.pkg_hash.len") {
+                    eprintln!("Replacing build.zig");
+                    generate_file(path, BUILD_ZIG_TEMPLATE, language_name, &generate_opts)
+                } else {
+                    Ok(())
+                }
             },
         )?;
 
@@ -742,8 +748,13 @@ pub fn generate_grammar_files(
             allow_update,
             |path| generate_file(path, BUILD_ZIG_ZON_TEMPLATE, language_name, &generate_opts),
             |path| {
-                eprintln!("Replacing build.zig.zon");
-                generate_file(path, BUILD_ZIG_ZON_TEMPLATE, language_name, &generate_opts)
+                let contents = fs::read_to_string(path)?;
+                if !contents.contains(".name = .tree_sitter_") {
+                    eprintln!("Replacing build.zig.zon");
+                    generate_file(path, BUILD_ZIG_ZON_TEMPLATE, language_name, &generate_opts)
+                } else {
+                    Ok(())
+                }
             },
         )?;
 
@@ -753,8 +764,13 @@ pub fn generate_grammar_files(
                 allow_update,
                 |path| generate_file(path, ROOT_ZIG_TEMPLATE, language_name, &generate_opts),
                 |path| {
-                    eprintln!("Replacing root.zig");
-                    generate_file(path, ROOT_ZIG_TEMPLATE, language_name, &generate_opts)
+                    let contents = fs::read_to_string(path)?;
+                    if contents.contains("ts.Language") {
+                        eprintln!("Replacing root.zig");
+                        generate_file(path, ROOT_ZIG_TEMPLATE, language_name, &generate_opts)
+                    } else {
+                        Ok(())
+                    }
                 },
             )?;
 
diff --git a/cli/src/templates/build.zig b/cli/src/templates/build.zig
index 6b9540c2..c2428289 100644
--- a/cli/src/templates/build.zig
+++ b/cli/src/templates/build.zig
@@ -68,13 +68,16 @@ pub fn build(b: *std.Build) !void {
     });
     tests.root_module.addImport(library_name, module);
 
-    var args = try std.process.argsWithAllocator(b.allocator);
-    defer args.deinit();
-    while (args.next()) |a| {
-        if (std.mem.eql(u8, a, "test")) {
-            const ts_dep = b.lazyDependency("tree_sitter", .{}) orelse continue;
-            tests.root_module.addImport("tree-sitter", ts_dep.module("tree-sitter"));
-            break;
+    // HACK: fetch tree-sitter dependency only when testing this module
+    if (b.pkg_hash.len == 0) {
+        var args = try std.process.argsWithAllocator(b.allocator);
+        defer args.deinit();
+        while (args.next()) |a| {
+            if (std.mem.eql(u8, a, "test")) {
+                const ts_dep = b.lazyDependency("tree_sitter", .{}) orelse continue;
+                tests.root_module.addImport("tree-sitter", ts_dep.module("tree-sitter"));
+                break;
+            }
         }
     }
 

From d5b8c19d0bc84c71ab0a286c6e11501974d4f79b Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sat, 23 Aug 2025 11:36:49 +0300
Subject: [PATCH 327/663] fix(bindings): add tree-sitter as npm dev dependency

npm is supposed to automatically install peer dependencies since v7
but sometimes it's not doing it and we need this dependency for tests

(cherry picked from commit e67f9f8f7ad432984136a520d5877bfa3ec09aeb)
---
 cli/src/init.rs                | 38 +++++++++++++++++++++++++++-------
 cli/src/templates/package.json |  3 ++-
 2 files changed, 32 insertions(+), 9 deletions(-)

diff --git a/cli/src/init.rs b/cli/src/init.rs
index a47ef637..10ac73a6 100644
--- a/cli/src/init.rs
+++ b/cli/src/init.rs
@@ -302,14 +302,36 @@ pub fn generate_grammar_files(
     };
 
     // Create package.json
-    missing_path(repo_path.join("package.json"), |path| {
-        generate_file(
-            path,
-            PACKAGE_JSON_TEMPLATE,
-            dashed_language_name.as_str(),
-            &generate_opts,
-        )
-    })?;
+    missing_path_else(
+        repo_path.join("package.json"),
+        allow_update,
+        |path| {
+            generate_file(
+                path,
+                PACKAGE_JSON_TEMPLATE,
+                dashed_language_name.as_str(),
+                &generate_opts,
+            )
+        },
+        |path| {
+            let contents = fs::read_to_string(path)?
+                .replace(
+                    r#""node-addon-api": "^8.3.1"#,
+                    r#""node-addon-api": "^8.5.0""#,
+                )
+                .replace(
+                    indoc! {r#"
+                    "prebuildify": "^6.0.1",
+                    "tree-sitter-cli":"#},
+                    indoc! {r#"
+                    "prebuildify": "^6.0.1",
+                    "tree-sitter": "^0.22.4",
+                    "tree-sitter-cli":"#},
+                );
+            write_file(path, contents)?;
+            Ok(())
+        },
+    )?;
 
     // Do not create a grammar.js file in a repo with multiple language configs
     if !tree_sitter_config.has_multiple_language_configs() {
diff --git a/cli/src/templates/package.json b/cli/src/templates/package.json
index aa2adedb..a2ee2e59 100644
--- a/cli/src/templates/package.json
+++ b/cli/src/templates/package.json
@@ -29,11 +29,12 @@
     "*.wasm"
   ],
   "dependencies": {
-    "node-addon-api": "^8.3.1",
+    "node-addon-api": "^8.5.0",
     "node-gyp-build": "^4.8.4"
   },
   "devDependencies": {
     "prebuildify": "^6.0.1",
+    "tree-sitter": "^0.22.4",
     "tree-sitter-cli": "^CLI_VERSION"
   },
   "peerDependencies": {

From 1152bf4c9de862f822a49e30cebeaca26fec8fd1 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Thu, 28 Aug 2025 00:47:16 -0400
Subject: [PATCH 328/663] fix(cli): show rule names for rules with metadata

---
 crates/generate/src/prepare_grammar/extract_tokens.rs | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/crates/generate/src/prepare_grammar/extract_tokens.rs b/crates/generate/src/prepare_grammar/extract_tokens.rs
index 1c96c17d..cb40ce5a 100644
--- a/crates/generate/src/prepare_grammar/extract_tokens.rs
+++ b/crates/generate/src/prepare_grammar/extract_tokens.rs
@@ -213,7 +213,12 @@ pub(super) fn extract_tokens(
             {
                 reserved_words.push(Symbol::terminal(index));
             } else {
-                let token_name = match &reserved_rule {
+                let rule = if let Rule::Metadata { rule, .. } = &reserved_rule {
+                    rule.as_ref()
+                } else {
+                    &reserved_rule
+                };
+                let token_name = match rule {
                     Rule::String(s) => s.clone(),
                     Rule::Pattern(p, _) => p.clone(),
                     _ => "unknown".to_string(),

From 99d8b58868bc62cd3cbd4c9759732021d2995ad6 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Thu, 28 Aug 2025 00:49:34 -0400
Subject: [PATCH 329/663] docs: clarify that a reserved rule must exist in the
 grammar

---
 docs/src/creating-parsers/2-the-grammar-dsl.md | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/docs/src/creating-parsers/2-the-grammar-dsl.md b/docs/src/creating-parsers/2-the-grammar-dsl.md
index 5b3eb940..55c59f68 100644
--- a/docs/src/creating-parsers/2-the-grammar-dsl.md
+++ b/docs/src/creating-parsers/2-the-grammar-dsl.md
@@ -133,12 +133,13 @@ than globally. Can only be used with parse precedence, not lexical precedence.
 [*node types* file][static-node-types].
 
 - **`reserved`** — similar in structure to the main `rules` property, an object of reserved word sets associated with an
-array of reserved rules. The reserved rule in the array must be a terminal token meaning it must be a string, regex, or token,
-or a terminal rule. The *first* reserved word set in the object is the global word set, meaning it applies to every rule
-in every parse state. However, certain keywords are contextual, depending on the rule. For example, in JavaScript, keywords
-are typically not allowed as ordinary variables, however, they *can* be used as a property name. In this situation, the `reserved`
-function would be used, and the word set to pass in would be the name of the word set that is declared in the `reserved`
-object that corresponds to an empty array, signifying *no* keywords are reserved.
+array of reserved rules. The reserved rule in the array must be a terminal token meaning it must be a string, regex, token,
+or terminal rule. The reserved rule must also exist and be used in the grammar, specifying arbitrary tokens will not work.
+The *first* reserved word set in the object is the global word set, meaning it applies to every rule in every parse state.
+However, certain keywords are contextual, depending on the rule. For example, in JavaScript, keywords are typically not allowed
+as ordinary variables, however, they *can* be used as a property name. In this situation, the `reserved` function would be used,
+and the word set to pass in would be the name of the word set that is declared in the `reserved` object that corresponds to an
+empty array, signifying *no* keywords are reserved.
 
 [bison-dprec]: https://www.gnu.org/software/bison/manual/html_node/Generalized-LR-Parsing.html
 [ebnf]: https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form

From 340df02655d0151a62e227624477d211f73147ed Mon Sep 17 00:00:00 2001
From: Will Lillis 
Date: Thu, 28 Aug 2025 13:31:25 -0400
Subject: [PATCH 330/663] docs: clarify definition of newline

---
 docs/src/using-parsers/2-basic-parsing.md | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/docs/src/using-parsers/2-basic-parsing.md b/docs/src/using-parsers/2-basic-parsing.md
index f9b0fb3f..3d03e1c9 100644
--- a/docs/src/using-parsers/2-basic-parsing.md
+++ b/docs/src/using-parsers/2-basic-parsing.md
@@ -86,6 +86,10 @@ TSPoint ts_node_start_point(TSNode);
 TSPoint ts_node_end_point(TSNode);
 ```
 
+```admonish note
+A *newline* is considered to be a single line feed (`\n`) character.
+```
+
 ## Retrieving Nodes
 
 Every tree has a _root node_:

From dab84a1b10e23f507558b4f0e988580a52c40780 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Fri, 22 Aug 2025 12:50:00 +0300
Subject: [PATCH 331/663] build(zig): expose wasmtimeDep function

This allows consumers to reuse the dependency.
---
 build.zig | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/build.zig b/build.zig
index bd5193de..539aca59 100644
--- a/build.zig
+++ b/build.zig
@@ -53,7 +53,8 @@ pub fn build(b: *std.Build) !void {
   b.installArtifact(lib);
 }
 
-fn wasmtimeDep(target: std.Target) []const u8 {
+/// Get the name of the wasmtime dependency for this target.
+pub fn wasmtimeDep(target: std.Target) []const u8 {
   const arch = target.cpu.arch;
   const os = target.os.tag;
   const abi = target.abi;
@@ -95,7 +96,7 @@ fn wasmtimeDep(target: std.Target) []const u8 {
 }
 
 fn findSourceFiles(b: *std.Build) ![]const []const u8 {
-  var sources : std.ArrayList([]const u8) = .empty;
+  var sources: std.ArrayList([]const u8) = .empty;
 
   var dir = try b.build_root.handle.openDir("lib/src", .{ .iterate = true });
   var iter = dir.iterate();

From 2e4b7d26b19cc9b3a72999aa088a012cadb33a9f Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Fri, 22 Aug 2025 13:09:08 +0300
Subject: [PATCH 332/663] build(zig): don't link wasmtime in static build

---
 build.zig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.zig b/build.zig
index 539aca59..ca6f165c 100644
--- a/build.zig
+++ b/build.zig
@@ -44,7 +44,7 @@ pub fn build(b: *std.Build) !void {
       lib.root_module.addCMacro("TREE_SITTER_FEATURE_WASM", "");
       lib.addSystemIncludePath(wasmtime.path("include"));
       lib.addLibraryPath(wasmtime.path("lib"));
-      lib.linkSystemLibrary("wasmtime");
+      if (shared) lib.linkSystemLibrary("wasmtime");
     }
   }
 

From 298b6775c68d9141c2ee4125f8964aef6ca62367 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Tue, 26 Aug 2025 22:49:18 +0300
Subject: [PATCH 333/663] build(zig): use ArrayListUnmanaged

This is supported in 0.14 and 0.15
---
 build.zig     | 8 +++++---
 build.zig.zon | 2 +-
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/build.zig b/build.zig
index ca6f165c..b4adbd3b 100644
--- a/build.zig
+++ b/build.zig
@@ -25,9 +25,11 @@ pub fn build(b: *std.Build) !void {
       .flags = &.{"-std=c11"},
     });
   } else {
+    const files = try findSourceFiles(b);
+    defer b.allocator.free(files);
     lib.addCSourceFiles(.{
       .root = b.path("lib/src"),
-      .files = try findSourceFiles(b),
+      .files = files,
       .flags = &.{"-std=c11"},
     });
   }
@@ -96,7 +98,7 @@ pub fn wasmtimeDep(target: std.Target) []const u8 {
 }
 
 fn findSourceFiles(b: *std.Build) ![]const []const u8 {
-  var sources: std.ArrayList([]const u8) = .empty;
+  var sources: std.ArrayListUnmanaged([]const u8) = .empty;
 
   var dir = try b.build_root.handle.openDir("lib/src", .{ .iterate = true });
   var iter = dir.iterate();
@@ -111,5 +113,5 @@ fn findSourceFiles(b: *std.Build) ![]const []const u8 {
     }
   }
 
-  return sources.items;
+  return sources.toOwnedSlice(b.allocator);
 }
diff --git a/build.zig.zon b/build.zig.zon
index 9b565f52..a2ce02ec 100644
--- a/build.zig.zon
+++ b/build.zig.zon
@@ -2,7 +2,7 @@
   .name = .tree_sitter,
   .fingerprint = 0x841224b447ac0d4f,
   .version = "0.26.0",
-  .minimum_zig_version = "0.15.0",
+  .minimum_zig_version = "0.14.1",
   .paths = .{
     "build.zig",
     "build.zig.zon",

From 66ea1a6dda2523ed660559d574357dc1109493fc Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Tue, 26 Aug 2025 22:50:27 +0300
Subject: [PATCH 334/663] style(zig): reformat files

---
 .editorconfig |   3 +
 build.zig     | 190 +++++++++++++++++++++++++-------------------------
 build.zig.zon | 134 +++++++++++++++++------------------
 3 files changed, 165 insertions(+), 162 deletions(-)

diff --git a/.editorconfig b/.editorconfig
index 53780b34..0b70460a 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -10,6 +10,9 @@ insert_final_newline = true
 [*.rs]
 indent_size = 4
 
+[*.{zig,zon}]
+indent_size = 4
+
 [Makefile]
 indent_style = tab
 indent_size = 8
diff --git a/build.zig b/build.zig
index b4adbd3b..afbf8f64 100644
--- a/build.zig
+++ b/build.zig
@@ -1,117 +1,117 @@
 const std = @import("std");
 
 pub fn build(b: *std.Build) !void {
-  const target = b.standardTargetOptions(.{});
-  const optimize = b.standardOptimizeOption(.{});
+    const target = b.standardTargetOptions(.{});
+    const optimize = b.standardOptimizeOption(.{});
 
-  const wasm = b.option(bool, "enable-wasm", "Enable Wasm support") orelse false;
-  const shared = b.option(bool, "build-shared", "Build a shared library") orelse false;
-  const amalgamated = b.option(bool, "amalgamated", "Build using an amalgamated source") orelse false;
+    const wasm = b.option(bool, "enable-wasm", "Enable Wasm support") orelse false;
+    const shared = b.option(bool, "build-shared", "Build a shared library") orelse false;
+    const amalgamated = b.option(bool, "amalgamated", "Build using an amalgamated source") orelse false;
 
-  const lib: *std.Build.Step.Compile = b.addLibrary(.{
-    .name = "tree-sitter",
-    .linkage = if (shared) .dynamic else .static,
-    .root_module = b.createModule(.{
-      .target = target,
-      .optimize = optimize,
-      .link_libc = true,
-      .pic = if (shared) true else null,
-    }),
-  });
-
-  if (amalgamated) {
-    lib.addCSourceFile(.{
-      .file = b.path("lib/src/lib.c"),
-      .flags = &.{"-std=c11"},
+    const lib: *std.Build.Step.Compile = b.addLibrary(.{
+        .name = "tree-sitter",
+        .linkage = if (shared) .dynamic else .static,
+        .root_module = b.createModule(.{
+            .target = target,
+            .optimize = optimize,
+            .link_libc = true,
+            .pic = if (shared) true else null,
+        }),
     });
-  } else {
-    const files = try findSourceFiles(b);
-    defer b.allocator.free(files);
-    lib.addCSourceFiles(.{
-      .root = b.path("lib/src"),
-      .files = files,
-      .flags = &.{"-std=c11"},
-    });
-  }
 
-  lib.addIncludePath(b.path("lib/include"));
-  lib.addIncludePath(b.path("lib/src"));
-  lib.addIncludePath(b.path("lib/src/wasm"));
-
-  lib.root_module.addCMacro("_POSIX_C_SOURCE", "200112L");
-  lib.root_module.addCMacro("_DEFAULT_SOURCE", "");
-
-  if (wasm) {
-    if (b.lazyDependency(wasmtimeDep(target.result), .{})) |wasmtime| {
-      lib.root_module.addCMacro("TREE_SITTER_FEATURE_WASM", "");
-      lib.addSystemIncludePath(wasmtime.path("include"));
-      lib.addLibraryPath(wasmtime.path("lib"));
-      if (shared) lib.linkSystemLibrary("wasmtime");
+    if (amalgamated) {
+        lib.addCSourceFile(.{
+            .file = b.path("lib/src/lib.c"),
+            .flags = &.{"-std=c11"},
+        });
+    } else {
+        const files = try findSourceFiles(b);
+        defer b.allocator.free(files);
+        lib.addCSourceFiles(.{
+            .root = b.path("lib/src"),
+            .files = files,
+            .flags = &.{"-std=c11"},
+        });
     }
-  }
 
-  lib.installHeadersDirectory(b.path("lib/include"), ".", .{});
+    lib.addIncludePath(b.path("lib/include"));
+    lib.addIncludePath(b.path("lib/src"));
+    lib.addIncludePath(b.path("lib/src/wasm"));
 
-  b.installArtifact(lib);
+    lib.root_module.addCMacro("_POSIX_C_SOURCE", "200112L");
+    lib.root_module.addCMacro("_DEFAULT_SOURCE", "");
+
+    if (wasm) {
+        if (b.lazyDependency(wasmtimeDep(target.result), .{})) |wasmtime| {
+            lib.root_module.addCMacro("TREE_SITTER_FEATURE_WASM", "");
+            lib.addSystemIncludePath(wasmtime.path("include"));
+            lib.addLibraryPath(wasmtime.path("lib"));
+            if (shared) lib.linkSystemLibrary("wasmtime");
+        }
+    }
+
+    lib.installHeadersDirectory(b.path("lib/include"), ".", .{});
+
+    b.installArtifact(lib);
 }
 
 /// Get the name of the wasmtime dependency for this target.
 pub fn wasmtimeDep(target: std.Target) []const u8 {
-  const arch = target.cpu.arch;
-  const os = target.os.tag;
-  const abi = target.abi;
-  return switch (os) {
-    .linux => switch (arch) {
-      .x86_64 => switch (abi) {
-        .gnu => "wasmtime_c_api_x86_64_linux",
-        .musl => "wasmtime_c_api_x86_64_musl",
-        .android => "wasmtime_c_api_x86_64_android",
-        else => null
-      },
-      .aarch64 => switch (abi) {
-        .gnu => "wasmtime_c_api_aarch64_linux",
-        .android => "wasmtime_c_api_aarch64_android",
-        else => null
-      },
-      .s390x => "wasmtime_c_api_s390x_linux",
-      .riscv64 => "wasmtime_c_api_riscv64gc_linux",
-      else => null
-    },
-    .windows => switch (arch) {
-      .x86_64 => switch (abi) {
-        .gnu => "wasmtime_c_api_x86_64_mingw",
-        .msvc => "wasmtime_c_api_x86_64_windows",
-        else => null
-      },
-      else => null
-    },
-    .macos => switch (arch) {
-      .x86_64 => "wasmtime_c_api_x86_64_macos",
-      .aarch64 => "wasmtime_c_api_aarch64_macos",
-      else => null
-    },
-    else => null
-  } orelse std.debug.panic(
-    "Unsupported target for wasmtime: {s}-{s}-{s}",
-    .{ @tagName(arch), @tagName(os), @tagName(abi) }
-  );
+    const arch = target.cpu.arch;
+    const os = target.os.tag;
+    const abi = target.abi;
+    return switch (os) {
+        .linux => switch (arch) {
+            .x86_64 => switch (abi) {
+                .gnu => "wasmtime_c_api_x86_64_linux",
+                .musl => "wasmtime_c_api_x86_64_musl",
+                .android => "wasmtime_c_api_x86_64_android",
+                else => null,
+            },
+            .aarch64 => switch (abi) {
+                .gnu => "wasmtime_c_api_aarch64_linux",
+                .android => "wasmtime_c_api_aarch64_android",
+                else => null,
+            },
+            .s390x => "wasmtime_c_api_s390x_linux",
+            .riscv64 => "wasmtime_c_api_riscv64gc_linux",
+            else => null,
+        },
+        .windows => switch (arch) {
+            .x86_64 => switch (abi) {
+                .gnu => "wasmtime_c_api_x86_64_mingw",
+                .msvc => "wasmtime_c_api_x86_64_windows",
+                else => null,
+            },
+            else => null,
+        },
+        .macos => switch (arch) {
+            .x86_64 => "wasmtime_c_api_x86_64_macos",
+            .aarch64 => "wasmtime_c_api_aarch64_macos",
+            else => null,
+        },
+        else => null,
+    } orelse std.debug.panic(
+        "Unsupported target for wasmtime: {s}-{s}-{s}",
+        .{ @tagName(arch), @tagName(os), @tagName(abi) },
+    );
 }
 
 fn findSourceFiles(b: *std.Build) ![]const []const u8 {
-  var sources: std.ArrayListUnmanaged([]const u8) = .empty;
+    var sources: std.ArrayListUnmanaged([]const u8) = .empty;
 
-  var dir = try b.build_root.handle.openDir("lib/src", .{ .iterate = true });
-  var iter = dir.iterate();
-  defer dir.close();
+    var dir = try b.build_root.handle.openDir("lib/src", .{ .iterate = true });
+    var iter = dir.iterate();
+    defer dir.close();
 
-  while (try iter.next()) |entry| {
-    if (entry.kind != .file) continue;
-    const file = entry.name;
-    const ext = std.fs.path.extension(file);
-    if (std.mem.eql(u8, ext, ".c") and !std.mem.eql(u8, file, "lib.c")) {
-      try sources.append(b.allocator, b.dupe(file));
+    while (try iter.next()) |entry| {
+        if (entry.kind != .file) continue;
+        const file = entry.name;
+        const ext = std.fs.path.extension(file);
+        if (std.mem.eql(u8, ext, ".c") and !std.mem.eql(u8, file, "lib.c")) {
+            try sources.append(b.allocator, b.dupe(file));
+        }
     }
-  }
 
-  return sources.toOwnedSlice(b.allocator);
+    return sources.toOwnedSlice(b.allocator);
 }
diff --git a/build.zig.zon b/build.zig.zon
index a2ce02ec..111054ea 100644
--- a/build.zig.zon
+++ b/build.zig.zon
@@ -1,71 +1,71 @@
 .{
-  .name = .tree_sitter,
-  .fingerprint = 0x841224b447ac0d4f,
-  .version = "0.26.0",
-  .minimum_zig_version = "0.14.1",
-  .paths = .{
-    "build.zig",
-    "build.zig.zon",
-    "lib/src",
-    "lib/include",
-    "README.md",
-    "LICENSE",
-  },
-  .dependencies = .{
-    .wasmtime_c_api_aarch64_android = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-android-c-api.tar.xz",
-      .hash = "N-V-__8AAC3KCQZMd5ea2CkcbjldaVqCT7BT_9_rLMId6V__",
-      .lazy = true,
+    .name = .tree_sitter,
+    .fingerprint = 0x841224b447ac0d4f,
+    .version = "0.26.0",
+    .minimum_zig_version = "0.14.1",
+    .paths = .{
+        "build.zig",
+        "build.zig.zon",
+        "lib/src",
+        "lib/include",
+        "README.md",
+        "LICENSE",
     },
-    .wasmtime_c_api_aarch64_linux = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-linux-c-api.tar.xz",
-      .hash = "N-V-__8AAGUY3gU6jj2CNJAYb7HiMNVPV1FIcTCI6RSSYwXu",
-      .lazy = true,
+    .dependencies = .{
+        .wasmtime_c_api_aarch64_android = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-android-c-api.tar.xz",
+            .hash = "N-V-__8AAC3KCQZMd5ea2CkcbjldaVqCT7BT_9_rLMId6V__",
+            .lazy = true,
+        },
+        .wasmtime_c_api_aarch64_linux = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-linux-c-api.tar.xz",
+            .hash = "N-V-__8AAGUY3gU6jj2CNJAYb7HiMNVPV1FIcTCI6RSSYwXu",
+            .lazy = true,
+        },
+        .wasmtime_c_api_aarch64_macos = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-macos-c-api.tar.xz",
+            .hash = "N-V-__8AAM1GMARD6LGQebhVsSZ0uePUoo3Fw5nEO2L764vf",
+            .lazy = true,
+        },
+        .wasmtime_c_api_riscv64gc_linux = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-riscv64gc-linux-c-api.tar.xz",
+            .hash = "N-V-__8AAN2cuQadBwMc8zJxv0sMY99Ae1Nc1dZcZAK9b4DZ",
+            .lazy = true,
+        },
+        .wasmtime_c_api_s390x_linux = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-s390x-linux-c-api.tar.xz",
+            .hash = "N-V-__8AAPevngYz99mwT0KQY9my2ax1p6APzgLEJeV4II9U",
+            .lazy = true,
+        },
+        .wasmtime_c_api_x86_64_android = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-android-c-api.tar.xz",
+            .hash = "N-V-__8AABHIEgaTyzPfjgnnCy0dwJiXoDiJFblCkYOJsQvy",
+            .lazy = true,
+        },
+        .wasmtime_c_api_x86_64_linux = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-linux-c-api.tar.xz",
+            .hash = "N-V-__8AALUN5AWSEDRulL9u-OJJ-l0_GoT5UFDtGWZayEIq",
+            .lazy = true,
+        },
+        .wasmtime_c_api_x86_64_macos = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-macos-c-api.tar.xz",
+            .hash = "N-V-__8AANUeXwSPh13TqJCSSFdi87GEcHs8zK6FqE4v_TjB",
+            .lazy = true,
+        },
+        .wasmtime_c_api_x86_64_mingw = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-mingw-c-api.zip",
+            .hash = "N-V-__8AALundgW-p1ffOnd7bsYyL8SY5OziDUZu7cXio2EL",
+            .lazy = true,
+        },
+        .wasmtime_c_api_x86_64_musl = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-musl-c-api.tar.xz",
+            .hash = "N-V-__8AALMZ5wXJWW5qY-3MMjTAYR0MusckvzCsmg-69ALH",
+            .lazy = true,
+        },
+        .wasmtime_c_api_x86_64_windows = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-windows-c-api.zip",
+            .hash = "N-V-__8AAG-uVQVEDMsB1ymJzxpHcoiXo1_I3TFnPM5Zjy1i",
+            .lazy = true,
+        },
     },
-    .wasmtime_c_api_aarch64_macos = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-macos-c-api.tar.xz",
-      .hash = "N-V-__8AAM1GMARD6LGQebhVsSZ0uePUoo3Fw5nEO2L764vf",
-      .lazy = true,
-    },
-    .wasmtime_c_api_riscv64gc_linux = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-riscv64gc-linux-c-api.tar.xz",
-      .hash = "N-V-__8AAN2cuQadBwMc8zJxv0sMY99Ae1Nc1dZcZAK9b4DZ",
-      .lazy = true,
-    },
-    .wasmtime_c_api_s390x_linux = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-s390x-linux-c-api.tar.xz",
-      .hash = "N-V-__8AAPevngYz99mwT0KQY9my2ax1p6APzgLEJeV4II9U",
-      .lazy = true,
-    },
-    .wasmtime_c_api_x86_64_android = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-android-c-api.tar.xz",
-      .hash = "N-V-__8AABHIEgaTyzPfjgnnCy0dwJiXoDiJFblCkYOJsQvy",
-      .lazy = true,
-    },
-    .wasmtime_c_api_x86_64_linux = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-linux-c-api.tar.xz",
-      .hash = "N-V-__8AALUN5AWSEDRulL9u-OJJ-l0_GoT5UFDtGWZayEIq",
-      .lazy = true,
-    },
-    .wasmtime_c_api_x86_64_macos = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-macos-c-api.tar.xz",
-      .hash = "N-V-__8AANUeXwSPh13TqJCSSFdi87GEcHs8zK6FqE4v_TjB",
-      .lazy = true,
-    },
-    .wasmtime_c_api_x86_64_mingw = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-mingw-c-api.zip",
-      .hash = "N-V-__8AALundgW-p1ffOnd7bsYyL8SY5OziDUZu7cXio2EL",
-      .lazy = true,
-    },
-    .wasmtime_c_api_x86_64_musl = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-musl-c-api.tar.xz",
-      .hash = "N-V-__8AALMZ5wXJWW5qY-3MMjTAYR0MusckvzCsmg-69ALH",
-      .lazy = true,
-    },
-    .wasmtime_c_api_x86_64_windows = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-windows-c-api.zip",
-      .hash = "N-V-__8AAG-uVQVEDMsB1ymJzxpHcoiXo1_I3TFnPM5Zjy1i",
-      .lazy = true,
-    },
-  }
 }

From f764f485d28ecd73dc9768e2478ec8c03bf483fb Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Fri, 22 Aug 2025 12:50:00 +0300
Subject: [PATCH 335/663] build(zig): expose wasmtimeDep function

This allows consumers to reuse the dependency.

(cherry picked from commit dab84a1b10e23f507558b4f0e988580a52c40780)
---
 build.zig | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/build.zig b/build.zig
index 4062e069..4f1be982 100644
--- a/build.zig
+++ b/build.zig
@@ -53,7 +53,8 @@ pub fn build(b: *std.Build) !void {
   b.installArtifact(lib);
 }
 
-fn wasmtimeDep(target: std.Target) []const u8 {
+/// Get the name of the wasmtime dependency for this target.
+pub fn wasmtimeDep(target: std.Target) []const u8 {
   const arch = target.cpu.arch;
   const os = target.os.tag;
   const abi = target.abi;

From 910b3c738c86db3b52d145d04f317312f8914113 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Fri, 22 Aug 2025 13:09:08 +0300
Subject: [PATCH 336/663] build(zig): don't link wasmtime in static build

(cherry picked from commit 2e4b7d26b19cc9b3a72999aa088a012cadb33a9f)
---
 build.zig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.zig b/build.zig
index 4f1be982..b47860be 100644
--- a/build.zig
+++ b/build.zig
@@ -44,7 +44,7 @@ pub fn build(b: *std.Build) !void {
       lib.root_module.addCMacro("TREE_SITTER_FEATURE_WASM", "");
       lib.addSystemIncludePath(wasmtime.path("include"));
       lib.addLibraryPath(wasmtime.path("lib"));
-      lib.linkSystemLibrary("wasmtime");
+      if (shared) lib.linkSystemLibrary("wasmtime");
     }
   }
 

From dc0b5530b3057cc24b81020b0bf42dab10edb858 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Tue, 26 Aug 2025 22:49:18 +0300
Subject: [PATCH 337/663] build(zig): use ArrayListUnmanaged

This is supported in 0.14 and 0.15

(cherry picked from commit 298b6775c68d9141c2ee4125f8964aef6ca62367)
---
 build.zig     | 10 ++++++----
 build.zig.zon |  1 +
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/build.zig b/build.zig
index b47860be..b4adbd3b 100644
--- a/build.zig
+++ b/build.zig
@@ -25,9 +25,11 @@ pub fn build(b: *std.Build) !void {
       .flags = &.{"-std=c11"},
     });
   } else {
+    const files = try findSourceFiles(b);
+    defer b.allocator.free(files);
     lib.addCSourceFiles(.{
       .root = b.path("lib/src"),
-      .files = try findSourceFiles(b),
+      .files = files,
       .flags = &.{"-std=c11"},
     });
   }
@@ -96,7 +98,7 @@ pub fn wasmtimeDep(target: std.Target) []const u8 {
 }
 
 fn findSourceFiles(b: *std.Build) ![]const []const u8 {
-  var sources = std.ArrayList([]const u8).init(b.allocator);
+  var sources: std.ArrayListUnmanaged([]const u8) = .empty;
 
   var dir = try b.build_root.handle.openDir("lib/src", .{ .iterate = true });
   var iter = dir.iterate();
@@ -107,9 +109,9 @@ fn findSourceFiles(b: *std.Build) ![]const []const u8 {
     const file = entry.name;
     const ext = std.fs.path.extension(file);
     if (std.mem.eql(u8, ext, ".c") and !std.mem.eql(u8, file, "lib.c")) {
-      try sources.append(b.dupe(file));
+      try sources.append(b.allocator, b.dupe(file));
     }
   }
 
-  return sources.items;
+  return sources.toOwnedSlice(b.allocator);
 }
diff --git a/build.zig.zon b/build.zig.zon
index 0e539786..7635a348 100644
--- a/build.zig.zon
+++ b/build.zig.zon
@@ -2,6 +2,7 @@
   .name = .tree_sitter,
   .fingerprint = 0x841224b447ac0d4f,
   .version = "0.25.8",
+  .minimum_zig_version = "0.14.1",
   .paths = .{
     "build.zig",
     "build.zig.zon",

From 1083795af6e3709f748093e29a366630e6299494 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Tue, 26 Aug 2025 22:50:27 +0300
Subject: [PATCH 338/663] style(zig): reformat files

(cherry picked from commit 66ea1a6dda2523ed660559d574357dc1109493fc)
---
 .editorconfig |   3 +
 build.zig     | 190 +++++++++++++++++++++++++-------------------------
 build.zig.zon | 134 +++++++++++++++++------------------
 3 files changed, 165 insertions(+), 162 deletions(-)

diff --git a/.editorconfig b/.editorconfig
index 53780b34..0b70460a 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -10,6 +10,9 @@ insert_final_newline = true
 [*.rs]
 indent_size = 4
 
+[*.{zig,zon}]
+indent_size = 4
+
 [Makefile]
 indent_style = tab
 indent_size = 8
diff --git a/build.zig b/build.zig
index b4adbd3b..afbf8f64 100644
--- a/build.zig
+++ b/build.zig
@@ -1,117 +1,117 @@
 const std = @import("std");
 
 pub fn build(b: *std.Build) !void {
-  const target = b.standardTargetOptions(.{});
-  const optimize = b.standardOptimizeOption(.{});
+    const target = b.standardTargetOptions(.{});
+    const optimize = b.standardOptimizeOption(.{});
 
-  const wasm = b.option(bool, "enable-wasm", "Enable Wasm support") orelse false;
-  const shared = b.option(bool, "build-shared", "Build a shared library") orelse false;
-  const amalgamated = b.option(bool, "amalgamated", "Build using an amalgamated source") orelse false;
+    const wasm = b.option(bool, "enable-wasm", "Enable Wasm support") orelse false;
+    const shared = b.option(bool, "build-shared", "Build a shared library") orelse false;
+    const amalgamated = b.option(bool, "amalgamated", "Build using an amalgamated source") orelse false;
 
-  const lib: *std.Build.Step.Compile = b.addLibrary(.{
-    .name = "tree-sitter",
-    .linkage = if (shared) .dynamic else .static,
-    .root_module = b.createModule(.{
-      .target = target,
-      .optimize = optimize,
-      .link_libc = true,
-      .pic = if (shared) true else null,
-    }),
-  });
-
-  if (amalgamated) {
-    lib.addCSourceFile(.{
-      .file = b.path("lib/src/lib.c"),
-      .flags = &.{"-std=c11"},
+    const lib: *std.Build.Step.Compile = b.addLibrary(.{
+        .name = "tree-sitter",
+        .linkage = if (shared) .dynamic else .static,
+        .root_module = b.createModule(.{
+            .target = target,
+            .optimize = optimize,
+            .link_libc = true,
+            .pic = if (shared) true else null,
+        }),
     });
-  } else {
-    const files = try findSourceFiles(b);
-    defer b.allocator.free(files);
-    lib.addCSourceFiles(.{
-      .root = b.path("lib/src"),
-      .files = files,
-      .flags = &.{"-std=c11"},
-    });
-  }
 
-  lib.addIncludePath(b.path("lib/include"));
-  lib.addIncludePath(b.path("lib/src"));
-  lib.addIncludePath(b.path("lib/src/wasm"));
-
-  lib.root_module.addCMacro("_POSIX_C_SOURCE", "200112L");
-  lib.root_module.addCMacro("_DEFAULT_SOURCE", "");
-
-  if (wasm) {
-    if (b.lazyDependency(wasmtimeDep(target.result), .{})) |wasmtime| {
-      lib.root_module.addCMacro("TREE_SITTER_FEATURE_WASM", "");
-      lib.addSystemIncludePath(wasmtime.path("include"));
-      lib.addLibraryPath(wasmtime.path("lib"));
-      if (shared) lib.linkSystemLibrary("wasmtime");
+    if (amalgamated) {
+        lib.addCSourceFile(.{
+            .file = b.path("lib/src/lib.c"),
+            .flags = &.{"-std=c11"},
+        });
+    } else {
+        const files = try findSourceFiles(b);
+        defer b.allocator.free(files);
+        lib.addCSourceFiles(.{
+            .root = b.path("lib/src"),
+            .files = files,
+            .flags = &.{"-std=c11"},
+        });
     }
-  }
 
-  lib.installHeadersDirectory(b.path("lib/include"), ".", .{});
+    lib.addIncludePath(b.path("lib/include"));
+    lib.addIncludePath(b.path("lib/src"));
+    lib.addIncludePath(b.path("lib/src/wasm"));
 
-  b.installArtifact(lib);
+    lib.root_module.addCMacro("_POSIX_C_SOURCE", "200112L");
+    lib.root_module.addCMacro("_DEFAULT_SOURCE", "");
+
+    if (wasm) {
+        if (b.lazyDependency(wasmtimeDep(target.result), .{})) |wasmtime| {
+            lib.root_module.addCMacro("TREE_SITTER_FEATURE_WASM", "");
+            lib.addSystemIncludePath(wasmtime.path("include"));
+            lib.addLibraryPath(wasmtime.path("lib"));
+            if (shared) lib.linkSystemLibrary("wasmtime");
+        }
+    }
+
+    lib.installHeadersDirectory(b.path("lib/include"), ".", .{});
+
+    b.installArtifact(lib);
 }
 
 /// Get the name of the wasmtime dependency for this target.
 pub fn wasmtimeDep(target: std.Target) []const u8 {
-  const arch = target.cpu.arch;
-  const os = target.os.tag;
-  const abi = target.abi;
-  return switch (os) {
-    .linux => switch (arch) {
-      .x86_64 => switch (abi) {
-        .gnu => "wasmtime_c_api_x86_64_linux",
-        .musl => "wasmtime_c_api_x86_64_musl",
-        .android => "wasmtime_c_api_x86_64_android",
-        else => null
-      },
-      .aarch64 => switch (abi) {
-        .gnu => "wasmtime_c_api_aarch64_linux",
-        .android => "wasmtime_c_api_aarch64_android",
-        else => null
-      },
-      .s390x => "wasmtime_c_api_s390x_linux",
-      .riscv64 => "wasmtime_c_api_riscv64gc_linux",
-      else => null
-    },
-    .windows => switch (arch) {
-      .x86_64 => switch (abi) {
-        .gnu => "wasmtime_c_api_x86_64_mingw",
-        .msvc => "wasmtime_c_api_x86_64_windows",
-        else => null
-      },
-      else => null
-    },
-    .macos => switch (arch) {
-      .x86_64 => "wasmtime_c_api_x86_64_macos",
-      .aarch64 => "wasmtime_c_api_aarch64_macos",
-      else => null
-    },
-    else => null
-  } orelse std.debug.panic(
-    "Unsupported target for wasmtime: {s}-{s}-{s}",
-    .{ @tagName(arch), @tagName(os), @tagName(abi) }
-  );
+    const arch = target.cpu.arch;
+    const os = target.os.tag;
+    const abi = target.abi;
+    return switch (os) {
+        .linux => switch (arch) {
+            .x86_64 => switch (abi) {
+                .gnu => "wasmtime_c_api_x86_64_linux",
+                .musl => "wasmtime_c_api_x86_64_musl",
+                .android => "wasmtime_c_api_x86_64_android",
+                else => null,
+            },
+            .aarch64 => switch (abi) {
+                .gnu => "wasmtime_c_api_aarch64_linux",
+                .android => "wasmtime_c_api_aarch64_android",
+                else => null,
+            },
+            .s390x => "wasmtime_c_api_s390x_linux",
+            .riscv64 => "wasmtime_c_api_riscv64gc_linux",
+            else => null,
+        },
+        .windows => switch (arch) {
+            .x86_64 => switch (abi) {
+                .gnu => "wasmtime_c_api_x86_64_mingw",
+                .msvc => "wasmtime_c_api_x86_64_windows",
+                else => null,
+            },
+            else => null,
+        },
+        .macos => switch (arch) {
+            .x86_64 => "wasmtime_c_api_x86_64_macos",
+            .aarch64 => "wasmtime_c_api_aarch64_macos",
+            else => null,
+        },
+        else => null,
+    } orelse std.debug.panic(
+        "Unsupported target for wasmtime: {s}-{s}-{s}",
+        .{ @tagName(arch), @tagName(os), @tagName(abi) },
+    );
 }
 
 fn findSourceFiles(b: *std.Build) ![]const []const u8 {
-  var sources: std.ArrayListUnmanaged([]const u8) = .empty;
+    var sources: std.ArrayListUnmanaged([]const u8) = .empty;
 
-  var dir = try b.build_root.handle.openDir("lib/src", .{ .iterate = true });
-  var iter = dir.iterate();
-  defer dir.close();
+    var dir = try b.build_root.handle.openDir("lib/src", .{ .iterate = true });
+    var iter = dir.iterate();
+    defer dir.close();
 
-  while (try iter.next()) |entry| {
-    if (entry.kind != .file) continue;
-    const file = entry.name;
-    const ext = std.fs.path.extension(file);
-    if (std.mem.eql(u8, ext, ".c") and !std.mem.eql(u8, file, "lib.c")) {
-      try sources.append(b.allocator, b.dupe(file));
+    while (try iter.next()) |entry| {
+        if (entry.kind != .file) continue;
+        const file = entry.name;
+        const ext = std.fs.path.extension(file);
+        if (std.mem.eql(u8, ext, ".c") and !std.mem.eql(u8, file, "lib.c")) {
+            try sources.append(b.allocator, b.dupe(file));
+        }
     }
-  }
 
-  return sources.toOwnedSlice(b.allocator);
+    return sources.toOwnedSlice(b.allocator);
 }
diff --git a/build.zig.zon b/build.zig.zon
index 7635a348..75984ea6 100644
--- a/build.zig.zon
+++ b/build.zig.zon
@@ -1,71 +1,71 @@
 .{
-  .name = .tree_sitter,
-  .fingerprint = 0x841224b447ac0d4f,
-  .version = "0.25.8",
-  .minimum_zig_version = "0.14.1",
-  .paths = .{
-    "build.zig",
-    "build.zig.zon",
-    "lib/src",
-    "lib/include",
-    "README.md",
-    "LICENSE",
-  },
-  .dependencies = .{
-    .wasmtime_c_api_aarch64_android = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-android-c-api.tar.xz",
-      .hash = "N-V-__8AAC3KCQZMd5ea2CkcbjldaVqCT7BT_9_rLMId6V__",
-      .lazy = true,
+    .name = .tree_sitter,
+    .fingerprint = 0x841224b447ac0d4f,
+    .version = "0.25.8",
+    .minimum_zig_version = "0.14.1",
+    .paths = .{
+        "build.zig",
+        "build.zig.zon",
+        "lib/src",
+        "lib/include",
+        "README.md",
+        "LICENSE",
     },
-    .wasmtime_c_api_aarch64_linux = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-linux-c-api.tar.xz",
-      .hash = "N-V-__8AAGUY3gU6jj2CNJAYb7HiMNVPV1FIcTCI6RSSYwXu",
-      .lazy = true,
+    .dependencies = .{
+        .wasmtime_c_api_aarch64_android = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-android-c-api.tar.xz",
+            .hash = "N-V-__8AAC3KCQZMd5ea2CkcbjldaVqCT7BT_9_rLMId6V__",
+            .lazy = true,
+        },
+        .wasmtime_c_api_aarch64_linux = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-linux-c-api.tar.xz",
+            .hash = "N-V-__8AAGUY3gU6jj2CNJAYb7HiMNVPV1FIcTCI6RSSYwXu",
+            .lazy = true,
+        },
+        .wasmtime_c_api_aarch64_macos = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-macos-c-api.tar.xz",
+            .hash = "N-V-__8AAM1GMARD6LGQebhVsSZ0uePUoo3Fw5nEO2L764vf",
+            .lazy = true,
+        },
+        .wasmtime_c_api_riscv64gc_linux = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-riscv64gc-linux-c-api.tar.xz",
+            .hash = "N-V-__8AAN2cuQadBwMc8zJxv0sMY99Ae1Nc1dZcZAK9b4DZ",
+            .lazy = true,
+        },
+        .wasmtime_c_api_s390x_linux = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-s390x-linux-c-api.tar.xz",
+            .hash = "N-V-__8AAPevngYz99mwT0KQY9my2ax1p6APzgLEJeV4II9U",
+            .lazy = true,
+        },
+        .wasmtime_c_api_x86_64_android = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-android-c-api.tar.xz",
+            .hash = "N-V-__8AABHIEgaTyzPfjgnnCy0dwJiXoDiJFblCkYOJsQvy",
+            .lazy = true,
+        },
+        .wasmtime_c_api_x86_64_linux = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-linux-c-api.tar.xz",
+            .hash = "N-V-__8AALUN5AWSEDRulL9u-OJJ-l0_GoT5UFDtGWZayEIq",
+            .lazy = true,
+        },
+        .wasmtime_c_api_x86_64_macos = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-macos-c-api.tar.xz",
+            .hash = "N-V-__8AANUeXwSPh13TqJCSSFdi87GEcHs8zK6FqE4v_TjB",
+            .lazy = true,
+        },
+        .wasmtime_c_api_x86_64_mingw = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-mingw-c-api.zip",
+            .hash = "N-V-__8AALundgW-p1ffOnd7bsYyL8SY5OziDUZu7cXio2EL",
+            .lazy = true,
+        },
+        .wasmtime_c_api_x86_64_musl = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-musl-c-api.tar.xz",
+            .hash = "N-V-__8AALMZ5wXJWW5qY-3MMjTAYR0MusckvzCsmg-69ALH",
+            .lazy = true,
+        },
+        .wasmtime_c_api_x86_64_windows = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-windows-c-api.zip",
+            .hash = "N-V-__8AAG-uVQVEDMsB1ymJzxpHcoiXo1_I3TFnPM5Zjy1i",
+            .lazy = true,
+        },
     },
-    .wasmtime_c_api_aarch64_macos = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-macos-c-api.tar.xz",
-      .hash = "N-V-__8AAM1GMARD6LGQebhVsSZ0uePUoo3Fw5nEO2L764vf",
-      .lazy = true,
-    },
-    .wasmtime_c_api_riscv64gc_linux = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-riscv64gc-linux-c-api.tar.xz",
-      .hash = "N-V-__8AAN2cuQadBwMc8zJxv0sMY99Ae1Nc1dZcZAK9b4DZ",
-      .lazy = true,
-    },
-    .wasmtime_c_api_s390x_linux = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-s390x-linux-c-api.tar.xz",
-      .hash = "N-V-__8AAPevngYz99mwT0KQY9my2ax1p6APzgLEJeV4II9U",
-      .lazy = true,
-    },
-    .wasmtime_c_api_x86_64_android = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-android-c-api.tar.xz",
-      .hash = "N-V-__8AABHIEgaTyzPfjgnnCy0dwJiXoDiJFblCkYOJsQvy",
-      .lazy = true,
-    },
-    .wasmtime_c_api_x86_64_linux = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-linux-c-api.tar.xz",
-      .hash = "N-V-__8AALUN5AWSEDRulL9u-OJJ-l0_GoT5UFDtGWZayEIq",
-      .lazy = true,
-    },
-    .wasmtime_c_api_x86_64_macos = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-macos-c-api.tar.xz",
-      .hash = "N-V-__8AANUeXwSPh13TqJCSSFdi87GEcHs8zK6FqE4v_TjB",
-      .lazy = true,
-    },
-    .wasmtime_c_api_x86_64_mingw = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-mingw-c-api.zip",
-      .hash = "N-V-__8AALundgW-p1ffOnd7bsYyL8SY5OziDUZu7cXio2EL",
-      .lazy = true,
-    },
-    .wasmtime_c_api_x86_64_musl = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-musl-c-api.tar.xz",
-      .hash = "N-V-__8AALMZ5wXJWW5qY-3MMjTAYR0MusckvzCsmg-69ALH",
-      .lazy = true,
-    },
-    .wasmtime_c_api_x86_64_windows = .{
-      .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-windows-c-api.zip",
-      .hash = "N-V-__8AAG-uVQVEDMsB1ymJzxpHcoiXo1_I3TFnPM5Zjy1i",
-      .lazy = true,
-    },
-  }
 }

From b7f36a13bad7c9b672022d21d741e034096dda4d Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Thu, 28 Aug 2025 14:47:20 -0400
Subject: [PATCH 339/663] fix(lib): check if an `ERROR` node is named before
 assuming it's the builtin error node

---
 crates/cli/src/tests/query_test.rs            | 32 ++++++++++++++++++-
 lib/src/language.c                            |  2 +-
 .../test_grammars/anonymous_error/corpus.txt  |  9 ++++++
 .../test_grammars/anonymous_error/grammar.js  |  6 ++++
 4 files changed, 47 insertions(+), 2 deletions(-)
 create mode 100644 test/fixtures/test_grammars/anonymous_error/corpus.txt
 create mode 100644 test/fixtures/test_grammars/anonymous_error/grammar.js

diff --git a/crates/cli/src/tests/query_test.rs b/crates/cli/src/tests/query_test.rs
index 02e7c90c..c2d14392 100644
--- a/crates/cli/src/tests/query_test.rs
+++ b/crates/cli/src/tests/query_test.rs
@@ -17,7 +17,10 @@ use super::helpers::{
 };
 use crate::tests::{
     generate_parser,
-    helpers::query_helpers::{collect_captures, collect_matches},
+    helpers::{
+        fixtures::get_test_fixture_language,
+        query_helpers::{collect_captures, collect_matches},
+    },
     ITERATION_COUNT,
 };
 
@@ -5708,3 +5711,30 @@ fn test_query_with_predicate_causing_oob_access() {
      (#set! injection.language \"regex\"))";
     Query::new(&language, query).unwrap();
 }
+
+#[test]
+fn test_query_with_anonymous_error_node() {
+    let language = get_test_fixture_language("anonymous_error");
+    let mut parser = Parser::new();
+    parser.set_language(&language).unwrap();
+
+    let source = "ERROR";
+
+    let tree = parser.parse(source, None).unwrap();
+    let query = Query::new(
+        &language,
+        r#"
+          "ERROR" @error
+          (document "ERROR" @error)
+        "#,
+    )
+    .unwrap();
+    let mut cursor = QueryCursor::new();
+    let matches = cursor.matches(&query, tree.root_node(), source.as_bytes());
+    let matches = collect_matches(matches, &query, source);
+
+    assert_eq!(
+        matches,
+        vec![(1, vec![("error", "ERROR")]), (0, vec![("error", "ERROR")])]
+    );
+}
diff --git a/lib/src/language.c b/lib/src/language.c
index b341a670..2dce6998 100644
--- a/lib/src/language.c
+++ b/lib/src/language.c
@@ -186,7 +186,7 @@ TSSymbol ts_language_symbol_for_name(
   uint32_t length,
   bool is_named
 ) {
-  if (!strncmp(string, "ERROR", length)) return ts_builtin_sym_error;
+  if (is_named && !strncmp(string, "ERROR", length)) return ts_builtin_sym_error;
   uint16_t count = (uint16_t)ts_language_symbol_count(self);
   for (TSSymbol i = 0; i < count; i++) {
     TSSymbolMetadata metadata = ts_language_symbol_metadata(self, i);
diff --git a/test/fixtures/test_grammars/anonymous_error/corpus.txt b/test/fixtures/test_grammars/anonymous_error/corpus.txt
new file mode 100644
index 00000000..f1dd3d34
--- /dev/null
+++ b/test/fixtures/test_grammars/anonymous_error/corpus.txt
@@ -0,0 +1,9 @@
+======================
+A simple error literal
+======================
+
+ERROR
+
+---
+
+(document)
diff --git a/test/fixtures/test_grammars/anonymous_error/grammar.js b/test/fixtures/test_grammars/anonymous_error/grammar.js
new file mode 100644
index 00000000..c06d1bd2
--- /dev/null
+++ b/test/fixtures/test_grammars/anonymous_error/grammar.js
@@ -0,0 +1,6 @@
+module.exports = grammar({
+  name: 'anonymous_error',
+  rules: {
+    document: $ => repeat(choice('ok', 'ERROR')),
+  }
+});

From 9fdf7213d4f9431dd652d2f7c217f49c76e3ea58 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 26 Aug 2025 14:45:17 +0000
Subject: [PATCH 340/663] ci: bump actions/upload-pages-artifact from 3 to 4 in
 the actions group

Bumps the actions group with 1 update: [actions/upload-pages-artifact](https://github.com/actions/upload-pages-artifact).


Updates `actions/upload-pages-artifact` from 3 to 4
- [Release notes](https://github.com/actions/upload-pages-artifact/releases)
- [Commits](https://github.com/actions/upload-pages-artifact/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/upload-pages-artifact
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
...

Signed-off-by: dependabot[bot] 
---
 .github/workflows/docs.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 20031fd2..30fe914e 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -40,7 +40,7 @@ jobs:
         uses: actions/configure-pages@v5
 
       - name: Upload artifact
-        uses: actions/upload-pages-artifact@v3
+        uses: actions/upload-pages-artifact@v4
         with:
           path: docs/book
 

From 22fa144016eb43e63f0da570a64e5644d06c6f4d Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Thu, 28 Aug 2025 14:47:20 -0400
Subject: [PATCH 341/663] fix(lib): check if an `ERROR` node is named before
 assuming it's the builtin error node

(cherry picked from commit b7f36a13bad7c9b672022d21d741e034096dda4d)
---
 cli/src/tests/query_test.rs                   | 32 ++++++++++++++++++-
 lib/src/language.c                            |  2 +-
 .../test_grammars/anonymous_error/corpus.txt  |  9 ++++++
 .../test_grammars/anonymous_error/grammar.js  |  6 ++++
 4 files changed, 47 insertions(+), 2 deletions(-)
 create mode 100644 test/fixtures/test_grammars/anonymous_error/corpus.txt
 create mode 100644 test/fixtures/test_grammars/anonymous_error/grammar.js

diff --git a/cli/src/tests/query_test.rs b/cli/src/tests/query_test.rs
index 09aac8a7..e769cf89 100644
--- a/cli/src/tests/query_test.rs
+++ b/cli/src/tests/query_test.rs
@@ -17,7 +17,10 @@ use super::helpers::{
 };
 use crate::tests::{
     generate_parser,
-    helpers::query_helpers::{collect_captures, collect_matches},
+    helpers::{
+        fixtures::get_test_fixture_language,
+        query_helpers::{collect_captures, collect_matches},
+    },
     ITERATION_COUNT,
 };
 
@@ -5697,3 +5700,30 @@ fn test_query_with_predicate_causing_oob_access() {
      (#set! injection.language \"regex\"))";
     Query::new(&language, query).unwrap();
 }
+
+#[test]
+fn test_query_with_anonymous_error_node() {
+    let language = get_test_fixture_language("anonymous_error");
+    let mut parser = Parser::new();
+    parser.set_language(&language).unwrap();
+
+    let source = "ERROR";
+
+    let tree = parser.parse(source, None).unwrap();
+    let query = Query::new(
+        &language,
+        r#"
+          "ERROR" @error
+          (document "ERROR" @error)
+        "#,
+    )
+    .unwrap();
+    let mut cursor = QueryCursor::new();
+    let matches = cursor.matches(&query, tree.root_node(), source.as_bytes());
+    let matches = collect_matches(matches, &query, source);
+
+    assert_eq!(
+        matches,
+        vec![(1, vec![("error", "ERROR")]), (0, vec![("error", "ERROR")])]
+    );
+}
diff --git a/lib/src/language.c b/lib/src/language.c
index b341a670..2dce6998 100644
--- a/lib/src/language.c
+++ b/lib/src/language.c
@@ -186,7 +186,7 @@ TSSymbol ts_language_symbol_for_name(
   uint32_t length,
   bool is_named
 ) {
-  if (!strncmp(string, "ERROR", length)) return ts_builtin_sym_error;
+  if (is_named && !strncmp(string, "ERROR", length)) return ts_builtin_sym_error;
   uint16_t count = (uint16_t)ts_language_symbol_count(self);
   for (TSSymbol i = 0; i < count; i++) {
     TSSymbolMetadata metadata = ts_language_symbol_metadata(self, i);
diff --git a/test/fixtures/test_grammars/anonymous_error/corpus.txt b/test/fixtures/test_grammars/anonymous_error/corpus.txt
new file mode 100644
index 00000000..f1dd3d34
--- /dev/null
+++ b/test/fixtures/test_grammars/anonymous_error/corpus.txt
@@ -0,0 +1,9 @@
+======================
+A simple error literal
+======================
+
+ERROR
+
+---
+
+(document)
diff --git a/test/fixtures/test_grammars/anonymous_error/grammar.js b/test/fixtures/test_grammars/anonymous_error/grammar.js
new file mode 100644
index 00000000..c06d1bd2
--- /dev/null
+++ b/test/fixtures/test_grammars/anonymous_error/grammar.js
@@ -0,0 +1,6 @@
+module.exports = grammar({
+  name: 'anonymous_error',
+  rules: {
+    document: $ => repeat(choice('ok', 'ERROR')),
+  }
+});

From 8387101a6183e63b35ac034443a1d2c042dc70e6 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Thu, 28 Aug 2025 17:10:58 -0400
Subject: [PATCH 342/663] fix(lib): allow error nodes to match when they are
 child nodes

---
 crates/cli/src/tests/query_test.rs | 22 ++++++++++++++++++++++
 lib/src/query.c                    |  7 ++++++-
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/crates/cli/src/tests/query_test.rs b/crates/cli/src/tests/query_test.rs
index c2d14392..ab025e04 100644
--- a/crates/cli/src/tests/query_test.rs
+++ b/crates/cli/src/tests/query_test.rs
@@ -5738,3 +5738,25 @@ fn test_query_with_anonymous_error_node() {
         vec![(1, vec![("error", "ERROR")]), (0, vec![("error", "ERROR")])]
     );
 }
+
+#[test]
+fn test_query_allows_error_nodes_with_children() {
+    allocations::record(|| {
+        let language = get_language("cpp");
+
+        let code = "SomeStruct foo{.bar{}};";
+
+        let mut parser = Parser::new();
+        parser.set_language(&language).unwrap();
+
+        let tree = parser.parse(code, None).unwrap();
+        let root = tree.root_node();
+
+        let query = Query::new(&language, "(initializer_list (ERROR) @error)").unwrap();
+        let mut cursor = QueryCursor::new();
+
+        let matches = cursor.matches(&query, root, code.as_bytes());
+        let matches = collect_matches(matches, &query, code);
+        assert_eq!(matches, &[(0, vec![("error", ".bar")])]);
+    });
+}
diff --git a/lib/src/query.c b/lib/src/query.c
index 58da6d0b..a961fbbb 100644
--- a/lib/src/query.c
+++ b/lib/src/query.c
@@ -1338,7 +1338,12 @@ static void ts_query__perform_analysis(
           // Determine if this hypothetical child node would match the current step
           // of the query pattern.
           bool does_match = false;
-          if (visible_symbol) {
+
+          // ERROR nodes can appear anywhere, so if the step is 
+          // looking for an ERROR node, consider it potentially matchable.
+          if (step->symbol == ts_builtin_sym_error) {
+            does_match = true;
+          } else if (visible_symbol) {
             does_match = true;
             if (step->symbol == WILDCARD_SYMBOL) {
               if (

From e0edfe1cb329d171788800e2a628f079b8bae655 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Thu, 28 Aug 2025 22:20:39 +0300
Subject: [PATCH 343/663] build(zig): support wasmtime for ARM64 Windows (MSVC)

---
 build.zig     | 4 ++++
 build.zig.zon | 5 +++++
 2 files changed, 9 insertions(+)

diff --git a/build.zig b/build.zig
index afbf8f64..e1b37719 100644
--- a/build.zig
+++ b/build.zig
@@ -83,6 +83,10 @@ pub fn wasmtimeDep(target: std.Target) []const u8 {
                 .msvc => "wasmtime_c_api_x86_64_windows",
                 else => null,
             },
+            .aarch64 => switch (abi) {
+                .msvc => "wasmtime_c_api_aarch64_windows",
+                else => null,
+            },
             else => null,
         },
         .macos => switch (arch) {
diff --git a/build.zig.zon b/build.zig.zon
index 111054ea..d86655e8 100644
--- a/build.zig.zon
+++ b/build.zig.zon
@@ -27,6 +27,11 @@
             .hash = "N-V-__8AAM1GMARD6LGQebhVsSZ0uePUoo3Fw5nEO2L764vf",
             .lazy = true,
         },
+        .wasmtime_c_api_aarch64_windows = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-windows-c-api.zip",
+            .hash = "N-V-__8AAH8a_wQ7oAeVVsaJcoOZhKTMkHIBc_XjDyLlHp2x",
+            .lazy = true,
+        },
         .wasmtime_c_api_riscv64gc_linux = .{
             .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-riscv64gc-linux-c-api.tar.xz",
             .hash = "N-V-__8AAN2cuQadBwMc8zJxv0sMY99Ae1Nc1dZcZAK9b4DZ",

From 77e5c1c8aa0b85b785adeef45ee4cd9f8dcf5412 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Thu, 28 Aug 2025 17:10:58 -0400
Subject: [PATCH 344/663] fix(lib): allow error nodes to match when they are
 child nodes

(cherry picked from commit 8387101a6183e63b35ac034443a1d2c042dc70e6)
---
 cli/src/tests/query_test.rs | 22 ++++++++++++++++++++++
 lib/src/query.c             |  7 ++++++-
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/cli/src/tests/query_test.rs b/cli/src/tests/query_test.rs
index e769cf89..b8773acb 100644
--- a/cli/src/tests/query_test.rs
+++ b/cli/src/tests/query_test.rs
@@ -5727,3 +5727,25 @@ fn test_query_with_anonymous_error_node() {
         vec![(1, vec![("error", "ERROR")]), (0, vec![("error", "ERROR")])]
     );
 }
+
+#[test]
+fn test_query_allows_error_nodes_with_children() {
+    allocations::record(|| {
+        let language = get_language("cpp");
+
+        let code = "SomeStruct foo{.bar{}};";
+
+        let mut parser = Parser::new();
+        parser.set_language(&language).unwrap();
+
+        let tree = parser.parse(code, None).unwrap();
+        let root = tree.root_node();
+
+        let query = Query::new(&language, "(initializer_list (ERROR) @error)").unwrap();
+        let mut cursor = QueryCursor::new();
+
+        let matches = cursor.matches(&query, root, code.as_bytes());
+        let matches = collect_matches(matches, &query, code);
+        assert_eq!(matches, &[(0, vec![("error", ".bar")])]);
+    });
+}
diff --git a/lib/src/query.c b/lib/src/query.c
index 0dc512e7..6c514887 100644
--- a/lib/src/query.c
+++ b/lib/src/query.c
@@ -1340,7 +1340,12 @@ static void ts_query__perform_analysis(
           // Determine if this hypothetical child node would match the current step
           // of the query pattern.
           bool does_match = false;
-          if (visible_symbol) {
+
+          // ERROR nodes can appear anywhere, so if the step is 
+          // looking for an ERROR node, consider it potentially matchable.
+          if (step->symbol == ts_builtin_sym_error) {
+            does_match = true;
+          } else if (visible_symbol) {
             does_match = true;
             if (step->symbol == WILDCARD_SYMBOL) {
               if (

From cd503e803d3df187968f481c7a2e2b9e366cffbd Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Thu, 28 Aug 2025 22:20:39 +0300
Subject: [PATCH 345/663] build(zig): support wasmtime for ARM64 Windows (MSVC)

(cherry picked from commit e0edfe1cb329d171788800e2a628f079b8bae655)
---
 build.zig     | 4 ++++
 build.zig.zon | 5 +++++
 2 files changed, 9 insertions(+)

diff --git a/build.zig b/build.zig
index afbf8f64..e1b37719 100644
--- a/build.zig
+++ b/build.zig
@@ -83,6 +83,10 @@ pub fn wasmtimeDep(target: std.Target) []const u8 {
                 .msvc => "wasmtime_c_api_x86_64_windows",
                 else => null,
             },
+            .aarch64 => switch (abi) {
+                .msvc => "wasmtime_c_api_aarch64_windows",
+                else => null,
+            },
             else => null,
         },
         .macos => switch (arch) {
diff --git a/build.zig.zon b/build.zig.zon
index 75984ea6..3acdb4d2 100644
--- a/build.zig.zon
+++ b/build.zig.zon
@@ -27,6 +27,11 @@
             .hash = "N-V-__8AAM1GMARD6LGQebhVsSZ0uePUoo3Fw5nEO2L764vf",
             .lazy = true,
         },
+        .wasmtime_c_api_aarch64_windows = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-windows-c-api.zip",
+            .hash = "N-V-__8AAH8a_wQ7oAeVVsaJcoOZhKTMkHIBc_XjDyLlHp2x",
+            .lazy = true,
+        },
         .wasmtime_c_api_riscv64gc_linux = .{
             .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-riscv64gc-linux-c-api.tar.xz",
             .hash = "N-V-__8AAN2cuQadBwMc8zJxv0sMY99Ae1Nc1dZcZAK9b4DZ",

From 34ef1157a65987d53a18a32dbdd04046c263f7e5 Mon Sep 17 00:00:00 2001
From: WillLillis 
Date: Mon, 20 Jan 2025 21:56:00 -0500
Subject: [PATCH 346/663] feat(ci): build libraries on windows x64 with mingw

---
 .github/workflows/build.yml | 56 +++++++++++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 2b39e329..3381196a 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -139,6 +139,62 @@ jobs:
           [[ -n $runner ]] && printf 'CROSS_RUNNER=%s\n' "$runner" >> $GITHUB_ENV
         fi
 
+    # TODO: Remove RUSTFLAGS="--cap-lints allow" once we use a wasmtime release that addresses
+    # the `mismatched-lifetime-syntaxes` lint
+    - name: Build wasmtime library (Windows x64 MSYS2)
+      if: ${{ !matrix.use-cross && contains(matrix.features, 'wasm') && matrix.platform == 'windows-x64' }}
+      run: |
+        mkdir -p target
+        WASMTIME_VERSION=$(cargo metadata --format-version=1 --locked --features wasm | \
+                           jq -r '.packages[] | select(.name == "wasmtime-c-api-impl") | .version')
+        curl -LSs "$WASMTIME_REPO/archive/refs/tags/v${WASMTIME_VERSION}.tar.gz" | tar xzf - -C target
+        cd target/wasmtime-${WASMTIME_VERSION}
+        cmake -S crates/c-api -B target/c-api \
+          -DCMAKE_INSTALL_PREFIX="$PWD/artifacts" \
+          -DWASMTIME_DISABLE_ALL_FEATURES=ON \
+          -DWASMTIME_FEATURE_CRANELIFT=ON \
+          -DWASMTIME_TARGET='x86_64-pc-windows-gnu'
+        cmake --build target/c-api && cmake --install target/c-api
+        printf 'CMAKE_PREFIX_PATH=%s\n' "$PWD/artifacts" >> $GITHUB_ENV
+      env:
+        WASMTIME_REPO: https://github.com/bytecodealliance/wasmtime
+        RUSTFLAGS: "--cap-lints allow"
+
+    - name: Install MinGW and Clang (Windows x64 MSYS2)
+      if: ${{ matrix.platform == 'windows-x64' }}
+      uses: msys2/setup-msys2@v2
+      with:
+        update: true
+        install: |
+          mingw-w64-x86_64-toolchain
+          mingw-w64-x86_64-clang
+          mingw-w64-x86_64-make
+          mingw-w64-x86_64-cmake
+
+    - name: Build C library (Windows x64 MSYS2 CMake)
+      if: ${{ matrix.platform == 'windows-x64' }}
+      shell: msys2 {0}
+      run: |
+        cmake -G Ninja -S lib -B build/static \
+          -DBUILD_SHARED_LIBS=OFF \
+          -DCMAKE_BUILD_TYPE=Debug \
+          -DCMAKE_COMPILE_WARNING_AS_ERROR=ON \
+          -DTREE_SITTER_FEATURE_WASM=$WASM \
+          -DCMAKE_C_COMPILER=clang
+        cmake --build build/static
+        rm -rf build/static
+
+        cmake -G Ninja -S lib -B build/shared \
+          -DBUILD_SHARED_LIBS=ON \
+          -DCMAKE_BUILD_TYPE=Debug \
+          -DCMAKE_COMPILE_WARNING_AS_ERROR=ON \
+          -DTREE_SITTER_FEATURE_WASM=$WASM \
+          -DCMAKE_C_COMPILER=clang
+        cmake --build build/shared
+        rm -rf build/shared
+      env:
+        WASM: ${{ contains(matrix.features, 'wasm') && 'ON' || 'OFF' }}
+
     # TODO: Remove RUSTFLAGS="--cap-lints allow" once we use a wasmtime release that addresses
     # the `mismatched-lifetime-syntaxes` lint
     - name: Build wasmtime library

From c12b4a15654c6a40b4109b35c3035e46d8e6bf63 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sat, 16 Aug 2025 23:06:57 +0300
Subject: [PATCH 347/663] ci: add a spam closing workflow

---
 .github/scripts/close_spam.js | 38 +++++++++++++++++++++++++++++++++++
 .github/workflows/spam.yml    | 29 ++++++++++++++++++++++++++
 2 files changed, 67 insertions(+)
 create mode 100644 .github/scripts/close_spam.js
 create mode 100644 .github/workflows/spam.yml

diff --git a/.github/scripts/close_spam.js b/.github/scripts/close_spam.js
new file mode 100644
index 00000000..7b58f6ab
--- /dev/null
+++ b/.github/scripts/close_spam.js
@@ -0,0 +1,38 @@
+module.exports = async ({ github, context }) => {
+  const { data } = await github.rest.repos.getCollaboratorPermissionLevel({
+    ...context.repo,
+    username: context.actor
+  });
+  if (!data.permission.includes("triage")) {
+    await github.log.error("Workflow called with insufficient permissions!");
+    return;
+  }
+
+  let target = context.payload.issue;
+  if (target) {
+    await github.rest.issues.update({
+      ...context.repo,
+      issue_number: target.number,
+      state: "closed",
+      state_reason: "not_planned",
+      title: "[spam]",
+      body: "",
+      type: null,
+    });
+  } else {
+    target = context.payload.pull_request;
+    await github.rest.pulls.update({
+      ...context.repo,
+      pull_number: target.number,
+      state: "closed",
+      title: "[spam]",
+      body: "",
+    });
+  }
+
+  await github.rest.issues.lock({
+    ...context.repo,
+    issue_number: target.number,
+    lock_reason: "spam",
+  });
+};
diff --git a/.github/workflows/spam.yml b/.github/workflows/spam.yml
new file mode 100644
index 00000000..cc581e0b
--- /dev/null
+++ b/.github/workflows/spam.yml
@@ -0,0 +1,29 @@
+name: Close as spam
+
+on:
+  issues:
+    types: [labeled]
+  pull_request_target:
+    types: [labeled]
+
+permissions:
+  issues: write
+  pull-requests: write
+
+jobs:
+  spam:
+    runs-on: ubuntu-latest
+    if: github.event.label.name == 'spam'
+    steps:
+      - name: Checkout script
+        uses: actions/checkout@v5
+        with:
+          sparse-checkout: .github/scripts/close_spam.js
+          sparse-checkout-cone-mode: false
+
+      - name: Run script
+        uses: actions/github-script@v7
+        with:
+          script: |
+            const script = require('./.github/scripts/close_spam.js')
+            await script({github, context})

From 0be215e152d58351d2691484b4398ceff041f2fb Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Thu, 28 Aug 2025 20:49:34 +0300
Subject: [PATCH 348/663] fix(bindings): properly detect MSVC compiler

---
 crates/cli/src/init.rs            |  9 ++----
 crates/cli/src/templates/setup.py | 49 ++++++++++++++++---------------
 2 files changed, 27 insertions(+), 31 deletions(-)

diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs
index bb957c0f..2f3792a6 100644
--- a/crates/cli/src/init.rs
+++ b/crates/cli/src/init.rs
@@ -689,15 +689,10 @@ pub fn generate_grammar_files(
                 allow_update,
                 |path| generate_file(path, SETUP_PY_TEMPLATE, language_name, &generate_opts),
                 |path| {
-                    let mut contents = fs::read_to_string(path)?;
-                    if !contents.contains("egg_info") || !contents.contains("Py_GIL_DISABLED") {
+                    let contents = fs::read_to_string(path)?;
+                    if !contents.contains("build_ext") {
                         eprintln!("Replacing setup.py");
                         generate_file(path, SETUP_PY_TEMPLATE, language_name, &generate_opts)?;
-                    } else {
-                        contents = contents
-                            .replace("path\nfrom platform import system", "name as os_name, path")
-                            .replace("system() != \"Windows\"", "os_name != \"nt\"");
-                        write_file(path, contents)?;
                     }
                     Ok(())
                 },
diff --git a/crates/cli/src/templates/setup.py b/crates/cli/src/templates/setup.py
index 9fdc3098..7f92eaee 100644
--- a/crates/cli/src/templates/setup.py
+++ b/crates/cli/src/templates/setup.py
@@ -1,30 +1,12 @@
-from os import name as os_name, path
+from os import path
 from sysconfig import get_config_var
 
 from setuptools import Extension, find_packages, setup
 from setuptools.command.build import build
+from setuptools.command.build_ext import build_ext
 from setuptools.command.egg_info import egg_info
 from wheel.bdist_wheel import bdist_wheel
 
-sources = [
-    "bindings/python/tree_sitter_LOWER_PARSER_NAME/binding.c",
-    "src/parser.c",
-]
-if path.exists("src/scanner.c"):
-    sources.append("src/scanner.c")
-
-macros: list[tuple[str, str | None]] = [
-    ("PY_SSIZE_T_CLEAN", None),
-    ("TREE_SITTER_HIDE_SYMBOLS", None),
-]
-if limited_api := not get_config_var("Py_GIL_DISABLED"):
-    macros.append(("Py_LIMITED_API", "0x030A0000"))
-
-if os_name != "nt":
-    cflags = ["-std=c11", "-fvisibility=hidden"]
-else:
-    cflags = ["/std:c11", "/utf-8"]
-
 
 class Build(build):
     def run(self):
@@ -34,6 +16,19 @@ class Build(build):
         super().run()
 
 
+class BuildExt(build_ext):
+    def build_extension(self, ext: Extension):
+        if self.compiler.compiler_type != "msvc":
+            ext.extra_compile_args = ["-std=c11", "-fvisibility=hidden"]
+        else:
+            ext.extra_compile_args = ["/std:c11", "/utf-8"]
+        if path.exists("src/scanner.c"):
+            ext.sources.append("src/scanner.c")
+        if ext.py_limited_api:
+            ext.define_macros.append(("Py_LIMITED_API", "0x030A0000"))
+        super().build_extension(ext)
+
+
 class BdistWheel(bdist_wheel):
     def get_tag(self):
         python, abi, platform = super().get_tag()
@@ -60,15 +55,21 @@ setup(
     ext_modules=[
         Extension(
             name="_binding",
-            sources=sources,
-            extra_compile_args=cflags,
-            define_macros=macros,
+            sources=[
+                "bindings/python/tree_sitter_LOWER_PARSER_NAME/binding.c",
+                "src/parser.c",
+            ],
+            define_macros=[
+                ("PY_SSIZE_T_CLEAN", None),
+                ("TREE_SITTER_HIDE_SYMBOLS", None),
+            ],
             include_dirs=["src"],
-            py_limited_api=limited_api,
+            py_limited_api=not get_config_var("Py_GIL_DISABLED"),
         )
     ],
     cmdclass={
         "build": Build,
+        "build_ext": BuildExt,
         "bdist_wheel": BdistWheel,
         "egg_info": EggInfo,
     },

From e61407cc3631ae07471def33fca22f0136727f20 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Thu, 28 Aug 2025 20:49:34 +0300
Subject: [PATCH 349/663] fix(bindings): properly detect MSVC compiler

(cherry picked from commit 0be215e152d58351d2691484b4398ceff041f2fb)
---
 cli/src/init.rs            |  9 ++-----
 cli/src/templates/setup.py | 49 +++++++++++++++++++-------------------
 2 files changed, 27 insertions(+), 31 deletions(-)

diff --git a/cli/src/init.rs b/cli/src/init.rs
index 10ac73a6..709612af 100644
--- a/cli/src/init.rs
+++ b/cli/src/init.rs
@@ -666,15 +666,10 @@ pub fn generate_grammar_files(
                 allow_update,
                 |path| generate_file(path, SETUP_PY_TEMPLATE, language_name, &generate_opts),
                 |path| {
-                    let mut contents = fs::read_to_string(path)?;
-                    if !contents.contains("egg_info") || !contents.contains("Py_GIL_DISABLED") {
+                    let contents = fs::read_to_string(path)?;
+                    if !contents.contains("build_ext") {
                         eprintln!("Replacing setup.py");
                         generate_file(path, SETUP_PY_TEMPLATE, language_name, &generate_opts)?;
-                    } else {
-                        contents = contents
-                            .replace("path\nfrom platform import system", "name as os_name, path")
-                            .replace("system() != \"Windows\"", "os_name != \"nt\"");
-                        write_file(path, contents)?;
                     }
                     Ok(())
                 },
diff --git a/cli/src/templates/setup.py b/cli/src/templates/setup.py
index 9fdc3098..7f92eaee 100644
--- a/cli/src/templates/setup.py
+++ b/cli/src/templates/setup.py
@@ -1,30 +1,12 @@
-from os import name as os_name, path
+from os import path
 from sysconfig import get_config_var
 
 from setuptools import Extension, find_packages, setup
 from setuptools.command.build import build
+from setuptools.command.build_ext import build_ext
 from setuptools.command.egg_info import egg_info
 from wheel.bdist_wheel import bdist_wheel
 
-sources = [
-    "bindings/python/tree_sitter_LOWER_PARSER_NAME/binding.c",
-    "src/parser.c",
-]
-if path.exists("src/scanner.c"):
-    sources.append("src/scanner.c")
-
-macros: list[tuple[str, str | None]] = [
-    ("PY_SSIZE_T_CLEAN", None),
-    ("TREE_SITTER_HIDE_SYMBOLS", None),
-]
-if limited_api := not get_config_var("Py_GIL_DISABLED"):
-    macros.append(("Py_LIMITED_API", "0x030A0000"))
-
-if os_name != "nt":
-    cflags = ["-std=c11", "-fvisibility=hidden"]
-else:
-    cflags = ["/std:c11", "/utf-8"]
-
 
 class Build(build):
     def run(self):
@@ -34,6 +16,19 @@ class Build(build):
         super().run()
 
 
+class BuildExt(build_ext):
+    def build_extension(self, ext: Extension):
+        if self.compiler.compiler_type != "msvc":
+            ext.extra_compile_args = ["-std=c11", "-fvisibility=hidden"]
+        else:
+            ext.extra_compile_args = ["/std:c11", "/utf-8"]
+        if path.exists("src/scanner.c"):
+            ext.sources.append("src/scanner.c")
+        if ext.py_limited_api:
+            ext.define_macros.append(("Py_LIMITED_API", "0x030A0000"))
+        super().build_extension(ext)
+
+
 class BdistWheel(bdist_wheel):
     def get_tag(self):
         python, abi, platform = super().get_tag()
@@ -60,15 +55,21 @@ setup(
     ext_modules=[
         Extension(
             name="_binding",
-            sources=sources,
-            extra_compile_args=cflags,
-            define_macros=macros,
+            sources=[
+                "bindings/python/tree_sitter_LOWER_PARSER_NAME/binding.c",
+                "src/parser.c",
+            ],
+            define_macros=[
+                ("PY_SSIZE_T_CLEAN", None),
+                ("TREE_SITTER_HIDE_SYMBOLS", None),
+            ],
             include_dirs=["src"],
-            py_limited_api=limited_api,
+            py_limited_api=not get_config_var("Py_GIL_DISABLED"),
         )
     ],
     cmdclass={
         "build": Build,
+        "build_ext": BuildExt,
         "bdist_wheel": BdistWheel,
         "egg_info": EggInfo,
     },

From a1211d3fbda8f26134a8e8edd1f06123ae974d2f Mon Sep 17 00:00:00 2001
From: Boris Verkhovskiy 
Date: Fri, 29 Aug 2025 12:26:27 -0600
Subject: [PATCH 350/663] feat(web): inline C source code in source map

---
 crates/loader/emscripten-version | 2 +-
 crates/xtask/src/build_wasm.rs   | 3 +--
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/crates/loader/emscripten-version b/crates/loader/emscripten-version
index 7636e756..d13e837c 100644
--- a/crates/loader/emscripten-version
+++ b/crates/loader/emscripten-version
@@ -1 +1 @@
-4.0.5
+4.0.6
diff --git a/crates/xtask/src/build_wasm.rs b/crates/xtask/src/build_wasm.rs
index ed6f5251..4da817c9 100644
--- a/crates/xtask/src/build_wasm.rs
+++ b/crates/xtask/src/build_wasm.rs
@@ -150,8 +150,7 @@ pub fn run_wasm(args: &BuildWasm) -> Result<()> {
 
     #[rustfmt::skip]
     emscripten_flags.extend([
-        "-gsource-map",
-        "--source-map-base", ".",
+        "-gsource-map=inline",
         "-fno-exceptions",
         "-std=c11",
         "-s", "WASM=1",

From ac171eb2802ffc21c2a59ad84220c3e8d44f8647 Mon Sep 17 00:00:00 2001
From: Will Lillis 
Date: Fri, 29 Aug 2025 02:57:37 -0400
Subject: [PATCH 351/663] fix(generate): warn users when extra rule can lead to
 parser hang

When a *named* rule in the extras is able to match the empty string,
parsing can hang in certain situations (i.e. near EOF).
---
 crates/generate/src/parse_grammar.rs | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/crates/generate/src/parse_grammar.rs b/crates/generate/src/parse_grammar.rs
index 18bee720..2dbf7701 100644
--- a/crates/generate/src/parse_grammar.rs
+++ b/crates/generate/src/parse_grammar.rs
@@ -1,6 +1,7 @@
 use std::collections::HashSet;
 
 use anyhow::Result;
+use regex::Regex;
 use serde::{Deserialize, Serialize};
 use serde_json::{Map, Value};
 use thiserror::Error;
@@ -262,6 +263,27 @@ pub(crate) fn parse_grammar(input: &str) -> ParseGrammarResult {
             });
             continue;
         }
+
+        if extra_symbols
+            .iter()
+            .any(|r| rule_is_referenced(r, name, false))
+        {
+            let inner_rule = if let Rule::Metadata { rule, .. } = rule {
+                rule
+            } else {
+                rule
+            };
+            let matches_empty = match inner_rule {
+                Rule::String(rule_str) => rule_str.is_empty(),
+                Rule::Pattern(ref value, _) => Regex::new(value)
+                    .map(|reg| reg.is_match(""))
+                    .unwrap_or(false),
+                _ => false,
+            };
+            if matches_empty {
+                eprintln!("Warning: Named extra rule `{name}` matches the empty string. Inline this to avoid infinite loops while parsing.");
+            }
+        }
         variables.push(Variable {
             name: name.clone(),
             kind: VariableType::Named,

From 721b0e8b113dc32475acb428b25e16c2eced9cc5 Mon Sep 17 00:00:00 2001
From: RedCMD <33529441+RedCMD@users.noreply.github.com>
Date: Sat, 30 Aug 2025 13:39:53 +1200
Subject: [PATCH 352/663] fix(web): update `.d.ts` files

---
 lib/binding_web/web-tree-sitter.d.cts | 12 ++++++------
 lib/binding_web/web-tree-sitter.d.ts  |  2 +-
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/lib/binding_web/web-tree-sitter.d.cts b/lib/binding_web/web-tree-sitter.d.cts
index dabf77af..4cb22721 100644
--- a/lib/binding_web/web-tree-sitter.d.cts
+++ b/lib/binding_web/web-tree-sitter.d.cts
@@ -133,7 +133,7 @@ declare module 'web-tree-sitter' {
 		 * You can optionally pass in options to configure the Wasm module, the most common
 		 * one being `locateFile` to help the module find the `.wasm` file.
 		 */
-		static init(moduleOptions?: EmscriptenModule): Promise;
+		static init(moduleOptions?: Partial): Promise;
 		/**
 		 * Create a new parser.
 		 */
@@ -490,13 +490,13 @@ declare module 'web-tree-sitter' {
 		 *
 		 * See also {@link Node#children}.
 		 */
-		childrenForFieldName(fieldName: string): (Node | null)[];
+		childrenForFieldName(fieldName: string): Node[];
 		/**
 		  * Get an array of this node's children with a given field id.
 		  *
 		  * See also {@link Node#childrenForFieldName}.
 		  */
-		childrenForFieldId(fieldId: number): (Node | null)[];
+		childrenForFieldId(fieldId: number): Node[];
 		/** Get the node's first child that contains or starts after the given byte offset. */
 		firstChildForIndex(index: number): Node | null;
 		/** Get the node's first named child that contains or starts after the given byte offset. */
@@ -531,13 +531,13 @@ declare module 'web-tree-sitter' {
 		 * If you're walking the tree recursively, you may want to use the
 		 * {@link TreeCursor} APIs directly instead.
 		 */
-		get children(): (Node | null)[];
+		get children(): Node[];
 		/**
 		 * Iterate over this node's named children.
 		 *
 		 * See also {@link Node#children}.
 		 */
-		get namedChildren(): (Node | null)[];
+		get namedChildren(): Node[];
 		/**
 		 * Get the descendants of this node that are the given type, or in the given types array.
 		 *
@@ -545,7 +545,7 @@ declare module 'web-tree-sitter' {
 		 *
 		 * Additionally, a `startPosition` and `endPosition` can be passed in to restrict the search to a byte range.
 		 */
-		descendantsOfType(types: string | string[], startPosition?: Point, endPosition?: Point): (Node | null)[];
+		descendantsOfType(types: string | string[], startPosition?: Point, endPosition?: Point): Node[];
 		/** Get this node's next sibling. */
 		get nextSibling(): Node | null;
 		/** Get this node's previous sibling. */
diff --git a/lib/binding_web/web-tree-sitter.d.ts b/lib/binding_web/web-tree-sitter.d.ts
index 3c8b581a..2b6d6724 100644
--- a/lib/binding_web/web-tree-sitter.d.ts
+++ b/lib/binding_web/web-tree-sitter.d.ts
@@ -133,7 +133,7 @@ declare module 'web-tree-sitter' {
 		 * You can optionally pass in options to configure the Wasm module, the most common
 		 * one being `locateFile` to help the module find the `.wasm` file.
 		 */
-		static init(moduleOptions?: EmscriptenModule): Promise;
+		static init(moduleOptions?: Partial): Promise;
 		/**
 		 * Create a new parser.
 		 */

From 253003ccf8fdb6f35ce1a3acdeb13568cf75d492 Mon Sep 17 00:00:00 2001
From: Will Lillis 
Date: Fri, 29 Aug 2025 02:57:37 -0400
Subject: [PATCH 353/663] fix(generate): warn users when extra rule can lead to
 parser hang

When a *named* rule in the extras is able to match the empty string,
parsing can hang in certain situations (i.e. near EOF).

(cherry picked from commit ac171eb2802ffc21c2a59ad84220c3e8d44f8647)
---
 cli/generate/src/parse_grammar.rs | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/cli/generate/src/parse_grammar.rs b/cli/generate/src/parse_grammar.rs
index 18bee720..2dbf7701 100644
--- a/cli/generate/src/parse_grammar.rs
+++ b/cli/generate/src/parse_grammar.rs
@@ -1,6 +1,7 @@
 use std::collections::HashSet;
 
 use anyhow::Result;
+use regex::Regex;
 use serde::{Deserialize, Serialize};
 use serde_json::{Map, Value};
 use thiserror::Error;
@@ -262,6 +263,27 @@ pub(crate) fn parse_grammar(input: &str) -> ParseGrammarResult {
             });
             continue;
         }
+
+        if extra_symbols
+            .iter()
+            .any(|r| rule_is_referenced(r, name, false))
+        {
+            let inner_rule = if let Rule::Metadata { rule, .. } = rule {
+                rule
+            } else {
+                rule
+            };
+            let matches_empty = match inner_rule {
+                Rule::String(rule_str) => rule_str.is_empty(),
+                Rule::Pattern(ref value, _) => Regex::new(value)
+                    .map(|reg| reg.is_match(""))
+                    .unwrap_or(false),
+                _ => false,
+            };
+            if matches_empty {
+                eprintln!("Warning: Named extra rule `{name}` matches the empty string. Inline this to avoid infinite loops while parsing.");
+            }
+        }
         variables.push(Variable {
             name: name.clone(),
             kind: VariableType::Named,

From 88e323ca43a3a1e35a486314bfe57cfa75ce063a Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Wed, 20 Aug 2025 12:46:52 +0300
Subject: [PATCH 354/663] fix(xtask): commit Cargo.lock in upgrade_wasmtime

And add missing zig dependency update
---
 crates/xtask/src/upgrade_wasmtime.rs | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/crates/xtask/src/upgrade_wasmtime.rs b/crates/xtask/src/upgrade_wasmtime.rs
index 0510282c..e4686189 100644
--- a/crates/xtask/src/upgrade_wasmtime.rs
+++ b/crates/xtask/src/upgrade_wasmtime.rs
@@ -67,6 +67,10 @@ fn update_zig(version: &Version) -> Result<()> {
                 let (_, _) = (old_lines.next(), old_lines.next());
                 zig_fetch(new_lines, version, "aarch64-macos-c-api.tar.xz")?;
             }
+            "    .wasmtime_c_api_aarch64_windows = .{" => {
+                let (_, _) = (old_lines.next(), old_lines.next());
+                zig_fetch(new_lines, version, "aarch64-windows-c-api.zip")?;
+            }
             "    .wasmtime_c_api_riscv64gc_linux = .{" => {
                 let (_, _) = (old_lines.next(), old_lines.next());
                 zig_fetch(new_lines, version, "riscv64gc-linux-c-api.tar.xz")?;
@@ -119,7 +123,7 @@ pub fn run(args: &UpgradeWasmtime) -> Result<()> {
     create_commit(
         &repo,
         &format!("build(deps): bump wasmtime-c-api to v{}", args.version),
-        &["lib/Cargo.toml", "build.zig.zon"],
+        &["lib/Cargo.toml", "Cargo.lock", "build.zig.zon"],
     )?;
 
     Ok(())

From 489ad07e8b0ff3d69544d68341fc129cc0974e54 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Wed, 20 Aug 2025 12:45:01 +0300
Subject: [PATCH 355/663] build(deps): bump wasmtime-c-api to v33.0.2

---
 Cargo.lock     | 915 +++++++++++++++++++++++--------------------------
 build.zig.zon  |  48 +--
 lib/Cargo.toml |   2 +-
 3 files changed, 449 insertions(+), 516 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 65014116..586d8c04 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3,22 +3,19 @@
 version = 3
 
 [[package]]
-name = "adler2"
-version = "2.0.0"
+name = "addr2line"
+version = "0.24.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
+checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
+dependencies = [
+ "gimli",
+]
 
 [[package]]
-name = "ahash"
-version = "0.8.11"
+name = "adler2"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
-dependencies = [
- "cfg-if",
- "once_cell",
- "version_check",
- "zerocopy",
-]
+checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
 
 [[package]]
 name = "aho-corasick"
@@ -46,9 +43,9 @@ dependencies = [
 
 [[package]]
 name = "anstream"
-version = "0.6.18"
+version = "0.6.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
+checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192"
 dependencies = [
  "anstyle",
  "anstyle-parse",
@@ -67,31 +64,31 @@ checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd"
 
 [[package]]
 name = "anstyle-parse"
-version = "0.2.6"
+version = "0.2.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
+checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
 dependencies = [
  "utf8parse",
 ]
 
 [[package]]
 name = "anstyle-query"
-version = "1.1.2"
+version = "1.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
+checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2"
 dependencies = [
- "windows-sys 0.59.0",
+ "windows-sys 0.60.2",
 ]
 
 [[package]]
 name = "anstyle-wincon"
-version = "3.0.7"
+version = "3.0.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e"
+checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a"
 dependencies = [
  "anstyle",
- "once_cell",
- "windows-sys 0.59.0",
+ "once_cell_polyfill",
+ "windows-sys 0.60.2",
 ]
 
 [[package]]
@@ -102,9 +99,9 @@ checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100"
 
 [[package]]
 name = "arbitrary"
-version = "1.4.1"
+version = "1.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223"
+checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1"
 
 [[package]]
 name = "ascii"
@@ -124,7 +121,7 @@ version = "0.72.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4f72209734318d0b619a5e0f5129918b848c416e122a3c4ce054e03cb87b726f"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.3",
  "cexpr",
  "clang-sys",
  "itertools 0.13.0",
@@ -146,9 +143,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
 [[package]]
 name = "bitflags"
-version = "2.8.0"
+version = "2.9.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36"
+checksum = "34efbcccd345379ca2868b2b2c9d3782e9cc58ba87bc7d79d5b53d9c9ae6f25d"
 
 [[package]]
 name = "bstr"
@@ -163,30 +160,24 @@ dependencies = [
 
 [[package]]
 name = "bumpalo"
-version = "3.16.0"
+version = "3.19.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
+checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
 dependencies = [
  "allocator-api2",
 ]
 
 [[package]]
 name = "bytemuck"
-version = "1.21.0"
+version = "1.23.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3"
-
-[[package]]
-name = "byteorder"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
+checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677"
 
 [[package]]
 name = "bytes"
-version = "1.9.0"
+version = "1.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b"
+checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
 
 [[package]]
 name = "cc"
@@ -216,9 +207,9 @@ dependencies = [
 
 [[package]]
 name = "cfg-if"
-version = "1.0.0"
+version = "1.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9"
 
 [[package]]
 name = "cfg_aliases"
@@ -245,9 +236,9 @@ dependencies = [
 
 [[package]]
 name = "clap"
-version = "4.5.45"
+version = "4.5.46"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fc0e74a703892159f5ae7d3aac52c8e6c392f5ae5f359c70b5881d60aaac318"
+checksum = "2c5e4fcf9c21d2e544ca1ee9d8552de13019a42aa7dbf32747fa7aaf1df76e57"
 dependencies = [
  "clap_builder",
  "clap_derive",
@@ -255,9 +246,9 @@ dependencies = [
 
 [[package]]
 name = "clap_builder"
-version = "4.5.44"
+version = "4.5.46"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8"
+checksum = "fecb53a0e6fcfb055f686001bc2e2592fa527efaf38dbe81a6a9563562e57d41"
 dependencies = [
  "anstream",
  "anstyle",
@@ -298,21 +289,24 @@ dependencies = [
 
 [[package]]
 name = "clap_lex"
-version = "0.7.4"
+version = "0.7.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
+checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675"
 
 [[package]]
 name = "cobs"
-version = "0.2.3"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15"
+checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1"
+dependencies = [
+ "thiserror 2.0.16",
+]
 
 [[package]]
 name = "colorchoice"
-version = "1.0.3"
+version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
+checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
 
 [[package]]
 name = "combine"
@@ -326,9 +320,9 @@ dependencies = [
 
 [[package]]
 name = "console"
-version = "0.15.10"
+version = "0.15.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b"
+checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8"
 dependencies = [
  "encode_unicode",
  "libc",
@@ -339,9 +333,9 @@ dependencies = [
 
 [[package]]
 name = "core-foundation"
-version = "0.10.0"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63"
+checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
 dependencies = [
  "core-foundation-sys",
  "libc",
@@ -354,19 +348,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
 
 [[package]]
-name = "cranelift-bforest"
-version = "0.116.1"
+name = "cranelift-assembler-x64"
+version = "0.120.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e15d04a0ce86cb36ead88ad68cf693ffd6cda47052b9e0ac114bc47fd9cd23c4"
+checksum = "a5023e06632d8f351c2891793ccccfe4aef957954904392434038745fb6f1f68"
+dependencies = [
+ "cranelift-assembler-x64-meta",
+]
+
+[[package]]
+name = "cranelift-assembler-x64-meta"
+version = "0.120.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1c4012b4c8c1f6eb05c0a0a540e3e1ee992631af51aa2bbb3e712903ce4fd65"
+dependencies = [
+ "cranelift-srcgen",
+]
+
+[[package]]
+name = "cranelift-bforest"
+version = "0.120.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d6d883b4942ef3a7104096b8bc6f2d1a41393f159ac8de12aed27b25d67f895"
 dependencies = [
  "cranelift-entity",
 ]
 
 [[package]]
 name = "cranelift-bitset"
-version = "0.116.1"
+version = "0.120.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c6e3969a7ce267259ce244b7867c5d3bc9e65b0a87e81039588dfdeaede9f34"
+checksum = "db7b2ee9eec6ca8a716d900d5264d678fb2c290c58c46c8da7f94ee268175d17"
 dependencies = [
  "serde",
  "serde_derive",
@@ -374,11 +386,12 @@ dependencies = [
 
 [[package]]
 name = "cranelift-codegen"
-version = "0.116.1"
+version = "0.120.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c22032c4cb42558371cf516bb47f26cdad1819d3475c133e93c49f50ebf304e"
+checksum = "aeda0892577afdce1ac2e9a983a55f8c5b87a59334e1f79d8f735a2d7ba4f4b4"
 dependencies = [
  "bumpalo",
+ "cranelift-assembler-x64",
  "cranelift-bforest",
  "cranelift-bitset",
  "cranelift-codegen-meta",
@@ -387,8 +400,9 @@ dependencies = [
  "cranelift-entity",
  "cranelift-isle",
  "gimli",
- "hashbrown 0.14.5",
+ "hashbrown",
  "log",
+ "pulley-interpreter",
  "regalloc2",
  "rustc-hash",
  "serde",
@@ -398,33 +412,36 @@ dependencies = [
 
 [[package]]
 name = "cranelift-codegen-meta"
-version = "0.116.1"
+version = "0.120.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c904bc71c61b27fc57827f4a1379f29de64fe95653b620a3db77d59655eee0b8"
+checksum = "e461480d87f920c2787422463313326f67664e68108c14788ba1676f5edfcd15"
 dependencies = [
+ "cranelift-assembler-x64-meta",
  "cranelift-codegen-shared",
+ "cranelift-srcgen",
+ "pulley-interpreter",
 ]
 
 [[package]]
 name = "cranelift-codegen-shared"
-version = "0.116.1"
+version = "0.120.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40180f5497572f644ce88c255480981ae2ec1d7bb4d8e0c0136a13b87a2f2ceb"
+checksum = "976584d09f200c6c84c4b9ff7af64fc9ad0cb64dffa5780991edd3fe143a30a1"
 
 [[package]]
 name = "cranelift-control"
-version = "0.116.1"
+version = "0.120.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26d132c6d0bd8a489563472afc171759da0707804a65ece7ceb15a8c6d7dd5ef"
+checksum = "46d43d70f4e17c545aa88dbf4c84d4200755d27c6e3272ebe4de65802fa6a955"
 dependencies = [
  "arbitrary",
 ]
 
 [[package]]
 name = "cranelift-entity"
-version = "0.116.1"
+version = "0.120.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b2d0d9618275474fbf679dd018ac6e009acbd6ae6850f6a67be33fb3b00b323"
+checksum = "d75418674520cb400c8772bfd6e11a62736c78fc1b6e418195696841d1bf91f1"
 dependencies = [
  "cranelift-bitset",
  "serde",
@@ -433,9 +450,9 @@ dependencies = [
 
 [[package]]
 name = "cranelift-frontend"
-version = "0.116.1"
+version = "0.120.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fac41e16729107393174b0c9e3730fb072866100e1e64e80a1a963b2e484d57"
+checksum = "3c8b1a91c86687a344f3c52dd6dfb6e50db0dfa7f2e9c7711b060b3623e1fdeb"
 dependencies = [
  "cranelift-codegen",
  "log",
@@ -445,15 +462,15 @@ dependencies = [
 
 [[package]]
 name = "cranelift-isle"
-version = "0.116.1"
+version = "0.120.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ca20d576e5070044d0a72a9effc2deacf4d6aa650403189d8ea50126483944d"
+checksum = "711baa4e3432d4129295b39ec2b4040cc1b558874ba0a37d08e832e857db7285"
 
 [[package]]
 name = "cranelift-native"
-version = "0.116.1"
+version = "0.120.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8dee82f3f1f2c4cba9177f1cc5e350fe98764379bcd29340caa7b01f85076c7"
+checksum = "41c83e8666e3bcc5ffeaf6f01f356f0e1f9dcd69ce5511a1efd7ca5722001a3f"
 dependencies = [
  "cranelift-codegen",
  "libc",
@@ -461,10 +478,16 @@ dependencies = [
 ]
 
 [[package]]
-name = "crc32fast"
-version = "1.4.2"
+name = "cranelift-srcgen"
+version = "0.120.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+checksum = "02e3f4d783a55c64266d17dc67d2708852235732a100fc40dd9f1051adc64d7b"
+
+[[package]]
+name = "crc32fast"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
 dependencies = [
  "cfg-if",
 ]
@@ -522,9 +545,9 @@ dependencies = [
 
 [[package]]
 name = "either"
-version = "1.13.0"
+version = "1.15.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
+checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
 
 [[package]]
 name = "embedded-io"
@@ -555,18 +578,18 @@ dependencies = [
 
 [[package]]
 name = "equivalent"
-version = "1.0.1"
+version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
 
 [[package]]
 name = "errno"
-version = "0.3.10"
+version = "0.3.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
+checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad"
 dependencies = [
  "libc",
- "windows-sys 0.59.0",
+ "windows-sys 0.60.2",
 ]
 
 [[package]]
@@ -631,15 +654,15 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
 
 [[package]]
 name = "foldhash"
-version = "0.1.4"
+version = "0.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f"
+checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
 
 [[package]]
 name = "form_urlencoded"
-version = "1.2.1"
+version = "1.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
+checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
 dependencies = [
  "percent-encoding",
 ]
@@ -674,25 +697,25 @@ dependencies = [
 
 [[package]]
 name = "getrandom"
-version = "0.2.15"
+version = "0.2.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
+checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
 dependencies = [
  "cfg-if",
  "libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
+ "wasi 0.11.1+wasi-snapshot-preview1",
 ]
 
 [[package]]
 name = "getrandom"
-version = "0.3.1"
+version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8"
+checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
 dependencies = [
  "cfg-if",
  "libc",
- "wasi 0.13.3+wasi-0.2.2",
- "windows-targets 0.52.6",
+ "r-efi",
+ "wasi 0.14.3+wasi-0.2.4",
 ]
 
 [[package]]
@@ -712,7 +735,7 @@ version = "0.20.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.3",
  "libc",
  "libgit2-sys",
  "log",
@@ -729,18 +752,9 @@ checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
 
 [[package]]
 name = "hashbrown"
-version = "0.14.5"
+version = "0.15.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
-dependencies = [
- "ahash",
-]
-
-[[package]]
-name = "hashbrown"
-version = "0.15.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
+checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
 dependencies = [
  "foldhash",
  "serde",
@@ -772,9 +786,9 @@ dependencies = [
 
 [[package]]
 name = "http"
-version = "1.2.0"
+version = "1.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea"
+checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
 dependencies = [
  "bytes",
  "fnv",
@@ -783,9 +797,9 @@ dependencies = [
 
 [[package]]
 name = "httparse"
-version = "1.9.5"
+version = "1.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946"
+checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
 
 [[package]]
 name = "httpdate"
@@ -795,21 +809,22 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
 
 [[package]]
 name = "icu_collections"
-version = "1.5.0"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526"
+checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47"
 dependencies = [
  "displaydoc",
+ "potential_utf",
  "yoke",
  "zerofrom",
  "zerovec",
 ]
 
 [[package]]
-name = "icu_locid"
-version = "1.5.0"
+name = "icu_locale_core"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637"
+checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a"
 dependencies = [
  "displaydoc",
  "litemap",
@@ -818,31 +833,11 @@ dependencies = [
  "zerovec",
 ]
 
-[[package]]
-name = "icu_locid_transform"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e"
-dependencies = [
- "displaydoc",
- "icu_locid",
- "icu_locid_transform_data",
- "icu_provider",
- "tinystr",
- "zerovec",
-]
-
-[[package]]
-name = "icu_locid_transform_data"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e"
-
 [[package]]
 name = "icu_normalizer"
-version = "1.5.0"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f"
+checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979"
 dependencies = [
  "displaydoc",
  "icu_collections",
@@ -850,78 +845,59 @@ dependencies = [
  "icu_properties",
  "icu_provider",
  "smallvec",
- "utf16_iter",
- "utf8_iter",
- "write16",
  "zerovec",
 ]
 
 [[package]]
 name = "icu_normalizer_data"
-version = "1.5.0"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516"
+checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3"
 
 [[package]]
 name = "icu_properties"
-version = "1.5.1"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5"
+checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b"
 dependencies = [
  "displaydoc",
  "icu_collections",
- "icu_locid_transform",
+ "icu_locale_core",
  "icu_properties_data",
  "icu_provider",
- "tinystr",
+ "potential_utf",
+ "zerotrie",
  "zerovec",
 ]
 
 [[package]]
 name = "icu_properties_data"
-version = "1.5.0"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569"
+checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632"
 
 [[package]]
 name = "icu_provider"
-version = "1.5.0"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9"
+checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af"
 dependencies = [
  "displaydoc",
- "icu_locid",
- "icu_provider_macros",
+ "icu_locale_core",
  "stable_deref_trait",
  "tinystr",
  "writeable",
  "yoke",
  "zerofrom",
+ "zerotrie",
  "zerovec",
 ]
 
-[[package]]
-name = "icu_provider_macros"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "id-arena"
-version = "2.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005"
-
 [[package]]
 name = "idna"
-version = "1.0.3"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
+checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
 dependencies = [
  "idna_adapter",
  "smallvec",
@@ -930,9 +906,9 @@ dependencies = [
 
 [[package]]
 name = "idna_adapter"
-version = "1.2.0"
+version = "1.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71"
+checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
 dependencies = [
  "icu_normalizer",
  "icu_properties",
@@ -945,7 +921,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9"
 dependencies = [
  "equivalent",
- "hashbrown 0.15.2",
+ "hashbrown",
  "serde",
 ]
 
@@ -961,7 +937,7 @@ version = "0.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.3",
  "inotify-sys",
  "libc",
 ]
@@ -981,15 +957,6 @@ version = "1.70.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
 
-[[package]]
-name = "itertools"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
-dependencies = [
- "either",
-]
-
 [[package]]
 name = "itertools"
 version = "0.13.0"
@@ -1000,10 +967,19 @@ dependencies = [
 ]
 
 [[package]]
-name = "itoa"
-version = "1.0.14"
+name = "itertools"
+version = "0.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
+checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
 
 [[package]]
 name = "jni"
@@ -1029,10 +1005,11 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
 
 [[package]]
 name = "jobserver"
-version = "0.1.32"
+version = "0.1.34"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
+checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"
 dependencies = [
+ "getrandom 0.3.3",
  "libc",
 ]
 
@@ -1067,22 +1044,22 @@ dependencies = [
 ]
 
 [[package]]
-name = "leb128"
-version = "0.2.5"
+name = "leb128fmt"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67"
+checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
 
 [[package]]
 name = "libc"
-version = "0.2.172"
+version = "0.2.175"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
+checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543"
 
 [[package]]
 name = "libgit2-sys"
-version = "0.18.1+1.9.0"
+version = "0.18.2+1.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1dcb20f84ffcdd825c7a311ae347cce604a6f084a767dec4a4929829645290e"
+checksum = "1c42fe03df2bd3c53a3a9c7317ad91d80c81cd1fb0caec8d7cc4cd2bfa10c222"
 dependencies = [
  "cc",
  "libc",
@@ -1099,31 +1076,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667"
 dependencies = [
  "cfg-if",
- "windows-targets 0.53.2",
+ "windows-targets 0.53.3",
 ]
 
 [[package]]
 name = "libm"
-version = "0.2.11"
+version = "0.2.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa"
+checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
 
 [[package]]
 name = "libredox"
-version = "0.1.3"
+version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
+checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.3",
  "libc",
  "redox_syscall",
 ]
 
 [[package]]
 name = "libssh2-sys"
-version = "0.3.0"
+version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee"
+checksum = "220e4f05ad4a218192533b300327f5150e809b54c4ec83b5a1d91833601811b9"
 dependencies = [
  "cc",
  "libc",
@@ -1135,9 +1112,9 @@ dependencies = [
 
 [[package]]
 name = "libz-sys"
-version = "1.1.21"
+version = "1.1.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df9b68e50e6e0b26f672573834882eb57759f6db9b3be2ea3c35c91188bb4eaa"
+checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d"
 dependencies = [
  "cc",
  "libc",
@@ -1153,15 +1130,15 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
 
 [[package]]
 name = "linux-raw-sys"
-version = "0.9.2"
+version = "0.9.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6db9c683daf087dc577b7506e9695b3d556a9f3849903fa28186283afd6809e9"
+checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
 
 [[package]]
 name = "litemap"
-version = "0.7.4"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104"
+checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
 
 [[package]]
 name = "log"
@@ -1171,9 +1148,9 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
 
 [[package]]
 name = "mach2"
-version = "0.4.2"
+version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709"
+checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44"
 dependencies = [
  "libc",
 ]
@@ -1201,23 +1178,23 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
 
 [[package]]
 name = "miniz_oxide"
-version = "0.8.8"
+version = "0.8.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a"
+checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
 dependencies = [
  "adler2",
 ]
 
 [[package]]
 name = "mio"
-version = "1.0.3"
+version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
+checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
 dependencies = [
  "libc",
  "log",
- "wasi 0.11.0+wasi-snapshot-preview1",
- "windows-sys 0.52.0",
+ "wasi 0.11.1+wasi-snapshot-preview1",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -1232,7 +1209,7 @@ version = "0.30.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.3",
  "cfg-if",
  "cfg_aliases",
  "libc",
@@ -1254,7 +1231,7 @@ version = "8.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.3",
  "fsevent-sys",
  "inotify",
  "kqueue",
@@ -1287,9 +1264,9 @@ checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d"
 
 [[package]]
 name = "objc2"
-version = "0.6.0"
+version = "0.6.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3531f65190d9cff863b77a99857e74c314dd16bf56c538c4b57c7cbc3f3a6e59"
+checksum = "561f357ba7f3a2a61563a186a163d0a3a5247e1089524a3981d49adb775078bc"
 dependencies = [
  "objc2-encode",
 ]
@@ -1302,11 +1279,11 @@ checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
 
 [[package]]
 name = "objc2-foundation"
-version = "0.3.0"
+version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a21c6c9014b82c39515db5b396f91645182611c97d24637cf56ac01e5f8d998"
+checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.3",
  "objc2",
 ]
 
@@ -1317,7 +1294,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
 dependencies = [
  "crc32fast",
- "hashbrown 0.15.2",
+ "hashbrown",
  "indexmap",
  "memchr",
 ]
@@ -1328,6 +1305,12 @@ version = "1.21.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
 
+[[package]]
+name = "once_cell_polyfill"
+version = "1.70.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad"
+
 [[package]]
 name = "openssl-probe"
 version = "0.1.6"
@@ -1336,9 +1319,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
 
 [[package]]
 name = "openssl-sys"
-version = "0.9.104"
+version = "0.9.109"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741"
+checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571"
 dependencies = [
  "cc",
  "libc",
@@ -1346,12 +1329,6 @@ dependencies = [
  "vcpkg",
 ]
 
-[[package]]
-name = "paste"
-version = "1.0.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
-
 [[package]]
 name = "path-slash"
 version = "0.2.1"
@@ -1360,9 +1337,9 @@ checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42"
 
 [[package]]
 name = "percent-encoding"
-version = "2.3.1"
+version = "2.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
 
 [[package]]
 name = "pin-project-lite"
@@ -1372,15 +1349,15 @@ checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
 
 [[package]]
 name = "pkg-config"
-version = "0.3.31"
+version = "0.3.32"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2"
+checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
 
 [[package]]
 name = "postcard"
-version = "1.1.1"
+version = "1.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8"
+checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24"
 dependencies = [
  "cobs",
  "embedded-io 0.4.0",
@@ -1389,10 +1366,19 @@ dependencies = [
 ]
 
 [[package]]
-name = "ppv-lite86"
-version = "0.2.20"
+name = "potential_utf"
+version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
+checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a"
+dependencies = [
+ "zerovec",
+]
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
 dependencies = [
  "zerocopy",
 ]
@@ -1409,9 +1395,9 @@ dependencies = [
 
 [[package]]
 name = "prettyplease"
-version = "0.2.29"
+version = "0.2.37"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac"
+checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
 dependencies = [
  "proc-macro2",
  "syn",
@@ -1419,43 +1405,48 @@ dependencies = [
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.93"
+version = "1.0.101"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99"
+checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "psm"
-version = "0.1.24"
+version = "0.1.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810"
+checksum = "6e944464ec8536cd1beb0bbfd96987eb5e3b72f2ecdafdc5c769a37f1fa2ae1f"
 dependencies = [
  "cc",
 ]
 
 [[package]]
 name = "pulley-interpreter"
-version = "29.0.1"
+version = "33.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62d95f8575df49a2708398182f49a888cf9dc30210fb1fd2df87c889edcee75d"
+checksum = "986beaef947a51d17b42b0ea18ceaa88450d35b6994737065ed505c39172db71"
 dependencies = [
  "cranelift-bitset",
  "log",
- "sptr",
  "wasmtime-math",
 ]
 
 [[package]]
 name = "quote"
-version = "1.0.38"
+version = "1.0.40"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
+checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
 dependencies = [
  "proc-macro2",
 ]
 
+[[package]]
+name = "r-efi"
+version = "5.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
+
 [[package]]
 name = "rand"
 version = "0.8.5"
@@ -1483,27 +1474,27 @@ version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
 dependencies = [
- "getrandom 0.2.15",
+ "getrandom 0.2.16",
 ]
 
 [[package]]
 name = "redox_syscall"
-version = "0.5.8"
+version = "0.5.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834"
+checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.3",
 ]
 
 [[package]]
 name = "regalloc2"
-version = "0.11.1"
+version = "0.12.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "145c1c267e14f20fb0f88aa76a1c5ffec42d592c1d28b3cd9148ae35916158d3"
+checksum = "5216b1837de2149f8bc8e6d5f88a9326b63b8c836ed58ce4a0a29ec736a59734"
 dependencies = [
  "allocator-api2",
  "bumpalo",
- "hashbrown 0.15.2",
+ "hashbrown",
  "log",
  "rustc-hash",
  "smallvec",
@@ -1523,9 +1514,9 @@ dependencies = [
 
 [[package]]
 name = "regex-automata"
-version = "0.4.9"
+version = "0.4.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
+checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -1540,22 +1531,22 @@ checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
 
 [[package]]
 name = "rgb"
-version = "0.8.50"
+version = "0.8.52"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a"
+checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce"
 dependencies = [
  "bytemuck",
 ]
 
 [[package]]
 name = "ring"
-version = "0.17.13"
+version = "0.17.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70ac5d832aa16abd7d1def883a8545280c20a60f523a370aa3a9617c2b8550ee"
+checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
 dependencies = [
  "cc",
  "cfg-if",
- "getrandom 0.2.15",
+ "getrandom 0.2.16",
  "libc",
  "untrusted",
  "windows-sys 0.52.0",
@@ -1573,7 +1564,7 @@ version = "0.38.44"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.3",
  "errno",
  "libc",
  "linux-raw-sys 0.4.15",
@@ -1582,22 +1573,22 @@ dependencies = [
 
 [[package]]
 name = "rustix"
-version = "1.0.2"
+version = "1.0.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7178faa4b75a30e269c71e61c353ce2748cf3d76f0c44c393f4e60abf49b825"
+checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.3",
  "errno",
  "libc",
- "linux-raw-sys 0.9.2",
- "windows-sys 0.59.0",
+ "linux-raw-sys 0.9.4",
+ "windows-sys 0.60.2",
 ]
 
 [[package]]
 name = "rustls"
-version = "0.23.23"
+version = "0.23.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395"
+checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc"
 dependencies = [
  "log",
  "once_cell",
@@ -1619,15 +1610,18 @@ dependencies = [
 
 [[package]]
 name = "rustls-pki-types"
-version = "1.11.0"
+version = "1.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c"
+checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79"
+dependencies = [
+ "zeroize",
+]
 
 [[package]]
 name = "rustls-webpki"
-version = "0.102.8"
+version = "0.103.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9"
+checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc"
 dependencies = [
  "ring",
  "rustls-pki-types",
@@ -1636,9 +1630,9 @@ dependencies = [
 
 [[package]]
 name = "ryu"
-version = "1.0.18"
+version = "1.0.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
+checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
 
 [[package]]
 name = "same-file"
@@ -1726,9 +1720,9 @@ checksum = "d31d263dd118560e1a492922182ab6ca6dc1d03a3bf54e7699993f31a4150e3f"
 
 [[package]]
 name = "smallvec"
-version = "1.13.2"
+version = "1.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
+checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
 dependencies = [
  "serde",
 ]
@@ -1765,9 +1759,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
 
 [[package]]
 name = "syn"
-version = "2.0.96"
+version = "2.0.106"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80"
+checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1776,9 +1770,9 @@ dependencies = [
 
 [[package]]
 name = "synstructure"
-version = "0.13.1"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
+checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1798,9 +1792,9 @@ dependencies = [
 
 [[package]]
 name = "target-lexicon"
-version = "0.13.1"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc12939a1c9b9d391e0b7135f72fd30508b73450753e28341fed159317582a77"
+checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a"
 
 [[package]]
 name = "tempfile"
@@ -1809,9 +1803,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e"
 dependencies = [
  "fastrand",
- "getrandom 0.3.1",
+ "getrandom 0.3.3",
  "once_cell",
- "rustix 1.0.2",
+ "rustix 1.0.8",
  "windows-sys 0.60.2",
 ]
 
@@ -1866,12 +1860,11 @@ dependencies = [
 
 [[package]]
 name = "thread_local"
-version = "1.1.8"
+version = "1.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
+checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185"
 dependencies = [
  "cfg-if",
- "once_cell",
 ]
 
 [[package]]
@@ -1888,9 +1881,9 @@ dependencies = [
 
 [[package]]
 name = "tinystr"
-version = "0.7.6"
+version = "0.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f"
+checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b"
 dependencies = [
  "displaydoc",
  "zerovec",
@@ -1956,9 +1949,9 @@ dependencies = [
 
 [[package]]
 name = "tracing-attributes"
-version = "0.1.28"
+version = "0.1.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
+checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1967,9 +1960,9 @@ dependencies = [
 
 [[package]]
 name = "tracing-core"
-version = "0.1.33"
+version = "0.1.34"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
+checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
 dependencies = [
  "once_cell",
 ]
@@ -2136,21 +2129,15 @@ dependencies = [
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.15"
+version = "1.0.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243"
+checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
 
 [[package]]
 name = "unicode-width"
-version = "0.2.0"
+version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd"
-
-[[package]]
-name = "unicode-xid"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
+checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c"
 
 [[package]]
 name = "unindent"
@@ -2196,9 +2183,9 @@ dependencies = [
 
 [[package]]
 name = "url"
-version = "2.5.4"
+version = "2.5.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
+checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b"
 dependencies = [
  "form_urlencoded",
  "idna",
@@ -2212,12 +2199,6 @@ version = "0.7.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
 
-[[package]]
-name = "utf16_iter"
-version = "1.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246"
-
 [[package]]
 name = "utf8-width"
 version = "0.1.7"
@@ -2242,12 +2223,6 @@ version = "0.2.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
 
-[[package]]
-name = "version_check"
-version = "0.9.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
-
 [[package]]
 name = "walkdir"
 version = "2.5.0"
@@ -2260,17 +2235,17 @@ dependencies = [
 
 [[package]]
 name = "wasi"
-version = "0.11.0+wasi-snapshot-preview1"
+version = "0.11.1+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
 
 [[package]]
 name = "wasi"
-version = "0.13.3+wasi-0.2.2"
+version = "0.14.3+wasi-0.2.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2"
+checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95"
 dependencies = [
- "wit-bindgen-rt",
+ "wit-bindgen",
 ]
 
 [[package]]
@@ -2332,25 +2307,12 @@ dependencies = [
 
 [[package]]
 name = "wasm-encoder"
-version = "0.221.2"
+version = "0.229.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c17a3bd88f2155da63a1f2fcb8a56377a24f0b6dfed12733bb5f544e86f690c5"
+checksum = "38ba1d491ecacb085a2552025c10a675a6fddcbd03b1fc9b36c536010ce265d2"
 dependencies = [
- "leb128",
- "wasmparser 0.221.2",
-]
-
-[[package]]
-name = "wasmparser"
-version = "0.221.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9845c470a2e10b61dd42c385839cdd6496363ed63b5c9e420b5488b77bd22083"
-dependencies = [
- "bitflags 2.8.0",
- "hashbrown 0.15.2",
- "indexmap",
- "semver",
- "serde",
+ "leb128fmt",
+ "wasmparser 0.229.0",
 ]
 
 [[package]]
@@ -2359,8 +2321,21 @@ version = "0.224.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "04f17a5917c2ddd3819e84c661fae0d6ba29d7b9c1f0e96c708c65a9c4188e11"
 dependencies = [
- "bitflags 2.8.0",
- "hashbrown 0.15.2",
+ "bitflags 2.9.3",
+ "hashbrown",
+ "indexmap",
+ "semver",
+ "serde",
+]
+
+[[package]]
+name = "wasmparser"
+version = "0.229.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0cc3b1f053f5d41aa55640a1fa9b6d1b8a9e4418d118ce308d20e24ff3575a8c"
+dependencies = [
+ "bitflags 2.9.3",
+ "hashbrown",
  "indexmap",
  "semver",
  "serde",
@@ -2368,27 +2343,28 @@ dependencies = [
 
 [[package]]
 name = "wasmprinter"
-version = "0.221.2"
+version = "0.229.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a80742ff1b9e6d8c231ac7c7247782c6fc5bce503af760bca071811e5fc9ee56"
+checksum = "d25dac01892684a99b8fbfaf670eb6b56edea8a096438c75392daeb83156ae2e"
 dependencies = [
  "anyhow",
  "termcolor",
- "wasmparser 0.221.2",
+ "wasmparser 0.229.0",
 ]
 
 [[package]]
 name = "wasmtime"
-version = "29.0.1"
+version = "33.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11976a250672556d1c4c04c6d5d7656ac9192ac9edc42a4587d6c21460010e69"
+checksum = "57373e1d8699662fb791270ac5dfac9da5c14f618ecf940cdb29dc3ad9472a3c"
 dependencies = [
+ "addr2line",
  "anyhow",
- "bitflags 2.8.0",
+ "bitflags 2.9.3",
  "bumpalo",
  "cc",
  "cfg-if",
- "hashbrown 0.14.5",
+ "hashbrown",
  "indexmap",
  "libc",
  "log",
@@ -2396,19 +2372,17 @@ dependencies = [
  "memfd",
  "object",
  "once_cell",
- "paste",
  "postcard",
  "psm",
  "pulley-interpreter",
- "rustix 0.38.44",
+ "rustix 1.0.8",
  "serde",
  "serde_derive",
  "smallvec",
  "sptr",
  "target-lexicon",
- "wasmparser 0.221.2",
+ "wasmparser 0.229.0",
  "wasmtime-asm-macros",
- "wasmtime-component-macro",
  "wasmtime-cranelift",
  "wasmtime-environ",
  "wasmtime-fiber",
@@ -2422,18 +2396,18 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-asm-macros"
-version = "29.0.1"
+version = "33.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f178b0d125201fbe9f75beaf849bd3e511891f9e45ba216a5b620802ccf64f2"
+checksum = "bd0fc91372865167a695dc98d0d6771799a388a7541d3f34e939d0539d6583de"
 dependencies = [
  "cfg-if",
 ]
 
 [[package]]
 name = "wasmtime-c-api-impl"
-version = "29.0.1"
+version = "33.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea30cef3608f2de5797c7bbb94c1ba4f3676d9a7f81ae86ced1b512e2766ed0c"
+checksum = "46db556f1dccdd88e0672bd407162ab0036b72e5eccb0f4398d8251cba32dba1"
 dependencies = [
  "anyhow",
  "log",
@@ -2444,40 +2418,19 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-c-api-macros"
-version = "29.0.1"
+version = "33.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "022a79ebe1124d5d384d82463d7e61c6b4dd857d81f15cb8078974eeb86db65b"
+checksum = "315cc6bc8cdc66f296accb26d7625ae64c1c7b6da6f189e8a72ce6594bf7bd36"
 dependencies = [
  "proc-macro2",
  "quote",
 ]
 
-[[package]]
-name = "wasmtime-component-macro"
-version = "29.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d74de6592ed945d0a602f71243982a304d5d02f1e501b638addf57f42d57dfaf"
-dependencies = [
- "anyhow",
- "proc-macro2",
- "quote",
- "syn",
- "wasmtime-component-util",
- "wasmtime-wit-bindgen",
- "wit-parser",
-]
-
-[[package]]
-name = "wasmtime-component-util"
-version = "29.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "707dc7b3c112ab5a366b30cfe2fb5b2f8e6a0f682f16df96a5ec582bfe6f056e"
-
 [[package]]
 name = "wasmtime-cranelift"
-version = "29.0.1"
+version = "33.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "366be722674d4bf153290fbcbc4d7d16895cc82fb3e869f8d550ff768f9e9e87"
+checksum = "b2bd72f0a6a0ffcc6a184ec86ac35c174e48ea0e97bbae277c8f15f8bf77a566"
 dependencies = [
  "anyhow",
  "cfg-if",
@@ -2487,22 +2440,23 @@ dependencies = [
  "cranelift-frontend",
  "cranelift-native",
  "gimli",
- "itertools 0.12.1",
+ "itertools 0.14.0",
  "log",
  "object",
+ "pulley-interpreter",
  "smallvec",
  "target-lexicon",
- "thiserror 1.0.69",
- "wasmparser 0.221.2",
+ "thiserror 2.0.16",
+ "wasmparser 0.229.0",
  "wasmtime-environ",
  "wasmtime-versioned-export-macros",
 ]
 
 [[package]]
 name = "wasmtime-environ"
-version = "29.0.1"
+version = "33.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdadc1af7097347aa276a4f008929810f726b5b46946971c660b6d421e9994ad"
+checksum = "e6187bb108a23eb25d2a92aa65d6c89fb5ed53433a319038a2558567f3011ff2"
 dependencies = [
  "anyhow",
  "cranelift-bitset",
@@ -2517,20 +2471,20 @@ dependencies = [
  "smallvec",
  "target-lexicon",
  "wasm-encoder",
- "wasmparser 0.221.2",
+ "wasmparser 0.229.0",
  "wasmprinter",
 ]
 
 [[package]]
 name = "wasmtime-fiber"
-version = "29.0.1"
+version = "33.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ccba90d4119f081bca91190485650730a617be1fff5228f8c4757ce133d21117"
+checksum = "dc8965d2128c012329f390e24b8b2758dd93d01bf67e1a1a0dd3d8fd72f56873"
 dependencies = [
  "anyhow",
  "cc",
  "cfg-if",
- "rustix 0.38.44",
+ "rustix 1.0.8",
  "wasmtime-asm-macros",
  "wasmtime-versioned-export-macros",
  "windows-sys 0.59.0",
@@ -2538,9 +2492,9 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-jit-icache-coherence"
-version = "29.0.1"
+version = "33.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec5e8552e01692e6c2e5293171704fed8abdec79d1a6995a0870ab190e5747d1"
+checksum = "7af0e940cb062a45c0b3f01a926f77da5947149e99beb4e3dd9846d5b8f11619"
 dependencies = [
  "anyhow",
  "cfg-if",
@@ -2550,24 +2504,24 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-math"
-version = "29.0.1"
+version = "33.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29210ec2aa25e00f4d54605cedaf080f39ec01a872c5bd520ad04c67af1dde17"
+checksum = "acfca360e719dda9a27e26944f2754ff2fd5bad88e21919c42c5a5f38ddd93cb"
 dependencies = [
  "libm",
 ]
 
 [[package]]
 name = "wasmtime-slab"
-version = "29.0.1"
+version = "33.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fcb5821a96fa04ac14bc7b158bb3d5cd7729a053db5a74dad396cd513a5e5ccf"
+checksum = "48e240559cada55c4b24af979d5f6c95e0029f5772f32027ec3c62b258aaff65"
 
 [[package]]
 name = "wasmtime-versioned-export-macros"
-version = "29.0.1"
+version = "33.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86ff86db216dc0240462de40c8290887a613dddf9685508eb39479037ba97b5b"
+checksum = "d0963c1438357a3d8c0efe152b4ef5259846c1cf8b864340270744fe5b3bae5e"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2576,33 +2530,21 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-winch"
-version = "29.0.1"
+version = "33.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fdbabfb8f20502d5e1d81092b9ead3682ae59988487aafcd7567387b7a43cf8f"
+checksum = "cbc3b117d03d6eeabfa005a880c5c22c06503bb8820f3aa2e30f0e8d87b6752f"
 dependencies = [
  "anyhow",
  "cranelift-codegen",
  "gimli",
  "object",
  "target-lexicon",
- "wasmparser 0.221.2",
+ "wasmparser 0.229.0",
  "wasmtime-cranelift",
  "wasmtime-environ",
  "winch-codegen",
 ]
 
-[[package]]
-name = "wasmtime-wit-bindgen"
-version = "29.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8358319c2dd1e4db79e3c1c5d3a5af84956615343f9f89f4e4996a36816e06e6"
-dependencies = [
- "anyhow",
- "heck",
- "indexmap",
- "wit-parser",
-]
-
 [[package]]
 name = "web-sys"
 version = "0.3.77"
@@ -2646,31 +2588,38 @@ checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d"
 
 [[package]]
 name = "winapi-util"
-version = "0.1.9"
+version = "0.1.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
+checksum = "0978bf7171b3d90bac376700cb56d606feb40f251a475a5d6634613564460b22"
 dependencies = [
- "windows-sys 0.59.0",
+ "windows-sys 0.60.2",
 ]
 
 [[package]]
 name = "winch-codegen"
-version = "29.0.1"
+version = "33.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f849ef2c5f46cb0a20af4b4487aaa239846e52e2c03f13fa3c784684552859c"
+checksum = "7914c296fbcef59d1b89a15e82384d34dc9669bc09763f2ef068a28dd3a64ebf"
 dependencies = [
  "anyhow",
+ "cranelift-assembler-x64",
  "cranelift-codegen",
  "gimli",
  "regalloc2",
  "smallvec",
  "target-lexicon",
- "thiserror 1.0.69",
- "wasmparser 0.221.2",
+ "thiserror 2.0.16",
+ "wasmparser 0.229.0",
  "wasmtime-cranelift",
  "wasmtime-environ",
 ]
 
+[[package]]
+name = "windows-link"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
+
 [[package]]
 name = "windows-sys"
 version = "0.45.0"
@@ -2704,7 +2653,7 @@ version = "0.60.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
 dependencies = [
- "windows-targets 0.53.2",
+ "windows-targets 0.53.3",
 ]
 
 [[package]]
@@ -2740,10 +2689,11 @@ dependencies = [
 
 [[package]]
 name = "windows-targets"
-version = "0.53.2"
+version = "0.53.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef"
+checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91"
 dependencies = [
+ "windows-link",
  "windows_aarch64_gnullvm 0.53.0",
  "windows_aarch64_msvc 0.53.0",
  "windows_i686_gnu 0.53.0",
@@ -2894,60 +2844,33 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
 
 [[package]]
 name = "winnow"
-version = "0.7.10"
+version = "0.7.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec"
+checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf"
 dependencies = [
  "memchr",
 ]
 
 [[package]]
-name = "wit-bindgen-rt"
-version = "0.33.0"
+name = "wit-bindgen"
+version = "0.45.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c"
-dependencies = [
- "bitflags 2.8.0",
-]
-
-[[package]]
-name = "wit-parser"
-version = "0.221.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fbe1538eea6ea5ddbe5defd0dc82539ad7ba751e1631e9185d24a931f0a5adc8"
-dependencies = [
- "anyhow",
- "id-arena",
- "indexmap",
- "log",
- "semver",
- "serde",
- "serde_derive",
- "serde_json",
- "unicode-xid",
- "wasmparser 0.221.2",
-]
-
-[[package]]
-name = "write16"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936"
+checksum = "052283831dbae3d879dc7f51f3d92703a316ca49f91540417d38591826127814"
 
 [[package]]
 name = "writeable"
-version = "0.5.5"
+version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
+checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
 
 [[package]]
 name = "xattr"
-version = "1.5.0"
+version = "1.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e"
+checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909"
 dependencies = [
  "libc",
- "rustix 1.0.2",
+ "rustix 1.0.8",
 ]
 
 [[package]]
@@ -2979,9 +2902,9 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049"
 
 [[package]]
 name = "yoke"
-version = "0.7.5"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
+checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc"
 dependencies = [
  "serde",
  "stable_deref_trait",
@@ -2991,9 +2914,9 @@ dependencies = [
 
 [[package]]
 name = "yoke-derive"
-version = "0.7.5"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
+checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -3003,19 +2926,18 @@ dependencies = [
 
 [[package]]
 name = "zerocopy"
-version = "0.7.35"
+version = "0.8.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
+checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
 dependencies = [
- "byteorder",
  "zerocopy-derive",
 ]
 
 [[package]]
 name = "zerocopy-derive"
-version = "0.7.35"
+version = "0.8.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
+checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -3024,18 +2946,18 @@ dependencies = [
 
 [[package]]
 name = "zerofrom"
-version = "0.1.5"
+version = "0.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e"
+checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
 dependencies = [
  "zerofrom-derive",
 ]
 
 [[package]]
 name = "zerofrom-derive"
-version = "0.1.5"
+version = "0.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808"
+checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -3050,10 +2972,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
 
 [[package]]
-name = "zerovec"
-version = "0.10.4"
+name = "zerotrie"
+version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079"
+checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595"
+dependencies = [
+ "displaydoc",
+ "yoke",
+ "zerofrom",
+]
+
+[[package]]
+name = "zerovec"
+version = "0.11.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b"
 dependencies = [
  "yoke",
  "zerofrom",
@@ -3062,9 +2995,9 @@ dependencies = [
 
 [[package]]
 name = "zerovec-derive"
-version = "0.10.3"
+version = "0.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
+checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
 dependencies = [
  "proc-macro2",
  "quote",
diff --git a/build.zig.zon b/build.zig.zon
index d86655e8..9151c3cc 100644
--- a/build.zig.zon
+++ b/build.zig.zon
@@ -13,63 +13,63 @@
     },
     .dependencies = .{
         .wasmtime_c_api_aarch64_android = .{
-            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-android-c-api.tar.xz",
-            .hash = "N-V-__8AAC3KCQZMd5ea2CkcbjldaVqCT7BT_9_rLMId6V__",
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-aarch64-android-c-api.tar.xz",
+            .hash = "N-V-__8AAIfPIgdw2YnV3QyiFQ2NHdrxrXzzCdjYJyxJDOta",
             .lazy = true,
         },
         .wasmtime_c_api_aarch64_linux = .{
-            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-linux-c-api.tar.xz",
-            .hash = "N-V-__8AAGUY3gU6jj2CNJAYb7HiMNVPV1FIcTCI6RSSYwXu",
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-aarch64-linux-c-api.tar.xz",
+            .hash = "N-V-__8AAIt97QZi7Pf7nNJ2mVY6uxA80Klyuvvtop3pLMRK",
             .lazy = true,
         },
         .wasmtime_c_api_aarch64_macos = .{
-            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-macos-c-api.tar.xz",
-            .hash = "N-V-__8AAM1GMARD6LGQebhVsSZ0uePUoo3Fw5nEO2L764vf",
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-aarch64-macos-c-api.tar.xz",
+            .hash = "N-V-__8AAAO48QQf91w9RmmUDHTja8DrXZA1n6Bmc8waW3qe",
             .lazy = true,
         },
         .wasmtime_c_api_aarch64_windows = .{
-            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-aarch64-windows-c-api.zip",
-            .hash = "N-V-__8AAH8a_wQ7oAeVVsaJcoOZhKTMkHIBc_XjDyLlHp2x",
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-aarch64-windows-c-api.zip",
+            .hash = "N-V-__8AAC9u4wXfqd1Q6XyQaC8_DbQZClXux60Vu5743N05",
             .lazy = true,
         },
         .wasmtime_c_api_riscv64gc_linux = .{
-            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-riscv64gc-linux-c-api.tar.xz",
-            .hash = "N-V-__8AAN2cuQadBwMc8zJxv0sMY99Ae1Nc1dZcZAK9b4DZ",
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-riscv64gc-linux-c-api.tar.xz",
+            .hash = "N-V-__8AAG8m-gc3E3AIImtTZ3l1c7HC6HUWazQ9OH5KACX4",
             .lazy = true,
         },
         .wasmtime_c_api_s390x_linux = .{
-            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-s390x-linux-c-api.tar.xz",
-            .hash = "N-V-__8AAPevngYz99mwT0KQY9my2ax1p6APzgLEJeV4II9U",
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-s390x-linux-c-api.tar.xz",
+            .hash = "N-V-__8AAH314gd-gE4IBp2uvAL3gHeuW1uUZjMiLLeUdXL_",
             .lazy = true,
         },
         .wasmtime_c_api_x86_64_android = .{
-            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-android-c-api.tar.xz",
-            .hash = "N-V-__8AABHIEgaTyzPfjgnnCy0dwJiXoDiJFblCkYOJsQvy",
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-x86_64-android-c-api.tar.xz",
+            .hash = "N-V-__8AAIPNRwfNkznebrcGb0IKUe7f35bkuZEYOjcx6q3f",
             .lazy = true,
         },
         .wasmtime_c_api_x86_64_linux = .{
-            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-linux-c-api.tar.xz",
-            .hash = "N-V-__8AALUN5AWSEDRulL9u-OJJ-l0_GoT5UFDtGWZayEIq",
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-x86_64-linux-c-api.tar.xz",
+            .hash = "N-V-__8AAI8EDwcyTtk_Afhk47SEaqfpoRqGkJeZpGs69ChF",
             .lazy = true,
         },
         .wasmtime_c_api_x86_64_macos = .{
-            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-macos-c-api.tar.xz",
-            .hash = "N-V-__8AANUeXwSPh13TqJCSSFdi87GEcHs8zK6FqE4v_TjB",
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-x86_64-macos-c-api.tar.xz",
+            .hash = "N-V-__8AAGtGNgVaOpHSxC22IjrampbRIy6lLwscdcAE8nG1",
             .lazy = true,
         },
         .wasmtime_c_api_x86_64_mingw = .{
-            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-mingw-c-api.zip",
-            .hash = "N-V-__8AALundgW-p1ffOnd7bsYyL8SY5OziDUZu7cXio2EL",
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-x86_64-mingw-c-api.zip",
+            .hash = "N-V-__8AAPS2PAbVix50L6lnddlgazCPTz3whLUFk1qnRtnZ",
             .lazy = true,
         },
         .wasmtime_c_api_x86_64_musl = .{
-            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-musl-c-api.tar.xz",
-            .hash = "N-V-__8AALMZ5wXJWW5qY-3MMjTAYR0MusckvzCsmg-69ALH",
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-x86_64-musl-c-api.tar.xz",
+            .hash = "N-V-__8AAF-WEQe0nzvi09PgusM5i46FIuCKJmIDWUleWgQ3",
             .lazy = true,
         },
         .wasmtime_c_api_x86_64_windows = .{
-            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v29.0.1/wasmtime-v29.0.1-x86_64-windows-c-api.zip",
-            .hash = "N-V-__8AAG-uVQVEDMsB1ymJzxpHcoiXo1_I3TFnPM5Zjy1i",
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-x86_64-windows-c-api.zip",
+            .hash = "N-V-__8AAKGNXwbpJQsn0_6kwSIVDDWifSg8cBzf7T2RzsC9",
             .lazy = true,
         },
     },
diff --git a/lib/Cargo.toml b/lib/Cargo.toml
index 26e84a78..d0529996 100644
--- a/lib/Cargo.toml
+++ b/lib/Cargo.toml
@@ -52,7 +52,7 @@ tree-sitter-language.workspace = true
 streaming-iterator = "0.1.9"
 
 [dependencies.wasmtime-c-api]
-version = "29.0.1"
+version = "33.0.2"
 optional = true
 package = "wasmtime-c-api-impl"
 default-features = false

From ed91767663104eb6fe4f8c8ab031452cf9663918 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Wed, 20 Aug 2025 12:48:05 +0300
Subject: [PATCH 356/663] build(rust)!: bump MSRV to 1.84.0

Required by wasmtime
---
 Cargo.toml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Cargo.toml b/Cargo.toml
index c3813a5c..799da666 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -20,7 +20,7 @@ authors = [
   "Amaan Qureshi ",
 ]
 edition = "2021"
-rust-version = "1.82"
+rust-version = "1.84"
 homepage = "https://tree-sitter.github.io/tree-sitter"
 repository = "https://github.com/tree-sitter/tree-sitter"
 license = "MIT"

From b57b7213a9fb43c4d06f738a913aa7d55c805141 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Wed, 20 Aug 2025 14:04:13 +0300
Subject: [PATCH 357/663] fix(rust): make some methods `const`

Addresses clippy::missing-const-for-fn
---
 crates/generate/src/node_types.rs | 4 ++--
 crates/highlight/src/highlight.rs | 4 ++--
 crates/loader/src/loader.rs       | 6 +++---
 crates/tags/src/tags.rs           | 2 +-
 4 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/crates/generate/src/node_types.rs b/crates/generate/src/node_types.rs
index 07be52c6..6ebb5e6d 100644
--- a/crates/generate/src/node_types.rs
+++ b/crates/generate/src/node_types.rs
@@ -102,7 +102,7 @@ impl ChildQuantity {
         }
     }
 
-    fn append(&mut self, other: Self) {
+    const fn append(&mut self, other: Self) {
         if other.exists {
             if self.exists || other.multiple {
                 self.multiple = true;
@@ -114,7 +114,7 @@ impl ChildQuantity {
         }
     }
 
-    fn union(&mut self, other: Self) -> bool {
+    const fn union(&mut self, other: Self) -> bool {
         let mut result = false;
         if !self.exists && other.exists {
             result = true;
diff --git a/crates/highlight/src/highlight.rs b/crates/highlight/src/highlight.rs
index 1f76bfc3..ee617124 100644
--- a/crates/highlight/src/highlight.rs
+++ b/crates/highlight/src/highlight.rs
@@ -275,7 +275,7 @@ impl Highlighter {
         }
     }
 
-    pub fn parser(&mut self) -> &mut Parser {
+    pub const fn parser(&mut self) -> &mut Parser {
         &mut self.parser
     }
 
@@ -1098,7 +1098,7 @@ impl HtmlRenderer {
         result
     }
 
-    pub fn set_carriage_return_highlight(&mut self, highlight: Option) {
+    pub const fn set_carriage_return_highlight(&mut self, highlight: Option) {
         self.carriage_return_highlight = highlight;
     }
 
diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs
index 1c93a54d..b6086f5c 100644
--- a/crates/loader/src/loader.rs
+++ b/crates/loader/src/loader.rs
@@ -1455,15 +1455,15 @@ impl Loader {
         }
     }
 
-    pub fn debug_build(&mut self, flag: bool) {
+    pub const fn debug_build(&mut self, flag: bool) {
         self.debug_build = flag;
     }
 
-    pub fn sanitize_build(&mut self, flag: bool) {
+    pub const fn sanitize_build(&mut self, flag: bool) {
         self.sanitize_build = flag;
     }
 
-    pub fn force_rebuild(&mut self, rebuild: bool) {
+    pub const fn force_rebuild(&mut self, rebuild: bool) {
         self.force_rebuild = rebuild;
     }
 
diff --git a/crates/tags/src/tags.rs b/crates/tags/src/tags.rs
index b139ce00..8334fac2 100644
--- a/crates/tags/src/tags.rs
+++ b/crates/tags/src/tags.rs
@@ -274,7 +274,7 @@ impl TagsContext {
         }
     }
 
-    pub fn parser(&mut self) -> &mut Parser {
+    pub const fn parser(&mut self) -> &mut Parser {
         &mut self.parser
     }
 

From e6fe91e2e78bd4391fdf7508b1fd2b80df7c470f Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Fri, 29 Aug 2025 12:44:18 +0300
Subject: [PATCH 358/663] build(zig): support wasmtime in more archs

---
 build.zig                            | 27 ++++++++--
 build.zig.zon                        | 20 +++++++
 crates/xtask/src/upgrade_wasmtime.rs | 80 ++++++++++------------------
 3 files changed, 70 insertions(+), 57 deletions(-)

diff --git a/build.zig b/build.zig
index e1b37719..66a448cb 100644
--- a/build.zig
+++ b/build.zig
@@ -60,7 +60,7 @@ pub fn wasmtimeDep(target: std.Target) []const u8 {
     const arch = target.cpu.arch;
     const os = target.os.tag;
     const abi = target.abi;
-    return switch (os) {
+    return @as(?[]const u8, switch (os) {
         .linux => switch (arch) {
             .x86_64 => switch (abi) {
                 .gnu => "wasmtime_c_api_x86_64_linux",
@@ -70,11 +70,26 @@ pub fn wasmtimeDep(target: std.Target) []const u8 {
             },
             .aarch64 => switch (abi) {
                 .gnu => "wasmtime_c_api_aarch64_linux",
+                .musl => "wasmtime_c_api_aarch64_musl",
                 .android => "wasmtime_c_api_aarch64_android",
                 else => null,
             },
-            .s390x => "wasmtime_c_api_s390x_linux",
-            .riscv64 => "wasmtime_c_api_riscv64gc_linux",
+            .x86 => switch (abi) {
+                .gnu => "wasmtime_c_api_i686_linux",
+                else => null,
+            },
+            .arm => switch (abi) {
+                .gnueabi => "wasmtime_c_api_armv7_linux",
+                else => null,
+            },
+            .s390x => switch (abi) {
+                .gnu => "wasmtime_c_api_s390x_linux",
+                else => null,
+            },
+            .riscv64 => switch (abi) {
+                .gnu => "wasmtime_c_api_riscv64gc_linux",
+                else => null,
+            },
             else => null,
         },
         .windows => switch (arch) {
@@ -87,6 +102,10 @@ pub fn wasmtimeDep(target: std.Target) []const u8 {
                 .msvc => "wasmtime_c_api_aarch64_windows",
                 else => null,
             },
+            .x86 => switch (abi) {
+                .msvc => "wasmtime_c_api_i686_windows",
+                else => null,
+            },
             else => null,
         },
         .macos => switch (arch) {
@@ -95,7 +114,7 @@ pub fn wasmtimeDep(target: std.Target) []const u8 {
             else => null,
         },
         else => null,
-    } orelse std.debug.panic(
+    }) orelse std.debug.panic(
         "Unsupported target for wasmtime: {s}-{s}-{s}",
         .{ @tagName(arch), @tagName(os), @tagName(abi) },
     );
diff --git a/build.zig.zon b/build.zig.zon
index 9151c3cc..48e52686 100644
--- a/build.zig.zon
+++ b/build.zig.zon
@@ -27,11 +27,31 @@
             .hash = "N-V-__8AAAO48QQf91w9RmmUDHTja8DrXZA1n6Bmc8waW3qe",
             .lazy = true,
         },
+        .wasmtime_c_api_aarch64_musl = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-aarch64-musl-c-api.tar.xz",
+            .hash = "N-V-__8AAI196wa9pwADoA2RbCDp5F7bKQg1iOPq6gIh8-FH",
+            .lazy = true,
+        },
         .wasmtime_c_api_aarch64_windows = .{
             .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-aarch64-windows-c-api.zip",
             .hash = "N-V-__8AAC9u4wXfqd1Q6XyQaC8_DbQZClXux60Vu5743N05",
             .lazy = true,
         },
+        .wasmtime_c_api_armv7_linux = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-armv7-linux-c-api.tar.xz",
+            .hash = "N-V-__8AAHXe8gWs3s83Cc5G6SIq0_jWxj8fGTT5xG4vb6-x",
+            .lazy = true,
+        },
+        .wasmtime_c_api_i686_linux = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-i686-linux-c-api.tar.xz",
+            .hash = "N-V-__8AAN2pzgUUfulRCYnipSfis9IIYHoTHVlieLRmKuct",
+            .lazy = true,
+        },
+        .wasmtime_c_api_i686_windows = .{
+            .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-i686-windows-c-api.zip",
+            .hash = "N-V-__8AAJu0YAUUTFBLxFIOi-MSQVezA6MMkpoFtuaf2Quf",
+            .lazy = true,
+        },
         .wasmtime_c_api_riscv64gc_linux = .{
             .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-riscv64gc-linux-c-api.tar.xz",
             .hash = "N-V-__8AAG8m-gc3E3AIImtTZ3l1c7HC6HUWazQ9OH5KACX4",
diff --git a/crates/xtask/src/upgrade_wasmtime.rs b/crates/xtask/src/upgrade_wasmtime.rs
index e4686189..f4c39ddf 100644
--- a/crates/xtask/src/upgrade_wasmtime.rs
+++ b/crates/xtask/src/upgrade_wasmtime.rs
@@ -33,7 +33,7 @@ fn update_cargo(version: &Version) -> Result<()> {
 fn zig_fetch(lines: &mut Vec, version: &Version, url_suffix: &str) -> Result<()> {
     let url = &format!("{WASMTIME_RELEASE_URL}/v{version}/wasmtime-v{version}-{url_suffix}");
     println!("  Fetching {url}");
-    lines.push(format!("      .url = \"{url}\","));
+    lines.push(format!("            .url = \"{url}\","));
 
     let output = Command::new("zig")
         .arg("fetch")
@@ -42,7 +42,7 @@ fn zig_fetch(lines: &mut Vec, version: &Version, url_suffix: &str) -> Re
         .with_context(|| format!("Failed to execute zig fetch {url}"))?;
 
     let hash = String::from_utf8_lossy(&output.stdout);
-    lines.push(format!("      .hash = \"{}\",", hash.trim_end()));
+    lines.push(format!("            .hash = \"{}\",", hash.trim_end()));
 
     Ok(())
 }
@@ -52,59 +52,33 @@ fn update_zig(version: &Version) -> Result<()> {
     let mut old_lines = file.lines();
     let new_lines = &mut Vec::with_capacity(old_lines.size_hint().0);
 
+    macro_rules! match_wasmtime_zig_dep {
+        ($line:ident, {$($platform:literal => [$($arch:literal),*]),*,}) => {
+            match $line {
+                $($(concat!("        .wasmtime_c_api_", $arch, "_", $platform, " = .{") => {
+                    let (_, _) = (old_lines.next(), old_lines.next());
+                    let suffix = if $platform == "windows" || $platform == "mingw" {
+                        concat!($arch, "-", $platform, "-c-api.zip")
+                    } else {
+                        concat!($arch, "-", $platform, "-c-api.tar.xz")
+                    };
+                    zig_fetch(new_lines, version, suffix)?;
+                })*)*
+                _ => {}
+            }
+        };
+    }
+
     while let Some(line) = old_lines.next() {
         new_lines.push(line.to_string());
-        match line {
-            "    .wasmtime_c_api_aarch64_android = .{" => {
-                let (_, _) = (old_lines.next(), old_lines.next());
-                zig_fetch(new_lines, version, "aarch64-android-c-api.tar.xz")?;
-            }
-            "    .wasmtime_c_api_aarch64_linux = .{" => {
-                let (_, _) = (old_lines.next(), old_lines.next());
-                zig_fetch(new_lines, version, "aarch64-linux-c-api.tar.xz")?;
-            }
-            "    .wasmtime_c_api_aarch64_macos = .{" => {
-                let (_, _) = (old_lines.next(), old_lines.next());
-                zig_fetch(new_lines, version, "aarch64-macos-c-api.tar.xz")?;
-            }
-            "    .wasmtime_c_api_aarch64_windows = .{" => {
-                let (_, _) = (old_lines.next(), old_lines.next());
-                zig_fetch(new_lines, version, "aarch64-windows-c-api.zip")?;
-            }
-            "    .wasmtime_c_api_riscv64gc_linux = .{" => {
-                let (_, _) = (old_lines.next(), old_lines.next());
-                zig_fetch(new_lines, version, "riscv64gc-linux-c-api.tar.xz")?;
-            }
-            "    .wasmtime_c_api_s390x_linux = .{" => {
-                let (_, _) = (old_lines.next(), old_lines.next());
-                zig_fetch(new_lines, version, "s390x-linux-c-api.tar.xz")?;
-            }
-            "    .wasmtime_c_api_x86_64_android = .{" => {
-                let (_, _) = (old_lines.next(), old_lines.next());
-                zig_fetch(new_lines, version, "x86_64-android-c-api.tar.xz")?;
-            }
-            "    .wasmtime_c_api_x86_64_linux = .{" => {
-                let (_, _) = (old_lines.next(), old_lines.next());
-                zig_fetch(new_lines, version, "x86_64-linux-c-api.tar.xz")?;
-            }
-            "    .wasmtime_c_api_x86_64_macos = .{" => {
-                let (_, _) = (old_lines.next(), old_lines.next());
-                zig_fetch(new_lines, version, "x86_64-macos-c-api.tar.xz")?;
-            }
-            "    .wasmtime_c_api_x86_64_mingw = .{" => {
-                let (_, _) = (old_lines.next(), old_lines.next());
-                zig_fetch(new_lines, version, "x86_64-mingw-c-api.zip")?;
-            }
-            "    .wasmtime_c_api_x86_64_musl = .{" => {
-                let (_, _) = (old_lines.next(), old_lines.next());
-                zig_fetch(new_lines, version, "x86_64-musl-c-api.tar.xz")?;
-            }
-            "    .wasmtime_c_api_x86_64_windows = .{" => {
-                let (_, _) = (old_lines.next(), old_lines.next());
-                zig_fetch(new_lines, version, "x86_64-windows-c-api.zip")?;
-            }
-            _ => {}
-        }
+        match_wasmtime_zig_dep!(line, {
+            "android" => ["aarch64", "x86_64"],
+            "linux"   => ["aarch64", "armv7", "i686", "riscv64gc", "s390x", "x86_64"],
+            "macos"   => ["aarch64", "x86_64"],
+            "mingw"   => ["x86_64"],
+            "musl"    => ["aarch64", "x86_64"],
+            "windows" => ["aarch64", "i686", "x86_64"],
+        });
     }
 
     std::fs::write("build.zig.zon", new_lines.join("\n") + "\n")?;

From ca27fb5d43705991c210dc784265a7389cc74dbe Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sat, 30 Aug 2025 23:11:13 +0300
Subject: [PATCH 359/663] fix(cli): fix DSL type declarations

---
 crates/cli/npm/dsl.d.ts | 16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/crates/cli/npm/dsl.d.ts b/crates/cli/npm/dsl.d.ts
index bfc89d5c..3ad9ea2a 100644
--- a/crates/cli/npm/dsl.d.ts
+++ b/crates/cli/npm/dsl.d.ts
@@ -34,12 +34,10 @@ type Rule =
   | SymbolRule
   | TokenRule;
 
-class RustRegex {
+declare class RustRegex {
   value: string;
 
-  constructor(pattern: string) {
-    this.value = pattern;
-  }
+  constructor(pattern: string);
 }
 
 type RuleOrLiteral = Rule | RegExp | RustRegex | string;
@@ -263,7 +261,7 @@ declare function optional(rule: RuleOrLiteral): ChoiceRule;
  * @see https://docs.oracle.com/cd/E19504-01/802-5880/6i9k05dh3/index.html
  */
 declare const prec: {
-  (value: String | number, rule: RuleOrLiteral): PrecRule;
+  (value: string | number, rule: RuleOrLiteral): PrecRule;
 
   /**
    * Marks the given rule as left-associative (and optionally applies a
@@ -279,7 +277,7 @@ declare const prec: {
    * @see https://docs.oracle.com/cd/E19504-01/802-5880/6i9k05dh3/index.html
    */
   left(rule: RuleOrLiteral): PrecLeftRule;
-  left(value: String | number, rule: RuleOrLiteral): PrecLeftRule;
+  left(value: string | number, rule: RuleOrLiteral): PrecLeftRule;
 
   /**
    * Marks the given rule as right-associative (and optionally applies a
@@ -295,7 +293,7 @@ declare const prec: {
    * @see https://docs.oracle.com/cd/E19504-01/802-5880/6i9k05dh3/index.html
    */
   right(rule: RuleOrLiteral): PrecRightRule;
-  right(value: String | number, rule: RuleOrLiteral): PrecRightRule;
+  right(value: string | number, rule: RuleOrLiteral): PrecRightRule;
 
   /**
    * Marks the given rule with a numerical precedence which will be used to
@@ -312,7 +310,7 @@ declare const prec: {
    *
    * @see https://www.gnu.org/software/bison/manual/html_node/Generalized-LR-Parsing.html
    */
-  dynamic(value: String | number, rule: RuleOrLiteral): PrecDynamicRule;
+  dynamic(value: string | number, rule: RuleOrLiteral): PrecDynamicRule;
 };
 
 /**
@@ -359,7 +357,7 @@ declare function sym(name: Name): SymbolRule;
 
 /**
  * Marks the given rule as producing only a single token. Tree-sitter's
- * default is to treat each String or RegExp literal in the grammar as a
+ * default is to treat each string or RegExp literal in the grammar as a
  * separate token. Each token is matched separately by the lexer and
  * returned as its own leaf node in the tree. The token function allows
  * you to express a complex rule using the DSL functions (rather

From 4db3edadf41ad1ed347b75fcb94578e3651bbb55 Mon Sep 17 00:00:00 2001
From: vemoo 
Date: Sat, 30 Aug 2025 22:51:41 +0200
Subject: [PATCH 360/663] fix(web): correct type errors, improve build

---
 lib/binding_web/lib/web-tree-sitter.d.ts |   2 +-
 lib/binding_web/package-lock.json        | 169 ++++++++++++-----------
 lib/binding_web/package.json             |  11 +-
 lib/binding_web/src/index.ts             |  22 +--
 lib/binding_web/src/language.ts          |   2 +-
 lib/binding_web/src/marshal.ts           |  11 +-
 lib/binding_web/src/node.ts              |   3 +-
 lib/binding_web/src/tree_cursor.ts       |   4 +
 lib/binding_web/tsconfig.json            |   9 +-
 9 files changed, 128 insertions(+), 105 deletions(-)

diff --git a/lib/binding_web/lib/web-tree-sitter.d.ts b/lib/binding_web/lib/web-tree-sitter.d.ts
index 428042e6..c437f65d 100644
--- a/lib/binding_web/lib/web-tree-sitter.d.ts
+++ b/lib/binding_web/lib/web-tree-sitter.d.ts
@@ -50,7 +50,7 @@ declare namespace RuntimeExports {
     function setValue(ptr: number, value: number, type?: string): void;
     let currentParseCallback: ((index: number, position: {row: number, column: number}) => string | undefined) | null;
     let currentLogCallback: ((message: string, isLex: boolean) => void) | null;
-    let currentProgressCallback: ((state: {currentOffset: number}) => void) | null;
+    let currentProgressCallback: ((state: {currentOffset: number, hasError: boolean}) => void) | null;
     let currentQueryProgressCallback: ((state: {currentOffset: number}) => void) | null;
     let HEAPF32: Float32Array;
     let HEAPF64: Float64Array;
diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json
index edc243f7..2586dfe5 100644
--- a/lib/binding_web/package-lock.json
+++ b/lib/binding_web/package-lock.json
@@ -10,7 +10,6 @@
       "license": "MIT",
       "devDependencies": {
         "@eslint/js": "^9.20.0",
-        "@types/emscripten": "^1.40.0",
         "@types/node": "^22.13.1",
         "@vitest/coverage-v8": "^3.0.5",
         "dts-buddy": "^0.5.4",
@@ -21,6 +20,14 @@
         "typescript": "^5.7.3",
         "typescript-eslint": "^8.23.0",
         "vitest": "^3.0.5"
+      },
+      "peerDependencies": {
+        "@types/emscripten": "^1.40.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/emscripten": {
+          "optional": true
+        }
       }
     },
     "node_modules/@ampproject/remapping": {
@@ -565,13 +572,13 @@
       }
     },
     "node_modules/@eslint/config-array": {
-      "version": "0.19.1",
-      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz",
-      "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==",
+      "version": "0.21.0",
+      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz",
+      "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "@eslint/object-schema": "^2.1.5",
+        "@eslint/object-schema": "^2.1.6",
         "debug": "^4.3.1",
         "minimatch": "^3.1.2"
       },
@@ -579,10 +586,20 @@
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       }
     },
+    "node_modules/@eslint/config-helpers": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz",
+      "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
     "node_modules/@eslint/core": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz",
-      "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==",
+      "version": "0.15.2",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz",
+      "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
@@ -593,9 +610,9 @@
       }
     },
     "node_modules/@eslint/eslintrc": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz",
-      "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==",
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+      "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -617,19 +634,22 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "9.20.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz",
-      "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==",
+      "version": "9.34.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz",
+      "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==",
       "dev": true,
       "license": "MIT",
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://eslint.org/donate"
       }
     },
     "node_modules/@eslint/object-schema": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz",
-      "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==",
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+      "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -637,13 +657,13 @@
       }
     },
     "node_modules/@eslint/plugin-kit": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz",
-      "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==",
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz",
+      "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "@eslint/core": "^0.10.0",
+        "@eslint/core": "^0.15.2",
         "levn": "^0.4.1"
       },
       "engines": {
@@ -703,9 +723,9 @@
       }
     },
     "node_modules/@humanwhocodes/retry": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz",
-      "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==",
+      "version": "0.4.3",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+      "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -1141,8 +1161,9 @@
       "version": "1.40.0",
       "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.40.0.tgz",
       "integrity": "sha512-MD2JJ25S4tnjnhjWyalMS6K6p0h+zQV6+Ylm+aGbiS8tSn/aHLSGNzBgduj6FB4zH0ax2GRMGYi/8G1uOxhXWA==",
-      "dev": true,
-      "license": "MIT"
+      "license": "MIT",
+      "optional": true,
+      "peer": true
     },
     "node_modules/@types/estree": {
       "version": "1.0.7",
@@ -1307,9 +1328,9 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+      "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1521,9 +1542,9 @@
       }
     },
     "node_modules/acorn": {
-      "version": "8.14.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
-      "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+      "version": "8.15.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+      "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -1614,9 +1635,9 @@
       "license": "MIT"
     },
     "node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "version": "1.1.12",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+      "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1891,22 +1912,23 @@
       }
     },
     "node_modules/eslint": {
-      "version": "9.20.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.0.tgz",
-      "integrity": "sha512-aL4F8167Hg4IvsW89ejnpTwx+B/UQRzJPGgbIOl+4XqffWsahVVsLEWoZvnrVuwpWmnRd7XeXmQI1zlKcFDteA==",
+      "version": "9.34.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz",
+      "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.12.1",
-        "@eslint/config-array": "^0.19.0",
-        "@eslint/core": "^0.11.0",
-        "@eslint/eslintrc": "^3.2.0",
-        "@eslint/js": "9.20.0",
-        "@eslint/plugin-kit": "^0.2.5",
+        "@eslint/config-array": "^0.21.0",
+        "@eslint/config-helpers": "^0.3.1",
+        "@eslint/core": "^0.15.2",
+        "@eslint/eslintrc": "^3.3.1",
+        "@eslint/js": "9.34.0",
+        "@eslint/plugin-kit": "^0.3.5",
         "@humanfs/node": "^0.16.6",
         "@humanwhocodes/module-importer": "^1.0.1",
-        "@humanwhocodes/retry": "^0.4.1",
+        "@humanwhocodes/retry": "^0.4.2",
         "@types/estree": "^1.0.6",
         "@types/json-schema": "^7.0.15",
         "ajv": "^6.12.4",
@@ -1914,9 +1936,9 @@
         "cross-spawn": "^7.0.6",
         "debug": "^4.3.2",
         "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^8.2.0",
-        "eslint-visitor-keys": "^4.2.0",
-        "espree": "^10.3.0",
+        "eslint-scope": "^8.4.0",
+        "eslint-visitor-keys": "^4.2.1",
+        "espree": "^10.4.0",
         "esquery": "^1.5.0",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
@@ -1951,9 +1973,9 @@
       }
     },
     "node_modules/eslint-scope": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz",
-      "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==",
+      "version": "8.4.0",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+      "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
@@ -1968,9 +1990,9 @@
       }
     },
     "node_modules/eslint-visitor-keys": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
-      "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+      "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -1980,29 +2002,16 @@
         "url": "https://opencollective.com/eslint"
       }
     },
-    "node_modules/eslint/node_modules/@eslint/core": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz",
-      "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@types/json-schema": "^7.0.15"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      }
-    },
     "node_modules/espree": {
-      "version": "10.3.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
-      "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+      "version": "10.4.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+      "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
-        "acorn": "^8.14.0",
+        "acorn": "^8.15.0",
         "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^4.2.0"
+        "eslint-visitor-keys": "^4.2.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2282,9 +2291,9 @@
       }
     },
     "node_modules/glob/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+      "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2369,9 +2378,9 @@
       }
     },
     "node_modules/import-fresh": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
-      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+      "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3313,9 +3322,9 @@
       }
     },
     "node_modules/test-exclude/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+      "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json
index 55d92c89..2cb64a97 100644
--- a/lib/binding_web/package.json
+++ b/lib/binding_web/package.json
@@ -71,7 +71,6 @@
   ],
   "devDependencies": {
     "@eslint/js": "^9.20.0",
-    "@types/emscripten": "^1.40.0",
     "@types/node": "^22.13.1",
     "@vitest/coverage-v8": "^3.0.5",
     "dts-buddy": "^0.5.4",
@@ -83,8 +82,16 @@
     "typescript-eslint": "^8.23.0",
     "vitest": "^3.0.5"
   },
+  "peerDependencies": {
+    "@types/emscripten": "^1.40.0"
+  },
+  "peerDependenciesMeta": {
+    "@types/emscripten": {
+      "optional": true
+    }
+  },
   "scripts": {
-    "build:ts": "node script/build.js",
+    "build:ts": "tsc -b . && node script/build.js",
     "build:wasm": "cd ../../ && cargo xtask build-wasm",
     "build:wasm:debug": "cd ../../ && cargo xtask build-wasm --debug",
     "build": "npm run build:wasm && npm run build:ts",
diff --git a/lib/binding_web/src/index.ts b/lib/binding_web/src/index.ts
index 9ac4a835..92791145 100644
--- a/lib/binding_web/src/index.ts
+++ b/lib/binding_web/src/index.ts
@@ -1,4 +1,4 @@
-export {
+export type {
   Point,
   Range,
   Edit,
@@ -7,8 +7,8 @@ export {
   LogCallback,
 } from './constants';
 export {
-  ParseOptions,
-  ParseState,
+  type ParseOptions,
+  type ParseState,
   LANGUAGE_VERSION,
   MIN_COMPATIBLE_VERSION,
   Parser,
@@ -18,14 +18,14 @@ export { Tree } from './tree';
 export { Node } from './node';
 export { TreeCursor } from './tree_cursor';
 export {
-  QueryOptions,
-  QueryState,
-  QueryProperties,
-  QueryPredicate,
-  QueryCapture,
-  QueryMatch,
+  type QueryOptions,
+  type QueryState,
+  type QueryProperties,
+  type QueryPredicate,
+  type QueryCapture,
+  type QueryMatch,
   CaptureQuantifier,
-  PredicateStep,
+  type PredicateStep,
   Query,
-}  from './query';
+} from './query';
 export { LookaheadIterator } from './lookahead_iterator';
diff --git a/lib/binding_web/src/language.ts b/lib/binding_web/src/language.ts
index a14ac987..d0c0583c 100644
--- a/lib/binding_web/src/language.ts
+++ b/lib/binding_web/src/language.ts
@@ -6,7 +6,7 @@ import { Query } from './query';
 
 const LANGUAGE_FUNCTION_REGEX = /^tree_sitter_\w+$/;
 
-export class LanguageMetadata {
+export interface LanguageMetadata {
   readonly major_version: number;
   readonly minor_version: number;
   readonly patch_version: number;
diff --git a/lib/binding_web/src/marshal.ts b/lib/binding_web/src/marshal.ts
index d52b1dfe..c742afc6 100644
--- a/lib/binding_web/src/marshal.ts
+++ b/lib/binding_web/src/marshal.ts
@@ -168,10 +168,9 @@ export function marshalEdit(edit: Edit, address = TRANSFER_BUFFER) {
  *
  * Unmarshals a {@link LanguageMetadata} from the transfer buffer.
  */
-export function unmarshalLanguageMetadata(address: number): LanguageMetadata {
-  const result = {} as LanguageMetadata;
-  result.major_version = C.getValue(address, 'i32'); address += SIZE_OF_INT;
-  result.minor_version = C.getValue(address, 'i32'); address += SIZE_OF_INT;
-  result.field_count = C.getValue(address, 'i32');
-  return result;
+export function unmarshalLanguageMetadata(address: number): LanguageMetadata {  
+  const major_version = C.getValue(address, 'i32');
+  const minor_version = C.getValue(address += SIZE_OF_INT, 'i32');
+  const patch_version = C.getValue(address += SIZE_OF_INT, 'i32');
+  return { major_version, minor_version, patch_version };
 }
diff --git a/lib/binding_web/src/node.ts b/lib/binding_web/src/node.ts
index 05d23027..aeecbd21 100644
--- a/lib/binding_web/src/node.ts
+++ b/lib/binding_web/src/node.ts
@@ -9,6 +9,7 @@ import { TRANSFER_BUFFER } from './parser';
 /** A single node within a syntax {@link Tree}. */
 export class Node {
   /** @internal */
+  // @ts-expect-error: never read
   private [0] = 0; // Internal handle for Wasm
 
   /** @internal */
@@ -635,7 +636,7 @@ export class Node {
   }
 
   /** Get the S-expression representation of this node. */
-  toString() {
+  toString(): string {
     marshalNode(this);
     const address = C._ts_node_to_string_wasm(this.tree[0]);
     const result = C.AsciiToString(address);
diff --git a/lib/binding_web/src/tree_cursor.ts b/lib/binding_web/src/tree_cursor.ts
index 5d7510d6..7562bb7f 100644
--- a/lib/binding_web/src/tree_cursor.ts
+++ b/lib/binding_web/src/tree_cursor.ts
@@ -7,15 +7,19 @@ import { getText, Tree } from './tree';
 /** A stateful object for walking a syntax {@link Tree} efficiently. */
 export class TreeCursor {
   /** @internal */
+  // @ts-expect-error: never read
   private [0] = 0; // Internal handle for Wasm
 
   /** @internal */
+  // @ts-expect-error: never read
   private [1] = 0; // Internal handle for Wasm
 
   /** @internal */
+  // @ts-expect-error: never read
   private [2] = 0; // Internal handle for Wasm
 
   /** @internal */
+  // @ts-expect-error: never read
   private [3] = 0; // Internal handle for Wasm
 
   /** @internal */
diff --git a/lib/binding_web/tsconfig.json b/lib/binding_web/tsconfig.json
index b7b45b69..b7ed356f 100644
--- a/lib/binding_web/tsconfig.json
+++ b/lib/binding_web/tsconfig.json
@@ -25,11 +25,14 @@
     "esModuleInterop": true,
     "forceConsistentCasingInFileNames": true,
     "skipLibCheck": true,
+    "composite": true,
+    "isolatedModules": true,
   },
   "include": [
-    "src/**/*",
-    "script/**/*",
-    "test/**/*",
+    "src/*.ts",
+    "script/*",
+    "test/*",
+    "lib/*.ts"
   ],
   "exclude": [
     "node_modules",

From d188bf6352993dfea320b1fdc03dcda80dfdd3ab Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Wed, 20 Aug 2025 12:01:35 +0300
Subject: [PATCH 361/663] chore: remove emscripten xtask & workflow

---
 .github/workflows/emscripten.yml       | 30 --------------------
 Cargo.lock                             |  1 -
 crates/xtask/Cargo.toml                |  1 -
 crates/xtask/src/main.rs               |  4 ---
 crates/xtask/src/upgrade_emscripten.rs | 38 --------------------------
 5 files changed, 74 deletions(-)
 delete mode 100644 .github/workflows/emscripten.yml
 delete mode 100644 crates/xtask/src/upgrade_emscripten.rs

diff --git a/.github/workflows/emscripten.yml b/.github/workflows/emscripten.yml
deleted file mode 100644
index 99eed5db..00000000
--- a/.github/workflows/emscripten.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-name: Update Emscripten
-
-on:
-  pull_request:
-    types: [opened, synchronize]
-
-permissions:
-  contents: write
-  pull-requests: read
-
-jobs:
-  update-emscripten:
-    if: github.actor == 'dependabot[bot]'
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v5
-        with:
-          ref: ${{ github.event.pull_request.head.sha }}
-
-      - name: Set up stable Rust toolchain
-        uses: actions-rust-lang/setup-rust-toolchain@v1
-
-      - name: Run emscripten update xtask
-        run: |
-          git config --global user.name "dependabot[bot]"
-          git config --global user.email "49699333+dependabot[bot]@users.noreply.github.com"
-          cargo xtask upgrade-emscripten
-
-      - name: Push updated version
-        run: git push origin HEAD:$GITHUB_HEAD_REF
diff --git a/Cargo.lock b/Cargo.lock
index 586d8c04..796472b2 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2891,7 +2891,6 @@ dependencies = [
  "serde",
  "serde_json",
  "toml",
- "ureq",
 ]
 
 [[package]]
diff --git a/crates/xtask/Cargo.toml b/crates/xtask/Cargo.toml
index 1b8a73be..23422138 100644
--- a/crates/xtask/Cargo.toml
+++ b/crates/xtask/Cargo.toml
@@ -27,6 +27,5 @@ regex.workspace = true
 semver.workspace = true
 serde.workspace = true
 serde_json.workspace = true
-ureq = "3.1.0"
 notify = "8.2.0"
 notify-debouncer-full = "0.6.0"
diff --git a/crates/xtask/src/main.rs b/crates/xtask/src/main.rs
index 46c25938..feba36d4 100644
--- a/crates/xtask/src/main.rs
+++ b/crates/xtask/src/main.rs
@@ -6,7 +6,6 @@ mod clippy;
 mod fetch;
 mod generate;
 mod test;
-mod upgrade_emscripten;
 mod upgrade_wasmtime;
 
 use std::path::Path;
@@ -49,8 +48,6 @@ enum Commands {
     TestWasm,
     /// Upgrade the wasmtime dependency.
     UpgradeWasmtime(UpgradeWasmtime),
-    /// Upgrade the emscripten file.
-    UpgradeEmscripten,
 }
 
 #[derive(Args)]
@@ -236,7 +233,6 @@ fn run() -> Result<()> {
         Commands::UpgradeWasmtime(upgrade_wasmtime_options) => {
             upgrade_wasmtime::run(&upgrade_wasmtime_options)?;
         }
-        Commands::UpgradeEmscripten => upgrade_emscripten::run()?,
     }
 
     Ok(())
diff --git a/crates/xtask/src/upgrade_emscripten.rs b/crates/xtask/src/upgrade_emscripten.rs
deleted file mode 100644
index 3fe8396f..00000000
--- a/crates/xtask/src/upgrade_emscripten.rs
+++ /dev/null
@@ -1,38 +0,0 @@
-use anyhow::{anyhow, Result};
-use git2::Repository;
-use serde_json::Value;
-use std::fs;
-
-use crate::{create_commit, root_dir};
-
-pub fn run() -> Result<()> {
-    let response = ureq::get("https://api.github.com/repos/emscripten-core/emsdk/tags")
-        .call()?
-        .body_mut()
-        .read_to_string()?;
-
-    let json = serde_json::from_str::(&response)?;
-    let version = json
-        .as_array()
-        .and_then(|arr| arr.first())
-        .and_then(|tag| tag["name"].as_str())
-        .ok_or(anyhow!("No tags found"))?;
-
-    let version_file = root_dir()
-        .join("crates")
-        .join("loader")
-        .join("emscripten-version");
-
-    fs::write(version_file, version)?;
-
-    println!("Upgraded emscripten version to {version}");
-
-    let repo = Repository::open(".")?;
-    create_commit(
-        &repo,
-        &format!("build(deps): bump emscripten to {version}"),
-        &["crates/loader/emscripten-version"],
-    )?;
-
-    Ok(())
-}

From ed2abf860986ce2064e5562068fad6e0670952ac Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sat, 30 Aug 2025 23:03:56 +0300
Subject: [PATCH 362/663] ci(dependabot): update npm dependencies

---
 .github/dependabot.yml | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index ccba319b..1466f049 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -24,3 +24,18 @@ updates:
     groups:
       actions:
         patterns: ["*"]
+  - package-ecosystem: "npm"
+    directories:
+      - "/crates/npm"
+      - "/crates/eslint"
+      - "/lib/binding_web"
+    schedule:
+      interval: "weekly"
+    commit-message:
+      prefix: "build(deps)"
+    labels:
+      - "dependencies"
+      - "npm"
+    groups:
+      npm:
+        patterns: ["*"]

From a80cd86d4776762b5a4cf140434262dff7f83a73 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sat, 30 Aug 2025 23:11:13 +0300
Subject: [PATCH 363/663] fix(cli): fix DSL type declarations

(cherry picked from commit ca27fb5d43705991c210dc784265a7389cc74dbe)
---
 cli/npm/dsl.d.ts | 16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/cli/npm/dsl.d.ts b/cli/npm/dsl.d.ts
index bfc89d5c..3ad9ea2a 100644
--- a/cli/npm/dsl.d.ts
+++ b/cli/npm/dsl.d.ts
@@ -34,12 +34,10 @@ type Rule =
   | SymbolRule
   | TokenRule;
 
-class RustRegex {
+declare class RustRegex {
   value: string;
 
-  constructor(pattern: string) {
-    this.value = pattern;
-  }
+  constructor(pattern: string);
 }
 
 type RuleOrLiteral = Rule | RegExp | RustRegex | string;
@@ -263,7 +261,7 @@ declare function optional(rule: RuleOrLiteral): ChoiceRule;
  * @see https://docs.oracle.com/cd/E19504-01/802-5880/6i9k05dh3/index.html
  */
 declare const prec: {
-  (value: String | number, rule: RuleOrLiteral): PrecRule;
+  (value: string | number, rule: RuleOrLiteral): PrecRule;
 
   /**
    * Marks the given rule as left-associative (and optionally applies a
@@ -279,7 +277,7 @@ declare const prec: {
    * @see https://docs.oracle.com/cd/E19504-01/802-5880/6i9k05dh3/index.html
    */
   left(rule: RuleOrLiteral): PrecLeftRule;
-  left(value: String | number, rule: RuleOrLiteral): PrecLeftRule;
+  left(value: string | number, rule: RuleOrLiteral): PrecLeftRule;
 
   /**
    * Marks the given rule as right-associative (and optionally applies a
@@ -295,7 +293,7 @@ declare const prec: {
    * @see https://docs.oracle.com/cd/E19504-01/802-5880/6i9k05dh3/index.html
    */
   right(rule: RuleOrLiteral): PrecRightRule;
-  right(value: String | number, rule: RuleOrLiteral): PrecRightRule;
+  right(value: string | number, rule: RuleOrLiteral): PrecRightRule;
 
   /**
    * Marks the given rule with a numerical precedence which will be used to
@@ -312,7 +310,7 @@ declare const prec: {
    *
    * @see https://www.gnu.org/software/bison/manual/html_node/Generalized-LR-Parsing.html
    */
-  dynamic(value: String | number, rule: RuleOrLiteral): PrecDynamicRule;
+  dynamic(value: string | number, rule: RuleOrLiteral): PrecDynamicRule;
 };
 
 /**
@@ -359,7 +357,7 @@ declare function sym(name: Name): SymbolRule;
 
 /**
  * Marks the given rule as producing only a single token. Tree-sitter's
- * default is to treat each String or RegExp literal in the grammar as a
+ * default is to treat each string or RegExp literal in the grammar as a
  * separate token. Each token is matched separately by the lexer and
  * returned as its own leaf node in the tree. The token function allows
  * you to express a complex rule using the DSL functions (rather

From 90bdd63a7175fe5341d7f416776d04abd7516c00 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sat, 30 Aug 2025 22:54:11 +0300
Subject: [PATCH 364/663] fix(npm): add directory to repository fields

and remove non-existent "main" entry point
---
 crates/cli/eslint/package.json | 3 ++-
 crates/cli/npm/package.json    | 4 ++--
 lib/binding_web/package.json   | 7 +++++--
 3 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/crates/cli/eslint/package.json b/crates/cli/eslint/package.json
index d53bf3a4..a3ba26c9 100644
--- a/crates/cli/eslint/package.json
+++ b/crates/cli/eslint/package.json
@@ -4,7 +4,8 @@
   "description": "Eslint configuration for Tree-sitter grammar files",
   "repository": {
     "type": "git",
-    "url": "git+https://github.com/tree-sitter/tree-sitter.git"
+    "url": "git+https://github.com/tree-sitter/tree-sitter.git",
+    "directory": "crates/cli/eslint"
   },
   "license": "MIT",
   "author": "Amaan Qureshi ",
diff --git a/crates/cli/npm/package.json b/crates/cli/npm/package.json
index 0f28481a..695fc26f 100644
--- a/crates/cli/npm/package.json
+++ b/crates/cli/npm/package.json
@@ -14,14 +14,14 @@
   "license": "MIT",
   "repository": {
     "type": "git",
-    "url": "https://github.com/tree-sitter/tree-sitter.git"
+    "url": "git+https://github.com/tree-sitter/tree-sitter.git",
+    "directory": "crates/cli/npm"
   },
   "description": "CLI for generating fast incremental parsers",
   "keywords": [
     "parser",
     "lexer"
   ],
-  "main": "lib/api/index.js",
   "engines": {
     "node": ">=12.0.0"
   },
diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json
index 2cb64a97..f2ae62aa 100644
--- a/lib/binding_web/package.json
+++ b/lib/binding_web/package.json
@@ -2,8 +2,11 @@
   "name": "web-tree-sitter",
   "version": "0.26.0",
   "description": "Tree-sitter bindings for the web",
-  "repository": "https://github.com/tree-sitter/tree-sitter",
-  "homepage": "https://github.com/tree-sitter/tree-sitter/tree/master/lib/binding_web",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/tree-sitter/tree-sitter.git",
+    "directory": "lib/binding_web"
+  },
   "license": "MIT",
   "author": {
     "name": "Max Brunsfeld",

From 59f3cb91c2d8f5bd8851d2cefd204473f2fe6cec Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sat, 30 Aug 2025 22:54:11 +0300
Subject: [PATCH 365/663] fix(npm): add directory to repository fields

and remove non-existent "main" entry point

(cherry picked from commit 90bdd63a7175fe5341d7f416776d04abd7516c00)
---
 cli/eslint/package.json      | 3 ++-
 cli/npm/package.json         | 4 ++--
 lib/binding_web/package.json | 7 +++++--
 3 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/cli/eslint/package.json b/cli/eslint/package.json
index d53bf3a4..a3ba26c9 100644
--- a/cli/eslint/package.json
+++ b/cli/eslint/package.json
@@ -4,7 +4,8 @@
   "description": "Eslint configuration for Tree-sitter grammar files",
   "repository": {
     "type": "git",
-    "url": "git+https://github.com/tree-sitter/tree-sitter.git"
+    "url": "git+https://github.com/tree-sitter/tree-sitter.git",
+    "directory": "crates/cli/eslint"
   },
   "license": "MIT",
   "author": "Amaan Qureshi ",
diff --git a/cli/npm/package.json b/cli/npm/package.json
index dddff0a9..34ef9901 100644
--- a/cli/npm/package.json
+++ b/cli/npm/package.json
@@ -14,14 +14,14 @@
   "license": "MIT",
   "repository": {
     "type": "git",
-    "url": "https://github.com/tree-sitter/tree-sitter.git"
+    "url": "git+https://github.com/tree-sitter/tree-sitter.git",
+    "directory": "crates/cli/npm"
   },
   "description": "CLI for generating fast incremental parsers",
   "keywords": [
     "parser",
     "lexer"
   ],
-  "main": "lib/api/index.js",
   "engines": {
     "node": ">=12.0.0"
   },
diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json
index 72ca73ca..9945c51d 100644
--- a/lib/binding_web/package.json
+++ b/lib/binding_web/package.json
@@ -2,8 +2,11 @@
   "name": "web-tree-sitter",
   "version": "0.25.8",
   "description": "Tree-sitter bindings for the web",
-  "repository": "https://github.com/tree-sitter/tree-sitter",
-  "homepage": "https://github.com/tree-sitter/tree-sitter/tree/master/lib/binding_web",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/tree-sitter/tree-sitter.git",
+    "directory": "lib/binding_web"
+  },
   "license": "MIT",
   "author": {
     "name": "Max Brunsfeld",

From a866eb5dd080813b41dd23a38688119469c711cd Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sat, 30 Aug 2025 21:10:53 +0000
Subject: [PATCH 366/663] build(deps): bump the npm group across 1 directory
 with 9 updates

Bumps the npm group with 8 updates in the /lib/binding_web directory:

| Package | From | To |
| --- | --- | --- |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `22.13.1` | `24.3.0` |
| [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) | `3.0.5` | `3.2.4` |
| [dts-buddy](https://github.com/Rich-Harris/dts-buddy) | `0.5.4` | `0.6.2` |
| [esbuild](https://github.com/evanw/esbuild) | `0.25.0` | `0.25.9` |
| [source-map](https://github.com/mozilla/source-map) | `0.7.4` | `0.7.6` |
| [tsx](https://github.com/privatenumber/tsx) | `4.20.3` | `4.20.5` |
| [typescript](https://github.com/microsoft/TypeScript) | `5.7.3` | `5.9.2` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.23.0` | `8.41.0` |



Updates `@types/node` from 22.13.1 to 24.3.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@vitest/coverage-v8` from 3.0.5 to 3.2.4
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v3.2.4/packages/coverage-v8)

Updates `dts-buddy` from 0.5.4 to 0.6.2
- [Release notes](https://github.com/Rich-Harris/dts-buddy/releases)
- [Changelog](https://github.com/sveltejs/dts-buddy/blob/main/CHANGELOG.md)
- [Commits](https://github.com/Rich-Harris/dts-buddy/compare/v0.5.4...v0.6.2)

Updates `esbuild` from 0.25.0 to 0.25.9
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.25.0...v0.25.9)

Updates `source-map` from 0.7.4 to 0.7.6
- [Release notes](https://github.com/mozilla/source-map/releases)
- [Changelog](https://github.com/mozilla/source-map/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mozilla/source-map/compare/v0.7.4...0.7.6)

Updates `tsx` from 4.20.3 to 4.20.5
- [Release notes](https://github.com/privatenumber/tsx/releases)
- [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs)
- [Commits](https://github.com/privatenumber/tsx/compare/v4.20.3...v4.20.5)

Updates `typescript` from 5.7.3 to 5.9.2
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release-publish.yml)
- [Commits](https://github.com/microsoft/TypeScript/compare/v5.7.3...v5.9.2)

Updates `typescript-eslint` from 8.23.0 to 8.41.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.41.0/packages/typescript-eslint)

Updates `vitest` from 3.0.5 to 3.2.4
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v3.2.4/packages/vitest)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.3.0
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: npm
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 3.2.4
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm
- dependency-name: dts-buddy
  dependency-version: 0.6.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm
- dependency-name: esbuild
  dependency-version: 0.25.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: source-map
  dependency-version: 0.7.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: tsx
  dependency-version: 4.20.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: typescript
  dependency-version: 5.9.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm
- dependency-name: typescript-eslint
  dependency-version: 8.41.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm
- dependency-name: vitest
  dependency-version: 3.2.4
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm
...

Signed-off-by: dependabot[bot] 
---
 lib/binding_web/package-lock.json | 1019 ++++++++++++++++-------------
 lib/binding_web/package.json      |    4 +-
 2 files changed, 571 insertions(+), 452 deletions(-)

diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json
index 2586dfe5..f923e813 100644
--- a/lib/binding_web/package-lock.json
+++ b/lib/binding_web/package-lock.json
@@ -10,9 +10,9 @@
       "license": "MIT",
       "devDependencies": {
         "@eslint/js": "^9.20.0",
-        "@types/node": "^22.13.1",
+        "@types/node": "^24.3.0",
         "@vitest/coverage-v8": "^3.0.5",
-        "dts-buddy": "^0.5.4",
+        "dts-buddy": "^0.6.2",
         "esbuild": "^0.25.0",
         "eslint": "^9.20.0",
         "source-map": "^0.7.4",
@@ -105,9 +105,9 @@
       }
     },
     "node_modules/@esbuild/aix-ppc64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz",
-      "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz",
+      "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==",
       "cpu": [
         "ppc64"
       ],
@@ -122,9 +122,9 @@
       }
     },
     "node_modules/@esbuild/android-arm": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz",
-      "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz",
+      "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==",
       "cpu": [
         "arm"
       ],
@@ -139,9 +139,9 @@
       }
     },
     "node_modules/@esbuild/android-arm64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz",
-      "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz",
+      "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==",
       "cpu": [
         "arm64"
       ],
@@ -156,9 +156,9 @@
       }
     },
     "node_modules/@esbuild/android-x64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz",
-      "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz",
+      "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==",
       "cpu": [
         "x64"
       ],
@@ -173,9 +173,9 @@
       }
     },
     "node_modules/@esbuild/darwin-arm64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz",
-      "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz",
+      "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==",
       "cpu": [
         "arm64"
       ],
@@ -190,9 +190,9 @@
       }
     },
     "node_modules/@esbuild/darwin-x64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz",
-      "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz",
+      "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==",
       "cpu": [
         "x64"
       ],
@@ -207,9 +207,9 @@
       }
     },
     "node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz",
-      "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz",
+      "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==",
       "cpu": [
         "arm64"
       ],
@@ -224,9 +224,9 @@
       }
     },
     "node_modules/@esbuild/freebsd-x64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz",
-      "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz",
+      "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==",
       "cpu": [
         "x64"
       ],
@@ -241,9 +241,9 @@
       }
     },
     "node_modules/@esbuild/linux-arm": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz",
-      "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz",
+      "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==",
       "cpu": [
         "arm"
       ],
@@ -258,9 +258,9 @@
       }
     },
     "node_modules/@esbuild/linux-arm64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz",
-      "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz",
+      "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==",
       "cpu": [
         "arm64"
       ],
@@ -275,9 +275,9 @@
       }
     },
     "node_modules/@esbuild/linux-ia32": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz",
-      "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz",
+      "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==",
       "cpu": [
         "ia32"
       ],
@@ -292,9 +292,9 @@
       }
     },
     "node_modules/@esbuild/linux-loong64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz",
-      "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz",
+      "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==",
       "cpu": [
         "loong64"
       ],
@@ -309,9 +309,9 @@
       }
     },
     "node_modules/@esbuild/linux-mips64el": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz",
-      "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz",
+      "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==",
       "cpu": [
         "mips64el"
       ],
@@ -326,9 +326,9 @@
       }
     },
     "node_modules/@esbuild/linux-ppc64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz",
-      "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz",
+      "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==",
       "cpu": [
         "ppc64"
       ],
@@ -343,9 +343,9 @@
       }
     },
     "node_modules/@esbuild/linux-riscv64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz",
-      "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz",
+      "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==",
       "cpu": [
         "riscv64"
       ],
@@ -360,9 +360,9 @@
       }
     },
     "node_modules/@esbuild/linux-s390x": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz",
-      "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz",
+      "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==",
       "cpu": [
         "s390x"
       ],
@@ -377,9 +377,9 @@
       }
     },
     "node_modules/@esbuild/linux-x64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz",
-      "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz",
+      "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==",
       "cpu": [
         "x64"
       ],
@@ -394,9 +394,9 @@
       }
     },
     "node_modules/@esbuild/netbsd-arm64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz",
-      "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz",
+      "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==",
       "cpu": [
         "arm64"
       ],
@@ -411,9 +411,9 @@
       }
     },
     "node_modules/@esbuild/netbsd-x64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz",
-      "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz",
+      "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==",
       "cpu": [
         "x64"
       ],
@@ -428,9 +428,9 @@
       }
     },
     "node_modules/@esbuild/openbsd-arm64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz",
-      "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz",
+      "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==",
       "cpu": [
         "arm64"
       ],
@@ -445,9 +445,9 @@
       }
     },
     "node_modules/@esbuild/openbsd-x64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz",
-      "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz",
+      "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==",
       "cpu": [
         "x64"
       ],
@@ -461,10 +461,27 @@
         "node": ">=18"
       }
     },
+    "node_modules/@esbuild/openharmony-arm64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz",
+      "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openharmony"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/@esbuild/sunos-x64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz",
-      "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz",
+      "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==",
       "cpu": [
         "x64"
       ],
@@ -479,9 +496,9 @@
       }
     },
     "node_modules/@esbuild/win32-arm64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz",
-      "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz",
+      "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==",
       "cpu": [
         "arm64"
       ],
@@ -496,9 +513,9 @@
       }
     },
     "node_modules/@esbuild/win32-ia32": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz",
-      "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz",
+      "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==",
       "cpu": [
         "ia32"
       ],
@@ -513,9 +530,9 @@
       }
     },
     "node_modules/@esbuild/win32-x64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz",
-      "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz",
+      "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==",
       "cpu": [
         "x64"
       ],
@@ -530,9 +547,9 @@
       }
     },
     "node_modules/@eslint-community/eslint-utils": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
-      "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
+      "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -818,9 +835,9 @@
       "license": "MIT"
     },
     "node_modules/@jridgewell/trace-mapping": {
-      "version": "0.3.25",
-      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
-      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+      "version": "0.3.30",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz",
+      "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -878,9 +895,9 @@
       }
     },
     "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz",
-      "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.49.0.tgz",
+      "integrity": "sha512-rlKIeL854Ed0e09QGYFlmDNbka6I3EQFw7iZuugQjMb11KMpJCLPFL4ZPbMfaEhLADEL1yx0oujGkBQ7+qW3eA==",
       "cpu": [
         "arm"
       ],
@@ -892,9 +909,9 @@
       ]
     },
     "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz",
-      "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.49.0.tgz",
+      "integrity": "sha512-cqPpZdKUSQYRtLLr6R4X3sD4jCBO1zUmeo3qrWBCqYIeH8Q3KRL4F3V7XJ2Rm8/RJOQBZuqzQGWPjjvFUcYa/w==",
       "cpu": [
         "arm64"
       ],
@@ -906,9 +923,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz",
-      "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.49.0.tgz",
+      "integrity": "sha512-99kMMSMQT7got6iYX3yyIiJfFndpojBmkHfTc1rIje8VbjhmqBXE+nb7ZZP3A5skLyujvT0eIUCUsxAe6NjWbw==",
       "cpu": [
         "arm64"
       ],
@@ -920,9 +937,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz",
-      "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.49.0.tgz",
+      "integrity": "sha512-y8cXoD3wdWUDpjOLMKLx6l+NFz3NlkWKcBCBfttUn+VGSfgsQ5o/yDUGtzE9HvsodkP0+16N0P4Ty1VuhtRUGg==",
       "cpu": [
         "x64"
       ],
@@ -934,9 +951,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-arm64": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz",
-      "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.49.0.tgz",
+      "integrity": "sha512-3mY5Pr7qv4GS4ZvWoSP8zha8YoiqrU+e0ViPvB549jvliBbdNLrg2ywPGkgLC3cmvN8ya3za+Q2xVyT6z+vZqA==",
       "cpu": [
         "arm64"
       ],
@@ -948,9 +965,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-x64": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz",
-      "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.49.0.tgz",
+      "integrity": "sha512-C9KzzOAQU5gU4kG8DTk+tjdKjpWhVWd5uVkinCwwFub2m7cDYLOdtXoMrExfeBmeRy9kBQMkiyJ+HULyF1yj9w==",
       "cpu": [
         "x64"
       ],
@@ -962,9 +979,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz",
-      "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.49.0.tgz",
+      "integrity": "sha512-OVSQgEZDVLnTbMq5NBs6xkmz3AADByCWI4RdKSFNlDsYXdFtlxS59J+w+LippJe8KcmeSSM3ba+GlsM9+WwC1w==",
       "cpu": [
         "arm"
       ],
@@ -976,9 +993,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz",
-      "integrity": "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.49.0.tgz",
+      "integrity": "sha512-ZnfSFA7fDUHNa4P3VwAcfaBLakCbYaxCk0jUnS3dTou9P95kwoOLAMlT3WmEJDBCSrOEFFV0Y1HXiwfLYJuLlA==",
       "cpu": [
         "arm"
       ],
@@ -990,9 +1007,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz",
-      "integrity": "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.49.0.tgz",
+      "integrity": "sha512-Z81u+gfrobVK2iV7GqZCBfEB1y6+I61AH466lNK+xy1jfqFLiQ9Qv716WUM5fxFrYxwC7ziVdZRU9qvGHkYIJg==",
       "cpu": [
         "arm64"
       ],
@@ -1004,9 +1021,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz",
-      "integrity": "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.49.0.tgz",
+      "integrity": "sha512-zoAwS0KCXSnTp9NH/h9aamBAIve0DXeYpll85shf9NJ0URjSTzzS+Z9evmolN+ICfD3v8skKUPyk2PO0uGdFqg==",
       "cpu": [
         "arm64"
       ],
@@ -1018,9 +1035,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz",
-      "integrity": "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.49.0.tgz",
+      "integrity": "sha512-2QyUyQQ1ZtwZGiq0nvODL+vLJBtciItC3/5cYN8ncDQcv5avrt2MbKt1XU/vFAJlLta5KujqyHdYtdag4YEjYQ==",
       "cpu": [
         "loong64"
       ],
@@ -1031,10 +1048,10 @@
         "linux"
       ]
     },
-    "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz",
-      "integrity": "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==",
+    "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.49.0.tgz",
+      "integrity": "sha512-k9aEmOWt+mrMuD3skjVJSSxHckJp+SiFzFG+v8JLXbc/xi9hv2icSkR3U7uQzqy+/QbbYY7iNB9eDTwrELo14g==",
       "cpu": [
         "ppc64"
       ],
@@ -1046,9 +1063,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz",
-      "integrity": "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.49.0.tgz",
+      "integrity": "sha512-rDKRFFIWJ/zJn6uk2IdYLc09Z7zkE5IFIOWqpuU0o6ZpHcdniAyWkwSUWE/Z25N/wNDmFHHMzin84qW7Wzkjsw==",
       "cpu": [
         "riscv64"
       ],
@@ -1060,9 +1077,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-riscv64-musl": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz",
-      "integrity": "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.49.0.tgz",
+      "integrity": "sha512-FkkhIY/hYFVnOzz1WeV3S9Bd1h0hda/gRqvZCMpHWDHdiIHn6pqsY3b5eSbvGccWHMQ1uUzgZTKS4oGpykf8Tw==",
       "cpu": [
         "riscv64"
       ],
@@ -1074,9 +1091,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz",
-      "integrity": "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.49.0.tgz",
+      "integrity": "sha512-gRf5c+A7QiOG3UwLyOOtyJMD31JJhMjBvpfhAitPAoqZFcOeK3Kc1Veg1z/trmt+2P6F/biT02fU19GGTS529A==",
       "cpu": [
         "s390x"
       ],
@@ -1088,9 +1105,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz",
-      "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.49.0.tgz",
+      "integrity": "sha512-BR7+blScdLW1h/2hB/2oXM+dhTmpW3rQt1DeSiCP9mc2NMMkqVgjIN3DDsNpKmezffGC9R8XKVOLmBkRUcK/sA==",
       "cpu": [
         "x64"
       ],
@@ -1102,9 +1119,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz",
-      "integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.49.0.tgz",
+      "integrity": "sha512-hDMOAe+6nX3V5ei1I7Au3wcr9h3ktKzDvF2ne5ovX8RZiAHEtX1A5SNNk4zt1Qt77CmnbqT+upb/umzoPMWiPg==",
       "cpu": [
         "x64"
       ],
@@ -1116,9 +1133,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz",
-      "integrity": "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.49.0.tgz",
+      "integrity": "sha512-wkNRzfiIGaElC9kXUT+HLx17z7D0jl+9tGYRKwd8r7cUqTL7GYAvgUY++U2hK6Ar7z5Z6IRRoWC8kQxpmM7TDA==",
       "cpu": [
         "arm64"
       ],
@@ -1130,9 +1147,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz",
-      "integrity": "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.49.0.tgz",
+      "integrity": "sha512-gq5aW/SyNpjp71AAzroH37DtINDcX1Qw2iv9Chyz49ZgdOP3NV8QCyKZUrGsYX9Yyggj5soFiRCgsL3HwD8TdA==",
       "cpu": [
         "ia32"
       ],
@@ -1144,9 +1161,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz",
-      "integrity": "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.49.0.tgz",
+      "integrity": "sha512-gEtqFbzmZLFk2xKh7g0Rlo8xzho8KrEFEkzvHbfUGkrgXOpZ4XagQ6n+wIZFNh1nTb8UD16J4nFSFKXYgnbdBg==",
       "cpu": [
         "x64"
       ],
@@ -1157,6 +1174,23 @@
         "win32"
       ]
     },
+    "node_modules/@types/chai": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz",
+      "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/deep-eql": "*"
+      }
+    },
+    "node_modules/@types/deep-eql": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
+      "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/@types/emscripten": {
       "version": "1.40.0",
       "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.40.0.tgz",
@@ -1166,9 +1200,9 @@
       "peer": true
     },
     "node_modules/@types/estree": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
-      "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+      "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
       "dev": true,
       "license": "MIT"
     },
@@ -1180,31 +1214,31 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "22.13.1",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz",
-      "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==",
+      "version": "24.3.0",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz",
+      "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "undici-types": "~6.20.0"
+        "undici-types": "~7.10.0"
       }
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.23.0.tgz",
-      "integrity": "sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==",
+      "version": "8.41.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.41.0.tgz",
+      "integrity": "sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.23.0",
-        "@typescript-eslint/type-utils": "8.23.0",
-        "@typescript-eslint/utils": "8.23.0",
-        "@typescript-eslint/visitor-keys": "8.23.0",
+        "@typescript-eslint/scope-manager": "8.41.0",
+        "@typescript-eslint/type-utils": "8.41.0",
+        "@typescript-eslint/utils": "8.41.0",
+        "@typescript-eslint/visitor-keys": "8.41.0",
         "graphemer": "^1.4.0",
-        "ignore": "^5.3.1",
+        "ignore": "^7.0.0",
         "natural-compare": "^1.4.0",
-        "ts-api-utils": "^2.0.1"
+        "ts-api-utils": "^2.1.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1214,22 +1248,32 @@
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
+        "@typescript-eslint/parser": "^8.41.0",
         "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.8.0"
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+      "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.23.0.tgz",
-      "integrity": "sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==",
+      "version": "8.41.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.41.0.tgz",
+      "integrity": "sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.23.0",
-        "@typescript-eslint/types": "8.23.0",
-        "@typescript-eslint/typescript-estree": "8.23.0",
-        "@typescript-eslint/visitor-keys": "8.23.0",
+        "@typescript-eslint/scope-manager": "8.41.0",
+        "@typescript-eslint/types": "8.41.0",
+        "@typescript-eslint/typescript-estree": "8.41.0",
+        "@typescript-eslint/visitor-keys": "8.41.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -1241,18 +1285,40 @@
       },
       "peerDependencies": {
         "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.8.0"
+        "typescript": ">=4.8.4 <6.0.0"
       }
     },
-    "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.23.0.tgz",
-      "integrity": "sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==",
+    "node_modules/@typescript-eslint/project-service": {
+      "version": "8.41.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.41.0.tgz",
+      "integrity": "sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.23.0",
-        "@typescript-eslint/visitor-keys": "8.23.0"
+        "@typescript-eslint/tsconfig-utils": "^8.41.0",
+        "@typescript-eslint/types": "^8.41.0",
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/scope-manager": {
+      "version": "8.41.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz",
+      "integrity": "sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/types": "8.41.0",
+        "@typescript-eslint/visitor-keys": "8.41.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1262,17 +1328,35 @@
         "url": "https://opencollective.com/typescript-eslint"
       }
     },
+    "node_modules/@typescript-eslint/tsconfig-utils": {
+      "version": "8.41.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz",
+      "integrity": "sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.23.0.tgz",
-      "integrity": "sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==",
+      "version": "8.41.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.41.0.tgz",
+      "integrity": "sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "8.23.0",
-        "@typescript-eslint/utils": "8.23.0",
+        "@typescript-eslint/types": "8.41.0",
+        "@typescript-eslint/typescript-estree": "8.41.0",
+        "@typescript-eslint/utils": "8.41.0",
         "debug": "^4.3.4",
-        "ts-api-utils": "^2.0.1"
+        "ts-api-utils": "^2.1.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1283,13 +1367,13 @@
       },
       "peerDependencies": {
         "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.8.0"
+        "typescript": ">=4.8.4 <6.0.0"
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.23.0.tgz",
-      "integrity": "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==",
+      "version": "8.41.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz",
+      "integrity": "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -1301,20 +1385,22 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.23.0.tgz",
-      "integrity": "sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==",
+      "version": "8.41.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz",
+      "integrity": "sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.23.0",
-        "@typescript-eslint/visitor-keys": "8.23.0",
+        "@typescript-eslint/project-service": "8.41.0",
+        "@typescript-eslint/tsconfig-utils": "8.41.0",
+        "@typescript-eslint/types": "8.41.0",
+        "@typescript-eslint/visitor-keys": "8.41.0",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
         "minimatch": "^9.0.4",
         "semver": "^7.6.0",
-        "ts-api-utils": "^2.0.1"
+        "ts-api-utils": "^2.1.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1324,7 +1410,7 @@
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "typescript": ">=4.8.4 <5.8.0"
+        "typescript": ">=4.8.4 <6.0.0"
       }
     },
     "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
@@ -1354,16 +1440,16 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.23.0.tgz",
-      "integrity": "sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==",
+      "version": "8.41.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.41.0.tgz",
+      "integrity": "sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@eslint-community/eslint-utils": "^4.4.0",
-        "@typescript-eslint/scope-manager": "8.23.0",
-        "@typescript-eslint/types": "8.23.0",
-        "@typescript-eslint/typescript-estree": "8.23.0"
+        "@eslint-community/eslint-utils": "^4.7.0",
+        "@typescript-eslint/scope-manager": "8.41.0",
+        "@typescript-eslint/types": "8.41.0",
+        "@typescript-eslint/typescript-estree": "8.41.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1374,18 +1460,18 @@
       },
       "peerDependencies": {
         "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.8.0"
+        "typescript": ">=4.8.4 <6.0.0"
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.23.0.tgz",
-      "integrity": "sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==",
+      "version": "8.41.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz",
+      "integrity": "sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.23.0",
-        "eslint-visitor-keys": "^4.2.0"
+        "@typescript-eslint/types": "8.41.0",
+        "eslint-visitor-keys": "^4.2.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1396,22 +1482,23 @@
       }
     },
     "node_modules/@vitest/coverage-v8": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.5.tgz",
-      "integrity": "sha512-zOOWIsj5fHh3jjGwQg+P+J1FW3s4jBu1Zqga0qW60yutsBtqEqNEJKWYh7cYn1yGD+1bdPsPdC/eL4eVK56xMg==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz",
+      "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@ampproject/remapping": "^2.3.0",
         "@bcoe/v8-coverage": "^1.0.2",
-        "debug": "^4.4.0",
+        "ast-v8-to-istanbul": "^0.3.3",
+        "debug": "^4.4.1",
         "istanbul-lib-coverage": "^3.2.2",
         "istanbul-lib-report": "^3.0.1",
         "istanbul-lib-source-maps": "^5.0.6",
         "istanbul-reports": "^3.1.7",
         "magic-string": "^0.30.17",
         "magicast": "^0.3.5",
-        "std-env": "^3.8.0",
+        "std-env": "^3.9.0",
         "test-exclude": "^7.0.1",
         "tinyrainbow": "^2.0.0"
       },
@@ -1419,8 +1506,8 @@
         "url": "https://opencollective.com/vitest"
       },
       "peerDependencies": {
-        "@vitest/browser": "3.0.5",
-        "vitest": "3.0.5"
+        "@vitest/browser": "3.2.4",
+        "vitest": "3.2.4"
       },
       "peerDependenciesMeta": {
         "@vitest/browser": {
@@ -1429,15 +1516,16 @@
       }
     },
     "node_modules/@vitest/expect": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.5.tgz",
-      "integrity": "sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz",
+      "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/spy": "3.0.5",
-        "@vitest/utils": "3.0.5",
-        "chai": "^5.1.2",
+        "@types/chai": "^5.2.2",
+        "@vitest/spy": "3.2.4",
+        "@vitest/utils": "3.2.4",
+        "chai": "^5.2.0",
         "tinyrainbow": "^2.0.0"
       },
       "funding": {
@@ -1445,13 +1533,13 @@
       }
     },
     "node_modules/@vitest/mocker": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.5.tgz",
-      "integrity": "sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz",
+      "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/spy": "3.0.5",
+        "@vitest/spy": "3.2.4",
         "estree-walker": "^3.0.3",
         "magic-string": "^0.30.17"
       },
@@ -1460,7 +1548,7 @@
       },
       "peerDependencies": {
         "msw": "^2.4.9",
-        "vite": "^5.0.0 || ^6.0.0"
+        "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
       },
       "peerDependenciesMeta": {
         "msw": {
@@ -1472,9 +1560,9 @@
       }
     },
     "node_modules/@vitest/pretty-format": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.5.tgz",
-      "integrity": "sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz",
+      "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1485,56 +1573,57 @@
       }
     },
     "node_modules/@vitest/runner": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.5.tgz",
-      "integrity": "sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz",
+      "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/utils": "3.0.5",
-        "pathe": "^2.0.2"
+        "@vitest/utils": "3.2.4",
+        "pathe": "^2.0.3",
+        "strip-literal": "^3.0.0"
       },
       "funding": {
         "url": "https://opencollective.com/vitest"
       }
     },
     "node_modules/@vitest/snapshot": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.5.tgz",
-      "integrity": "sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz",
+      "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/pretty-format": "3.0.5",
+        "@vitest/pretty-format": "3.2.4",
         "magic-string": "^0.30.17",
-        "pathe": "^2.0.2"
+        "pathe": "^2.0.3"
       },
       "funding": {
         "url": "https://opencollective.com/vitest"
       }
     },
     "node_modules/@vitest/spy": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.5.tgz",
-      "integrity": "sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz",
+      "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "tinyspy": "^3.0.2"
+        "tinyspy": "^4.0.3"
       },
       "funding": {
         "url": "https://opencollective.com/vitest"
       }
     },
     "node_modules/@vitest/utils": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.5.tgz",
-      "integrity": "sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz",
+      "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/pretty-format": "3.0.5",
-        "loupe": "^3.1.2",
+        "@vitest/pretty-format": "3.2.4",
+        "loupe": "^3.1.4",
         "tinyrainbow": "^2.0.0"
       },
       "funding": {
@@ -1627,6 +1716,18 @@
         "node": ">=12"
       }
     },
+    "node_modules/ast-v8-to-istanbul": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.5.tgz",
+      "integrity": "sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/trace-mapping": "^0.3.30",
+        "estree-walker": "^3.0.3",
+        "js-tokens": "^9.0.1"
+      }
+    },
     "node_modules/balanced-match": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -1679,9 +1780,9 @@
       }
     },
     "node_modules/chai": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz",
-      "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==",
+      "version": "5.3.3",
+      "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz",
+      "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1692,7 +1793,7 @@
         "pathval": "^2.0.0"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/chalk": {
@@ -1765,9 +1866,9 @@
       }
     },
     "node_modules/debug": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
-      "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+      "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1800,27 +1901,26 @@
       "license": "MIT"
     },
     "node_modules/dts-buddy": {
-      "version": "0.5.4",
-      "resolved": "https://registry.npmjs.org/dts-buddy/-/dts-buddy-0.5.4.tgz",
-      "integrity": "sha512-a3jJYbMXK98aJvhdV/v+tEKTTEJXXWtMjrl5L8jJL7rnZzGtPA6JNHJZ5//NVRw4JiB5T10Ie5T7h/QsP3aaYw==",
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/dts-buddy/-/dts-buddy-0.6.2.tgz",
+      "integrity": "sha512-KUmYrRKpVpjmnqM/JY93p1PWezMXodKCiMd5CFvfLtRCRc5i2GZiojrkVQXO2Dd8HeaU1C3sgTKDWxCEK5cyXA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@jridgewell/source-map": "^0.3.5",
         "@jridgewell/sourcemap-codec": "^1.4.15",
-        "globrex": "^0.1.2",
         "kleur": "^4.1.5",
         "locate-character": "^3.0.0",
         "magic-string": "^0.30.4",
         "sade": "^1.8.1",
-        "tiny-glob": "^0.2.9",
+        "tinyglobby": "^0.2.10",
         "ts-api-utils": "^1.0.3"
       },
       "bin": {
         "dts-buddy": "src/cli.js"
       },
       "peerDependencies": {
-        "typescript": ">=5.0.4 <5.8"
+        "typescript": ">=5.0.4 <5.9"
       }
     },
     "node_modules/dts-buddy/node_modules/ts-api-utils": {
@@ -1851,16 +1951,16 @@
       "license": "MIT"
     },
     "node_modules/es-module-lexer": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
-      "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==",
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
+      "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/esbuild": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz",
-      "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz",
+      "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==",
       "dev": true,
       "hasInstallScript": true,
       "license": "MIT",
@@ -1871,31 +1971,32 @@
         "node": ">=18"
       },
       "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.25.0",
-        "@esbuild/android-arm": "0.25.0",
-        "@esbuild/android-arm64": "0.25.0",
-        "@esbuild/android-x64": "0.25.0",
-        "@esbuild/darwin-arm64": "0.25.0",
-        "@esbuild/darwin-x64": "0.25.0",
-        "@esbuild/freebsd-arm64": "0.25.0",
-        "@esbuild/freebsd-x64": "0.25.0",
-        "@esbuild/linux-arm": "0.25.0",
-        "@esbuild/linux-arm64": "0.25.0",
-        "@esbuild/linux-ia32": "0.25.0",
-        "@esbuild/linux-loong64": "0.25.0",
-        "@esbuild/linux-mips64el": "0.25.0",
-        "@esbuild/linux-ppc64": "0.25.0",
-        "@esbuild/linux-riscv64": "0.25.0",
-        "@esbuild/linux-s390x": "0.25.0",
-        "@esbuild/linux-x64": "0.25.0",
-        "@esbuild/netbsd-arm64": "0.25.0",
-        "@esbuild/netbsd-x64": "0.25.0",
-        "@esbuild/openbsd-arm64": "0.25.0",
-        "@esbuild/openbsd-x64": "0.25.0",
-        "@esbuild/sunos-x64": "0.25.0",
-        "@esbuild/win32-arm64": "0.25.0",
-        "@esbuild/win32-ia32": "0.25.0",
-        "@esbuild/win32-x64": "0.25.0"
+        "@esbuild/aix-ppc64": "0.25.9",
+        "@esbuild/android-arm": "0.25.9",
+        "@esbuild/android-arm64": "0.25.9",
+        "@esbuild/android-x64": "0.25.9",
+        "@esbuild/darwin-arm64": "0.25.9",
+        "@esbuild/darwin-x64": "0.25.9",
+        "@esbuild/freebsd-arm64": "0.25.9",
+        "@esbuild/freebsd-x64": "0.25.9",
+        "@esbuild/linux-arm": "0.25.9",
+        "@esbuild/linux-arm64": "0.25.9",
+        "@esbuild/linux-ia32": "0.25.9",
+        "@esbuild/linux-loong64": "0.25.9",
+        "@esbuild/linux-mips64el": "0.25.9",
+        "@esbuild/linux-ppc64": "0.25.9",
+        "@esbuild/linux-riscv64": "0.25.9",
+        "@esbuild/linux-s390x": "0.25.9",
+        "@esbuild/linux-x64": "0.25.9",
+        "@esbuild/netbsd-arm64": "0.25.9",
+        "@esbuild/netbsd-x64": "0.25.9",
+        "@esbuild/openbsd-arm64": "0.25.9",
+        "@esbuild/openbsd-x64": "0.25.9",
+        "@esbuild/openharmony-arm64": "0.25.9",
+        "@esbuild/sunos-x64": "0.25.9",
+        "@esbuild/win32-arm64": "0.25.9",
+        "@esbuild/win32-ia32": "0.25.9",
+        "@esbuild/win32-x64": "0.25.9"
       }
     },
     "node_modules/escape-string-regexp": {
@@ -2077,9 +2178,9 @@
       }
     },
     "node_modules/expect-type": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz",
-      "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==",
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz",
+      "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -2138,9 +2239,9 @@
       "license": "MIT"
     },
     "node_modules/fastq": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz",
-      "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==",
+      "version": "1.19.1",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+      "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -2329,20 +2430,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/globalyzer": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz",
-      "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/globrex": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
-      "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/graphemer": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
@@ -2524,6 +2611,13 @@
         "@pkgjs/parseargs": "^0.11.0"
       }
     },
+    "node_modules/js-tokens": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
+      "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/js-yaml": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@@ -2623,9 +2717,9 @@
       "license": "MIT"
     },
     "node_modules/loupe": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
-      "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz",
+      "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==",
       "dev": true,
       "license": "MIT"
     },
@@ -2872,16 +2966,16 @@
       }
     },
     "node_modules/pathe": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz",
-      "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+      "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/pathval": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
-      "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz",
+      "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2909,9 +3003,9 @@
       }
     },
     "node_modules/postcss": {
-      "version": "8.5.3",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
-      "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
+      "version": "8.5.6",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+      "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
       "dev": true,
       "funding": [
         {
@@ -2929,7 +3023,7 @@
       ],
       "license": "MIT",
       "dependencies": {
-        "nanoid": "^3.3.8",
+        "nanoid": "^3.3.11",
         "picocolors": "^1.1.1",
         "source-map-js": "^1.2.1"
       },
@@ -2999,9 +3093,9 @@
       }
     },
     "node_modules/reusify": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
-      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+      "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3010,13 +3104,13 @@
       }
     },
     "node_modules/rollup": {
-      "version": "4.40.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz",
-      "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.49.0.tgz",
+      "integrity": "sha512-3IVq0cGJ6H7fKXXEdVt+RcYvRCt8beYY9K1760wGQwSAHZcS9eot1zDG5axUbcp/kWRi5zKIIDX8MoKv/TzvZA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@types/estree": "1.0.7"
+        "@types/estree": "1.0.8"
       },
       "bin": {
         "rollup": "dist/bin/rollup"
@@ -3026,26 +3120,26 @@
         "npm": ">=8.0.0"
       },
       "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.40.0",
-        "@rollup/rollup-android-arm64": "4.40.0",
-        "@rollup/rollup-darwin-arm64": "4.40.0",
-        "@rollup/rollup-darwin-x64": "4.40.0",
-        "@rollup/rollup-freebsd-arm64": "4.40.0",
-        "@rollup/rollup-freebsd-x64": "4.40.0",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.40.0",
-        "@rollup/rollup-linux-arm-musleabihf": "4.40.0",
-        "@rollup/rollup-linux-arm64-gnu": "4.40.0",
-        "@rollup/rollup-linux-arm64-musl": "4.40.0",
-        "@rollup/rollup-linux-loongarch64-gnu": "4.40.0",
-        "@rollup/rollup-linux-powerpc64le-gnu": "4.40.0",
-        "@rollup/rollup-linux-riscv64-gnu": "4.40.0",
-        "@rollup/rollup-linux-riscv64-musl": "4.40.0",
-        "@rollup/rollup-linux-s390x-gnu": "4.40.0",
-        "@rollup/rollup-linux-x64-gnu": "4.40.0",
-        "@rollup/rollup-linux-x64-musl": "4.40.0",
-        "@rollup/rollup-win32-arm64-msvc": "4.40.0",
-        "@rollup/rollup-win32-ia32-msvc": "4.40.0",
-        "@rollup/rollup-win32-x64-msvc": "4.40.0",
+        "@rollup/rollup-android-arm-eabi": "4.49.0",
+        "@rollup/rollup-android-arm64": "4.49.0",
+        "@rollup/rollup-darwin-arm64": "4.49.0",
+        "@rollup/rollup-darwin-x64": "4.49.0",
+        "@rollup/rollup-freebsd-arm64": "4.49.0",
+        "@rollup/rollup-freebsd-x64": "4.49.0",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.49.0",
+        "@rollup/rollup-linux-arm-musleabihf": "4.49.0",
+        "@rollup/rollup-linux-arm64-gnu": "4.49.0",
+        "@rollup/rollup-linux-arm64-musl": "4.49.0",
+        "@rollup/rollup-linux-loongarch64-gnu": "4.49.0",
+        "@rollup/rollup-linux-ppc64-gnu": "4.49.0",
+        "@rollup/rollup-linux-riscv64-gnu": "4.49.0",
+        "@rollup/rollup-linux-riscv64-musl": "4.49.0",
+        "@rollup/rollup-linux-s390x-gnu": "4.49.0",
+        "@rollup/rollup-linux-x64-gnu": "4.49.0",
+        "@rollup/rollup-linux-x64-musl": "4.49.0",
+        "@rollup/rollup-win32-arm64-msvc": "4.49.0",
+        "@rollup/rollup-win32-ia32-msvc": "4.49.0",
+        "@rollup/rollup-win32-x64-msvc": "4.49.0",
         "fsevents": "~2.3.2"
       }
     },
@@ -3143,13 +3237,13 @@
       }
     },
     "node_modules/source-map": {
-      "version": "0.7.4",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
-      "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+      "version": "0.7.6",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
+      "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
       "dev": true,
       "license": "BSD-3-Clause",
       "engines": {
-        "node": ">= 8"
+        "node": ">= 12"
       }
     },
     "node_modules/source-map-js": {
@@ -3170,9 +3264,9 @@
       "license": "MIT"
     },
     "node_modules/std-env": {
-      "version": "3.8.0",
-      "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz",
-      "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==",
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz",
+      "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==",
       "dev": true,
       "license": "MIT"
     },
@@ -3293,6 +3387,19 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/strip-literal": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz",
+      "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "js-tokens": "^9.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
     "node_modules/supports-color": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -3347,17 +3454,6 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/tiny-glob": {
-      "version": "0.2.9",
-      "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
-      "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "globalyzer": "0.1.0",
-        "globrex": "^0.1.2"
-      }
-    },
     "node_modules/tinybench": {
       "version": "2.9.0",
       "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
@@ -3373,9 +3469,9 @@
       "license": "MIT"
     },
     "node_modules/tinyglobby": {
-      "version": "0.2.13",
-      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz",
-      "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==",
+      "version": "0.2.14",
+      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
+      "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3390,11 +3486,14 @@
       }
     },
     "node_modules/tinyglobby/node_modules/fdir": {
-      "version": "6.4.4",
-      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
-      "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+      "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
       "dev": true,
       "license": "MIT",
+      "engines": {
+        "node": ">=12.0.0"
+      },
       "peerDependencies": {
         "picomatch": "^3 || ^4"
       },
@@ -3405,9 +3504,9 @@
       }
     },
     "node_modules/tinyglobby/node_modules/picomatch": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
-      "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3418,9 +3517,9 @@
       }
     },
     "node_modules/tinypool": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz",
-      "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz",
+      "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3438,9 +3537,9 @@
       }
     },
     "node_modules/tinyspy": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
-      "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz",
+      "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3461,9 +3560,9 @@
       }
     },
     "node_modules/ts-api-utils": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz",
-      "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+      "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3474,9 +3573,9 @@
       }
     },
     "node_modules/tsx": {
-      "version": "4.20.3",
-      "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz",
-      "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==",
+      "version": "4.20.5",
+      "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz",
+      "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3507,9 +3606,9 @@
       }
     },
     "node_modules/typescript": {
-      "version": "5.7.3",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
-      "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
+      "version": "5.8.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
+      "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
       "dev": true,
       "license": "Apache-2.0",
       "bin": {
@@ -3521,15 +3620,16 @@
       }
     },
     "node_modules/typescript-eslint": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.23.0.tgz",
-      "integrity": "sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ==",
+      "version": "8.41.0",
+      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.41.0.tgz",
+      "integrity": "sha512-n66rzs5OBXW3SFSnZHr2T685q1i4ODm2nulFJhMZBotaTavsS8TrI3d7bDlRSs9yWo7HmyWrN9qDu14Qv7Y0Dw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/eslint-plugin": "8.23.0",
-        "@typescript-eslint/parser": "8.23.0",
-        "@typescript-eslint/utils": "8.23.0"
+        "@typescript-eslint/eslint-plugin": "8.41.0",
+        "@typescript-eslint/parser": "8.41.0",
+        "@typescript-eslint/typescript-estree": "8.41.0",
+        "@typescript-eslint/utils": "8.41.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3540,13 +3640,13 @@
       },
       "peerDependencies": {
         "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.8.0"
+        "typescript": ">=4.8.4 <6.0.0"
       }
     },
     "node_modules/undici-types": {
-      "version": "6.20.0",
-      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
-      "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+      "version": "7.10.0",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz",
+      "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==",
       "dev": true,
       "license": "MIT"
     },
@@ -3561,24 +3661,24 @@
       }
     },
     "node_modules/vite": {
-      "version": "6.3.4",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz",
-      "integrity": "sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==",
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.3.tgz",
+      "integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "esbuild": "^0.25.0",
-        "fdir": "^6.4.4",
-        "picomatch": "^4.0.2",
-        "postcss": "^8.5.3",
-        "rollup": "^4.34.9",
-        "tinyglobby": "^0.2.13"
+        "fdir": "^6.5.0",
+        "picomatch": "^4.0.3",
+        "postcss": "^8.5.6",
+        "rollup": "^4.43.0",
+        "tinyglobby": "^0.2.14"
       },
       "bin": {
         "vite": "bin/vite.js"
       },
       "engines": {
-        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+        "node": "^20.19.0 || >=22.12.0"
       },
       "funding": {
         "url": "https://github.com/vitejs/vite?sponsor=1"
@@ -3587,14 +3687,14 @@
         "fsevents": "~2.3.3"
       },
       "peerDependencies": {
-        "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+        "@types/node": "^20.19.0 || >=22.12.0",
         "jiti": ">=1.21.0",
-        "less": "*",
+        "less": "^4.0.0",
         "lightningcss": "^1.21.0",
-        "sass": "*",
-        "sass-embedded": "*",
-        "stylus": "*",
-        "sugarss": "*",
+        "sass": "^1.70.0",
+        "sass-embedded": "^1.70.0",
+        "stylus": ">=0.54.8",
+        "sugarss": "^5.0.0",
         "terser": "^5.16.0",
         "tsx": "^4.8.1",
         "yaml": "^2.4.2"
@@ -3636,17 +3736,17 @@
       }
     },
     "node_modules/vite-node": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.5.tgz",
-      "integrity": "sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz",
+      "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "cac": "^6.7.14",
-        "debug": "^4.4.0",
-        "es-module-lexer": "^1.6.0",
-        "pathe": "^2.0.2",
-        "vite": "^5.0.0 || ^6.0.0"
+        "debug": "^4.4.1",
+        "es-module-lexer": "^1.7.0",
+        "pathe": "^2.0.3",
+        "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
       },
       "bin": {
         "vite-node": "vite-node.mjs"
@@ -3659,11 +3759,14 @@
       }
     },
     "node_modules/vite/node_modules/fdir": {
-      "version": "6.4.4",
-      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
-      "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+      "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
       "dev": true,
       "license": "MIT",
+      "engines": {
+        "node": ">=12.0.0"
+      },
       "peerDependencies": {
         "picomatch": "^3 || ^4"
       },
@@ -3674,9 +3777,9 @@
       }
     },
     "node_modules/vite/node_modules/picomatch": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
-      "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3687,31 +3790,34 @@
       }
     },
     "node_modules/vitest": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.5.tgz",
-      "integrity": "sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz",
+      "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/expect": "3.0.5",
-        "@vitest/mocker": "3.0.5",
-        "@vitest/pretty-format": "^3.0.5",
-        "@vitest/runner": "3.0.5",
-        "@vitest/snapshot": "3.0.5",
-        "@vitest/spy": "3.0.5",
-        "@vitest/utils": "3.0.5",
-        "chai": "^5.1.2",
-        "debug": "^4.4.0",
-        "expect-type": "^1.1.0",
+        "@types/chai": "^5.2.2",
+        "@vitest/expect": "3.2.4",
+        "@vitest/mocker": "3.2.4",
+        "@vitest/pretty-format": "^3.2.4",
+        "@vitest/runner": "3.2.4",
+        "@vitest/snapshot": "3.2.4",
+        "@vitest/spy": "3.2.4",
+        "@vitest/utils": "3.2.4",
+        "chai": "^5.2.0",
+        "debug": "^4.4.1",
+        "expect-type": "^1.2.1",
         "magic-string": "^0.30.17",
-        "pathe": "^2.0.2",
-        "std-env": "^3.8.0",
+        "pathe": "^2.0.3",
+        "picomatch": "^4.0.2",
+        "std-env": "^3.9.0",
         "tinybench": "^2.9.0",
         "tinyexec": "^0.3.2",
-        "tinypool": "^1.0.2",
+        "tinyglobby": "^0.2.14",
+        "tinypool": "^1.1.1",
         "tinyrainbow": "^2.0.0",
-        "vite": "^5.0.0 || ^6.0.0",
-        "vite-node": "3.0.5",
+        "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0",
+        "vite-node": "3.2.4",
         "why-is-node-running": "^2.3.0"
       },
       "bin": {
@@ -3727,8 +3833,8 @@
         "@edge-runtime/vm": "*",
         "@types/debug": "^4.1.12",
         "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
-        "@vitest/browser": "3.0.5",
-        "@vitest/ui": "3.0.5",
+        "@vitest/browser": "3.2.4",
+        "@vitest/ui": "3.2.4",
         "happy-dom": "*",
         "jsdom": "*"
       },
@@ -3756,6 +3862,19 @@
         }
       }
     },
+    "node_modules/vitest/node_modules/picomatch": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
     "node_modules/which": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json
index f2ae62aa..b8d9a58f 100644
--- a/lib/binding_web/package.json
+++ b/lib/binding_web/package.json
@@ -74,9 +74,9 @@
   ],
   "devDependencies": {
     "@eslint/js": "^9.20.0",
-    "@types/node": "^22.13.1",
+    "@types/node": "^24.3.0",
     "@vitest/coverage-v8": "^3.0.5",
-    "dts-buddy": "^0.5.4",
+    "dts-buddy": "^0.6.2",
     "esbuild": "^0.25.0",
     "eslint": "^9.20.0",
     "source-map": "^0.7.4",

From 5272b6b9081998928d83d6bbb5965cbe64459fe2 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sun, 31 Aug 2025 00:41:29 +0300
Subject: [PATCH 367/663] refactor(web): use nullish coalescing operator

---
 lib/binding_web/src/bindings.ts | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/lib/binding_web/src/bindings.ts b/lib/binding_web/src/bindings.ts
index 359deecb..c7b10c93 100644
--- a/lib/binding_web/src/bindings.ts
+++ b/lib/binding_web/src/bindings.ts
@@ -10,10 +10,7 @@ export let Module: MainModule | null = null;
  * Initialize the Tree-sitter Wasm module. This should only be called by the {@link Parser} class via {@link Parser.init}.
  */
 export async function initializeBinding(moduleOptions?: Partial): Promise {
-  if (!Module) {
-    Module = await createModule(moduleOptions);
-  }
-  return Module;
+  return Module ??= await createModule(moduleOptions);
 }
 
 /**

From a0fd1ded976ab6a3052ea77f8131ebcb8d24ffdc Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sat, 30 Aug 2025 21:10:57 +0000
Subject: [PATCH 368/663] build(deps): bump wasmparser from 0.224.1 to 0.229.0
 in the cargo group

Bumps the cargo group with 1 update: [wasmparser](https://github.com/bytecodealliance/wasm-tools).


Updates `wasmparser` from 0.224.1 to 0.229.0
- [Release notes](https://github.com/bytecodealliance/wasm-tools/releases)
- [Commits](https://github.com/bytecodealliance/wasm-tools/commits)

---
updated-dependencies:
- dependency-name: wasmparser
  dependency-version: 0.229.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo
...

Signed-off-by: dependabot[bot] 
---
 Cargo.lock | 29 ++++++++---------------------
 Cargo.toml |  2 +-
 2 files changed, 9 insertions(+), 22 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 796472b2..85fac44e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2029,7 +2029,7 @@ dependencies = [
  "unindent",
  "url",
  "walkdir",
- "wasmparser 0.224.1",
+ "wasmparser",
  "webbrowser",
  "widestring",
 ]
@@ -2312,20 +2312,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "38ba1d491ecacb085a2552025c10a675a6fddcbd03b1fc9b36c536010ce265d2"
 dependencies = [
  "leb128fmt",
- "wasmparser 0.229.0",
-]
-
-[[package]]
-name = "wasmparser"
-version = "0.224.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "04f17a5917c2ddd3819e84c661fae0d6ba29d7b9c1f0e96c708c65a9c4188e11"
-dependencies = [
- "bitflags 2.9.3",
- "hashbrown",
- "indexmap",
- "semver",
- "serde",
+ "wasmparser",
 ]
 
 [[package]]
@@ -2349,7 +2336,7 @@ checksum = "d25dac01892684a99b8fbfaf670eb6b56edea8a096438c75392daeb83156ae2e"
 dependencies = [
  "anyhow",
  "termcolor",
- "wasmparser 0.229.0",
+ "wasmparser",
 ]
 
 [[package]]
@@ -2381,7 +2368,7 @@ dependencies = [
  "smallvec",
  "sptr",
  "target-lexicon",
- "wasmparser 0.229.0",
+ "wasmparser",
  "wasmtime-asm-macros",
  "wasmtime-cranelift",
  "wasmtime-environ",
@@ -2447,7 +2434,7 @@ dependencies = [
  "smallvec",
  "target-lexicon",
  "thiserror 2.0.16",
- "wasmparser 0.229.0",
+ "wasmparser",
  "wasmtime-environ",
  "wasmtime-versioned-export-macros",
 ]
@@ -2471,7 +2458,7 @@ dependencies = [
  "smallvec",
  "target-lexicon",
  "wasm-encoder",
- "wasmparser 0.229.0",
+ "wasmparser",
  "wasmprinter",
 ]
 
@@ -2539,7 +2526,7 @@ dependencies = [
  "gimli",
  "object",
  "target-lexicon",
- "wasmparser 0.229.0",
+ "wasmparser",
  "wasmtime-cranelift",
  "wasmtime-environ",
  "winch-codegen",
@@ -2609,7 +2596,7 @@ dependencies = [
  "smallvec",
  "target-lexicon",
  "thiserror 2.0.16",
- "wasmparser 0.229.0",
+ "wasmparser",
  "wasmtime-cranelift",
  "wasmtime-environ",
 ]
diff --git a/Cargo.toml b/Cargo.toml
index 799da666..0f340fdf 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -156,7 +156,7 @@ topological-sort = "0.2.2"
 unindent = "0.2.4"
 url = { version = "2.5.4", features = ["serde"] }
 walkdir = "2.5.0"
-wasmparser = "0.224.1"
+wasmparser = "0.229.0"
 webbrowser = "1.0.5"
 
 tree-sitter = { version = "0.26.0", path = "./lib" }

From 8b3e023ef02c7d88aeee421b7544f4e90803b545 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sat, 30 Aug 2025 15:46:27 +0300
Subject: [PATCH 369/663] chore(web): remove source files from package

and generated files from version control
---
 .github/workflows/release.yml             |    1 +
 lib/binding_web/.gitattributes            |    2 +-
 lib/binding_web/.gitignore                |    7 +-
 lib/binding_web/package.json              |    6 +-
 lib/binding_web/web-tree-sitter.d.cts     | 1030 ---------------------
 lib/binding_web/web-tree-sitter.d.cts.map |   56 --
 lib/binding_web/web-tree-sitter.d.ts      | 1030 ---------------------
 lib/binding_web/web-tree-sitter.d.ts.map  |   56 --
 8 files changed, 4 insertions(+), 2184 deletions(-)
 delete mode 100644 lib/binding_web/web-tree-sitter.d.cts
 delete mode 100644 lib/binding_web/web-tree-sitter.d.cts.map
 delete mode 100644 lib/binding_web/web-tree-sitter.d.ts
 delete mode 100644 lib/binding_web/web-tree-sitter.d.ts.map

diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 39604250..453f6d2e 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -101,6 +101,7 @@ jobs:
           npm run build:debug
           CJS=true npm run build
           CJS=true npm run build:debug
+          npm run build:dts
 
       - name: Publish to npmjs.com
         working-directory: ${{ matrix.directory }}
diff --git a/lib/binding_web/.gitattributes b/lib/binding_web/.gitattributes
index 3fa60d26..ab19847d 100644
--- a/lib/binding_web/.gitattributes
+++ b/lib/binding_web/.gitattributes
@@ -1 +1 @@
-/lib/tree-sitter.d.ts linguist-generated
+lib/web-tree-sitter.d.ts linguist-generated
diff --git a/lib/binding_web/.gitignore b/lib/binding_web/.gitignore
index 15ad77f8..8f45e5f9 100644
--- a/lib/binding_web/.gitignore
+++ b/lib/binding_web/.gitignore
@@ -1,15 +1,10 @@
 debug/
 dist/
 web-tree-sitter*
-!web-tree-sitter.d.ts
-!web-tree-sitter.d.ts.map
-!web-tree-sitter.d.cts
-!web-tree-sitter.d.cts.map
-lib/tree-sitter*
 lib/*.c
 lib/*.h
 !lib/tree-sitter.c
-!lib/tree-sitter.d.ts
+!lib/web-tree-sitter.d.ts
 node_modules
 *.tgz
 LICENSE
diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json
index b8d9a58f..f523e586 100644
--- a/lib/binding_web/package.json
+++ b/lib/binding_web/package.json
@@ -51,7 +51,6 @@
     "wasm"
   ],
   "files": [
-    "README.md",
     "web-tree-sitter.cjs",
     "web-tree-sitter.cjs.map",
     "web-tree-sitter.js",
@@ -67,10 +66,7 @@
     "web-tree-sitter.d.ts",
     "web-tree-sitter.d.ts.map",
     "web-tree-sitter.d.cts",
-    "web-tree-sitter.d.cts.map",
-    "src/**/*.ts",
-    "lib/*.c",
-    "lib/*.h"
+    "web-tree-sitter.d.cts.map"
   ],
   "devDependencies": {
     "@eslint/js": "^9.20.0",
diff --git a/lib/binding_web/web-tree-sitter.d.cts b/lib/binding_web/web-tree-sitter.d.cts
deleted file mode 100644
index 4cb22721..00000000
--- a/lib/binding_web/web-tree-sitter.d.cts
+++ /dev/null
@@ -1,1030 +0,0 @@
-declare module 'web-tree-sitter' {
-	/**
-	 * A position in a multi-line text document, in terms of rows and columns.
-	 *
-	 * Rows and columns are zero-based.
-	 */
-	export interface Point {
-		/** The zero-based row number. */
-		row: number;
-		/** The zero-based column number. */
-		column: number;
-	}
-	/**
-	 *  A range of positions in a multi-line text document, both in terms of bytes
-	 *  and of rows and columns.
-	 */
-	export interface Range {
-		/** The start position of the range. */
-		startPosition: Point;
-		/** The end position of the range. */
-		endPosition: Point;
-		/** The start index of the range. */
-		startIndex: number;
-		/** The end index of the range. */
-		endIndex: number;
-	}
-	/**
-	 * A summary of a change to a text document.
-	 */
-	export interface Edit {
-		/** The start position of the change. */
-		startPosition: Point;
-		/** The end position of the change before the edit. */
-		oldEndPosition: Point;
-		/** The end position of the change after the edit. */
-		newEndPosition: Point;
-		/** The start index of the change. */
-		startIndex: number;
-		/** The end index of the change before the edit. */
-		oldEndIndex: number;
-		/** The end index of the change after the edit. */
-		newEndIndex: number;
-	}
-	/**
-	 * A callback for parsing that takes an index and point, and should return a string.
-	 */
-	export type ParseCallback = (index: number, position: Point) => string | undefined;
-	/**
-	 * A callback that receives the parse state during parsing.
-	 */
-	export type ProgressCallback = (progress: ParseState) => boolean;
-	/**
-	 * A callback for logging messages.
-	 *
-	 * If `isLex` is `true`, the message is from the lexer, otherwise it's from the parser.
-	 */
-	export type LogCallback = (message: string, isLex: boolean) => void;
-	/**
-	 * Options for parsing
-	 *
-	 * The `includedRanges` property is an array of {@link Range} objects that
-	 * represent the ranges of text that the parser should include when parsing.
-	 *
-	 * The `progressCallback` property is a function that is called periodically
-	 * during parsing to check whether parsing should be cancelled.
-	 *
-	 * See {@link Parser#parse} for more information.
-	 */
-	export interface ParseOptions {
-		/**
-		 * An array of {@link Range} objects that
-		 * represent the ranges of text that the parser should include when parsing.
-		 *
-		 * This sets the ranges of text that the parser should include when parsing.
-		 * By default, the parser will always include entire documents. This
-		 * function allows you to parse only a *portion* of a document but
-		 * still return a syntax tree whose ranges match up with the document
-		 * as a whole. You can also pass multiple disjoint ranges.
-		 * If `ranges` is empty, then the entire document will be parsed.
-		 * Otherwise, the given ranges must be ordered from earliest to latest
-		 * in the document, and they must not overlap. That is, the following
-		 * must hold for all `i` < `length - 1`:
-		 * ```text
-		 *     ranges[i].end_byte <= ranges[i + 1].start_byte
-		 * ```
-		 */
-		includedRanges?: Range[];
-		/**
-		 * A function that is called periodically during parsing to check
-		 * whether parsing should be cancelled. If the progress callback returns
-		 * `true`, then parsing will be cancelled. You can also use this to instrument
-		 * parsing and check where the parser is at in the document. The progress callback
-		 * takes a single argument, which is a {@link ParseState} representing the current
-		 * state of the parser.
-		 */
-		progressCallback?: (state: ParseState) => void;
-	}
-	/**
-	 * A stateful object that is passed into the progress callback {@link ParseOptions#progressCallback}
-	 * to provide the current state of the parser.
-	 */
-	export interface ParseState {
-		/** The byte offset in the document that the parser is at. */
-		currentOffset: number;
-		/** Indicates whether the parser has encountered an error during parsing. */
-		hasError: boolean;
-	}
-	/**
-	 * The latest ABI version that is supported by the current version of the
-	 * library.
-	 *
-	 * When Languages are generated by the Tree-sitter CLI, they are
-	 * assigned an ABI version number that corresponds to the current CLI version.
-	 * The Tree-sitter library is generally backwards-compatible with languages
-	 * generated using older CLI versions, but is not forwards-compatible.
-	 */
-	export let LANGUAGE_VERSION: number;
-	/**
-	 * The earliest ABI version that is supported by the current version of the
-	 * library.
-	 */
-	export let MIN_COMPATIBLE_VERSION: number;
-	/**
-	 * A stateful object that is used to produce a {@link Tree} based on some
-	 * source code.
-	 */
-	export class Parser {
-		/** The parser's current language. */
-		language: Language | null;
-		/**
-		 * This must always be called before creating a Parser.
-		 *
-		 * You can optionally pass in options to configure the Wasm module, the most common
-		 * one being `locateFile` to help the module find the `.wasm` file.
-		 */
-		static init(moduleOptions?: Partial): Promise;
-		/**
-		 * Create a new parser.
-		 */
-		constructor();
-		/** Delete the parser, freeing its resources. */
-		delete(): void;
-		/**
-		 * Set the language that the parser should use for parsing.
-		 *
-		 * If the language was not successfully assigned, an error will be thrown.
-		 * This happens if the language was generated with an incompatible
-		 * version of the Tree-sitter CLI. Check the language's version using
-		 * {@link Language#version} and compare it to this library's
-		 * {@link LANGUAGE_VERSION} and {@link MIN_COMPATIBLE_VERSION} constants.
-		 */
-		setLanguage(language: Language | null): this;
-		/**
-		 * Parse a slice of UTF8 text.
-		 *
-		 * @param callback - The UTF8-encoded text to parse or a callback function.
-		 *
-		 * @param oldTree - A previous syntax tree parsed from the same document. If the text of the
-		 *   document has changed since `oldTree` was created, then you must edit `oldTree` to match
-		 *   the new text using {@link Tree#edit}.
-		 *
-		 * @param options - Options for parsing the text.
-		 *  This can be used to set the included ranges, or a progress callback.
-		 *
-		 * @returns A {@link Tree} if parsing succeeded, or `null` if:
-		 *  - The parser has not yet had a language assigned with {@link Parser#setLanguage}.
-		 *  - The progress callback returned true.
-		 */
-		parse(callback: string | ParseCallback, oldTree?: Tree | null, options?: ParseOptions): Tree | null;
-		/**
-		 * Instruct the parser to start the next parse from the beginning.
-		 *
-		 * If the parser previously failed because of a timeout, cancellation,
-		 * or callback, then by default, it will resume where it left off on the
-		 * next call to {@link Parser#parse} or other parsing functions.
-		 * If you don't want to resume, and instead intend to use this parser to
-		 * parse some other document, you must call `reset` first.
-		 */
-		reset(): void;
-		/** Get the ranges of text that the parser will include when parsing. */
-		getIncludedRanges(): Range[];
-		/**
-		 * @deprecated since version 0.25.0, prefer passing a progress callback to {@link Parser#parse}
-		 *
-		 * Get the duration in microseconds that parsing is allowed to take.
-		 *
-		 * This is set via {@link Parser#setTimeoutMicros}.
-		 */
-		getTimeoutMicros(): number;
-		/**
-		 * @deprecated since version 0.25.0, prefer passing a progress callback to {@link Parser#parse}
-		 *
-		 * Set the maximum duration in microseconds that parsing should be allowed
-		 * to take before halting.
-		 *
-		 * If parsing takes longer than this, it will halt early, returning `null`.
-		 * See {@link Parser#parse} for more information.
-		 */
-		setTimeoutMicros(timeout: number): void;
-		/** Set the logging callback that a parser should use during parsing. */
-		setLogger(callback: LogCallback | boolean | null): this;
-		/** Get the parser's current logger. */
-		getLogger(): LogCallback | null;
-	}
-	class LanguageMetadata {
-		readonly major_version: number;
-		readonly minor_version: number;
-		readonly patch_version: number;
-	}
-	/**
-	 * An opaque object that defines how to parse a particular language.
-	 * The code for each `Language` is generated by the Tree-sitter CLI.
-	 */
-	export class Language {
-		/**
-		 * A list of all node types in the language. The index of each type in this
-		 * array is its node type id.
-		 */
-		types: string[];
-		/**
-		 * A list of all field names in the language. The index of each field name in
-		 * this array is its field id.
-		 */
-		fields: (string | null)[];
-		/**
-		 * Gets the name of the language.
-		 */
-		get name(): string | null;
-		/**
-		 * @deprecated since version 0.25.0, use {@link Language#abiVersion} instead
-		 * Gets the version of the language.
-		 */
-		get version(): number;
-		/**
-		 * Gets the ABI version of the language.
-		 */
-		get abiVersion(): number;
-		/**
-		* Get the metadata for this language. This information is generated by the
-		* CLI, and relies on the language author providing the correct metadata in
-		* the language's `tree-sitter.json` file.
-		*/
-		get metadata(): LanguageMetadata | null;
-		/**
-		 * Gets the number of fields in the language.
-		 */
-		get fieldCount(): number;
-		/**
-		 * Gets the number of states in the language.
-		 */
-		get stateCount(): number;
-		/**
-		 * Get the field id for a field name.
-		 */
-		fieldIdForName(fieldName: string): number | null;
-		/**
-		 * Get the field name for a field id.
-		 */
-		fieldNameForId(fieldId: number): string | null;
-		/**
-		 * Get the node type id for a node type name.
-		 */
-		idForNodeType(type: string, named: boolean): number | null;
-		/**
-		 * Gets the number of node types in the language.
-		 */
-		get nodeTypeCount(): number;
-		/**
-		 * Get the node type name for a node type id.
-		 */
-		nodeTypeForId(typeId: number): string | null;
-		/**
-		 * Check if a node type is named.
-		 *
-		 * @see {@link https://tree-sitter.github.io/tree-sitter/using-parsers/2-basic-parsing.html#named-vs-anonymous-nodes}
-		 */
-		nodeTypeIsNamed(typeId: number): boolean;
-		/**
-		 * Check if a node type is visible.
-		 */
-		nodeTypeIsVisible(typeId: number): boolean;
-		/**
-		 * Get the supertypes ids of this language.
-		 *
-		 * @see {@link https://tree-sitter.github.io/tree-sitter/using-parsers/6-static-node-types.html?highlight=supertype#supertype-nodes}
-		 */
-		get supertypes(): number[];
-		/**
-		 * Get the subtype ids for a given supertype node id.
-		 */
-		subtypes(supertype: number): number[];
-		/**
-		 * Get the next state id for a given state id and node type id.
-		 */
-		nextState(stateId: number, typeId: number): number;
-		/**
-		 * Create a new lookahead iterator for this language and parse state.
-		 *
-		 * This returns `null` if state is invalid for this language.
-		 *
-		 * Iterating {@link LookaheadIterator} will yield valid symbols in the given
-		 * parse state. Newly created lookahead iterators will return the `ERROR`
-		 * symbol from {@link LookaheadIterator#currentType}.
-		 *
-		 * Lookahead iterators can be useful for generating suggestions and improving
-		 * syntax error diagnostics. To get symbols valid in an `ERROR` node, use the
-		 * lookahead iterator on its first leaf node state. For `MISSING` nodes, a
-		 * lookahead iterator created on the previous non-extra leaf node may be
-		 * appropriate.
-		 */
-		lookaheadIterator(stateId: number): LookaheadIterator | null;
-		/**
-		 * @deprecated since version 0.25.0, call `new` on a {@link Query} instead
-		 *
-		 * Create a new query from a string containing one or more S-expression
-		 * patterns.
-		 *
-		 * The query is associated with a particular language, and can only be run
-		 * on syntax nodes parsed with that language. References to Queries can be
-		 * shared between multiple threads.
-		 *
-		 * @link {@see https://tree-sitter.github.io/tree-sitter/using-parsers/queries}
-		 */
-		query(source: string): Query;
-		/**
-		 * Load a language from a WebAssembly module.
-		 * The module can be provided as a path to a file or as a buffer.
-		 */
-		static load(input: string | Uint8Array): Promise;
-	}
-	/** A tree that represents the syntactic structure of a source code file. */
-	export class Tree {
-		/** The language that was used to parse the syntax tree. */
-		language: Language;
-		/** Create a shallow copy of the syntax tree. This is very fast. */
-		copy(): Tree;
-		/** Delete the syntax tree, freeing its resources. */
-		delete(): void;
-		/** Get the root node of the syntax tree. */
-		get rootNode(): Node;
-		/**
-		 * Get the root node of the syntax tree, but with its position shifted
-		 * forward by the given offset.
-		 */
-		rootNodeWithOffset(offsetBytes: number, offsetExtent: Point): Node;
-		/**
-		 * Edit the syntax tree to keep it in sync with source code that has been
-		 * edited.
-		 *
-		 * You must describe the edit both in terms of byte offsets and in terms of
-		 * row/column coordinates.
-		 */
-		edit(edit: Edit): void;
-		/** Create a new {@link TreeCursor} starting from the root of the tree. */
-		walk(): TreeCursor;
-		/**
-		 * Compare this old edited syntax tree to a new syntax tree representing
-		 * the same document, returning a sequence of ranges whose syntactic
-		 * structure has changed.
-		 *
-		 * For this to work correctly, this syntax tree must have been edited such
-		 * that its ranges match up to the new tree. Generally, you'll want to
-		 * call this method right after calling one of the [`Parser::parse`]
-		 * functions. Call it on the old tree that was passed to parse, and
-		 * pass the new tree that was returned from `parse`.
-		 */
-		getChangedRanges(other: Tree): Range[];
-		/** Get the included ranges that were used to parse the syntax tree. */
-		getIncludedRanges(): Range[];
-	}
-	/** A single node within a syntax {@link Tree}. */
-	export class Node {
-		/**
-		 * The numeric id for this node that is unique.
-		 *
-		 * Within a given syntax tree, no two nodes have the same id. However:
-		 *
-		 * * If a new tree is created based on an older tree, and a node from the old tree is reused in
-		 *   the process, then that node will have the same id in both trees.
-		 *
-		 * * A node not marked as having changes does not guarantee it was reused.
-		 *
-		 * * If a node is marked as having changed in the old tree, it will not be reused.
-		 */
-		id: number;
-		/** The byte index where this node starts. */
-		startIndex: number;
-		/** The position where this node starts. */
-		startPosition: Point;
-		/** The tree that this node belongs to. */
-		tree: Tree;
-		/** Get this node's type as a numerical id. */
-		get typeId(): number;
-		/**
-		 * Get the node's type as a numerical id as it appears in the grammar,
-		 * ignoring aliases.
-		 */
-		get grammarId(): number;
-		/** Get this node's type as a string. */
-		get type(): string;
-		/**
-		 * Get this node's symbol name as it appears in the grammar, ignoring
-		 * aliases as a string.
-		 */
-		get grammarType(): string;
-		/**
-		 * Check if this node is *named*.
-		 *
-		 * Named nodes correspond to named rules in the grammar, whereas
-		 * *anonymous* nodes correspond to string literals in the grammar.
-		 */
-		get isNamed(): boolean;
-		/**
-		 * Check if this node is *extra*.
-		 *
-		 * Extra nodes represent things like comments, which are not required
-		 * by the grammar, but can appear anywhere.
-		 */
-		get isExtra(): boolean;
-		/**
-		 * Check if this node represents a syntax error.
-		 *
-		 * Syntax errors represent parts of the code that could not be incorporated
-		 * into a valid syntax tree.
-		 */
-		get isError(): boolean;
-		/**
-		 * Check if this node is *missing*.
-		 *
-		 * Missing nodes are inserted by the parser in order to recover from
-		 * certain kinds of syntax errors.
-		 */
-		get isMissing(): boolean;
-		/** Check if this node has been edited. */
-		get hasChanges(): boolean;
-		/**
-		 * Check if this node represents a syntax error or contains any syntax
-		 * errors anywhere within it.
-		 */
-		get hasError(): boolean;
-		/** Get the byte index where this node ends. */
-		get endIndex(): number;
-		/** Get the position where this node ends. */
-		get endPosition(): Point;
-		/** Get the string content of this node. */
-		get text(): string;
-		/** Get this node's parse state. */
-		get parseState(): number;
-		/** Get the parse state after this node. */
-		get nextParseState(): number;
-		/** Check if this node is equal to another node. */
-		equals(other: Node): boolean;
-		/**
-		 * Get the node's child at the given index, where zero represents the first child.
-		 *
-		 * This method is fairly fast, but its cost is technically log(n), so if
-		 * you might be iterating over a long list of children, you should use
-		 * {@link Node#children} instead.
-		 */
-		child(index: number): Node | null;
-		/**
-		 * Get this node's *named* child at the given index.
-		 *
-		 * See also {@link Node#isNamed}.
-		 * This method is fairly fast, but its cost is technically log(n), so if
-		 * you might be iterating over a long list of children, you should use
-		 * {@link Node#namedChildren} instead.
-		 */
-		namedChild(index: number): Node | null;
-		/**
-		 * Get this node's child with the given numerical field id.
-		 *
-		 * See also {@link Node#childForFieldName}. You can
-		 * convert a field name to an id using {@link Language#fieldIdForName}.
-		 */
-		childForFieldId(fieldId: number): Node | null;
-		/**
-		 * Get the first child with the given field name.
-		 *
-		 * If multiple children may have the same field name, access them using
-		 * {@link Node#childrenForFieldName}.
-		 */
-		childForFieldName(fieldName: string): Node | null;
-		/** Get the field name of this node's child at the given index. */
-		fieldNameForChild(index: number): string | null;
-		/** Get the field name of this node's named child at the given index. */
-		fieldNameForNamedChild(index: number): string | null;
-		/**
-		 * Get an array of this node's children with a given field name.
-		 *
-		 * See also {@link Node#children}.
-		 */
-		childrenForFieldName(fieldName: string): Node[];
-		/**
-		  * Get an array of this node's children with a given field id.
-		  *
-		  * See also {@link Node#childrenForFieldName}.
-		  */
-		childrenForFieldId(fieldId: number): Node[];
-		/** Get the node's first child that contains or starts after the given byte offset. */
-		firstChildForIndex(index: number): Node | null;
-		/** Get the node's first named child that contains or starts after the given byte offset. */
-		firstNamedChildForIndex(index: number): Node | null;
-		/** Get this node's number of children. */
-		get childCount(): number;
-		/**
-		 * Get this node's number of *named* children.
-		 *
-		 * See also {@link Node#isNamed}.
-		 */
-		get namedChildCount(): number;
-		/** Get this node's first child. */
-		get firstChild(): Node | null;
-		/**
-		 * Get this node's first named child.
-		 *
-		 * See also {@link Node#isNamed}.
-		 */
-		get firstNamedChild(): Node | null;
-		/** Get this node's last child. */
-		get lastChild(): Node | null;
-		/**
-		 * Get this node's last named child.
-		 *
-		 * See also {@link Node#isNamed}.
-		 */
-		get lastNamedChild(): Node | null;
-		/**
-		 * Iterate over this node's children.
-		 *
-		 * If you're walking the tree recursively, you may want to use the
-		 * {@link TreeCursor} APIs directly instead.
-		 */
-		get children(): Node[];
-		/**
-		 * Iterate over this node's named children.
-		 *
-		 * See also {@link Node#children}.
-		 */
-		get namedChildren(): Node[];
-		/**
-		 * Get the descendants of this node that are the given type, or in the given types array.
-		 *
-		 * The types array should contain node type strings, which can be retrieved from {@link Language#types}.
-		 *
-		 * Additionally, a `startPosition` and `endPosition` can be passed in to restrict the search to a byte range.
-		 */
-		descendantsOfType(types: string | string[], startPosition?: Point, endPosition?: Point): Node[];
-		/** Get this node's next sibling. */
-		get nextSibling(): Node | null;
-		/** Get this node's previous sibling. */
-		get previousSibling(): Node | null;
-		/**
-		 * Get this node's next *named* sibling.
-		 *
-		 * See also {@link Node#isNamed}.
-		 */
-		get nextNamedSibling(): Node | null;
-		/**
-		 * Get this node's previous *named* sibling.
-		 *
-		 * See also {@link Node#isNamed}.
-		 */
-		get previousNamedSibling(): Node | null;
-		/** Get the node's number of descendants, including one for the node itself. */
-		get descendantCount(): number;
-		/**
-		 * Get this node's immediate parent.
-		 * Prefer {@link Node#childWithDescendant} for iterating over this node's ancestors.
-		 */
-		get parent(): Node | null;
-		/**
-		 * Get the node that contains `descendant`.
-		 *
-		 * Note that this can return `descendant` itself.
-		 */
-		childWithDescendant(descendant: Node): Node | null;
-		/** Get the smallest node within this node that spans the given byte range. */
-		descendantForIndex(start: number, end?: number): Node | null;
-		/** Get the smallest named node within this node that spans the given byte range. */
-		namedDescendantForIndex(start: number, end?: number): Node | null;
-		/** Get the smallest node within this node that spans the given point range. */
-		descendantForPosition(start: Point, end?: Point): Node | null;
-		/** Get the smallest named node within this node that spans the given point range. */
-		namedDescendantForPosition(start: Point, end?: Point): Node | null;
-		/**
-		 * Create a new {@link TreeCursor} starting from this node.
-		 *
-		 * Note that the given node is considered the root of the cursor,
-		 * and the cursor cannot walk outside this node.
-		 */
-		walk(): TreeCursor;
-		/**
-		 * Edit this node to keep it in-sync with source code that has been edited.
-		 *
-		 * This function is only rarely needed. When you edit a syntax tree with
-		 * the {@link Tree#edit} method, all of the nodes that you retrieve from
-		 * the tree afterward will already reflect the edit. You only need to
-		 * use {@link Node#edit} when you have a specific {@link Node} instance that
-		 * you want to keep and continue to use after an edit.
-		 */
-		edit(edit: Edit): void;
-		/** Get the S-expression representation of this node. */
-		toString(): string;
-	}
-	/** A stateful object for walking a syntax {@link Tree} efficiently. */
-	export class TreeCursor {
-		/** Creates a deep copy of the tree cursor. This allocates new memory. */
-		copy(): TreeCursor;
-		/** Delete the tree cursor, freeing its resources. */
-		delete(): void;
-		/** Get the tree cursor's current {@link Node}. */
-		get currentNode(): Node;
-		/**
-		 * Get the numerical field id of this tree cursor's current node.
-		 *
-		 * See also {@link TreeCursor#currentFieldName}.
-		 */
-		get currentFieldId(): number;
-		/** Get the field name of this tree cursor's current node. */
-		get currentFieldName(): string | null;
-		/**
-		 * Get the depth of the cursor's current node relative to the original
-		 * node that the cursor was constructed with.
-		 */
-		get currentDepth(): number;
-		/**
-		 * Get the index of the cursor's current node out of all of the
-		 * descendants of the original node that the cursor was constructed with.
-		 */
-		get currentDescendantIndex(): number;
-		/** Get the type of the cursor's current node. */
-		get nodeType(): string;
-		/** Get the type id of the cursor's current node. */
-		get nodeTypeId(): number;
-		/** Get the state id of the cursor's current node. */
-		get nodeStateId(): number;
-		/** Get the id of the cursor's current node. */
-		get nodeId(): number;
-		/**
-		 * Check if the cursor's current node is *named*.
-		 *
-		 * Named nodes correspond to named rules in the grammar, whereas
-		 * *anonymous* nodes correspond to string literals in the grammar.
-		 */
-		get nodeIsNamed(): boolean;
-		/**
-		 * Check if the cursor's current node is *missing*.
-		 *
-		 * Missing nodes are inserted by the parser in order to recover from
-		 * certain kinds of syntax errors.
-		 */
-		get nodeIsMissing(): boolean;
-		/** Get the string content of the cursor's current node. */
-		get nodeText(): string;
-		/** Get the start position of the cursor's current node. */
-		get startPosition(): Point;
-		/** Get the end position of the cursor's current node. */
-		get endPosition(): Point;
-		/** Get the start index of the cursor's current node. */
-		get startIndex(): number;
-		/** Get the end index of the cursor's current node. */
-		get endIndex(): number;
-		/**
-		 * Move this cursor to the first child of its current node.
-		 *
-		 * This returns `true` if the cursor successfully moved, and returns
-		 * `false` if there were no children.
-		 */
-		gotoFirstChild(): boolean;
-		/**
-		 * Move this cursor to the last child of its current node.
-		 *
-		 * This returns `true` if the cursor successfully moved, and returns
-		 * `false` if there were no children.
-		 *
-		 * Note that this function may be slower than
-		 * {@link TreeCursor#gotoFirstChild} because it needs to
-		 * iterate through all the children to compute the child's position.
-		 */
-		gotoLastChild(): boolean;
-		/**
-		 * Move this cursor to the parent of its current node.
-		 *
-		 * This returns `true` if the cursor successfully moved, and returns
-		 * `false` if there was no parent node (the cursor was already on the
-		 * root node).
-		 *
-		 * Note that the node the cursor was constructed with is considered the root
-		 * of the cursor, and the cursor cannot walk outside this node.
-		 */
-		gotoParent(): boolean;
-		/**
-		 * Move this cursor to the next sibling of its current node.
-		 *
-		 * This returns `true` if the cursor successfully moved, and returns
-		 * `false` if there was no next sibling node.
-		 *
-		 * Note that the node the cursor was constructed with is considered the root
-		 * of the cursor, and the cursor cannot walk outside this node.
-		 */
-		gotoNextSibling(): boolean;
-		/**
-		 * Move this cursor to the previous sibling of its current node.
-		 *
-		 * This returns `true` if the cursor successfully moved, and returns
-		 * `false` if there was no previous sibling node.
-		 *
-		 * Note that this function may be slower than
-		 * {@link TreeCursor#gotoNextSibling} due to how node
-		 * positions are stored. In the worst case, this will need to iterate
-		 * through all the children up to the previous sibling node to recalculate
-		 * its position. Also note that the node the cursor was constructed with is
-		 * considered the root of the cursor, and the cursor cannot walk outside this node.
-		 */
-		gotoPreviousSibling(): boolean;
-		/**
-		 * Move the cursor to the node that is the nth descendant of
-		 * the original node that the cursor was constructed with, where
-		 * zero represents the original node itself.
-		 */
-		gotoDescendant(goalDescendantIndex: number): void;
-		/**
-		 * Move this cursor to the first child of its current node that contains or
-		 * starts after the given byte offset.
-		 *
-		 * This returns `true` if the cursor successfully moved to a child node, and returns
-		 * `false` if no such child was found.
-		 */
-		gotoFirstChildForIndex(goalIndex: number): boolean;
-		/**
-		 * Move this cursor to the first child of its current node that contains or
-		 * starts after the given byte offset.
-		 *
-		 * This returns the index of the child node if one was found, and returns
-		 * `null` if no such child was found.
-		 */
-		gotoFirstChildForPosition(goalPosition: Point): boolean;
-		/**
-		 * Re-initialize this tree cursor to start at the original node that the
-		 * cursor was constructed with.
-		 */
-		reset(node: Node): void;
-		/**
-		 * Re-initialize a tree cursor to the same position as another cursor.
-		 *
-		 * Unlike {@link TreeCursor#reset}, this will not lose parent
-		 * information and allows reusing already created cursors.
-		 */
-		resetTo(cursor: TreeCursor): void;
-	}
-	/**
-	 * Options for query execution
-	 */
-	export interface QueryOptions {
-		/** The start position of the range to query */
-		startPosition?: Point;
-		/** The end position of the range to query */
-		endPosition?: Point;
-		/** The start index of the range to query */
-		startIndex?: number;
-		/** The end index of the range to query */
-		endIndex?: number;
-		/**
-		 * The maximum number of in-progress matches for this query.
-		 * The limit must be > 0 and <= 65536.
-		 */
-		matchLimit?: number;
-		/**
-		 * The maximum start depth for a query cursor.
-		 *
-		 * This prevents cursors from exploring children nodes at a certain depth.
-		 * Note if a pattern includes many children, then they will still be
-		 * checked.
-		 *
-		 * The zero max start depth value can be used as a special behavior and
-		 * it helps to destructure a subtree by staying on a node and using
-		 * captures for interested parts. Note that the zero max start depth
-		 * only limit a search depth for a pattern's root node but other nodes
-		 * that are parts of the pattern may be searched at any depth what
-		 * defined by the pattern structure.
-		 *
-		 * Set to `null` to remove the maximum start depth.
-		 */
-		maxStartDepth?: number;
-		/**
-		 * The maximum duration in microseconds that query execution should be allowed to
-		 * take before halting.
-		 *
-		 * If query execution takes longer than this, it will halt early, returning an empty array.
-		 */
-		timeoutMicros?: number;
-		/**
-		 * A function that will be called periodically during the execution of the query to check
-		 * if query execution should be cancelled. You can also use this to instrument query execution
-		 * and check where the query is at in the document. The progress callback takes a single argument,
-		 * which is a {@link QueryState} representing the current state of the query.
-		 */
-		progressCallback?: (state: QueryState) => void;
-	}
-	/**
-	 * A stateful object that is passed into the progress callback {@link QueryOptions#progressCallback}
-	 * to provide the current state of the query.
-	 */
-	export interface QueryState {
-		/** The byte offset in the document that the query is at. */
-		currentOffset: number;
-	}
-	/** A record of key-value pairs associated with a particular pattern in a {@link Query}. */
-	export type QueryProperties = Record;
-	/**
-	 * A predicate that contains an operator and list of operands.
-	 */
-	export interface QueryPredicate {
-		/** The operator of the predicate, like `match?`, `eq?`, `set!`, etc. */
-		operator: string;
-		/** The operands of the predicate, which are either captures or strings. */
-		operands: PredicateStep[];
-	}
-	/**
-	 * A particular {@link Node} that has been captured with a particular name within a
-	 * {@link Query}.
-	 */
-	export interface QueryCapture {
-		/** The index of the pattern that matched. */
-		patternIndex: number;
-		/** The name of the capture */
-		name: string;
-		/** The captured node */
-		node: Node;
-		/** The properties for predicates declared with the operator `set!`. */
-		setProperties?: QueryProperties;
-		/** The properties for predicates declared with the operator `is?`. */
-		assertedProperties?: QueryProperties;
-		/** The properties for predicates declared with the operator `is-not?`. */
-		refutedProperties?: QueryProperties;
-	}
-	/** A match of a {@link Query} to a particular set of {@link Node}s. */
-	export interface QueryMatch {
-		/** @deprecated since version 0.25.0, use `patternIndex` instead. */
-		pattern: number;
-		/** The index of the pattern that matched. */
-		patternIndex: number;
-		/** The captures associated with the match. */
-		captures: QueryCapture[];
-		/** The properties for predicates declared with the operator `set!`. */
-		setProperties?: QueryProperties;
-		/** The properties for predicates declared with the operator `is?`. */
-		assertedProperties?: QueryProperties;
-		/** The properties for predicates declared with the operator `is-not?`. */
-		refutedProperties?: QueryProperties;
-	}
-	/** A quantifier for captures */
-	export const CaptureQuantifier: {
-		readonly Zero: 0;
-		readonly ZeroOrOne: 1;
-		readonly ZeroOrMore: 2;
-		readonly One: 3;
-		readonly OneOrMore: 4;
-	};
-	/** A quantifier for captures */
-	export type CaptureQuantifier = typeof CaptureQuantifier[keyof typeof CaptureQuantifier];
-	/**
-	 * Predicates are represented as a single array of steps. There are two
-	 * types of steps, which correspond to the two legal values for
-	 * the `type` field:
-	 *
-	 * - `CapturePredicateStep` - Steps with this type represent names
-	 *    of captures.
-	 *
-	 * - `StringPredicateStep` - Steps with this type represent literal
-	 *    strings.
-	 */
-	export type PredicateStep = CapturePredicateStep | StringPredicateStep;
-	/**
-	 * A step in a predicate that refers to a capture.
-	 *
-	 * The `name` field is the name of the capture.
-	 */
-	interface CapturePredicateStep {
-		type: 'capture';
-		name: string;
-	}
-	/**
-	 * A step in a predicate that refers to a string.
-	 *
-	 * The `value` field is the string value.
-	 */
-	interface StringPredicateStep {
-		type: 'string';
-		value: string;
-	}
-	export class Query {
-		/** The names of the captures used in the query. */
-		readonly captureNames: string[];
-		/** The quantifiers of the captures used in the query. */
-		readonly captureQuantifiers: CaptureQuantifier[][];
-		/**
-		 * The other user-defined predicates associated with the given index.
-		 *
-		 * This includes predicates with operators other than:
-		 * - `match?`
-		 * - `eq?` and `not-eq?`
-		 * - `any-of?` and `not-any-of?`
-		 * - `is?` and `is-not?`
-		 * - `set!`
-		 */
-		readonly predicates: QueryPredicate[][];
-		/** The properties for predicates with the operator `set!`. */
-		readonly setProperties: QueryProperties[];
-		/** The properties for predicates with the operator `is?`. */
-		readonly assertedProperties: QueryProperties[];
-		/** The properties for predicates with the operator `is-not?`. */
-		readonly refutedProperties: QueryProperties[];
-		/** The maximum number of in-progress matches for this cursor. */
-		matchLimit?: number;
-		/**
-		 * Create a new query from a string containing one or more S-expression
-		 * patterns.
-		 *
-		 * The query is associated with a particular language, and can only be run
-		 * on syntax nodes parsed with that language. References to Queries can be
-		 * shared between multiple threads.
-		 *
-		 * @link {@see https://tree-sitter.github.io/tree-sitter/using-parsers/queries}
-		 */
-		constructor(language: Language, source: string);
-		/** Delete the query, freeing its resources. */
-		delete(): void;
-		/**
-		 * Iterate over all of the matches in the order that they were found.
-		 *
-		 * Each match contains the index of the pattern that matched, and a list of
-		 * captures. Because multiple patterns can match the same set of nodes,
-		 * one match may contain captures that appear *before* some of the
-		 * captures from a previous match.
-		 *
-		 * @param node - The node to execute the query on.
-		 *
-		 * @param options - Options for query execution.
-		 */
-		matches(node: Node, options?: QueryOptions): QueryMatch[];
-		/**
-		 * Iterate over all of the individual captures in the order that they
-		 * appear.
-		 *
-		 * This is useful if you don't care about which pattern matched, and just
-		 * want a single, ordered sequence of captures.
-		 *
-		 * @param node - The node to execute the query on.
-		 *
-		 * @param options - Options for query execution.
-		 */
-		captures(node: Node, options?: QueryOptions): QueryCapture[];
-		/** Get the predicates for a given pattern. */
-		predicatesForPattern(patternIndex: number): QueryPredicate[];
-		/**
-		 * Disable a certain capture within a query.
-		 *
-		 * This prevents the capture from being returned in matches, and also
-		 * avoids any resource usage associated with recording the capture.
-		 */
-		disableCapture(captureName: string): void;
-		/**
-		 * Disable a certain pattern within a query.
-		 *
-		 * This prevents the pattern from matching, and also avoids any resource
-		 * usage associated with the pattern. This throws an error if the pattern
-		 * index is out of bounds.
-		 */
-		disablePattern(patternIndex: number): void;
-		/**
-		 * Check if, on its last execution, this cursor exceeded its maximum number
-		 * of in-progress matches.
-		 */
-		didExceedMatchLimit(): boolean;
-		/** Get the byte offset where the given pattern starts in the query's source. */
-		startIndexForPattern(patternIndex: number): number;
-		/** Get the byte offset where the given pattern ends in the query's source. */
-		endIndexForPattern(patternIndex: number): number;
-		/** Get the number of patterns in the query. */
-		patternCount(): number;
-		/** Get the index for a given capture name. */
-		captureIndexForName(captureName: string): number;
-		/** Check if a given pattern within a query has a single root node. */
-		isPatternRooted(patternIndex: number): boolean;
-		/** Check if a given pattern within a query has a single root node. */
-		isPatternNonLocal(patternIndex: number): boolean;
-		/**
-		 * Check if a given step in a query is 'definite'.
-		 *
-		 * A query step is 'definite' if its parent pattern will be guaranteed to
-		 * match successfully once it reaches the step.
-		 */
-		isPatternGuaranteedAtStep(byteIndex: number): boolean;
-	}
-	export class LookaheadIterator implements Iterable {
-		/** Get the current symbol of the lookahead iterator. */
-		get currentTypeId(): number;
-		/** Get the current symbol name of the lookahead iterator. */
-		get currentType(): string;
-		/** Delete the lookahead iterator, freeing its resources. */
-		delete(): void;
-		/**
-		 * Reset the lookahead iterator.
-		 *
-		 * This returns `true` if the language was set successfully and `false`
-		 * otherwise.
-		 */
-		reset(language: Language, stateId: number): boolean;
-		/**
-		 * Reset the lookahead iterator to another state.
-		 *
-		 * This returns `true` if the iterator was reset to the given state and
-		 * `false` otherwise.
-		 */
-		resetState(stateId: number): boolean;
-		/**
-		 * Returns an iterator that iterates over the symbols of the lookahead iterator.
-		 *
-		 * The iterator will yield the current symbol name as a string for each step
-		 * until there are no more symbols to iterate over.
-		 */
-		[Symbol.iterator](): Iterator;
-	}
-
-	export {};
-}
-
-//# sourceMappingURL=web-tree-sitter.d.cts.map
\ No newline at end of file
diff --git a/lib/binding_web/web-tree-sitter.d.cts.map b/lib/binding_web/web-tree-sitter.d.cts.map
deleted file mode 100644
index c5c21af2..00000000
--- a/lib/binding_web/web-tree-sitter.d.cts.map
+++ /dev/null
@@ -1,56 +0,0 @@
-{
-	"version": 3,
-	"file": "web-tree-sitter.d.cts",
-	"names": [
-		"Point",
-		"Range",
-		"Edit",
-		"ParseCallback",
-		"ProgressCallback",
-		"LogCallback",
-		"ParseOptions",
-		"ParseState",
-		"LANGUAGE_VERSION",
-		"MIN_COMPATIBLE_VERSION",
-		"Parser",
-		"LanguageMetadata",
-		"Language",
-		"Tree",
-		"Node",
-		"TreeCursor",
-		"QueryOptions",
-		"QueryState",
-		"QueryProperties",
-		"QueryPredicate",
-		"QueryCapture",
-		"QueryMatch",
-		"CaptureQuantifier",
-		"PredicateStep",
-		"CapturePredicateStep",
-		"StringPredicateStep",
-		"Query",
-		"LookaheadIterator"
-	],
-	"sources": [
-		"src/constants.ts",
-		"src/parser.ts",
-		"src/language.ts",
-		"src/tree.ts",
-		"src/node.ts",
-		"src/tree_cursor.ts",
-		"src/query.ts",
-		"src/lookahead_iterator.ts"
-	],
-	"sourcesContent": [
-		null,
-		null,
-		null,
-		null,
-		null,
-		null,
-		null,
-		null
-	],
-	"mappings": ";;;;;;mBASiBA,KAAKA;;;;;;;;;;mBAYLC,KAAKA;;;;;;;;;;;;;mBAiBLC,IAAIA;;;;;;;;;;;;;;;;;cA4CTC,aAAaA;;;;cAKbC,gBAAgBA;;;;;;cAOhBC,WAAWA;;;;;;;;;;;;kBC7ENC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmCZC,UAAUA;;;;;;;;;;;;;;;YAwBhBC,gBAAgBA;;;;;YAMhBC,sBAAsBA;;;;;cAMpBC,MAAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OChFNC,gBAAgBA;;;;;;;;;cAUhBC,QAAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cCYRC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cCrBJC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cCFJC,UAAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCQNC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA0DZC,UAAUA;;;;;aAMfC,eAAeA;;;;kBAKVC,cAAcA;;;;;;;;;;kBAYdC,YAAYA;;;;;;;;;;;;;;;kBAqBZC,UAAUA;;;;;;;;;;;;;;;cA8BfC,iBAAiBA;;;;;;;;aAAjBA,iBAAiBA;;;;;;;;;;;;aAajBC,aAAaA;;;;;;WAORC,oBAAoBA;;;;;;;;;WAOpBC,mBAAmBA;;;;cAqUvBC,KAAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cChfLC,iBAAiBA",
-	"ignoreList": []
-}
\ No newline at end of file
diff --git a/lib/binding_web/web-tree-sitter.d.ts b/lib/binding_web/web-tree-sitter.d.ts
deleted file mode 100644
index 2b6d6724..00000000
--- a/lib/binding_web/web-tree-sitter.d.ts
+++ /dev/null
@@ -1,1030 +0,0 @@
-declare module 'web-tree-sitter' {
-	/**
-	 * A position in a multi-line text document, in terms of rows and columns.
-	 *
-	 * Rows and columns are zero-based.
-	 */
-	export interface Point {
-		/** The zero-based row number. */
-		row: number;
-		/** The zero-based column number. */
-		column: number;
-	}
-	/**
-	 *  A range of positions in a multi-line text document, both in terms of bytes
-	 *  and of rows and columns.
-	 */
-	export interface Range {
-		/** The start position of the range. */
-		startPosition: Point;
-		/** The end position of the range. */
-		endPosition: Point;
-		/** The start index of the range. */
-		startIndex: number;
-		/** The end index of the range. */
-		endIndex: number;
-	}
-	/**
-	 * A summary of a change to a text document.
-	 */
-	export interface Edit {
-		/** The start position of the change. */
-		startPosition: Point;
-		/** The end position of the change before the edit. */
-		oldEndPosition: Point;
-		/** The end position of the change after the edit. */
-		newEndPosition: Point;
-		/** The start index of the change. */
-		startIndex: number;
-		/** The end index of the change before the edit. */
-		oldEndIndex: number;
-		/** The end index of the change after the edit. */
-		newEndIndex: number;
-	}
-	/**
-	 * A callback for parsing that takes an index and point, and should return a string.
-	 */
-	export type ParseCallback = (index: number, position: Point) => string | undefined;
-	/**
-	 * A callback that receives the parse state during parsing.
-	 */
-	export type ProgressCallback = (progress: ParseState) => boolean;
-	/**
-	 * A callback for logging messages.
-	 *
-	 * If `isLex` is `true`, the message is from the lexer, otherwise it's from the parser.
-	 */
-	export type LogCallback = (message: string, isLex: boolean) => void;
-	/**
-	 * Options for parsing
-	 *
-	 * The `includedRanges` property is an array of {@link Range} objects that
-	 * represent the ranges of text that the parser should include when parsing.
-	 *
-	 * The `progressCallback` property is a function that is called periodically
-	 * during parsing to check whether parsing should be cancelled.
-	 *
-	 * See {@link Parser#parse} for more information.
-	 */
-	export interface ParseOptions {
-		/**
-		 * An array of {@link Range} objects that
-		 * represent the ranges of text that the parser should include when parsing.
-		 *
-		 * This sets the ranges of text that the parser should include when parsing.
-		 * By default, the parser will always include entire documents. This
-		 * function allows you to parse only a *portion* of a document but
-		 * still return a syntax tree whose ranges match up with the document
-		 * as a whole. You can also pass multiple disjoint ranges.
-		 * If `ranges` is empty, then the entire document will be parsed.
-		 * Otherwise, the given ranges must be ordered from earliest to latest
-		 * in the document, and they must not overlap. That is, the following
-		 * must hold for all `i` < `length - 1`:
-		 * ```text
-		 *     ranges[i].end_byte <= ranges[i + 1].start_byte
-		 * ```
-		 */
-		includedRanges?: Range[];
-		/**
-		 * A function that is called periodically during parsing to check
-		 * whether parsing should be cancelled. If the progress callback returns
-		 * `true`, then parsing will be cancelled. You can also use this to instrument
-		 * parsing and check where the parser is at in the document. The progress callback
-		 * takes a single argument, which is a {@link ParseState} representing the current
-		 * state of the parser.
-		 */
-		progressCallback?: (state: ParseState) => void;
-	}
-	/**
-	 * A stateful object that is passed into the progress callback {@link ParseOptions#progressCallback}
-	 * to provide the current state of the parser.
-	 */
-	export interface ParseState {
-		/** The byte offset in the document that the parser is at. */
-		currentOffset: number;
-		/** Indicates whether the parser has encountered an error during parsing. */
-		hasError: boolean;
-	}
-	/**
-	 * The latest ABI version that is supported by the current version of the
-	 * library.
-	 *
-	 * When Languages are generated by the Tree-sitter CLI, they are
-	 * assigned an ABI version number that corresponds to the current CLI version.
-	 * The Tree-sitter library is generally backwards-compatible with languages
-	 * generated using older CLI versions, but is not forwards-compatible.
-	 */
-	export let LANGUAGE_VERSION: number;
-	/**
-	 * The earliest ABI version that is supported by the current version of the
-	 * library.
-	 */
-	export let MIN_COMPATIBLE_VERSION: number;
-	/**
-	 * A stateful object that is used to produce a {@link Tree} based on some
-	 * source code.
-	 */
-	export class Parser {
-		/** The parser's current language. */
-		language: Language | null;
-		/**
-		 * This must always be called before creating a Parser.
-		 *
-		 * You can optionally pass in options to configure the Wasm module, the most common
-		 * one being `locateFile` to help the module find the `.wasm` file.
-		 */
-		static init(moduleOptions?: Partial): Promise;
-		/**
-		 * Create a new parser.
-		 */
-		constructor();
-		/** Delete the parser, freeing its resources. */
-		delete(): void;
-		/**
-		 * Set the language that the parser should use for parsing.
-		 *
-		 * If the language was not successfully assigned, an error will be thrown.
-		 * This happens if the language was generated with an incompatible
-		 * version of the Tree-sitter CLI. Check the language's version using
-		 * {@link Language#version} and compare it to this library's
-		 * {@link LANGUAGE_VERSION} and {@link MIN_COMPATIBLE_VERSION} constants.
-		 */
-		setLanguage(language: Language | null): this;
-		/**
-		 * Parse a slice of UTF8 text.
-		 *
-		 * @param callback - The UTF8-encoded text to parse or a callback function.
-		 *
-		 * @param oldTree - A previous syntax tree parsed from the same document. If the text of the
-		 *   document has changed since `oldTree` was created, then you must edit `oldTree` to match
-		 *   the new text using {@link Tree#edit}.
-		 *
-		 * @param options - Options for parsing the text.
-		 *  This can be used to set the included ranges, or a progress callback.
-		 *
-		 * @returns A {@link Tree} if parsing succeeded, or `null` if:
-		 *  - The parser has not yet had a language assigned with {@link Parser#setLanguage}.
-		 *  - The progress callback returned true.
-		 */
-		parse(callback: string | ParseCallback, oldTree?: Tree | null, options?: ParseOptions): Tree | null;
-		/**
-		 * Instruct the parser to start the next parse from the beginning.
-		 *
-		 * If the parser previously failed because of a timeout, cancellation,
-		 * or callback, then by default, it will resume where it left off on the
-		 * next call to {@link Parser#parse} or other parsing functions.
-		 * If you don't want to resume, and instead intend to use this parser to
-		 * parse some other document, you must call `reset` first.
-		 */
-		reset(): void;
-		/** Get the ranges of text that the parser will include when parsing. */
-		getIncludedRanges(): Range[];
-		/**
-		 * @deprecated since version 0.25.0, prefer passing a progress callback to {@link Parser#parse}
-		 *
-		 * Get the duration in microseconds that parsing is allowed to take.
-		 *
-		 * This is set via {@link Parser#setTimeoutMicros}.
-		 */
-		getTimeoutMicros(): number;
-		/**
-		 * @deprecated since version 0.25.0, prefer passing a progress callback to {@link Parser#parse}
-		 *
-		 * Set the maximum duration in microseconds that parsing should be allowed
-		 * to take before halting.
-		 *
-		 * If parsing takes longer than this, it will halt early, returning `null`.
-		 * See {@link Parser#parse} for more information.
-		 */
-		setTimeoutMicros(timeout: number): void;
-		/** Set the logging callback that a parser should use during parsing. */
-		setLogger(callback: LogCallback | boolean | null): this;
-		/** Get the parser's current logger. */
-		getLogger(): LogCallback | null;
-	}
-	class LanguageMetadata {
-		readonly major_version: number;
-		readonly minor_version: number;
-		readonly patch_version: number;
-	}
-	/**
-	 * An opaque object that defines how to parse a particular language.
-	 * The code for each `Language` is generated by the Tree-sitter CLI.
-	 */
-	export class Language {
-		/**
-		 * A list of all node types in the language. The index of each type in this
-		 * array is its node type id.
-		 */
-		types: string[];
-		/**
-		 * A list of all field names in the language. The index of each field name in
-		 * this array is its field id.
-		 */
-		fields: (string | null)[];
-		/**
-		 * Gets the name of the language.
-		 */
-		get name(): string | null;
-		/**
-		 * @deprecated since version 0.25.0, use {@link Language#abiVersion} instead
-		 * Gets the version of the language.
-		 */
-		get version(): number;
-		/**
-		 * Gets the ABI version of the language.
-		 */
-		get abiVersion(): number;
-		/**
-		* Get the metadata for this language. This information is generated by the
-		* CLI, and relies on the language author providing the correct metadata in
-		* the language's `tree-sitter.json` file.
-		*/
-		get metadata(): LanguageMetadata | null;
-		/**
-		 * Gets the number of fields in the language.
-		 */
-		get fieldCount(): number;
-		/**
-		 * Gets the number of states in the language.
-		 */
-		get stateCount(): number;
-		/**
-		 * Get the field id for a field name.
-		 */
-		fieldIdForName(fieldName: string): number | null;
-		/**
-		 * Get the field name for a field id.
-		 */
-		fieldNameForId(fieldId: number): string | null;
-		/**
-		 * Get the node type id for a node type name.
-		 */
-		idForNodeType(type: string, named: boolean): number | null;
-		/**
-		 * Gets the number of node types in the language.
-		 */
-		get nodeTypeCount(): number;
-		/**
-		 * Get the node type name for a node type id.
-		 */
-		nodeTypeForId(typeId: number): string | null;
-		/**
-		 * Check if a node type is named.
-		 *
-		 * @see {@link https://tree-sitter.github.io/tree-sitter/using-parsers/2-basic-parsing.html#named-vs-anonymous-nodes}
-		 */
-		nodeTypeIsNamed(typeId: number): boolean;
-		/**
-		 * Check if a node type is visible.
-		 */
-		nodeTypeIsVisible(typeId: number): boolean;
-		/**
-		 * Get the supertypes ids of this language.
-		 *
-		 * @see {@link https://tree-sitter.github.io/tree-sitter/using-parsers/6-static-node-types.html?highlight=supertype#supertype-nodes}
-		 */
-		get supertypes(): number[];
-		/**
-		 * Get the subtype ids for a given supertype node id.
-		 */
-		subtypes(supertype: number): number[];
-		/**
-		 * Get the next state id for a given state id and node type id.
-		 */
-		nextState(stateId: number, typeId: number): number;
-		/**
-		 * Create a new lookahead iterator for this language and parse state.
-		 *
-		 * This returns `null` if state is invalid for this language.
-		 *
-		 * Iterating {@link LookaheadIterator} will yield valid symbols in the given
-		 * parse state. Newly created lookahead iterators will return the `ERROR`
-		 * symbol from {@link LookaheadIterator#currentType}.
-		 *
-		 * Lookahead iterators can be useful for generating suggestions and improving
-		 * syntax error diagnostics. To get symbols valid in an `ERROR` node, use the
-		 * lookahead iterator on its first leaf node state. For `MISSING` nodes, a
-		 * lookahead iterator created on the previous non-extra leaf node may be
-		 * appropriate.
-		 */
-		lookaheadIterator(stateId: number): LookaheadIterator | null;
-		/**
-		 * @deprecated since version 0.25.0, call `new` on a {@link Query} instead
-		 *
-		 * Create a new query from a string containing one or more S-expression
-		 * patterns.
-		 *
-		 * The query is associated with a particular language, and can only be run
-		 * on syntax nodes parsed with that language. References to Queries can be
-		 * shared between multiple threads.
-		 *
-		 * @link {@see https://tree-sitter.github.io/tree-sitter/using-parsers/queries}
-		 */
-		query(source: string): Query;
-		/**
-		 * Load a language from a WebAssembly module.
-		 * The module can be provided as a path to a file or as a buffer.
-		 */
-		static load(input: string | Uint8Array): Promise;
-	}
-	/** A tree that represents the syntactic structure of a source code file. */
-	export class Tree {
-		/** The language that was used to parse the syntax tree. */
-		language: Language;
-		/** Create a shallow copy of the syntax tree. This is very fast. */
-		copy(): Tree;
-		/** Delete the syntax tree, freeing its resources. */
-		delete(): void;
-		/** Get the root node of the syntax tree. */
-		get rootNode(): Node;
-		/**
-		 * Get the root node of the syntax tree, but with its position shifted
-		 * forward by the given offset.
-		 */
-		rootNodeWithOffset(offsetBytes: number, offsetExtent: Point): Node;
-		/**
-		 * Edit the syntax tree to keep it in sync with source code that has been
-		 * edited.
-		 *
-		 * You must describe the edit both in terms of byte offsets and in terms of
-		 * row/column coordinates.
-		 */
-		edit(edit: Edit): void;
-		/** Create a new {@link TreeCursor} starting from the root of the tree. */
-		walk(): TreeCursor;
-		/**
-		 * Compare this old edited syntax tree to a new syntax tree representing
-		 * the same document, returning a sequence of ranges whose syntactic
-		 * structure has changed.
-		 *
-		 * For this to work correctly, this syntax tree must have been edited such
-		 * that its ranges match up to the new tree. Generally, you'll want to
-		 * call this method right after calling one of the [`Parser::parse`]
-		 * functions. Call it on the old tree that was passed to parse, and
-		 * pass the new tree that was returned from `parse`.
-		 */
-		getChangedRanges(other: Tree): Range[];
-		/** Get the included ranges that were used to parse the syntax tree. */
-		getIncludedRanges(): Range[];
-	}
-	/** A single node within a syntax {@link Tree}. */
-	export class Node {
-		/**
-		 * The numeric id for this node that is unique.
-		 *
-		 * Within a given syntax tree, no two nodes have the same id. However:
-		 *
-		 * * If a new tree is created based on an older tree, and a node from the old tree is reused in
-		 *   the process, then that node will have the same id in both trees.
-		 *
-		 * * A node not marked as having changes does not guarantee it was reused.
-		 *
-		 * * If a node is marked as having changed in the old tree, it will not be reused.
-		 */
-		id: number;
-		/** The byte index where this node starts. */
-		startIndex: number;
-		/** The position where this node starts. */
-		startPosition: Point;
-		/** The tree that this node belongs to. */
-		tree: Tree;
-		/** Get this node's type as a numerical id. */
-		get typeId(): number;
-		/**
-		 * Get the node's type as a numerical id as it appears in the grammar,
-		 * ignoring aliases.
-		 */
-		get grammarId(): number;
-		/** Get this node's type as a string. */
-		get type(): string;
-		/**
-		 * Get this node's symbol name as it appears in the grammar, ignoring
-		 * aliases as a string.
-		 */
-		get grammarType(): string;
-		/**
-		 * Check if this node is *named*.
-		 *
-		 * Named nodes correspond to named rules in the grammar, whereas
-		 * *anonymous* nodes correspond to string literals in the grammar.
-		 */
-		get isNamed(): boolean;
-		/**
-		 * Check if this node is *extra*.
-		 *
-		 * Extra nodes represent things like comments, which are not required
-		 * by the grammar, but can appear anywhere.
-		 */
-		get isExtra(): boolean;
-		/**
-		 * Check if this node represents a syntax error.
-		 *
-		 * Syntax errors represent parts of the code that could not be incorporated
-		 * into a valid syntax tree.
-		 */
-		get isError(): boolean;
-		/**
-		 * Check if this node is *missing*.
-		 *
-		 * Missing nodes are inserted by the parser in order to recover from
-		 * certain kinds of syntax errors.
-		 */
-		get isMissing(): boolean;
-		/** Check if this node has been edited. */
-		get hasChanges(): boolean;
-		/**
-		 * Check if this node represents a syntax error or contains any syntax
-		 * errors anywhere within it.
-		 */
-		get hasError(): boolean;
-		/** Get the byte index where this node ends. */
-		get endIndex(): number;
-		/** Get the position where this node ends. */
-		get endPosition(): Point;
-		/** Get the string content of this node. */
-		get text(): string;
-		/** Get this node's parse state. */
-		get parseState(): number;
-		/** Get the parse state after this node. */
-		get nextParseState(): number;
-		/** Check if this node is equal to another node. */
-		equals(other: Node): boolean;
-		/**
-		 * Get the node's child at the given index, where zero represents the first child.
-		 *
-		 * This method is fairly fast, but its cost is technically log(n), so if
-		 * you might be iterating over a long list of children, you should use
-		 * {@link Node#children} instead.
-		 */
-		child(index: number): Node | null;
-		/**
-		 * Get this node's *named* child at the given index.
-		 *
-		 * See also {@link Node#isNamed}.
-		 * This method is fairly fast, but its cost is technically log(n), so if
-		 * you might be iterating over a long list of children, you should use
-		 * {@link Node#namedChildren} instead.
-		 */
-		namedChild(index: number): Node | null;
-		/**
-		 * Get this node's child with the given numerical field id.
-		 *
-		 * See also {@link Node#childForFieldName}. You can
-		 * convert a field name to an id using {@link Language#fieldIdForName}.
-		 */
-		childForFieldId(fieldId: number): Node | null;
-		/**
-		 * Get the first child with the given field name.
-		 *
-		 * If multiple children may have the same field name, access them using
-		 * {@link Node#childrenForFieldName}.
-		 */
-		childForFieldName(fieldName: string): Node | null;
-		/** Get the field name of this node's child at the given index. */
-		fieldNameForChild(index: number): string | null;
-		/** Get the field name of this node's named child at the given index. */
-		fieldNameForNamedChild(index: number): string | null;
-		/**
-		 * Get an array of this node's children with a given field name.
-		 *
-		 * See also {@link Node#children}.
-		 */
-		childrenForFieldName(fieldName: string): Node[];
-		/**
-		  * Get an array of this node's children with a given field id.
-		  *
-		  * See also {@link Node#childrenForFieldName}.
-		  */
-		childrenForFieldId(fieldId: number): Node[];
-		/** Get the node's first child that contains or starts after the given byte offset. */
-		firstChildForIndex(index: number): Node | null;
-		/** Get the node's first named child that contains or starts after the given byte offset. */
-		firstNamedChildForIndex(index: number): Node | null;
-		/** Get this node's number of children. */
-		get childCount(): number;
-		/**
-		 * Get this node's number of *named* children.
-		 *
-		 * See also {@link Node#isNamed}.
-		 */
-		get namedChildCount(): number;
-		/** Get this node's first child. */
-		get firstChild(): Node | null;
-		/**
-		 * Get this node's first named child.
-		 *
-		 * See also {@link Node#isNamed}.
-		 */
-		get firstNamedChild(): Node | null;
-		/** Get this node's last child. */
-		get lastChild(): Node | null;
-		/**
-		 * Get this node's last named child.
-		 *
-		 * See also {@link Node#isNamed}.
-		 */
-		get lastNamedChild(): Node | null;
-		/**
-		 * Iterate over this node's children.
-		 *
-		 * If you're walking the tree recursively, you may want to use the
-		 * {@link TreeCursor} APIs directly instead.
-		 */
-		get children(): Node[];
-		/**
-		 * Iterate over this node's named children.
-		 *
-		 * See also {@link Node#children}.
-		 */
-		get namedChildren(): Node[];
-		/**
-		 * Get the descendants of this node that are the given type, or in the given types array.
-		 *
-		 * The types array should contain node type strings, which can be retrieved from {@link Language#types}.
-		 *
-		 * Additionally, a `startPosition` and `endPosition` can be passed in to restrict the search to a byte range.
-		 */
-		descendantsOfType(types: string | string[], startPosition?: Point, endPosition?: Point): Node[];
-		/** Get this node's next sibling. */
-		get nextSibling(): Node | null;
-		/** Get this node's previous sibling. */
-		get previousSibling(): Node | null;
-		/**
-		 * Get this node's next *named* sibling.
-		 *
-		 * See also {@link Node#isNamed}.
-		 */
-		get nextNamedSibling(): Node | null;
-		/**
-		 * Get this node's previous *named* sibling.
-		 *
-		 * See also {@link Node#isNamed}.
-		 */
-		get previousNamedSibling(): Node | null;
-		/** Get the node's number of descendants, including one for the node itself. */
-		get descendantCount(): number;
-		/**
-		 * Get this node's immediate parent.
-		 * Prefer {@link Node#childWithDescendant} for iterating over this node's ancestors.
-		 */
-		get parent(): Node | null;
-		/**
-		 * Get the node that contains `descendant`.
-		 *
-		 * Note that this can return `descendant` itself.
-		 */
-		childWithDescendant(descendant: Node): Node | null;
-		/** Get the smallest node within this node that spans the given byte range. */
-		descendantForIndex(start: number, end?: number): Node | null;
-		/** Get the smallest named node within this node that spans the given byte range. */
-		namedDescendantForIndex(start: number, end?: number): Node | null;
-		/** Get the smallest node within this node that spans the given point range. */
-		descendantForPosition(start: Point, end?: Point): Node | null;
-		/** Get the smallest named node within this node that spans the given point range. */
-		namedDescendantForPosition(start: Point, end?: Point): Node | null;
-		/**
-		 * Create a new {@link TreeCursor} starting from this node.
-		 *
-		 * Note that the given node is considered the root of the cursor,
-		 * and the cursor cannot walk outside this node.
-		 */
-		walk(): TreeCursor;
-		/**
-		 * Edit this node to keep it in-sync with source code that has been edited.
-		 *
-		 * This function is only rarely needed. When you edit a syntax tree with
-		 * the {@link Tree#edit} method, all of the nodes that you retrieve from
-		 * the tree afterward will already reflect the edit. You only need to
-		 * use {@link Node#edit} when you have a specific {@link Node} instance that
-		 * you want to keep and continue to use after an edit.
-		 */
-		edit(edit: Edit): void;
-		/** Get the S-expression representation of this node. */
-		toString(): string;
-	}
-	/** A stateful object for walking a syntax {@link Tree} efficiently. */
-	export class TreeCursor {
-		/** Creates a deep copy of the tree cursor. This allocates new memory. */
-		copy(): TreeCursor;
-		/** Delete the tree cursor, freeing its resources. */
-		delete(): void;
-		/** Get the tree cursor's current {@link Node}. */
-		get currentNode(): Node;
-		/**
-		 * Get the numerical field id of this tree cursor's current node.
-		 *
-		 * See also {@link TreeCursor#currentFieldName}.
-		 */
-		get currentFieldId(): number;
-		/** Get the field name of this tree cursor's current node. */
-		get currentFieldName(): string | null;
-		/**
-		 * Get the depth of the cursor's current node relative to the original
-		 * node that the cursor was constructed with.
-		 */
-		get currentDepth(): number;
-		/**
-		 * Get the index of the cursor's current node out of all of the
-		 * descendants of the original node that the cursor was constructed with.
-		 */
-		get currentDescendantIndex(): number;
-		/** Get the type of the cursor's current node. */
-		get nodeType(): string;
-		/** Get the type id of the cursor's current node. */
-		get nodeTypeId(): number;
-		/** Get the state id of the cursor's current node. */
-		get nodeStateId(): number;
-		/** Get the id of the cursor's current node. */
-		get nodeId(): number;
-		/**
-		 * Check if the cursor's current node is *named*.
-		 *
-		 * Named nodes correspond to named rules in the grammar, whereas
-		 * *anonymous* nodes correspond to string literals in the grammar.
-		 */
-		get nodeIsNamed(): boolean;
-		/**
-		 * Check if the cursor's current node is *missing*.
-		 *
-		 * Missing nodes are inserted by the parser in order to recover from
-		 * certain kinds of syntax errors.
-		 */
-		get nodeIsMissing(): boolean;
-		/** Get the string content of the cursor's current node. */
-		get nodeText(): string;
-		/** Get the start position of the cursor's current node. */
-		get startPosition(): Point;
-		/** Get the end position of the cursor's current node. */
-		get endPosition(): Point;
-		/** Get the start index of the cursor's current node. */
-		get startIndex(): number;
-		/** Get the end index of the cursor's current node. */
-		get endIndex(): number;
-		/**
-		 * Move this cursor to the first child of its current node.
-		 *
-		 * This returns `true` if the cursor successfully moved, and returns
-		 * `false` if there were no children.
-		 */
-		gotoFirstChild(): boolean;
-		/**
-		 * Move this cursor to the last child of its current node.
-		 *
-		 * This returns `true` if the cursor successfully moved, and returns
-		 * `false` if there were no children.
-		 *
-		 * Note that this function may be slower than
-		 * {@link TreeCursor#gotoFirstChild} because it needs to
-		 * iterate through all the children to compute the child's position.
-		 */
-		gotoLastChild(): boolean;
-		/**
-		 * Move this cursor to the parent of its current node.
-		 *
-		 * This returns `true` if the cursor successfully moved, and returns
-		 * `false` if there was no parent node (the cursor was already on the
-		 * root node).
-		 *
-		 * Note that the node the cursor was constructed with is considered the root
-		 * of the cursor, and the cursor cannot walk outside this node.
-		 */
-		gotoParent(): boolean;
-		/**
-		 * Move this cursor to the next sibling of its current node.
-		 *
-		 * This returns `true` if the cursor successfully moved, and returns
-		 * `false` if there was no next sibling node.
-		 *
-		 * Note that the node the cursor was constructed with is considered the root
-		 * of the cursor, and the cursor cannot walk outside this node.
-		 */
-		gotoNextSibling(): boolean;
-		/**
-		 * Move this cursor to the previous sibling of its current node.
-		 *
-		 * This returns `true` if the cursor successfully moved, and returns
-		 * `false` if there was no previous sibling node.
-		 *
-		 * Note that this function may be slower than
-		 * {@link TreeCursor#gotoNextSibling} due to how node
-		 * positions are stored. In the worst case, this will need to iterate
-		 * through all the children up to the previous sibling node to recalculate
-		 * its position. Also note that the node the cursor was constructed with is
-		 * considered the root of the cursor, and the cursor cannot walk outside this node.
-		 */
-		gotoPreviousSibling(): boolean;
-		/**
-		 * Move the cursor to the node that is the nth descendant of
-		 * the original node that the cursor was constructed with, where
-		 * zero represents the original node itself.
-		 */
-		gotoDescendant(goalDescendantIndex: number): void;
-		/**
-		 * Move this cursor to the first child of its current node that contains or
-		 * starts after the given byte offset.
-		 *
-		 * This returns `true` if the cursor successfully moved to a child node, and returns
-		 * `false` if no such child was found.
-		 */
-		gotoFirstChildForIndex(goalIndex: number): boolean;
-		/**
-		 * Move this cursor to the first child of its current node that contains or
-		 * starts after the given byte offset.
-		 *
-		 * This returns the index of the child node if one was found, and returns
-		 * `null` if no such child was found.
-		 */
-		gotoFirstChildForPosition(goalPosition: Point): boolean;
-		/**
-		 * Re-initialize this tree cursor to start at the original node that the
-		 * cursor was constructed with.
-		 */
-		reset(node: Node): void;
-		/**
-		 * Re-initialize a tree cursor to the same position as another cursor.
-		 *
-		 * Unlike {@link TreeCursor#reset}, this will not lose parent
-		 * information and allows reusing already created cursors.
-		 */
-		resetTo(cursor: TreeCursor): void;
-	}
-	/**
-	 * Options for query execution
-	 */
-	export interface QueryOptions {
-		/** The start position of the range to query */
-		startPosition?: Point;
-		/** The end position of the range to query */
-		endPosition?: Point;
-		/** The start index of the range to query */
-		startIndex?: number;
-		/** The end index of the range to query */
-		endIndex?: number;
-		/**
-		 * The maximum number of in-progress matches for this query.
-		 * The limit must be > 0 and <= 65536.
-		 */
-		matchLimit?: number;
-		/**
-		 * The maximum start depth for a query cursor.
-		 *
-		 * This prevents cursors from exploring children nodes at a certain depth.
-		 * Note if a pattern includes many children, then they will still be
-		 * checked.
-		 *
-		 * The zero max start depth value can be used as a special behavior and
-		 * it helps to destructure a subtree by staying on a node and using
-		 * captures for interested parts. Note that the zero max start depth
-		 * only limit a search depth for a pattern's root node but other nodes
-		 * that are parts of the pattern may be searched at any depth what
-		 * defined by the pattern structure.
-		 *
-		 * Set to `null` to remove the maximum start depth.
-		 */
-		maxStartDepth?: number;
-		/**
-		 * The maximum duration in microseconds that query execution should be allowed to
-		 * take before halting.
-		 *
-		 * If query execution takes longer than this, it will halt early, returning an empty array.
-		 */
-		timeoutMicros?: number;
-		/**
-		 * A function that will be called periodically during the execution of the query to check
-		 * if query execution should be cancelled. You can also use this to instrument query execution
-		 * and check where the query is at in the document. The progress callback takes a single argument,
-		 * which is a {@link QueryState} representing the current state of the query.
-		 */
-		progressCallback?: (state: QueryState) => void;
-	}
-	/**
-	 * A stateful object that is passed into the progress callback {@link QueryOptions#progressCallback}
-	 * to provide the current state of the query.
-	 */
-	export interface QueryState {
-		/** The byte offset in the document that the query is at. */
-		currentOffset: number;
-	}
-	/** A record of key-value pairs associated with a particular pattern in a {@link Query}. */
-	export type QueryProperties = Record;
-	/**
-	 * A predicate that contains an operator and list of operands.
-	 */
-	export interface QueryPredicate {
-		/** The operator of the predicate, like `match?`, `eq?`, `set!`, etc. */
-		operator: string;
-		/** The operands of the predicate, which are either captures or strings. */
-		operands: PredicateStep[];
-	}
-	/**
-	 * A particular {@link Node} that has been captured with a particular name within a
-	 * {@link Query}.
-	 */
-	export interface QueryCapture {
-		/** The index of the pattern that matched. */
-		patternIndex: number;
-		/** The name of the capture */
-		name: string;
-		/** The captured node */
-		node: Node;
-		/** The properties for predicates declared with the operator `set!`. */
-		setProperties?: QueryProperties;
-		/** The properties for predicates declared with the operator `is?`. */
-		assertedProperties?: QueryProperties;
-		/** The properties for predicates declared with the operator `is-not?`. */
-		refutedProperties?: QueryProperties;
-	}
-	/** A match of a {@link Query} to a particular set of {@link Node}s. */
-	export interface QueryMatch {
-		/** @deprecated since version 0.25.0, use `patternIndex` instead. */
-		pattern: number;
-		/** The index of the pattern that matched. */
-		patternIndex: number;
-		/** The captures associated with the match. */
-		captures: QueryCapture[];
-		/** The properties for predicates declared with the operator `set!`. */
-		setProperties?: QueryProperties;
-		/** The properties for predicates declared with the operator `is?`. */
-		assertedProperties?: QueryProperties;
-		/** The properties for predicates declared with the operator `is-not?`. */
-		refutedProperties?: QueryProperties;
-	}
-	/** A quantifier for captures */
-	export const CaptureQuantifier: {
-		readonly Zero: 0;
-		readonly ZeroOrOne: 1;
-		readonly ZeroOrMore: 2;
-		readonly One: 3;
-		readonly OneOrMore: 4;
-	};
-	/** A quantifier for captures */
-	export type CaptureQuantifier = typeof CaptureQuantifier[keyof typeof CaptureQuantifier];
-	/**
-	 * Predicates are represented as a single array of steps. There are two
-	 * types of steps, which correspond to the two legal values for
-	 * the `type` field:
-	 *
-	 * - `CapturePredicateStep` - Steps with this type represent names
-	 *    of captures.
-	 *
-	 * - `StringPredicateStep` - Steps with this type represent literal
-	 *    strings.
-	 */
-	export type PredicateStep = CapturePredicateStep | StringPredicateStep;
-	/**
-	 * A step in a predicate that refers to a capture.
-	 *
-	 * The `name` field is the name of the capture.
-	 */
-	interface CapturePredicateStep {
-		type: 'capture';
-		name: string;
-	}
-	/**
-	 * A step in a predicate that refers to a string.
-	 *
-	 * The `value` field is the string value.
-	 */
-	interface StringPredicateStep {
-		type: 'string';
-		value: string;
-	}
-	export class Query {
-		/** The names of the captures used in the query. */
-		readonly captureNames: string[];
-		/** The quantifiers of the captures used in the query. */
-		readonly captureQuantifiers: CaptureQuantifier[][];
-		/**
-		 * The other user-defined predicates associated with the given index.
-		 *
-		 * This includes predicates with operators other than:
-		 * - `match?`
-		 * - `eq?` and `not-eq?`
-		 * - `any-of?` and `not-any-of?`
-		 * - `is?` and `is-not?`
-		 * - `set!`
-		 */
-		readonly predicates: QueryPredicate[][];
-		/** The properties for predicates with the operator `set!`. */
-		readonly setProperties: QueryProperties[];
-		/** The properties for predicates with the operator `is?`. */
-		readonly assertedProperties: QueryProperties[];
-		/** The properties for predicates with the operator `is-not?`. */
-		readonly refutedProperties: QueryProperties[];
-		/** The maximum number of in-progress matches for this cursor. */
-		matchLimit?: number;
-		/**
-		 * Create a new query from a string containing one or more S-expression
-		 * patterns.
-		 *
-		 * The query is associated with a particular language, and can only be run
-		 * on syntax nodes parsed with that language. References to Queries can be
-		 * shared between multiple threads.
-		 *
-		 * @link {@see https://tree-sitter.github.io/tree-sitter/using-parsers/queries}
-		 */
-		constructor(language: Language, source: string);
-		/** Delete the query, freeing its resources. */
-		delete(): void;
-		/**
-		 * Iterate over all of the matches in the order that they were found.
-		 *
-		 * Each match contains the index of the pattern that matched, and a list of
-		 * captures. Because multiple patterns can match the same set of nodes,
-		 * one match may contain captures that appear *before* some of the
-		 * captures from a previous match.
-		 *
-		 * @param node - The node to execute the query on.
-		 *
-		 * @param options - Options for query execution.
-		 */
-		matches(node: Node, options?: QueryOptions): QueryMatch[];
-		/**
-		 * Iterate over all of the individual captures in the order that they
-		 * appear.
-		 *
-		 * This is useful if you don't care about which pattern matched, and just
-		 * want a single, ordered sequence of captures.
-		 *
-		 * @param node - The node to execute the query on.
-		 *
-		 * @param options - Options for query execution.
-		 */
-		captures(node: Node, options?: QueryOptions): QueryCapture[];
-		/** Get the predicates for a given pattern. */
-		predicatesForPattern(patternIndex: number): QueryPredicate[];
-		/**
-		 * Disable a certain capture within a query.
-		 *
-		 * This prevents the capture from being returned in matches, and also
-		 * avoids any resource usage associated with recording the capture.
-		 */
-		disableCapture(captureName: string): void;
-		/**
-		 * Disable a certain pattern within a query.
-		 *
-		 * This prevents the pattern from matching, and also avoids any resource
-		 * usage associated with the pattern. This throws an error if the pattern
-		 * index is out of bounds.
-		 */
-		disablePattern(patternIndex: number): void;
-		/**
-		 * Check if, on its last execution, this cursor exceeded its maximum number
-		 * of in-progress matches.
-		 */
-		didExceedMatchLimit(): boolean;
-		/** Get the byte offset where the given pattern starts in the query's source. */
-		startIndexForPattern(patternIndex: number): number;
-		/** Get the byte offset where the given pattern ends in the query's source. */
-		endIndexForPattern(patternIndex: number): number;
-		/** Get the number of patterns in the query. */
-		patternCount(): number;
-		/** Get the index for a given capture name. */
-		captureIndexForName(captureName: string): number;
-		/** Check if a given pattern within a query has a single root node. */
-		isPatternRooted(patternIndex: number): boolean;
-		/** Check if a given pattern within a query has a single root node. */
-		isPatternNonLocal(patternIndex: number): boolean;
-		/**
-		 * Check if a given step in a query is 'definite'.
-		 *
-		 * A query step is 'definite' if its parent pattern will be guaranteed to
-		 * match successfully once it reaches the step.
-		 */
-		isPatternGuaranteedAtStep(byteIndex: number): boolean;
-	}
-	export class LookaheadIterator implements Iterable {
-		/** Get the current symbol of the lookahead iterator. */
-		get currentTypeId(): number;
-		/** Get the current symbol name of the lookahead iterator. */
-		get currentType(): string;
-		/** Delete the lookahead iterator, freeing its resources. */
-		delete(): void;
-		/**
-		 * Reset the lookahead iterator.
-		 *
-		 * This returns `true` if the language was set successfully and `false`
-		 * otherwise.
-		 */
-		reset(language: Language, stateId: number): boolean;
-		/**
-		 * Reset the lookahead iterator to another state.
-		 *
-		 * This returns `true` if the iterator was reset to the given state and
-		 * `false` otherwise.
-		 */
-		resetState(stateId: number): boolean;
-		/**
-		 * Returns an iterator that iterates over the symbols of the lookahead iterator.
-		 *
-		 * The iterator will yield the current symbol name as a string for each step
-		 * until there are no more symbols to iterate over.
-		 */
-		[Symbol.iterator](): Iterator;
-	}
-
-	export {};
-}
-
-//# sourceMappingURL=web-tree-sitter.d.ts.map
\ No newline at end of file
diff --git a/lib/binding_web/web-tree-sitter.d.ts.map b/lib/binding_web/web-tree-sitter.d.ts.map
deleted file mode 100644
index 9e56d793..00000000
--- a/lib/binding_web/web-tree-sitter.d.ts.map
+++ /dev/null
@@ -1,56 +0,0 @@
-{
-	"version": 3,
-	"file": "web-tree-sitter.d.ts",
-	"names": [
-		"Point",
-		"Range",
-		"Edit",
-		"ParseCallback",
-		"ProgressCallback",
-		"LogCallback",
-		"ParseOptions",
-		"ParseState",
-		"LANGUAGE_VERSION",
-		"MIN_COMPATIBLE_VERSION",
-		"Parser",
-		"LanguageMetadata",
-		"Language",
-		"Tree",
-		"Node",
-		"TreeCursor",
-		"QueryOptions",
-		"QueryState",
-		"QueryProperties",
-		"QueryPredicate",
-		"QueryCapture",
-		"QueryMatch",
-		"CaptureQuantifier",
-		"PredicateStep",
-		"CapturePredicateStep",
-		"StringPredicateStep",
-		"Query",
-		"LookaheadIterator"
-	],
-	"sources": [
-		"src/constants.ts",
-		"src/parser.ts",
-		"src/language.ts",
-		"src/tree.ts",
-		"src/node.ts",
-		"src/tree_cursor.ts",
-		"src/query.ts",
-		"src/lookahead_iterator.ts"
-	],
-	"sourcesContent": [
-		null,
-		null,
-		null,
-		null,
-		null,
-		null,
-		null,
-		null
-	],
-	"mappings": ";;;;;;mBASiBA,KAAKA;;;;;;;;;;mBAYLC,KAAKA;;;;;;;;;;;;;mBAiBLC,IAAIA;;;;;;;;;;;;;;;;;cA4CTC,aAAaA;;;;cAKbC,gBAAgBA;;;;;;cAOhBC,WAAWA;;;;;;;;;;;;kBC7ENC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmCZC,UAAUA;;;;;;;;;;;;;;;YAwBhBC,gBAAgBA;;;;;YAMhBC,sBAAsBA;;;;;cAMpBC,MAAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OChFNC,gBAAgBA;;;;;;;;;cAUhBC,QAAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cCYRC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cCrBJC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cCFJC,UAAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCQNC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA0DZC,UAAUA;;;;;aAMfC,eAAeA;;;;kBAKVC,cAAcA;;;;;;;;;;kBAYdC,YAAYA;;;;;;;;;;;;;;;kBAqBZC,UAAUA;;;;;;;;;;;;;;;cA8BfC,iBAAiBA;;;;;;;;aAAjBA,iBAAiBA;;;;;;;;;;;;aAajBC,aAAaA;;;;;;WAORC,oBAAoBA;;;;;;;;;WAOpBC,mBAAmBA;;;;cAqUvBC,KAAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cChfLC,iBAAiBA",
-	"ignoreList": []
-}
\ No newline at end of file

From 0c5cdcb1613a13f65e5b825edbb67052920fa199 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sat, 30 Aug 2025 15:51:57 +0300
Subject: [PATCH 370/663] fix(xtask): add heap symbols to emscripten exported
 methods

---
 crates/loader/emscripten-version |  2 +-
 crates/xtask/src/build_wasm.rs   | 15 ++++++++++++++-
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/crates/loader/emscripten-version b/crates/loader/emscripten-version
index d13e837c..a2cec7af 100644
--- a/crates/loader/emscripten-version
+++ b/crates/loader/emscripten-version
@@ -1 +1 @@
-4.0.6
+4.0.8
diff --git a/crates/xtask/src/build_wasm.rs b/crates/xtask/src/build_wasm.rs
index 4da817c9..534c87f6 100644
--- a/crates/xtask/src/build_wasm.rs
+++ b/crates/xtask/src/build_wasm.rs
@@ -24,7 +24,7 @@ enum EmccSource {
     Podman,
 }
 
-const EXPORTED_RUNTIME_METHODS: [&str; 8] = [
+const EXPORTED_RUNTIME_METHODS: [&str; 19] = [
     "AsciiToString",
     "stringToUTF8",
     "UTF8ToString",
@@ -33,6 +33,17 @@ const EXPORTED_RUNTIME_METHODS: [&str; 8] = [
     "loadWebAssemblyModule",
     "getValue",
     "setValue",
+    "HEAPF32",
+    "HEAPF64",
+    "HEAP_DATA_VIEW",
+    "HEAP8",
+    "HEAPU8",
+    "HEAP16",
+    "HEAPU16",
+    "HEAP32",
+    "HEAPU32",
+    "HEAP64",
+    "HEAPU64",
 ];
 
 pub fn run_wasm(args: &BuildWasm) -> Result<()> {
@@ -158,6 +169,7 @@ pub fn run_wasm(args: &BuildWasm) -> Result<()> {
         "-s", "INITIAL_MEMORY=33554432",
         "-s", "ALLOW_MEMORY_GROWTH=1",
         "-s", "SUPPORT_BIG_ENDIAN=1",
+        "-s", "WASM_BIGINT=1",
         "-s", "MAIN_MODULE=2",
         "-s", "FILESYSTEM=0",
         "-s", "NODEJS_CATCH_EXIT=0",
@@ -165,6 +177,7 @@ pub fn run_wasm(args: &BuildWasm) -> Result<()> {
         "-s", &exported_functions,
         "-s", &exported_runtime_methods,
         "-D", "fprintf(...)=",
+        "-D", "printf(...)=",
         "-D", "NDEBUG=",
         "-D", "_POSIX_C_SOURCE=200112L",
         "-D", "_DEFAULT_SOURCE=",

From dba8446d9e92de4c03be2051ac19ba0078f09b1b Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sat, 30 Aug 2025 15:54:17 +0300
Subject: [PATCH 371/663] feat(web)!: use bigint for timeouts

---
 lib/binding_web/lib/tree-sitter.c        |  4 +--
 lib/binding_web/lib/web-tree-sitter.d.ts | 35 ++++++++++++------------
 lib/binding_web/src/parser.ts            |  6 ++--
 lib/binding_web/src/query.ts             |  6 ++--
 lib/binding_web/test/query.test.ts       |  4 +--
 5 files changed, 27 insertions(+), 28 deletions(-)

diff --git a/lib/binding_web/lib/tree-sitter.c b/lib/binding_web/lib/tree-sitter.c
index 6148e542..5afb76b9 100644
--- a/lib/binding_web/lib/tree-sitter.c
+++ b/lib/binding_web/lib/tree-sitter.c
@@ -876,7 +876,7 @@ void ts_query_matches_wasm(
   uint32_t end_index,
   uint32_t match_limit,
   uint32_t max_start_depth,
-  uint32_t timeout_micros
+  uint64_t timeout_micros
 ) {
   if (!scratch_query_cursor) {
     scratch_query_cursor = ts_query_cursor_new();
@@ -936,7 +936,7 @@ void ts_query_captures_wasm(
   uint32_t end_index,
   uint32_t match_limit,
   uint32_t max_start_depth,
-  uint32_t timeout_micros
+  uint64_t timeout_micros
 ) {
   if (!scratch_query_cursor) {
     scratch_query_cursor = ts_query_cursor_new();
diff --git a/lib/binding_web/lib/web-tree-sitter.d.ts b/lib/binding_web/lib/web-tree-sitter.d.ts
index c437f65d..2e6261b0 100644
--- a/lib/binding_web/lib/web-tree-sitter.d.ts
+++ b/lib/binding_web/lib/web-tree-sitter.d.ts
@@ -1,4 +1,4 @@
-// TypeScript bindings for emscripten-generated code.  Automatically generated at compile time.
+// TypeScript bindings for emscripten-generated code.  Automatically generated at compile time (manually edited).
 declare namespace RuntimeExports {
     function AsciiToString(ptr: number): string;
     function stringToUTF8(str: string, outPtr: number, maxBytesToWrite: number): number;
@@ -31,10 +31,10 @@ declare namespace RuntimeExports {
         allowUndefined?: boolean,
         loadAsync?: boolean,
         global?: boolean,
-        nodelete?: boolean;
+        nodelete?: boolean,
       },
       libName?: string,
-      localScope?: Record,
+      localScope?: Record,
       handle?: number
     ): Promise number>>;
     /**
@@ -48,10 +48,6 @@ declare namespace RuntimeExports {
      * @param {string} type
      */
     function setValue(ptr: number, value: number, type?: string): void;
-    let currentParseCallback: ((index: number, position: {row: number, column: number}) => string | undefined) | null;
-    let currentLogCallback: ((message: string, isLex: boolean) => void) | null;
-    let currentProgressCallback: ((state: {currentOffset: number, hasError: boolean}) => void) | null;
-    let currentQueryProgressCallback: ((state: {currentOffset: number}) => void) | null;
     let HEAPF32: Float32Array;
     let HEAPF64: Float64Array;
     let HEAP_DATA_VIEW: DataView;
@@ -69,6 +65,7 @@ interface WasmModule {
   _calloc(_0: number, _1: number): number;
   _realloc(_0: number, _1: number): number;
   _free(_0: number): void;
+  _memcmp(_0: number, _1: number, _2: number): number;
   _ts_language_symbol_count(_0: number): number;
   _ts_language_state_count(_0: number): number;
   _ts_language_version(_0: number): number;
@@ -88,16 +85,12 @@ interface WasmModule {
   _ts_lookahead_iterator_reset(_0: number, _1: number, _2: number): number;
   _ts_lookahead_iterator_next(_0: number): number;
   _ts_lookahead_iterator_current_symbol(_0: number): number;
-  _memset(_0: number, _1: number, _2: number): number;
-  _memcpy(_0: number, _1: number, _2: number): number;
   _ts_parser_delete(_0: number): void;
   _ts_parser_reset(_0: number): void;
   _ts_parser_set_language(_0: number, _1: number): number;
-  _ts_parser_timeout_micros(_0: number): number;
-  _ts_parser_set_timeout_micros(_0: number, _1: number, _2: number): void;
+  _ts_parser_timeout_micros(_0: number): bigint;
+  _ts_parser_set_timeout_micros(_0: number, _1: bigint): void;
   _ts_parser_set_included_ranges(_0: number, _1: number, _2: number): number;
-  _memmove(_0: number, _1: number, _2: number): number;
-  _memcmp(_0: number, _1: number, _2: number): number;
   _ts_query_new(_0: number, _1: number, _2: number, _3: number, _4: number): number;
   _ts_query_delete(_0: number): void;
   _iswspace(_0: number): number;
@@ -197,8 +190,11 @@ interface WasmModule {
   _ts_node_is_extra_wasm(_0: number): number;
   _ts_node_parse_state_wasm(_0: number): number;
   _ts_node_next_parse_state_wasm(_0: number): number;
-  _ts_query_matches_wasm(_0: number, _1: number, _2: number, _3: number, _4: number, _5: number, _6: number, _7: number, _8: number, _9: number, _10: number): void;
-  _ts_query_captures_wasm(_0: number, _1: number, _2: number, _3: number, _4: number, _5: number, _6: number, _7: number, _8: number, _9: number, _10: number): void;
+  _ts_query_matches_wasm(_0: number, _1: number, _2: number, _3: number, _4: number, _5: number, _6: number, _7: number, _8: number, _9: number, _10: bigint): void;
+  _ts_query_captures_wasm(_0: number, _1: number, _2: number, _3: number, _4: number, _5: number, _6: number, _7: number, _8: number, _9: number, _10: bigint): void;
+  _memset(_0: number, _1: number, _2: number): number;
+  _memcpy(_0: number, _1: number, _2: number): number;
+  _memmove(_0: number, _1: number, _2: number): number;
   _iswalpha(_0: number): number;
   _iswblank(_0: number): number;
   _iswdigit(_0: number): number;
@@ -212,9 +208,12 @@ interface WasmModule {
   _strncpy(_0: number, _1: number, _2: number): number;
   _towlower(_0: number): number;
   _towupper(_0: number): number;
-  _orig$ts_parser_timeout_micros(_0: number): bigint;
-  _orig$ts_parser_set_timeout_micros(_0: number, _1: bigint): void;
 }
 
-export type MainModule = WasmModule & typeof RuntimeExports;
+export type MainModule = WasmModule & typeof RuntimeExports & {
+    currentParseCallback: ((index: number, position: {row: number, column: number}) => string | undefined) | null;
+    currentLogCallback: ((message: string, isLex: boolean) => void) | null;
+    currentProgressCallback: ((state: {currentOffset: number, hasError: boolean}) => void) | null;
+    currentQueryProgressCallback: ((state: {currentOffset: number}) => void) | null;
+};
 export default function MainModuleFactory(options?: Partial): Promise;
diff --git a/lib/binding_web/src/parser.ts b/lib/binding_web/src/parser.ts
index 3a49d43f..e60fe2a3 100644
--- a/lib/binding_web/src/parser.ts
+++ b/lib/binding_web/src/parser.ts
@@ -289,7 +289,7 @@ export class Parser {
    *
    * This is set via {@link Parser#setTimeoutMicros}.
    */
-  getTimeoutMicros(): number {
+  getTimeoutMicros(): bigint {
     return C._ts_parser_timeout_micros(this[0]);
   }
 
@@ -302,8 +302,8 @@ export class Parser {
    * If parsing takes longer than this, it will halt early, returning `null`.
    * See {@link Parser#parse} for more information.
    */
-  setTimeoutMicros(timeout: number): void {
-    C._ts_parser_set_timeout_micros(this[0], 0, timeout);
+  setTimeoutMicros(timeout: bigint): void {
+    C._ts_parser_set_timeout_micros(this[0], timeout);
   }
 
   /** Set the logging callback that a parser should use during parsing. */
diff --git a/lib/binding_web/src/query.ts b/lib/binding_web/src/query.ts
index d702db49..635a95dc 100644
--- a/lib/binding_web/src/query.ts
+++ b/lib/binding_web/src/query.ts
@@ -56,7 +56,7 @@ export interface QueryOptions {
    *
    * If query execution takes longer than this, it will halt early, returning an empty array.
    */
-  timeoutMicros?: number;
+  timeoutMicros?: bigint;
 
   /**
    * A function that will be called periodically during the execution of the query to check
@@ -708,7 +708,7 @@ export class Query {
     const endIndex = options.endIndex ?? 0;
     const matchLimit = options.matchLimit ?? 0xFFFFFFFF;
     const maxStartDepth = options.maxStartDepth ?? 0xFFFFFFFF;
-    const timeoutMicros = options.timeoutMicros ?? 0;
+    const timeoutMicros = options.timeoutMicros ?? 0n;
     const progressCallback = options.progressCallback;
 
     if (typeof matchLimit !== 'number') {
@@ -803,7 +803,7 @@ export class Query {
     const endIndex = options.endIndex ?? 0;
     const matchLimit = options.matchLimit ?? 0xFFFFFFFF;
     const maxStartDepth = options.maxStartDepth ?? 0xFFFFFFFF;
-    const timeoutMicros = options.timeoutMicros ?? 0;
+    const timeoutMicros = options.timeoutMicros ?? 0n;
     const progressCallback = options.progressCallback;
 
     if (typeof matchLimit !== 'number') {
diff --git a/lib/binding_web/test/query.test.ts b/lib/binding_web/test/query.test.ts
index 546c2a19..a6924dbf 100644
--- a/lib/binding_web/test/query.test.ts
+++ b/lib/binding_web/test/query.test.ts
@@ -465,9 +465,9 @@ describe('Query', () => {
     it('returns less than the expected matches', { timeout: 10000 }, () => {
       tree = parser.parse('function foo() while (true) { } }\n'.repeat(1000))!;
       query = new Query(JavaScript, '(function_declaration name: (identifier) @function)');
-      const matches = query.matches(tree.rootNode, { timeoutMicros: 1000 });
+      const matches = query.matches(tree.rootNode, { timeoutMicros: 1000n });
       expect(matches.length).toBeLessThan(1000);
-      const matches2 = query.matches(tree.rootNode, { timeoutMicros: 0 });
+      const matches2 = query.matches(tree.rootNode, { timeoutMicros: 0n });
       expect(matches2).toHaveLength(1000);
     });
   });

From 07986471b3f722a4a83ae83749810b484723272f Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sat, 30 Aug 2025 22:42:17 +0300
Subject: [PATCH 372/663] feat(xtask): automate edits to emscripten generated
 d.ts

---
 crates/xtask/src/build_wasm.rs           | 85 ++++++++++++++++++++++--
 lib/binding_web/lib/web-tree-sitter.d.ts | 26 +++-----
 2 files changed, 89 insertions(+), 22 deletions(-)

diff --git a/crates/xtask/src/build_wasm.rs b/crates/xtask/src/build_wasm.rs
index 534c87f6..58259b0f 100644
--- a/crates/xtask/src/build_wasm.rs
+++ b/crates/xtask/src/build_wasm.rs
@@ -9,6 +9,7 @@ use std::{
 };
 
 use anyhow::{anyhow, Result};
+use indoc::indoc;
 use notify::{
     event::{AccessKind, AccessMode},
     EventKind, RecursiveMode,
@@ -159,6 +160,12 @@ pub fn run_wasm(args: &BuildWasm) -> Result<()> {
         emscripten_flags.extend(["-s", "EXPORT_ES6=1"]);
     }
 
+    macro_rules! binding_file {
+        ($ext:literal) => {
+            concat!("lib/binding_web/lib/web-tree-sitter", $ext)
+        };
+    }
+
     #[rustfmt::skip]
     emscripten_flags.extend([
         "-gsource-map=inline",
@@ -185,7 +192,7 @@ pub fn run_wasm(args: &BuildWasm) -> Result<()> {
         "-I", "lib/include",
         "--js-library", "lib/binding_web/lib/imports.js",
         "--pre-js",     "lib/binding_web/lib/prefix.js",
-        "-o",           if args.cjs { "lib/binding_web/lib/web-tree-sitter.cjs" } else { "lib/binding_web/lib/web-tree-sitter.mjs" },
+        "-o",           if args.cjs { binding_file!("cjs") } else { binding_file!(".mjs") },
         "lib/src/lib.c",
         "lib/binding_web/lib/tree-sitter.c",
     ]);
@@ -196,20 +203,90 @@ pub fn run_wasm(args: &BuildWasm) -> Result<()> {
     let command = command.args(&emscripten_flags);
 
     if args.watch {
-        watch_wasm!(|| build_wasm(command));
+        watch_wasm!(|| build_wasm(command, args.emit_tsd));
     } else {
-        build_wasm(command)?;
+        build_wasm(command, args.emit_tsd)?;
     }
 
     Ok(())
 }
 
-fn build_wasm(cmd: &mut Command) -> Result<()> {
+fn build_wasm(cmd: &mut Command, edit_tsd: bool) -> Result<()> {
     bail_on_err(
         &cmd.spawn()?.wait_with_output()?,
         "Failed to compile the Tree-sitter Wasm library",
     )?;
 
+    if edit_tsd {
+        let file = "lib/binding_web/lib/web-tree-sitter.d.ts";
+        let content = fs::read_to_string(file)?
+            .replace("Automatically generated", "Automatically @generated")
+            .replace(
+                "AsciiToString(ptr: any): string",
+                "AsciiToString(ptr: number): string",
+            )
+            .replace(
+                "stringToUTF8(str: any, outPtr: any, maxBytesToWrite: any): any",
+                "stringToUTF8(str: string, outPtr: number, maxBytesToWrite: number): number",
+            )
+            .replace(
+                "UTF8ToString(ptr: number, maxBytesToRead?: number | undefined): string",
+                "UTF8ToString(ptr: number, maxBytesToRead?: number): string",
+            )
+            .replace(
+                "lengthBytesUTF8(str: any): number",
+                "lengthBytesUTF8(str: string): number",
+            )
+            .replace(
+                "stringToUTF16(str: any, outPtr: any, maxBytesToWrite: any): number",
+                "stringToUTF16(str: string, outPtr: number, maxBytesToWrite: number): number",
+            )
+            .replace(
+                concat!(
+                    "loadWebAssemblyModule(binary: any, flags: any, libName?: string | ",
+                    "undefined, localScope?: any | undefined, handle?: number | undefined): any"
+                ),
+                concat!(
+                    "loadWebAssemblyModule(binary: Uint8Array, flags: Record,",
+                    " libName?: string, localScope?: Record, handle?: number):",
+                    " Promise number>>"
+                ),
+            )
+            .replace(
+                "getValue(ptr: number, type?: string): any",
+                "getValue(ptr: number, type?: string): number",
+            )
+            .replace("HEAPF32: any", "HEAPF32: Float32Array")
+            .replace("HEAPF64: any", "HEAPF64: Float64Array")
+            .replace("HEAP_DATA_VIEW: any", "HEAP_DATA_VIEW: DataView")
+            .replace("HEAP8: any", "HEAP8: Int8Array")
+            .replace("HEAPU8: any", "HEAPU8: Uint8Array")
+            .replace("HEAP16: any", "HEAP16: Int16Array")
+            .replace("HEAPU16: any", "HEAPU16: Uint16Array")
+            .replace("HEAP32: any", "HEAP32: Int32Array")
+            .replace("HEAPU32: any", "HEAPU32: Uint32Array")
+            .replace("HEAP64: any", "HEAP64: BigInt64Array")
+            .replace("HEAPU64: any", "HEAPU64: BigUint64Array")
+            .replace("BigInt;", "bigint;")
+            .replace("BigInt)", "bigint)")
+            .replace(
+                "WasmModule & typeof RuntimeExports;",
+                indoc! {"
+                WasmModule & typeof RuntimeExports & {
+                  currentParseCallback: ((index: number, position: {row: number, column: number}) => string | undefined) | null;
+                  currentLogCallback: ((message: string, isLex: boolean) => void) | null;
+                  currentProgressCallback: ((state: {currentOffset: number, hasError: boolean}) => void) | null;
+                  currentQueryProgressCallback: ((state: {currentOffset: number}) => void) | null;
+                };
+                "},
+            )
+            .replace(
+                "MainModuleFactory (options?: unknown): Promise",
+                "MainModuleFactory(options?: Partial): Promise",
+            );
+        fs::write(file, content)?;
+    }
+
     Ok(())
 }
 
diff --git a/lib/binding_web/lib/web-tree-sitter.d.ts b/lib/binding_web/lib/web-tree-sitter.d.ts
index 2e6261b0..9bb137c6 100644
--- a/lib/binding_web/lib/web-tree-sitter.d.ts
+++ b/lib/binding_web/lib/web-tree-sitter.d.ts
@@ -1,4 +1,4 @@
-// TypeScript bindings for emscripten-generated code.  Automatically generated at compile time (manually edited).
+// TypeScript bindings for emscripten-generated code.  Automatically @generated at compile time.
 declare namespace RuntimeExports {
     function AsciiToString(ptr: number): string;
     function stringToUTF8(str: string, outPtr: number, maxBytesToWrite: number): number;
@@ -25,18 +25,7 @@ declare namespace RuntimeExports {
      * @param {Object=} localScope
      * @param {number=} handle
      */
-    function loadWebAssemblyModule(
-      binary: Uint8Array,
-      flags: {
-        allowUndefined?: boolean,
-        loadAsync?: boolean,
-        global?: boolean,
-        nodelete?: boolean,
-      },
-      libName?: string,
-      localScope?: Record,
-      handle?: number
-    ): Promise number>>;
+    function loadWebAssemblyModule(binary: Uint8Array, flags: Record, libName?: string, localScope?: Record, handle?: number): Promise number>>;
     /**
      * @param {number} ptr
      * @param {string} type
@@ -51,7 +40,7 @@ declare namespace RuntimeExports {
     let HEAPF32: Float32Array;
     let HEAPF64: Float64Array;
     let HEAP_DATA_VIEW: DataView;
-    let HEAP8: Int8Array
+    let HEAP8: Int8Array;
     let HEAPU8: Uint8Array;
     let HEAP16: Int16Array;
     let HEAPU16: Uint16Array;
@@ -211,9 +200,10 @@ interface WasmModule {
 }
 
 export type MainModule = WasmModule & typeof RuntimeExports & {
-    currentParseCallback: ((index: number, position: {row: number, column: number}) => string | undefined) | null;
-    currentLogCallback: ((message: string, isLex: boolean) => void) | null;
-    currentProgressCallback: ((state: {currentOffset: number, hasError: boolean}) => void) | null;
-    currentQueryProgressCallback: ((state: {currentOffset: number}) => void) | null;
+  currentParseCallback: ((index: number, position: {row: number, column: number}) => string | undefined) | null;
+  currentLogCallback: ((message: string, isLex: boolean) => void) | null;
+  currentProgressCallback: ((state: {currentOffset: number, hasError: boolean}) => void) | null;
+  currentQueryProgressCallback: ((state: {currentOffset: number}) => void) | null;
 };
+
 export default function MainModuleFactory(options?: Partial): Promise;

From 62f93e221dca14e367e315c2a2b7c6c0e26256c4 Mon Sep 17 00:00:00 2001
From: Will Lillis 
Date: Sat, 30 Aug 2025 15:59:10 -0400
Subject: [PATCH 373/663] feat(test): pin fixture grammars to specific commits

---
 crates/xtask/src/fetch.rs   | 84 ++++++++++++++++++++++++-------------
 crates/xtask/src/main.rs    | 13 +++++-
 test/fixtures/fixtures.json | 17 ++++++++
 3 files changed, 82 insertions(+), 32 deletions(-)
 create mode 100644 test/fixtures/fixtures.json

diff --git a/crates/xtask/src/fetch.rs b/crates/xtask/src/fetch.rs
index 13ae8faa..5023691e 100644
--- a/crates/xtask/src/fetch.rs
+++ b/crates/xtask/src/fetch.rs
@@ -1,33 +1,24 @@
-use crate::{bail_on_err, root_dir, EMSCRIPTEN_VERSION};
+use crate::{bail_on_err, root_dir, FetchFixtures, EMSCRIPTEN_VERSION};
 use anyhow::Result;
-use std::process::Command;
+use std::{
+    fs,
+    process::{Command, Stdio},
+};
 
-pub fn run_fixtures() -> Result<()> {
-    let grammars_dir = root_dir().join("test").join("fixtures").join("grammars");
+pub fn run_fixtures(args: &FetchFixtures) -> Result<()> {
+    let fixtures_dir = root_dir().join("test").join("fixtures");
+    let grammars_dir = fixtures_dir.join("grammars");
+    let fixtures_path = fixtures_dir.join("fixtures.json");
 
-    [
-        ("bash", "master"),
-        ("c", "master"),
-        ("cpp", "master"),
-        ("embedded-template", "master"),
-        ("go", "master"),
-        ("html", "master"),
-        ("java", "master"),
-        ("javascript", "master"),
-        ("jsdoc", "master"),
-        ("json", "master"),
-        ("php", "master"),
-        ("python", "master"),
-        ("ruby", "master"),
-        ("rust", "master"),
-        ("typescript", "master"),
-    ]
-    .iter()
-    .try_for_each(|(grammar, r#ref)| {
-        let grammar_dir = grammars_dir.join(grammar);
+    // grammar name, tag
+    let mut fixtures: Vec<(String, String)> =
+        serde_json::from_str(&fs::read_to_string(&fixtures_path)?)?;
+
+    for (grammar, tag) in &mut fixtures {
+        let grammar_dir = grammars_dir.join(&grammar);
         let grammar_url = format!("https://github.com/tree-sitter/tree-sitter-{grammar}");
 
-        println!("Updating the {grammar} grammar...");
+        println!("Fetching the {grammar} grammar...");
 
         if !grammar_dir.exists() {
             let mut command = Command::new("git");
@@ -47,21 +38,54 @@ pub fn run_fixtures() -> Result<()> {
         std::env::set_current_dir(&grammar_dir)?;
 
         let mut command = Command::new("git");
-        command.args(["fetch", "origin", r#ref, "--depth", "1"]);
+        command.args(["fetch", "origin", "--tags"]);
         bail_on_err(
             &command.spawn()?.wait_with_output()?,
-            &format!("Failed to fetch the {grammar} grammar"),
+            &format!("Failed to fetch the {grammar} grammar's tags"),
         )?;
 
+        if args.update {
+            let mut command = Command::new("git");
+            command
+                .args(["tag", "--sort=-creatordate"])
+                .stdout(Stdio::piped());
+            let update_out = command.spawn()?.wait_with_output()?;
+            bail_on_err(
+                &update_out,
+                &format!("Failed to parse the {grammar} grammar's latest commit"),
+            )?;
+            let new_tag = String::from_utf8(update_out.stdout)?
+                .lines()
+                .next()
+                .expect("No tags found")
+                .trim()
+                .to_string();
+            if !new_tag.eq(tag) {
+                println!("Updating the {grammar} grammar from {tag} to {new_tag}...");
+                *tag = new_tag;
+            }
+        }
         let mut command = Command::new("git");
-        command.args(["reset", "--hard", "FETCH_HEAD"]);
+        command.args(["reset", "--hard", tag]);
         bail_on_err(
             &command.spawn()?.wait_with_output()?,
             &format!("Failed to reset the {grammar} grammar"),
         )?;
+    }
 
-        Ok(())
-    })
+    if args.update {
+        println!("Updating the fixtures lock file");
+        fs::write(
+            &fixtures_path,
+            // format the JSON without extra newlines
+            serde_json::to_string(&fixtures)?
+                .replace("[[", "[\n  [")
+                .replace("],", "],\n  ")
+                .replace("]]", "]\n]"),
+        )?;
+    }
+
+    Ok(())
 }
 
 pub fn run_emscripten() -> Result<()> {
diff --git a/crates/xtask/src/main.rs b/crates/xtask/src/main.rs
index feba36d4..600ae83e 100644
--- a/crates/xtask/src/main.rs
+++ b/crates/xtask/src/main.rs
@@ -35,7 +35,7 @@ enum Commands {
     /// Fetches emscripten.
     FetchEmscripten,
     /// Fetches the fixtures for testing tree-sitter.
-    FetchFixtures,
+    FetchFixtures(FetchFixtures),
     /// Generate the Rust bindings from the C library.
     GenerateBindings,
     /// Generates the fixtures for testing tree-sitter.
@@ -115,6 +115,13 @@ struct Clippy {
     package: Option,
 }
 
+#[derive(Args)]
+struct FetchFixtures {
+    /// Update all fixtures to the latest tag
+    #[arg(long, short)]
+    update: bool,
+}
+
 #[derive(Args)]
 struct GenerateFixtures {
     /// Generates the parser to Wasm
@@ -222,7 +229,9 @@ fn run() -> Result<()> {
         Commands::CheckWasmExports(check_options) => check_wasm_exports::run(&check_options)?,
         Commands::Clippy(clippy_options) => clippy::run(&clippy_options)?,
         Commands::FetchEmscripten => fetch::run_emscripten()?,
-        Commands::FetchFixtures => fetch::run_fixtures()?,
+        Commands::FetchFixtures(fetch_fixture_options) => {
+            fetch::run_fixtures(&fetch_fixture_options)?;
+        }
         Commands::GenerateBindings => generate::run_bindings()?,
         Commands::GenerateFixtures(generate_fixtures_options) => {
             generate::run_fixtures(&generate_fixtures_options)?;
diff --git a/test/fixtures/fixtures.json b/test/fixtures/fixtures.json
new file mode 100644
index 00000000..7f4a385d
--- /dev/null
+++ b/test/fixtures/fixtures.json
@@ -0,0 +1,17 @@
+[
+  ["bash","v0.25.0"],
+  ["c","v0.24.1"],
+  ["cpp","v0.23.4"],
+  ["embedded-template","v0.25.0"],
+  ["go","v0.25.0"],
+  ["html","v0.23.2"],
+  ["java","v0.23.5"],
+  ["javascript","v0.23.1"],
+  ["jsdoc","v0.23.2"],
+  ["json","v0.24.8"],
+  ["php","v0.24.2"],
+  ["python","v0.23.6"],
+  ["ruby","v0.23.1"],
+  ["rust","v0.24.0"],
+  ["typescript","v0.23.2"]
+]
\ No newline at end of file

From a12a79b366e0323baa29853070eae9e916b27c0a Mon Sep 17 00:00:00 2001
From: Will Lillis 
Date: Fri, 29 Aug 2025 22:40:32 -0400
Subject: [PATCH 374/663] fix(cli): canonicalize `--lib-path` arguments

This fixes an issue where "./foo.so" would would work but "foo.so" would not.
---
 crates/cli/src/main.rs      | 55 +++++++++++++++++++++++--------------
 crates/loader/src/loader.rs |  4 +--
 2 files changed, 36 insertions(+), 23 deletions(-)

diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs
index 2f816ad4..89baa7f1 100644
--- a/crates/cli/src/main.rs
+++ b/crates/cli/src/main.rs
@@ -190,7 +190,7 @@ struct Parse {
     /// The path to the parser's dynamic library
     #[arg(long, short = 'l')]
     pub lib_path: Option,
-    /// If `--lib_path` is used, the name of the language used to extract the
+    /// If `--lib-path` is used, the name of the language used to extract the
     /// library's language function
     #[arg(long)]
     pub lang_name: Option,
@@ -288,7 +288,7 @@ struct Test {
     /// The path to the parser's dynamic library
     #[arg(long, short = 'l')]
     pub lib_path: Option,
-    /// If `--lib_path` is used, the name of the language used to extract the
+    /// If `--lib-path` is used, the name of the language used to extract the
     /// library's language function
     #[arg(long)]
     pub lang_name: Option,
@@ -366,7 +366,7 @@ struct Fuzz {
     /// The path to the parser's dynamic library
     #[arg(long)]
     pub lib_path: Option,
-    /// If `--lib_path` is used, the name of the language used to extract the
+    /// If `--lib-path` is used, the name of the language used to extract the
     /// library's language function
     #[arg(long)]
     pub lang_name: Option,
@@ -405,7 +405,7 @@ struct Query {
     /// The path to the parser's dynamic library
     #[arg(long, short = 'l')]
     pub lib_path: Option,
-    /// If `--lib_path` is used, the name of the language used to extract the
+    /// If `--lib-path` is used, the name of the language used to extract the
     /// library's language function
     #[arg(long)]
     pub lang_name: Option,
@@ -1061,7 +1061,7 @@ impl Parse {
         if self.lib_path.is_none() && self.lang_name.is_some() {
             eprintln!("Warning: --lang-name` specified without --lib-path. This argument will be ignored.");
         }
-        let lib_info = get_lib_info(self.lib_path.as_ref(), self.lang_name.as_ref());
+        let lib_info = get_lib_info(self.lib_path.as_ref(), self.lang_name.as_ref(), current_dir);
 
         let input = get_input(
             self.paths_file.as_deref(),
@@ -1080,7 +1080,12 @@ impl Parse {
                 for path in &paths {
                     let path = Path::new(&path);
                     let language = loader
-                        .select_language(path, current_dir, self.scope.as_deref(), lib_info)
+                        .select_language(
+                            path,
+                            current_dir,
+                            self.scope.as_deref(),
+                            lib_info.as_ref(),
+                        )
                         .with_context(|| {
                             anyhow!("Failed to load langauge for path \"{}\"", path.display())
                         })?;
@@ -1106,9 +1111,8 @@ impl Parse {
                 let languages = loader.languages_at_path(current_dir)?;
 
                 let language = if let Some(ref lib_path) = self.lib_path {
-                    let lib_info = get_lib_info(self.lib_path.as_ref(), self.lang_name.as_ref());
                     &loader
-                        .select_language(lib_path, current_dir, None, lib_info)
+                        .select_language(lib_path, current_dir, None, lib_info.as_ref())
                         .with_context(|| {
                             anyhow!(
                                 "Failed to load language for path \"{}\"",
@@ -1142,7 +1146,8 @@ impl Parse {
 
                 let path = get_tmp_source_file(&contents)?;
                 let name = "stdin";
-                let language = loader.select_language(&path, current_dir, None, lib_info)?;
+                let language =
+                    loader.select_language(&path, current_dir, None, lib_info.as_ref())?;
 
                 parse::parse_file_at_path(
                     &mut parser,
@@ -1197,9 +1202,10 @@ impl Test {
         }
         let languages = loader.languages_at_path(current_dir)?;
         let language = if let Some(ref lib_path) = self.lib_path {
-            let lib_info = get_lib_info(self.lib_path.as_ref(), self.lang_name.as_ref());
+            let lib_info =
+                get_lib_info(self.lib_path.as_ref(), self.lang_name.as_ref(), current_dir);
             &loader
-                .select_language(lib_path, current_dir, None, lib_info)
+                .select_language(lib_path, current_dir, None, lib_info.as_ref())
                 .with_context(|| {
                     anyhow!(
                         "Failed to load language for path \"{}\"",
@@ -1342,18 +1348,19 @@ impl Fuzz {
         }
         let languages = loader.languages_at_path(current_dir)?;
         let (language, language_name) = if let Some(ref lib_path) = self.lib_path {
-            let lib_info = get_lib_info(self.lib_path.as_ref(), self.lang_name.as_ref())
+            let lib_info = get_lib_info(Some(lib_path), self.lang_name.as_ref(), current_dir)
                 .with_context(|| anyhow!("No language name found for {}", lib_path.display()))?;
+            let lang_name = lib_info.1.to_string();
             &(
                 loader
-                    .select_language(lib_path, current_dir, None, Some(lib_info))
+                    .select_language(lib_path, current_dir, None, Some(&lib_info))
                     .with_context(|| {
                         anyhow!(
                             "Failed to load language for path \"{}\"",
                             lib_path.display()
                         )
                     })?,
-                lib_info.1.to_string(),
+                lang_name,
             )
         } else {
             languages
@@ -1411,7 +1418,7 @@ impl Query {
                 "Warning: --lang-name specified without --lib-path. This argument will be ignored."
             );
         }
-        let lib_info = get_lib_info(self.lib_path.as_ref(), self.lang_name.as_ref());
+        let lib_info = get_lib_info(self.lib_path.as_ref(), self.lang_name.as_ref(), current_dir);
 
         let input = get_input(
             self.paths_file.as_deref(),
@@ -1426,7 +1433,7 @@ impl Query {
                     Path::new(&paths[0]),
                     current_dir,
                     self.scope.as_deref(),
-                    lib_info,
+                    lib_info.as_ref(),
                 )?;
 
                 for path in paths {
@@ -1453,9 +1460,8 @@ impl Query {
                 let path = get_tmp_source_file(&contents)?;
                 let languages = loader.languages_at_path(current_dir)?;
                 let language = if let Some(ref lib_path) = self.lib_path {
-                    let lib_info = get_lib_info(self.lib_path.as_ref(), self.lang_name.as_ref());
                     &loader
-                        .select_language(lib_path, current_dir, None, lib_info)
+                        .select_language(lib_path, current_dir, None, lib_info.as_ref())
                         .with_context(|| {
                             anyhow!(
                                 "Failed to load language for path \"{}\"",
@@ -1490,7 +1496,8 @@ impl Query {
                 println!();
 
                 let path = get_tmp_source_file(&contents)?;
-                let language = loader.select_language(&path, current_dir, None, lib_info)?;
+                let language =
+                    loader.select_language(&path, current_dir, None, lib_info.as_ref())?;
                 query::query_file_at_path(
                     &language,
                     &path,
@@ -1975,15 +1982,21 @@ const fn get_styles() -> clap::builder::Styles {
 fn get_lib_info<'a>(
     lib_path: Option<&'a PathBuf>,
     language_name: Option<&'a String>,
-) -> Option<(&'a Path, &'a str)> {
+    current_dir: &Path,
+) -> Option<(PathBuf, &'a str)> {
     if let Some(lib_path) = lib_path {
+        let absolute_lib_path = if lib_path.is_absolute() {
+            lib_path.clone()
+        } else {
+            current_dir.join(lib_path)
+        };
         // Use the user-specified name if present, otherwise try to derive it from
         // the lib path
         match (
             language_name.map(|s| s.as_str()),
             lib_path.file_stem().and_then(|s| s.to_str()),
         ) {
-            (Some(name), _) | (None, Some(name)) => Some((lib_path.as_path(), name)),
+            (Some(name), _) | (None, Some(name)) => Some((absolute_lib_path, name)),
             _ => None,
         }
     } else {
diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs
index b6086f5c..6f9ac1ae 100644
--- a/crates/loader/src/loader.rs
+++ b/crates/loader/src/loader.rs
@@ -1415,9 +1415,9 @@ impl Loader {
         current_dir: &Path,
         scope: Option<&str>,
         // path to dynamic library, name of language
-        lib_info: Option<(&Path, &str)>,
+        lib_info: Option<&(PathBuf, &str)>,
     ) -> Result {
-        if let Some((lib_path, language_name)) = lib_info {
+        if let Some((ref lib_path, language_name)) = lib_info {
             let language_fn_name = format!("tree_sitter_{}", language_name.replace('-', "_"));
             Self::load_language(lib_path, &language_fn_name)
         } else if let Some(scope) = scope {

From bb82b94ded65c8dfcfe5806a1f6971596e3b1bdd Mon Sep 17 00:00:00 2001
From: vemoo 
Date: Sat, 30 Aug 2025 22:51:41 +0200
Subject: [PATCH 375/663] fix(web): correct type errors, improve build

(cherry picked from commit 4db3edadf41ad1ed347b75fcb94578e3651bbb55)
---
 lib/binding_web/lib/tree-sitter.d.ts |    2 +-
 lib/binding_web/package-lock.json    | 1464 +++++++++++++++++++-------
 lib/binding_web/package.json         |   17 +-
 lib/binding_web/src/index.ts         |   22 +-
 lib/binding_web/src/language.ts      |    2 +-
 lib/binding_web/src/marshal.ts       |   11 +-
 lib/binding_web/src/node.ts          |    5 +-
 lib/binding_web/src/tree_cursor.ts   |   12 +-
 lib/binding_web/test/node.test.ts    |   16 +-
 lib/binding_web/tsconfig.json        |    9 +-
 10 files changed, 1132 insertions(+), 428 deletions(-)

diff --git a/lib/binding_web/lib/tree-sitter.d.ts b/lib/binding_web/lib/tree-sitter.d.ts
index c6fdf7d5..ac9e1a33 100644
--- a/lib/binding_web/lib/tree-sitter.d.ts
+++ b/lib/binding_web/lib/tree-sitter.d.ts
@@ -50,7 +50,7 @@ declare namespace RuntimeExports {
     function setValue(ptr: number, value: number, type?: string): void;
     let currentParseCallback: ((index: number, position: {row: number, column: number}) => string | undefined) | null;
     let currentLogCallback: ((message: string, isLex: boolean) => void) | null;
-    let currentProgressCallback: ((state: {currentOffset: number}) => void) | null;
+    let currentProgressCallback: ((state: {currentOffset: number, hasError: boolean}) => void) | null;
     let currentQueryProgressCallback: ((state: {currentOffset: number}) => void) | null;
     let HEAPF32: Float32Array;
     let HEAPF64: Float64Array;
diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json
index a240da31..b8696fd8 100644
--- a/lib/binding_web/package-lock.json
+++ b/lib/binding_web/package-lock.json
@@ -1,18 +1,17 @@
 {
   "name": "web-tree-sitter",
-  "version": "0.25.1",
+  "version": "0.25.8",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "web-tree-sitter",
-      "version": "0.25.1",
+      "version": "0.25.8",
       "license": "MIT",
       "devDependencies": {
-        "@eslint/js": "^9.19.0",
-        "@types/emscripten": "^1.40.0",
-        "@types/node": "^22.12.0",
-        "@vitest/coverage-v8": "^3.0.4",
+        "@eslint/js": "^9.20.0",
+        "@types/node": "^22.13.1",
+        "@vitest/coverage-v8": "^3.0.5",
         "dts-buddy": "^0.5.4",
         "esbuild": "^0.24.2",
         "eslint": "^9.19.0",
@@ -21,6 +20,14 @@
         "typescript": "^5.7.3",
         "typescript-eslint": "^8.22.0",
         "vitest": "^3.0.4"
+      },
+      "peerDependencies": {
+        "@types/emscripten": "^1.40.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/emscripten": {
+          "optional": true
+        }
       }
     },
     "node_modules/@ampproject/remapping": {
@@ -454,6 +461,23 @@
         "node": ">=18"
       }
     },
+    "node_modules/@esbuild/openharmony-arm64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz",
+      "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openharmony"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/@esbuild/sunos-x64": {
       "version": "0.24.2",
       "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz",
@@ -565,13 +589,13 @@
       }
     },
     "node_modules/@eslint/config-array": {
-      "version": "0.19.1",
-      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz",
-      "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==",
+      "version": "0.21.0",
+      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz",
+      "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "@eslint/object-schema": "^2.1.5",
+        "@eslint/object-schema": "^2.1.6",
         "debug": "^4.3.1",
         "minimatch": "^3.1.2"
       },
@@ -579,10 +603,20 @@
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       }
     },
+    "node_modules/@eslint/config-helpers": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz",
+      "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
     "node_modules/@eslint/core": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz",
-      "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==",
+      "version": "0.15.2",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz",
+      "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
@@ -593,9 +627,9 @@
       }
     },
     "node_modules/@eslint/eslintrc": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz",
-      "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==",
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+      "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -617,19 +651,22 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "9.19.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.19.0.tgz",
-      "integrity": "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==",
+      "version": "9.34.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz",
+      "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==",
       "dev": true,
       "license": "MIT",
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://eslint.org/donate"
       }
     },
     "node_modules/@eslint/object-schema": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz",
-      "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==",
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+      "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -637,13 +674,13 @@
       }
     },
     "node_modules/@eslint/plugin-kit": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz",
-      "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==",
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz",
+      "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "@eslint/core": "^0.10.0",
+        "@eslint/core": "^0.15.2",
         "levn": "^0.4.1"
       },
       "engines": {
@@ -703,9 +740,9 @@
       }
     },
     "node_modules/@humanwhocodes/retry": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz",
-      "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==",
+      "version": "0.4.3",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+      "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -798,9 +835,9 @@
       "license": "MIT"
     },
     "node_modules/@jridgewell/trace-mapping": {
-      "version": "0.3.25",
-      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
-      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+      "version": "0.3.30",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz",
+      "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -858,9 +895,9 @@
       }
     },
     "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.1.tgz",
-      "integrity": "sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.49.0.tgz",
+      "integrity": "sha512-rlKIeL854Ed0e09QGYFlmDNbka6I3EQFw7iZuugQjMb11KMpJCLPFL4ZPbMfaEhLADEL1yx0oujGkBQ7+qW3eA==",
       "cpu": [
         "arm"
       ],
@@ -872,9 +909,9 @@
       ]
     },
     "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.1.tgz",
-      "integrity": "sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.49.0.tgz",
+      "integrity": "sha512-cqPpZdKUSQYRtLLr6R4X3sD4jCBO1zUmeo3qrWBCqYIeH8Q3KRL4F3V7XJ2Rm8/RJOQBZuqzQGWPjjvFUcYa/w==",
       "cpu": [
         "arm64"
       ],
@@ -886,9 +923,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.1.tgz",
-      "integrity": "sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.49.0.tgz",
+      "integrity": "sha512-99kMMSMQT7got6iYX3yyIiJfFndpojBmkHfTc1rIje8VbjhmqBXE+nb7ZZP3A5skLyujvT0eIUCUsxAe6NjWbw==",
       "cpu": [
         "arm64"
       ],
@@ -900,9 +937,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.1.tgz",
-      "integrity": "sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.49.0.tgz",
+      "integrity": "sha512-y8cXoD3wdWUDpjOLMKLx6l+NFz3NlkWKcBCBfttUn+VGSfgsQ5o/yDUGtzE9HvsodkP0+16N0P4Ty1VuhtRUGg==",
       "cpu": [
         "x64"
       ],
@@ -914,9 +951,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-arm64": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.1.tgz",
-      "integrity": "sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.49.0.tgz",
+      "integrity": "sha512-3mY5Pr7qv4GS4ZvWoSP8zha8YoiqrU+e0ViPvB549jvliBbdNLrg2ywPGkgLC3cmvN8ya3za+Q2xVyT6z+vZqA==",
       "cpu": [
         "arm64"
       ],
@@ -928,9 +965,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-x64": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.1.tgz",
-      "integrity": "sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.49.0.tgz",
+      "integrity": "sha512-C9KzzOAQU5gU4kG8DTk+tjdKjpWhVWd5uVkinCwwFub2m7cDYLOdtXoMrExfeBmeRy9kBQMkiyJ+HULyF1yj9w==",
       "cpu": [
         "x64"
       ],
@@ -942,9 +979,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.1.tgz",
-      "integrity": "sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.49.0.tgz",
+      "integrity": "sha512-OVSQgEZDVLnTbMq5NBs6xkmz3AADByCWI4RdKSFNlDsYXdFtlxS59J+w+LippJe8KcmeSSM3ba+GlsM9+WwC1w==",
       "cpu": [
         "arm"
       ],
@@ -956,9 +993,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.1.tgz",
-      "integrity": "sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.49.0.tgz",
+      "integrity": "sha512-ZnfSFA7fDUHNa4P3VwAcfaBLakCbYaxCk0jUnS3dTou9P95kwoOLAMlT3WmEJDBCSrOEFFV0Y1HXiwfLYJuLlA==",
       "cpu": [
         "arm"
       ],
@@ -970,9 +1007,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.1.tgz",
-      "integrity": "sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.49.0.tgz",
+      "integrity": "sha512-Z81u+gfrobVK2iV7GqZCBfEB1y6+I61AH466lNK+xy1jfqFLiQ9Qv716WUM5fxFrYxwC7ziVdZRU9qvGHkYIJg==",
       "cpu": [
         "arm64"
       ],
@@ -984,9 +1021,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.1.tgz",
-      "integrity": "sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.49.0.tgz",
+      "integrity": "sha512-zoAwS0KCXSnTp9NH/h9aamBAIve0DXeYpll85shf9NJ0URjSTzzS+Z9evmolN+ICfD3v8skKUPyk2PO0uGdFqg==",
       "cpu": [
         "arm64"
       ],
@@ -998,9 +1035,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.1.tgz",
-      "integrity": "sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.49.0.tgz",
+      "integrity": "sha512-2QyUyQQ1ZtwZGiq0nvODL+vLJBtciItC3/5cYN8ncDQcv5avrt2MbKt1XU/vFAJlLta5KujqyHdYtdag4YEjYQ==",
       "cpu": [
         "loong64"
       ],
@@ -1011,10 +1048,10 @@
         "linux"
       ]
     },
-    "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.1.tgz",
-      "integrity": "sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==",
+    "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.49.0.tgz",
+      "integrity": "sha512-k9aEmOWt+mrMuD3skjVJSSxHckJp+SiFzFG+v8JLXbc/xi9hv2icSkR3U7uQzqy+/QbbYY7iNB9eDTwrELo14g==",
       "cpu": [
         "ppc64"
       ],
@@ -1026,9 +1063,23 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.1.tgz",
-      "integrity": "sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.49.0.tgz",
+      "integrity": "sha512-rDKRFFIWJ/zJn6uk2IdYLc09Z7zkE5IFIOWqpuU0o6ZpHcdniAyWkwSUWE/Z25N/wNDmFHHMzin84qW7Wzkjsw==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-musl": {
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.49.0.tgz",
+      "integrity": "sha512-FkkhIY/hYFVnOzz1WeV3S9Bd1h0hda/gRqvZCMpHWDHdiIHn6pqsY3b5eSbvGccWHMQ1uUzgZTKS4oGpykf8Tw==",
       "cpu": [
         "riscv64"
       ],
@@ -1040,9 +1091,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.1.tgz",
-      "integrity": "sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.49.0.tgz",
+      "integrity": "sha512-gRf5c+A7QiOG3UwLyOOtyJMD31JJhMjBvpfhAitPAoqZFcOeK3Kc1Veg1z/trmt+2P6F/biT02fU19GGTS529A==",
       "cpu": [
         "s390x"
       ],
@@ -1054,9 +1105,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.1.tgz",
-      "integrity": "sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.49.0.tgz",
+      "integrity": "sha512-BR7+blScdLW1h/2hB/2oXM+dhTmpW3rQt1DeSiCP9mc2NMMkqVgjIN3DDsNpKmezffGC9R8XKVOLmBkRUcK/sA==",
       "cpu": [
         "x64"
       ],
@@ -1068,9 +1119,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.1.tgz",
-      "integrity": "sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.49.0.tgz",
+      "integrity": "sha512-hDMOAe+6nX3V5ei1I7Au3wcr9h3ktKzDvF2ne5ovX8RZiAHEtX1A5SNNk4zt1Qt77CmnbqT+upb/umzoPMWiPg==",
       "cpu": [
         "x64"
       ],
@@ -1082,9 +1133,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.1.tgz",
-      "integrity": "sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.49.0.tgz",
+      "integrity": "sha512-wkNRzfiIGaElC9kXUT+HLx17z7D0jl+9tGYRKwd8r7cUqTL7GYAvgUY++U2hK6Ar7z5Z6IRRoWC8kQxpmM7TDA==",
       "cpu": [
         "arm64"
       ],
@@ -1096,9 +1147,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.1.tgz",
-      "integrity": "sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.49.0.tgz",
+      "integrity": "sha512-gq5aW/SyNpjp71AAzroH37DtINDcX1Qw2iv9Chyz49ZgdOP3NV8QCyKZUrGsYX9Yyggj5soFiRCgsL3HwD8TdA==",
       "cpu": [
         "ia32"
       ],
@@ -1110,9 +1161,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.1.tgz",
-      "integrity": "sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.49.0.tgz",
+      "integrity": "sha512-gEtqFbzmZLFk2xKh7g0Rlo8xzho8KrEFEkzvHbfUGkrgXOpZ4XagQ6n+wIZFNh1nTb8UD16J4nFSFKXYgnbdBg==",
       "cpu": [
         "x64"
       ],
@@ -1123,17 +1174,35 @@
         "win32"
       ]
     },
+    "node_modules/@types/chai": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz",
+      "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/deep-eql": "*"
+      }
+    },
+    "node_modules/@types/deep-eql": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
+      "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/@types/emscripten": {
       "version": "1.40.0",
       "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.40.0.tgz",
       "integrity": "sha512-MD2JJ25S4tnjnhjWyalMS6K6p0h+zQV6+Ylm+aGbiS8tSn/aHLSGNzBgduj6FB4zH0ax2GRMGYi/8G1uOxhXWA==",
-      "dev": true,
-      "license": "MIT"
+      "license": "MIT",
+      "optional": true,
+      "peer": true
     },
     "node_modules/@types/estree": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
-      "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+      "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
       "dev": true,
       "license": "MIT"
     },
@@ -1145,13 +1214,13 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "22.12.0",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz",
-      "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==",
+      "version": "22.18.0",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.0.tgz",
+      "integrity": "sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "undici-types": "~6.20.0"
+        "undici-types": "~6.21.0"
       }
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
@@ -1293,9 +1362,9 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+      "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1361,22 +1430,23 @@
       }
     },
     "node_modules/@vitest/coverage-v8": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.4.tgz",
-      "integrity": "sha512-f0twgRCHgbs24Dp8cLWagzcObXMcuKtAwgxjJV/nnysPAJJk1JiKu/W0gIehZLmkljhJXU/E0/dmuQzsA/4jhA==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz",
+      "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@ampproject/remapping": "^2.3.0",
         "@bcoe/v8-coverage": "^1.0.2",
-        "debug": "^4.4.0",
+        "ast-v8-to-istanbul": "^0.3.3",
+        "debug": "^4.4.1",
         "istanbul-lib-coverage": "^3.2.2",
         "istanbul-lib-report": "^3.0.1",
         "istanbul-lib-source-maps": "^5.0.6",
         "istanbul-reports": "^3.1.7",
         "magic-string": "^0.30.17",
         "magicast": "^0.3.5",
-        "std-env": "^3.8.0",
+        "std-env": "^3.9.0",
         "test-exclude": "^7.0.1",
         "tinyrainbow": "^2.0.0"
       },
@@ -1384,8 +1454,8 @@
         "url": "https://opencollective.com/vitest"
       },
       "peerDependencies": {
-        "@vitest/browser": "3.0.4",
-        "vitest": "3.0.4"
+        "@vitest/browser": "3.2.4",
+        "vitest": "3.2.4"
       },
       "peerDependenciesMeta": {
         "@vitest/browser": {
@@ -1394,15 +1464,16 @@
       }
     },
     "node_modules/@vitest/expect": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.4.tgz",
-      "integrity": "sha512-Nm5kJmYw6P2BxhJPkO3eKKhGYKRsnqJqf+r0yOGRKpEP+bSCBDsjXgiu1/5QFrnPMEgzfC38ZEjvCFgaNBC0Eg==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz",
+      "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/spy": "3.0.4",
-        "@vitest/utils": "3.0.4",
-        "chai": "^5.1.2",
+        "@types/chai": "^5.2.2",
+        "@vitest/spy": "3.2.4",
+        "@vitest/utils": "3.2.4",
+        "chai": "^5.2.0",
         "tinyrainbow": "^2.0.0"
       },
       "funding": {
@@ -1410,13 +1481,13 @@
       }
     },
     "node_modules/@vitest/mocker": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.4.tgz",
-      "integrity": "sha512-gEef35vKafJlfQbnyOXZ0Gcr9IBUsMTyTLXsEQwuyYAerpHqvXhzdBnDFuHLpFqth3F7b6BaFr4qV/Cs1ULx5A==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz",
+      "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/spy": "3.0.4",
+        "@vitest/spy": "3.2.4",
         "estree-walker": "^3.0.3",
         "magic-string": "^0.30.17"
       },
@@ -1425,7 +1496,7 @@
       },
       "peerDependencies": {
         "msw": "^2.4.9",
-        "vite": "^5.0.0 || ^6.0.0"
+        "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
       },
       "peerDependenciesMeta": {
         "msw": {
@@ -1437,9 +1508,9 @@
       }
     },
     "node_modules/@vitest/pretty-format": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.4.tgz",
-      "integrity": "sha512-ts0fba+dEhK2aC9PFuZ9LTpULHpY/nd6jhAQ5IMU7Gaj7crPCTdCFfgvXxruRBLFS+MLraicCuFXxISEq8C93g==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz",
+      "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1450,56 +1521,57 @@
       }
     },
     "node_modules/@vitest/runner": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.4.tgz",
-      "integrity": "sha512-dKHzTQ7n9sExAcWH/0sh1elVgwc7OJ2lMOBrAm73J7AH6Pf9T12Zh3lNE1TETZaqrWFXtLlx3NVrLRb5hCK+iw==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz",
+      "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/utils": "3.0.4",
-        "pathe": "^2.0.2"
+        "@vitest/utils": "3.2.4",
+        "pathe": "^2.0.3",
+        "strip-literal": "^3.0.0"
       },
       "funding": {
         "url": "https://opencollective.com/vitest"
       }
     },
     "node_modules/@vitest/snapshot": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.4.tgz",
-      "integrity": "sha512-+p5knMLwIk7lTQkM3NonZ9zBewzVp9EVkVpvNta0/PlFWpiqLaRcF4+33L1it3uRUCh0BGLOaXPPGEjNKfWb4w==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz",
+      "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/pretty-format": "3.0.4",
+        "@vitest/pretty-format": "3.2.4",
         "magic-string": "^0.30.17",
-        "pathe": "^2.0.2"
+        "pathe": "^2.0.3"
       },
       "funding": {
         "url": "https://opencollective.com/vitest"
       }
     },
     "node_modules/@vitest/spy": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.4.tgz",
-      "integrity": "sha512-sXIMF0oauYyUy2hN49VFTYodzEAu744MmGcPR3ZBsPM20G+1/cSW/n1U+3Yu/zHxX2bIDe1oJASOkml+osTU6Q==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz",
+      "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "tinyspy": "^3.0.2"
+        "tinyspy": "^4.0.3"
       },
       "funding": {
         "url": "https://opencollective.com/vitest"
       }
     },
     "node_modules/@vitest/utils": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.4.tgz",
-      "integrity": "sha512-8BqC1ksYsHtbWH+DfpOAKrFw3jl3Uf9J7yeFh85Pz52IWuh1hBBtyfEbRNNZNjl8H8A5yMLH9/t+k7HIKzQcZQ==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz",
+      "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/pretty-format": "3.0.4",
-        "loupe": "^3.1.2",
+        "@vitest/pretty-format": "3.2.4",
+        "loupe": "^3.1.4",
         "tinyrainbow": "^2.0.0"
       },
       "funding": {
@@ -1507,9 +1579,9 @@
       }
     },
     "node_modules/acorn": {
-      "version": "8.14.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
-      "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+      "version": "8.15.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+      "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -1592,6 +1664,18 @@
         "node": ">=12"
       }
     },
+    "node_modules/ast-v8-to-istanbul": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.5.tgz",
+      "integrity": "sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/trace-mapping": "^0.3.30",
+        "estree-walker": "^3.0.3",
+        "js-tokens": "^9.0.1"
+      }
+    },
     "node_modules/balanced-match": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -1600,9 +1684,9 @@
       "license": "MIT"
     },
     "node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "version": "1.1.12",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+      "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1644,9 +1728,9 @@
       }
     },
     "node_modules/chai": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz",
-      "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==",
+      "version": "5.3.3",
+      "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz",
+      "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1657,7 +1741,7 @@
         "pathval": "^2.0.0"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/chalk": {
@@ -1730,9 +1814,9 @@
       }
     },
     "node_modules/debug": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
-      "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+      "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1816,9 +1900,9 @@
       "license": "MIT"
     },
     "node_modules/es-module-lexer": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
-      "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==",
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
+      "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
       "dev": true,
       "license": "MIT"
     },
@@ -1877,22 +1961,23 @@
       }
     },
     "node_modules/eslint": {
-      "version": "9.19.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.19.0.tgz",
-      "integrity": "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==",
+      "version": "9.34.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz",
+      "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.12.1",
-        "@eslint/config-array": "^0.19.0",
-        "@eslint/core": "^0.10.0",
-        "@eslint/eslintrc": "^3.2.0",
-        "@eslint/js": "9.19.0",
-        "@eslint/plugin-kit": "^0.2.5",
+        "@eslint/config-array": "^0.21.0",
+        "@eslint/config-helpers": "^0.3.1",
+        "@eslint/core": "^0.15.2",
+        "@eslint/eslintrc": "^3.3.1",
+        "@eslint/js": "9.34.0",
+        "@eslint/plugin-kit": "^0.3.5",
         "@humanfs/node": "^0.16.6",
         "@humanwhocodes/module-importer": "^1.0.1",
-        "@humanwhocodes/retry": "^0.4.1",
+        "@humanwhocodes/retry": "^0.4.2",
         "@types/estree": "^1.0.6",
         "@types/json-schema": "^7.0.15",
         "ajv": "^6.12.4",
@@ -1900,9 +1985,9 @@
         "cross-spawn": "^7.0.6",
         "debug": "^4.3.2",
         "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^8.2.0",
-        "eslint-visitor-keys": "^4.2.0",
-        "espree": "^10.3.0",
+        "eslint-scope": "^8.4.0",
+        "eslint-visitor-keys": "^4.2.1",
+        "espree": "^10.4.0",
         "esquery": "^1.5.0",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
@@ -1937,9 +2022,9 @@
       }
     },
     "node_modules/eslint-scope": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz",
-      "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==",
+      "version": "8.4.0",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+      "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
@@ -1954,9 +2039,9 @@
       }
     },
     "node_modules/eslint-visitor-keys": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
-      "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+      "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -1967,15 +2052,15 @@
       }
     },
     "node_modules/espree": {
-      "version": "10.3.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
-      "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+      "version": "10.4.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+      "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
-        "acorn": "^8.14.0",
+        "acorn": "^8.15.0",
         "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^4.2.0"
+        "eslint-visitor-keys": "^4.2.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2041,9 +2126,9 @@
       }
     },
     "node_modules/expect-type": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz",
-      "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==",
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz",
+      "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -2255,9 +2340,9 @@
       }
     },
     "node_modules/glob/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+      "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2342,9 +2427,9 @@
       }
     },
     "node_modules/import-fresh": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
-      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+      "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2488,6 +2573,13 @@
         "@pkgjs/parseargs": "^0.11.0"
       }
     },
+    "node_modules/js-tokens": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
+      "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/js-yaml": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@@ -2587,9 +2679,9 @@
       "license": "MIT"
     },
     "node_modules/loupe": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
-      "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz",
+      "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==",
       "dev": true,
       "license": "MIT"
     },
@@ -2703,9 +2795,9 @@
       "license": "MIT"
     },
     "node_modules/nanoid": {
-      "version": "3.3.8",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
-      "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+      "version": "3.3.11",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+      "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
       "dev": true,
       "funding": [
         {
@@ -2836,16 +2928,16 @@
       }
     },
     "node_modules/pathe": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz",
-      "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+      "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/pathval": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
-      "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz",
+      "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2873,9 +2965,9 @@
       }
     },
     "node_modules/postcss": {
-      "version": "8.5.1",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz",
-      "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==",
+      "version": "8.5.6",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+      "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
       "dev": true,
       "funding": [
         {
@@ -2893,7 +2985,7 @@
       ],
       "license": "MIT",
       "dependencies": {
-        "nanoid": "^3.3.8",
+        "nanoid": "^3.3.11",
         "picocolors": "^1.1.1",
         "source-map-js": "^1.2.1"
       },
@@ -2974,13 +3066,13 @@
       }
     },
     "node_modules/rollup": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.32.1.tgz",
-      "integrity": "sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==",
+      "version": "4.49.0",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.49.0.tgz",
+      "integrity": "sha512-3IVq0cGJ6H7fKXXEdVt+RcYvRCt8beYY9K1760wGQwSAHZcS9eot1zDG5axUbcp/kWRi5zKIIDX8MoKv/TzvZA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@types/estree": "1.0.6"
+        "@types/estree": "1.0.8"
       },
       "bin": {
         "rollup": "dist/bin/rollup"
@@ -2990,25 +3082,26 @@
         "npm": ">=8.0.0"
       },
       "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.32.1",
-        "@rollup/rollup-android-arm64": "4.32.1",
-        "@rollup/rollup-darwin-arm64": "4.32.1",
-        "@rollup/rollup-darwin-x64": "4.32.1",
-        "@rollup/rollup-freebsd-arm64": "4.32.1",
-        "@rollup/rollup-freebsd-x64": "4.32.1",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.32.1",
-        "@rollup/rollup-linux-arm-musleabihf": "4.32.1",
-        "@rollup/rollup-linux-arm64-gnu": "4.32.1",
-        "@rollup/rollup-linux-arm64-musl": "4.32.1",
-        "@rollup/rollup-linux-loongarch64-gnu": "4.32.1",
-        "@rollup/rollup-linux-powerpc64le-gnu": "4.32.1",
-        "@rollup/rollup-linux-riscv64-gnu": "4.32.1",
-        "@rollup/rollup-linux-s390x-gnu": "4.32.1",
-        "@rollup/rollup-linux-x64-gnu": "4.32.1",
-        "@rollup/rollup-linux-x64-musl": "4.32.1",
-        "@rollup/rollup-win32-arm64-msvc": "4.32.1",
-        "@rollup/rollup-win32-ia32-msvc": "4.32.1",
-        "@rollup/rollup-win32-x64-msvc": "4.32.1",
+        "@rollup/rollup-android-arm-eabi": "4.49.0",
+        "@rollup/rollup-android-arm64": "4.49.0",
+        "@rollup/rollup-darwin-arm64": "4.49.0",
+        "@rollup/rollup-darwin-x64": "4.49.0",
+        "@rollup/rollup-freebsd-arm64": "4.49.0",
+        "@rollup/rollup-freebsd-x64": "4.49.0",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.49.0",
+        "@rollup/rollup-linux-arm-musleabihf": "4.49.0",
+        "@rollup/rollup-linux-arm64-gnu": "4.49.0",
+        "@rollup/rollup-linux-arm64-musl": "4.49.0",
+        "@rollup/rollup-linux-loongarch64-gnu": "4.49.0",
+        "@rollup/rollup-linux-ppc64-gnu": "4.49.0",
+        "@rollup/rollup-linux-riscv64-gnu": "4.49.0",
+        "@rollup/rollup-linux-riscv64-musl": "4.49.0",
+        "@rollup/rollup-linux-s390x-gnu": "4.49.0",
+        "@rollup/rollup-linux-x64-gnu": "4.49.0",
+        "@rollup/rollup-linux-x64-musl": "4.49.0",
+        "@rollup/rollup-win32-arm64-msvc": "4.49.0",
+        "@rollup/rollup-win32-ia32-msvc": "4.49.0",
+        "@rollup/rollup-win32-x64-msvc": "4.49.0",
         "fsevents": "~2.3.2"
       }
     },
@@ -3133,9 +3226,9 @@
       "license": "MIT"
     },
     "node_modules/std-env": {
-      "version": "3.8.0",
-      "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz",
-      "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==",
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz",
+      "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==",
       "dev": true,
       "license": "MIT"
     },
@@ -3256,6 +3349,19 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/strip-literal": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz",
+      "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "js-tokens": "^9.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
     "node_modules/supports-color": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -3285,9 +3391,9 @@
       }
     },
     "node_modules/test-exclude/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+      "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3335,10 +3441,58 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/tinyglobby": {
+      "version": "0.2.14",
+      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
+      "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fdir": "^6.4.4",
+        "picomatch": "^4.0.2"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/SuperchupuDev"
+      }
+    },
+    "node_modules/tinyglobby/node_modules/fdir": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+      "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "peerDependencies": {
+        "picomatch": "^3 || ^4"
+      },
+      "peerDependenciesMeta": {
+        "picomatch": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/tinyglobby/node_modules/picomatch": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
     "node_modules/tinypool": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz",
-      "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz",
+      "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3356,9 +3510,9 @@
       }
     },
     "node_modules/tinyspy": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
-      "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz",
+      "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3392,13 +3546,13 @@
       }
     },
     "node_modules/tsx": {
-      "version": "4.19.2",
-      "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz",
-      "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==",
+      "version": "4.20.5",
+      "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz",
+      "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "esbuild": "~0.23.0",
+        "esbuild": "~0.25.0",
         "get-tsconfig": "^4.7.5"
       },
       "bin": {
@@ -3412,9 +3566,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/aix-ppc64": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz",
-      "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz",
+      "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==",
       "cpu": [
         "ppc64"
       ],
@@ -3429,9 +3583,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/android-arm": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz",
-      "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz",
+      "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==",
       "cpu": [
         "arm"
       ],
@@ -3446,9 +3600,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/android-arm64": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz",
-      "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz",
+      "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==",
       "cpu": [
         "arm64"
       ],
@@ -3463,9 +3617,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/android-x64": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz",
-      "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz",
+      "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==",
       "cpu": [
         "x64"
       ],
@@ -3480,9 +3634,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/darwin-arm64": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz",
-      "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz",
+      "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==",
       "cpu": [
         "arm64"
       ],
@@ -3497,9 +3651,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/darwin-x64": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz",
-      "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz",
+      "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==",
       "cpu": [
         "x64"
       ],
@@ -3514,9 +3668,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz",
-      "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz",
+      "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==",
       "cpu": [
         "arm64"
       ],
@@ -3531,9 +3685,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/freebsd-x64": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz",
-      "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz",
+      "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==",
       "cpu": [
         "x64"
       ],
@@ -3548,9 +3702,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/linux-arm": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz",
-      "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz",
+      "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==",
       "cpu": [
         "arm"
       ],
@@ -3565,9 +3719,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/linux-arm64": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz",
-      "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz",
+      "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==",
       "cpu": [
         "arm64"
       ],
@@ -3582,9 +3736,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/linux-ia32": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz",
-      "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz",
+      "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==",
       "cpu": [
         "ia32"
       ],
@@ -3599,9 +3753,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/linux-loong64": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz",
-      "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz",
+      "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==",
       "cpu": [
         "loong64"
       ],
@@ -3616,9 +3770,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/linux-mips64el": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz",
-      "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz",
+      "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==",
       "cpu": [
         "mips64el"
       ],
@@ -3633,9 +3787,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/linux-ppc64": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz",
-      "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz",
+      "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==",
       "cpu": [
         "ppc64"
       ],
@@ -3650,9 +3804,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/linux-riscv64": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz",
-      "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz",
+      "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==",
       "cpu": [
         "riscv64"
       ],
@@ -3667,9 +3821,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/linux-s390x": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz",
-      "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz",
+      "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==",
       "cpu": [
         "s390x"
       ],
@@ -3684,9 +3838,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/linux-x64": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz",
-      "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz",
+      "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==",
       "cpu": [
         "x64"
       ],
@@ -3700,10 +3854,27 @@
         "node": ">=18"
       }
     },
+    "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz",
+      "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/tsx/node_modules/@esbuild/netbsd-x64": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz",
-      "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz",
+      "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==",
       "cpu": [
         "x64"
       ],
@@ -3718,9 +3889,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz",
-      "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz",
+      "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==",
       "cpu": [
         "arm64"
       ],
@@ -3735,9 +3906,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/openbsd-x64": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz",
-      "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz",
+      "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==",
       "cpu": [
         "x64"
       ],
@@ -3752,9 +3923,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/sunos-x64": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz",
-      "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz",
+      "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==",
       "cpu": [
         "x64"
       ],
@@ -3769,9 +3940,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/win32-arm64": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz",
-      "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz",
+      "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==",
       "cpu": [
         "arm64"
       ],
@@ -3786,9 +3957,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/win32-ia32": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz",
-      "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz",
+      "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==",
       "cpu": [
         "ia32"
       ],
@@ -3803,9 +3974,9 @@
       }
     },
     "node_modules/tsx/node_modules/@esbuild/win32-x64": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz",
-      "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz",
+      "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==",
       "cpu": [
         "x64"
       ],
@@ -3820,9 +3991,9 @@
       }
     },
     "node_modules/tsx/node_modules/esbuild": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz",
-      "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==",
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz",
+      "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==",
       "dev": true,
       "hasInstallScript": true,
       "license": "MIT",
@@ -3833,30 +4004,32 @@
         "node": ">=18"
       },
       "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.23.1",
-        "@esbuild/android-arm": "0.23.1",
-        "@esbuild/android-arm64": "0.23.1",
-        "@esbuild/android-x64": "0.23.1",
-        "@esbuild/darwin-arm64": "0.23.1",
-        "@esbuild/darwin-x64": "0.23.1",
-        "@esbuild/freebsd-arm64": "0.23.1",
-        "@esbuild/freebsd-x64": "0.23.1",
-        "@esbuild/linux-arm": "0.23.1",
-        "@esbuild/linux-arm64": "0.23.1",
-        "@esbuild/linux-ia32": "0.23.1",
-        "@esbuild/linux-loong64": "0.23.1",
-        "@esbuild/linux-mips64el": "0.23.1",
-        "@esbuild/linux-ppc64": "0.23.1",
-        "@esbuild/linux-riscv64": "0.23.1",
-        "@esbuild/linux-s390x": "0.23.1",
-        "@esbuild/linux-x64": "0.23.1",
-        "@esbuild/netbsd-x64": "0.23.1",
-        "@esbuild/openbsd-arm64": "0.23.1",
-        "@esbuild/openbsd-x64": "0.23.1",
-        "@esbuild/sunos-x64": "0.23.1",
-        "@esbuild/win32-arm64": "0.23.1",
-        "@esbuild/win32-ia32": "0.23.1",
-        "@esbuild/win32-x64": "0.23.1"
+        "@esbuild/aix-ppc64": "0.25.9",
+        "@esbuild/android-arm": "0.25.9",
+        "@esbuild/android-arm64": "0.25.9",
+        "@esbuild/android-x64": "0.25.9",
+        "@esbuild/darwin-arm64": "0.25.9",
+        "@esbuild/darwin-x64": "0.25.9",
+        "@esbuild/freebsd-arm64": "0.25.9",
+        "@esbuild/freebsd-x64": "0.25.9",
+        "@esbuild/linux-arm": "0.25.9",
+        "@esbuild/linux-arm64": "0.25.9",
+        "@esbuild/linux-ia32": "0.25.9",
+        "@esbuild/linux-loong64": "0.25.9",
+        "@esbuild/linux-mips64el": "0.25.9",
+        "@esbuild/linux-ppc64": "0.25.9",
+        "@esbuild/linux-riscv64": "0.25.9",
+        "@esbuild/linux-s390x": "0.25.9",
+        "@esbuild/linux-x64": "0.25.9",
+        "@esbuild/netbsd-arm64": "0.25.9",
+        "@esbuild/netbsd-x64": "0.25.9",
+        "@esbuild/openbsd-arm64": "0.25.9",
+        "@esbuild/openbsd-x64": "0.25.9",
+        "@esbuild/openharmony-arm64": "0.25.9",
+        "@esbuild/sunos-x64": "0.25.9",
+        "@esbuild/win32-arm64": "0.25.9",
+        "@esbuild/win32-ia32": "0.25.9",
+        "@esbuild/win32-x64": "0.25.9"
       }
     },
     "node_modules/type-check": {
@@ -3910,9 +4083,9 @@
       }
     },
     "node_modules/undici-types": {
-      "version": "6.20.0",
-      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
-      "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+      "version": "6.21.0",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+      "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
       "dev": true,
       "license": "MIT"
     },
@@ -3927,21 +4100,24 @@
       }
     },
     "node_modules/vite": {
-      "version": "6.0.11",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz",
-      "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==",
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.3.tgz",
+      "integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "esbuild": "^0.24.2",
-        "postcss": "^8.4.49",
-        "rollup": "^4.23.0"
+        "esbuild": "^0.25.0",
+        "fdir": "^6.5.0",
+        "picomatch": "^4.0.3",
+        "postcss": "^8.5.6",
+        "rollup": "^4.43.0",
+        "tinyglobby": "^0.2.14"
       },
       "bin": {
         "vite": "bin/vite.js"
       },
       "engines": {
-        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+        "node": "^20.19.0 || >=22.12.0"
       },
       "funding": {
         "url": "https://github.com/vitejs/vite?sponsor=1"
@@ -3950,14 +4126,14 @@
         "fsevents": "~2.3.3"
       },
       "peerDependencies": {
-        "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+        "@types/node": "^20.19.0 || >=22.12.0",
         "jiti": ">=1.21.0",
-        "less": "*",
+        "less": "^4.0.0",
         "lightningcss": "^1.21.0",
-        "sass": "*",
-        "sass-embedded": "*",
-        "stylus": "*",
-        "sugarss": "*",
+        "sass": "^1.70.0",
+        "sass-embedded": "^1.70.0",
+        "stylus": ">=0.54.8",
+        "sugarss": "^5.0.0",
         "terser": "^5.16.0",
         "tsx": "^4.8.1",
         "yaml": "^2.4.2"
@@ -3999,17 +4175,17 @@
       }
     },
     "node_modules/vite-node": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.4.tgz",
-      "integrity": "sha512-7JZKEzcYV2Nx3u6rlvN8qdo3QV7Fxyt6hx+CCKz9fbWxdX5IvUOmTWEAxMrWxaiSf7CKGLJQ5rFu8prb/jBjOA==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz",
+      "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "cac": "^6.7.14",
-        "debug": "^4.4.0",
-        "es-module-lexer": "^1.6.0",
-        "pathe": "^2.0.2",
-        "vite": "^5.0.0 || ^6.0.0"
+        "debug": "^4.4.1",
+        "es-module-lexer": "^1.7.0",
+        "pathe": "^2.0.3",
+        "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
       },
       "bin": {
         "vite-node": "vite-node.mjs"
@@ -4021,32 +4197,533 @@
         "url": "https://opencollective.com/vitest"
       }
     },
+    "node_modules/vite/node_modules/@esbuild/aix-ppc64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz",
+      "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/android-arm": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz",
+      "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/android-arm64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz",
+      "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/android-x64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz",
+      "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/darwin-arm64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz",
+      "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/darwin-x64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz",
+      "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz",
+      "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/freebsd-x64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz",
+      "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-arm": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz",
+      "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-arm64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz",
+      "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-ia32": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz",
+      "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-loong64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz",
+      "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-mips64el": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz",
+      "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==",
+      "cpu": [
+        "mips64el"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-ppc64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz",
+      "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-riscv64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz",
+      "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-s390x": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz",
+      "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-x64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz",
+      "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/netbsd-arm64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz",
+      "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/netbsd-x64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz",
+      "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/openbsd-arm64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz",
+      "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/openbsd-x64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz",
+      "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/sunos-x64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz",
+      "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/win32-arm64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz",
+      "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/win32-ia32": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz",
+      "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/win32-x64": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz",
+      "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/esbuild": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz",
+      "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "optionalDependencies": {
+        "@esbuild/aix-ppc64": "0.25.9",
+        "@esbuild/android-arm": "0.25.9",
+        "@esbuild/android-arm64": "0.25.9",
+        "@esbuild/android-x64": "0.25.9",
+        "@esbuild/darwin-arm64": "0.25.9",
+        "@esbuild/darwin-x64": "0.25.9",
+        "@esbuild/freebsd-arm64": "0.25.9",
+        "@esbuild/freebsd-x64": "0.25.9",
+        "@esbuild/linux-arm": "0.25.9",
+        "@esbuild/linux-arm64": "0.25.9",
+        "@esbuild/linux-ia32": "0.25.9",
+        "@esbuild/linux-loong64": "0.25.9",
+        "@esbuild/linux-mips64el": "0.25.9",
+        "@esbuild/linux-ppc64": "0.25.9",
+        "@esbuild/linux-riscv64": "0.25.9",
+        "@esbuild/linux-s390x": "0.25.9",
+        "@esbuild/linux-x64": "0.25.9",
+        "@esbuild/netbsd-arm64": "0.25.9",
+        "@esbuild/netbsd-x64": "0.25.9",
+        "@esbuild/openbsd-arm64": "0.25.9",
+        "@esbuild/openbsd-x64": "0.25.9",
+        "@esbuild/openharmony-arm64": "0.25.9",
+        "@esbuild/sunos-x64": "0.25.9",
+        "@esbuild/win32-arm64": "0.25.9",
+        "@esbuild/win32-ia32": "0.25.9",
+        "@esbuild/win32-x64": "0.25.9"
+      }
+    },
+    "node_modules/vite/node_modules/fdir": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+      "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "peerDependencies": {
+        "picomatch": "^3 || ^4"
+      },
+      "peerDependenciesMeta": {
+        "picomatch": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vite/node_modules/picomatch": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
     "node_modules/vitest": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.4.tgz",
-      "integrity": "sha512-6XG8oTKy2gnJIFTHP6LD7ExFeNLxiTkK3CfMvT7IfR8IN+BYICCf0lXUQmX7i7JoxUP8QmeP4mTnWXgflu4yjw==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz",
+      "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/expect": "3.0.4",
-        "@vitest/mocker": "3.0.4",
-        "@vitest/pretty-format": "^3.0.4",
-        "@vitest/runner": "3.0.4",
-        "@vitest/snapshot": "3.0.4",
-        "@vitest/spy": "3.0.4",
-        "@vitest/utils": "3.0.4",
-        "chai": "^5.1.2",
-        "debug": "^4.4.0",
-        "expect-type": "^1.1.0",
+        "@types/chai": "^5.2.2",
+        "@vitest/expect": "3.2.4",
+        "@vitest/mocker": "3.2.4",
+        "@vitest/pretty-format": "^3.2.4",
+        "@vitest/runner": "3.2.4",
+        "@vitest/snapshot": "3.2.4",
+        "@vitest/spy": "3.2.4",
+        "@vitest/utils": "3.2.4",
+        "chai": "^5.2.0",
+        "debug": "^4.4.1",
+        "expect-type": "^1.2.1",
         "magic-string": "^0.30.17",
-        "pathe": "^2.0.2",
-        "std-env": "^3.8.0",
+        "pathe": "^2.0.3",
+        "picomatch": "^4.0.2",
+        "std-env": "^3.9.0",
         "tinybench": "^2.9.0",
         "tinyexec": "^0.3.2",
-        "tinypool": "^1.0.2",
+        "tinyglobby": "^0.2.14",
+        "tinypool": "^1.1.1",
         "tinyrainbow": "^2.0.0",
-        "vite": "^5.0.0 || ^6.0.0",
-        "vite-node": "3.0.4",
+        "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0",
+        "vite-node": "3.2.4",
         "why-is-node-running": "^2.3.0"
       },
       "bin": {
@@ -4062,8 +4739,8 @@
         "@edge-runtime/vm": "*",
         "@types/debug": "^4.1.12",
         "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
-        "@vitest/browser": "3.0.4",
-        "@vitest/ui": "3.0.4",
+        "@vitest/browser": "3.2.4",
+        "@vitest/ui": "3.2.4",
         "happy-dom": "*",
         "jsdom": "*"
       },
@@ -4091,6 +4768,19 @@
         }
       }
     },
+    "node_modules/vitest/node_modules/picomatch": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
     "node_modules/which": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json
index 9945c51d..38d94cbb 100644
--- a/lib/binding_web/package.json
+++ b/lib/binding_web/package.json
@@ -61,10 +61,9 @@
     "lib/*.h"
   ],
   "devDependencies": {
-    "@eslint/js": "^9.19.0",
-    "@types/emscripten": "^1.40.0",
-    "@types/node": "^22.12.0",
-    "@vitest/coverage-v8": "^3.0.4",
+    "@eslint/js": "^9.20.0",
+    "@types/node": "^22.13.1",
+    "@vitest/coverage-v8": "^3.0.5",
     "dts-buddy": "^0.5.4",
     "esbuild": "^0.24.2",
     "eslint": "^9.19.0",
@@ -74,8 +73,16 @@
     "typescript-eslint": "^8.22.0",
     "vitest": "^3.0.4"
   },
+  "peerDependencies": {
+    "@types/emscripten": "^1.40.0"
+  },
+  "peerDependenciesMeta": {
+    "@types/emscripten": {
+      "optional": true
+    }
+  },
   "scripts": {
-    "build:ts": "node script/build.js",
+    "build:ts": "tsc -b . && node script/build.js",
     "build:wasm": "cd ../../ && cargo xtask build-wasm",
     "build:wasm:debug": "cd ../../ && cargo xtask build-wasm --debug",
     "build": "npm run build:wasm && npm run build:ts",
diff --git a/lib/binding_web/src/index.ts b/lib/binding_web/src/index.ts
index 9ac4a835..92791145 100644
--- a/lib/binding_web/src/index.ts
+++ b/lib/binding_web/src/index.ts
@@ -1,4 +1,4 @@
-export {
+export type {
   Point,
   Range,
   Edit,
@@ -7,8 +7,8 @@ export {
   LogCallback,
 } from './constants';
 export {
-  ParseOptions,
-  ParseState,
+  type ParseOptions,
+  type ParseState,
   LANGUAGE_VERSION,
   MIN_COMPATIBLE_VERSION,
   Parser,
@@ -18,14 +18,14 @@ export { Tree } from './tree';
 export { Node } from './node';
 export { TreeCursor } from './tree_cursor';
 export {
-  QueryOptions,
-  QueryState,
-  QueryProperties,
-  QueryPredicate,
-  QueryCapture,
-  QueryMatch,
+  type QueryOptions,
+  type QueryState,
+  type QueryProperties,
+  type QueryPredicate,
+  type QueryCapture,
+  type QueryMatch,
   CaptureQuantifier,
-  PredicateStep,
+  type PredicateStep,
   Query,
-}  from './query';
+} from './query';
 export { LookaheadIterator } from './lookahead_iterator';
diff --git a/lib/binding_web/src/language.ts b/lib/binding_web/src/language.ts
index bbb9810f..cdcf159e 100644
--- a/lib/binding_web/src/language.ts
+++ b/lib/binding_web/src/language.ts
@@ -6,7 +6,7 @@ import { Query } from './query';
 
 const LANGUAGE_FUNCTION_REGEX = /^tree_sitter_\w+$/;
 
-export class LanguageMetadata {
+export interface LanguageMetadata {
   readonly major_version: number;
   readonly minor_version: number;
   readonly patch_version: number;
diff --git a/lib/binding_web/src/marshal.ts b/lib/binding_web/src/marshal.ts
index d52b1dfe..c742afc6 100644
--- a/lib/binding_web/src/marshal.ts
+++ b/lib/binding_web/src/marshal.ts
@@ -168,10 +168,9 @@ export function marshalEdit(edit: Edit, address = TRANSFER_BUFFER) {
  *
  * Unmarshals a {@link LanguageMetadata} from the transfer buffer.
  */
-export function unmarshalLanguageMetadata(address: number): LanguageMetadata {
-  const result = {} as LanguageMetadata;
-  result.major_version = C.getValue(address, 'i32'); address += SIZE_OF_INT;
-  result.minor_version = C.getValue(address, 'i32'); address += SIZE_OF_INT;
-  result.field_count = C.getValue(address, 'i32');
-  return result;
+export function unmarshalLanguageMetadata(address: number): LanguageMetadata {  
+  const major_version = C.getValue(address, 'i32');
+  const minor_version = C.getValue(address += SIZE_OF_INT, 'i32');
+  const patch_version = C.getValue(address += SIZE_OF_INT, 'i32');
+  return { major_version, minor_version, patch_version };
 }
diff --git a/lib/binding_web/src/node.ts b/lib/binding_web/src/node.ts
index 87d77b5b..df21b75d 100644
--- a/lib/binding_web/src/node.ts
+++ b/lib/binding_web/src/node.ts
@@ -9,7 +9,8 @@ import { TRANSFER_BUFFER } from './parser';
 /** A single node within a syntax {@link Tree}. */
 export class Node {
   /** @internal */
-  private [0] = 0; // Internal handle for WASM
+  // @ts-expect-error: never read
+  private [0] = 0; // Internal handle for Wasm
 
   /** @internal */
   private _children?: (Node | null)[];
@@ -635,7 +636,7 @@ export class Node {
   }
 
   /** Get the S-expression representation of this node. */
-  toString() {
+  toString(): string {
     marshalNode(this);
     const address = C._ts_node_to_string_wasm(this.tree[0]);
     const result = C.AsciiToString(address);
diff --git a/lib/binding_web/src/tree_cursor.ts b/lib/binding_web/src/tree_cursor.ts
index 61c93006..7562bb7f 100644
--- a/lib/binding_web/src/tree_cursor.ts
+++ b/lib/binding_web/src/tree_cursor.ts
@@ -7,16 +7,20 @@ import { getText, Tree } from './tree';
 /** A stateful object for walking a syntax {@link Tree} efficiently. */
 export class TreeCursor {
   /** @internal */
-  private [0] = 0; // Internal handle for WASM
+  // @ts-expect-error: never read
+  private [0] = 0; // Internal handle for Wasm
 
   /** @internal */
-  private [1] = 0; // Internal handle for WASM
+  // @ts-expect-error: never read
+  private [1] = 0; // Internal handle for Wasm
 
   /** @internal */
-  private [2] = 0; // Internal handle for WASM
+  // @ts-expect-error: never read
+  private [2] = 0; // Internal handle for Wasm
 
   /** @internal */
-  private [3] = 0; // Internal handle for WASM
+  // @ts-expect-error: never read
+  private [3] = 0; // Internal handle for Wasm
 
   /** @internal */
   private tree: Tree;
diff --git a/lib/binding_web/test/node.test.ts b/lib/binding_web/test/node.test.ts
index 574b588b..58d143db 100644
--- a/lib/binding_web/test/node.test.ts
+++ b/lib/binding_web/test/node.test.ts
@@ -193,14 +193,14 @@ describe('Node', () => {
     it('correctly retrieves immediate children', () => {
       const sourceCode = 'let x = 1; console.log(x);';
       tree = parser.parse(sourceCode)!;
-      const root = tree.rootNode
-      const child = root.children[0].children[0]
-      const a = root.childWithDescendant(child)
-      expect(a!.startIndex).toBe(0)
-      const b = a!.childWithDescendant(child)
-      expect(b).toEqual(child)
-      const c = b!.childWithDescendant(child)
-      expect(c).toBeNull()
+      const root = tree.rootNode;
+      const child = root.children[0]!.children[0]!;
+      const a = root.childWithDescendant(child);
+      expect(a!.startIndex).toBe(0);
+      const b = a!.childWithDescendant(child);
+      expect(b).toEqual(child);
+      const c = b!.childWithDescendant(child);
+      expect(c).toBeNull();
     });
   });
 
diff --git a/lib/binding_web/tsconfig.json b/lib/binding_web/tsconfig.json
index b7b45b69..b7ed356f 100644
--- a/lib/binding_web/tsconfig.json
+++ b/lib/binding_web/tsconfig.json
@@ -25,11 +25,14 @@
     "esModuleInterop": true,
     "forceConsistentCasingInFileNames": true,
     "skipLibCheck": true,
+    "composite": true,
+    "isolatedModules": true,
   },
   "include": [
-    "src/**/*",
-    "script/**/*",
-    "test/**/*",
+    "src/*.ts",
+    "script/*",
+    "test/*",
+    "lib/*.ts"
   ],
   "exclude": [
     "node_modules",

From 47beafb836d531d0367b639b2e32101895198c82 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sun, 31 Aug 2025 19:14:41 +0300
Subject: [PATCH 376/663] fix(playground): account for missing button

---
 docs/src/assets/js/playground.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/src/assets/js/playground.js b/docs/src/assets/js/playground.js
index 3a410595..7c4e7bd2 100644
--- a/docs/src/assets/js/playground.js
+++ b/docs/src/assets/js/playground.js
@@ -180,7 +180,7 @@ window.initializePlayground = async (opts) => {
   accessibilityCheckbox.addEventListener("change", handleQueryChange);
   languageSelect.addEventListener("change", handleLanguageChange);
   outputContainer.addEventListener("click", handleTreeClick);
-  copyButton.addEventListener("click", handleCopy);
+  copyButton?.addEventListener("click", handleCopy);
 
   handleQueryEnableChange();
   await handleLanguageChange();

From f9a331a50544bf4f1f0ba2fb643cee252af03cc7 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Fri, 29 Aug 2025 19:20:59 +0300
Subject: [PATCH 377/663] ci(spam): fix permission check

---
 .github/scripts/close_spam.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/scripts/close_spam.js b/.github/scripts/close_spam.js
index 7b58f6ab..5e8d8c2b 100644
--- a/.github/scripts/close_spam.js
+++ b/.github/scripts/close_spam.js
@@ -3,7 +3,7 @@ module.exports = async ({ github, context }) => {
     ...context.repo,
     username: context.actor
   });
-  if (!data.permission.includes("triage")) {
+  if (!data.user.permissions.triage) {
     await github.log.error("Workflow called with insufficient permissions!");
     return;
   }

From dbe88f8bbbe0bb0d3fe01d14bdaf2b0d85e83113 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sat, 30 Aug 2025 23:14:30 +0300
Subject: [PATCH 378/663] fixup: remove permission check

---
 .github/scripts/close_spam.js | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/.github/scripts/close_spam.js b/.github/scripts/close_spam.js
index 5e8d8c2b..41046964 100644
--- a/.github/scripts/close_spam.js
+++ b/.github/scripts/close_spam.js
@@ -1,13 +1,4 @@
 module.exports = async ({ github, context }) => {
-  const { data } = await github.rest.repos.getCollaboratorPermissionLevel({
-    ...context.repo,
-    username: context.actor
-  });
-  if (!data.user.permissions.triage) {
-    await github.log.error("Workflow called with insufficient permissions!");
-    return;
-  }
-
   let target = context.payload.issue;
   if (target) {
     await github.rest.issues.update({

From b75196bb81176708faafb8b219991b628e3b0b08 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sat, 23 Aug 2025 10:18:15 +0300
Subject: [PATCH 379/663] feat(c): rename DecodeFunction to TSDecodeFunction

Keep a typedef for backwards compatibility until ABI 16.
---
 docs/src/using-parsers/2-basic-parsing.md | 6 +++---
 lib/binding_rust/bindings.rs              | 4 ++--
 lib/include/tree_sitter/api.h             | 7 +++++--
 lib/src/lexer.c                           | 2 +-
 4 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/docs/src/using-parsers/2-basic-parsing.md b/docs/src/using-parsers/2-basic-parsing.md
index 3d03e1c9..77f6fb7a 100644
--- a/docs/src/using-parsers/2-basic-parsing.md
+++ b/docs/src/using-parsers/2-basic-parsing.md
@@ -38,15 +38,15 @@ typedef struct {
     uint32_t *bytes_read
   );
   TSInputEncoding encoding;
-  DecodeFunction decode;
+  TSDecodeFunction decode;
 } TSInput;
 ```
 
 If you want to decode text that is not encoded in UTF-8 or UTF-16, you can set the `decode` field of the input to your function
-that will decode text. The signature of the `DecodeFunction` is as follows:
+that will decode text. The signature of the `TSDecodeFunction` is as follows:
 
 ```c
-typedef uint32_t (*DecodeFunction)(
+typedef uint32_t (*TSDecodeFunction)(
   const uint8_t *string,
   uint32_t length,
   int32_t *code_point
diff --git a/lib/binding_rust/bindings.rs b/lib/binding_rust/bindings.rs
index 7d912665..c8d0e864 100644
--- a/lib/binding_rust/bindings.rs
+++ b/lib/binding_rust/bindings.rs
@@ -35,7 +35,7 @@ pub struct TSQueryCursor {
 pub struct TSLookaheadIterator {
     _unused: [u8; 0],
 }
-pub type DecodeFunction = ::core::option::Option<
+pub type TSDecodeFunction = ::core::option::Option<
     unsafe extern "C" fn(string: *const u8, length: u32, code_point: *mut i32) -> u32,
 >;
 pub const TSInputEncodingUTF8: TSInputEncoding = 0;
@@ -75,7 +75,7 @@ pub struct TSInput {
         ) -> *const ::core::ffi::c_char,
     >,
     pub encoding: TSInputEncoding,
-    pub decode: DecodeFunction,
+    pub decode: TSDecodeFunction,
 }
 #[repr(C)]
 #[derive(Debug, Copy, Clone)]
diff --git a/lib/include/tree_sitter/api.h b/lib/include/tree_sitter/api.h
index aad67460..ffc108ca 100644
--- a/lib/include/tree_sitter/api.h
+++ b/lib/include/tree_sitter/api.h
@@ -51,12 +51,15 @@ typedef struct TSLookaheadIterator TSLookaheadIterator;
 // This function signature reads one code point from the given string,
 // returning the number of bytes consumed. It should write the code point
 // to the `code_point` pointer, or write -1 if the input is invalid.
-typedef uint32_t (*DecodeFunction)(
+typedef uint32_t (*TSDecodeFunction)(
   const uint8_t *string,
   uint32_t length,
   int32_t *code_point
 );
 
+// Deprecated alias to be removed in ABI 16
+typedef TSDecodeFunction DecodeFunction;
+
 typedef enum TSInputEncoding {
   TSInputEncodingUTF8,
   TSInputEncodingUTF16LE,
@@ -87,7 +90,7 @@ typedef struct TSInput {
   void *payload;
   const char *(*read)(void *payload, uint32_t byte_index, TSPoint position, uint32_t *bytes_read);
   TSInputEncoding encoding;
-  DecodeFunction decode;
+  TSDecodeFunction decode;
 } TSInput;
 
 typedef struct TSParseState {
diff --git a/lib/src/lexer.c b/lib/src/lexer.c
index 94124fd1..1709c418 100644
--- a/lib/src/lexer.c
+++ b/lib/src/lexer.c
@@ -114,7 +114,7 @@ static void ts_lexer__get_lookahead(Lexer *self) {
   }
 
   const uint8_t *chunk = (const uint8_t *)self->chunk + position_in_chunk;
-  DecodeFunction decode =
+  TSDecodeFunction decode =
     self->input.encoding == TSInputEncodingUTF8    ? ts_decode_utf8     :
     self->input.encoding == TSInputEncodingUTF16LE ? ts_decode_utf16_le :
     self->input.encoding == TSInputEncodingUTF16BE ? ts_decode_utf16_be : self->input.decode;

From 9b23cd5394b55847fe668ff0dcc0396c79c9182d Mon Sep 17 00:00:00 2001
From: Boris Verkhovskiy 
Date: Mon, 1 Sep 2025 20:08:20 -0600
Subject: [PATCH 380/663] feat: use `compileStreaming` when loading wasm
 parsers

---
 crates/cli/src/main.rs                   |  3 +-
 crates/loader/src/loader.rs              |  2 +-
 crates/xtask/src/build_wasm.rs           |  2 +-
 lib/binding_web/lib/web-tree-sitter.d.ts | 10 +++---
 lib/binding_web/src/language.ts          | 40 +++++++++++++-----------
 5 files changed, 30 insertions(+), 27 deletions(-)

diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs
index 89baa7f1..be27b596 100644
--- a/crates/cli/src/main.rs
+++ b/crates/cli/src/main.rs
@@ -908,6 +908,8 @@ impl Build {
             eprintln!("Warning: --docker flag is no longer used, and will be removed in a future release.");
         }
 
+        loader.debug_build(self.debug);
+
         if self.wasm {
             let output_path = self.output.map(|path| current_dir.join(path));
             let root_path = get_root_path(&grammar_path.join("tree-sitter.json"))?;
@@ -946,7 +948,6 @@ impl Build {
                 (false, false) => &[],
             };
 
-            loader.debug_build(self.debug);
             loader.force_rebuild(true);
 
             let config = Config::load(None)?;
diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs
index 6f9ac1ae..3e483f94 100644
--- a/crates/loader/src/loader.rs
+++ b/crates/loader/src/loader.rs
@@ -1042,7 +1042,7 @@ impl Loader {
             output_name,
             "-fPIC",
             "-shared",
-            "-Os",
+            if self.debug_build { "-g" } else { "-Os" },
             format!("-Wl,--export=tree_sitter_{language_name}").as_str(),
             "-Wl,--allow-undefined",
             "-Wl,--no-entry",
diff --git a/crates/xtask/src/build_wasm.rs b/crates/xtask/src/build_wasm.rs
index 58259b0f..a46be45d 100644
--- a/crates/xtask/src/build_wasm.rs
+++ b/crates/xtask/src/build_wasm.rs
@@ -247,7 +247,7 @@ fn build_wasm(cmd: &mut Command, edit_tsd: bool) -> Result<()> {
                     "undefined, localScope?: any | undefined, handle?: number | undefined): any"
                 ),
                 concat!(
-                    "loadWebAssemblyModule(binary: Uint8Array, flags: Record,",
+                    "loadWebAssemblyModule(binary: Uint8Array | WebAssembly.Module, flags: Record,",
                     " libName?: string, localScope?: Record, handle?: number):",
                     " Promise number>>"
                 ),
diff --git a/lib/binding_web/lib/web-tree-sitter.d.ts b/lib/binding_web/lib/web-tree-sitter.d.ts
index 9bb137c6..1e592e6d 100644
--- a/lib/binding_web/lib/web-tree-sitter.d.ts
+++ b/lib/binding_web/lib/web-tree-sitter.d.ts
@@ -11,13 +11,11 @@ declare namespace RuntimeExports {
      *   maximum number of bytes to read. You can omit this parameter to scan the
      *   string until the first 0 byte. If maxBytesToRead is passed, and the string
      *   at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the
-     *   string will cut short at that byte index (i.e. maxBytesToRead will not
-     *   produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing
-     *   frequent uses of UTF8ToString() with and without maxBytesToRead may throw
-     *   JS JIT optimizations off, so it is worth to consider consistently using one
+     *   string will cut short at that byte index.
+     * @param {boolean=} ignoreNul - If true, the function will not stop on a NUL character.
      * @return {string}
      */
-    function UTF8ToString(ptr: number, maxBytesToRead?: number): string;
+    function UTF8ToString(ptr: number, maxBytesToRead?: number | undefined, ignoreNul?: boolean | undefined): string;
     function lengthBytesUTF8(str: string): number;
     function stringToUTF16(str: string, outPtr: number, maxBytesToWrite: number): number;
     /**
@@ -25,7 +23,7 @@ declare namespace RuntimeExports {
      * @param {Object=} localScope
      * @param {number=} handle
      */
-    function loadWebAssemblyModule(binary: Uint8Array, flags: Record, libName?: string, localScope?: Record, handle?: number): Promise number>>;
+    function loadWebAssemblyModule(binary: Uint8Array | WebAssembly.Module, flags: Record, libName?: string, localScope?: Record, handle?: number): Promise number>>;
     /**
      * @param {number} ptr
      * @param {string} type
diff --git a/lib/binding_web/src/language.ts b/lib/binding_web/src/language.ts
index d0c0583c..4c4dec1a 100644
--- a/lib/binding_web/src/language.ts
+++ b/lib/binding_web/src/language.ts
@@ -255,29 +255,33 @@ export class Language {
    * The module can be provided as a path to a file or as a buffer.
    */
   static async load(input: string | Uint8Array): Promise {
-    let bytes: Promise;
+    let binary: Uint8Array | WebAssembly.Module;
     if (input instanceof Uint8Array) {
-      bytes = Promise.resolve(input);
+      binary = input;
+    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+    } else if (globalThis.process?.versions.node) {
+      const fs: typeof import('fs/promises') = await import('fs/promises');
+      binary = await fs.readFile(input);
     } else {
-      // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
-      if (globalThis.process?.versions.node) {
-        const fs: typeof import('fs/promises') = await import('fs/promises');
-        bytes = fs.readFile(input);
-      } else {
-        bytes = fetch(input)
-          .then((response) => response.arrayBuffer()
-            .then((buffer) => {
-              if (response.ok) {
-                return new Uint8Array(buffer);
-              } else {
-                const body = new TextDecoder('utf-8').decode(buffer);
-                throw new Error(`Language.load failed with status ${response.status}.\n\n${body}`);
-              }
-            }));
+      const response = await fetch(input);
+
+      if (!response.ok){
+        const body = await response.text();
+        throw new Error(`Language.load failed with status ${response.status}.\n\n${body}`);
+      }
+
+      const retryResp = response.clone();
+      try {
+        binary = await WebAssembly.compileStreaming(response);
+      } catch (reason) {
+        console.error('wasm streaming compile failed:', reason);
+        console.error('falling back to ArrayBuffer instantiation');
+        // fallback, probably because of bad MIME type
+        binary = new Uint8Array(await retryResp.arrayBuffer())
       }
     }
 
-    const mod = await C.loadWebAssemblyModule(await bytes, { loadAsync: true });
+    const mod = await C.loadWebAssemblyModule(binary, { loadAsync: true });
     const symbolNames = Object.keys(mod);
     const functionName = symbolNames.find((key) => LANGUAGE_FUNCTION_REGEX.test(key) &&
       !key.includes('external_scanner_'));

From da61d7cac5b969ae82d475b1c7cfb92d2a06d445 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Wed, 6 Aug 2025 20:10:16 -0400
Subject: [PATCH 381/663] feat: add nix flake

---
 .envrc                    |   1 +
 .gitignore                |   2 +
 crates/cli/flake.nix      | 118 +++++++++++++++++
 docs/flake.nix            |  38 ++++++
 flake.lock                |  61 +++++++++
 flake.nix                 | 263 ++++++++++++++++++++++++++++++++++++++
 lib/binding_web/flake.nix | 160 +++++++++++++++++++++++
 lib/flake.nix             |  54 ++++++++
 8 files changed, 697 insertions(+)
 create mode 100644 .envrc
 create mode 100644 crates/cli/flake.nix
 create mode 100644 docs/flake.nix
 create mode 100644 flake.lock
 create mode 100644 flake.nix
 create mode 100644 lib/binding_web/flake.nix
 create mode 100644 lib/flake.nix

diff --git a/.envrc b/.envrc
new file mode 100644
index 00000000..3550a30f
--- /dev/null
+++ b/.envrc
@@ -0,0 +1 @@
+use flake
diff --git a/.gitignore b/.gitignore
index d9a69cb6..bf1e36d6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,12 @@
 log*.html
+.direnv
 
 .idea
 *.xcodeproj
 .vscode
 .cache
 .zig-cache
+.direnv
 
 profile*
 fuzz-results
diff --git a/crates/cli/flake.nix b/crates/cli/flake.nix
new file mode 100644
index 00000000..b3cc2134
--- /dev/null
+++ b/crates/cli/flake.nix
@@ -0,0 +1,118 @@
+{
+  perSystem =
+    {
+      self',
+      pkgs,
+      lib,
+      src,
+      version,
+      ...
+    }:
+    let
+      nativeBuildInputs = [
+        pkgs.pkg-config
+        pkgs.nodejs_22
+      ];
+
+      buildInputs = [
+        pkgs.openssl
+        pkgs.installShellFiles
+      ];
+    in
+    {
+      packages = {
+        cli = pkgs.rustPlatform.buildRustPackage {
+          inherit
+            src
+            version
+            nativeBuildInputs
+            buildInputs
+            ;
+
+          pname = "tree-sitter-cli";
+
+          cargoLock.lockFile = ../../Cargo.lock;
+
+          preBuild = ''
+            rm -rf test/fixtures
+            mkdir -p test/fixtures
+            cp -r ${self'.packages.test-grammars}/fixtures/* test/fixtures/
+            chmod -R u+w test/fixtures
+          '';
+
+          preCheck = ''
+            export HOME=$TMPDIR
+          '';
+
+          doCheck = true;
+
+          postInstall = ''
+            installShellCompletion --cmd tree-sitter               \
+              --bash <($out/bin/tree-sitter complete --shell bash) \
+              --zsh  <($out/bin/tree-sitter complete --shell zsh)  \
+              --fish <($out/bin/tree-sitter complete --shell fish)
+          '';
+
+          meta = {
+            description = "Tree-sitter CLI - A tool for developing, testing, and using Tree-sitter parsers";
+            longDescription = ''
+              Tree-sitter is a parser generator tool and an incremental parsing library.
+              It can build a concrete syntax tree for a source file and efficiently update
+              the syntax tree as the source file is edited. This package provides the CLI
+              tool for developing, testing, and using Tree-sitter parsers.
+            '';
+            homepage = "https://tree-sitter.github.io/tree-sitter";
+            changelog = "https://github.com/tree-sitter/tree-sitter/releases/tag/v${version}";
+            license = lib.licenses.mit;
+            maintainers = [ lib.maintainers.amaanq ];
+            platforms = lib.platforms.all;
+            mainProgram = "tree-sitter";
+          };
+        };
+
+        rust-fmt =
+          pkgs.runCommand "rust-fmt-check"
+            {
+              nativeBuildInputs = [
+                pkgs.cargo
+                pkgs.rustfmt
+              ];
+            }
+            ''
+              cd ${src}
+              cargo fmt --all --check
+              touch $out
+            '';
+
+        rust-clippy = pkgs.rustPlatform.buildRustPackage {
+          inherit src version;
+
+          pname = "rust-clippy-check";
+
+          cargoLock.lockFile = ../../Cargo.lock;
+
+          nativeBuildInputs = [
+            pkgs.pkg-config
+            pkgs.clippy
+            pkgs.cmake
+            pkgs.clang
+            pkgs.libclang
+          ];
+
+          buildInputs = [ pkgs.openssl ];
+
+          buildPhase = ''
+            export HOME=$TMPDIR
+            export LIBCLANG_PATH="${pkgs.libclang.lib}/lib"
+            cargo xtask clippy
+          '';
+
+          installPhase = ''
+            touch $out
+          '';
+
+          doCheck = false;
+        };
+      };
+    };
+}
diff --git a/docs/flake.nix b/docs/flake.nix
new file mode 100644
index 00000000..c752bf43
--- /dev/null
+++ b/docs/flake.nix
@@ -0,0 +1,38 @@
+{
+  perSystem =
+    {
+      pkgs,
+      lib,
+      src,
+      version,
+      ...
+    }:
+    {
+      packages.docs = pkgs.stdenv.mkDerivation {
+        inherit src version;
+
+        pname = "tree-sitter-docs";
+
+        nativeBuildInputs = [
+          pkgs.mdbook
+          pkgs.mdbook-admonish
+        ];
+
+        buildPhase = ''
+          cd docs
+          mdbook build
+        '';
+
+        installPhase = ''
+          mkdir -p $out/share/doc
+          cp -r book $out/share/doc/tree-sitter
+        '';
+
+        meta = {
+          description = "Tree-sitter documentation";
+          homepage = "https://tree-sitter.github.io/tree-sitter";
+          license = lib.licenses.mit;
+        };
+      };
+    };
+}
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 00000000..cc94b957
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,61 @@
+{
+  "nodes": {
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib"
+      },
+      "locked": {
+        "lastModified": 1754487366,
+        "narHash": "sha256-pHYj8gUBapuUzKV/kN/tR3Zvqc7o6gdFB9XKXIp1SQ8=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "af66ad14b28a127c5c0f3bbb298218fc63528a18",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1756542300,
+        "narHash": "sha256-tlOn88coG5fzdyqz6R93SQL5Gpq+m/DsWpekNFhqPQk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "d7600c775f877cd87b4f5a831c28aa94137377aa",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib": {
+      "locked": {
+        "lastModified": 1753579242,
+        "narHash": "sha256-zvaMGVn14/Zz8hnp4VWT9xVnhc8vuL3TStRqwk22biA=",
+        "owner": "nix-community",
+        "repo": "nixpkgs.lib",
+        "rev": "0f36c44e01a6129be94e3ade315a5883f0228a6e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixpkgs.lib",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "flake-parts": "flake-parts",
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 00000000..68bf8a4f
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,263 @@
+{
+  description = "Tree-sitter - A parser generator tool and an incremental parsing library";
+
+  inputs = {
+    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
+    flake-parts.url = "github:hercules-ci/flake-parts";
+  };
+
+  outputs =
+    inputs@{ flake-parts, ... }:
+    flake-parts.lib.mkFlake { inherit inputs; } {
+      systems = [
+        "x86_64-linux"
+        "aarch64-linux"
+        "x86_64-darwin"
+        "aarch64-darwin"
+      ];
+
+      imports = [
+        ./crates/cli/flake.nix
+        ./lib/flake.nix
+        ./lib/binding_web/flake.nix
+        ./docs/flake.nix
+      ];
+
+      perSystem =
+        {
+          self',
+          pkgs,
+          lib,
+          ...
+        }:
+        let
+          version = "0.26.0";
+
+          src = pkgs.lib.cleanSourceWith {
+            src = ./.;
+            filter =
+              name: type:
+              let
+                baseName = baseNameOf name;
+              in
+              !(
+                lib.elem baseName [
+                  "target"
+                  "node_modules"
+                  ".git"
+                  ".direnv"
+                  "flake.lock"
+                ]
+                || lib.hasPrefix "result" baseName
+              );
+          };
+
+          fixturesJson = lib.importJSON ./test/fixtures/fixtures.json;
+
+          grammarHashes = {
+            bash = "sha256-vRaN/mNfpR+hdv2HVS1bzaW0o+HGjizRFsk3iinICJE=";
+            c = "sha256-gmzbdwvrKSo6C1fqTJFGxy8x0+T+vUTswm7F5sojzKc=";
+            cpp = "sha256-tP5Tu747V8QMCEBYwOEmMQUm8OjojpJdlRmjcJTbe2k=";
+            embedded-template = "sha256-nBQain0Lc21jOgQFfvkyq615ZmT8qdMxtqIoUcOcO3A=";
+            go = "sha256-y7bTET8ypPczPnMVlCaiZuswcA7vFrDOc2jlbfVk5Sk=";
+            html = "sha256-Pd5Me1twLGOrRB3pSMVX9M8VKenTK0896aoLznjNkGo=";
+            java = "sha256-OvEO1BLZLjP3jt4gar18kiXderksFKO0WFXDQqGLRIY=";
+            javascript = "sha256-2Jj/SUG+k8lHlGSuPZvHjJojvQFgDiZHZzH8xLu7suE=";
+            jsdoc = "sha256-Azzb2zBjAfwbEmAEO1YqhpaxtzbXmRjfIzRla2Hx+24=";
+            json = "sha256-DNZC2cTy1C8OaMOpEHM6NoRtOIbLaBf0CLXXWCKODlw=";
+            php = "sha256-jI7yzcoHS/tNxUqJI4aD1rdEZV3jMn1GZD0J+81Dyf0=";
+            python = "sha256-71Od4sUsxGEvTwmXX8hBvzqD55hnXkVJublrhp1GICg=";
+            ruby = "sha256-iu3MVJl0Qr/Ba+aOttmEzMiVY6EouGi5wGOx5ofROzA=";
+            rust = "sha256-y3sJURlSTM7LRRN5WGIAeslsdRZU522Tfcu6dnXH/XQ=";
+            typescript = "sha256-CU55+YoFJb6zWbJnbd38B7iEGkhukSVpBN7sli6GkGY=";
+          };
+
+          grammarSpecs = lib.listToAttrs (
+            map (fixture: {
+              name = lib.elemAt fixture 0;
+              value = {
+                rev = lib.elemAt fixture 1;
+                sha256 = grammarHashes.${lib.elemAt fixture 0};
+              };
+            }) fixturesJson
+          );
+
+          fetchGrammar =
+            name: rev: sha256:
+            pkgs.fetchFromGitHub {
+              owner = "tree-sitter";
+              repo = "tree-sitter-${name}";
+              inherit rev sha256;
+            };
+
+          testGrammars = lib.mapAttrs (name: spec: fetchGrammar name spec.rev spec.sha256) grammarSpecs;
+        in
+        {
+          _module.args = {
+            inherit src version;
+          };
+
+          packages = {
+            default = self'.packages.cli;
+
+            test-grammars = pkgs.stdenv.mkDerivation {
+              inherit src version;
+
+              pname = "test-grammars";
+
+              buildPhase = ''
+                mkdir -p test/fixtures/grammars
+                ${lib.concatMapStrings (name: ''
+                  cp -r ${testGrammars.${name}} test/fixtures/grammars/${name}
+                '') (lib.attrNames testGrammars)}
+              '';
+
+              installPhase = ''
+                mkdir -p $out
+                cp -r test/fixtures $out/fixtures
+              '';
+            };
+          };
+
+          apps = {
+            default = self'.apps.cli;
+
+            cli = {
+              type = "app";
+              program = "${self'.packages.cli}/bin/tree-sitter";
+              meta.description = "Tree-sitter CLI for developing, testing, and using parsers";
+            };
+
+            docs = {
+              type = "app";
+              program = "${pkgs.writeShellScript "docs" ''
+                echo "📚 Serving documentation at http://localhost:3000"
+                cd docs && ${pkgs.mdbook}/bin/mdbook serve
+              ''}";
+              meta.description = "Serve Tree-sitter documentation locally";
+            };
+
+            format = {
+              type = "app";
+              program = toString (
+                pkgs.writeShellScript "format-all" ''
+                  set -e
+                  echo "Formatting..."
+                  echo ""
+                  echo "→ Rust..."
+                  ${pkgs.cargo}/bin/cargo fmt --all
+                  echo "→ Nix..."
+                  ${pkgs.nixfmt-rfc-style}/bin/nixfmt *.nix crates/cli/*.nix lib/*.nix lib/binding_web/*.nix docs/*.nix
+                  echo "→ Web (TypeScript/JavaScript)..."
+                  cd lib/binding_web && ${pkgs.nodejs_22}/bin/npm install --silent && ${pkgs.nodejs_22}/bin/npm run lint:fix
+                  cd ../..
+                  echo ""
+                  echo "Formatting complete"
+                ''
+              );
+              meta.description = "Format all Rust and Nix code";
+            };
+
+            lint = {
+              type = "app";
+              program = toString (
+                pkgs.writeShellScript "lint-all" ''
+                  set -e
+                  echo "Linting code..."
+                  echo ""
+                  echo "→ Checking Rust formatting..."
+                  ${pkgs.cargo}/bin/cargo fmt --all --check
+                  echo "→ Running clippy..."
+                  ${pkgs.cargo}/bin/cargo clippy --workspace --all-targets -- -D warnings
+                  echo "→ Checking Nix formatting..."
+                  ${pkgs.nixfmt-rfc-style}/bin/nixfmt --check *.nix crates/cli/*.nix lib/*.nix lib/binding_web/*.nix docs/*.nix
+                  echo "→ Checking Web code..."
+                  cd lib/binding_web && ${pkgs.nodejs_22}/bin/npm install --silent && ${pkgs.nodejs_22}/bin/npm run lint
+                  cd ../..
+                  echo ""
+                  echo "Linting complete"
+                ''
+              );
+              meta.description = "Run all linting checks";
+            };
+          };
+
+          checks = {
+            inherit (self'.packages)
+              cli
+              lib
+              web-tree-sitter
+              web-lint
+              rust-fmt
+              rust-clippy
+              ;
+
+            nix-fmt =
+              pkgs.runCommand "nix-fmt-check"
+                {
+                  nativeBuildInputs = [ pkgs.nixfmt-rfc-style ];
+                }
+                ''
+                  cd ${src}
+                  nixfmt --check *.nix crates/cli/*.nix lib/*.nix lib/binding_web/*.nix docs/*.nix
+                  touch $out
+                '';
+          };
+
+          formatter = pkgs.nixfmt-rfc-style;
+
+          devShells.default = pkgs.mkShell {
+            buildInputs = [
+              pkgs.cargo
+              pkgs.rustc
+              pkgs.clippy
+              pkgs.rust-analyzer
+              pkgs.rustfmt
+
+              pkgs.cmake
+              pkgs.gnumake
+              pkgs.pkg-config
+              pkgs.clang
+              pkgs.libclang
+
+              pkgs.nodejs_22
+              pkgs.emscripten
+              pkgs.pkgsCross.wasi32.stdenv.cc
+
+              pkgs.mdbook
+              pkgs.mdbook-admonish
+
+              pkgs.git
+              pkgs.nixfmt-rfc-style
+              pkgs.openssl
+              pkgs.openssl.dev
+            ];
+
+            shellHook = ''
+              echo "Tree-sitter Dev Environment"
+              echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
+              echo ""
+              echo "Packages:"
+              echo "  nix build .#cli              - Build CLI tool"
+              echo "  nix build .#lib              - Build C library"
+              echo "  nix build .#web-tree-sitter  - Build WASM bindings"
+              echo "  nix build .#docs             - Build documentation"
+              echo ""
+              echo "Apps:"
+              echo "  nix run .#cli                - Run tree-sitter CLI"
+              echo "  nix run .#docs               - Serve docs locally"
+              echo "  nix run .#format             - Format all code"
+              echo "  nix run .#lint               - Run all linting checks"
+              echo ""
+              echo "Tests & Checks:"
+              echo "  nix flake check              - Run all tests and checks"
+              echo ""
+              echo "Version: ${version}"
+            '';
+
+            RUST_BACKTRACE = 1;
+            LIBCLANG_PATH = "${pkgs.libclang.lib}/lib";
+          };
+        };
+    };
+}
diff --git a/lib/binding_web/flake.nix b/lib/binding_web/flake.nix
new file mode 100644
index 00000000..ba972627
--- /dev/null
+++ b/lib/binding_web/flake.nix
@@ -0,0 +1,160 @@
+{
+  perSystem =
+    {
+      self',
+      pkgs,
+      lib,
+      src,
+      version,
+      ...
+    }:
+    let
+      grammars = [
+        "bash"
+        "c"
+        "cpp"
+        "embedded-template"
+        "html"
+        "javascript"
+        "json"
+        "python"
+        "rust"
+        "typescript"
+      ];
+
+      wasmTestGrammars = pkgs.stdenv.mkDerivation {
+        inherit src version;
+
+        pname = "wasm-test-grammars";
+
+        nativeBuildInputs = [
+          self'.packages.cli
+          pkgs.pkgsCross.wasi32.stdenv.cc
+          pkgs.nodejs_22
+        ];
+
+        buildPhase = ''
+          export HOME=$TMPDIR
+          export TREE_SITTER_WASI_SDK_PATH=${pkgs.pkgsCross.wasi32.stdenv.cc}
+          export NIX_LDFLAGS=""
+
+          cp -r ${self'.packages.test-grammars}/fixtures .
+          chmod -R u+w fixtures
+
+          for grammar in ${lib.concatStringsSep " " grammars}; do
+            if [ -d "fixtures/grammars/$grammar" ]; then
+              echo "Building WASM for $grammar"
+
+              if [ "$grammar" = "typescript" ]; then
+                tree-sitter build --wasm -o "tree-sitter-typescript.wasm" "fixtures/grammars/$grammar/typescript"
+                tree-sitter build --wasm -o "tree-sitter-tsx.wasm" "fixtures/grammars/$grammar/tsx"
+              else
+                tree-sitter build --wasm -o "tree-sitter-$grammar.wasm" "fixtures/grammars/$grammar"
+              fi
+            fi
+          done
+        '';
+
+        installPhase = ''
+          mkdir -p $out
+          for wasm in *.wasm; do
+            if [ -f "$wasm" ]; then
+              echo "Installing $wasm"
+              cp "$wasm" $out/
+            fi
+          done
+        '';
+      };
+    in
+    {
+      packages = {
+        web-tree-sitter = pkgs.buildNpmPackage {
+          inherit src version;
+
+          pname = "web-tree-sitter";
+
+          npmDepsHash = "sha256-y0GobcskcZTmju90TM64GjeWiBmPFCrTOg0yfccdB+Q=";
+
+          nativeBuildInputs = [
+            pkgs.rustPlatform.cargoSetupHook
+            pkgs.cargo
+            pkgs.pkg-config
+            pkgs.emscripten
+          ];
+
+          buildInputs = [ pkgs.openssl ];
+
+          cargoDeps = pkgs.rustPlatform.importCargoLock {
+            lockFile = ../../Cargo.lock;
+          };
+
+          doCheck = true;
+
+          postPatch = ''
+            cp lib/binding_web/package{,-lock}.json .
+          '';
+
+          buildPhase = ''
+            cd lib/binding_web
+            CJS=true npm run build
+            CJS=true npm run build:debug
+            npm run build:debug
+            npm run build
+          '';
+
+          checkPhase = ''
+            cd ../../
+            mkdir -p target/release
+
+            for grammar in ${wasmTestGrammars}/*.wasm; do
+              if [ -f "$grammar" ]; then
+                cp "$grammar" target/release/
+              fi
+            done
+
+            cd lib/binding_web && npm test
+          '';
+
+          meta = {
+            description = "web-tree-sitter - WebAssembly bindings to the Tree-sitter parsing library.";
+            longDescription = ''
+              web-tree-sitter provides WebAssembly bindings to the Tree-sitter parsing library.
+              It can build a concrete syntax tree for a source file and efficiently update
+              the syntax tree as the source file is edited. This package provides the WebAssembly bindings
+              and a JavaScript API for using them in web browsers
+            '';
+            homepage = "https://tree-sitter.github.io/tree-sitter";
+            changelog = "https://github.com/tree-sitter/tree-sitter/releases/tag/v${version}";
+            license = lib.licenses.mit;
+            maintainers = [ lib.maintainers.amaanq ];
+            platforms = lib.platforms.all;
+          };
+        };
+
+        web-lint = pkgs.buildNpmPackage {
+          inherit src version;
+
+          pname = "web-tree-sitter-lint";
+
+          npmDepsHash = "sha256-y0GobcskcZTmju90TM64GjeWiBmPFCrTOg0yfccdB+Q=";
+
+          postPatch = ''
+            cp lib/binding_web/package{,-lock}.json .
+          '';
+
+          buildPhase = ''
+            cd lib/binding_web
+            npm run lint
+          '';
+
+          installPhase = ''
+            touch $out
+          '';
+
+          meta = {
+            description = "Lint check for web-tree-sitter TypeScript/JavaScript code";
+          };
+        };
+      };
+    };
+}
diff --git a/lib/flake.nix b/lib/flake.nix
new file mode 100644
index 00000000..052d7eae
--- /dev/null
+++ b/lib/flake.nix
@@ -0,0 +1,54 @@
+{
+  perSystem =
+    {
+      pkgs,
+      lib,
+      src,
+      version,
+      ...
+    }:
+    {
+      packages.lib = pkgs.stdenv.mkDerivation {
+        inherit src version;
+
+        pname = "tree-sitter";
+
+        nativeBuildInputs = [
+          pkgs.cmake
+          pkgs.pkg-config
+        ];
+
+        sourceRoot = "source/lib";
+
+        cmakeFlags = [
+          "-DBUILD_SHARED_LIBS=ON"
+          "-DCMAKE_INSTALL_LIBDIR=lib"
+          "-DCMAKE_INSTALL_INCLUDEDIR=include"
+          "-DTREE_SITTER_FEATURE_WASM=OFF"
+        ];
+
+        enableParallelBuilding = true;
+
+        postInstall = ''
+          mkdir -p $out/{lib/pkgconfig,share/tree-sitter}
+          substituteInPlace $out/lib/pkgconfig/tree-sitter.pc \
+            --replace-fail "\''${prefix}" "$out" 2>/dev/null
+        '';
+
+        meta = {
+          description = "Tree-sitter incremental parsing library";
+          longDescription = ''
+            Tree-sitter is a parser generator tool and an incremental parsing library.
+            It can build a concrete syntax tree for a source file and efficiently update
+            the syntax tree as the source file is edited. This package provides the core
+            C library that can be used to parse source code using Tree-sitter grammars.
+          '';
+          homepage = "https://tree-sitter.github.io/tree-sitter";
+          changelog = "https://github.com/tree-sitter/tree-sitter/releases/tag/v${version}";
+          license = lib.licenses.mit;
+          maintainers = [ lib.maintainers.amaanq ];
+          platforms = lib.platforms.all;
+        };
+      };
+    };
+}

From f2e71ec95c75f0e1815d8739a32f64f94d3768e7 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Sat, 30 Aug 2025 18:48:31 -0400
Subject: [PATCH 382/663] fix(xtask): restore stripped `sourcesContent` when
 building the wasm module

---
 crates/xtask/src/build_wasm.rs    | 25 +++++++++++--
 crates/xtask/src/embed_sources.rs | 61 +++++++++++++++++++++++++++++++
 crates/xtask/src/main.rs          |  1 +
 3 files changed, 83 insertions(+), 4 deletions(-)
 create mode 100644 crates/xtask/src/embed_sources.rs

diff --git a/crates/xtask/src/build_wasm.rs b/crates/xtask/src/build_wasm.rs
index a46be45d..4ad35e4b 100644
--- a/crates/xtask/src/build_wasm.rs
+++ b/crates/xtask/src/build_wasm.rs
@@ -3,7 +3,7 @@ use std::{
     ffi::{OsStr, OsString},
     fmt::Write,
     fs,
-    path::PathBuf,
+    path::{Path, PathBuf},
     process::Command,
     time::Duration,
 };
@@ -16,7 +16,9 @@ use notify::{
 };
 use notify_debouncer_full::new_debouncer;
 
-use crate::{bail_on_err, watch_wasm, BuildWasm, EMSCRIPTEN_TAG};
+use crate::{
+    bail_on_err, embed_sources::embed_sources_in_map, watch_wasm, BuildWasm, EMSCRIPTEN_TAG,
+};
 
 #[derive(PartialEq, Eq)]
 enum EmccSource {
@@ -48,10 +50,14 @@ const EXPORTED_RUNTIME_METHODS: [&str; 19] = [
 ];
 
 pub fn run_wasm(args: &BuildWasm) -> Result<()> {
-    let mut emscripten_flags = vec!["-O3", "--minify", "0"];
+    let mut emscripten_flags = if args.debug {
+        vec!["-O0", "--minify", "0"]
+    } else {
+        vec!["-O3", "--minify", "0"]
+    };
 
     if args.debug {
-        emscripten_flags.extend(["-s", "ASSERTIONS=1", "-s", "SAFE_HEAP=1", "-O0", "-g"]);
+        emscripten_flags.extend(["-s", "ASSERTIONS=1", "-s", "SAFE_HEAP=1", "-g"]);
     }
 
     if args.verbose {
@@ -287,6 +293,17 @@ fn build_wasm(cmd: &mut Command, edit_tsd: bool) -> Result<()> {
         fs::write(file, content)?;
     }
 
+    // Post-process the source map to embed source content for optimized builds
+    let map_path = Path::new("lib")
+        .join("binding_web")
+        .join("lib")
+        .join("web-tree-sitter.wasm.map");
+    if map_path.exists() {
+        if let Err(e) = embed_sources_in_map(&map_path) {
+            eprintln!("Warning: Failed to embed sources in source map: {e}");
+        }
+    }
+
     Ok(())
 }
 
diff --git a/crates/xtask/src/embed_sources.rs b/crates/xtask/src/embed_sources.rs
new file mode 100644
index 00000000..ce8ec403
--- /dev/null
+++ b/crates/xtask/src/embed_sources.rs
@@ -0,0 +1,61 @@
+use anyhow::Result;
+use std::fs;
+use std::path::Path;
+
+/// Restores sourcesContent if it was stripped by Binaryen.
+///
+/// This is a workaround for Binaryen where `wasm-opt -O2` and higher
+/// optimization levels strip the `sourcesContent` field from source maps,
+/// even when the source map was generated with `--sources` flag.
+///
+/// This is fixed upstream in Binaryen as of Apr 9, 2025, but there hasn't been a release with the fix yet.
+/// See: 
+///
+/// This reads the original source files and embeds them in the
+/// source map's `sourcesContent` field, making debugging possible even
+/// with optimized builds.
+///
+/// TODO: Once Binaryen releases a version with the fix, and emscripten updates to that
+/// version, and we update our emscripten version, this function can be removed.
+pub fn embed_sources_in_map(map_path: &Path) -> Result<()> {
+    let map_content = fs::read_to_string(map_path)?;
+    let mut map: serde_json::Value = serde_json::from_str(&map_content)?;
+
+    if let Some(sources_content) = map.get("sourcesContent") {
+        if let Some(arr) = sources_content.as_array() {
+            if !arr.is_empty() && arr.iter().any(|v| !v.is_null()) {
+                return Ok(());
+            }
+        }
+    }
+
+    let sources = map["sources"]
+        .as_array()
+        .ok_or_else(|| anyhow::anyhow!("No sources array in source map"))?;
+
+    let map_dir = map_path.parent().unwrap_or(Path::new("."));
+    let mut sources_content = Vec::new();
+
+    for source in sources {
+        let source_path = source.as_str().unwrap_or("");
+        let full_path = map_dir.join(source_path);
+
+        let content = if full_path.exists() {
+            match fs::read_to_string(&full_path) {
+                Ok(content) => serde_json::Value::String(content),
+                Err(_) => serde_json::Value::Null,
+            }
+        } else {
+            serde_json::Value::Null
+        };
+
+        sources_content.push(content);
+    }
+
+    map["sourcesContent"] = serde_json::Value::Array(sources_content);
+
+    let output = serde_json::to_string(&map)?;
+    fs::write(map_path, output)?;
+
+    Ok(())
+}
diff --git a/crates/xtask/src/main.rs b/crates/xtask/src/main.rs
index 600ae83e..1c59f4f4 100644
--- a/crates/xtask/src/main.rs
+++ b/crates/xtask/src/main.rs
@@ -3,6 +3,7 @@ mod build_wasm;
 mod bump;
 mod check_wasm_exports;
 mod clippy;
+mod embed_sources;
 mod fetch;
 mod generate;
 mod test;

From 94996b26e5014774eb4a482ad8365ba4117d068f Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Sat, 30 Aug 2025 18:48:58 -0400
Subject: [PATCH 383/663] refactor(web): clean up preserving sourcemap logic,
 don't copy lib files

---
 lib/binding_web/script/build.js | 53 +++++++++++++--------------------
 1 file changed, 20 insertions(+), 33 deletions(-)

diff --git a/lib/binding_web/script/build.js b/lib/binding_web/script/build.js
index 6f2bedd6..737267a1 100644
--- a/lib/binding_web/script/build.js
+++ b/lib/binding_web/script/build.js
@@ -1,49 +1,37 @@
 import esbuild from 'esbuild';
 import fs from 'fs/promises';
-import path from 'path';
 
 const format = process.env.CJS ? 'cjs' : 'esm';
 const debug = process.argv.includes('--debug');
 const outfile = `${debug ? 'debug/' : ''}web-tree-sitter.${format === 'esm' ? 'js' : 'cjs'}`;
 
-// Copy source files to lib directory - we'll map the Wasm's sourcemap to these files.
-async function copySourceFiles() {
-  const sourceDir = '../src';
-  const files = await fs.readdir(sourceDir);
-
-  for (const file of files) {
-    if (file.endsWith('.c') || file.endsWith('.h')) {
-      await fs.copyFile(
-        path.join(sourceDir, file),
-        path.join('lib', file)
-      );
-    }
-  }
-}
-
 async function processWasmSourceMap(inputPath, outputPath) {
   const mapContent = await fs.readFile(inputPath, 'utf8');
   const sourceMap = JSON.parse(mapContent);
 
-  // Filter out emscripten files and normalize paths
-  sourceMap.sources = sourceMap.sources
-    .filter(source => {
-      // Keep only tree-sitter source files
-      return source.includes('../../src/') || source === 'tree-sitter.c';
-    })
-    .map(source => {
-      if (source.includes('../../src/')) {
-        return source.replace('../../src/', debug ? '../lib/' : 'lib/');
-      } else if (source === 'tree-sitter.c') {
-        return debug ? '../lib/tree-sitter.c' : 'lib/tree-sitter.c';
-      } else {
-        return source;
-      }
-    });
+  const isTreeSitterSource = (source) => 
+    source.includes('../../src/') || source === 'tree-sitter.c';
+
+  const normalizePath = (source) => {
+    if (source.includes('../../src/')) {
+      return source.replace('../../src/', debug ? '../lib/' : 'lib/');
+    } else if (source === 'tree-sitter.c') {
+      return debug ? '../lib/tree-sitter.c' : 'lib/tree-sitter.c';
+    }
+    return source;
+  };
+
+  const filtered = sourceMap.sources
+    .map((source, index) => ({ source, content: sourceMap.sourcesContent?.[index] }))
+    .filter(item => isTreeSitterSource(item.source))
+    .map(item => ({ source: normalizePath(item.source), content: item.content }));
+
+  sourceMap.sources = filtered.map(item => item.source);
+  sourceMap.sourcesContent = filtered.map(item => item.content);
+
   await fs.writeFile(outputPath, JSON.stringify(sourceMap, null, 2));
 }
 
-
 async function build() {
   await esbuild.build({
     entryPoints: ['src/index.ts'],
@@ -62,7 +50,6 @@ async function build() {
   const outputWasmName = `${debug ? 'debug/' : ''}web-tree-sitter.wasm`;
   await fs.copyFile('lib/web-tree-sitter.wasm', outputWasmName);
 
-  await copySourceFiles();
   await processWasmSourceMap('lib/web-tree-sitter.wasm.map', `${outputWasmName}.map`);
 }
 

From f0cfaffd5e538d8a626ea9bef8f9d2cfaa1ba1f0 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Sun, 31 Aug 2025 02:37:29 -0400
Subject: [PATCH 384/663] build(web): mark `@types/emscripten` as a dev dep

---
 lib/binding_web/package-lock.json | 14 +++-----------
 lib/binding_web/package.json      |  9 +--------
 2 files changed, 4 insertions(+), 19 deletions(-)

diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json
index f923e813..a601b2ac 100644
--- a/lib/binding_web/package-lock.json
+++ b/lib/binding_web/package-lock.json
@@ -10,6 +10,7 @@
       "license": "MIT",
       "devDependencies": {
         "@eslint/js": "^9.20.0",
+        "@types/emscripten": "^1.40.0",
         "@types/node": "^24.3.0",
         "@vitest/coverage-v8": "^3.0.5",
         "dts-buddy": "^0.6.2",
@@ -20,14 +21,6 @@
         "typescript": "^5.7.3",
         "typescript-eslint": "^8.23.0",
         "vitest": "^3.0.5"
-      },
-      "peerDependencies": {
-        "@types/emscripten": "^1.40.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/emscripten": {
-          "optional": true
-        }
       }
     },
     "node_modules/@ampproject/remapping": {
@@ -1195,9 +1188,8 @@
       "version": "1.40.0",
       "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.40.0.tgz",
       "integrity": "sha512-MD2JJ25S4tnjnhjWyalMS6K6p0h+zQV6+Ylm+aGbiS8tSn/aHLSGNzBgduj6FB4zH0ax2GRMGYi/8G1uOxhXWA==",
-      "license": "MIT",
-      "optional": true,
-      "peer": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@types/estree": {
       "version": "1.0.8",
diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json
index f523e586..5d343d21 100644
--- a/lib/binding_web/package.json
+++ b/lib/binding_web/package.json
@@ -70,6 +70,7 @@
   ],
   "devDependencies": {
     "@eslint/js": "^9.20.0",
+    "@types/emscripten": "^1.40.0",
     "@types/node": "^24.3.0",
     "@vitest/coverage-v8": "^3.0.5",
     "dts-buddy": "^0.6.2",
@@ -81,14 +82,6 @@
     "typescript-eslint": "^8.23.0",
     "vitest": "^3.0.5"
   },
-  "peerDependencies": {
-    "@types/emscripten": "^1.40.0"
-  },
-  "peerDependenciesMeta": {
-    "@types/emscripten": {
-      "optional": true
-    }
-  },
   "scripts": {
     "build:ts": "tsc -b . && node script/build.js",
     "build:wasm": "cd ../../ && cargo xtask build-wasm",

From 22d658518b99c95e40841fcd41b115009a3c67f4 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Sun, 31 Aug 2025 02:50:58 -0400
Subject: [PATCH 385/663] feat(loader): allow specifying the wasi sdk path

---
 crates/loader/src/loader.rs | 56 ++++++++++++++++++++++++++++++-------
 1 file changed, 46 insertions(+), 10 deletions(-)

diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs
index 3e483f94..44d62846 100644
--- a/crates/loader/src/loader.rs
+++ b/crates/loader/src/loader.rs
@@ -1105,21 +1105,51 @@ impl Loader {
         Ok(())
     }
 
+    /// This ensures that the wasi-sdk is available, downloading and extracting it if necessary,
+    /// and returns the path to the `clang` executable.
+    ///
+    /// If `TREE_SITTER_WASI_SDK_PATH` is set, it will use that path to look for the clang executable.
     fn ensure_wasi_sdk_exists(&self) -> Result {
+        let possible_executables = if cfg!(windows) {
+            vec![
+                "clang.exe",
+                "wasm32-unknown-wasi-clang.exe",
+                "wasm32-wasi-clang.exe",
+            ]
+        } else {
+            vec!["clang", "wasm32-unknown-wasi-clang", "wasm32-wasi-clang"]
+        };
+
+        if let Ok(wasi_sdk_path) = std::env::var("TREE_SITTER_WASI_SDK_PATH") {
+            let wasi_sdk_dir = PathBuf::from(wasi_sdk_path);
+
+            for exe in &possible_executables {
+                let clang_exe = wasi_sdk_dir.join("bin").join(exe);
+                if clang_exe.exists() {
+                    return Ok(clang_exe);
+                }
+            }
+
+            return Err(anyhow!(
+                "TREE_SITTER_WASI_SDK_PATH is set to '{}', but no clang executable found in 'bin/' directory. \
+                 Looked for: {}",
+                wasi_sdk_dir.display(),
+                possible_executables.join(", ")
+            ));
+        }
+
         let cache_dir = etcetera::choose_base_strategy()?
             .cache_dir()
             .join("tree-sitter");
         fs::create_dir_all(&cache_dir)?;
 
         let wasi_sdk_dir = cache_dir.join("wasi-sdk");
-        let clang_exe = if cfg!(windows) {
-            wasi_sdk_dir.join("bin").join("clang.exe")
-        } else {
-            wasi_sdk_dir.join("bin").join("clang")
-        };
 
-        if clang_exe.exists() {
-            return Ok(clang_exe);
+        for exe in &possible_executables {
+            let clang_exe = wasi_sdk_dir.join("bin").join(exe);
+            if clang_exe.exists() {
+                return Ok(clang_exe);
+            }
         }
 
         fs::create_dir_all(&wasi_sdk_dir)?;
@@ -1176,14 +1206,20 @@ impl Loader {
             .context("Failed to extract wasi-sdk archive")?;
 
         fs::remove_file(temp_tar_path).ok();
-        if !clang_exe.exists() {
-            return Err(anyhow!(
+        for exe in &possible_executables {
+            let clang_exe = wasi_sdk_dir.join("bin").join(exe);
+            if !clang_exe.exists() {
+                return Err(anyhow!(
                 "Failed to extract wasi-sdk correctly. Clang executable not found at expected location: {}",
                 clang_exe.display()
             ));
+            }
         }
 
-        Ok(clang_exe)
+        Err(anyhow!(
+            "Failed to find clang executable in downloaded wasi-sdk at '{}'",
+            wasi_sdk_dir.display()
+        ))
     }
 
     #[must_use]

From 6e8ad7e5ccb583ac327c80ada401f015002b76f1 Mon Sep 17 00:00:00 2001
From: ObserverOfTime 
Date: Sat, 30 Aug 2025 01:11:02 +0300
Subject: [PATCH 386/663] fix(xtask): update paths in bump-version

and remove the toml dependency
---
 Cargo.lock               | 60 ----------------------------------------
 Cargo.toml               |  1 -
 crates/xtask/Cargo.toml  |  1 -
 crates/xtask/src/bump.rs | 32 +++++++++++----------
 4 files changed, 17 insertions(+), 77 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 85fac44e..d6f51e68 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1685,15 +1685,6 @@ dependencies = [
  "serde",
 ]
 
-[[package]]
-name = "serde_spanned"
-version = "0.6.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3"
-dependencies = [
- "serde",
-]
-
 [[package]]
 name = "shell-words"
 version = "1.1.0"
@@ -1889,47 +1880,6 @@ dependencies = [
  "zerovec",
 ]
 
-[[package]]
-name = "toml"
-version = "0.8.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
-dependencies = [
- "serde",
- "serde_spanned",
- "toml_datetime",
- "toml_edit",
-]
-
-[[package]]
-name = "toml_datetime"
-version = "0.6.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "toml_edit"
-version = "0.22.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
-dependencies = [
- "indexmap",
- "serde",
- "serde_spanned",
- "toml_datetime",
- "toml_write",
- "winnow",
-]
-
-[[package]]
-name = "toml_write"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
-
 [[package]]
 name = "topological-sort"
 version = "0.2.2"
@@ -2829,15 +2779,6 @@ version = "0.53.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
 
-[[package]]
-name = "winnow"
-version = "0.7.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf"
-dependencies = [
- "memchr",
-]
-
 [[package]]
 name = "wit-bindgen"
 version = "0.45.0"
@@ -2877,7 +2818,6 @@ dependencies = [
  "semver",
  "serde",
  "serde_json",
- "toml",
 ]
 
 [[package]]
diff --git a/Cargo.toml b/Cargo.toml
index 0f340fdf..d904bf5a 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -151,7 +151,6 @@ tar = "0.4.40"
 tempfile = "3.21.0"
 thiserror = "2.0.16"
 tiny_http = "0.12.0"
-toml = "0.8.23"
 topological-sort = "0.2.2"
 unindent = "0.2.4"
 url = { version = "2.5.4", features = ["serde"] }
diff --git a/crates/xtask/Cargo.toml b/crates/xtask/Cargo.toml
index 23422138..176a318d 100644
--- a/crates/xtask/Cargo.toml
+++ b/crates/xtask/Cargo.toml
@@ -22,7 +22,6 @@ cc.workspace = true
 clap.workspace = true
 git2.workspace = true
 indoc.workspace = true
-toml.workspace = true
 regex.workspace = true
 semver.workspace = true
 serde.workspace = true
diff --git a/crates/xtask/src/bump.rs b/crates/xtask/src/bump.rs
index 3e6239af..3efffaa1 100644
--- a/crates/xtask/src/bump.rs
+++ b/crates/xtask/src/bump.rs
@@ -4,7 +4,6 @@ use anyhow::{anyhow, Result};
 use git2::{DiffOptions, Repository};
 use indoc::indoc;
 use semver::{BuildMetadata, Prerelease, Version};
-use toml::Value;
 
 use crate::{create_commit, BumpVersion};
 
@@ -241,7 +240,7 @@ fn update_crates(current_version: &Version, next_version: &Version) -> Result<()
         .arg("--force")
         .arg("tree-sitter{,-cli,-config,-generate,-loader,-highlight,-tags}")
         .arg("--ignore-changes")
-        .arg("lib/language/*");
+        .arg("crates/language/*");
 
     let status = cmd.status()?;
 
@@ -253,7 +252,10 @@ fn update_crates(current_version: &Version, next_version: &Version) -> Result<()
 }
 
 fn update_npm(next_version: &Version) -> Result<()> {
-    for path in ["lib/binding_web/package.json", "cli/npm/package.json"] {
+    for path in [
+        "lib/binding_web/package.json",
+        "crates/cli/npm/package.json",
+    ] {
         let package_json =
             serde_json::from_str::(&std::fs::read_to_string(path)?)?;
 
@@ -275,13 +277,11 @@ fn update_npm(next_version: &Version) -> Result<()> {
 }
 
 fn update_zig(next_version: &Version) -> Result<()> {
-    let zig = std::fs::read_to_string("build.zig.zon")?;
-
-    let zig = zig
+    let zig = std::fs::read_to_string("build.zig.zon")?
         .lines()
         .map(|line| {
-            if line.starts_with("  .version") {
-                format!("  .version = \"{next_version}\",")
+            if line.starts_with("    .version") {
+                format!("    .version = \"{next_version}\",")
             } else {
                 line.to_string()
             }
@@ -297,11 +297,13 @@ fn update_zig(next_version: &Version) -> Result<()> {
 
 /// read Cargo.toml and get the version
 fn fetch_workspace_version() -> Result {
-    let cargo_toml = toml::from_str::(&std::fs::read_to_string("Cargo.toml")?)?;
-
-    Ok(cargo_toml["workspace"]["package"]["version"]
-        .as_str()
-        .unwrap()
-        .trim_matches('"')
-        .to_string())
+    std::fs::read_to_string("Cargo.toml")?
+        .lines()
+        .find(|line| line.starts_with("version = "))
+        .and_then(|line| {
+            line.split_terminator('"')
+                .next_back()
+                .map(|s| s.to_string())
+        })
+        .ok_or_else(|| anyhow!("No version found in Cargo.toml"))
 }

From 4535ea6aaa5dcac647497c5cbe184ca702ff9be5 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Tue, 2 Sep 2025 13:23:12 -0400
Subject: [PATCH 387/663] refactor(loader): use the curl binary instead of
 `ureq` to download wasi-sdk

---
 crates/loader/Cargo.toml    |  1 -
 crates/loader/src/loader.rs | 30 +++++++++++-------------------
 2 files changed, 11 insertions(+), 20 deletions(-)

diff --git a/crates/loader/Cargo.toml b/crates/loader/Cargo.toml
index bd44f87c..6e9e5760 100644
--- a/crates/loader/Cargo.toml
+++ b/crates/loader/Cargo.toml
@@ -44,7 +44,6 @@ serde_json.workspace = true
 tar.workspace = true
 tempfile.workspace = true
 url.workspace = true
-ureq = "3.1.0"
 
 tree-sitter = { workspace = true }
 tree-sitter-highlight = { workspace = true, optional = true }
diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs
index 44d62846..ee5b43c6 100644
--- a/crates/loader/src/loader.rs
+++ b/crates/loader/src/loader.rs
@@ -1179,28 +1179,20 @@ impl Loader {
 
         eprintln!("Downloading wasi-sdk from {sdk_url}...");
         let temp_tar_path = cache_dir.join(sdk_filename);
-        let mut temp_file = fs::File::create(&temp_tar_path).with_context(|| {
-            format!(
-                "Failed to create temporary file at {}",
-                temp_tar_path.display()
-            )
-        })?;
 
-        let response = ureq::get(&sdk_url)
-            .call()
-            .with_context(|| format!("Failed to download wasi-sdk from {sdk_url}"))?;
-        if !response.status().is_success() {
-            return Err(anyhow::anyhow!(
-                "Failed to download wasi-sdk from {}",
-                sdk_url
-            ));
+        let status = Command::new("curl")
+            .arg("-f")
+            .arg("-L")
+            .arg("-o")
+            .arg(&temp_tar_path)
+            .arg(&sdk_url)
+            .status()
+            .with_context(|| format!("Failed to execute curl for {sdk_url}"))?;
+
+        if !status.success() {
+            return Err(anyhow!("Failed to download wasi-sdk from {sdk_url}",));
         }
 
-        std::io::copy(&mut response.into_body().into_reader(), &mut temp_file)
-            .context("Failed to write to temporary file")?;
-        temp_file
-            .flush()
-            .context("Failed to flush downloaded file")?;
         eprintln!("Extracting wasi-sdk to {}...", wasi_sdk_dir.display());
         self.extract_tar_gz_with_strip(&temp_tar_path, &wasi_sdk_dir)
             .context("Failed to extract wasi-sdk archive")?;

From 5263cd0706fb4ed14c976d3aa0e19f595a9684fb Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Tue, 2 Sep 2025 13:24:24 -0400
Subject: [PATCH 388/663] refactor(loader): use the tar binary to extract the
 wasi sdk

---
 Cargo.lock                  | 193 ------------------------------------
 Cargo.toml                  |   2 -
 crates/loader/Cargo.toml    |   2 -
 crates/loader/src/loader.rs |  43 ++++----
 4 files changed, 18 insertions(+), 222 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index d6f51e68..362fea2e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -11,12 +11,6 @@ dependencies = [
  "gimli",
 ]
 
-[[package]]
-name = "adler2"
-version = "2.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
-
 [[package]]
 name = "aho-corasick"
 version = "1.1.3"
@@ -109,12 +103,6 @@ version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16"
 
-[[package]]
-name = "base64"
-version = "0.22.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
-
 [[package]]
 name = "bindgen"
 version = "0.72.0"
@@ -636,22 +624,6 @@ dependencies = [
  "windows-sys 0.60.2",
 ]
 
-[[package]]
-name = "flate2"
-version = "1.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d"
-dependencies = [
- "crc32fast",
- "miniz_oxide",
-]
-
-[[package]]
-name = "fnv"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
-
 [[package]]
 name = "foldhash"
 version = "0.1.5"
@@ -784,23 +756,6 @@ dependencies = [
  "utf8-width",
 ]
 
-[[package]]
-name = "http"
-version = "1.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
-dependencies = [
- "bytes",
- "fnv",
- "itoa",
-]
-
-[[package]]
-name = "httparse"
-version = "1.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
-
 [[package]]
 name = "httpdate"
 version = "1.0.3"
@@ -1176,15 +1131,6 @@ version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
 
-[[package]]
-name = "miniz_oxide"
-version = "0.8.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
-dependencies = [
- "adler2",
-]
-
 [[package]]
 name = "mio"
 version = "1.0.4"
@@ -1538,20 +1484,6 @@ dependencies = [
  "bytemuck",
 ]
 
-[[package]]
-name = "ring"
-version = "0.17.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
-dependencies = [
- "cc",
- "cfg-if",
- "getrandom 0.2.16",
- "libc",
- "untrusted",
- "windows-sys 0.52.0",
-]
-
 [[package]]
 name = "rustc-hash"
 version = "2.1.1"
@@ -1584,50 +1516,6 @@ dependencies = [
  "windows-sys 0.60.2",
 ]
 
-[[package]]
-name = "rustls"
-version = "0.23.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc"
-dependencies = [
- "log",
- "once_cell",
- "ring",
- "rustls-pki-types",
- "rustls-webpki",
- "subtle",
- "zeroize",
-]
-
-[[package]]
-name = "rustls-pemfile"
-version = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50"
-dependencies = [
- "rustls-pki-types",
-]
-
-[[package]]
-name = "rustls-pki-types"
-version = "1.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79"
-dependencies = [
- "zeroize",
-]
-
-[[package]]
-name = "rustls-webpki"
-version = "0.103.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc"
-dependencies = [
- "ring",
- "rustls-pki-types",
- "untrusted",
-]
-
 [[package]]
 name = "ryu"
 version = "1.0.20"
@@ -1742,12 +1630,6 @@ version = "0.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
 
-[[package]]
-name = "subtle"
-version = "2.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
-
 [[package]]
 name = "syn"
 version = "2.0.106"
@@ -1770,17 +1652,6 @@ dependencies = [
  "syn",
 ]
 
-[[package]]
-name = "tar"
-version = "0.4.44"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a"
-dependencies = [
- "filetime",
- "libc",
- "xattr",
-]
-
 [[package]]
 name = "target-lexicon"
 version = "0.13.2"
@@ -2037,7 +1908,6 @@ dependencies = [
  "anyhow",
  "cc",
  "etcetera",
- "flate2",
  "fs4",
  "indoc",
  "libloading",
@@ -2047,12 +1917,10 @@ dependencies = [
  "semver",
  "serde",
  "serde_json",
- "tar",
  "tempfile",
  "tree-sitter",
  "tree-sitter-highlight",
  "tree-sitter-tags",
- "ureq",
  "url",
 ]
 
@@ -2095,42 +1963,6 @@ version = "0.2.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
 
-[[package]]
-name = "untrusted"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
-
-[[package]]
-name = "ureq"
-version = "3.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00432f493971db5d8e47a65aeb3b02f8226b9b11f1450ff86bb772776ebadd70"
-dependencies = [
- "base64",
- "flate2",
- "log",
- "percent-encoding",
- "rustls",
- "rustls-pemfile",
- "rustls-pki-types",
- "ureq-proto",
- "utf-8",
- "webpki-roots",
-]
-
-[[package]]
-name = "ureq-proto"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5b6cabebbecc4c45189ab06b52f956206cea7d8c8a20851c35a85cb169224cc"
-dependencies = [
- "base64",
- "http",
- "httparse",
- "log",
-]
-
 [[package]]
 name = "url"
 version = "2.5.7"
@@ -2143,12 +1975,6 @@ dependencies = [
  "serde",
 ]
 
-[[package]]
-name = "utf-8"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
-
 [[package]]
 name = "utf8-width"
 version = "0.1.7"
@@ -2508,15 +2334,6 @@ dependencies = [
  "web-sys",
 ]
 
-[[package]]
-name = "webpki-roots"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2"
-dependencies = [
- "rustls-pki-types",
-]
-
 [[package]]
 name = "widestring"
 version = "1.2.0"
@@ -2791,16 +2608,6 @@ version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
 
-[[package]]
-name = "xattr"
-version = "1.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909"
-dependencies = [
- "libc",
- "rustix 1.0.8",
-]
-
 [[package]]
 name = "xtask"
 version = "0.1.0"
diff --git a/Cargo.toml b/Cargo.toml
index d904bf5a..10f31590 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -122,7 +122,6 @@ ctrlc = { version = "3.4.7", features = ["termination"] }
 dialoguer = { version = "0.11.0", features = ["fuzzy-select"] }
 etcetera = "0.10.0"
 filetime = "0.2.26"
-flate2 = "1.1.2"
 fs4 = "0.12.0"
 git2 = "0.20.2"
 glob = "0.3.3"
@@ -147,7 +146,6 @@ serde_json = { version = "1.0.143", features = ["preserve_order"] }
 similar = "2.7.0"
 smallbitvec = "2.6.0"
 streaming-iterator = "0.1.9"
-tar = "0.4.40"
 tempfile = "3.21.0"
 thiserror = "2.0.16"
 tiny_http = "0.12.0"
diff --git a/crates/loader/Cargo.toml b/crates/loader/Cargo.toml
index 6e9e5760..3d2146f8 100644
--- a/crates/loader/Cargo.toml
+++ b/crates/loader/Cargo.toml
@@ -31,7 +31,6 @@ default = ["tree-sitter-highlight", "tree-sitter-tags"]
 anyhow.workspace = true
 cc.workspace = true
 etcetera.workspace = true
-flate2.workspace = true
 fs4.workspace = true
 indoc.workspace = true
 libloading.workspace = true
@@ -41,7 +40,6 @@ regex.workspace = true
 semver.workspace = true
 serde.workspace = true
 serde_json.workspace = true
-tar.workspace = true
 tempfile.workspace = true
 url.workspace = true
 
diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs
index ee5b43c6..f7247956 100644
--- a/crates/loader/src/loader.rs
+++ b/crates/loader/src/loader.rs
@@ -8,7 +8,7 @@ use std::sync::Mutex;
 use std::{
     collections::HashMap,
     env, fs,
-    io::{BufRead, BufReader, Write as _},
+    io::{BufRead, BufReader},
     marker::PhantomData,
     mem,
     path::{Path, PathBuf},
@@ -20,7 +20,6 @@ use std::{
 use anyhow::Error;
 use anyhow::{anyhow, Context, Result};
 use etcetera::BaseStrategy as _;
-use flate2::read::GzDecoder;
 use fs4::fs_std::FileExt;
 use indoc::indoc;
 use libloading::{Library, Symbol};
@@ -1073,35 +1072,29 @@ impl Loader {
         Ok(())
     }
 
-    /// Extracts a tar.gz archive, stripping the first path component.
-    ///
-    /// Similar to `tar -xzf  --strip-components=1`
+    /// Extracts a tar.gz archive with `tar`, stripping the first path component.
     fn extract_tar_gz_with_strip(
         &self,
         archive_path: &Path,
         destination: &Path,
     ) -> Result<(), Error> {
-        let archive_file = fs::File::open(archive_path).context("Failed to open archive")?;
-        let mut archive = tar::Archive::new(GzDecoder::new(archive_file));
-        for entry in archive
-            .entries()
-            .with_context(|| "Failed to read archive entries")?
-        {
-            let mut entry = entry?;
-            let path = entry.path()?;
-            let Some(first_component) = path.components().next() else {
-                continue;
-            };
-            let dest_path = destination.join(path.strip_prefix(first_component).unwrap());
-            if let Some(parent) = dest_path.parent() {
-                fs::create_dir_all(parent).with_context(|| {
-                    format!("Failed to create directory at {}", parent.display())
-                })?;
-            }
-            entry
-                .unpack(&dest_path)
-                .with_context(|| format!("Failed to extract file to {}", dest_path.display()))?;
+        let status = Command::new("tar")
+            .arg("-xzf")
+            .arg(archive_path)
+            .arg("--strip-components=1")
+            .arg("-C")
+            .arg(destination)
+            .status()
+            .with_context(|| format!("Failed to execute tar for {}", archive_path.display()))?;
+
+        if !status.success() {
+            return Err(anyhow!(
+                "Failed to extract archive {} to {}",
+                archive_path.display(),
+                destination.display()
+            ));
         }
+
         Ok(())
     }
 

From 5cd6e747a062861b5c349664a4d1a7f3bd521628 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Tue, 2 Sep 2025 14:28:32 -0400
Subject: [PATCH 389/663] refactor(xtask): use the git binary to perform git
 operations

---
 Cargo.lock                           | 157 ++++++---------------------
 Cargo.toml                           |   1 -
 crates/xtask/Cargo.toml              |   1 -
 crates/xtask/src/bump.rs             | 154 ++++++++++++++++----------
 crates/xtask/src/main.rs             |  46 ++++----
 crates/xtask/src/upgrade_wasmtime.rs |   3 -
 6 files changed, 155 insertions(+), 207 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 362fea2e..3022419c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -105,11 +105,11 @@ checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16"
 
 [[package]]
 name = "bindgen"
-version = "0.72.0"
+version = "0.72.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f72209734318d0b619a5e0f5129918b848c416e122a3c4ce054e03cb87b726f"
+checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895"
 dependencies = [
- "bitflags 2.9.3",
+ "bitflags 2.9.4",
  "cexpr",
  "clang-sys",
  "itertools 0.13.0",
@@ -131,9 +131,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
 [[package]]
 name = "bitflags"
-version = "2.9.3"
+version = "2.9.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34efbcccd345379ca2868b2b2c9d3782e9cc58ba87bc7d79d5b53d9c9ae6f25d"
+checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394"
 
 [[package]]
 name = "bstr"
@@ -169,12 +169,11 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
 
 [[package]]
 name = "cc"
-version = "1.2.34"
+version = "1.2.35"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42bc4aea80032b7bf409b0bc7ccad88853858911b7713a8062fdc0623867bedc"
+checksum = "590f9024a68a8c40351881787f1934dc11afd69090f5edb6831464694d836ea3"
 dependencies = [
- "jobserver",
- "libc",
+ "find-msvc-tools",
  "shlex",
 ]
 
@@ -224,9 +223,9 @@ dependencies = [
 
 [[package]]
 name = "clap"
-version = "4.5.46"
+version = "4.5.47"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c5e4fcf9c21d2e544ca1ee9d8552de13019a42aa7dbf32747fa7aaf1df76e57"
+checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931"
 dependencies = [
  "clap_builder",
  "clap_derive",
@@ -234,9 +233,9 @@ dependencies = [
 
 [[package]]
 name = "clap_builder"
-version = "4.5.46"
+version = "4.5.47"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fecb53a0e6fcfb055f686001bc2e2592fa527efaf38dbe81a6a9563562e57d41"
+checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6"
 dependencies = [
  "anstream",
  "anstyle",
@@ -265,9 +264,9 @@ dependencies = [
 
 [[package]]
 name = "clap_derive"
-version = "4.5.45"
+version = "4.5.47"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6"
+checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c"
 dependencies = [
  "heck",
  "proc-macro2",
@@ -624,6 +623,12 @@ dependencies = [
  "windows-sys 0.60.2",
 ]
 
+[[package]]
+name = "find-msvc-tools"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e178e4fba8a2726903f6ba98a6d221e76f9c12c650d5dc0e6afdc50677b49650"
+
 [[package]]
 name = "foldhash"
 version = "0.1.5"
@@ -701,21 +706,6 @@ dependencies = [
  "stable_deref_trait",
 ]
 
-[[package]]
-name = "git2"
-version = "0.20.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110"
-dependencies = [
- "bitflags 2.9.3",
- "libc",
- "libgit2-sys",
- "log",
- "openssl-probe",
- "openssl-sys",
- "url",
-]
-
 [[package]]
 name = "glob"
 version = "0.3.3"
@@ -892,7 +882,7 @@ version = "0.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3"
 dependencies = [
- "bitflags 2.9.3",
+ "bitflags 2.9.4",
  "inotify-sys",
  "libc",
 ]
@@ -958,16 +948,6 @@ version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
 
-[[package]]
-name = "jobserver"
-version = "0.1.34"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"
-dependencies = [
- "getrandom 0.3.3",
- "libc",
-]
-
 [[package]]
 name = "js-sys"
 version = "0.3.77"
@@ -1010,20 +990,6 @@ version = "0.2.175"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543"
 
-[[package]]
-name = "libgit2-sys"
-version = "0.18.2+1.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c42fe03df2bd3c53a3a9c7317ad91d80c81cd1fb0caec8d7cc4cd2bfa10c222"
-dependencies = [
- "cc",
- "libc",
- "libssh2-sys",
- "libz-sys",
- "openssl-sys",
- "pkg-config",
-]
-
 [[package]]
 name = "libloading"
 version = "0.8.8"
@@ -1046,37 +1012,11 @@ version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3"
 dependencies = [
- "bitflags 2.9.3",
+ "bitflags 2.9.4",
  "libc",
  "redox_syscall",
 ]
 
-[[package]]
-name = "libssh2-sys"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "220e4f05ad4a218192533b300327f5150e809b54c4ec83b5a1d91833601811b9"
-dependencies = [
- "cc",
- "libc",
- "libz-sys",
- "openssl-sys",
- "pkg-config",
- "vcpkg",
-]
-
-[[package]]
-name = "libz-sys"
-version = "1.1.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d"
-dependencies = [
- "cc",
- "libc",
- "pkg-config",
- "vcpkg",
-]
-
 [[package]]
 name = "linux-raw-sys"
 version = "0.4.15"
@@ -1118,11 +1058,11 @@ checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
 
 [[package]]
 name = "memfd"
-version = "0.6.4"
+version = "0.6.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64"
+checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227"
 dependencies = [
- "rustix 0.38.44",
+ "rustix 1.0.8",
 ]
 
 [[package]]
@@ -1155,7 +1095,7 @@ version = "0.30.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6"
 dependencies = [
- "bitflags 2.9.3",
+ "bitflags 2.9.4",
  "cfg-if",
  "cfg_aliases",
  "libc",
@@ -1177,7 +1117,7 @@ version = "8.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3"
 dependencies = [
- "bitflags 2.9.3",
+ "bitflags 2.9.4",
  "fsevent-sys",
  "inotify",
  "kqueue",
@@ -1229,7 +1169,7 @@ version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c"
 dependencies = [
- "bitflags 2.9.3",
+ "bitflags 2.9.4",
  "objc2",
 ]
 
@@ -1257,24 +1197,6 @@ version = "1.70.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad"
 
-[[package]]
-name = "openssl-probe"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
-
-[[package]]
-name = "openssl-sys"
-version = "0.9.109"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571"
-dependencies = [
- "cc",
- "libc",
- "pkg-config",
- "vcpkg",
-]
-
 [[package]]
 name = "path-slash"
 version = "0.2.1"
@@ -1293,12 +1215,6 @@ version = "0.2.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
 
-[[package]]
-name = "pkg-config"
-version = "0.3.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
-
 [[package]]
 name = "postcard"
 version = "1.1.3"
@@ -1429,7 +1345,7 @@ version = "0.5.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77"
 dependencies = [
- "bitflags 2.9.3",
+ "bitflags 2.9.4",
 ]
 
 [[package]]
@@ -1496,7 +1412,7 @@ version = "0.38.44"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
 dependencies = [
- "bitflags 2.9.3",
+ "bitflags 2.9.4",
  "errno",
  "libc",
  "linux-raw-sys 0.4.15",
@@ -1509,7 +1425,7 @@ version = "1.0.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8"
 dependencies = [
- "bitflags 2.9.3",
+ "bitflags 2.9.4",
  "errno",
  "libc",
  "linux-raw-sys 0.9.4",
@@ -1993,12 +1909,6 @@ version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
 
-[[package]]
-name = "vcpkg"
-version = "0.2.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
-
 [[package]]
 name = "walkdir"
 version = "2.5.0"
@@ -2097,7 +2007,7 @@ version = "0.229.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0cc3b1f053f5d41aa55640a1fa9b6d1b8a9e4418d118ce308d20e24ff3575a8c"
 dependencies = [
- "bitflags 2.9.3",
+ "bitflags 2.9.4",
  "hashbrown",
  "indexmap",
  "semver",
@@ -2123,7 +2033,7 @@ checksum = "57373e1d8699662fb791270ac5dfac9da5c14f618ecf940cdb29dc3ad9472a3c"
 dependencies = [
  "addr2line",
  "anyhow",
- "bitflags 2.9.3",
+ "bitflags 2.9.4",
  "bumpalo",
  "cc",
  "cfg-if",
@@ -2617,7 +2527,6 @@ dependencies = [
  "bindgen",
  "cc",
  "clap",
- "git2",
  "indoc",
  "notify",
  "notify-debouncer-full",
diff --git a/Cargo.toml b/Cargo.toml
index 10f31590..99827f09 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -123,7 +123,6 @@ dialoguer = { version = "0.11.0", features = ["fuzzy-select"] }
 etcetera = "0.10.0"
 filetime = "0.2.26"
 fs4 = "0.12.0"
-git2 = "0.20.2"
 glob = "0.3.3"
 heck = "0.5.0"
 html-escape = "0.2.13"
diff --git a/crates/xtask/Cargo.toml b/crates/xtask/Cargo.toml
index 176a318d..b5d1bf6a 100644
--- a/crates/xtask/Cargo.toml
+++ b/crates/xtask/Cargo.toml
@@ -20,7 +20,6 @@ anyhow.workspace = true
 bindgen = { version = "0.72.0" }
 cc.workspace = true
 clap.workspace = true
-git2.workspace = true
 indoc.workspace = true
 regex.workspace = true
 semver.workspace = true
diff --git a/crates/xtask/src/bump.rs b/crates/xtask/src/bump.rs
index 3efffaa1..0adfd1b6 100644
--- a/crates/xtask/src/bump.rs
+++ b/crates/xtask/src/bump.rs
@@ -1,18 +1,25 @@
-use std::cmp::Ordering;
+use std::{cmp::Ordering, path::Path};
 
-use anyhow::{anyhow, Result};
-use git2::{DiffOptions, Repository};
+use anyhow::{anyhow, Context, Result};
 use indoc::indoc;
 use semver::{BuildMetadata, Prerelease, Version};
 
 use crate::{create_commit, BumpVersion};
 
-pub fn get_latest_tag(repo: &Repository) -> Result {
-    let mut tags = repo
-        .tag_names(None)?
-        .into_iter()
-        .filter_map(|tag| tag.map(String::from))
-        .filter_map(|tag| Version::parse(tag.strip_prefix('v').unwrap_or(&tag)).ok())
+pub fn get_latest_tag() -> Result {
+    let output = std::process::Command::new("git")
+        .args(["tag", "-l"])
+        .output()?;
+    if !output.status.success() {
+        anyhow::bail!(
+            "Failed to list tags: {}",
+            String::from_utf8_lossy(&output.stderr)
+        );
+    }
+
+    let mut tags = String::from_utf8(output.stdout)?
+        .lines()
+        .filter_map(|tag| Version::parse(tag.strip_prefix('v').unwrap_or(tag)).ok())
         .collect::>();
 
     tags.sort_by(
@@ -29,10 +36,19 @@ pub fn get_latest_tag(repo: &Repository) -> Result {
 }
 
 pub fn run(args: BumpVersion) -> Result<()> {
-    let repo = Repository::open(".")?;
-    let latest_tag = get_latest_tag(&repo)?;
+    let latest_tag = get_latest_tag()?;
     let current_version = Version::parse(&latest_tag)?;
-    let latest_tag_sha = repo.revparse_single(&format!("v{latest_tag}"))?.id();
+
+    let output = std::process::Command::new("git")
+        .args(["rev-parse", &format!("v{latest_tag}")])
+        .output()?;
+    if !output.status.success() {
+        anyhow::bail!(
+            "Failed to get tag SHA: {}",
+            String::from_utf8_lossy(&output.stderr)
+        );
+    }
+    let latest_tag_sha = String::from_utf8(output.stdout)?.trim().to_string();
 
     let workspace_toml_version = Version::parse(&fetch_workspace_version()?)?;
 
@@ -49,43 +65,57 @@ pub fn run(args: BumpVersion) -> Result<()> {
         return Ok(());
     }
 
-    let mut revwalk = repo.revwalk()?;
-    revwalk.push_range(format!("{latest_tag_sha}..HEAD").as_str())?;
-    let mut diff_options = DiffOptions::new();
+    let output = std::process::Command::new("git")
+        .args(["rev-list", &format!("{latest_tag_sha}..HEAD")])
+        .output()?;
+    if !output.status.success() {
+        anyhow::bail!(
+            "Failed to get commits: {}",
+            String::from_utf8_lossy(&output.stderr)
+        );
+    }
+    let commits = String::from_utf8(output.stdout)?
+        .lines()
+        .map(|s| s.to_string())
+        .collect::>();
 
     let mut should_increment_patch = false;
     let mut should_increment_minor = false;
 
-    for oid in revwalk {
-        let oid = oid?;
-        let commit = repo.find_commit(oid)?;
-        let message = commit.message().unwrap();
-        let message = message.trim();
+    for commit_sha in commits {
+        let output = std::process::Command::new("git")
+            .args(["log", "-1", "--format=%s", &commit_sha])
+            .output()?;
+        if !output.status.success() {
+            continue;
+        }
+        let message = String::from_utf8(output.stdout)?.trim().to_string();
 
-        let diff = {
-            let parent = commit.parent(0).unwrap();
-            let parent_tree = parent.tree().unwrap();
-            let commit_tree = commit.tree().unwrap();
-            repo.diff_tree_to_tree(
-                Some(&parent_tree),
-                Some(&commit_tree),
-                Some(&mut diff_options),
-            )?
-        };
+        let output = std::process::Command::new("git")
+            .args([
+                "diff-tree",
+                "--no-commit-id",
+                "--name-only",
+                "-r",
+                &commit_sha,
+            ])
+            .output()?;
+        if !output.status.success() {
+            continue;
+        }
 
         let mut source_code_changed = false;
-        diff.foreach(
-            &mut |delta, _| {
-                let path = delta.new_file().path().unwrap().to_str().unwrap();
-                if path.ends_with("rs") || path.ends_with("js") || path.ends_with('c') {
-                    source_code_changed = true;
-                }
-                true
-            },
-            None,
-            None,
-            None,
-        )?;
+        for path in String::from_utf8(output.stdout)?.lines() {
+            let path = Path::new(path);
+            if path.extension().is_some_and(|ext| {
+                ext.eq_ignore_ascii_case("rs")
+                    || ext.eq_ignore_ascii_case("js")
+                    || ext.eq_ignore_ascii_case("c")
+            }) {
+                source_code_changed = true;
+                break;
+            }
+        }
 
         if source_code_changed {
             should_increment_patch = true;
@@ -138,16 +168,13 @@ pub fn run(args: BumpVersion) -> Result<()> {
     update_cmake(&next_version)?;
     update_npm(&next_version)?;
     update_zig(&next_version)?;
-    tag_next_version(&repo, &next_version)?;
+    tag_next_version(&next_version)?;
 
     Ok(())
 }
 
-fn tag_next_version(repo: &Repository, next_version: &Version) -> Result<()> {
-    let signature = repo.signature()?;
-
-    let commit_id = create_commit(
-        repo,
+fn tag_next_version(next_version: &Version) -> Result<()> {
+    let commit_sha = create_commit(
         &format!("{next_version}"),
         &[
             "Cargo.lock",
@@ -166,15 +193,25 @@ fn tag_next_version(repo: &Repository, next_version: &Version) -> Result<()> {
         ],
     )?;
 
-    let tag = repo.tag(
-        &format!("v{next_version}"),
-        &repo.find_object(commit_id, None)?,
-        &signature,
-        &format!("v{next_version}"),
-        false,
-    )?;
+    // Create tag
+    let output = std::process::Command::new("git")
+        .args([
+            "tag",
+            "-a",
+            &format!("v{next_version}"),
+            "-m",
+            &format!("v{next_version}"),
+            &commit_sha,
+        ])
+        .output()?;
+    if !output.status.success() {
+        anyhow::bail!(
+            "Failed to create tag: {}",
+            String::from_utf8_lossy(&output.stderr)
+        );
+    }
 
-    println!("Tagged commit {commit_id} with tag {tag}");
+    println!("Tagged commit {commit_sha} with tag v{next_version}");
 
     Ok(())
 }
@@ -256,8 +293,9 @@ fn update_npm(next_version: &Version) -> Result<()> {
         "lib/binding_web/package.json",
         "crates/cli/npm/package.json",
     ] {
-        let package_json =
-            serde_json::from_str::(&std::fs::read_to_string(path)?)?;
+        let package_json = serde_json::from_str::(
+            &std::fs::read_to_string(path).with_context(|| format!("Failed to read {path}"))?,
+        )?;
 
         let mut package_json = package_json
             .as_object()
diff --git a/crates/xtask/src/main.rs b/crates/xtask/src/main.rs
index 1c59f4f4..57f81dae 100644
--- a/crates/xtask/src/main.rs
+++ b/crates/xtask/src/main.rs
@@ -9,12 +9,11 @@ mod generate;
 mod test;
 mod upgrade_wasmtime;
 
-use std::path::Path;
+use std::{path::Path, process::Command};
 
 use anstyle::{AnsiColor, Color, Style};
 use anyhow::Result;
-use clap::{crate_authors, Args, Command, FromArgMatches as _, Subcommand};
-use git2::{Oid, Repository};
+use clap::{crate_authors, Args, FromArgMatches as _, Subcommand};
 use semver::Version;
 
 #[derive(Subcommand)]
@@ -205,7 +204,7 @@ fn run() -> Result<()> {
     );
     let version: &'static str = Box::leak(version.into_boxed_str());
 
-    let cli = Command::new("xtask")
+    let cli = clap::Command::new("xtask")
         .help_template(
             "\
 {before-help}{name} {version}
@@ -296,27 +295,34 @@ const fn get_styles() -> clap::builder::Styles {
         .placeholder(Style::new().fg_color(Some(Color::Ansi(AnsiColor::White))))
 }
 
-pub fn create_commit(repo: &Repository, msg: &str, paths: &[&str]) -> Result {
-    let mut index = repo.index()?;
+pub fn create_commit(msg: &str, paths: &[&str]) -> Result {
     for path in paths {
-        index.add_path(Path::new(path))?;
+        let output = Command::new("git").args(["add", path]).output()?;
+        if !output.status.success() {
+            anyhow::bail!(
+                "Failed to add {path}: {}",
+                String::from_utf8_lossy(&output.stderr)
+            );
+        }
     }
 
-    index.write()?;
+    let output = Command::new("git").args(["commit", "-m", msg]).output()?;
+    if !output.status.success() {
+        anyhow::bail!(
+            "Failed to commit: {}",
+            String::from_utf8_lossy(&output.stderr)
+        );
+    }
 
-    let tree_id = index.write_tree()?;
-    let tree = repo.find_tree(tree_id)?;
-    let signature = repo.signature()?;
-    let parent_commit = repo.revparse_single("HEAD")?.peel_to_commit()?;
+    let output = Command::new("git").args(["rev-parse", "HEAD"]).output()?;
+    if !output.status.success() {
+        anyhow::bail!(
+            "Failed to get commit SHA: {}",
+            String::from_utf8_lossy(&output.stderr)
+        );
+    }
 
-    Ok(repo.commit(
-        Some("HEAD"),
-        &signature,
-        &signature,
-        msg,
-        &tree,
-        &[&parent_commit],
-    )?)
+    Ok(String::from_utf8(output.stdout)?.trim().to_string())
 }
 
 #[macro_export]
diff --git a/crates/xtask/src/upgrade_wasmtime.rs b/crates/xtask/src/upgrade_wasmtime.rs
index f4c39ddf..90e5b0f2 100644
--- a/crates/xtask/src/upgrade_wasmtime.rs
+++ b/crates/xtask/src/upgrade_wasmtime.rs
@@ -1,7 +1,6 @@
 use std::process::Command;
 
 use anyhow::{Context, Result};
-use git2::Repository;
 use semver::Version;
 
 use crate::{create_commit, UpgradeWasmtime};
@@ -93,9 +92,7 @@ pub fn run(args: &UpgradeWasmtime) -> Result<()> {
     println!("Upgrading wasmtime for Zig");
     update_zig(&args.version)?;
 
-    let repo = Repository::open(".")?;
     create_commit(
-        &repo,
         &format!("build(deps): bump wasmtime-c-api to v{}", args.version),
         &["lib/Cargo.toml", "Cargo.lock", "build.zig.zon"],
     )?;

From 4559ec51f72cf1a2d56a72660cdb1cd5a2b3f822 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Tue, 2 Sep 2025 03:28:24 -0400
Subject: [PATCH 390/663] fix(loader): correct logic when downloading wasi-sdk

---
 crates/loader/src/loader.rs | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs
index f7247956..08c7d6fe 100644
--- a/crates/loader/src/loader.rs
+++ b/crates/loader/src/loader.rs
@@ -1193,17 +1193,15 @@ impl Loader {
         fs::remove_file(temp_tar_path).ok();
         for exe in &possible_executables {
             let clang_exe = wasi_sdk_dir.join("bin").join(exe);
-            if !clang_exe.exists() {
-                return Err(anyhow!(
-                "Failed to extract wasi-sdk correctly. Clang executable not found at expected location: {}",
-                clang_exe.display()
-            ));
+            if clang_exe.exists() {
+                return Ok(clang_exe);
             }
         }
 
         Err(anyhow!(
-            "Failed to find clang executable in downloaded wasi-sdk at '{}'",
-            wasi_sdk_dir.display()
+            "Failed to find clang executable in downloaded wasi-sdk at '{}'. Looked for: {}",
+            wasi_sdk_dir.display(),
+            possible_executables.join(", ")
         ))
     }
 

From 151130a5dfa62d34bcac8151c346ba215e21a70e Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Tue, 2 Sep 2025 03:26:20 -0400
Subject: [PATCH 391/663] ci: pass in matrix target to xtask commands

---
 .github/workflows/build.yml | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3381196a..bac06596 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -259,7 +259,7 @@ jobs:
       shell: bash
       run: |
         cd lib
-        $BUILD_CMD check --no-default-features
+        $BUILD_CMD check --no-default-features --target=${{ matrix.target }}
 
     - name: Build target
       run: $BUILD_CMD build --release --target=${{ matrix.target }} --features=${{ matrix.features }}
@@ -271,15 +271,15 @@ jobs:
 
     - name: Fetch fixtures
       if: ${{ !matrix.no-run && inputs.run-test }}
-      run: $BUILD_CMD run -p xtask -- fetch-fixtures
+      run: $BUILD_CMD run -p xtask --target=${{ matrix.target }} -- fetch-fixtures
 
     - name: Generate fixtures
       if: ${{ !matrix.no-run && inputs.run-test && steps.cache.outputs.cache-hit != 'true' }}
-      run: $BUILD_CMD run -p xtask -- generate-fixtures
+      run: $BUILD_CMD run -p xtask --target=${{ matrix.target }} -- generate-fixtures
 
     - name: Generate Wasm fixtures
       if: ${{ !matrix.no-run && !matrix.use-cross && inputs.run-test && steps.cache.outputs.cache-hit != 'true' }}
-      run: $BUILD_CMD run -p xtask -- generate-fixtures --wasm
+      run: $BUILD_CMD run -p xtask --target=${{ matrix.target }} -- generate-fixtures --wasm
 
     - name: Run main tests
       if: ${{ !matrix.no-run && inputs.run-test }}
@@ -293,7 +293,7 @@ jobs:
 
     - name: Run wasm tests
       if: ${{ !matrix.no-run && !matrix.use-cross && inputs.run-test }}
-      run: $BUILD_CMD run -p xtask -- test-wasm
+      run: $BUILD_CMD run -p xtask --target=${{ matrix.target }} -- test-wasm
 
     - name: Upload CLI artifact
       uses: actions/upload-artifact@v4

From 0b836b2de07414bc3b215c023ea88211178b143b Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Tue, 2 Sep 2025 04:10:39 -0400
Subject: [PATCH 392/663] ci: use armv7hf

---
 .github/workflows/build.yml | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index bac06596..6699a4d4 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -36,20 +36,20 @@ jobs:
           # When adding a new `target`:
           # 1. Define a new platform alias above
           # 2. Add a new record to the matrix map in `cli/npm/install.js`
-          - { platform: linux-arm64       , target: aarch64-unknown-linux-gnu   , os: ubuntu-latest    , use-cross: true }
-          - { platform: linux-arm         , target: arm-unknown-linux-gnueabi   , os: ubuntu-latest    , use-cross: true }
-          - { platform: linux-x64         , target: x86_64-unknown-linux-gnu    , os: ubuntu-22.04     , features: wasm  }
-          - { platform: linux-x86         , target: i686-unknown-linux-gnu      , os: ubuntu-latest    , use-cross: true }
-          - { platform: linux-powerpc64   , target: powerpc64-unknown-linux-gnu , os: ubuntu-latest    , use-cross: true }
-          - { platform: windows-arm64     , target: aarch64-pc-windows-msvc     , os: windows-latest                     }
-          - { platform: windows-x64       , target: x86_64-pc-windows-msvc      , os: windows-latest   , features: wasm  }
-          - { platform: windows-x86       , target: i686-pc-windows-msvc        , os: windows-latest                     }
-          - { platform: macos-arm64       , target: aarch64-apple-darwin        , os: macos-latest     , features: wasm  }
-          - { platform: macos-x64         , target: x86_64-apple-darwin         , os: macos-13         , features: wasm  }
+          - { platform: linux-arm64       , target: aarch64-unknown-linux-gnu     , os: ubuntu-latest    , use-cross: true }
+          - { platform: linux-arm         , target: armv7-unknown-linux-gnueabihf , os: ubuntu-latest    , use-cross: true }
+          - { platform: linux-x64         , target: x86_64-unknown-linux-gnu      , os: ubuntu-22.04     , features: wasm  }
+          - { platform: linux-x86         , target: i686-unknown-linux-gnu        , os: ubuntu-latest    , use-cross: true }
+          - { platform: linux-powerpc64   , target: powerpc64-unknown-linux-gnu   , os: ubuntu-latest    , use-cross: true }
+          - { platform: windows-arm64     , target: aarch64-pc-windows-msvc       , os: windows-latest                     }
+          - { platform: windows-x64       , target: x86_64-pc-windows-msvc        , os: windows-latest   , features: wasm  }
+          - { platform: windows-x86       , target: i686-pc-windows-msvc          , os: windows-latest                     }
+          - { platform: macos-arm64       , target: aarch64-apple-darwin          , os: macos-latest     , features: wasm  }
+          - { platform: macos-x64         , target: x86_64-apple-darwin           , os: macos-13         , features: wasm  }
 
           # Cross compilers for C library
           - { platform: linux-arm64       , cc: aarch64-linux-gnu-gcc           , ar: aarch64-linux-gnu-ar   }
-          - { platform: linux-arm         , cc: arm-linux-gnueabi-gcc           , ar: arm-linux-gnueabi-ar   }
+          - { platform: linux-arm         , cc: arm-linux-gnueabihf-gcc         , ar: arm-linux-gnueabihf-ar }
           - { platform: linux-x86         , cc: i686-linux-gnu-gcc              , ar: i686-linux-gnu-ar      }
           - { platform: linux-powerpc64   , cc: powerpc64-linux-gnu-gcc         , ar: powerpc64-linux-gnu-ar }
 

From f44cbd407f9b70e67dc5cf35bd2296566155c96d Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Wed, 3 Sep 2025 01:53:09 -0400
Subject: [PATCH 393/663] perf(xtask); check out the tag directly for fixtures

---
 crates/xtask/src/fetch.rs | 74 +++++++++++++++++++--------------------
 1 file changed, 37 insertions(+), 37 deletions(-)

diff --git a/crates/xtask/src/fetch.rs b/crates/xtask/src/fetch.rs
index 5023691e..b37b510a 100644
--- a/crates/xtask/src/fetch.rs
+++ b/crates/xtask/src/fetch.rs
@@ -1,9 +1,6 @@
 use crate::{bail_on_err, root_dir, FetchFixtures, EMSCRIPTEN_VERSION};
 use anyhow::Result;
-use std::{
-    fs,
-    process::{Command, Stdio},
-};
+use std::{fs, process::Command};
 
 pub fn run_fixtures(args: &FetchFixtures) -> Result<()> {
     let fixtures_dir = root_dir().join("test").join("fixtures");
@@ -26,6 +23,8 @@ pub fn run_fixtures(args: &FetchFixtures) -> Result<()> {
                 "clone",
                 "--depth",
                 "1",
+                "--branch",
+                tag,
                 &grammar_url,
                 &grammar_dir.to_string_lossy(),
             ]);
@@ -33,44 +32,45 @@ pub fn run_fixtures(args: &FetchFixtures) -> Result<()> {
                 &command.spawn()?.wait_with_output()?,
                 &format!("Failed to clone the {grammar} grammar"),
             )?;
-        }
+        } else {
+            let mut describe_command = Command::new("git");
+            describe_command.current_dir(&grammar_dir).args([
+                "describe",
+                "--tags",
+                "--exact-match",
+                "HEAD",
+            ]);
 
-        std::env::set_current_dir(&grammar_dir)?;
+            let output = describe_command.output()?;
+            let current_tag = String::from_utf8_lossy(&output.stdout);
+            let current_tag = current_tag.trim();
 
-        let mut command = Command::new("git");
-        command.args(["fetch", "origin", "--tags"]);
-        bail_on_err(
-            &command.spawn()?.wait_with_output()?,
-            &format!("Failed to fetch the {grammar} grammar's tags"),
-        )?;
+            if current_tag != tag {
+                println!("Updating {grammar} grammar from {current_tag} to {tag}...");
 
-        if args.update {
-            let mut command = Command::new("git");
-            command
-                .args(["tag", "--sort=-creatordate"])
-                .stdout(Stdio::piped());
-            let update_out = command.spawn()?.wait_with_output()?;
-            bail_on_err(
-                &update_out,
-                &format!("Failed to parse the {grammar} grammar's latest commit"),
-            )?;
-            let new_tag = String::from_utf8(update_out.stdout)?
-                .lines()
-                .next()
-                .expect("No tags found")
-                .trim()
-                .to_string();
-            if !new_tag.eq(tag) {
-                println!("Updating the {grammar} grammar from {tag} to {new_tag}...");
-                *tag = new_tag;
+                let mut fetch_command = Command::new("git");
+                fetch_command.current_dir(&grammar_dir).args([
+                    "fetch",
+                    "origin",
+                    &format!("refs/tags/{tag}:refs/tags/{tag}"),
+                ]);
+                bail_on_err(
+                    &fetch_command.spawn()?.wait_with_output()?,
+                    &format!("Failed to fetch tag {tag} for {grammar} grammar"),
+                )?;
+
+                let mut checkout_command = Command::new("git");
+                checkout_command
+                    .current_dir(&grammar_dir)
+                    .args(["checkout", tag]);
+                bail_on_err(
+                    &checkout_command.spawn()?.wait_with_output()?,
+                    &format!("Failed to checkout tag {tag} for {grammar} grammar"),
+                )?;
+            } else {
+                println!("{grammar} grammar is already at tag {tag}");
             }
         }
-        let mut command = Command::new("git");
-        command.args(["reset", "--hard", tag]);
-        bail_on_err(
-            &command.spawn()?.wait_with_output()?,
-            &format!("Failed to reset the {grammar} grammar"),
-        )?;
     }
 
     if args.update {

From 6cb9486b28042570545f418eb80ee457268af92e Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Wed, 3 Sep 2025 02:45:16 -0400
Subject: [PATCH 394/663] test(fixtures): bump javascript grammar to 0.25.0

---
 test/fixtures/fixtures.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/test/fixtures/fixtures.json b/test/fixtures/fixtures.json
index 7f4a385d..c1e2b167 100644
--- a/test/fixtures/fixtures.json
+++ b/test/fixtures/fixtures.json
@@ -6,7 +6,7 @@
   ["go","v0.25.0"],
   ["html","v0.23.2"],
   ["java","v0.23.5"],
-  ["javascript","v0.23.1"],
+  ["javascript","v0.25.0"],
   ["jsdoc","v0.23.2"],
   ["json","v0.24.8"],
   ["php","v0.24.2"],

From 3b0273fc6132b0ecb061fda4058a80e26f52985f Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Wed, 3 Sep 2025 02:46:11 -0400
Subject: [PATCH 395/663] build: bump emscripten to 4.0.12

---
 crates/loader/emscripten-version         | 2 +-
 crates/xtask/src/build_wasm.rs           | 3 ++-
 lib/binding_web/lib/web-tree-sitter.d.ts | 1 +
 3 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/crates/loader/emscripten-version b/crates/loader/emscripten-version
index a2cec7af..4c05e4ef 100644
--- a/crates/loader/emscripten-version
+++ b/crates/loader/emscripten-version
@@ -1 +1 @@
-4.0.8
+4.0.12
diff --git a/crates/xtask/src/build_wasm.rs b/crates/xtask/src/build_wasm.rs
index 4ad35e4b..d42eae6f 100644
--- a/crates/xtask/src/build_wasm.rs
+++ b/crates/xtask/src/build_wasm.rs
@@ -27,7 +27,7 @@ enum EmccSource {
     Podman,
 }
 
-const EXPORTED_RUNTIME_METHODS: [&str; 19] = [
+const EXPORTED_RUNTIME_METHODS: [&str; 20] = [
     "AsciiToString",
     "stringToUTF8",
     "UTF8ToString",
@@ -47,6 +47,7 @@ const EXPORTED_RUNTIME_METHODS: [&str; 19] = [
     "HEAPU32",
     "HEAP64",
     "HEAPU64",
+    "LE_HEAP_STORE_I64",
 ];
 
 pub fn run_wasm(args: &BuildWasm) -> Result<()> {
diff --git a/lib/binding_web/lib/web-tree-sitter.d.ts b/lib/binding_web/lib/web-tree-sitter.d.ts
index 1e592e6d..852f0041 100644
--- a/lib/binding_web/lib/web-tree-sitter.d.ts
+++ b/lib/binding_web/lib/web-tree-sitter.d.ts
@@ -46,6 +46,7 @@ declare namespace RuntimeExports {
     let HEAPU32: Uint32Array;
     let HEAP64: BigInt64Array;
     let HEAPU64: BigUint64Array;
+    function LE_HEAP_STORE_I64(byteOffset: any, value: any): any;
 }
 interface WasmModule {
   _malloc(_0: number): number;

From f95a52df4aa885a7e1901e2d5c6d0b5e6be01866 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Wed, 3 Sep 2025 12:33:47 -0400
Subject: [PATCH 396/663] fix(xtask): reset fixtures when checking out new
 version

---
 crates/xtask/src/fetch.rs | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/crates/xtask/src/fetch.rs b/crates/xtask/src/fetch.rs
index b37b510a..6fa431c6 100644
--- a/crates/xtask/src/fetch.rs
+++ b/crates/xtask/src/fetch.rs
@@ -59,6 +59,15 @@ pub fn run_fixtures(args: &FetchFixtures) -> Result<()> {
                     &format!("Failed to fetch tag {tag} for {grammar} grammar"),
                 )?;
 
+                let mut reset_command = Command::new("git");
+                reset_command
+                    .current_dir(&grammar_dir)
+                    .args(["reset", "--hard", "HEAD"]);
+                bail_on_err(
+                    &reset_command.spawn()?.wait_with_output()?,
+                    &format!("Failed to reset {grammar} grammar working tree"),
+                )?;
+
                 let mut checkout_command = Command::new("git");
                 checkout_command
                     .current_dir(&grammar_dir)

From cc5463ad44ac39e99b7dcaa214b4e47a5eb35230 Mon Sep 17 00:00:00 2001
From: Will Lillis 
Date: Tue, 2 Sep 2025 22:01:01 -0400
Subject: [PATCH 397/663] fix(test): improve readability of corpus error
 message mismatch

---
 crates/cli/src/tests/corpus_test.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/crates/cli/src/tests/corpus_test.rs b/crates/cli/src/tests/corpus_test.rs
index 9e557945..6d272f51 100644
--- a/crates/cli/src/tests/corpus_test.rs
+++ b/crates/cli/src/tests/corpus_test.rs
@@ -381,7 +381,7 @@ fn test_feature_corpus_files() {
                 let actual_message = e.to_string().replace("\r\n", "\n");
                 if expected_message != actual_message {
                     eprintln!(
-                        "Unexpected error message.\n\nExpected:\n\n{expected_message}\nActual:\n\n{actual_message}\n",
+                        "Unexpected error message.\n\nExpected:\n\n`{expected_message}`\nActual:\n\n`{actual_message}`\n",
                     );
                     failure_count += 1;
                 }

From 310c0b86a7149089fe6861a89fbf5cf65ea3ada3 Mon Sep 17 00:00:00 2001
From: Will Lillis 
Date: Tue, 2 Sep 2025 22:02:31 -0400
Subject: [PATCH 398/663] fix(generate): return error when single state
 transitions have indirectly recursive cycles.

This can cause infinite loops in the parser near EOF.

Co-authored-by: Amaan Qureshi 
---
 crates/generate/src/prepare_grammar.rs        | 98 ++++++++++++++++++-
 .../expected_error.txt                        |  1 +
 .../grammar.js                                | 16 +++
 3 files changed, 114 insertions(+), 1 deletion(-)
 create mode 100644 test/fixtures/test_grammars/indirect_recursion_in_transitions/expected_error.txt
 create mode 100644 test/fixtures/test_grammars/indirect_recursion_in_transitions/grammar.js

diff --git a/crates/generate/src/prepare_grammar.rs b/crates/generate/src/prepare_grammar.rs
index 2fe7f8a5..8c35c741 100644
--- a/crates/generate/src/prepare_grammar.rs
+++ b/crates/generate/src/prepare_grammar.rs
@@ -8,7 +8,7 @@ mod process_inlines;
 
 use std::{
     cmp::Ordering,
-    collections::{hash_map, HashMap, HashSet},
+    collections::{hash_map, BTreeSet, HashMap, HashSet},
     mem,
 };
 
@@ -16,6 +16,7 @@ use anyhow::Result;
 pub use expand_tokens::ExpandTokensError;
 pub use extract_tokens::ExtractTokensError;
 pub use flatten_grammar::FlattenGrammarError;
+use indexmap::IndexMap;
 pub use intern_symbols::InternSymbolsError;
 pub use process_inlines::ProcessInlinesError;
 use serde::Serialize;
@@ -80,6 +81,7 @@ pub type PrepareGrammarResult = Result;
 #[error(transparent)]
 pub enum PrepareGrammarError {
     ValidatePrecedences(#[from] ValidatePrecedenceError),
+    ValidateIndirectRecursion(#[from] IndirectRecursionError),
     InternSymbols(#[from] InternSymbolsError),
     ExtractTokens(#[from] ExtractTokensError),
     FlattenGrammar(#[from] FlattenGrammarError),
@@ -96,6 +98,22 @@ pub enum ValidatePrecedenceError {
     Ordering(#[from] ConflictingPrecedenceOrderingError),
 }
 
+#[derive(Debug, Error, Serialize)]
+pub struct IndirectRecursionError(pub Vec);
+
+impl std::fmt::Display for IndirectRecursionError {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "Grammar contains an indirectly recursive rule: ")?;
+        for (i, symbol) in self.0.iter().enumerate() {
+            if i > 0 {
+                write!(f, " -> ")?;
+            }
+            write!(f, "{symbol}")?;
+        }
+        Ok(())
+    }
+}
+
 #[derive(Debug, Error, Serialize)]
 pub struct UndeclaredPrecedenceError {
     pub precedence: String,
@@ -141,6 +159,7 @@ pub fn prepare_grammar(
     AliasMap,
 )> {
     validate_precedences(input_grammar)?;
+    validate_indirect_recursion(input_grammar)?;
 
     let interned_grammar = intern_symbols(input_grammar)?;
     let (syntax_grammar, lexical_grammar) = extract_tokens(interned_grammar)?;
@@ -152,6 +171,83 @@ pub fn prepare_grammar(
     Ok((syntax_grammar, lexical_grammar, inlines, default_aliases))
 }
 
+/// Check for indirect recursion cycles in the grammar that can cause infinite loops while
+/// parsing. An indirect recursion cycle occurs when a non-terminal can derive itself through
+/// a chain of single-symbol productions (e.g., A -> B, B -> A).
+fn validate_indirect_recursion(grammar: &InputGrammar) -> Result<(), IndirectRecursionError> {
+    let mut epsilon_transitions: IndexMap<&str, BTreeSet> = IndexMap::new();
+
+    for variable in &grammar.variables {
+        let productions = get_single_symbol_productions(&variable.rule);
+        // Filter out rules that *directly* reference themselves, as this doesn't
+        // cause a parsing loop.
+        let filtered: BTreeSet = productions
+            .into_iter()
+            .filter(|s| s != &variable.name)
+            .collect();
+        epsilon_transitions.insert(variable.name.as_str(), filtered);
+    }
+
+    for start_symbol in epsilon_transitions.keys() {
+        let mut visited = BTreeSet::new();
+        let mut path = Vec::new();
+        if let Some((start_idx, end_idx)) =
+            get_cycle(start_symbol, &epsilon_transitions, &mut visited, &mut path)
+        {
+            let cycle_symbols = path[start_idx..=end_idx]
+                .iter()
+                .map(|s| (*s).to_string())
+                .collect();
+            return Err(IndirectRecursionError(cycle_symbols));
+        }
+    }
+
+    Ok(())
+}
+
+fn get_single_symbol_productions(rule: &Rule) -> BTreeSet {
+    match rule {
+        Rule::NamedSymbol(name) => BTreeSet::from([name.clone()]),
+        Rule::Choice(choices) => choices
+            .iter()
+            .flat_map(get_single_symbol_productions)
+            .collect(),
+        Rule::Metadata { rule, .. } => get_single_symbol_productions(rule),
+        _ => BTreeSet::new(),
+    }
+}
+
+/// Perform a depth-first search to detect cycles in single state transitions.
+fn get_cycle<'a>(
+    current: &'a str,
+    transitions: &'a IndexMap<&'a str, BTreeSet>,
+    visited: &mut BTreeSet<&'a str>,
+    path: &mut Vec<&'a str>,
+) -> Option<(usize, usize)> {
+    if let Some(first_idx) = path.iter().position(|s| *s == current) {
+        path.push(current);
+        return Some((first_idx, path.len() - 1));
+    }
+
+    if visited.contains(current) {
+        return None;
+    }
+
+    path.push(current);
+    visited.insert(current);
+
+    if let Some(next_symbols) = transitions.get(current) {
+        for next in next_symbols {
+            if let Some(cycle) = get_cycle(next, transitions, visited, path) {
+                return Some(cycle);
+            }
+        }
+    }
+
+    path.pop();
+    None
+}
+
 /// Check that all of the named precedences used in the grammar are declared
 /// within the `precedences` lists, and also that there are no conflicting
 /// precedence orderings declared in those lists.
diff --git a/test/fixtures/test_grammars/indirect_recursion_in_transitions/expected_error.txt b/test/fixtures/test_grammars/indirect_recursion_in_transitions/expected_error.txt
new file mode 100644
index 00000000..4f244a6c
--- /dev/null
+++ b/test/fixtures/test_grammars/indirect_recursion_in_transitions/expected_error.txt
@@ -0,0 +1 @@
+Grammar contains an indirectly recursive rule: type_expression -> _expression -> identifier_expression -> type_expression
\ No newline at end of file
diff --git a/test/fixtures/test_grammars/indirect_recursion_in_transitions/grammar.js b/test/fixtures/test_grammars/indirect_recursion_in_transitions/grammar.js
new file mode 100644
index 00000000..65ff7b45
--- /dev/null
+++ b/test/fixtures/test_grammars/indirect_recursion_in_transitions/grammar.js
@@ -0,0 +1,16 @@
+module.exports = grammar({
+  name: 'indirect_recursive_in_single_symbol_transitions',
+  rules: {
+    source_file: $ => repeat($._statement),
+
+    _statement: $ => seq($.initialization_part, $.type_expression),
+
+    type_expression: $ => choice('int', $._expression),
+
+    initialization_part: $ => seq('=', $._expression),
+
+    _expression: $ => choice($.identifier_expression, $.type_expression),
+
+    identifier_expression: $ => choice(/[a-zA-Z_][a-zA-Z0-9_]*/, $.type_expression),
+  }
+});

From 968d39328d6cac75c44443572a0861c9d33e102d Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Wed, 3 Sep 2025 01:05:00 -0400
Subject: [PATCH 399/663] ci: switch to arm runner

---
 .github/workflows/build.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 6699a4d4..8b59365a 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -36,7 +36,7 @@ jobs:
           # When adding a new `target`:
           # 1. Define a new platform alias above
           # 2. Add a new record to the matrix map in `cli/npm/install.js`
-          - { platform: linux-arm64       , target: aarch64-unknown-linux-gnu     , os: ubuntu-latest    , use-cross: true }
+          - { platform: linux-arm64       , target: aarch64-unknown-linux-gnu     , os: ubuntu-24.04-arm , features: wasm  }
           - { platform: linux-arm         , target: armv7-unknown-linux-gnueabihf , os: ubuntu-latest    , use-cross: true }
           - { platform: linux-x64         , target: x86_64-unknown-linux-gnu      , os: ubuntu-22.04     , features: wasm  }
           - { platform: linux-x86         , target: i686-unknown-linux-gnu        , os: ubuntu-latest    , use-cross: true }

From 8e2b5ad2a49e93de4b21036659f06846fd60e345 Mon Sep 17 00:00:00 2001
From: Will Lillis 
Date: Tue, 2 Sep 2025 22:01:01 -0400
Subject: [PATCH 400/663] fix(test): improve readability of corpus error
 message mismatch

(cherry picked from commit cc5463ad44ac39e99b7dcaa214b4e47a5eb35230)
---
 cli/src/tests/corpus_test.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cli/src/tests/corpus_test.rs b/cli/src/tests/corpus_test.rs
index 9e557945..6d272f51 100644
--- a/cli/src/tests/corpus_test.rs
+++ b/cli/src/tests/corpus_test.rs
@@ -381,7 +381,7 @@ fn test_feature_corpus_files() {
                 let actual_message = e.to_string().replace("\r\n", "\n");
                 if expected_message != actual_message {
                     eprintln!(
-                        "Unexpected error message.\n\nExpected:\n\n{expected_message}\nActual:\n\n{actual_message}\n",
+                        "Unexpected error message.\n\nExpected:\n\n`{expected_message}`\nActual:\n\n`{actual_message}`\n",
                     );
                     failure_count += 1;
                 }

From 14c4d2f8ca970ad21d4cea82a712bb7f9d4e4e5a Mon Sep 17 00:00:00 2001
From: Will Lillis 
Date: Tue, 2 Sep 2025 22:02:31 -0400
Subject: [PATCH 401/663] fix(generate): return error when single state
 transitions have indirectly recursive cycles.

This can cause infinite loops in the parser near EOF.

Co-authored-by: Amaan Qureshi 
(cherry picked from commit 310c0b86a7149089fe6861a89fbf5cf65ea3ada3)
---
 cli/generate/src/prepare_grammar/mod.rs       | 98 ++++++++++++++++++-
 .../expected_error.txt                        |  1 +
 .../grammar.js                                | 16 +++
 3 files changed, 114 insertions(+), 1 deletion(-)
 create mode 100644 test/fixtures/test_grammars/indirect_recursion_in_transitions/expected_error.txt
 create mode 100644 test/fixtures/test_grammars/indirect_recursion_in_transitions/grammar.js

diff --git a/cli/generate/src/prepare_grammar/mod.rs b/cli/generate/src/prepare_grammar/mod.rs
index c8b92337..10940ac8 100644
--- a/cli/generate/src/prepare_grammar/mod.rs
+++ b/cli/generate/src/prepare_grammar/mod.rs
@@ -8,7 +8,7 @@ mod process_inlines;
 
 use std::{
     cmp::Ordering,
-    collections::{hash_map, HashMap, HashSet},
+    collections::{hash_map, BTreeSet, HashMap, HashSet},
     mem,
 };
 
@@ -16,6 +16,7 @@ use anyhow::Result;
 pub use expand_tokens::ExpandTokensError;
 pub use extract_tokens::ExtractTokensError;
 pub use flatten_grammar::FlattenGrammarError;
+use indexmap::IndexMap;
 pub use intern_symbols::InternSymbolsError;
 pub use process_inlines::ProcessInlinesError;
 use serde::Serialize;
@@ -80,6 +81,7 @@ pub type PrepareGrammarResult = Result;
 #[error(transparent)]
 pub enum PrepareGrammarError {
     ValidatePrecedences(#[from] ValidatePrecedenceError),
+    ValidateIndirectRecursion(#[from] IndirectRecursionError),
     InternSymbols(#[from] InternSymbolsError),
     ExtractTokens(#[from] ExtractTokensError),
     FlattenGrammar(#[from] FlattenGrammarError),
@@ -96,6 +98,22 @@ pub enum ValidatePrecedenceError {
     Ordering(#[from] ConflictingPrecedenceOrderingError),
 }
 
+#[derive(Debug, Error, Serialize)]
+pub struct IndirectRecursionError(pub Vec);
+
+impl std::fmt::Display for IndirectRecursionError {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "Grammar contains an indirectly recursive rule: ")?;
+        for (i, symbol) in self.0.iter().enumerate() {
+            if i > 0 {
+                write!(f, " -> ")?;
+            }
+            write!(f, "{symbol}")?;
+        }
+        Ok(())
+    }
+}
+
 #[derive(Debug, Error, Serialize)]
 pub struct UndeclaredPrecedenceError {
     pub precedence: String,
@@ -141,6 +159,7 @@ pub fn prepare_grammar(
     AliasMap,
 )> {
     validate_precedences(input_grammar)?;
+    validate_indirect_recursion(input_grammar)?;
 
     let interned_grammar = intern_symbols(input_grammar)?;
     let (syntax_grammar, lexical_grammar) = extract_tokens(interned_grammar)?;
@@ -152,6 +171,83 @@ pub fn prepare_grammar(
     Ok((syntax_grammar, lexical_grammar, inlines, default_aliases))
 }
 
+/// Check for indirect recursion cycles in the grammar that can cause infinite loops while
+/// parsing. An indirect recursion cycle occurs when a non-terminal can derive itself through
+/// a chain of single-symbol productions (e.g., A -> B, B -> A).
+fn validate_indirect_recursion(grammar: &InputGrammar) -> Result<(), IndirectRecursionError> {
+    let mut epsilon_transitions: IndexMap<&str, BTreeSet> = IndexMap::new();
+
+    for variable in &grammar.variables {
+        let productions = get_single_symbol_productions(&variable.rule);
+        // Filter out rules that *directly* reference themselves, as this doesn't
+        // cause a parsing loop.
+        let filtered: BTreeSet = productions
+            .into_iter()
+            .filter(|s| s != &variable.name)
+            .collect();
+        epsilon_transitions.insert(variable.name.as_str(), filtered);
+    }
+
+    for start_symbol in epsilon_transitions.keys() {
+        let mut visited = BTreeSet::new();
+        let mut path = Vec::new();
+        if let Some((start_idx, end_idx)) =
+            get_cycle(start_symbol, &epsilon_transitions, &mut visited, &mut path)
+        {
+            let cycle_symbols = path[start_idx..=end_idx]
+                .iter()
+                .map(|s| (*s).to_string())
+                .collect();
+            return Err(IndirectRecursionError(cycle_symbols));
+        }
+    }
+
+    Ok(())
+}
+
+fn get_single_symbol_productions(rule: &Rule) -> BTreeSet {
+    match rule {
+        Rule::NamedSymbol(name) => BTreeSet::from([name.clone()]),
+        Rule::Choice(choices) => choices
+            .iter()
+            .flat_map(get_single_symbol_productions)
+            .collect(),
+        Rule::Metadata { rule, .. } => get_single_symbol_productions(rule),
+        _ => BTreeSet::new(),
+    }
+}
+
+/// Perform a depth-first search to detect cycles in single state transitions.
+fn get_cycle<'a>(
+    current: &'a str,
+    transitions: &'a IndexMap<&'a str, BTreeSet>,
+    visited: &mut BTreeSet<&'a str>,
+    path: &mut Vec<&'a str>,
+) -> Option<(usize, usize)> {
+    if let Some(first_idx) = path.iter().position(|s| *s == current) {
+        path.push(current);
+        return Some((first_idx, path.len() - 1));
+    }
+
+    if visited.contains(current) {
+        return None;
+    }
+
+    path.push(current);
+    visited.insert(current);
+
+    if let Some(next_symbols) = transitions.get(current) {
+        for next in next_symbols {
+            if let Some(cycle) = get_cycle(next, transitions, visited, path) {
+                return Some(cycle);
+            }
+        }
+    }
+
+    path.pop();
+    None
+}
+
 /// Check that all of the named precedences used in the grammar are declared
 /// within the `precedences` lists, and also that there are no conflicting
 /// precedence orderings declared in those lists.
diff --git a/test/fixtures/test_grammars/indirect_recursion_in_transitions/expected_error.txt b/test/fixtures/test_grammars/indirect_recursion_in_transitions/expected_error.txt
new file mode 100644
index 00000000..4f244a6c
--- /dev/null
+++ b/test/fixtures/test_grammars/indirect_recursion_in_transitions/expected_error.txt
@@ -0,0 +1 @@
+Grammar contains an indirectly recursive rule: type_expression -> _expression -> identifier_expression -> type_expression
\ No newline at end of file
diff --git a/test/fixtures/test_grammars/indirect_recursion_in_transitions/grammar.js b/test/fixtures/test_grammars/indirect_recursion_in_transitions/grammar.js
new file mode 100644
index 00000000..65ff7b45
--- /dev/null
+++ b/test/fixtures/test_grammars/indirect_recursion_in_transitions/grammar.js
@@ -0,0 +1,16 @@
+module.exports = grammar({
+  name: 'indirect_recursive_in_single_symbol_transitions',
+  rules: {
+    source_file: $ => repeat($._statement),
+
+    _statement: $ => seq($.initialization_part, $.type_expression),
+
+    type_expression: $ => choice('int', $._expression),
+
+    initialization_part: $ => seq('=', $._expression),
+
+    _expression: $ => choice($.identifier_expression, $.type_expression),
+
+    identifier_expression: $ => choice(/[a-zA-Z_][a-zA-Z0-9_]*/, $.type_expression),
+  }
+});

From 5fd818babe8d41c0fbde45902023b49a5e557ebd Mon Sep 17 00:00:00 2001
From: Will Lillis 
Date: Thu, 4 Sep 2025 03:14:28 -0400
Subject: [PATCH 402/663] fix(generate): use correct state id when adding
 terminal states to non terminal extras

---
 crates/generate/src/build_tables/build_parse_table.rs    | 7 ++++---
 .../test_grammars/extra_non_terminals/corpus.txt         | 9 +++++----
 .../test_grammars/extra_non_terminals/grammar.js         | 9 +++++++--
 3 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/crates/generate/src/build_tables/build_parse_table.rs b/crates/generate/src/build_tables/build_parse_table.rs
index 9c340db7..77f3f4e2 100644
--- a/crates/generate/src/build_tables/build_parse_table.rs
+++ b/crates/generate/src/build_tables/build_parse_table.rs
@@ -326,9 +326,10 @@ impl<'a> ParseTableBuilder<'a> {
                 ))?;
             }
 
-            self.non_terminal_extra_states
-                .push((terminal, self.parse_table.states.len()));
-            self.add_parse_state(&Vec::new(), &Vec::new(), item_set);
+            // Add the parse state, and *then* push the terminal and the state id into the
+            // list of nonterminal extra states
+            let state_id = self.add_parse_state(&Vec::new(), &Vec::new(), item_set);
+            self.non_terminal_extra_states.push((terminal, state_id));
         }
 
         while let Some(entry) = self.parse_state_queue.pop_front() {
diff --git a/test/fixtures/test_grammars/extra_non_terminals/corpus.txt b/test/fixtures/test_grammars/extra_non_terminals/corpus.txt
index 52b7d864..b58fa68b 100644
--- a/test/fixtures/test_grammars/extra_non_terminals/corpus.txt
+++ b/test/fixtures/test_grammars/extra_non_terminals/corpus.txt
@@ -12,11 +12,12 @@ a b c d
 Extras
 ==============
 
-a (one) b (two) (three) c d
+a (one) b (two) (three) c d // e
 
 ---
 
 (module
-  (comment)
-  (comment)
-  (comment))
+  (comment (paren_comment))
+  (comment (paren_comment))
+  (comment (paren_comment))
+  (comment (line_comment)))
diff --git a/test/fixtures/test_grammars/extra_non_terminals/grammar.js b/test/fixtures/test_grammars/extra_non_terminals/grammar.js
index d13cd68a..e66bc9ac 100644
--- a/test/fixtures/test_grammars/extra_non_terminals/grammar.js
+++ b/test/fixtures/test_grammars/extra_non_terminals/grammar.js
@@ -9,7 +9,12 @@ module.exports = grammar({
   ],
 
   rules: {
-    module: $ => seq('a', 'b', 'c', 'd'),
-    comment: $ => seq('(', repeat(/[a-z]+/), ')'),
+    module: _ => seq('a', 'b', 'c', 'd'),
+
+    comment: $ => choice($.paren_comment, $.line_comment),
+
+    paren_comment: _ => token(seq('(', repeat(/[a-z]+/), ')')),
+
+    line_comment: _ => token(seq('//', /.*/)),
   }
 })

From 1d0ebd106509af7eb25d6538ae680cf3356d93dc Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Thu, 4 Sep 2025 03:31:43 -0400
Subject: [PATCH 403/663] fix(rust): do not interpret readme doc comments as
 doc tests

---
 crates/cli/src/tree_sitter_cli.rs       | 2 +-
 crates/config/src/tree_sitter_config.rs | 2 +-
 crates/highlight/src/highlight.rs       | 2 +-
 crates/loader/src/loader.rs             | 2 +-
 crates/tags/src/tags.rs                 | 2 +-
 lib/binding_rust/lib.rs                 | 2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/crates/cli/src/tree_sitter_cli.rs b/crates/cli/src/tree_sitter_cli.rs
index 9f42a835..7eaa2d35 100644
--- a/crates/cli/src/tree_sitter_cli.rs
+++ b/crates/cli/src/tree_sitter_cli.rs
@@ -1,4 +1,4 @@
-#![doc = include_str!("../README.md")]
+#![cfg_attr(not(any(test, doctest)), doc = include_str!("../README.md"))]
 
 pub mod fuzz;
 pub mod highlight;
diff --git a/crates/config/src/tree_sitter_config.rs b/crates/config/src/tree_sitter_config.rs
index bca9163f..757ed64e 100644
--- a/crates/config/src/tree_sitter_config.rs
+++ b/crates/config/src/tree_sitter_config.rs
@@ -1,4 +1,4 @@
-#![doc = include_str!("../README.md")]
+#![cfg_attr(not(any(test, doctest)), doc = include_str!("../README.md"))]
 
 use std::{env, fs, path::PathBuf};
 
diff --git a/crates/highlight/src/highlight.rs b/crates/highlight/src/highlight.rs
index ee617124..e4555fa0 100644
--- a/crates/highlight/src/highlight.rs
+++ b/crates/highlight/src/highlight.rs
@@ -1,4 +1,4 @@
-#![doc = include_str!("../README.md")]
+#![cfg_attr(not(any(test, doctest)), doc = include_str!("../README.md"))]
 
 pub mod c_lib;
 use core::slice;
diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs
index 08c7d6fe..4ea0475b 100644
--- a/crates/loader/src/loader.rs
+++ b/crates/loader/src/loader.rs
@@ -1,4 +1,4 @@
-#![doc = include_str!("../README.md")]
+#![cfg_attr(not(any(test, doctest)), doc = include_str!("../README.md"))]
 #![cfg_attr(docsrs, feature(doc_cfg))]
 
 #[cfg(any(feature = "tree-sitter-highlight", feature = "tree-sitter-tags"))]
diff --git a/crates/tags/src/tags.rs b/crates/tags/src/tags.rs
index 8334fac2..57179e9a 100644
--- a/crates/tags/src/tags.rs
+++ b/crates/tags/src/tags.rs
@@ -1,4 +1,4 @@
-#![doc = include_str!("../README.md")]
+#![cfg_attr(not(any(test, doctest)), doc = include_str!("../README.md"))]
 
 pub mod c_lib;
 
diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs
index 963469fb..5cd6db14 100644
--- a/lib/binding_rust/lib.rs
+++ b/lib/binding_rust/lib.rs
@@ -1,4 +1,4 @@
-#![doc = include_str!("./README.md")]
+#![cfg_attr(not(any(test, doctest)), doc = include_str!("../README.md"))]
 #![cfg_attr(not(feature = "std"), no_std)]
 #![cfg_attr(docsrs, feature(doc_cfg))]
 

From cd12e66e6713ec2697b2298c7fd04ee273282a73 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Thu, 4 Sep 2025 03:54:12 -0400
Subject: [PATCH 404/663] fix(lib): don't run code snippet as a doctest

---
 lib/binding_rust/lib.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs
index 5cd6db14..cb4b34c0 100644
--- a/lib/binding_rust/lib.rs
+++ b/lib/binding_rust/lib.rs
@@ -584,7 +584,7 @@ impl Language {
     /// generate completion suggestions or valid symbols in error nodes.
     ///
     /// Example:
-    /// ```
+    /// ```ignore
     /// let state = language.next_state(node.parse_state(), node.grammar_id());
     /// ```
     #[doc(alias = "ts_language_next_state")]

From 3eabba637c9eb13c34e8af0078a00c17e8629f6d Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Thu, 4 Sep 2025 03:47:07 -0400
Subject: [PATCH 405/663] fix(xtask): run all tests with the `--all` flag

---
 crates/xtask/src/test.rs | 89 +++++++++++++++++++---------------------
 1 file changed, 42 insertions(+), 47 deletions(-)

diff --git a/crates/xtask/src/test.rs b/crates/xtask/src/test.rs
index 303d6944..467245dc 100644
--- a/crates/xtask/src/test.rs
+++ b/crates/xtask/src/test.rs
@@ -64,64 +64,59 @@ pub fn run(args: &Test) -> Result<()> {
         env::set_var("TREE_SITTER_LOG_GRAPHS", "1");
     }
 
-    let run_tests = |subdir: &str| -> Result<()> {
-        if args.g {
-            let mut cargo_cmd = Command::new("cargo");
-            cargo_cmd
-                .current_dir(subdir)
-                .arg("test")
-                .arg(&test_flags)
-                .arg("--no-run")
-                .arg("--message-format=json");
+    if args.g {
+        let mut cargo_cmd = Command::new("cargo");
+        cargo_cmd
+            .arg("test")
+            .arg("--all")
+            .arg(&test_flags)
+            .arg("--no-run")
+            .arg("--message-format=json");
 
-            #[cfg(target_os = "windows")]
-            cargo_cmd.arg("--").arg("--test-threads=1");
+        #[cfg(target_os = "windows")]
+        cargo_cmd.arg("--").arg("--test-threads=1");
 
-            let cargo_cmd = cargo_cmd.stdout(Stdio::piped()).spawn()?;
+        let cargo_cmd = cargo_cmd.stdout(Stdio::piped()).spawn()?;
 
-            let jq_cmd = Command::new("jq")
+        let jq_cmd = Command::new("jq")
             .arg("-rs")
             .arg(r#"map(select(.target.name == "tree_sitter_cli" and .executable))[0].executable"#)
             .stdin(cargo_cmd.stdout.unwrap())
             .output()?;
 
-            let test_binary = String::from_utf8(jq_cmd.stdout)?;
+        let test_binary = String::from_utf8(jq_cmd.stdout)?;
 
-            let mut lldb_cmd = Command::new("lldb");
-            lldb_cmd.arg(test_binary.trim()).arg("--").args(&args.args);
-            bail_on_err(
-                &lldb_cmd.spawn()?.wait_with_output()?,
-                &format!("Failed to run {lldb_cmd:?}"),
-            )
-        } else {
-            let mut cargo_cmd = Command::new("cargo");
-            cargo_cmd.current_dir(subdir).arg("test");
-            if args.wasm {
-                cargo_cmd.arg("--features").arg("wasm");
-            }
-            if !test_flags.is_empty() {
-                cargo_cmd.arg(&test_flags);
-            }
-            cargo_cmd.args(&args.args);
-
-            #[cfg(target_os = "windows")]
-            cargo_cmd.arg("--").arg("--test-threads=1");
-
-            if args.nocapture {
-                #[cfg(not(target_os = "windows"))]
-                cargo_cmd.arg("--");
-
-                cargo_cmd.arg("--nocapture");
-            }
-            bail_on_err(
-                &cargo_cmd.spawn()?.wait_with_output()?,
-                &format!("Failed to run {cargo_cmd:?}"),
-            )
+        let mut lldb_cmd = Command::new("lldb");
+        lldb_cmd.arg(test_binary.trim()).arg("--").args(&args.args);
+        bail_on_err(
+            &lldb_cmd.spawn()?.wait_with_output()?,
+            &format!("Failed to run {lldb_cmd:?}"),
+        )?;
+    } else {
+        let mut cargo_cmd = Command::new("cargo");
+        cargo_cmd.arg("test").arg("--all");
+        if args.wasm {
+            cargo_cmd.arg("--features").arg("wasm");
         }
-    };
+        if !test_flags.is_empty() {
+            cargo_cmd.arg(&test_flags);
+        }
+        cargo_cmd.args(&args.args);
 
-    run_tests(".")?;
-    run_tests("crates/generate")?;
+        #[cfg(target_os = "windows")]
+        cargo_cmd.arg("--").arg("--test-threads=1");
+
+        if args.nocapture {
+            #[cfg(not(target_os = "windows"))]
+            cargo_cmd.arg("--");
+
+            cargo_cmd.arg("--nocapture");
+        }
+        bail_on_err(
+            &cargo_cmd.spawn()?.wait_with_output()?,
+            &format!("Failed to run {cargo_cmd:?}"),
+        )?;
+    }
 
     Ok(())
 }

From 595299a3c2ecaa4e06af7e9661b72f01c95a6cfc Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Thu, 4 Sep 2025 03:50:00 -0400
Subject: [PATCH 406/663] ci: remove separate step for generate fixtures

---
 .github/workflows/build.yml | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 8b59365a..acb3da78 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -285,12 +285,6 @@ jobs:
       if: ${{ !matrix.no-run && inputs.run-test }}
       run: $BUILD_CMD test --target=${{ matrix.target }} --features=${{ matrix.features }}
 
-    - name: Run generate unit tests
-      if: ${{ !matrix.no-run && inputs.run-test }}
-      run: |
-        cd crates/generate
-        $BUILD_CMD test --target=${{ matrix.target }}
-
     - name: Run wasm tests
       if: ${{ !matrix.no-run && !matrix.use-cross && inputs.run-test }}
       run: $BUILD_CMD run -p xtask --target=${{ matrix.target }} -- test-wasm

From 027136c98a5f3bb506284bdbfe356ceda0770c1b Mon Sep 17 00:00:00 2001
From: Will Lillis 
Date: Thu, 4 Sep 2025 03:14:28 -0400
Subject: [PATCH 407/663] fix(generate): use correct state id when adding
 terminal states to non terminal extras

(cherry picked from commit 5fd818babe8d41c0fbde45902023b49a5e557ebd)
---
 cli/generate/src/build_tables/build_parse_table.rs       | 7 ++++---
 .../test_grammars/extra_non_terminals/corpus.txt         | 9 +++++----
 .../test_grammars/extra_non_terminals/grammar.js         | 9 +++++++--
 3 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/cli/generate/src/build_tables/build_parse_table.rs b/cli/generate/src/build_tables/build_parse_table.rs
index e81322b0..9f43f0bd 100644
--- a/cli/generate/src/build_tables/build_parse_table.rs
+++ b/cli/generate/src/build_tables/build_parse_table.rs
@@ -326,9 +326,10 @@ impl<'a> ParseTableBuilder<'a> {
                 ))?;
             }
 
-            self.non_terminal_extra_states
-                .push((terminal, self.parse_table.states.len()));
-            self.add_parse_state(&Vec::new(), &Vec::new(), item_set);
+            // Add the parse state, and *then* push the terminal and the state id into the
+            // list of nonterminal extra states
+            let state_id = self.add_parse_state(&Vec::new(), &Vec::new(), item_set);
+            self.non_terminal_extra_states.push((terminal, state_id));
         }
 
         while let Some(entry) = self.parse_state_queue.pop_front() {
diff --git a/test/fixtures/test_grammars/extra_non_terminals/corpus.txt b/test/fixtures/test_grammars/extra_non_terminals/corpus.txt
index 52b7d864..b58fa68b 100644
--- a/test/fixtures/test_grammars/extra_non_terminals/corpus.txt
+++ b/test/fixtures/test_grammars/extra_non_terminals/corpus.txt
@@ -12,11 +12,12 @@ a b c d
 Extras
 ==============
 
-a (one) b (two) (three) c d
+a (one) b (two) (three) c d // e
 
 ---
 
 (module
-  (comment)
-  (comment)
-  (comment))
+  (comment (paren_comment))
+  (comment (paren_comment))
+  (comment (paren_comment))
+  (comment (line_comment)))
diff --git a/test/fixtures/test_grammars/extra_non_terminals/grammar.js b/test/fixtures/test_grammars/extra_non_terminals/grammar.js
index d13cd68a..e66bc9ac 100644
--- a/test/fixtures/test_grammars/extra_non_terminals/grammar.js
+++ b/test/fixtures/test_grammars/extra_non_terminals/grammar.js
@@ -9,7 +9,12 @@ module.exports = grammar({
   ],
 
   rules: {
-    module: $ => seq('a', 'b', 'c', 'd'),
-    comment: $ => seq('(', repeat(/[a-z]+/), ')'),
+    module: _ => seq('a', 'b', 'c', 'd'),
+
+    comment: $ => choice($.paren_comment, $.line_comment),
+
+    paren_comment: _ => token(seq('(', repeat(/[a-z]+/), ')')),
+
+    line_comment: _ => token(seq('//', /.*/)),
   }
 })

From d287acfcc0a6cef5cfec770cb1778ff549f4701b Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Thu, 4 Sep 2025 03:59:47 -0400
Subject: [PATCH 408/663] refactor(nix): remove openssl dependency

---
 crates/cli/flake.nix      | 2 --
 flake.nix                 | 2 --
 lib/binding_web/flake.nix | 2 --
 3 files changed, 6 deletions(-)

diff --git a/crates/cli/flake.nix b/crates/cli/flake.nix
index b3cc2134..30a568c0 100644
--- a/crates/cli/flake.nix
+++ b/crates/cli/flake.nix
@@ -99,8 +99,6 @@
             pkgs.libclang
           ];
 
-          buildInputs = [ pkgs.openssl ];
-
           buildPhase = ''
             export HOME=$TMPDIR
             export LIBCLANG_PATH="${pkgs.libclang.lib}/lib"
diff --git a/flake.nix b/flake.nix
index 68bf8a4f..004b2373 100644
--- a/flake.nix
+++ b/flake.nix
@@ -229,8 +229,6 @@
 
               pkgs.git
               pkgs.nixfmt-rfc-style
-              pkgs.openssl
-              pkgs.openssl.dev
             ];
 
             shellHook = ''
diff --git a/lib/binding_web/flake.nix b/lib/binding_web/flake.nix
index ba972627..7ceb3fce 100644
--- a/lib/binding_web/flake.nix
+++ b/lib/binding_web/flake.nix
@@ -82,8 +82,6 @@
             pkgs.emscripten
           ];
 
-          buildInputs = [ pkgs.openssl ];
-
           cargoDeps = pkgs.rustPlatform.importCargoLock {
             lockFile = ../../Cargo.lock;
           };

From 17854168d9c54a261a3bf56a874de91e77eddc68 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Thu, 4 Sep 2025 04:00:48 -0400
Subject: [PATCH 409/663] feat(nix): add cross compilation support

---
 crates/cli/flake.nix | 63 ++++++++++++++++-----------------
 flake.nix            | 44 ++++++++++++++++++++++-
 lib/flake.nix        | 84 ++++++++++++++++++++++++++------------------
 3 files changed, 123 insertions(+), 68 deletions(-)

diff --git a/crates/cli/flake.nix b/crates/cli/flake.nix
index 30a568c0..fbab9ad7 100644
--- a/crates/cli/flake.nix
+++ b/crates/cli/flake.nix
@@ -6,31 +6,25 @@
       lib,
       src,
       version,
+      crossTargets,
       ...
     }:
     let
-      nativeBuildInputs = [
-        pkgs.pkg-config
-        pkgs.nodejs_22
-      ];
-
-      buildInputs = [
-        pkgs.openssl
-        pkgs.installShellFiles
-      ];
-    in
-    {
-      packages = {
-        cli = pkgs.rustPlatform.buildRustPackage {
-          inherit
-            src
-            version
-            nativeBuildInputs
-            buildInputs
-            ;
-
+      buildCliFor =
+        targetPkgs:
+        let
+          isCross = targetPkgs.stdenv.hostPlatform != pkgs.stdenv.buildPlatform;
+        in
+        targetPkgs.rustPlatform.buildRustPackage {
+          inherit src version;
           pname = "tree-sitter-cli";
 
+          nativeBuildInputs = [
+            pkgs.pkg-config
+            pkgs.nodejs_22
+          ]
+          ++ lib.optionals (!isCross) [ pkgs.installShellFiles ];
+
           cargoLock.lockFile = ../../Cargo.lock;
 
           preBuild = ''
@@ -40,20 +34,17 @@
             chmod -R u+w test/fixtures
           '';
 
-          preCheck = ''
-            export HOME=$TMPDIR
-          '';
+          preCheck = "export HOME=$TMPDIR";
+          doCheck = !isCross;
 
-          doCheck = true;
-
-          postInstall = ''
-            installShellCompletion --cmd tree-sitter               \
+          postInstall = lib.optionalString (!isCross) ''
+            installShellCompletion --cmd tree-sitter \
               --bash <($out/bin/tree-sitter complete --shell bash) \
-              --zsh  <($out/bin/tree-sitter complete --shell zsh)  \
+              --zsh  <($out/bin/tree-sitter complete --shell zsh) \
               --fish <($out/bin/tree-sitter complete --shell fish)
           '';
 
-          meta = {
+          meta = with lib; {
             description = "Tree-sitter CLI - A tool for developing, testing, and using Tree-sitter parsers";
             longDescription = ''
               Tree-sitter is a parser generator tool and an incremental parsing library.
@@ -63,13 +54,21 @@
             '';
             homepage = "https://tree-sitter.github.io/tree-sitter";
             changelog = "https://github.com/tree-sitter/tree-sitter/releases/tag/v${version}";
-            license = lib.licenses.mit;
-            maintainers = [ lib.maintainers.amaanq ];
-            platforms = lib.platforms.all;
+            license = licenses.mit;
+            maintainers = [ maintainers.amaanq ];
+            platforms = platforms.all;
             mainProgram = "tree-sitter";
           };
         };
 
+      crossPackages = lib.mapAttrs (name: targetPkgs: buildCliFor targetPkgs) crossTargets;
+    in
+    {
+      packages = {
+        cli = buildCliFor pkgs;
+      }
+      // (lib.mapAttrs' (name: pkg: lib.nameValuePair "cli-${name}" pkg) crossPackages)
+      // {
         rust-fmt =
           pkgs.runCommand "rust-fmt-check"
             {
diff --git a/flake.nix b/flake.nix
index 004b2373..0808ae21 100644
--- a/flake.nix
+++ b/flake.nix
@@ -91,10 +91,31 @@
             };
 
           testGrammars = lib.mapAttrs (name: spec: fetchGrammar name spec.rev spec.sha256) grammarSpecs;
+
+          crossTargets = {
+            aarch64-linux = pkgs.pkgsCross.aarch64-multiplatform;
+            armv7l-linux = pkgs.pkgsCross.armv7l-hf-multiplatform;
+            x86_64-linux = pkgs.pkgsCross.gnu64;
+            i686-linux = pkgs.pkgsCross.gnu32;
+            loongarch64 = pkgs.pkgsCross.loongarch64-linux;
+            mips = pkgs.pkgsCross.mips-linux-gnu;
+            mips64 = pkgs.pkgsCross.mips64-linux-gnuabi64;
+            musl64 = pkgs.pkgsCross.musl64;
+            powerpc64-linux = pkgs.pkgsCross.ppc64;
+            riscv32 = pkgs.pkgsCross.riscv32;
+            riscv64 = pkgs.pkgsCross.riscv64;
+            s390x = pkgs.pkgsCross.s390x;
+
+            x86_64-windows = pkgs.pkgsCross.mingwW64;
+          }
+          // (lib.optionalAttrs pkgs.stdenv.isDarwin {
+            x86_64-darwin = pkgs.pkgsCross.x86_64-darwin;
+            aarch64-darwin = pkgs.pkgsCross.aarch64-darwin;
+          });
         in
         {
           _module.args = {
-            inherit src version;
+            inherit src version crossTargets;
           };
 
           packages = {
@@ -241,6 +262,27 @@
               echo "  nix build .#web-tree-sitter  - Build WASM bindings"
               echo "  nix build .#docs             - Build documentation"
               echo ""
+              echo "Cross-compilation:"
+              echo "  Build for other platforms using .#cli- for the CLI,"
+              echo "  and .#lib- for the library (e.g. nix build .#cli-aarch64-linux)."
+              echo ""
+              echo "  Available targets:"
+              echo "    aarch64-linux    - ARM64 Linux"
+              echo "    armv7l-linux     - ARMv7 Linux"
+              echo "    x86_64-linux     - x86_64 Linux"
+              echo "    i686-linux       - i686 Linux"
+              echo "    loongarch64      - LoongArch64 Linux"
+              echo "    mips             - MIPS Linux"
+              echo "    mips64           - MIPS64 Linux"
+              echo "    musl64           - x86_64 MUSL Linux"
+              echo "    powerpc64-linux  - PowerPC64 Linux"
+              echo "    riscv32          - RISC-V 32-bit Linux"
+              echo "    riscv64          - RISC-V 64-bit Linux"
+              echo "    s390x            - s390x Linux"
+              echo "    x86_64-windows   - x86_64 Windows"
+              echo "    x86_64-darwin    - x86_64 macOS (Darwin only)"
+              echo "    aarch64-darwin   - ARM64 macOS (Darwin only)"
+              echo ""
               echo "Apps:"
               echo "  nix run .#cli                - Run tree-sitter CLI"
               echo "  nix run .#docs               - Serve docs locally"
diff --git a/lib/flake.nix b/lib/flake.nix
index 052d7eae..cf49e4c0 100644
--- a/lib/flake.nix
+++ b/lib/flake.nix
@@ -5,50 +5,64 @@
       lib,
       src,
       version,
+      crossTargets,
       ...
     }:
-    {
-      packages.lib = pkgs.stdenv.mkDerivation {
-        inherit src version;
+    let
+      buildLibFor =
+        targetPkgs:
+        let
+          isCross = targetPkgs.stdenv.hostPlatform != pkgs.stdenv.buildPlatform;
+        in
+        targetPkgs.stdenv.mkDerivation {
+          inherit src version;
 
-        pname = "tree-sitter";
+          pname = "tree-sitter";
 
-        nativeBuildInputs = [
-          pkgs.cmake
-          pkgs.pkg-config
-        ];
+          nativeBuildInputs = [
+            targetPkgs.cmake
+            targetPkgs.pkg-config
+          ];
 
-        sourceRoot = "source/lib";
+          sourceRoot = "source/lib";
 
-        cmakeFlags = [
-          "-DBUILD_SHARED_LIBS=ON"
-          "-DCMAKE_INSTALL_LIBDIR=lib"
-          "-DCMAKE_INSTALL_INCLUDEDIR=include"
-          "-DTREE_SITTER_FEATURE_WASM=OFF"
-        ];
+          cmakeFlags = [
+            "-DBUILD_SHARED_LIBS=ON"
+            "-DCMAKE_INSTALL_LIBDIR=lib"
+            "-DCMAKE_INSTALL_INCLUDEDIR=include"
+            "-DTREE_SITTER_FEATURE_WASM=OFF"
+          ];
 
-        enableParallelBuilding = true;
+          enableParallelBuilding = true;
 
-        postInstall = ''
-          mkdir -p $out/{lib/pkgconfig,share/tree-sitter}
-          substituteInPlace $out/lib/pkgconfig/tree-sitter.pc \
-            --replace-fail "\''${prefix}" "$out" 2>/dev/null
-        '';
-
-        meta = {
-          description = "Tree-sitter incremental parsing library";
-          longDescription = ''
-            Tree-sitter is a parser generator tool and an incremental parsing library.
-            It can build a concrete syntax tree for a source file and efficiently update
-            the syntax tree as the source file is edited. This package provides the core
-            C library that can be used to parse source code using Tree-sitter grammars.
+          postInstall = ''
+            mkdir -p $out/{lib/pkgconfig,share/tree-sitter}
+            substituteInPlace $out/lib/pkgconfig/tree-sitter.pc \
+              --replace-fail "\''${prefix}" "$out" 2>/dev/null
           '';
-          homepage = "https://tree-sitter.github.io/tree-sitter";
-          changelog = "https://github.com/tree-sitter/tree-sitter/releases/tag/v${version}";
-          license = lib.licenses.mit;
-          maintainers = [ lib.maintainers.amaanq ];
-          platforms = lib.platforms.all;
+
+          meta = {
+            description = "Tree-sitter incremental parsing library";
+            longDescription = ''
+              Tree-sitter is a parser generator tool and an incremental parsing library.
+              It can build a concrete syntax tree for a source file and efficiently update
+              the syntax tree as the source file is edited. This package provides the core
+              C library that can be used to parse source code using Tree-sitter grammars.
+            '';
+            homepage = "https://tree-sitter.github.io/tree-sitter";
+            changelog = "https://github.com/tree-sitter/tree-sitter/releases/tag/v${version}";
+            license = lib.licenses.mit;
+            maintainers = [ lib.maintainers.amaanq ];
+            platforms = lib.platforms.all;
+          };
         };
-      };
+
+      crossPackages = lib.mapAttrs (name: targetPkgs: buildLibFor targetPkgs) crossTargets;
+    in
+    {
+      packages = {
+        lib = buildLibFor pkgs;
+      }
+      // (lib.mapAttrs' (name: pkg: lib.nameValuePair "lib-${name}" pkg) crossPackages);
     };
 }

From 86d86628cba89238b095ec7bd6d7169a7e980f57 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Thu, 4 Sep 2025 04:01:10 -0400
Subject: [PATCH 410/663] build(nix): use fenix for rust toolchain

This plays more nicely with cross for local testing
---
 flake.nix | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/flake.nix b/flake.nix
index 0808ae21..a030f9a6 100644
--- a/flake.nix
+++ b/flake.nix
@@ -4,6 +4,10 @@
   inputs = {
     nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
     flake-parts.url = "github:hercules-ci/flake-parts";
+    fenix = {
+      url = "github:nix-community/fenix";
+      inputs.nixpkgs.follows = "nixpkgs";
+    };
   };
 
   outputs =
@@ -28,11 +32,21 @@
           self',
           pkgs,
           lib,
+          system,
           ...
         }:
         let
           version = "0.26.0";
 
+          fenix = inputs.fenix.packages.${system};
+          rustToolchain = fenix.complete.withComponents [
+            "cargo"
+            "clippy"
+            "rust-src"
+            "rustc"
+            "rustfmt"
+          ];
+
           src = pkgs.lib.cleanSourceWith {
             src = ./.;
             filter =

From 643f532a706362eeecd51873d354355ea7b31ac0 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Thu, 4 Sep 2025 04:01:14 -0400
Subject: [PATCH 411/663] chore: update flake

---
 flake.lock | 57 +++++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 48 insertions(+), 9 deletions(-)

diff --git a/flake.lock b/flake.lock
index cc94b957..604baf74 100644
--- a/flake.lock
+++ b/flake.lock
@@ -1,15 +1,36 @@
 {
   "nodes": {
+    "fenix": {
+      "inputs": {
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "rust-analyzer-src": "rust-analyzer-src"
+      },
+      "locked": {
+        "lastModified": 1756795219,
+        "narHash": "sha256-tKBQtz1JLKWrCJUxVkHKR+YKmVpm0KZdJdPWmR2slQ8=",
+        "owner": "nix-community",
+        "repo": "fenix",
+        "rev": "80dbdab137f2809e3c823ed027e1665ce2502d74",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "fenix",
+        "type": "github"
+      }
+    },
     "flake-parts": {
       "inputs": {
         "nixpkgs-lib": "nixpkgs-lib"
       },
       "locked": {
-        "lastModified": 1754487366,
-        "narHash": "sha256-pHYj8gUBapuUzKV/kN/tR3Zvqc7o6gdFB9XKXIp1SQ8=",
+        "lastModified": 1756770412,
+        "narHash": "sha256-+uWLQZccFHwqpGqr2Yt5VsW/PbeJVTn9Dk6SHWhNRPw=",
         "owner": "hercules-ci",
         "repo": "flake-parts",
-        "rev": "af66ad14b28a127c5c0f3bbb298218fc63528a18",
+        "rev": "4524271976b625a4a605beefd893f270620fd751",
         "type": "github"
       },
       "original": {
@@ -20,11 +41,11 @@
     },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1756542300,
-        "narHash": "sha256-tlOn88coG5fzdyqz6R93SQL5Gpq+m/DsWpekNFhqPQk=",
+        "lastModified": 1756787288,
+        "narHash": "sha256-rw/PHa1cqiePdBxhF66V7R+WAP8WekQ0mCDG4CFqT8Y=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "d7600c775f877cd87b4f5a831c28aa94137377aa",
+        "rev": "d0fc30899600b9b3466ddb260fd83deb486c32f1",
         "type": "github"
       },
       "original": {
@@ -36,11 +57,11 @@
     },
     "nixpkgs-lib": {
       "locked": {
-        "lastModified": 1753579242,
-        "narHash": "sha256-zvaMGVn14/Zz8hnp4VWT9xVnhc8vuL3TStRqwk22biA=",
+        "lastModified": 1754788789,
+        "narHash": "sha256-x2rJ+Ovzq0sCMpgfgGaaqgBSwY+LST+WbZ6TytnT9Rk=",
         "owner": "nix-community",
         "repo": "nixpkgs.lib",
-        "rev": "0f36c44e01a6129be94e3ade315a5883f0228a6e",
+        "rev": "a73b9c743612e4244d865a2fdee11865283c04e6",
         "type": "github"
       },
       "original": {
@@ -51,9 +72,27 @@
     },
     "root": {
       "inputs": {
+        "fenix": "fenix",
         "flake-parts": "flake-parts",
         "nixpkgs": "nixpkgs"
       }
+    },
+    "rust-analyzer-src": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1756597274,
+        "narHash": "sha256-wfaKRKsEVQDB7pQtAt04vRgFphkVscGRpSx3wG1l50E=",
+        "owner": "rust-lang",
+        "repo": "rust-analyzer",
+        "rev": "21614ed2d3279a9aa1f15c88d293e65a98991b30",
+        "type": "github"
+      },
+      "original": {
+        "owner": "rust-lang",
+        "ref": "nightly",
+        "repo": "rust-analyzer",
+        "type": "github"
+      }
     }
   },
   "root": "root",

From e659dddad1f371b390ccca1cee6232ae172963d1 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Thu, 4 Sep 2025 04:35:26 -0400
Subject: [PATCH 412/663] build(nix): add cross and typescript to dev shell

---
 flake.nix | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/flake.nix b/flake.nix
index a030f9a6..fc5316e3 100644
--- a/flake.nix
+++ b/flake.nix
@@ -248,6 +248,7 @@
               pkgs.clippy
               pkgs.rust-analyzer
               pkgs.rustfmt
+              pkgs.cargo-cross
 
               pkgs.cmake
               pkgs.gnumake
@@ -256,6 +257,7 @@
               pkgs.libclang
 
               pkgs.nodejs_22
+              pkgs.nodePackages.typescript
               pkgs.emscripten
               pkgs.pkgsCross.wasi32.stdenv.cc
 

From 6cd25aadd5a1741643c1cc137a8e2c24bcda8e3b Mon Sep 17 00:00:00 2001
From: Christian Clason 
Date: Sat, 6 Sep 2025 11:45:10 +0200
Subject: [PATCH 413/663] 0.25.9

---
 Cargo.lock                        | 14 +++++++-------
 Cargo.toml                        |  2 +-
 Makefile                          |  2 +-
 build.zig.zon                     |  2 +-
 cli/npm/package.json              |  2 +-
 lib/CMakeLists.txt                |  2 +-
 lib/binding_web/package-lock.json |  4 ++--
 lib/binding_web/package.json      |  2 +-
 8 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 22ec7817..39cec39c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2043,7 +2043,7 @@ dependencies = [
 
 [[package]]
 name = "tree-sitter"
-version = "0.25.8"
+version = "0.25.9"
 dependencies = [
  "bindgen",
  "cc",
@@ -2057,7 +2057,7 @@ dependencies = [
 
 [[package]]
 name = "tree-sitter-cli"
-version = "0.25.8"
+version = "0.25.9"
 dependencies = [
  "ansi_colours",
  "anstyle",
@@ -2110,7 +2110,7 @@ dependencies = [
 
 [[package]]
 name = "tree-sitter-config"
-version = "0.25.8"
+version = "0.25.9"
 dependencies = [
  "anyhow",
  "etcetera",
@@ -2120,7 +2120,7 @@ dependencies = [
 
 [[package]]
 name = "tree-sitter-generate"
-version = "0.25.8"
+version = "0.25.9"
 dependencies = [
  "anyhow",
  "heck",
@@ -2142,7 +2142,7 @@ dependencies = [
 
 [[package]]
 name = "tree-sitter-highlight"
-version = "0.25.8"
+version = "0.25.9"
 dependencies = [
  "regex",
  "streaming-iterator",
@@ -2156,7 +2156,7 @@ version = "0.1.5"
 
 [[package]]
 name = "tree-sitter-loader"
-version = "0.25.8"
+version = "0.25.9"
 dependencies = [
  "anyhow",
  "cc",
@@ -2179,7 +2179,7 @@ dependencies = [
 
 [[package]]
 name = "tree-sitter-tags"
-version = "0.25.8"
+version = "0.25.9"
 dependencies = [
  "memchr",
  "regex",
diff --git a/Cargo.toml b/Cargo.toml
index 7b582287..79bebc77 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -14,7 +14,7 @@ members = [
 resolver = "2"
 
 [workspace.package]
-version = "0.25.8"
+version = "0.25.9"
 authors = [
   "Max Brunsfeld ",
   "Amaan Qureshi ",
diff --git a/Makefile b/Makefile
index a15be29b..3f5f5a4b 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@ ifeq ($(OS),Windows_NT)
 $(error Windows is not supported)
 endif
 
-VERSION := 0.25.8
+VERSION := 0.25.9
 DESCRIPTION := An incremental parsing system for programming tools
 HOMEPAGE_URL := https://tree-sitter.github.io/tree-sitter/
 
diff --git a/build.zig.zon b/build.zig.zon
index 3acdb4d2..998a88eb 100644
--- a/build.zig.zon
+++ b/build.zig.zon
@@ -1,7 +1,7 @@
 .{
     .name = .tree_sitter,
     .fingerprint = 0x841224b447ac0d4f,
-    .version = "0.25.8",
+    .version = "0.25.9",
     .minimum_zig_version = "0.14.1",
     .paths = .{
         "build.zig",
diff --git a/cli/npm/package.json b/cli/npm/package.json
index 34ef9901..5e4af444 100644
--- a/cli/npm/package.json
+++ b/cli/npm/package.json
@@ -1,6 +1,6 @@
 {
   "name": "tree-sitter-cli",
-  "version": "0.25.8",
+  "version": "0.25.9",
   "author": {
     "name": "Max Brunsfeld",
     "email": "maxbrunsfeld@gmail.com"
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index ca900cdc..42aa60d0 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -1,7 +1,7 @@
 cmake_minimum_required(VERSION 3.13)
 
 project(tree-sitter
-        VERSION "0.25.8"
+        VERSION "0.25.9"
         DESCRIPTION "An incremental parsing system for programming tools"
         HOMEPAGE_URL "https://tree-sitter.github.io/tree-sitter/"
         LANGUAGES C)
diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json
index b8696fd8..b2fcf758 100644
--- a/lib/binding_web/package-lock.json
+++ b/lib/binding_web/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "web-tree-sitter",
-  "version": "0.25.8",
+  "version": "0.25.9",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "web-tree-sitter",
-      "version": "0.25.8",
+      "version": "0.25.9",
       "license": "MIT",
       "devDependencies": {
         "@eslint/js": "^9.20.0",
diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json
index 38d94cbb..78c4abba 100644
--- a/lib/binding_web/package.json
+++ b/lib/binding_web/package.json
@@ -1,6 +1,6 @@
 {
   "name": "web-tree-sitter",
-  "version": "0.25.8",
+  "version": "0.25.9",
   "description": "Tree-sitter bindings for the web",
   "repository": {
     "type": "git",

From a467ea8502d95562171f97953a6dc5b2a8622609 Mon Sep 17 00:00:00 2001
From: Will Lillis 
Date: Sat, 6 Sep 2025 15:40:45 -0400
Subject: [PATCH 414/663] fix(rust): correct crate versions in root Cargo.toml
 file

---
 Cargo.toml | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml
index 79bebc77..ace5381d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -156,9 +156,9 @@ walkdir = "2.5.0"
 wasmparser = "0.224.0"
 webbrowser = "1.0.3"
 
-tree-sitter = { version = "0.25.1", path = "./lib" }
-tree-sitter-generate = { version = "0.25.1", path = "./cli/generate" }
-tree-sitter-loader = { version = "0.25.1", path = "./cli/loader" }
-tree-sitter-config = { version = "0.25.1", path = "./cli/config" }
-tree-sitter-highlight = { version = "0.25.1", path = "./highlight" }
-tree-sitter-tags = { version = "0.25.1", path = "./tags" }
+tree-sitter = { version = "0.25.9", path = "./lib" }
+tree-sitter-generate = { version = "0.25.9", path = "./cli/generate" }
+tree-sitter-loader = { version = "0.25.9", path = "./cli/loader" }
+tree-sitter-config = { version = "0.25.9", path = "./cli/config" }
+tree-sitter-highlight = { version = "0.25.9", path = "./highlight" }
+tree-sitter-tags = { version = "0.25.9", path = "./tags" }

From 27e5147a5f936d63f3a3d4da05ec3a039594de24 Mon Sep 17 00:00:00 2001
From: Shadaj Laddad 
Date: Thu, 20 Feb 2025 20:54:18 -0800
Subject: [PATCH 415/663] feat(generate): place file APIs behind a feature flag

---
 crates/generate/Cargo.toml        |  8 ++++++--
 crates/generate/src/generate.rs   | 32 ++++++++++++++++++++++++++++---
 crates/generate/src/node_types.rs |  9 ++++++++-
 3 files changed, 43 insertions(+), 6 deletions(-)

diff --git a/crates/generate/Cargo.toml b/crates/generate/Cargo.toml
index e87b1245..20147948 100644
--- a/crates/generate/Cargo.toml
+++ b/crates/generate/Cargo.toml
@@ -19,6 +19,10 @@ path = "src/generate.rs"
 [lints]
 workspace = true
 
+[features]
+default = ["load"]
+load = ["dep:semver", "dep:url"]
+
 [dependencies]
 anyhow.workspace = true
 heck.workspace = true
@@ -28,7 +32,7 @@ log.workspace = true
 regex.workspace = true
 regex-syntax.workspace = true
 rustc-hash.workspace = true
-semver.workspace = true
+semver = { workspace = true, optional = true }
 serde.workspace = true
 serde_json.workspace = true
 smallbitvec.workspace = true
@@ -38,4 +42,4 @@ topological-sort.workspace = true
 tree-sitter.workspace = true
 
 [target.'cfg(windows)'.dependencies]
-url.workspace = true
+url = { workspace = true, optional = true }
diff --git a/crates/generate/src/generate.rs b/crates/generate/src/generate.rs
index ffc71587..983f0e1a 100644
--- a/crates/generate/src/generate.rs
+++ b/crates/generate/src/generate.rs
@@ -1,18 +1,21 @@
+use std::{collections::HashMap, sync::LazyLock};
+#[cfg(feature = "load")]
 use std::{
-    collections::HashMap,
     env, fs,
     io::Write,
     path::{Path, PathBuf},
     process::{Command, Stdio},
-    sync::LazyLock,
 };
 
 use anyhow::Result;
 use node_types::VariableInfo;
 use regex::{Regex, RegexBuilder};
 use rules::{Alias, Symbol};
+#[cfg(feature = "load")]
 use semver::Version;
-use serde::{Deserialize, Serialize};
+#[cfg(feature = "load")]
+use serde::Deserialize;
+use serde::Serialize;
 use thiserror::Error;
 
 mod build_tables;
@@ -45,6 +48,7 @@ static JSON_COMMENT_REGEX: LazyLock = LazyLock::new(|| {
 });
 
 struct JSONStageOutput {
+    #[cfg(feature = "load")]
     node_types_json: String,
     syntax_grammar: SyntaxGrammar,
     lexical_grammar: LexicalGrammar,
@@ -55,6 +59,7 @@ struct JSONStageOutput {
 
 struct GeneratedParser {
     c_code: String,
+    #[cfg(feature = "load")]
     node_types_json: String,
 }
 
@@ -69,6 +74,7 @@ pub enum GenerateError {
     GrammarPath(String),
     #[error("{0}")]
     IO(String),
+    #[cfg(feature = "load")]
     #[error(transparent)]
     LoadGrammarFile(#[from] LoadGrammarError),
     #[error(transparent)]
@@ -79,6 +85,7 @@ pub enum GenerateError {
     VariableInfo(#[from] VariableInfoError),
     #[error(transparent)]
     BuildTables(#[from] ParseTableBuilderError),
+    #[cfg(feature = "load")]
     #[error(transparent)]
     ParseVersion(#[from] ParseVersionError),
     #[error(transparent)]
@@ -91,8 +98,10 @@ impl From for GenerateError {
     }
 }
 
+#[cfg(feature = "load")]
 pub type LoadGrammarFileResult = Result;
 
+#[cfg(feature = "load")]
 #[derive(Debug, Error, Serialize)]
 pub enum LoadGrammarError {
     #[error("Path to a grammar file with `.js` or `.json` extension is required")]
@@ -105,12 +114,14 @@ pub enum LoadGrammarError {
     FileExtension(PathBuf),
 }
 
+#[cfg(feature = "load")]
 impl From for LoadGrammarError {
     fn from(value: std::io::Error) -> Self {
         Self::IO(value.to_string())
     }
 }
 
+#[cfg(feature = "load")]
 #[derive(Debug, Error, Serialize)]
 pub enum ParseVersionError {
     #[error("{0}")]
@@ -121,8 +132,10 @@ pub enum ParseVersionError {
     IO(String),
 }
 
+#[cfg(feature = "load")]
 pub type JSResult = Result;
 
+#[cfg(feature = "load")]
 #[derive(Debug, Error, Serialize)]
 pub enum JSError {
     #[error("Failed to run `{runtime}` -- {error}")]
@@ -139,24 +152,28 @@ pub enum JSError {
     Serialzation(String),
 }
 
+#[cfg(feature = "load")]
 impl From for JSError {
     fn from(value: std::io::Error) -> Self {
         Self::IO(value.to_string())
     }
 }
 
+#[cfg(feature = "load")]
 impl From for JSError {
     fn from(value: serde_json::Error) -> Self {
         Self::Serialzation(value.to_string())
     }
 }
 
+#[cfg(feature = "load")]
 impl From for JSError {
     fn from(value: semver::Error) -> Self {
         Self::Semver(value.to_string())
     }
 }
 
+#[cfg(feature = "load")]
 pub fn generate_parser_in_directory(
     repo_path: T,
     out_path: Option,
@@ -268,6 +285,8 @@ fn generate_node_types_from_grammar(
         prepare_grammar(input_grammar)?;
     let variable_info =
         node_types::get_variable_info(&syntax_grammar, &lexical_grammar, &simple_aliases)?;
+
+    #[cfg(feature = "load")]
     let node_types_json = node_types::generate_node_types_json(
         &syntax_grammar,
         &lexical_grammar,
@@ -275,6 +294,7 @@ fn generate_node_types_from_grammar(
         &variable_info,
     )?;
     Ok(JSONStageOutput {
+        #[cfg(feature = "load")]
         node_types_json: serde_json::to_string_pretty(&node_types_json).unwrap(),
         syntax_grammar,
         lexical_grammar,
@@ -296,6 +316,7 @@ fn generate_parser_for_grammar_with_opts(
         inlines,
         simple_aliases,
         variable_info,
+        #[cfg(feature = "load")]
         node_types_json,
     } = generate_node_types_from_grammar(input_grammar)?;
     let supertype_symbol_map =
@@ -320,6 +341,7 @@ fn generate_parser_for_grammar_with_opts(
     );
     Ok(GeneratedParser {
         c_code,
+        #[cfg(feature = "load")]
         node_types_json,
     })
 }
@@ -329,6 +351,7 @@ fn generate_parser_for_grammar_with_opts(
 /// If the file is not found in the current directory or any of its parent directories, this will
 /// return `None` to maintain backwards compatibility. If the file is found but the version cannot
 /// be parsed as semver, this will return an error.
+#[cfg(feature = "load")]
 fn read_grammar_version(repo_path: &Path) -> Result, ParseVersionError> {
     #[derive(Deserialize)]
     struct TreeSitterJson {
@@ -373,6 +396,7 @@ fn read_grammar_version(repo_path: &Path) -> Result, ParseVersio
     }
 }
 
+#[cfg(feature = "load")]
 pub fn load_grammar_file(
     grammar_path: &Path,
     js_runtime: Option<&str>,
@@ -387,6 +411,7 @@ pub fn load_grammar_file(
     }
 }
 
+#[cfg(feature = "load")]
 fn load_js_grammar_file(grammar_path: &Path, js_runtime: Option<&str>) -> JSResult {
     let grammar_path = fs::canonicalize(grammar_path)?;
 
@@ -481,6 +506,7 @@ fn load_js_grammar_file(grammar_path: &Path, js_runtime: Option<&str>) -> JSResu
     }
 }
 
+#[cfg(feature = "load")]
 pub fn write_file(path: &Path, body: impl AsRef<[u8]>) -> GenerateResult<()> {
     fs::write(path, body)
         .map_err(|e| GenerateError::IO(format!("Failed to write {:?} -- {e}", path.file_name())))
diff --git a/crates/generate/src/node_types.rs b/crates/generate/src/node_types.rs
index 6ebb5e6d..748a3d58 100644
--- a/crates/generate/src/node_types.rs
+++ b/crates/generate/src/node_types.rs
@@ -30,6 +30,7 @@ pub struct VariableInfo {
 }
 
 #[derive(Debug, Serialize, PartialEq, Eq, Default, PartialOrd, Ord)]
+#[cfg(feature = "load")]
 pub struct NodeInfoJSON {
     #[serde(rename = "type")]
     kind: String,
@@ -47,6 +48,7 @@ pub struct NodeInfoJSON {
 }
 
 #[derive(Clone, Debug, Serialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
+#[cfg(feature = "load")]
 pub struct NodeTypeJSON {
     #[serde(rename = "type")]
     kind: String,
@@ -54,6 +56,7 @@ pub struct NodeTypeJSON {
 }
 
 #[derive(Debug, Serialize, PartialEq, Eq, PartialOrd, Ord)]
+#[cfg(feature = "load")]
 pub struct FieldInfoJSON {
     multiple: bool,
     required: bool,
@@ -67,6 +70,7 @@ pub struct ChildQuantity {
     multiple: bool,
 }
 
+#[cfg(feature = "load")]
 impl Default for FieldInfoJSON {
     fn default() -> Self {
         Self {
@@ -441,6 +445,7 @@ pub fn get_supertype_symbol_map(
     supertype_symbol_map
 }
 
+#[cfg(feature = "load")]
 pub type SuperTypeCycleResult = Result;
 
 #[derive(Debug, Error, Serialize)]
@@ -462,6 +467,7 @@ impl std::fmt::Display for SuperTypeCycleError {
     }
 }
 
+#[cfg(feature = "load")]
 pub fn generate_node_types_json(
     syntax_grammar: &SyntaxGrammar,
     lexical_grammar: &LexicalGrammar,
@@ -783,6 +789,7 @@ pub fn generate_node_types_json(
     Ok(result)
 }
 
+#[cfg(feature = "load")]
 fn process_supertypes(info: &mut FieldInfoJSON, subtype_map: &[(NodeTypeJSON, Vec)]) {
     for (supertype, subtypes) in subtype_map {
         if info.types.contains(supertype) {
@@ -829,7 +836,7 @@ where
     })
 }
 
-#[cfg(test)]
+#[cfg(all(test, feature = "load"))]
 mod tests {
     use super::*;
     use crate::{

From d517af4c1ab09aef800b4f5e8795e5fa61eaa8a8 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 8 Sep 2025 21:17:31 +0000
Subject: [PATCH 416/663] build(deps): bump the cargo group with 3 updates

Bumps the cargo group with 3 updates: [cc](https://github.com/rust-lang/cc-rs), [ctrlc](https://github.com/Detegr/rust-ctrlc) and [log](https://github.com/rust-lang/log).


Updates `cc` from 1.2.35 to 1.2.36
- [Release notes](https://github.com/rust-lang/cc-rs/releases)
- [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.35...cc-v1.2.36)

Updates `ctrlc` from 3.4.7 to 3.5.0
- [Release notes](https://github.com/Detegr/rust-ctrlc/releases)
- [Commits](https://github.com/Detegr/rust-ctrlc/commits)

Updates `log` from 0.4.27 to 0.4.28
- [Release notes](https://github.com/rust-lang/log/releases)
- [Changelog](https://github.com/rust-lang/log/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/log/compare/0.4.27...0.4.28)

---
updated-dependencies:
- dependency-name: cc
  dependency-version: 1.2.36
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
- dependency-name: ctrlc
  dependency-version: 3.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo
- dependency-name: log
  dependency-version: 0.4.28
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
...

Signed-off-by: dependabot[bot] 
---
 Cargo.lock | 42 ++++++++++++++++++++++++++++++++----------
 Cargo.toml |  6 +++---
 2 files changed, 35 insertions(+), 13 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 3022419c..6507507c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -169,9 +169,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
 
 [[package]]
 name = "cc"
-version = "1.2.35"
+version = "1.2.36"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "590f9024a68a8c40351881787f1934dc11afd69090f5edb6831464694d836ea3"
+checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54"
 dependencies = [
  "find-msvc-tools",
  "shlex",
@@ -491,12 +491,13 @@ dependencies = [
 
 [[package]]
 name = "ctrlc"
-version = "3.4.7"
+version = "3.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46f93780a459b7d656ef7f071fe699c4d3d2cb201c4b24d085b6ddc505276e73"
+checksum = "881c5d0a13b2f1498e2306e82cbada78390e152d4b1378fb28a84f4dcd0dc4f3"
 dependencies = [
+ "dispatch",
  "nix",
- "windows-sys 0.59.0",
+ "windows-sys 0.61.0",
 ]
 
 [[package]]
@@ -519,6 +520,12 @@ version = "0.1.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8"
 
+[[package]]
+name = "dispatch"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
+
 [[package]]
 name = "displaydoc"
 version = "0.2.5"
@@ -625,9 +632,9 @@ dependencies = [
 
 [[package]]
 name = "find-msvc-tools"
-version = "0.1.0"
+version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e178e4fba8a2726903f6ba98a6d221e76f9c12c650d5dc0e6afdc50677b49650"
+checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d"
 
 [[package]]
 name = "foldhash"
@@ -1037,9 +1044,9 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
 
 [[package]]
 name = "log"
-version = "0.4.27"
+version = "0.4.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
+checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
 
 [[package]]
 name = "mach2"
@@ -2284,6 +2291,12 @@ version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
 
+[[package]]
+name = "windows-link"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65"
+
 [[package]]
 name = "windows-sys"
 version = "0.45.0"
@@ -2320,6 +2333,15 @@ dependencies = [
  "windows-targets 0.53.3",
 ]
 
+[[package]]
+name = "windows-sys"
+version = "0.61.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa"
+dependencies = [
+ "windows-link 0.2.0",
+]
+
 [[package]]
 name = "windows-targets"
 version = "0.42.2"
@@ -2357,7 +2379,7 @@ version = "0.53.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91"
 dependencies = [
- "windows-link",
+ "windows-link 0.1.3",
  "windows_aarch64_gnullvm 0.53.0",
  "windows_aarch64_msvc 0.53.0",
  "windows_i686_gnu 0.53.0",
diff --git a/Cargo.toml b/Cargo.toml
index 99827f09..6a7b0118 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -106,7 +106,7 @@ ansi_colours = "1.2.3"
 anstyle = "1.0.11"
 anyhow = "1.0.99"
 bstr = "1.12.0"
-cc = "1.2.34"
+cc = "1.2.36"
 clap = { version = "4.5.45", features = [
   "cargo",
   "derive",
@@ -118,7 +118,7 @@ clap = { version = "4.5.45", features = [
 clap_complete = "4.5.57"
 clap_complete_nushell = "4.5.8"
 ctor = "0.2.9"
-ctrlc = { version = "3.4.7", features = ["termination"] }
+ctrlc = { version = "3.5.0", features = ["termination"] }
 dialoguer = { version = "0.11.0", features = ["fuzzy-select"] }
 etcetera = "0.10.0"
 filetime = "0.2.26"
@@ -129,7 +129,7 @@ html-escape = "0.2.13"
 indexmap = "2.11.0"
 indoc = "2.0.6"
 libloading = "0.8.8"
-log = { version = "0.4.27", features = ["std"] }
+log = { version = "0.4.28", features = ["std"] }
 memchr = "2.7.5"
 once_cell = "1.21.3"
 path-slash = "0.2.1"

From 6b2ed39df628f0e7ee8382a492e4d737e28ad50a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 8 Sep 2025 21:22:41 +0000
Subject: [PATCH 417/663] ci: bump the actions group with 2 updates

Bumps the actions group with 2 updates: [actions/setup-node](https://github.com/actions/setup-node) and [actions/github-script](https://github.com/actions/github-script).


Updates `actions/setup-node` from 4 to 5
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v4...v5)

Updates `actions/github-script` from 7 to 8
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v7...v8)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: actions/github-script
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
...

Signed-off-by: dependabot[bot] 
---
 .github/workflows/release.yml          | 2 +-
 .github/workflows/response.yml         | 4 ++--
 .github/workflows/reviewers_remove.yml | 2 +-
 .github/workflows/spam.yml             | 2 +-
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 453f6d2e..803a69ec 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -84,7 +84,7 @@ jobs:
         uses: actions/checkout@v5
 
       - name: Set up Node
-        uses: actions/setup-node@v4
+        uses: actions/setup-node@v5
         with:
           node-version: 20
           registry-url: https://registry.npmjs.org
diff --git a/.github/workflows/response.yml b/.github/workflows/response.yml
index dca1e455..31e039c8 100644
--- a/.github/workflows/response.yml
+++ b/.github/workflows/response.yml
@@ -23,7 +23,7 @@ jobs:
           sparse-checkout-cone-mode: false
 
       - name: Run script
-        uses: actions/github-script@v7
+        uses: actions/github-script@v8
         with:
           script: |
             const script = require('./.github/scripts/close_unresponsive.js')
@@ -41,7 +41,7 @@ jobs:
           sparse-checkout-cone-mode: false
 
       - name: Run script
-        uses: actions/github-script@v7
+        uses: actions/github-script@v8
         with:
           script: |
             const script = require('./.github/scripts/remove_response_label.js')
diff --git a/.github/workflows/reviewers_remove.yml b/.github/workflows/reviewers_remove.yml
index 72dd2793..94e8c058 100644
--- a/.github/workflows/reviewers_remove.yml
+++ b/.github/workflows/reviewers_remove.yml
@@ -18,7 +18,7 @@ jobs:
           sparse-checkout-cone-mode: false
 
       - name: Run script
-        uses: actions/github-script@v7
+        uses: actions/github-script@v8
         with:
           script: |
             const script = require('./.github/scripts/reviewers_remove.js')
diff --git a/.github/workflows/spam.yml b/.github/workflows/spam.yml
index cc581e0b..ce3d5e1d 100644
--- a/.github/workflows/spam.yml
+++ b/.github/workflows/spam.yml
@@ -22,7 +22,7 @@ jobs:
           sparse-checkout-cone-mode: false
 
       - name: Run script
-        uses: actions/github-script@v7
+        uses: actions/github-script@v8
         with:
           script: |
             const script = require('./.github/scripts/close_spam.js')

From 16502e19ddde5894359bce3df1f2113921c5eae1 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 8 Sep 2025 21:24:41 +0000
Subject: [PATCH 418/663] build(deps): bump the npm group across 1 directory
 with 6 updates

Bumps the npm group with 6 updates in the /lib/binding_web directory:

| Package | From | To |
| --- | --- | --- |
| [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) | `9.34.0` | `9.35.0` |
| [@types/emscripten](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/emscripten) | `1.40.0` | `1.41.1` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `24.3.0` | `24.3.1` |
| [eslint](https://github.com/eslint/eslint) | `9.34.0` | `9.35.0` |
| [typescript](https://github.com/microsoft/TypeScript) | `5.8.3` | `5.9.2` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.41.0` | `8.43.0` |



Updates `@eslint/js` from 9.34.0 to 9.35.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/commits/v9.35.0/packages/js)

Updates `@types/emscripten` from 1.40.0 to 1.41.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/emscripten)

Updates `@types/node` from 24.3.0 to 24.3.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `eslint` from 9.34.0 to 9.35.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.34.0...v9.35.0)

Updates `typescript` from 5.8.3 to 5.9.2
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release-publish.yml)
- [Commits](https://github.com/microsoft/TypeScript/compare/v5.8.3...v5.9.2)

Updates `typescript-eslint` from 8.41.0 to 8.43.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.43.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@eslint/js"
  dependency-version: 9.35.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm
- dependency-name: "@types/emscripten"
  dependency-version: 1.41.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm
- dependency-name: "@types/node"
  dependency-version: 24.3.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: eslint
  dependency-version: 9.35.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm
- dependency-name: typescript
  dependency-version: 5.9.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm
- dependency-name: typescript-eslint
  dependency-version: 8.43.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm
...

Signed-off-by: dependabot[bot] 
---
 lib/binding_web/package-lock.json | 156 +++++++++++++++---------------
 1 file changed, 78 insertions(+), 78 deletions(-)

diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json
index a601b2ac..a3d529fe 100644
--- a/lib/binding_web/package-lock.json
+++ b/lib/binding_web/package-lock.json
@@ -540,9 +540,9 @@
       }
     },
     "node_modules/@eslint-community/eslint-utils": {
-      "version": "4.7.0",
-      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
-      "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
+      "version": "4.9.0",
+      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
+      "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -644,9 +644,9 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "9.34.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz",
-      "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==",
+      "version": "9.35.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz",
+      "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -1185,9 +1185,9 @@
       "license": "MIT"
     },
     "node_modules/@types/emscripten": {
-      "version": "1.40.0",
-      "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.40.0.tgz",
-      "integrity": "sha512-MD2JJ25S4tnjnhjWyalMS6K6p0h+zQV6+Ylm+aGbiS8tSn/aHLSGNzBgduj6FB4zH0ax2GRMGYi/8G1uOxhXWA==",
+      "version": "1.41.1",
+      "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.41.1.tgz",
+      "integrity": "sha512-vW2aEgBUU1c2CB+qVMislA98amRVPszdALjqNCuUIJaEFZsNaFaM4g5IMXIs+6oHbmmb7q6zeXYubhtObJ9ZLg==",
       "dev": true,
       "license": "MIT"
     },
@@ -1206,9 +1206,9 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "24.3.0",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz",
-      "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==",
+      "version": "24.3.1",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.1.tgz",
+      "integrity": "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1216,17 +1216,17 @@
       }
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.41.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.41.0.tgz",
-      "integrity": "sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==",
+      "version": "8.43.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.43.0.tgz",
+      "integrity": "sha512-8tg+gt7ENL7KewsKMKDHXR1vm8tt9eMxjJBYINf6swonlWgkYn5NwyIgXpbbDxTNU5DgpDFfj95prcTq2clIQQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.41.0",
-        "@typescript-eslint/type-utils": "8.41.0",
-        "@typescript-eslint/utils": "8.41.0",
-        "@typescript-eslint/visitor-keys": "8.41.0",
+        "@typescript-eslint/scope-manager": "8.43.0",
+        "@typescript-eslint/type-utils": "8.43.0",
+        "@typescript-eslint/utils": "8.43.0",
+        "@typescript-eslint/visitor-keys": "8.43.0",
         "graphemer": "^1.4.0",
         "ignore": "^7.0.0",
         "natural-compare": "^1.4.0",
@@ -1240,7 +1240,7 @@
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "@typescript-eslint/parser": "^8.41.0",
+        "@typescript-eslint/parser": "^8.43.0",
         "eslint": "^8.57.0 || ^9.0.0",
         "typescript": ">=4.8.4 <6.0.0"
       }
@@ -1256,16 +1256,16 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.41.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.41.0.tgz",
-      "integrity": "sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==",
+      "version": "8.43.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.43.0.tgz",
+      "integrity": "sha512-B7RIQiTsCBBmY+yW4+ILd6mF5h1FUwJsVvpqkrgpszYifetQ2Ke+Z4u6aZh0CblkUGIdR59iYVyXqqZGkZ3aBw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.41.0",
-        "@typescript-eslint/types": "8.41.0",
-        "@typescript-eslint/typescript-estree": "8.41.0",
-        "@typescript-eslint/visitor-keys": "8.41.0",
+        "@typescript-eslint/scope-manager": "8.43.0",
+        "@typescript-eslint/types": "8.43.0",
+        "@typescript-eslint/typescript-estree": "8.43.0",
+        "@typescript-eslint/visitor-keys": "8.43.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -1281,14 +1281,14 @@
       }
     },
     "node_modules/@typescript-eslint/project-service": {
-      "version": "8.41.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.41.0.tgz",
-      "integrity": "sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==",
+      "version": "8.43.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.43.0.tgz",
+      "integrity": "sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/tsconfig-utils": "^8.41.0",
-        "@typescript-eslint/types": "^8.41.0",
+        "@typescript-eslint/tsconfig-utils": "^8.43.0",
+        "@typescript-eslint/types": "^8.43.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -1303,14 +1303,14 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.41.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz",
-      "integrity": "sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==",
+      "version": "8.43.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.43.0.tgz",
+      "integrity": "sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.41.0",
-        "@typescript-eslint/visitor-keys": "8.41.0"
+        "@typescript-eslint/types": "8.43.0",
+        "@typescript-eslint/visitor-keys": "8.43.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1321,9 +1321,9 @@
       }
     },
     "node_modules/@typescript-eslint/tsconfig-utils": {
-      "version": "8.41.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz",
-      "integrity": "sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==",
+      "version": "8.43.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.43.0.tgz",
+      "integrity": "sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -1338,15 +1338,15 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.41.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.41.0.tgz",
-      "integrity": "sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==",
+      "version": "8.43.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.43.0.tgz",
+      "integrity": "sha512-qaH1uLBpBuBBuRf8c1mLJ6swOfzCXryhKND04Igr4pckzSEW9JX5Aw9AgW00kwfjWJF0kk0ps9ExKTfvXfw4Qg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.41.0",
-        "@typescript-eslint/typescript-estree": "8.41.0",
-        "@typescript-eslint/utils": "8.41.0",
+        "@typescript-eslint/types": "8.43.0",
+        "@typescript-eslint/typescript-estree": "8.43.0",
+        "@typescript-eslint/utils": "8.43.0",
         "debug": "^4.3.4",
         "ts-api-utils": "^2.1.0"
       },
@@ -1363,9 +1363,9 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "8.41.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz",
-      "integrity": "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==",
+      "version": "8.43.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.43.0.tgz",
+      "integrity": "sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -1377,16 +1377,16 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.41.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz",
-      "integrity": "sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==",
+      "version": "8.43.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.43.0.tgz",
+      "integrity": "sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/project-service": "8.41.0",
-        "@typescript-eslint/tsconfig-utils": "8.41.0",
-        "@typescript-eslint/types": "8.41.0",
-        "@typescript-eslint/visitor-keys": "8.41.0",
+        "@typescript-eslint/project-service": "8.43.0",
+        "@typescript-eslint/tsconfig-utils": "8.43.0",
+        "@typescript-eslint/types": "8.43.0",
+        "@typescript-eslint/visitor-keys": "8.43.0",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
@@ -1432,16 +1432,16 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.41.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.41.0.tgz",
-      "integrity": "sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==",
+      "version": "8.43.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.43.0.tgz",
+      "integrity": "sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.7.0",
-        "@typescript-eslint/scope-manager": "8.41.0",
-        "@typescript-eslint/types": "8.41.0",
-        "@typescript-eslint/typescript-estree": "8.41.0"
+        "@typescript-eslint/scope-manager": "8.43.0",
+        "@typescript-eslint/types": "8.43.0",
+        "@typescript-eslint/typescript-estree": "8.43.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1456,13 +1456,13 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.41.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz",
-      "integrity": "sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==",
+      "version": "8.43.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.43.0.tgz",
+      "integrity": "sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.41.0",
+        "@typescript-eslint/types": "8.43.0",
         "eslint-visitor-keys": "^4.2.1"
       },
       "engines": {
@@ -2005,19 +2005,19 @@
       }
     },
     "node_modules/eslint": {
-      "version": "9.34.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz",
-      "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==",
+      "version": "9.35.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz",
+      "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@eslint-community/eslint-utils": "^4.2.0",
+        "@eslint-community/eslint-utils": "^4.8.0",
         "@eslint-community/regexpp": "^4.12.1",
         "@eslint/config-array": "^0.21.0",
         "@eslint/config-helpers": "^0.3.1",
         "@eslint/core": "^0.15.2",
         "@eslint/eslintrc": "^3.3.1",
-        "@eslint/js": "9.34.0",
+        "@eslint/js": "9.35.0",
         "@eslint/plugin-kit": "^0.3.5",
         "@humanfs/node": "^0.16.6",
         "@humanwhocodes/module-importer": "^1.0.1",
@@ -3612,16 +3612,16 @@
       }
     },
     "node_modules/typescript-eslint": {
-      "version": "8.41.0",
-      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.41.0.tgz",
-      "integrity": "sha512-n66rzs5OBXW3SFSnZHr2T685q1i4ODm2nulFJhMZBotaTavsS8TrI3d7bDlRSs9yWo7HmyWrN9qDu14Qv7Y0Dw==",
+      "version": "8.43.0",
+      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.43.0.tgz",
+      "integrity": "sha512-FyRGJKUGvcFekRRcBKFBlAhnp4Ng8rhe8tuvvkR9OiU0gfd4vyvTRQHEckO6VDlH57jbeUQem2IpqPq9kLJH+w==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/eslint-plugin": "8.41.0",
-        "@typescript-eslint/parser": "8.41.0",
-        "@typescript-eslint/typescript-estree": "8.41.0",
-        "@typescript-eslint/utils": "8.41.0"
+        "@typescript-eslint/eslint-plugin": "8.43.0",
+        "@typescript-eslint/parser": "8.43.0",
+        "@typescript-eslint/typescript-estree": "8.43.0",
+        "@typescript-eslint/utils": "8.43.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"

From 8d6d19de1b51a10eb5ed7b3fa81a110fd836a47c Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Thu, 4 Sep 2025 04:37:08 -0400
Subject: [PATCH 419/663] build: add package-lock.json for npm cli package

---
 crates/cli/npm/package-lock.json | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)
 create mode 100644 crates/cli/npm/package-lock.json

diff --git a/crates/cli/npm/package-lock.json b/crates/cli/npm/package-lock.json
new file mode 100644
index 00000000..ae8bddb6
--- /dev/null
+++ b/crates/cli/npm/package-lock.json
@@ -0,0 +1,20 @@
+{
+  "name": "tree-sitter-cli",
+  "version": "0.26.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "tree-sitter-cli",
+      "version": "0.26.0",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "tree-sitter": "cli.js"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    }
+  }
+}

From 0719bd6ffbb4e50c0e4bb7de1080b39233700908 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Thu, 4 Sep 2025 14:06:52 -0400
Subject: [PATCH 420/663] feat(xtask): bump versions in package-lock.json

---
 crates/xtask/src/bump.rs | 34 ++++++++++++++++++++++++++++------
 1 file changed, 28 insertions(+), 6 deletions(-)

diff --git a/crates/xtask/src/bump.rs b/crates/xtask/src/bump.rs
index 0adfd1b6..a8788bb5 100644
--- a/crates/xtask/src/bump.rs
+++ b/crates/xtask/src/bump.rs
@@ -183,6 +183,7 @@ fn tag_next_version(next_version: &Version) -> Result<()> {
             "build.zig.zon",
             "crates/cli/Cargo.toml",
             "crates/cli/npm/package.json",
+            "crates/cli/npm/package-lock.json",
             "crates/config/Cargo.toml",
             "crates/highlight/Cargo.toml",
             "crates/loader/Cargo.toml",
@@ -190,6 +191,7 @@ fn tag_next_version(next_version: &Version) -> Result<()> {
             "lib/CMakeLists.txt",
             "lib/Cargo.toml",
             "lib/binding_web/package.json",
+            "lib/binding_web/package-lock.json",
         ],
     )?;
 
@@ -289,12 +291,14 @@ fn update_crates(current_version: &Version, next_version: &Version) -> Result<()
 }
 
 fn update_npm(next_version: &Version) -> Result<()> {
-    for path in [
-        "lib/binding_web/package.json",
-        "crates/cli/npm/package.json",
-    ] {
+    for npm_project in ["lib/binding_web", "crates/cli/npm"] {
+        let npm_path = Path::new(npm_project);
+
+        let package_json_path = npm_path.join("package.json");
+
         let package_json = serde_json::from_str::(
-            &std::fs::read_to_string(path).with_context(|| format!("Failed to read {path}"))?,
+            &std::fs::read_to_string(&package_json_path)
+                .with_context(|| format!("Failed to read {}", package_json_path.display()))?,
         )?;
 
         let mut package_json = package_json
@@ -308,7 +312,25 @@ fn update_npm(next_version: &Version) -> Result<()> {
 
         let package_json = serde_json::to_string_pretty(&package_json)? + "\n";
 
-        std::fs::write(path, package_json)?;
+        std::fs::write(package_json_path, package_json)?;
+
+        let Ok(cmd) = std::process::Command::new("npm")
+            .arg("install")
+            .arg("--package-lock-only")
+            .arg("--ignore-scripts")
+            .current_dir(npm_path)
+            .output()
+        else {
+            return Ok(()); // npm is not `executable`, ignore
+        };
+
+        if !cmd.status.success() {
+            let stderr = String::from_utf8_lossy(&cmd.stderr);
+            return Err(anyhow!(
+                "Failed to run `npm install` in {}:\n{stderr}",
+                npm_path.display()
+            ));
+        }
     }
 
     Ok(())

From e9e4316569d91ea16be868626d6c87476521f2f0 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Thu, 4 Sep 2025 14:07:08 -0400
Subject: [PATCH 421/663] feat(xtask): update nix

---
 crates/xtask/src/bump.rs | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/crates/xtask/src/bump.rs b/crates/xtask/src/bump.rs
index a8788bb5..55ff1a6f 100644
--- a/crates/xtask/src/bump.rs
+++ b/crates/xtask/src/bump.rs
@@ -166,6 +166,7 @@ pub fn run(args: BumpVersion) -> Result<()> {
     update_crates(¤t_version, &next_version)?;
     update_makefile(&next_version)?;
     update_cmake(&next_version)?;
+    update_nix(&next_version)?;
     update_npm(&next_version)?;
     update_zig(&next_version)?;
     tag_next_version(&next_version)?;
@@ -181,6 +182,7 @@ fn tag_next_version(next_version: &Version) -> Result<()> {
             "Cargo.toml",
             "Makefile",
             "build.zig.zon",
+            "flake.nix",
             "crates/cli/Cargo.toml",
             "crates/cli/npm/package.json",
             "crates/cli/npm/package-lock.json",
@@ -264,6 +266,26 @@ fn update_cmake(next_version: &Version) -> Result<()> {
     Ok(())
 }
 
+fn update_nix(next_version: &Version) -> Result<()> {
+    let nix = std::fs::read_to_string("flake.nix")?;
+    let nix = nix
+        .lines()
+        .map(|line| {
+            if line.trim_start().starts_with("version =") {
+                format!("          version = \"{next_version}\";")
+            } else {
+                line.to_string()
+            }
+        })
+        .collect::>()
+        .join("\n")
+        + "\n";
+
+    std::fs::write("flake.nix", nix)?;
+
+    Ok(())
+}
+
 fn update_crates(current_version: &Version, next_version: &Version) -> Result<()> {
     let mut cmd = std::process::Command::new("cargo");
     cmd.arg("workspaces").arg("version");

From e4e643086bac54524eba0c215348ad4f56673d90 Mon Sep 17 00:00:00 2001
From: faukah 
Date: Sun, 7 Sep 2025 10:49:54 +0200
Subject: [PATCH 422/663] refactor: rework nix flake

Co-authored-by: Amaan Qureshi 
---
 .gitignore                             |   2 +
 crates/cli/flake.nix                   | 115 ------
 crates/cli/package.nix                 |  60 +++
 docs/flake.nix                         |  38 --
 docs/package.nix                       |  33 ++
 flake.lock                             |  73 ----
 flake.nix                              | 488 +++++++++++++++----------
 lib/binding_web/flake.nix              | 158 --------
 lib/binding_web/package.nix            |  73 ++++
 lib/binding_web/wasm-test-grammars.nix |  67 ++++
 lib/flake.nix                          |  68 ----
 lib/package.nix                        |  49 +++
 12 files changed, 569 insertions(+), 655 deletions(-)
 delete mode 100644 crates/cli/flake.nix
 create mode 100644 crates/cli/package.nix
 delete mode 100644 docs/flake.nix
 create mode 100644 docs/package.nix
 delete mode 100644 lib/binding_web/flake.nix
 create mode 100644 lib/binding_web/package.nix
 create mode 100644 lib/binding_web/wasm-test-grammars.nix
 delete mode 100644 lib/flake.nix
 create mode 100644 lib/package.nix

diff --git a/.gitignore b/.gitignore
index bf1e36d6..ca47139e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,3 +36,5 @@ docs/assets/js/tree-sitter.js
 .build
 build
 zig-*
+
+/result
diff --git a/crates/cli/flake.nix b/crates/cli/flake.nix
deleted file mode 100644
index fbab9ad7..00000000
--- a/crates/cli/flake.nix
+++ /dev/null
@@ -1,115 +0,0 @@
-{
-  perSystem =
-    {
-      self',
-      pkgs,
-      lib,
-      src,
-      version,
-      crossTargets,
-      ...
-    }:
-    let
-      buildCliFor =
-        targetPkgs:
-        let
-          isCross = targetPkgs.stdenv.hostPlatform != pkgs.stdenv.buildPlatform;
-        in
-        targetPkgs.rustPlatform.buildRustPackage {
-          inherit src version;
-          pname = "tree-sitter-cli";
-
-          nativeBuildInputs = [
-            pkgs.pkg-config
-            pkgs.nodejs_22
-          ]
-          ++ lib.optionals (!isCross) [ pkgs.installShellFiles ];
-
-          cargoLock.lockFile = ../../Cargo.lock;
-
-          preBuild = ''
-            rm -rf test/fixtures
-            mkdir -p test/fixtures
-            cp -r ${self'.packages.test-grammars}/fixtures/* test/fixtures/
-            chmod -R u+w test/fixtures
-          '';
-
-          preCheck = "export HOME=$TMPDIR";
-          doCheck = !isCross;
-
-          postInstall = lib.optionalString (!isCross) ''
-            installShellCompletion --cmd tree-sitter \
-              --bash <($out/bin/tree-sitter complete --shell bash) \
-              --zsh  <($out/bin/tree-sitter complete --shell zsh) \
-              --fish <($out/bin/tree-sitter complete --shell fish)
-          '';
-
-          meta = with lib; {
-            description = "Tree-sitter CLI - A tool for developing, testing, and using Tree-sitter parsers";
-            longDescription = ''
-              Tree-sitter is a parser generator tool and an incremental parsing library.
-              It can build a concrete syntax tree for a source file and efficiently update
-              the syntax tree as the source file is edited. This package provides the CLI
-              tool for developing, testing, and using Tree-sitter parsers.
-            '';
-            homepage = "https://tree-sitter.github.io/tree-sitter";
-            changelog = "https://github.com/tree-sitter/tree-sitter/releases/tag/v${version}";
-            license = licenses.mit;
-            maintainers = [ maintainers.amaanq ];
-            platforms = platforms.all;
-            mainProgram = "tree-sitter";
-          };
-        };
-
-      crossPackages = lib.mapAttrs (name: targetPkgs: buildCliFor targetPkgs) crossTargets;
-    in
-    {
-      packages = {
-        cli = buildCliFor pkgs;
-      }
-      // (lib.mapAttrs' (name: pkg: lib.nameValuePair "cli-${name}" pkg) crossPackages)
-      // {
-        rust-fmt =
-          pkgs.runCommand "rust-fmt-check"
-            {
-              nativeBuildInputs = [
-                pkgs.cargo
-                pkgs.rustfmt
-              ];
-            }
-            ''
-              cd ${src}
-              cargo fmt --all --check
-              touch $out
-            '';
-
-        rust-clippy = pkgs.rustPlatform.buildRustPackage {
-          inherit src version;
-
-          pname = "rust-clippy-check";
-
-          cargoLock.lockFile = ../../Cargo.lock;
-
-          nativeBuildInputs = [
-            pkgs.pkg-config
-            pkgs.clippy
-            pkgs.cmake
-            pkgs.clang
-            pkgs.libclang
-          ];
-
-          buildPhase = ''
-            export HOME=$TMPDIR
-            export LIBCLANG_PATH="${pkgs.libclang.lib}/lib"
-            cargo xtask clippy
-          '';
-
-          installPhase = ''
-            touch $out
-          '';
-
-          doCheck = false;
-        };
-      };
-    };
-}
diff --git a/crates/cli/package.nix b/crates/cli/package.nix
new file mode 100644
index 00000000..584b78e7
--- /dev/null
+++ b/crates/cli/package.nix
@@ -0,0 +1,60 @@
+{
+  lib,
+  src,
+  rustPlatform,
+  version,
+  pkg-config,
+  nodejs_22,
+  test-grammars,
+  stdenv,
+  installShellFiles,
+}:
+let
+  isCross = stdenv.targetPlatform == stdenv.buildPlatform;
+in
+rustPlatform.buildRustPackage {
+  pname = "tree-sitter-cli";
+
+  inherit src version;
+
+  nativeBuildInputs = [
+    pkg-config
+    nodejs_22
+  ]
+  ++ lib.optionals (!isCross) [ installShellFiles ];
+
+  cargoLock.lockFile = ../../Cargo.lock;
+
+  preBuild = ''
+    rm -rf test/fixtures
+    mkdir -p test/fixtures
+    cp -r ${test-grammars}/fixtures/* test/fixtures/
+    chmod -R u+w test/fixtures
+  '';
+
+  preCheck = "export HOME=$TMPDIR";
+  doCheck = !isCross;
+
+  postInstall = lib.optionalString (!isCross) ''
+    installShellCompletion --cmd tree-sitter \
+      --bash <($out/bin/tree-sitter complete --shell bash) \
+      --zsh  <($out/bin/tree-sitter complete --shell zsh) \
+      --fish <($out/bin/tree-sitter complete --shell fish)
+  '';
+
+  meta = {
+    description = "Tree-sitter CLI - A tool for developing, testing, and using Tree-sitter parsers";
+    longDescription = ''
+      Tree-sitter is a parser generator tool and an incremental parsing library.
+      It can build a concrete syntax tree for a source file and efficiently update
+      the syntax tree as the source file is edited. This package provides the CLI
+      tool for developing, testing, and using Tree-sitter parsers.
+    '';
+    homepage = "https://tree-sitter.github.io/tree-sitter";
+    changelog = "https://github.com/tree-sitter/tree-sitter/releases/tag/v${version}";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ amaanq ];
+    platforms = lib.platforms.all;
+    mainProgram = "tree-sitter";
+  };
+}
diff --git a/docs/flake.nix b/docs/flake.nix
deleted file mode 100644
index c752bf43..00000000
--- a/docs/flake.nix
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  perSystem =
-    {
-      pkgs,
-      lib,
-      src,
-      version,
-      ...
-    }:
-    {
-      packages.docs = pkgs.stdenv.mkDerivation {
-        inherit src version;
-
-        pname = "tree-sitter-docs";
-
-        nativeBuildInputs = [
-          pkgs.mdbook
-          pkgs.mdbook-admonish
-        ];
-
-        buildPhase = ''
-          cd docs
-          mdbook build
-        '';
-
-        installPhase = ''
-          mkdir -p $out/share/doc
-          cp -r book $out/share/doc/tree-sitter
-        '';
-
-        meta = {
-          description = "Tree-sitter documentation";
-          homepage = "https://tree-sitter.github.io/tree-sitter";
-          license = lib.licenses.mit;
-        };
-      };
-    };
-}
diff --git a/docs/package.nix b/docs/package.nix
new file mode 100644
index 00000000..1d07631f
--- /dev/null
+++ b/docs/package.nix
@@ -0,0 +1,33 @@
+{
+  stdenv,
+  lib,
+  version,
+  mdbook,
+  mdbook-admonish,
+}:
+stdenv.mkDerivation {
+  inherit version;
+
+  src = ./.;
+  pname = "tree-sitter-docs";
+
+  nativeBuildInputs = [
+    mdbook
+    mdbook-admonish
+  ];
+
+  buildPhase = ''
+    mdbook build
+  '';
+
+  installPhase = ''
+    mkdir -p $out/share/doc
+    cp -r book $out/share/doc/tree-sitter
+  '';
+
+  meta = {
+    description = "Tree-sitter documentation";
+    homepage = "https://tree-sitter.github.io/tree-sitter";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/flake.lock b/flake.lock
index 604baf74..2b1bddae 100644
--- a/flake.lock
+++ b/flake.lock
@@ -1,44 +1,5 @@
 {
   "nodes": {
-    "fenix": {
-      "inputs": {
-        "nixpkgs": [
-          "nixpkgs"
-        ],
-        "rust-analyzer-src": "rust-analyzer-src"
-      },
-      "locked": {
-        "lastModified": 1756795219,
-        "narHash": "sha256-tKBQtz1JLKWrCJUxVkHKR+YKmVpm0KZdJdPWmR2slQ8=",
-        "owner": "nix-community",
-        "repo": "fenix",
-        "rev": "80dbdab137f2809e3c823ed027e1665ce2502d74",
-        "type": "github"
-      },
-      "original": {
-        "owner": "nix-community",
-        "repo": "fenix",
-        "type": "github"
-      }
-    },
-    "flake-parts": {
-      "inputs": {
-        "nixpkgs-lib": "nixpkgs-lib"
-      },
-      "locked": {
-        "lastModified": 1756770412,
-        "narHash": "sha256-+uWLQZccFHwqpGqr2Yt5VsW/PbeJVTn9Dk6SHWhNRPw=",
-        "owner": "hercules-ci",
-        "repo": "flake-parts",
-        "rev": "4524271976b625a4a605beefd893f270620fd751",
-        "type": "github"
-      },
-      "original": {
-        "owner": "hercules-ci",
-        "repo": "flake-parts",
-        "type": "github"
-      }
-    },
     "nixpkgs": {
       "locked": {
         "lastModified": 1756787288,
@@ -55,44 +16,10 @@
         "type": "github"
       }
     },
-    "nixpkgs-lib": {
-      "locked": {
-        "lastModified": 1754788789,
-        "narHash": "sha256-x2rJ+Ovzq0sCMpgfgGaaqgBSwY+LST+WbZ6TytnT9Rk=",
-        "owner": "nix-community",
-        "repo": "nixpkgs.lib",
-        "rev": "a73b9c743612e4244d865a2fdee11865283c04e6",
-        "type": "github"
-      },
-      "original": {
-        "owner": "nix-community",
-        "repo": "nixpkgs.lib",
-        "type": "github"
-      }
-    },
     "root": {
       "inputs": {
-        "fenix": "fenix",
-        "flake-parts": "flake-parts",
         "nixpkgs": "nixpkgs"
       }
-    },
-    "rust-analyzer-src": {
-      "flake": false,
-      "locked": {
-        "lastModified": 1756597274,
-        "narHash": "sha256-wfaKRKsEVQDB7pQtAt04vRgFphkVscGRpSx3wG1l50E=",
-        "owner": "rust-lang",
-        "repo": "rust-analyzer",
-        "rev": "21614ed2d3279a9aa1f15c88d293e65a98991b30",
-        "type": "github"
-      },
-      "original": {
-        "owner": "rust-lang",
-        "ref": "nightly",
-        "repo": "rust-analyzer",
-        "type": "github"
-      }
     }
   },
   "root": "root",
diff --git a/flake.nix b/flake.nix
index fc5316e3..70d3c474 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,111 +1,80 @@
 {
   description = "Tree-sitter - A parser generator tool and an incremental parsing library";
 
-  inputs = {
-    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
-    flake-parts.url = "github:hercules-ci/flake-parts";
-    fenix = {
-      url = "github:nix-community/fenix";
-      inputs.nixpkgs.follows = "nixpkgs";
-    };
-  };
+  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
 
   outputs =
-    inputs@{ flake-parts, ... }:
-    flake-parts.lib.mkFlake { inherit inputs; } {
+    inputs:
+    let
+      inherit (inputs.nixpkgs) lib;
+      inherit (inputs) self;
       systems = [
         "x86_64-linux"
         "aarch64-linux"
         "x86_64-darwin"
         "aarch64-darwin"
       ];
+      eachSystem = lib.genAttrs systems;
+      pkgsFor = inputs.nixpkgs.legacyPackages;
 
-      imports = [
-        ./crates/cli/flake.nix
-        ./lib/flake.nix
-        ./lib/binding_web/flake.nix
-        ./docs/flake.nix
-      ];
+      version = "0.26.0";
 
-      perSystem =
-        {
-          self',
-          pkgs,
-          lib,
-          system,
-          ...
-        }:
+      fs = lib.fileset;
+      src = fs.toSource {
+        root = ./.;
+        fileset = fs.difference (fs.gitTracked ./.) (
+          fs.unions [
+            ./.envrc
+            ./flake.lock
+            ./FUNDING.json
+            ./README.md
+            ./Dockerfile
+            (fs.fileFilter (file: lib.strings.hasInfix ".git" file.name) ./.)
+            (fs.fileFilter (file: file.hasExt "nix") ./.)
+          ]
+        );
+      };
+      fixturesJson = lib.importJSON ./test/fixtures/fixtures.json;
+
+      grammarHashes = {
+        bash = "sha256-vRaN/mNfpR+hdv2HVS1bzaW0o+HGjizRFsk3iinICJE=";
+        c = "sha256-gmzbdwvrKSo6C1fqTJFGxy8x0+T+vUTswm7F5sojzKc=";
+        cpp = "sha256-tP5Tu747V8QMCEBYwOEmMQUm8OjojpJdlRmjcJTbe2k=";
+        embedded-template = "sha256-nBQain0Lc21jOgQFfvkyq615ZmT8qdMxtqIoUcOcO3A=";
+        go = "sha256-y7bTET8ypPczPnMVlCaiZuswcA7vFrDOc2jlbfVk5Sk=";
+        html = "sha256-Pd5Me1twLGOrRB3pSMVX9M8VKenTK0896aoLznjNkGo=";
+        java = "sha256-OvEO1BLZLjP3jt4gar18kiXderksFKO0WFXDQqGLRIY=";
+        javascript = "sha256-2Jj/SUG+k8lHlGSuPZvHjJojvQFgDiZHZzH8xLu7suE=";
+        jsdoc = "sha256-Azzb2zBjAfwbEmAEO1YqhpaxtzbXmRjfIzRla2Hx+24=";
+        json = "sha256-DNZC2cTy1C8OaMOpEHM6NoRtOIbLaBf0CLXXWCKODlw=";
+        php = "sha256-jI7yzcoHS/tNxUqJI4aD1rdEZV3jMn1GZD0J+81Dyf0=";
+        python = "sha256-71Od4sUsxGEvTwmXX8hBvzqD55hnXkVJublrhp1GICg=";
+        ruby = "sha256-iu3MVJl0Qr/Ba+aOttmEzMiVY6EouGi5wGOx5ofROzA=";
+        rust = "sha256-y3sJURlSTM7LRRN5WGIAeslsdRZU522Tfcu6dnXH/XQ=";
+        typescript = "sha256-CU55+YoFJb6zWbJnbd38B7iEGkhukSVpBN7sli6GkGY=";
+      };
+
+      grammarSpecs = lib.listToAttrs (
+        map (fixture: {
+          name = lib.elemAt fixture 0;
+          value = {
+            rev = lib.elemAt fixture 1;
+            sha256 = grammarHashes.${lib.elemAt fixture 0};
+          };
+        }) fixturesJson
+      );
+      filesWithExtension =
+        ext:
+        fs.toSource {
+          root = ./.;
+          fileset = fs.fileFilter (file: (file.hasExt ext) && file.type == "regular") ./.;
+        };
+    in
+    {
+      packages = eachSystem (
+        system:
         let
-          version = "0.26.0";
-
-          fenix = inputs.fenix.packages.${system};
-          rustToolchain = fenix.complete.withComponents [
-            "cargo"
-            "clippy"
-            "rust-src"
-            "rustc"
-            "rustfmt"
-          ];
-
-          src = pkgs.lib.cleanSourceWith {
-            src = ./.;
-            filter =
-              name: type:
-              let
-                baseName = baseNameOf name;
-              in
-              !(
-                lib.elem baseName [
-                  "target"
-                  "node_modules"
-                  ".git"
-                  ".direnv"
-                  "flake.lock"
-                ]
-                || lib.hasPrefix "result" baseName
-              );
-          };
-
-          fixturesJson = lib.importJSON ./test/fixtures/fixtures.json;
-
-          grammarHashes = {
-            bash = "sha256-vRaN/mNfpR+hdv2HVS1bzaW0o+HGjizRFsk3iinICJE=";
-            c = "sha256-gmzbdwvrKSo6C1fqTJFGxy8x0+T+vUTswm7F5sojzKc=";
-            cpp = "sha256-tP5Tu747V8QMCEBYwOEmMQUm8OjojpJdlRmjcJTbe2k=";
-            embedded-template = "sha256-nBQain0Lc21jOgQFfvkyq615ZmT8qdMxtqIoUcOcO3A=";
-            go = "sha256-y7bTET8ypPczPnMVlCaiZuswcA7vFrDOc2jlbfVk5Sk=";
-            html = "sha256-Pd5Me1twLGOrRB3pSMVX9M8VKenTK0896aoLznjNkGo=";
-            java = "sha256-OvEO1BLZLjP3jt4gar18kiXderksFKO0WFXDQqGLRIY=";
-            javascript = "sha256-2Jj/SUG+k8lHlGSuPZvHjJojvQFgDiZHZzH8xLu7suE=";
-            jsdoc = "sha256-Azzb2zBjAfwbEmAEO1YqhpaxtzbXmRjfIzRla2Hx+24=";
-            json = "sha256-DNZC2cTy1C8OaMOpEHM6NoRtOIbLaBf0CLXXWCKODlw=";
-            php = "sha256-jI7yzcoHS/tNxUqJI4aD1rdEZV3jMn1GZD0J+81Dyf0=";
-            python = "sha256-71Od4sUsxGEvTwmXX8hBvzqD55hnXkVJublrhp1GICg=";
-            ruby = "sha256-iu3MVJl0Qr/Ba+aOttmEzMiVY6EouGi5wGOx5ofROzA=";
-            rust = "sha256-y3sJURlSTM7LRRN5WGIAeslsdRZU522Tfcu6dnXH/XQ=";
-            typescript = "sha256-CU55+YoFJb6zWbJnbd38B7iEGkhukSVpBN7sli6GkGY=";
-          };
-
-          grammarSpecs = lib.listToAttrs (
-            map (fixture: {
-              name = lib.elemAt fixture 0;
-              value = {
-                rev = lib.elemAt fixture 1;
-                sha256 = grammarHashes.${lib.elemAt fixture 0};
-              };
-            }) fixturesJson
-          );
-
-          fetchGrammar =
-            name: rev: sha256:
-            pkgs.fetchFromGitHub {
-              owner = "tree-sitter";
-              repo = "tree-sitter-${name}";
-              inherit rev sha256;
-            };
-
-          testGrammars = lib.mapAttrs (name: spec: fetchGrammar name spec.rev spec.sha256) grammarSpecs;
-
+          pkgs = pkgsFor.${system};
           crossTargets = {
             aarch64-linux = pkgs.pkgsCross.aarch64-multiplatform;
             armv7l-linux = pkgs.pkgsCross.armv7l-hf-multiplatform;
@@ -126,16 +95,26 @@
             x86_64-darwin = pkgs.pkgsCross.x86_64-darwin;
             aarch64-darwin = pkgs.pkgsCross.aarch64-darwin;
           });
+
         in
         {
-          _module.args = {
-            inherit src version crossTargets;
-          };
+          default = self.packages.${system}.cli;
 
-          packages = {
-            default = self'.packages.cli;
+          docs = pkgs.callPackage ./docs/package.nix { inherit version; };
 
-            test-grammars = pkgs.stdenv.mkDerivation {
+          test-grammars =
+            let
+              fetchGrammar =
+                name: rev: sha256:
+                pkgs.fetchFromGitHub {
+                  owner = "tree-sitter";
+                  repo = "tree-sitter-${name}";
+                  inherit rev sha256;
+                };
+
+              testGrammars = lib.mapAttrs (name: spec: fetchGrammar name spec.rev spec.sha256) grammarSpecs;
+            in
+            pkgs.stdenv.mkDerivation {
               inherit src version;
 
               pname = "test-grammars";
@@ -152,120 +131,219 @@
                 cp -r test/fixtures $out/fixtures
               '';
             };
+
+          wasm-test-grammars = pkgs.callPackage ./lib/binding_web/wasm-test-grammars.nix {
+            inherit src version;
+            inherit (self.packages.${system}) cli test-grammars;
           };
 
-          apps = {
-            default = self'.apps.cli;
+          web-tree-sitter = pkgs.callPackage ./lib/binding_web/package.nix {
+            inherit src version;
+            inherit (self.packages.${system}) wasm-test-grammars;
+          };
 
-            cli = {
-              type = "app";
-              program = "${self'.packages.cli}/bin/tree-sitter";
-              meta.description = "Tree-sitter CLI for developing, testing, and using parsers";
-            };
+          lib = pkgs.callPackage ./lib/package.nix {
+            inherit src version;
+          };
 
-            docs = {
-              type = "app";
-              program = "${pkgs.writeShellScript "docs" ''
+          cli = pkgs.callPackage ./crates/cli/package.nix {
+            inherit src version;
+            inherit (self.packages.${system}) test-grammars;
+          };
+        }
+        // (lib.mapAttrs' (arch: pkg: {
+          name = "cli-${arch}";
+          value = pkg.callPackage ./crates/cli/package.nix {
+            inherit src version;
+            inherit (self.packages.${system}) test-grammars;
+          };
+        }) crossTargets)
+        // (lib.mapAttrs' (arch: pkg: {
+          name = "lib-${arch}";
+          value = pkg.callPackage ./lib/package.nix {
+            inherit src version;
+          };
+        }) crossTargets)
+      );
+
+      apps = eachSystem (
+        system:
+        let
+          pkgs = pkgsFor.${system};
+        in
+        {
+          default = self.apps.${system}.cli;
+
+          cli = {
+            type = "app";
+            program = "${lib.getExe self.packages.${system}.cli}";
+            meta.description = "Tree-sitter CLI for developing, testing, and using parsers";
+          };
+
+          docs = {
+            type = "app";
+            program = lib.getExe (
+              pkgs.writeShellScriptBin "docs" ''
                 echo "📚 Serving documentation at http://localhost:3000"
-                cd docs && ${pkgs.mdbook}/bin/mdbook serve
-              ''}";
-              meta.description = "Serve Tree-sitter documentation locally";
-            };
-
-            format = {
-              type = "app";
-              program = toString (
-                pkgs.writeShellScript "format-all" ''
-                  set -e
-                  echo "Formatting..."
-                  echo ""
-                  echo "→ Rust..."
-                  ${pkgs.cargo}/bin/cargo fmt --all
-                  echo "→ Nix..."
-                  ${pkgs.nixfmt-rfc-style}/bin/nixfmt *.nix crates/cli/*.nix lib/*.nix lib/binding_web/*.nix docs/*.nix
-                  echo "→ Web (TypeScript/JavaScript)..."
-                  cd lib/binding_web && ${pkgs.nodejs_22}/bin/npm install --silent && ${pkgs.nodejs_22}/bin/npm run lint:fix
-                  cd ../..
-                  echo ""
-                  echo "Formatting complete"
-                ''
-              );
-              meta.description = "Format all Rust and Nix code";
-            };
-
-            lint = {
-              type = "app";
-              program = toString (
-                pkgs.writeShellScript "lint-all" ''
-                  set -e
-                  echo "Linting code..."
-                  echo ""
-                  echo "→ Checking Rust formatting..."
-                  ${pkgs.cargo}/bin/cargo fmt --all --check
-                  echo "→ Running clippy..."
-                  ${pkgs.cargo}/bin/cargo clippy --workspace --all-targets -- -D warnings
-                  echo "→ Checking Nix formatting..."
-                  ${pkgs.nixfmt-rfc-style}/bin/nixfmt --check *.nix crates/cli/*.nix lib/*.nix lib/binding_web/*.nix docs/*.nix
-                  echo "→ Checking Web code..."
-                  cd lib/binding_web && ${pkgs.nodejs_22}/bin/npm install --silent && ${pkgs.nodejs_22}/bin/npm run lint
-                  cd ../..
-                  echo ""
-                  echo "Linting complete"
-                ''
-              );
-              meta.description = "Run all linting checks";
-            };
+                cd docs && ${lib.getExe pkgs.mdbook} serve
+              ''
+            );
+            meta.description = "Serve Tree-sitter documentation locally";
           };
 
-          checks = {
-            inherit (self'.packages)
-              cli
-              lib
-              web-tree-sitter
-              web-lint
-              rust-fmt
-              rust-clippy
-              ;
-
-            nix-fmt =
-              pkgs.runCommand "nix-fmt-check"
-                {
-                  nativeBuildInputs = [ pkgs.nixfmt-rfc-style ];
-                }
-                ''
-                  cd ${src}
-                  nixfmt --check *.nix crates/cli/*.nix lib/*.nix lib/binding_web/*.nix docs/*.nix
-                  touch $out
-                '';
+          format = {
+            type = "app";
+            program = lib.getExe (
+              pkgs.writeShellScriptBin "format-all" ''
+                set -e
+                echo "Formatting..."
+                echo ""
+                echo "→ Rust..."
+                ${lib.getExe pkgs.cargo} fmt --all
+                echo "→ Nix..."
+                ${lib.getExe pkgs.nixfmt} ${filesWithExtension "nix"}
+                echo "→ Web (TypeScript/JavaScript)..."
+                cd lib/binding_web && ${pkgs.nodejs_22}/bin/npm install --silent && ${pkgs.nodejs_22}/bin/npm run lint:fix
+                cd ../..
+                echo ""
+                echo "Formatting complete"
+              ''
+            );
+            meta.description = "Format all Rust and Nix code";
           };
 
-          formatter = pkgs.nixfmt-rfc-style;
+          lint = {
+            type = "app";
+            program = lib.getExe (
+              pkgs.writeShellScriptBin "lint-all" ''
+                set -e
+                echo "Linting code..."
+                echo ""
+                echo "→ Checking Rust formatting..."
+                ${lib.getExe pkgs.cargo} fmt --all --check
+                echo "→ Running clippy..."
+                ${lib.getExe pkgs.cargo} clippy --workspace --all-targets -- -D warnings
+                echo "→ Checking Nix formatting..."
+                ${lib.getExe pkgs.nixfmt} --check ${filesWithExtension "nix"}
+                echo "→ Checking Web code..."
+                cd lib/binding_web && ${lib.getExe' pkgs.nodejs_22 "npm"} install --silent && ${lib.getExe' pkgs.nodejs_22 "npm"} run lint
+                cd ../..
+                echo ""
+                echo "Linting complete"
+              ''
+            );
+            meta.description = "Run all linting checks";
+          };
+        }
+      );
 
-          devShells.default = pkgs.mkShell {
-            buildInputs = [
-              pkgs.cargo
-              pkgs.rustc
-              pkgs.clippy
-              pkgs.rust-analyzer
-              pkgs.rustfmt
-              pkgs.cargo-cross
+      checks = eachSystem (
+        system:
+        let
+          pkgs = pkgsFor.${system};
+        in
+        {
+          inherit (self.packages.${system})
+            cli
+            lib
+            web-tree-sitter
+            ;
 
-              pkgs.cmake
-              pkgs.gnumake
-              pkgs.pkg-config
-              pkgs.clang
-              pkgs.libclang
+          nix-fmt = pkgs.runCommandNoCC "nix-fmt-check" { } ''
+            ${lib.getExe self.formatter.${system}} --check ${filesWithExtension "nix"}
+            touch $out
+          '';
+          rust-fmt = pkgs.runCommandNoCC "rust-fmt-check" { } ''
+            ${lib.getExe pkgs.rustfmt} --check
+            touch $out
+          '';
 
-              pkgs.nodejs_22
-              pkgs.nodePackages.typescript
-              pkgs.emscripten
-              pkgs.pkgsCross.wasi32.stdenv.cc
+          rust-clippy = pkgs.rustPlatform.buildRustPackage {
+            inherit src version;
 
-              pkgs.mdbook
-              pkgs.mdbook-admonish
+            pname = "rust-clippy-check";
 
-              pkgs.git
-              pkgs.nixfmt-rfc-style
+            cargoLock.lockFile = ./Cargo.lock;
+
+            nativeBuildInputs = with pkgs; [
+              pkg-config
+              clippy
+              cmake
+              clang
+              libclang
+            ];
+
+            buildPhase = ''
+              export HOME=$TMPDIR
+              export LIBCLANG_PATH="${pkgs.libclang.lib}/lib"
+              cargo xtask clippy
+            '';
+
+            installPhase = ''
+              touch $out
+            '';
+
+            doCheck = false;
+          };
+
+          web-lint = pkgs.buildNpmPackage {
+            inherit src version;
+
+            pname = "web-tree-sitter-lint";
+
+            npmDepsHash = "sha256-y0GobcskcZTmju90TM64GjeWiBmPFCrTOg0yfccdB+Q=";
+
+            postPatch = ''
+              cp lib/binding_web/package{,-lock}.json .
+            '';
+
+            buildPhase = ''
+              cd lib/binding_web
+              npm run lint
+            '';
+
+            installPhase = ''
+              touch $out
+            '';
+
+            meta.description = "Lint check for web-tree-sitter TypeScript/JavaScript code";
+          };
+        }
+      );
+
+      formatter = eachSystem (system: pkgsFor.${system}.nixfmt);
+
+      devShells = eachSystem (
+        system:
+        let
+          pkgs = pkgsFor.${system};
+        in
+        {
+          default = pkgs.mkShell {
+            buildInputs = with pkgs; [
+              cargo
+              rustc
+              clippy
+              rust-analyzer
+              rustfmt
+              cargo-cross
+
+              cmake
+              gnumake
+              pkg-config
+              clang
+              libclang
+
+              nodejs_22
+              nodePackages.typescript
+              emscripten
+              pkgsCross.wasi32.stdenv.cc
+
+              mdbook
+              mdbook-admonish
+
+              git
+              nixfmt
             ];
 
             shellHook = ''
@@ -311,9 +389,13 @@
               echo "Version: ${version}"
             '';
 
-            RUST_BACKTRACE = 1;
-            LIBCLANG_PATH = "${pkgs.libclang.lib}/lib";
+            env = {
+              RUST_BACKTRACE = 1;
+              LIBCLANG_PATH = "${pkgs.libclang.lib}/lib";
+              TREE_SITTER_WASI_SDK_PATH = "${pkgs.pkgsCross.wasi32.stdenv.cc}";
+            };
           };
-        };
+        }
+      );
     };
 }
diff --git a/lib/binding_web/flake.nix b/lib/binding_web/flake.nix
deleted file mode 100644
index 7ceb3fce..00000000
--- a/lib/binding_web/flake.nix
+++ /dev/null
@@ -1,158 +0,0 @@
-{
-  perSystem =
-    {
-      self',
-      pkgs,
-      lib,
-      src,
-      version,
-      ...
-    }:
-    let
-      grammars = [
-        "bash"
-        "c"
-        "cpp"
-        "embedded-template"
-        "html"
-        "javascript"
-        "json"
-        "python"
-        "rust"
-        "typescript"
-      ];
-
-      wasmTestGrammars = pkgs.stdenv.mkDerivation {
-        inherit src version;
-
-        pname = "wasm-test-grammars";
-
-        nativeBuildInputs = [
-          self'.packages.cli
-          pkgs.pkgsCross.wasi32.stdenv.cc
-          pkgs.nodejs_22
-        ];
-
-        buildPhase = ''
-          export HOME=$TMPDIR
-          export TREE_SITTER_WASI_SDK_PATH=${pkgs.pkgsCross.wasi32.stdenv.cc}
-          export NIX_LDFLAGS=""
-
-          cp -r ${self'.packages.test-grammars}/fixtures .
-          chmod -R u+w fixtures
-
-          for grammar in ${lib.concatStringsSep " " grammars}; do
-            if [ -d "fixtures/grammars/$grammar" ]; then
-              echo "Building WASM for $grammar"
-
-              if [ "$grammar" = "typescript" ]; then
-                tree-sitter build --wasm -o "tree-sitter-typescript.wasm" "fixtures/grammars/$grammar/typescript"
-                tree-sitter build --wasm -o "tree-sitter-tsx.wasm" "fixtures/grammars/$grammar/tsx"
-              else
-                tree-sitter build --wasm -o "tree-sitter-$grammar.wasm" "fixtures/grammars/$grammar"
-              fi
-            fi
-          done
-        '';
-
-        installPhase = ''
-          mkdir -p $out
-          for wasm in *.wasm; do
-            if [ -f "$wasm" ]; then
-              echo "Installing $wasm"
-              cp "$wasm" $out/
-            fi
-          done
-        '';
-      };
-    in
-    {
-      packages = {
-        web-tree-sitter = pkgs.buildNpmPackage {
-          inherit src version;
-
-          pname = "web-tree-sitter";
-
-          npmDepsHash = "sha256-y0GobcskcZTmju90TM64GjeWiBmPFCrTOg0yfccdB+Q=";
-
-          nativeBuildInputs = [
-            pkgs.rustPlatform.cargoSetupHook
-            pkgs.cargo
-            pkgs.pkg-config
-            pkgs.emscripten
-          ];
-
-          cargoDeps = pkgs.rustPlatform.importCargoLock {
-            lockFile = ../../Cargo.lock;
-          };
-
-          doCheck = true;
-
-          postPatch = ''
-            cp lib/binding_web/package{,-lock}.json .
-          '';
-
-          buildPhase = ''
-            cd lib/binding_web
-            CJS=true npm run build
-            CJS=true npm run build:debug
-            npm run build:debug
-            npm run build
-          '';
-
-          checkPhase = ''
-            cd ../../
-            mkdir -p target/release
-
-            for grammar in ${wasmTestGrammars}/*.wasm; do
-              if [ -f "$grammar" ]; then
-                cp "$grammar" target/release/
-              fi
-            done
-
-            cd lib/binding_web && npm test
-          '';
-
-          meta = {
-            description = "web-tree-sitter - WebAssembly bindings to the Tree-sitter parsing library.";
-            longDescription = ''
-              web-tree-sitter provides WebAssembly bindings to the Tree-sitter parsing library.
-              It can build a concrete syntax tree for a source file and efficiently update
-              the syntax tree as the source file is edited. This package provides the WebAssembly bindings
-              and a JavaScript API for using them in web browsers
-            '';
-            homepage = "https://tree-sitter.github.io/tree-sitter";
-            changelog = "https://github.com/tree-sitter/tree-sitter/releases/tag/v${version}";
-            license = lib.licenses.mit;
-            maintainers = [ lib.maintainers.amaanq ];
-            platforms = lib.platforms.all;
-          };
-        };
-
-        web-lint = pkgs.buildNpmPackage {
-          inherit src version;
-
-          pname = "web-tree-sitter-lint";
-
-          npmDepsHash = "sha256-y0GobcskcZTmju90TM64GjeWiBmPFCrTOg0yfccdB+Q=";
-
-          postPatch = ''
-            cp lib/binding_web/package{,-lock}.json .
-          '';
-
-          buildPhase = ''
-            cd lib/binding_web
-            npm run lint
-          '';
-
-          installPhase = ''
-            touch $out
-          '';
-
-          meta = {
-            description = "Lint check for web-tree-sitter TypeScript/JavaScript code";
-          };
-        };
-      };
-    };
-}
diff --git a/lib/binding_web/package.nix b/lib/binding_web/package.nix
new file mode 100644
index 00000000..83f286b5
--- /dev/null
+++ b/lib/binding_web/package.nix
@@ -0,0 +1,73 @@
+{
+  wasm-test-grammars,
+  lib,
+  buildNpmPackage,
+  rustPlatform,
+  cargo,
+  pkg-config,
+  emscripten,
+  src,
+  version,
+}:
+buildNpmPackage {
+  inherit src version;
+
+  pname = "web-tree-sitter";
+
+  npmDepsHash = "sha256-y0GobcskcZTmju90TM64GjeWiBmPFCrTOg0yfccdB+Q=";
+
+  nativeBuildInputs = [
+    rustPlatform.cargoSetupHook
+    cargo
+    pkg-config
+    emscripten
+  ];
+
+  cargoDeps = rustPlatform.importCargoLock {
+    lockFile = ../../Cargo.lock;
+  };
+
+  doCheck = true;
+
+  postPatch = ''
+    cp lib/binding_web/package{,-lock}.json .
+  '';
+
+  buildPhase = ''
+    pushd lib/binding_web
+
+    CJS=true npm run build
+    CJS=true npm run build:debug
+    npm run build:debug
+    npm run build
+
+    popd
+
+    mkdir -p target/release
+
+    for grammar in ${wasm-test-grammars}/*.wasm; do
+      if [ -f "$grammar" ]; then
+        cp "$grammar" target/release/
+      fi
+    done
+  '';
+
+  checkPhase = ''
+    cd lib/binding_web && npm test
+  '';
+
+  meta = {
+    description = "web-tree-sitter - WebAssembly bindings to the Tree-sitter parsing library.";
+    longDescription = ''
+      web-tree-sitter provides WebAssembly bindings to the Tree-sitter parsing library.
+      It can build a concrete syntax tree for a source file and efficiently update
+      the syntax tree as the source file is edited. This package provides the WebAssembly bindings
+      and a JavaScript API for using them in web browsers
+    '';
+    homepage = "https://tree-sitter.github.io/tree-sitter";
+    changelog = "https://github.com/tree-sitter/tree-sitter/releases/tag/v${version}";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ amaanq ];
+    platforms = lib.platforms.all;
+  };
+}
diff --git a/lib/binding_web/wasm-test-grammars.nix b/lib/binding_web/wasm-test-grammars.nix
new file mode 100644
index 00000000..536359d3
--- /dev/null
+++ b/lib/binding_web/wasm-test-grammars.nix
@@ -0,0 +1,67 @@
+{
+  cli,
+  lib,
+  nodejs_22,
+  pkgsCross,
+  src,
+  stdenv,
+  test-grammars,
+  version,
+}:
+let
+  grammars = [
+    "bash"
+    "c"
+    "cpp"
+    "embedded-template"
+    "html"
+    "javascript"
+    "json"
+    "python"
+    "rust"
+    "typescript"
+  ];
+in
+stdenv.mkDerivation {
+  inherit src version;
+
+  pname = "wasm-test-grammars";
+
+  nativeBuildInputs = [
+    cli
+    pkgsCross.wasi32.stdenv.cc
+    nodejs_22
+  ];
+
+  buildPhase = ''
+    export HOME=$TMPDIR
+    export TREE_SITTER_WASI_SDK_PATH=${pkgsCross.wasi32.stdenv.cc}
+    export NIX_LDFLAGS=""
+
+    cp -r ${test-grammars}/fixtures .
+    chmod -R u+w fixtures
+
+    for grammar in ${lib.concatStringsSep " " grammars}; do
+      if [ -d "fixtures/grammars/$grammar" ]; then
+        echo "Building WASM for $grammar"
+
+        if [ "$grammar" = "typescript" ]; then
+          tree-sitter build --wasm -o "tree-sitter-typescript.wasm" "fixtures/grammars/$grammar/typescript"
+          tree-sitter build --wasm -o "tree-sitter-tsx.wasm" "fixtures/grammars/$grammar/tsx"
+        else
+          tree-sitter build --wasm -o "tree-sitter-$grammar.wasm" "fixtures/grammars/$grammar"
+        fi
+      fi
+    done
+  '';
+
+  installPhase = ''
+    mkdir -p $out
+    for wasm in *.wasm; do
+      if [ -f "$wasm" ]; then
+        echo "Installing $wasm"
+        cp "$wasm" $out/
+      fi
+    done
+  '';
+}
diff --git a/lib/flake.nix b/lib/flake.nix
deleted file mode 100644
index cf49e4c0..00000000
--- a/lib/flake.nix
+++ /dev/null
@@ -1,68 +0,0 @@
-{
-  perSystem =
-    {
-      pkgs,
-      lib,
-      src,
-      version,
-      crossTargets,
-      ...
-    }:
-    let
-      buildLibFor =
-        targetPkgs:
-        let
-          isCross = targetPkgs.stdenv.hostPlatform != pkgs.stdenv.buildPlatform;
-        in
-        targetPkgs.stdenv.mkDerivation {
-          inherit src version;
-
-          pname = "tree-sitter";
-
-          nativeBuildInputs = [
-            targetPkgs.cmake
-            targetPkgs.pkg-config
-          ];
-
-          sourceRoot = "source/lib";
-
-          cmakeFlags = [
-            "-DBUILD_SHARED_LIBS=ON"
-            "-DCMAKE_INSTALL_LIBDIR=lib"
-            "-DCMAKE_INSTALL_INCLUDEDIR=include"
-            "-DTREE_SITTER_FEATURE_WASM=OFF"
-          ];
-
-          enableParallelBuilding = true;
-
-          postInstall = ''
-            mkdir -p $out/{lib/pkgconfig,share/tree-sitter}
-            substituteInPlace $out/lib/pkgconfig/tree-sitter.pc \
-              --replace-fail "\''${prefix}" "$out" 2>/dev/null
-          '';
-
-          meta = {
-            description = "Tree-sitter incremental parsing library";
-            longDescription = ''
-              Tree-sitter is a parser generator tool and an incremental parsing library.
-              It can build a concrete syntax tree for a source file and efficiently update
-              the syntax tree as the source file is edited. This package provides the core
-              C library that can be used to parse source code using Tree-sitter grammars.
-            '';
-            homepage = "https://tree-sitter.github.io/tree-sitter";
-            changelog = "https://github.com/tree-sitter/tree-sitter/releases/tag/v${version}";
-            license = lib.licenses.mit;
-            maintainers = [ lib.maintainers.amaanq ];
-            platforms = lib.platforms.all;
-          };
-        };
-
-      crossPackages = lib.mapAttrs (name: targetPkgs: buildLibFor targetPkgs) crossTargets;
-    in
-    {
-      packages = {
-        lib = buildLibFor pkgs;
-      }
-      // (lib.mapAttrs' (name: pkg: lib.nameValuePair "lib-${name}" pkg) crossPackages);
-    };
-}
diff --git a/lib/package.nix b/lib/package.nix
new file mode 100644
index 00000000..2b59ae9a
--- /dev/null
+++ b/lib/package.nix
@@ -0,0 +1,49 @@
+{
+  stdenv,
+  cmake,
+  pkg-config,
+  src,
+  version,
+  lib,
+}:
+stdenv.mkDerivation {
+  inherit src version;
+  pname = "tree-sitter";
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+  ];
+
+  sourceRoot = "source/lib";
+
+  cmakeFlags = [
+    "-DBUILD_SHARED_LIBS=ON"
+    "-DCMAKE_INSTALL_LIBDIR=lib"
+    "-DCMAKE_INSTALL_INCLUDEDIR=include"
+    "-DTREE_SITTER_FEATURE_WASM=OFF"
+  ];
+
+  enableParallelBuilding = true;
+
+  postInstall = ''
+    mkdir -p $out/{lib/pkgconfig,share/tree-sitter}
+    substituteInPlace $out/lib/pkgconfig/tree-sitter.pc \
+      --replace-fail "\''${prefix}" "$out" 2>/dev/null
+  '';
+
+  meta = {
+    description = "Tree-sitter incremental parsing library";
+    longDescription = ''
+      Tree-sitter is a parser generator tool and an incremental parsing library.
+      It can build a concrete syntax tree for a source file and efficiently update
+      the syntax tree as the source file is edited. This package provides the core
+      C library that can be used to parse source code using Tree-sitter grammars.
+    '';
+    homepage = "https://tree-sitter.github.io/tree-sitter";
+    changelog = "https://github.com/tree-sitter/tree-sitter/releases/tag/v${version}";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.amaanq ];
+    platforms = lib.platforms.all;
+  };
+}

From 6451d2f65d6690664c6b4e90cceab72097cc32a2 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Tue, 9 Sep 2025 01:41:29 -0400
Subject: [PATCH 423/663] fix(web): correct metadata function

---
 lib/binding_web/lib/exports.txt          | 2 +-
 lib/binding_web/lib/web-tree-sitter.d.ts | 2 +-
 lib/binding_web/src/language.ts          | 5 ++---
 3 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/lib/binding_web/lib/exports.txt b/lib/binding_web/lib/exports.txt
index eb6f5420..7b3b4270 100644
--- a/lib/binding_web/lib/exports.txt
+++ b/lib/binding_web/lib/exports.txt
@@ -13,7 +13,7 @@
 "ts_language_name",
 "ts_language_version",
 "ts_language_abi_version",
-"ts_language_metadata",
+"ts_language_metadata_wasm",
 "ts_language_next_state",
 "ts_node_field_name_for_child_wasm",
 "ts_node_field_name_for_named_child_wasm",
diff --git a/lib/binding_web/lib/web-tree-sitter.d.ts b/lib/binding_web/lib/web-tree-sitter.d.ts
index 852f0041..c8b7c70a 100644
--- a/lib/binding_web/lib/web-tree-sitter.d.ts
+++ b/lib/binding_web/lib/web-tree-sitter.d.ts
@@ -58,7 +58,6 @@ interface WasmModule {
   _ts_language_state_count(_0: number): number;
   _ts_language_version(_0: number): number;
   _ts_language_abi_version(_0: number): number;
-  _ts_language_metadata(_0: number): number;
   _ts_language_name(_0: number): number;
   _ts_language_field_count(_0: number): number;
   _ts_language_next_state(_0: number, _1: number, _2: number): number;
@@ -106,6 +105,7 @@ interface WasmModule {
   _ts_parser_included_ranges_wasm(_0: number): void;
   _ts_language_type_is_named_wasm(_0: number, _1: number): number;
   _ts_language_type_is_visible_wasm(_0: number, _1: number): number;
+  _ts_language_metadata_wasm(_0: number): void;
   _ts_language_supertypes_wasm(_0: number): void;
   _ts_language_subtypes_wasm(_0: number, _1: number): void;
   _ts_tree_root_node_wasm(_0: number): void;
diff --git a/lib/binding_web/src/language.ts b/lib/binding_web/src/language.ts
index 4c4dec1a..ea305836 100644
--- a/lib/binding_web/src/language.ts
+++ b/lib/binding_web/src/language.ts
@@ -84,11 +84,10 @@ export class Language {
   * the language's `tree-sitter.json` file.
   */
   get metadata(): LanguageMetadata | null {
-    C._ts_language_metadata(this[0]);
+    C._ts_language_metadata_wasm(this[0]);
     const length = C.getValue(TRANSFER_BUFFER, 'i32');
-    const address = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32');
     if (length === 0) return null;
-    return unmarshalLanguageMetadata(address);
+    return unmarshalLanguageMetadata(TRANSFER_BUFFER + SIZE_OF_INT);
   }
 
   /**

From 40a8678989061a7adeab562a3cd7ab20978c3518 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Tue, 9 Sep 2025 01:42:06 -0400
Subject: [PATCH 424/663] refactor(xtask): don't use docker to run wasi-sdk's
 clang

This now relies on TREE_SITTER_WASI_SDK_PATH being set
---
 crates/xtask/src/build_wasm.rs | 56 ++++++++++++++++++++++++++--------
 1 file changed, 43 insertions(+), 13 deletions(-)

diff --git a/crates/xtask/src/build_wasm.rs b/crates/xtask/src/build_wasm.rs
index d42eae6f..62e6c95b 100644
--- a/crates/xtask/src/build_wasm.rs
+++ b/crates/xtask/src/build_wasm.rs
@@ -8,7 +8,7 @@ use std::{
     time::Duration,
 };
 
-use anyhow::{anyhow, Result};
+use anyhow::{anyhow, Error, Result};
 use indoc::indoc;
 use notify::{
     event::{AccessKind, AccessMode},
@@ -308,24 +308,55 @@ fn build_wasm(cmd: &mut Command, edit_tsd: bool) -> Result<()> {
     Ok(())
 }
 
+/// This gets the path to the `clang` binary in the WASI SDK specified by the
+/// `TREE_SITTER_WASI_SDK_PATH` environment variable.
+fn get_wasi_binary() -> Result {
+    let possible_executables = if cfg!(windows) {
+        vec![
+            "clang.exe",
+            "wasm32-unknown-wasi-clang.exe",
+            "wasm32-wasi-clang.exe",
+        ]
+    } else {
+        vec!["clang", "wasm32-unknown-wasi-clang", "wasm32-wasi-clang"]
+    };
+
+    if let Ok(wasi_sdk_path) = std::env::var("TREE_SITTER_WASI_SDK_PATH") {
+        let wasi_sdk_dir = PathBuf::from(wasi_sdk_path);
+
+        for exe in &possible_executables {
+            let clang_exe = wasi_sdk_dir.join("bin").join(exe);
+            if clang_exe.exists() {
+                return Ok(clang_exe);
+            }
+        }
+
+        return Err(anyhow!(
+                "TREE_SITTER_WASI_SDK_PATH is set to '{}', but no clang executable found in 'bin/' directory. \
+                 Looked for: {}",
+                wasi_sdk_dir.display(),
+                possible_executables.join(", ")
+            ));
+    }
+
+    Err(anyhow!(
+        "TREE_SITTER_WASI_SDK_PATH environment variable is not set. \
+         Please install the WASI SDK from https://github.com/WebAssembly/wasi-sdk/releases \
+         and set TREE_SITTER_WASI_SDK_PATH to the installation directory."
+    ))
+}
+
 pub fn run_wasm_stdlib() -> Result<()> {
     let export_flags = include_str!("../../../lib/src/wasm/stdlib-symbols.txt")
         .lines()
         .map(|line| format!("-Wl,--export={}", &line[1..line.len() - 2]))
         .collect::>();
 
-    let mut command = Command::new("docker");
+    let clang_exe = get_wasi_binary()?;
+    println!("Using WASI clang at: {}", clang_exe.display());
 
-    let output = command
+    let output = Command::new(&clang_exe)
         .args([
-            "run",
-            "--rm",
-            "-v",
-            format!("{}:/src", std::env::current_dir().unwrap().display()).as_str(),
-            "-w",
-            "/src",
-            "ghcr.io/webassembly/wasi-sdk",
-            "/opt/wasi-sdk/bin/clang",
             "-o",
             "stdlib.wasm",
             "-Os",
@@ -338,11 +369,10 @@ pub fn run_wasm_stdlib() -> Result<()> {
             "-Wl,--import-memory",
             "-Wl,--import-table",
             "-Wl,--strip-debug",
-            "-Wl,--export=reset_heap",
             "-Wl,--export=__wasm_call_ctors",
             "-Wl,--export=__stack_pointer",
         ])
-        .args(export_flags)
+        .args(&export_flags)
         .arg("lib/src/wasm/stdlib.c")
         .output()?;
 

From 907c7bc80b64a5495c8cde329e9834f15c4328f7 Mon Sep 17 00:00:00 2001
From: Amaan Qureshi 
Date: Tue, 9 Sep 2025 01:41:18 -0400
Subject: [PATCH 425/663] docs(playground): add version information in
 playground

Co-authored-by: Will Lillis 
---
 crates/cli/src/playground.html     | 30 ++++++++++-
 docs/src/7-playground.md           | 85 ++++++++++++++++--------------
 docs/src/assets/css/playground.css | 18 +++++++
 docs/src/assets/js/playground.js   | 10 ++++
 4 files changed, 102 insertions(+), 41 deletions(-)

diff --git a/crates/cli/src/playground.html b/crates/cli/src/playground.html
index ecf7efc4..a52815ac 100644
--- a/crates/cli/src/playground.html
+++ b/crates/cli/src/playground.html
@@ -84,7 +84,8 @@
       gap: 8px;
     }
 
-    .language-name {
+    .language-name,
+    #language-version {
       font-weight: 600;
     }
 
@@ -151,6 +152,9 @@
       font-size: 14px;
       border-bottom: 1px solid var(--border-color);
       background-color: var(--panel-bg);
+      display: flex;
+      align-items: center;
+      gap: 8px;
     }
 
     .CodeMirror {
@@ -275,6 +279,29 @@
       text-decoration: underline;
     }
 
+    #copy-button {
+      background: none;
+      border: 1px solid var(--border-color);
+      border-radius: 4px;
+      padding: 6px;
+      cursor: pointer;
+      color: var(--text-color);
+      display: inline-flex;
+      align-items: center;
+      justify-content: center;
+      margin-left: 8px;
+    }
+
+    #copy-button:hover {
+      background-color: var(--primary-color-alpha);
+    }
+
+    #copy-button:focus {
+      outline: none;
+      border-color: var(--primary-color);
+      box-shadow: 0 0 0 2px var(--primary-color-alpha);
+    }
+
     /* Dark Theme Node Colors */
     [data-theme="dark"] {
       & #output-container a {
@@ -324,6 +351,7 @@
     
Language: THE_LANGUAGE_NAME +
diff --git a/docs/src/7-playground.md b/docs/src/7-playground.md index 1d728e98..c0e5d736 100644 --- a/docs/src/7-playground.md +++ b/docs/src/7-playground.md @@ -7,47 +7,52 @@

Code

-
- -
-
Bash
-
C
-
C++
-
C#
-
Go
-
HTML
-
Java
-
JavaScript
-
PHP
-
Python
-
Ruby
-
Rust
-
TOML
-
TypeScript
-
YAML
+
+
+ +
+
Bash
+
C
+
C++
+
C#
+
Go
+
HTML
+
Java
+
JavaScript
+
PHP
+
Python
+
Ruby
+
Rust
+
TOML
+
TypeScript
+
YAML
+
+ +
+ +
-
diff --git a/docs/src/assets/css/playground.css b/docs/src/assets/css/playground.css index 45236937..48228490 100644 --- a/docs/src/assets/css/playground.css +++ b/docs/src/assets/css/playground.css @@ -54,6 +54,23 @@ display: inline-block; } +.language-container { + display: flex; + align-items: center; + gap: 16px; + margin-bottom: 16px; +} + +#language-version { + color: var(--light-text); + font-size: 14px; + font-weight: 500; + padding: 4px 8px; + background: var(--light-bg); + border-radius: 4px; + border: 1px solid var(--light-border); +} + #language-select { background-color: var(--light-bg); border: 1px solid var(--light-border); @@ -264,6 +281,7 @@ input[type="checkbox"]:focus { .coal, .navy { + & #language-version, & #language-select, & .select-button { background-color: var(--dark-bg); diff --git a/docs/src/assets/js/playground.js b/docs/src/assets/js/playground.js index 7c4e7bd2..3a8904cc 100644 --- a/docs/src/assets/js/playground.js +++ b/docs/src/assets/js/playground.js @@ -106,6 +106,7 @@ window.initializePlayground = async (opts) => { const codeInput = document.getElementById("code-input"); const languageSelect = document.getElementById("language-select"); + const languageVersion = document.getElementById('language-version'); const loggingCheckbox = document.getElementById("logging-checkbox"); const anonymousNodes = document.getElementById('anonymous-nodes-checkbox'); const outputContainer = document.getElementById("output-container"); @@ -205,6 +206,15 @@ window.initializePlayground = async (opts) => { tree = null; languageName = newLanguageName; + + const metadata = languagesByName[languageName].metadata; + if (metadata) { + languageVersion.textContent = `v${metadata.major_version}.${metadata.minor_version}.${metadata.patch_version}`; + languageVersion.style.visibility = 'visible'; + } else { + languageVersion.style.visibility = 'hidden'; + } + parser.setLanguage(languagesByName[newLanguageName]); handleCodeChange(); handleQueryChange(); From 3c1f02a7f9715029a2ad1778c00e93717192f234 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Tue, 9 Sep 2025 02:11:58 -0400 Subject: [PATCH 426/663] docs(playground): show toast when tree is copied --- crates/cli/src/playground.html | 36 +++++++++++++++- docs/src/7-playground.md | 8 +++- docs/src/assets/css/playground.css | 66 ++++++++++++++++++++++++++++++ docs/src/assets/js/playground.js | 22 +++++++++- 4 files changed, 128 insertions(+), 4 deletions(-) diff --git a/crates/cli/src/playground.html b/crates/cli/src/playground.html index a52815ac..db3b6aec 100644 --- a/crates/cli/src/playground.html +++ b/crates/cli/src/playground.html @@ -302,6 +302,29 @@ box-shadow: 0 0 0 2px var(--primary-color-alpha); } + .toast { + position: fixed; + bottom: 20px; + right: 20px; + background-color: var(--light-text); + color: white; + padding: 12px 16px; + border-radius: 6px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); + font-size: 14px; + font-weight: 500; + opacity: 0; + transform: translateY(20px); + transition: all 0.3s ease; + z-index: 1000; + pointer-events: none; + } + + .toast.show { + opacity: 1; + transform: translateY(0); + } + /* Dark Theme Node Colors */ [data-theme="dark"] { & #output-container a { @@ -342,6 +365,11 @@ & .CodeMirror-selected { background-color: rgba(255, 255, 255, 0.1) !important; } + + & .toast { + background-color: var(--dark-bg); + color: var(--dark-text); + } } @@ -417,7 +445,13 @@
Tree - +

       
diff --git a/docs/src/7-playground.md b/docs/src/7-playground.md index c0e5d736..81c61805 100644 --- a/docs/src/7-playground.md +++ b/docs/src/7-playground.md @@ -77,7 +77,13 @@

Tree - +

diff --git a/docs/src/assets/css/playground.css b/docs/src/assets/css/playground.css index 48228490..ab59ebec 100644 --- a/docs/src/assets/css/playground.css +++ b/docs/src/assets/css/playground.css @@ -86,6 +86,53 @@ background-position: right 8px center; } +#copy-button { + background: none; + border: 1px solid var(--light-border); + border-radius: 4px; + padding: 6px; + cursor: pointer; + color: var(--light-text); + display: inline-flex; + align-items: center; + justify-content: center; + margin-left: 8px; +} + +#copy-button:hover { + background-color: var(--primary-color-alpha); + border-color: var(--light-hover-border); +} + +#copy-button:focus { + outline: none; + border-color: var(--primary-color); + box-shadow: 0 0 0 2px var(--primary-color-alpha); +} + +.toast { + position: fixed; + bottom: 20px; + right: 20px; + background-color: var(--lighbt-bg); + color: var(--light-text); + padding: 12px 16px; + border-radius: 6px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); + font-size: 14px; + font-weight: 500; + opacity: 0; + transform: translateY(20px); + transition: all 0.3s ease; + z-index: 1000; + pointer-events: none; +} + +.toast.show { + opacity: 1; + transform: translateY(0); +} + .select-button { background-color: var(--light-bg); border: 1px solid var(--light-border); @@ -283,12 +330,31 @@ input[type="checkbox"]:focus { & #language-version, & #language-select, + & #copy-button, & .select-button { background-color: var(--dark-bg); border-color: var(--dark-border); color: var(--dark-text); } + & #copy-button:hover, + & #language-select:hover, + & .select-button:hover { + border-color: var(--dark-border); + background-color: var(--primary-color-alpha-dark); + } + + & .toast { + background-color: var(--dark-bg); + color: var(--dark-text); + } + + #language-select:focus, + & .select-button:focus { + border-color: #79c0ff; + box-shadow: 0 0 0 2px var(--primary-color-alpha-dark); + } + & input[type="checkbox"] { border-color: var(--dark-border); background-color: var(--dark-bg); diff --git a/docs/src/assets/js/playground.js b/docs/src/assets/js/playground.js index 3a8904cc..5d167215 100644 --- a/docs/src/assets/js/playground.js +++ b/docs/src/assets/js/playground.js @@ -128,8 +128,6 @@ window.initializePlayground = async (opts) => { const parser = new Parser(); - console.log(parser, codeInput, queryInput); - const codeEditor = CodeMirror.fromTextArea(codeInput, { lineNumbers: true, showCursorWhenSelecting: true @@ -517,6 +515,7 @@ window.initializePlayground = async (opts) => { selection.addRange(range); navigator.clipboard.writeText(selection.toString()); selection.removeRange(range); + showToast('Tree copied to clipboard!'); } function handleTreeClick(event) { @@ -642,4 +641,23 @@ window.initializePlayground = async (opts) => { if (callNow) func.apply(context, args); }; } + + function showToast(message) { + const existingToast = document.querySelector('.toast'); + if (existingToast) { + existingToast.remove(); + } + + const toast = document.createElement('div'); + toast.className = 'toast'; + toast.textContent = message; + document.body.appendChild(toast); + + setTimeout(() => toast.classList.add('show'), 50); + + setTimeout(() => { + toast.classList.remove('show'); + setTimeout(() => toast.remove(), 200); + }, 1000); + } }; From 57e2f41f42ef9ebfd459d2395bd557b759477625 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 21:05:42 +0000 Subject: [PATCH 427/663] build(deps): bump vite from 7.1.3 to 7.1.5 in /lib/binding_web Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.3 to 7.1.5. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.1.5/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-version: 7.1.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- lib/binding_web/package-lock.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json index a3d529fe..17d24cb5 100644 --- a/lib/binding_web/package-lock.json +++ b/lib/binding_web/package-lock.json @@ -3461,14 +3461,14 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -3653,9 +3653,9 @@ } }, "node_modules/vite": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.3.tgz", - "integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.5.tgz", + "integrity": "sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3664,7 +3664,7 @@ "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", - "tinyglobby": "^0.2.14" + "tinyglobby": "^0.2.15" }, "bin": { "vite": "bin/vite.js" From 937dcf5fd139badd37cad5de4dfe1123040c36b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20M=C3=BCller?= Date: Mon, 16 Jun 2025 10:31:25 -0700 Subject: [PATCH 428/663] feat(rust)!: use ops::ControlFlow as parse and query progress return value Instead of returning an undocumented boolean flag, use a core::ops::ControlFlow object. At the expense of being a bit more verbose, this is a type that should be self-explanatory in the context of a callback, as an indication of whether to continue processing or stop. --- crates/cli/src/parse.rs | 7 ++- crates/cli/src/tests/parser_test.rs | 85 +++++++++++++++++++++-------- crates/cli/src/tests/query_test.rs | 11 +++- crates/highlight/src/highlight.rs | 11 +++- crates/tags/src/tags.rs | 10 +++- lib/binding_rust/lib.rs | 43 +++++++++++---- 6 files changed, 120 insertions(+), 47 deletions(-) diff --git a/crates/cli/src/parse.rs b/crates/cli/src/parse.rs index d5285011..ed0ac9f6 100644 --- a/crates/cli/src/parse.rs +++ b/crates/cli/src/parse.rs @@ -1,6 +1,7 @@ use std::{ fmt, fs, io::{self, Write}, + ops::ControlFlow, path::{Path, PathBuf}, sync::atomic::{AtomicUsize, Ordering}, time::{Duration, Instant}, @@ -357,15 +358,15 @@ pub fn parse_file_at_path( let progress_callback = &mut |_: &ParseState| { if let Some(cancellation_flag) = opts.cancellation_flag { if cancellation_flag.load(Ordering::SeqCst) != 0 { - return true; + return ControlFlow::Break(()); } } if opts.timeout > 0 && start_time.elapsed().as_micros() > opts.timeout as u128 { - return true; + return ControlFlow::Break(()); } - false + ControlFlow::Continue(()) }; let parse_opts = ParseOptions::new().progress_callback(progress_callback); diff --git a/crates/cli/src/tests/parser_test.rs b/crates/cli/src/tests/parser_test.rs index d8b9767d..ba897163 100644 --- a/crates/cli/src/tests/parser_test.rs +++ b/crates/cli/src/tests/parser_test.rs @@ -1,4 +1,5 @@ use std::{ + ops::ControlFlow, sync::atomic::{AtomicUsize, Ordering}, thread, time, }; @@ -699,7 +700,13 @@ fn test_parsing_on_multiple_threads() { fn test_parsing_cancelled_by_another_thread() { let cancellation_flag = std::sync::Arc::new(AtomicUsize::new(0)); let flag = cancellation_flag.clone(); - let callback = &mut |_: &ParseState| cancellation_flag.load(Ordering::SeqCst) != 0; + let callback = &mut |_: &ParseState| { + if cancellation_flag.load(Ordering::SeqCst) != 0 { + ControlFlow::Break(()) + } else { + ControlFlow::Continue(()) + } + }; let mut parser = Parser::new(); parser.set_language(&get_language("javascript")).unwrap(); @@ -764,9 +771,13 @@ fn test_parsing_with_a_timeout() { } }, None, - Some( - ParseOptions::new().progress_callback(&mut |_| start_time.elapsed().as_micros() > 1000), - ), + Some(ParseOptions::new().progress_callback(&mut |_| { + if start_time.elapsed().as_micros() > 1000 { + ControlFlow::Break(()) + } else { + ControlFlow::Continue(()) + } + })), ); assert!(tree.is_none()); assert!(start_time.elapsed().as_micros() < 2000); @@ -782,9 +793,13 @@ fn test_parsing_with_a_timeout() { } }, None, - Some( - ParseOptions::new().progress_callback(&mut |_| start_time.elapsed().as_micros() > 5000), - ), + Some(ParseOptions::new().progress_callback(&mut |_| { + if start_time.elapsed().as_micros() > 5000 { + ControlFlow::Break(()) + } else { + ControlFlow::Continue(()) + } + })), ); assert!(tree.is_none()); assert!(start_time.elapsed().as_micros() > 100); @@ -822,7 +837,13 @@ fn test_parsing_with_a_timeout_and_a_reset() { } }, None, - Some(ParseOptions::new().progress_callback(&mut |_| start_time.elapsed().as_micros() > 5)), + Some(ParseOptions::new().progress_callback(&mut |_| { + if start_time.elapsed().as_micros() > 5 { + ControlFlow::Break(()) + } else { + ControlFlow::Continue(()) + } + })), ); assert!(tree.is_none()); @@ -853,7 +874,13 @@ fn test_parsing_with_a_timeout_and_a_reset() { } }, None, - Some(ParseOptions::new().progress_callback(&mut |_| start_time.elapsed().as_micros() > 5)), + Some(ParseOptions::new().progress_callback(&mut |_| { + if start_time.elapsed().as_micros() > 5 { + ControlFlow::Break(()) + } else { + ControlFlow::Continue(()) + } + })), ); assert!(tree.is_none()); @@ -893,10 +920,13 @@ fn test_parsing_with_a_timeout_and_implicit_reset() { } }, None, - Some( - ParseOptions::new() - .progress_callback(&mut |_| start_time.elapsed().as_micros() > 5), - ), + Some(ParseOptions::new().progress_callback(&mut |_| { + if start_time.elapsed().as_micros() > 5 { + ControlFlow::Break(()) + } else { + ControlFlow::Continue(()) + } + })), ); assert!(tree.is_none()); @@ -937,10 +967,13 @@ fn test_parsing_with_timeout_and_no_completion() { } }, None, - Some( - ParseOptions::new() - .progress_callback(&mut |_| start_time.elapsed().as_micros() > 5), - ), + Some(ParseOptions::new().progress_callback(&mut |_| { + if start_time.elapsed().as_micros() > 5 { + ControlFlow::Break(()) + } else { + ControlFlow::Continue(()) + } + })), ); assert!(tree.is_none()); @@ -979,10 +1012,10 @@ fn test_parsing_with_timeout_during_balancing() { // are in the balancing phase. if state.current_byte_offset() != current_byte_offset { current_byte_offset = state.current_byte_offset(); - false + ControlFlow::Continue(()) } else { in_balancing = true; - true + ControlFlow::Break(()) } })), ); @@ -1004,10 +1037,10 @@ fn test_parsing_with_timeout_during_balancing() { Some(ParseOptions::new().progress_callback(&mut |state| { if state.current_byte_offset() != current_byte_offset { current_byte_offset = state.current_byte_offset(); - false + ControlFlow::Continue(()) } else { in_balancing = true; - true + ControlFlow::Break(()) } })), ); @@ -1031,7 +1064,7 @@ fn test_parsing_with_timeout_during_balancing() { // Because we've already finished parsing, we should only be resuming the // balancing phase. assert!(state.current_byte_offset() == current_byte_offset); - false + ControlFlow::Continue(()) })), ) .unwrap(); @@ -1057,7 +1090,11 @@ fn test_parsing_with_timeout_when_error_detected() { None, Some(ParseOptions::new().progress_callback(&mut |state| { offset = state.current_byte_offset(); - state.has_error() + if state.has_error() { + ControlFlow::Break(()) + } else { + ControlFlow::Continue(()) + } })), ); @@ -1737,7 +1774,7 @@ fn test_parsing_by_halting_at_offset() { None, Some(ParseOptions::new().progress_callback(&mut |p| { seen_byte_offsets.push(p.current_byte_offset()); - false + ControlFlow::Continue(()) })), ) .unwrap(); diff --git a/crates/cli/src/tests/query_test.rs b/crates/cli/src/tests/query_test.rs index ab025e04..835138ce 100644 --- a/crates/cli/src/tests/query_test.rs +++ b/crates/cli/src/tests/query_test.rs @@ -1,4 +1,4 @@ -use std::{env, fmt::Write, sync::LazyLock}; +use std::{env, fmt::Write, ops::ControlFlow, sync::LazyLock}; use indoc::indoc; use rand::{prelude::StdRng, SeedableRng}; @@ -5446,8 +5446,13 @@ fn test_query_execution_with_timeout() { &query, tree.root_node(), source_code.as_bytes(), - QueryCursorOptions::new() - .progress_callback(&mut |_| start_time.elapsed().as_micros() > 1000), + QueryCursorOptions::new().progress_callback(&mut |_| { + if start_time.elapsed().as_micros() > 1000 { + ControlFlow::Break(()) + } else { + ControlFlow::Continue(()) + } + }), ) .count(); assert!(matches < 1000); diff --git a/crates/highlight/src/highlight.rs b/crates/highlight/src/highlight.rs index e4555fa0..bb81fc08 100644 --- a/crates/highlight/src/highlight.rs +++ b/crates/highlight/src/highlight.rs @@ -7,7 +7,8 @@ use std::{ iter, marker::PhantomData, mem::{self, MaybeUninit}, - ops, str, + ops::{self, ControlFlow}, + str, sync::{ atomic::{AtomicUsize, Ordering}, LazyLock, @@ -538,9 +539,13 @@ impl<'a> HighlightIterLayer<'a> { None, Some(ParseOptions::new().progress_callback(&mut |_| { if let Some(cancellation_flag) = cancellation_flag { - cancellation_flag.load(Ordering::SeqCst) != 0 + if cancellation_flag.load(Ordering::SeqCst) != 0 { + ControlFlow::Break(()) + } else { + ControlFlow::Continue(()) + } } else { - false + ControlFlow::Continue(()) } })), ) diff --git a/crates/tags/src/tags.rs b/crates/tags/src/tags.rs index 57179e9a..16270b0a 100644 --- a/crates/tags/src/tags.rs +++ b/crates/tags/src/tags.rs @@ -7,7 +7,7 @@ use std::{ collections::HashMap, ffi::{CStr, CString}, mem, - ops::Range, + ops::{ControlFlow, Range}, os::raw::c_char, str, sync::atomic::{AtomicUsize, Ordering}, @@ -301,9 +301,13 @@ impl TagsContext { None, Some(ParseOptions::new().progress_callback(&mut |_| { if let Some(cancellation_flag) = cancellation_flag { - cancellation_flag.load(Ordering::SeqCst) != 0 + if cancellation_flag.load(Ordering::SeqCst) != 0 { + ControlFlow::Break(()) + } else { + ControlFlow::Continue(()) + } } else { - false + ControlFlow::Continue(()) } })), ) diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs index cb4b34c0..e3b2d950 100644 --- a/lib/binding_rust/lib.rs +++ b/lib/binding_rust/lib.rs @@ -16,7 +16,7 @@ use core::{ marker::PhantomData, mem::MaybeUninit, num::NonZeroU16, - ops::{self, Deref}, + ops::{self, ControlFlow, Deref}, ptr::{self, NonNull}, slice, str, sync::atomic::AtomicUsize, @@ -177,7 +177,10 @@ impl<'a> ParseOptions<'a> { } #[must_use] - pub fn progress_callback bool>(mut self, callback: &'a mut F) -> Self { + pub fn progress_callback ControlFlow<()>>( + mut self, + callback: &'a mut F, + ) -> Self { self.progress_callback = Some(callback); self } @@ -195,7 +198,7 @@ impl<'a> QueryCursorOptions<'a> { } #[must_use] - pub fn progress_callback bool>( + pub fn progress_callback ControlFlow<()>>( mut self, callback: &'a mut F, ) -> Self { @@ -232,10 +235,10 @@ type FieldId = NonZeroU16; type Logger<'a> = Box; /// A callback that receives the parse state during parsing. -type ParseProgressCallback<'a> = &'a mut dyn FnMut(&ParseState) -> bool; +type ParseProgressCallback<'a> = &'a mut dyn FnMut(&ParseState) -> ControlFlow<()>; /// A callback that receives the query state during query execution. -type QueryProgressCallback<'a> = &'a mut dyn FnMut(&QueryCursorState) -> bool; +type QueryProgressCallback<'a> = &'a mut dyn FnMut(&QueryCursorState) -> ControlFlow<()>; pub trait Decode { /// A callback that decodes the next code point from the input slice. It should return the code @@ -869,7 +872,10 @@ impl Parser { .cast::() .as_mut() .unwrap(); - callback(&ParseState::from_raw(state)) + match callback(&ParseState::from_raw(state)) { + ControlFlow::Continue(()) => false, + ControlFlow::Break(()) => true, + } } // This C function is passed to Tree-sitter as the input callback. @@ -1001,7 +1007,10 @@ impl Parser { .cast::() .as_mut() .unwrap(); - callback(&ParseState::from_raw(state)) + match callback(&ParseState::from_raw(state)) { + ControlFlow::Continue(()) => false, + ControlFlow::Break(()) => true, + } } // This C function is passed to Tree-sitter as the input callback. @@ -1118,7 +1127,10 @@ impl Parser { .cast::() .as_mut() .unwrap(); - callback(&ParseState::from_raw(state)) + match callback(&ParseState::from_raw(state)) { + ControlFlow::Continue(()) => false, + ControlFlow::Break(()) => true, + } } // This C function is passed to Tree-sitter as the input callback. @@ -1218,7 +1230,10 @@ impl Parser { .cast::() .as_mut() .unwrap(); - callback(&ParseState::from_raw(state)) + match callback(&ParseState::from_raw(state)) { + ControlFlow::Continue(()) => false, + ControlFlow::Break(()) => true, + } } // At compile time, create a C-compatible callback that calls the custom `decode` method. @@ -3103,7 +3118,10 @@ impl QueryCursor { .cast::() .as_mut() .unwrap(); - (callback)(&QueryCursorState::from_raw(state)) + match callback(&QueryCursorState::from_raw(state)) { + ControlFlow::Continue(()) => false, + ControlFlow::Break(()) => true, + } } let query_options = options.progress_callback.map(|cb| { @@ -3189,7 +3207,10 @@ impl QueryCursor { .cast::() .as_mut() .unwrap(); - (callback)(&QueryCursorState::from_raw(state)) + match callback(&QueryCursorState::from_raw(state)) { + ControlFlow::Continue(()) => false, + ControlFlow::Break(()) => true, + } } let query_options = options.progress_callback.map(|cb| { From 5528cfee1721636e8e06c77ec7d0f0379f73a210 Mon Sep 17 00:00:00 2001 From: kilo52 Date: Wed, 3 Sep 2025 21:22:15 +0200 Subject: [PATCH 429/663] build(cmake): change include directory scope to public When a project adds tree-sitter as a dependency via the CMake FetchContent machinery, the project fails to build because the tree-sitter header cannot be found. This is because the include directory is specified with the private scope instead of public. --- lib/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 29c38d39..ed822584 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -19,7 +19,7 @@ endif() add_library(tree-sitter ${TS_SOURCE_FILES}) -target_include_directories(tree-sitter PRIVATE src src/wasm include) +target_include_directories(tree-sitter PRIVATE src src/wasm PUBLIC include) if(MSVC) target_compile_options(tree-sitter PRIVATE From d1160cb820d5978d2aa71fa7aac502464b7dabf8 Mon Sep 17 00:00:00 2001 From: kilo52 Date: Sat, 6 Sep 2025 10:31:56 +0200 Subject: [PATCH 430/663] build(cmake)!: move CMakeLists.txt to the source root --- .github/workflows/build.yml | 8 ++++---- .github/workflows/wasm_exports.yml | 2 +- lib/CMakeLists.txt => CMakeLists.txt | 12 ++++++------ crates/xtask/src/bump.rs | 6 +++--- lib/package.nix | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) rename lib/CMakeLists.txt => CMakeLists.txt (89%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index acb3da78..d782dfbe 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -175,7 +175,7 @@ jobs: if: ${{ matrix.platform == 'windows-x64' }} shell: msys2 {0} run: | - cmake -G Ninja -S lib -B build/static \ + cmake -G Ninja -S . -B build/static \ -DBUILD_SHARED_LIBS=OFF \ -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_COMPILE_WARNING_AS_ERROR=ON \ @@ -184,7 +184,7 @@ jobs: cmake --build build/static rm -rf build/static - cmake -G Ninja -S lib -B build/shared \ + cmake -G Ninja -S . -B build/shared \ -DBUILD_SHARED_LIBS=ON \ -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_COMPILE_WARNING_AS_ERROR=ON \ @@ -225,14 +225,14 @@ jobs: - name: Build C library (CMake) if: ${{ !matrix.use-cross }} run: | - cmake -S lib -B build/static \ + cmake -S . -B build/static \ -DBUILD_SHARED_LIBS=OFF \ -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_COMPILE_WARNING_AS_ERROR=ON \ -DTREE_SITTER_FEATURE_WASM=$WASM cmake --build build/static --verbose - cmake -S lib -B build/shared \ + cmake -S . -B build/shared \ -DBUILD_SHARED_LIBS=ON \ -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_COMPILE_WARNING_AS_ERROR=ON \ diff --git a/.github/workflows/wasm_exports.yml b/.github/workflows/wasm_exports.yml index 7157e589..ee28e8ea 100644 --- a/.github/workflows/wasm_exports.yml +++ b/.github/workflows/wasm_exports.yml @@ -11,7 +11,7 @@ on: paths: - lib/include/tree_sitter/api.h - lib/binding_rust/bindings.rs - - lib/CMakeLists.txt + - CMakeLists.txt jobs: check-wasm-exports: diff --git a/lib/CMakeLists.txt b/CMakeLists.txt similarity index 89% rename from lib/CMakeLists.txt rename to CMakeLists.txt index ed822584..bc8bf049 100644 --- a/lib/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,15 +11,15 @@ option(TREE_SITTER_FEATURE_WASM "Enable the Wasm feature" OFF) option(AMALGAMATED "Build using an amalgamated source" OFF) if(AMALGAMATED) - set(TS_SOURCE_FILES "${PROJECT_SOURCE_DIR}/src/lib.c") + set(TS_SOURCE_FILES "${PROJECT_SOURCE_DIR}/lib/src/lib.c") else() - file(GLOB TS_SOURCE_FILES src/*.c) - list(REMOVE_ITEM TS_SOURCE_FILES "${PROJECT_SOURCE_DIR}/src/lib.c") + file(GLOB TS_SOURCE_FILES lib/src/*.c) + list(REMOVE_ITEM TS_SOURCE_FILES "${PROJECT_SOURCE_DIR}/lib/src/lib.c") endif() add_library(tree-sitter ${TS_SOURCE_FILES}) -target_include_directories(tree-sitter PRIVATE src src/wasm PUBLIC include) +target_include_directories(tree-sitter PRIVATE lib/src lib/src/wasm PUBLIC lib/include) if(MSVC) target_compile_options(tree-sitter PRIVATE @@ -85,9 +85,9 @@ target_compile_definitions(tree-sitter PRIVATE _POSIX_C_SOURCE=200112L _DEFAULT_ include(GNUInstallDirs) -configure_file(tree-sitter.pc.in "${CMAKE_CURRENT_BINARY_DIR}/tree-sitter.pc" @ONLY) +configure_file(lib/tree-sitter.pc.in "${CMAKE_CURRENT_BINARY_DIR}/tree-sitter.pc" @ONLY) -install(FILES include/tree_sitter/api.h +install(FILES lib/include/tree_sitter/api.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/tree_sitter") install(FILES "${CMAKE_CURRENT_BINARY_DIR}/tree-sitter.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") diff --git a/crates/xtask/src/bump.rs b/crates/xtask/src/bump.rs index 55ff1a6f..7e5f5dcd 100644 --- a/crates/xtask/src/bump.rs +++ b/crates/xtask/src/bump.rs @@ -190,7 +190,7 @@ fn tag_next_version(next_version: &Version) -> Result<()> { "crates/highlight/Cargo.toml", "crates/loader/Cargo.toml", "crates/tags/Cargo.toml", - "lib/CMakeLists.txt", + "CMakeLists.txt", "lib/Cargo.toml", "lib/binding_web/package.json", "lib/binding_web/package-lock.json", @@ -241,7 +241,7 @@ fn update_makefile(next_version: &Version) -> Result<()> { } fn update_cmake(next_version: &Version) -> Result<()> { - let cmake = std::fs::read_to_string("lib/CMakeLists.txt")?; + let cmake = std::fs::read_to_string("CMakeLists.txt")?; let cmake = cmake .lines() .map(|line| { @@ -261,7 +261,7 @@ fn update_cmake(next_version: &Version) -> Result<()> { .join("\n") + "\n"; - std::fs::write("lib/CMakeLists.txt", cmake)?; + std::fs::write("CMakeLists.txt", cmake)?; Ok(()) } diff --git a/lib/package.nix b/lib/package.nix index 2b59ae9a..c94d1e8c 100644 --- a/lib/package.nix +++ b/lib/package.nix @@ -15,7 +15,7 @@ stdenv.mkDerivation { pkg-config ]; - sourceRoot = "source/lib"; + sourceRoot = "source"; cmakeFlags = [ "-DBUILD_SHARED_LIBS=ON" From 56325d2a3b1e27cb70179734bb31ceb0e6a5f0b9 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Fri, 15 Aug 2025 16:00:23 +0300 Subject: [PATCH 431/663] chore: copy license to all packages --- LICENSE | 2 +- crates/cli/Cargo.toml | 2 +- crates/cli/LICENSE | 21 +++++++++++++++++++++ crates/cli/eslint/.gitignore | 1 + crates/cli/eslint/package.json | 4 ++++ crates/cli/npm/package.json | 2 +- crates/config/LICENSE | 21 +++++++++++++++++++++ crates/generate/LICENSE | 21 +++++++++++++++++++++ crates/highlight/LICENSE | 21 +++++++++++++++++++++ crates/language/LICENSE | 21 +++++++++++++++++++++ crates/loader/LICENSE | 21 +++++++++++++++++++++ crates/tags/LICENSE | 21 +++++++++++++++++++++ lib/Cargo.toml | 1 + lib/LICENSE | 21 +++++++++++++++++++++ lib/binding_web/package.json | 1 + 15 files changed, 178 insertions(+), 3 deletions(-) create mode 100644 crates/cli/LICENSE create mode 100644 crates/cli/eslint/.gitignore create mode 100644 crates/config/LICENSE create mode 100644 crates/generate/LICENSE create mode 100644 crates/highlight/LICENSE create mode 100644 crates/language/LICENSE create mode 100644 crates/loader/LICENSE create mode 100644 crates/tags/LICENSE create mode 100644 lib/LICENSE diff --git a/LICENSE b/LICENSE index c49fd68d..971b81f9 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018-2025 Max Brunsfeld +Copyright (c) 2018 Max Brunsfeld Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index bb5b2999..02de411b 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -12,7 +12,7 @@ documentation = "https://docs.rs/tree-sitter-cli" license.workspace = true keywords.workspace = true categories.workspace = true -include = ["build.rs", "README.md", "benches/*", "src/**"] +include = ["build.rs", "README.md", "LICENSE", "benches/*", "src/**"] [lints] workspace = true diff --git a/crates/cli/LICENSE b/crates/cli/LICENSE new file mode 100644 index 00000000..971b81f9 --- /dev/null +++ b/crates/cli/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 Max Brunsfeld + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/crates/cli/eslint/.gitignore b/crates/cli/eslint/.gitignore new file mode 100644 index 00000000..6b1d0bfa --- /dev/null +++ b/crates/cli/eslint/.gitignore @@ -0,0 +1 @@ +LICENSE diff --git a/crates/cli/eslint/package.json b/crates/cli/eslint/package.json index a3ba26c9..a3ef0c10 100644 --- a/crates/cli/eslint/package.json +++ b/crates/cli/eslint/package.json @@ -21,5 +21,9 @@ }, "peerDependencies": { "eslint": ">= 9" + }, + "scripts": { + "prepack": "cp ../../../LICENSE .", + "postpack": "rm LICENSE" } } diff --git a/crates/cli/npm/package.json b/crates/cli/npm/package.json index 695fc26f..23835503 100644 --- a/crates/cli/npm/package.json +++ b/crates/cli/npm/package.json @@ -27,7 +27,7 @@ }, "scripts": { "install": "node install.js", - "prepack": "cp ../../LICENSE ../README.md .", + "prepack": "cp ../../../LICENSE ../README.md .", "postpack": "rm LICENSE README.md" }, "bin": { diff --git a/crates/config/LICENSE b/crates/config/LICENSE new file mode 100644 index 00000000..971b81f9 --- /dev/null +++ b/crates/config/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 Max Brunsfeld + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/crates/generate/LICENSE b/crates/generate/LICENSE new file mode 100644 index 00000000..971b81f9 --- /dev/null +++ b/crates/generate/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 Max Brunsfeld + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/crates/highlight/LICENSE b/crates/highlight/LICENSE new file mode 100644 index 00000000..971b81f9 --- /dev/null +++ b/crates/highlight/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 Max Brunsfeld + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/crates/language/LICENSE b/crates/language/LICENSE new file mode 100644 index 00000000..971b81f9 --- /dev/null +++ b/crates/language/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 Max Brunsfeld + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/crates/loader/LICENSE b/crates/loader/LICENSE new file mode 100644 index 00000000..971b81f9 --- /dev/null +++ b/crates/loader/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 Max Brunsfeld + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/crates/tags/LICENSE b/crates/tags/LICENSE new file mode 100644 index 00000000..971b81f9 --- /dev/null +++ b/crates/tags/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 Max Brunsfeld + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/lib/Cargo.toml b/lib/Cargo.toml index d0529996..3f6902d4 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -30,6 +30,7 @@ include = [ "/src/unicode/*", "/src/wasm/*", "/include/tree_sitter/api.h", + "/LICENSE", ] [package.metadata.docs.rs] diff --git a/lib/LICENSE b/lib/LICENSE new file mode 100644 index 00000000..971b81f9 --- /dev/null +++ b/lib/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 Max Brunsfeld + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json index 5d343d21..8faf9ecb 100644 --- a/lib/binding_web/package.json +++ b/lib/binding_web/package.json @@ -94,6 +94,7 @@ "test": "vitest run", "test:watch": "vitest", "prepack": "cp ../../LICENSE .", + "postpack": "rm LICENSE", "prepublishOnly": "tsx script/check-artifacts-fresh.ts" } } From 6e53dcc8e1551fd2fc9524ef671eb23349791807 Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Thu, 11 Sep 2025 23:06:34 +0200 Subject: [PATCH 432/663] fix(playground): add missing `` tag --- crates/cli/src/playground.html | 809 +++++++++++++++++---------------- 1 file changed, 406 insertions(+), 403 deletions(-) diff --git a/crates/cli/src/playground.html b/crates/cli/src/playground.html index db3b6aec..6f90e030 100644 --- a/crates/cli/src/playground.html +++ b/crates/cli/src/playground.html @@ -1,471 +1,474 @@ - - - tree-sitter THE_LANGUAGE_NAME - - - - - - - - +
- - +
+
+
Code
+
+ +
- - - - + +
+ +
+
+ Tree + +
+

+        
+
+
+ + + + + + + + + From 917895e6a3cd55b6d37752cba0114fe7e99fd72f Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Thu, 11 Sep 2025 19:32:32 -0400 Subject: [PATCH 433/663] build(nix): build cli with all features --- crates/cli/package.nix | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/cli/package.nix b/crates/cli/package.nix index 584b78e7..ceab7bc7 100644 --- a/crates/cli/package.nix +++ b/crates/cli/package.nix @@ -3,6 +3,7 @@ src, rustPlatform, version, + cmake, pkg-config, nodejs_22, test-grammars, @@ -17,7 +18,10 @@ rustPlatform.buildRustPackage { inherit src version; + cargoBuildFlags = [ "--all-features" ]; + nativeBuildInputs = [ + cmake pkg-config nodejs_22 ] From 821cf797f26128622fd52f8aa9d7e396d6782fd5 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Thu, 11 Sep 2025 03:10:10 -0400 Subject: [PATCH 434/663] feat(lib)!: remove deprecated functions --- lib/include/tree_sitter/api.h | 80 +------------------ lib/src/clock.h | 146 ---------------------------------- lib/src/language.c | 4 - lib/src/parser.c | 43 +--------- lib/src/query.c | 23 +----- 5 files changed, 8 insertions(+), 288 deletions(-) delete mode 100644 lib/src/clock.h diff --git a/lib/include/tree_sitter/api.h b/lib/include/tree_sitter/api.h index ffc108ca..f1c69dec 100644 --- a/lib/include/tree_sitter/api.h +++ b/lib/include/tree_sitter/api.h @@ -299,16 +299,7 @@ const TSRange *ts_parser_included_ranges( * are four possible reasons for failure: * 1. The parser does not have a language assigned. Check for this using the [`ts_parser_language`] function. - * 2. Parsing was cancelled due to a timeout that was set by an earlier call to - * the [`ts_parser_set_timeout_micros`] function. You can resume parsing from - * where the parser left out by calling [`ts_parser_parse`] again with the - * same arguments. Or you can start parsing from scratch by first calling - * [`ts_parser_reset`]. - * 3. Parsing was cancelled using a cancellation flag that was set by an - * earlier call to [`ts_parser_set_cancellation_flag`]. You can resume parsing - * from where the parser left out by calling [`ts_parser_parse`] again with - * the same arguments. - * 4. Parsing was cancelled due to the progress callback returning true. This callback + * 2. Parsing was cancelled due to the progress callback returning true. This callback * is passed in [`ts_parser_parse_with_options`] inside the [`TSParseOptions`] struct. * * [`read`]: TSInput::read @@ -366,7 +357,7 @@ TSTree *ts_parser_parse_string_encoding( /** * Instruct the parser to start the next parse from the beginning. * - * If the parser previously failed because of a timeout or a cancellation, then + * If the parser previously failed because of the progress callback, then * by default, it will resume where it left off on the next call to * [`ts_parser_parse`] or other parsing functions. If you don't want to resume, * and instead intend to use this parser to parse some other document, you must @@ -374,42 +365,6 @@ TSTree *ts_parser_parse_string_encoding( */ void ts_parser_reset(TSParser *self); -/** - * @deprecated use [`ts_parser_parse_with_options`] and pass in a callback instead, this will be removed in 0.26. - * - * Set the maximum duration in microseconds that parsing should be allowed to - * take before halting. - * - * If parsing takes longer than this, it will halt early, returning NULL. - * See [`ts_parser_parse`] for more information. - */ -void ts_parser_set_timeout_micros(TSParser *self, uint64_t timeout_micros); - -/** - * @deprecated use [`ts_parser_parse_with_options`] and pass in a callback instead, this will be removed in 0.26. - * - * Get the duration in microseconds that parsing is allowed to take. - */ -uint64_t ts_parser_timeout_micros(const TSParser *self); - -/** - * @deprecated use [`ts_parser_parse_with_options`] and pass in a callback instead, this will be removed in 0.26. - * - * Set the parser's current cancellation flag pointer. - * - * If a non-null pointer is assigned, then the parser will periodically read - * from this pointer during parsing. If it reads a non-zero value, it will - * halt early, returning NULL. See [`ts_parser_parse`] for more information. - */ -void ts_parser_set_cancellation_flag(TSParser *self, const size_t *flag); - -/** - * @deprecated use [`ts_parser_parse_with_options`] and pass in a callback instead, this will be removed in 0.26. - * - * Get the parser's current cancellation flag pointer. - */ -const size_t *ts_parser_cancellation_flag(const TSParser *self); - /** * Set the logger that a parser should use during parsing. * @@ -1094,26 +1049,6 @@ bool ts_query_cursor_did_exceed_match_limit(const TSQueryCursor *self); uint32_t ts_query_cursor_match_limit(const TSQueryCursor *self); void ts_query_cursor_set_match_limit(TSQueryCursor *self, uint32_t limit); -/** - * @deprecated use [`ts_query_cursor_exec_with_options`] and pass in a callback instead, this will be removed in 0.26. - * - * Set the maximum duration in microseconds that query execution should be allowed to - * take before halting. - * - * If query execution takes longer than this, it will halt early, returning NULL. - * See [`ts_query_cursor_next_match`] or [`ts_query_cursor_next_capture`] for more information. - */ -void ts_query_cursor_set_timeout_micros(TSQueryCursor *self, uint64_t timeout_micros); - -/** - * @deprecated use [`ts_query_cursor_exec_with_options`] and pass in a callback instead, this will be removed in 0.26. - * - * Get the duration in microseconds that query execution is allowed to take. - * - * This is set via [`ts_query_cursor_set_timeout_micros`]. - */ -uint64_t ts_query_cursor_timeout_micros(const TSQueryCursor *self); - /** * Set the range of bytes in which the query will be executed. * @@ -1264,17 +1199,6 @@ const char *ts_language_symbol_name(const TSLanguage *self, TSSymbol symbol); */ TSSymbolType ts_language_symbol_type(const TSLanguage *self, TSSymbol symbol); -/** - * @deprecated use [`ts_language_abi_version`] instead, this will be removed in 0.26. - * - * Get the ABI version number for this language. This version number is used - * to ensure that languages were generated by a compatible version of - * Tree-sitter. - * - * See also [`ts_parser_set_language`]. - */ -uint32_t ts_language_version(const TSLanguage *self); - /** * Get the ABI version number for this language. This version number is used * to ensure that languages were generated by a compatible version of diff --git a/lib/src/clock.h b/lib/src/clock.h deleted file mode 100644 index 7a13185e..00000000 --- a/lib/src/clock.h +++ /dev/null @@ -1,146 +0,0 @@ -#ifndef TREE_SITTER_CLOCK_H_ -#define TREE_SITTER_CLOCK_H_ - -#include -#include - -typedef uint64_t TSDuration; - -#ifdef _WIN32 - -// Windows: -// * Represent a time as a performance counter value. -// * Represent a duration as a number of performance counter ticks. - -#include -typedef uint64_t TSClock; - -static inline TSDuration duration_from_micros(uint64_t micros) { - LARGE_INTEGER frequency; - QueryPerformanceFrequency(&frequency); - return micros * (uint64_t)frequency.QuadPart / 1000000; -} - -static inline uint64_t duration_to_micros(TSDuration self) { - LARGE_INTEGER frequency; - QueryPerformanceFrequency(&frequency); - return self * 1000000 / (uint64_t)frequency.QuadPart; -} - -static inline TSClock clock_null(void) { - return 0; -} - -static inline TSClock clock_now(void) { - LARGE_INTEGER result; - QueryPerformanceCounter(&result); - return (uint64_t)result.QuadPart; -} - -static inline TSClock clock_after(TSClock base, TSDuration duration) { - return base + duration; -} - -static inline bool clock_is_null(TSClock self) { - return !self; -} - -static inline bool clock_is_gt(TSClock self, TSClock other) { - return self > other; -} - -#elif defined(CLOCK_MONOTONIC) - -// POSIX with monotonic clock support (Linux, macOS) -// * Represent a time as a monotonic (seconds, nanoseconds) pair. -// * Represent a duration as a number of microseconds. -// -// On these platforms, parse timeouts will correspond accurately to -// real time, regardless of what other processes are running. - -#include -typedef struct timespec TSClock; - -static inline TSDuration duration_from_micros(uint64_t micros) { - return micros; -} - -static inline uint64_t duration_to_micros(TSDuration self) { - return self; -} - -static inline TSClock clock_now(void) { - TSClock result; - clock_gettime(CLOCK_MONOTONIC, &result); - return result; -} - -static inline TSClock clock_null(void) { - return (TSClock) {0, 0}; -} - -static inline TSClock clock_after(TSClock base, TSDuration duration) { - TSClock result = base; - result.tv_sec += duration / 1000000; - result.tv_nsec += (duration % 1000000) * 1000; - if (result.tv_nsec >= 1000000000) { - result.tv_nsec -= 1000000000; - ++(result.tv_sec); - } - return result; -} - -static inline bool clock_is_null(TSClock self) { - return !self.tv_sec && !self.tv_nsec; -} - -static inline bool clock_is_gt(TSClock self, TSClock other) { - if (self.tv_sec > other.tv_sec) return true; - if (self.tv_sec < other.tv_sec) return false; - return self.tv_nsec > other.tv_nsec; -} - -#else - -// POSIX without monotonic clock support -// * Represent a time as a process clock value. -// * Represent a duration as a number of process clock ticks. -// -// On these platforms, parse timeouts may be affected by other processes, -// which is not ideal, but is better than using a non-monotonic time API -// like `gettimeofday`. - -#include -typedef uint64_t TSClock; - -static inline TSDuration duration_from_micros(uint64_t micros) { - return micros * (uint64_t)CLOCKS_PER_SEC / 1000000; -} - -static inline uint64_t duration_to_micros(TSDuration self) { - return self * 1000000 / (uint64_t)CLOCKS_PER_SEC; -} - -static inline TSClock clock_null(void) { - return 0; -} - -static inline TSClock clock_now(void) { - return (uint64_t)clock(); -} - -static inline TSClock clock_after(TSClock base, TSDuration duration) { - return base + duration; -} - -static inline bool clock_is_null(TSClock self) { - return !self; -} - -static inline bool clock_is_gt(TSClock self, TSClock other) { - return self > other; -} - -#endif - -#endif // TREE_SITTER_CLOCK_H_ diff --git a/lib/src/language.c b/lib/src/language.c index 2dce6998..de5e1f91 100644 --- a/lib/src/language.c +++ b/lib/src/language.c @@ -49,10 +49,6 @@ const TSSymbol *ts_language_subtypes( return &self->supertype_map_entries[slice.index]; } -uint32_t ts_language_version(const TSLanguage *self) { - return self->abi_version; -} - uint32_t ts_language_abi_version(const TSLanguage *self) { return self->abi_version; } diff --git a/lib/src/parser.c b/lib/src/parser.c index d0a2d2ca..9362dc63 100644 --- a/lib/src/parser.c +++ b/lib/src/parser.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -6,8 +5,6 @@ #include "tree_sitter/api.h" #include "./alloc.h" #include "./array.h" -#include "./atomic.h" -#include "./clock.h" #include "./error_costs.h" #include "./get_changed_ranges.h" #include "./language.h" @@ -81,7 +78,7 @@ static const unsigned MAX_VERSION_COUNT = 6; static const unsigned MAX_VERSION_COUNT_OVERFLOW = 4; static const unsigned MAX_SUMMARY_DEPTH = 16; static const unsigned MAX_COST_DIFFERENCE = 18 * ERROR_COST_PER_SKIPPED_TREE; -static const unsigned OP_COUNT_PER_PARSER_TIMEOUT_CHECK = 100; +static const unsigned OP_COUNT_PER_PARSER_CALLBACK_CHECK = 100; typedef struct { Subtree token; @@ -104,11 +101,8 @@ struct TSParser { ReusableNode reusable_node; void *external_scanner_payload; FILE *dot_graph_file; - TSClock end_clock; - TSDuration timeout_duration; unsigned accept_count; unsigned operation_count; - const volatile size_t *cancellation_flag; Subtree old_tree; TSRangeArray included_range_differences; TSParseOptions parse_options; @@ -1537,7 +1531,7 @@ static void ts_parser__handle_error( static bool ts_parser__check_progress(TSParser *self, Subtree *lookahead, const uint32_t *position, unsigned operations) { self->operation_count += operations; - if (self->operation_count >= OP_COUNT_PER_PARSER_TIMEOUT_CHECK) { + if (self->operation_count >= OP_COUNT_PER_PARSER_CALLBACK_CHECK) { self->operation_count = 0; } if (position != NULL) { @@ -1546,12 +1540,7 @@ static bool ts_parser__check_progress(TSParser *self, Subtree *lookahead, const } if ( self->operation_count == 0 && - ( - // TODO(amaanq): remove cancellation flag & clock checks before 0.26 - (self->cancellation_flag && atomic_load(self->cancellation_flag)) || - (!clock_is_null(self->end_clock) && clock_is_gt(clock_now(), self->end_clock)) || - (self->parse_options.progress_callback && self->parse_options.progress_callback(&self->parse_state)) - ) + (self->parse_options.progress_callback && self->parse_options.progress_callback(&self->parse_state)) ) { if (lookahead && lookahead->ptr) { ts_subtree_release(&self->tree_pool, *lookahead); @@ -1611,7 +1600,7 @@ static bool ts_parser__advance( } } - // If a cancellation flag, timeout, or progress callback was provided, then check every + // If a progress callback was provided, then check every // time a fixed number of parse actions has been processed. if (!ts_parser__check_progress(self, &lookahead, &position, 1)) { return false; @@ -1949,14 +1938,11 @@ TSParser *ts_parser_new(void) { self->finished_tree = NULL_SUBTREE; self->reusable_node = reusable_node_new(); self->dot_graph_file = NULL; - self->cancellation_flag = NULL; - self->timeout_duration = 0; self->language = NULL; self->has_scanner_error = false; self->has_error = false; self->canceled_balancing = false; self->external_scanner_payload = NULL; - self->end_clock = clock_null(); self->operation_count = 0; self->old_tree = NULL_SUBTREE; self->included_range_differences = (TSRangeArray) array_new(); @@ -2042,22 +2028,6 @@ void ts_parser_print_dot_graphs(TSParser *self, int fd) { } } -const size_t *ts_parser_cancellation_flag(const TSParser *self) { - return (const size_t *)self->cancellation_flag; -} - -void ts_parser_set_cancellation_flag(TSParser *self, const size_t *flag) { - self->cancellation_flag = (const volatile size_t *)flag; -} - -uint64_t ts_parser_timeout_micros(const TSParser *self) { - return duration_to_micros(self->timeout_duration); -} - -void ts_parser_set_timeout_micros(TSParser *self, uint64_t timeout_micros) { - self->timeout_duration = duration_from_micros(timeout_micros); -} - bool ts_parser_set_included_ranges( TSParser *self, const TSRange *ranges, @@ -2115,11 +2085,6 @@ TSTree *ts_parser_parse( self->included_range_difference_index = 0; self->operation_count = 0; - if (self->timeout_duration) { - self->end_clock = clock_after(clock_now(), self->timeout_duration); - } else { - self->end_clock = clock_null(); - } if (ts_parser_has_outstanding_parse(self)) { LOG("resume_parsing"); diff --git a/lib/src/query.c b/lib/src/query.c index a961fbbb..90dd30b6 100644 --- a/lib/src/query.c +++ b/lib/src/query.c @@ -10,7 +10,6 @@ #include "tree_sitter/api.h" #include "./alloc.h" #include "./array.h" -#include "./clock.h" #include "./language.h" #include "./point.h" #include "./tree_cursor.h" @@ -324,8 +323,6 @@ struct TSQueryCursor { TSPoint start_point; TSPoint end_point; uint32_t next_state_id; - TSClock end_clock; - TSDuration timeout_duration; const TSQueryCursorOptions *query_options; TSQueryCursorState query_state; unsigned operation_count; @@ -339,7 +336,7 @@ static const TSQueryError PARENT_DONE = -1; static const uint16_t PATTERN_DONE_MARKER = UINT16_MAX; static const uint16_t NONE = UINT16_MAX; static const TSSymbol WILDCARD_SYMBOL = 0; -static const unsigned OP_COUNT_PER_QUERY_TIMEOUT_CHECK = 100; +static const unsigned OP_COUNT_PER_QUERY_CALLBACK_CHECK = 100; /********** * Stream @@ -3099,8 +3096,6 @@ TSQueryCursor *ts_query_cursor_new(void) { .start_point = {0, 0}, .end_point = POINT_MAX, .max_start_depth = UINT32_MAX, - .timeout_duration = 0, - .end_clock = clock_null(), .operation_count = 0, }; array_reserve(&self->states, 8); @@ -3128,14 +3123,6 @@ void ts_query_cursor_set_match_limit(TSQueryCursor *self, uint32_t limit) { self->capture_list_pool.max_capture_list_count = limit; } -uint64_t ts_query_cursor_timeout_micros(const TSQueryCursor *self) { - return duration_to_micros(self->timeout_duration); -} - -void ts_query_cursor_set_timeout_micros(TSQueryCursor *self, uint64_t timeout_micros) { - self->timeout_duration = duration_from_micros(timeout_micros); -} - #ifdef DEBUG_EXECUTE_QUERY #define LOG(...) fprintf(stderr, __VA_ARGS__) #else @@ -3185,11 +3172,6 @@ void ts_query_cursor_exec( self->query = query; self->did_exceed_match_limit = false; self->operation_count = 0; - if (self->timeout_duration) { - self->end_clock = clock_after(clock_now(), self->timeout_duration); - } else { - self->end_clock = clock_null(); - } self->query_options = NULL; self->query_state = (TSQueryCursorState) {0}; } @@ -3614,7 +3596,7 @@ static inline bool ts_query_cursor__advance( } } - if (++self->operation_count == OP_COUNT_PER_QUERY_TIMEOUT_CHECK) { + if (++self->operation_count == OP_COUNT_PER_QUERY_CALLBACK_CHECK) { self->operation_count = 0; } @@ -3627,7 +3609,6 @@ static inline bool ts_query_cursor__advance( ( self->operation_count == 0 && ( - (!clock_is_null(self->end_clock) && clock_is_gt(clock_now(), self->end_clock)) || (self->query_options && self->query_options->progress_callback && self->query_options->progress_callback(&self->query_state)) ) ) From d60ef9ad0a1a00f92b76873e623f159210614d68 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Thu, 11 Sep 2025 03:11:07 -0400 Subject: [PATCH 435/663] feat(rust)!: remove deprecated functions --- crates/cli/src/main.rs | 7 - crates/xtask/src/check_wasm_exports.rs | 6 +- lib/binding_rust/bindings.rs | 34 +---- lib/binding_rust/lib.rs | 182 +------------------------ 4 files changed, 8 insertions(+), 221 deletions(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index be27b596..dab1806a 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -158,9 +158,6 @@ struct Build { /// Build a Wasm module instead of a dynamic library #[arg(short, long)] pub wasm: bool, - /// No longer used. - #[arg(short, long)] - pub docker: bool, /// The path to output the compiled file #[arg(short, long)] pub output: Option, @@ -904,10 +901,6 @@ impl Build { fn run(self, mut loader: loader::Loader, current_dir: &Path) -> Result<()> { let grammar_path = current_dir.join(self.path.unwrap_or_default()); - if self.docker { - eprintln!("Warning: --docker flag is no longer used, and will be removed in a future release."); - } - loader.debug_build(self.debug); if self.wasm { diff --git a/crates/xtask/src/check_wasm_exports.rs b/crates/xtask/src/check_wasm_exports.rs index 73ab4ba0..b2193bb3 100644 --- a/crates/xtask/src/check_wasm_exports.rs +++ b/crates/xtask/src/check_wasm_exports.rs @@ -15,7 +15,7 @@ use notify_debouncer_full::new_debouncer; use crate::{bail_on_err, watch_wasm, CheckWasmExports}; -const EXCLUDES: [&str; 27] = [ +const EXCLUDES: [&str; 23] = [ // Unneeded because the JS side has its own way of implementing it "ts_node_child_by_field_name", "ts_node_edit", @@ -28,8 +28,6 @@ const EXCLUDES: [&str; 27] = [ // Not used in Wasm "ts_init", "ts_set_allocator", - "ts_parser_set_cancellation_flag", - "ts_parser_cancellation_flag", "ts_parser_print_dot_graphs", "ts_tree_print_dot_graph", "ts_parser_set_wasm_store", @@ -43,10 +41,8 @@ const EXCLUDES: [&str; 27] = [ "ts_parser_parse_string_encoding", // Query cursor is not managed by user in web bindings "ts_query_cursor_delete", - "ts_query_cursor_timeout_micros", "ts_query_cursor_match_limit", "ts_query_cursor_remove_match", - "ts_query_cursor_timeout_micros", ]; pub fn run(args: &CheckWasmExports) -> Result<()> { diff --git a/lib/binding_rust/bindings.rs b/lib/binding_rust/bindings.rs index c8d0e864..77bfef32 100644 --- a/lib/binding_rust/bindings.rs +++ b/lib/binding_rust/bindings.rs @@ -1,4 +1,4 @@ -/* automatically generated by rust-bindgen 0.72.0 */ +/* automatically generated by rust-bindgen 0.72.1 */ pub const TREE_SITTER_LANGUAGE_VERSION: u32 = 15; pub const TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION: u32 = 13; @@ -218,7 +218,7 @@ extern "C" { pub fn ts_parser_included_ranges(self_: *const TSParser, count: *mut u32) -> *const TSRange; } extern "C" { - #[doc = " Use the parser to parse some source code and create a syntax tree.\n\n If you are parsing this document for the first time, pass `NULL` for the\n `old_tree` parameter. Otherwise, if you have already parsed an earlier\n version of this document and the document has since been edited, pass the\n previous syntax tree so that the unchanged parts of it can be reused.\n This will save time and memory. For this to work correctly, you must have\n already edited the old syntax tree using the [`ts_tree_edit`] function in a\n way that exactly matches the source code changes.\n\n The [`TSInput`] parameter lets you specify how to read the text. It has the\n following three fields:\n 1. [`read`]: A function to retrieve a chunk of text at a given byte offset\n and (row, column) position. The function should return a pointer to the\n text and write its length to the [`bytes_read`] pointer. The parser does\n not take ownership of this buffer; it just borrows it until it has\n finished reading it. The function should write a zero value to the\n [`bytes_read`] pointer to indicate the end of the document.\n 2. [`payload`]: An arbitrary pointer that will be passed to each invocation\n of the [`read`] function.\n 3. [`encoding`]: An indication of how the text is encoded. Either\n `TSInputEncodingUTF8` or `TSInputEncodingUTF16`.\n\n This function returns a syntax tree on success, and `NULL` on failure. There\n are four possible reasons for failure:\n 1. The parser does not have a language assigned. Check for this using the\n[`ts_parser_language`] function.\n 2. Parsing was cancelled due to a timeout that was set by an earlier call to\n the [`ts_parser_set_timeout_micros`] function. You can resume parsing from\n where the parser left out by calling [`ts_parser_parse`] again with the\n same arguments. Or you can start parsing from scratch by first calling\n [`ts_parser_reset`].\n 3. Parsing was cancelled using a cancellation flag that was set by an\n earlier call to [`ts_parser_set_cancellation_flag`]. You can resume parsing\n from where the parser left out by calling [`ts_parser_parse`] again with\n the same arguments.\n 4. Parsing was cancelled due to the progress callback returning true. This callback\n is passed in [`ts_parser_parse_with_options`] inside the [`TSParseOptions`] struct.\n\n [`read`]: TSInput::read\n [`payload`]: TSInput::payload\n [`encoding`]: TSInput::encoding\n [`bytes_read`]: TSInput::read"] + #[doc = " Use the parser to parse some source code and create a syntax tree.\n\n If you are parsing this document for the first time, pass `NULL` for the\n `old_tree` parameter. Otherwise, if you have already parsed an earlier\n version of this document and the document has since been edited, pass the\n previous syntax tree so that the unchanged parts of it can be reused.\n This will save time and memory. For this to work correctly, you must have\n already edited the old syntax tree using the [`ts_tree_edit`] function in a\n way that exactly matches the source code changes.\n\n The [`TSInput`] parameter lets you specify how to read the text. It has the\n following three fields:\n 1. [`read`]: A function to retrieve a chunk of text at a given byte offset\n and (row, column) position. The function should return a pointer to the\n text and write its length to the [`bytes_read`] pointer. The parser does\n not take ownership of this buffer; it just borrows it until it has\n finished reading it. The function should write a zero value to the\n [`bytes_read`] pointer to indicate the end of the document.\n 2. [`payload`]: An arbitrary pointer that will be passed to each invocation\n of the [`read`] function.\n 3. [`encoding`]: An indication of how the text is encoded. Either\n `TSInputEncodingUTF8` or `TSInputEncodingUTF16`.\n\n This function returns a syntax tree on success, and `NULL` on failure. There\n are four possible reasons for failure:\n 1. The parser does not have a language assigned. Check for this using the\n[`ts_parser_language`] function.\n 2. Parsing was cancelled due to the progress callback returning true. This callback\n is passed in [`ts_parser_parse_with_options`] inside the [`TSParseOptions`] struct.\n\n [`read`]: TSInput::read\n [`payload`]: TSInput::payload\n [`encoding`]: TSInput::encoding\n [`bytes_read`]: TSInput::read"] pub fn ts_parser_parse( self_: *mut TSParser, old_tree: *const TSTree, @@ -254,25 +254,9 @@ extern "C" { ) -> *mut TSTree; } extern "C" { - #[doc = " Instruct the parser to start the next parse from the beginning.\n\n If the parser previously failed because of a timeout or a cancellation, then\n by default, it will resume where it left off on the next call to\n [`ts_parser_parse`] or other parsing functions. If you don't want to resume,\n and instead intend to use this parser to parse some other document, you must\n call [`ts_parser_reset`] first."] + #[doc = " Instruct the parser to start the next parse from the beginning.\n\n If the parser previously failed because of the progress callback, then\n by default, it will resume where it left off on the next call to\n [`ts_parser_parse`] or other parsing functions. If you don't want to resume,\n and instead intend to use this parser to parse some other document, you must\n call [`ts_parser_reset`] first."] pub fn ts_parser_reset(self_: *mut TSParser); } -extern "C" { - #[doc = " @deprecated use [`ts_parser_parse_with_options`] and pass in a callback instead, this will be removed in 0.26.\n\n Set the maximum duration in microseconds that parsing should be allowed to\n take before halting.\n\n If parsing takes longer than this, it will halt early, returning NULL.\n See [`ts_parser_parse`] for more information."] - pub fn ts_parser_set_timeout_micros(self_: *mut TSParser, timeout_micros: u64); -} -extern "C" { - #[doc = " @deprecated use [`ts_parser_parse_with_options`] and pass in a callback instead, this will be removed in 0.26.\n\n Get the duration in microseconds that parsing is allowed to take."] - pub fn ts_parser_timeout_micros(self_: *const TSParser) -> u64; -} -extern "C" { - #[doc = " @deprecated use [`ts_parser_parse_with_options`] and pass in a callback instead, this will be removed in 0.26.\n\n Set the parser's current cancellation flag pointer.\n\n If a non-null pointer is assigned, then the parser will periodically read\n from this pointer during parsing. If it reads a non-zero value, it will\n halt early, returning NULL. See [`ts_parser_parse`] for more information."] - pub fn ts_parser_set_cancellation_flag(self_: *mut TSParser, flag: *const usize); -} -extern "C" { - #[doc = " @deprecated use [`ts_parser_parse_with_options`] and pass in a callback instead, this will be removed in 0.26.\n\n Get the parser's current cancellation flag pointer."] - pub fn ts_parser_cancellation_flag(self_: *const TSParser) -> *const usize; -} extern "C" { #[doc = " Set the logger that a parser should use during parsing.\n\n The parser does not take ownership over the logger payload. If a logger was\n previously assigned, the caller is responsible for releasing any memory\n owned by the previous logger."] pub fn ts_parser_set_logger(self_: *mut TSParser, logger: TSLogger); @@ -704,14 +688,6 @@ extern "C" { extern "C" { pub fn ts_query_cursor_set_match_limit(self_: *mut TSQueryCursor, limit: u32); } -extern "C" { - #[doc = " @deprecated use [`ts_query_cursor_exec_with_options`] and pass in a callback instead, this will be removed in 0.26.\n\n Set the maximum duration in microseconds that query execution should be allowed to\n take before halting.\n\n If query execution takes longer than this, it will halt early, returning NULL.\n See [`ts_query_cursor_next_match`] or [`ts_query_cursor_next_capture`] for more information."] - pub fn ts_query_cursor_set_timeout_micros(self_: *mut TSQueryCursor, timeout_micros: u64); -} -extern "C" { - #[doc = " @deprecated use [`ts_query_cursor_exec_with_options`] and pass in a callback instead, this will be removed in 0.26.\n\n Get the duration in microseconds that query execution is allowed to take.\n\n This is set via [`ts_query_cursor_set_timeout_micros`]."] - pub fn ts_query_cursor_timeout_micros(self_: *const TSQueryCursor) -> u64; -} extern "C" { #[doc = " Set the range of bytes in which the query will be executed.\n\n The query cursor will return matches that intersect with the given point range.\n This means that a match may be returned even if some of its captures fall\n outside the specified range, as long as at least part of the match\n overlaps with the range.\n\n For example, if a query pattern matches a node that spans a larger area\n than the specified range, but part of that node intersects with the range,\n the entire match will be returned.\n\n This will return `false` if the start byte is greater than the end byte, otherwise\n it will return `true`."] pub fn ts_query_cursor_set_byte_range( @@ -815,10 +791,6 @@ extern "C" { #[doc = " Check whether the given node type id belongs to named nodes, anonymous nodes,\n or a hidden nodes.\n\n See also [`ts_node_is_named`]. Hidden nodes are never returned from the API."] pub fn ts_language_symbol_type(self_: *const TSLanguage, symbol: TSSymbol) -> TSSymbolType; } -extern "C" { - #[doc = " @deprecated use [`ts_language_abi_version`] instead, this will be removed in 0.26.\n\n Get the ABI version number for this language. This version number is used\n to ensure that languages were generated by a compatible version of\n Tree-sitter.\n\n See also [`ts_parser_set_language`]."] - pub fn ts_language_version(self_: *const TSLanguage) -> u32; -} extern "C" { #[doc = " Get the ABI version number for this language. This version number is used\n to ensure that languages were generated by a compatible version of\n Tree-sitter.\n\n See also [`ts_parser_set_language`]."] pub fn ts_language_abi_version(self_: *const TSLanguage) -> u32; diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs index e3b2d950..074981da 100644 --- a/lib/binding_rust/lib.rs +++ b/lib/binding_rust/lib.rs @@ -19,7 +19,6 @@ use core::{ ops::{self, ControlFlow, Deref}, ptr::{self, NonNull}, slice, str, - sync::atomic::AtomicUsize, }; #[cfg(feature = "std")] use std::error; @@ -435,15 +434,6 @@ impl Language { (!ptr.is_null()).then(|| unsafe { CStr::from_ptr(ptr) }.to_str().unwrap()) } - /// Get the ABI version number that indicates which version of the - /// Tree-sitter CLI that was used to generate this [`Language`]. - #[doc(alias = "ts_language_version")] - #[deprecated(since = "0.25.0", note = "Use abi_version instead")] - #[must_use] - pub fn version(&self) -> usize { - unsafe { ffi::ts_language_version(self.0) as usize } - } - /// Get the ABI version number that indicates which version of the /// Tree-sitter CLI that was used to generate this [`Language`]. #[doc(alias = "ts_language_abi_version")] @@ -792,8 +782,6 @@ impl Parser { /// /// Returns a [`Tree`] if parsing succeeded, or `None` if: /// * The parser has not yet had a language assigned with [`Parser::set_language`] - /// * The timeout set with [`Parser::set_timeout_micros`] expired (deprecated) - /// * The cancellation flag set with [`Parser::set_cancellation_flag`] was flipped (deprecated) #[doc(alias = "ts_parser_parse")] pub fn parse(&mut self, text: impl AsRef<[u8]>, old_tree: Option<&Tree>) -> Option { let bytes = text.as_ref(); @@ -805,47 +793,6 @@ impl Parser { ) } - /// Parse a slice of UTF16 text. - /// - /// # Arguments: - /// * `text` The UTF16-encoded text to parse. - /// * `old_tree` A previous syntax tree parsed from the same document. If the text of the - /// document has changed since `old_tree` was created, then you must edit `old_tree` to match - /// the new text using [`Tree::edit`]. - #[deprecated(since = "0.25.0", note = "Prefer parse_utf16_le instead")] - pub fn parse_utf16( - &mut self, - input: impl AsRef<[u16]>, - old_tree: Option<&Tree>, - ) -> Option { - let code_points = input.as_ref(); - let len = code_points.len(); - self.parse_utf16_le_with_options( - &mut |i, _| (i < len).then(|| &code_points[i..]).unwrap_or_default(), - old_tree, - None, - ) - } - - /// Parse UTF8 text provided in chunks by a callback. - /// - /// # Arguments: - /// * `callback` A function that takes a byte offset and position and returns a slice of - /// UTF8-encoded text starting at that byte offset and position. The slices can be of any - /// length. If the given position is at the end of the text, the callback should return an - /// empty slice. - /// * `old_tree` A previous syntax tree parsed from the same document. If the text of the - /// document has changed since `old_tree` was created, then you must edit `old_tree` to match - /// the new text using [`Tree::edit`]. - #[deprecated(since = "0.25.0", note = "Prefer `parse_with_options` instead")] - pub fn parse_with, F: FnMut(usize, Point) -> T>( - &mut self, - callback: &mut F, - old_tree: Option<&Tree>, - ) -> Option { - self.parse_with_options(callback, old_tree, None) - } - /// Parse text provided in chunks by a callback. /// /// # Arguments: @@ -939,28 +886,6 @@ impl Parser { } } - /// Parse UTF16 text provided in chunks by a callback. - /// - /// # Arguments: - /// * `callback` A function that takes a code point offset and position and returns a slice of - /// UTF16-encoded text starting at that byte offset and position. The slices can be of any - /// length. If the given position is at the end of the text, the callback should return an - /// empty slice. - /// * `old_tree` A previous syntax tree parsed from the same document. If the text of the - /// document has changed since `old_tree` was created, then you must edit `old_tree` to match - /// the new text using [`Tree::edit`]. - #[deprecated( - since = "0.25.0", - note = "Prefer `parse_utf16_le_with_options` instead" - )] - pub fn parse_utf16_with, F: FnMut(usize, Point) -> T>( - &mut self, - callback: &mut F, - old_tree: Option<&Tree>, - ) -> Option { - self.parse_utf16_le_with_options(callback, old_tree, None) - } - /// Parse a slice of UTF16 little-endian text. /// /// # Arguments: @@ -1313,43 +1238,15 @@ impl Parser { /// Instruct the parser to start the next parse from the beginning. /// - /// If the parser previously failed because of a timeout, cancellation, - /// or callback, then by default, it will resume where it left off on the - /// next call to [`parse`](Parser::parse) or other parsing functions. - /// If you don't want to resume, and instead intend to use this parser to - /// parse some other document, you must call `reset` first. + /// If the parser previously failed because of a callback, then by default, + /// it will resume where it left off on the next call to [`parse`](Parser::parse) + /// or other parsing functions. If you don't want to resume, and instead intend to use + /// this parser to parse some other document, you must call `reset` first. #[doc(alias = "ts_parser_reset")] pub fn reset(&mut self) { unsafe { ffi::ts_parser_reset(self.0.as_ptr()) } } - /// Get the duration in microseconds that parsing is allowed to take. - /// - /// This is set via [`set_timeout_micros`](Parser::set_timeout_micros). - #[doc(alias = "ts_parser_timeout_micros")] - #[deprecated( - since = "0.25.0", - note = "Prefer using `parse_with_options` and using a callback" - )] - #[must_use] - pub fn timeout_micros(&self) -> u64 { - unsafe { ffi::ts_parser_timeout_micros(self.0.as_ptr()) } - } - - /// Set the maximum duration in microseconds that parsing should be allowed - /// to take before halting. - /// - /// If parsing takes longer than this, it will halt early, returning `None`. - /// See [`parse`](Parser::parse) for more information. - #[doc(alias = "ts_parser_set_timeout_micros")] - #[deprecated( - since = "0.25.0", - note = "Prefer using `parse_with_options` and using a callback" - )] - pub fn set_timeout_micros(&mut self, timeout_micros: u64) { - unsafe { ffi::ts_parser_set_timeout_micros(self.0.as_ptr(), timeout_micros) } - } - /// Set the ranges of text that the parser should include when parsing. /// /// By default, the parser will always include entire documents. This @@ -1405,49 +1302,6 @@ impl Parser { result } } - - /// Get the parser's current cancellation flag pointer. - /// - /// # Safety - /// - /// It uses FFI - #[doc(alias = "ts_parser_cancellation_flag")] - #[deprecated( - since = "0.25.0", - note = "Prefer using `parse_with_options` and using a callback" - )] - #[must_use] - pub unsafe fn cancellation_flag(&self) -> Option<&AtomicUsize> { - ffi::ts_parser_cancellation_flag(self.0.as_ptr()) - .cast::() - .as_ref() - } - - /// Set the parser's current cancellation flag pointer. - /// - /// If a pointer is assigned, then the parser will periodically read from - /// this pointer during parsing. If it reads a non-zero value, it will halt - /// early, returning `None`. See [`parse`](Parser::parse) for more - /// information. - /// - /// # Safety - /// - /// It uses FFI - #[doc(alias = "ts_parser_set_cancellation_flag")] - #[deprecated( - since = "0.25.0", - note = "Prefer using `parse_with_options` and using a callback" - )] - pub unsafe fn set_cancellation_flag(&mut self, flag: Option<&AtomicUsize>) { - if let Some(flag) = flag { - ffi::ts_parser_set_cancellation_flag( - self.0.as_ptr(), - core::ptr::from_ref::(flag).cast::(), - ); - } else { - ffi::ts_parser_set_cancellation_flag(self.0.as_ptr(), ptr::null()); - } - } } impl Drop for Parser { @@ -3025,34 +2879,6 @@ impl QueryCursor { } } - /// Set the maximum duration in microseconds that query execution should be allowed to - /// take before halting. - /// - /// If query execution takes longer than this, it will halt early, returning None. - #[doc(alias = "ts_query_cursor_set_timeout_micros")] - #[deprecated( - since = "0.25.0", - note = "Prefer using `matches_with_options` or `captures_with_options` and using a callback" - )] - pub fn set_timeout_micros(&mut self, timeout: u64) { - unsafe { - ffi::ts_query_cursor_set_timeout_micros(self.ptr.as_ptr(), timeout); - } - } - - /// Get the duration in microseconds that query execution is allowed to take. - /// - /// This is set via [`set_timeout_micros`](QueryCursor::set_timeout_micros). - #[doc(alias = "ts_query_cursor_timeout_micros")] - #[deprecated( - since = "0.25.0", - note = "Prefer using `matches_with_options` or `captures_with_options` and using a callback" - )] - #[must_use] - pub fn timeout_micros(&self) -> u64 { - unsafe { ffi::ts_query_cursor_timeout_micros(self.ptr.as_ptr()) } - } - /// Check if, on its last execution, this cursor exceeded its maximum number /// of in-progress matches. #[doc(alias = "ts_query_cursor_did_exceed_match_limit")] From 580cd9541a95854d45639ab306a73267a7c0ffe0 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Thu, 11 Sep 2025 03:11:16 -0400 Subject: [PATCH 436/663] feat(web)!: remove deprecated functions --- lib/binding_web/lib/exports.txt | 3 --- lib/binding_web/lib/tree-sitter.c | 8 ++----- lib/binding_web/lib/web-tree-sitter.d.ts | 7 ++---- lib/binding_web/src/language.ts | 26 -------------------- lib/binding_web/src/parser.ts | 30 +++--------------------- lib/binding_web/src/query.ts | 17 +------------- lib/binding_web/test/query.test.ts | 11 --------- 7 files changed, 8 insertions(+), 94 deletions(-) diff --git a/lib/binding_web/lib/exports.txt b/lib/binding_web/lib/exports.txt index 7b3b4270..43a42bd4 100644 --- a/lib/binding_web/lib/exports.txt +++ b/lib/binding_web/lib/exports.txt @@ -11,7 +11,6 @@ "ts_language_symbol_name", "ts_language_symbol_type", "ts_language_name", -"ts_language_version", "ts_language_abi_version", "ts_language_metadata_wasm", "ts_language_next_state", @@ -62,8 +61,6 @@ "ts_parser_set_language", "ts_parser_set_included_ranges", "ts_parser_included_ranges_wasm", -"ts_parser_set_timeout_micros", -"ts_parser_timeout_micros", "ts_query_capture_count", "ts_query_capture_name_for_id", "ts_query_captures_wasm", diff --git a/lib/binding_web/lib/tree-sitter.c b/lib/binding_web/lib/tree-sitter.c index 5afb76b9..db6c108b 100644 --- a/lib/binding_web/lib/tree-sitter.c +++ b/lib/binding_web/lib/tree-sitter.c @@ -875,8 +875,7 @@ void ts_query_matches_wasm( uint32_t start_index, uint32_t end_index, uint32_t match_limit, - uint32_t max_start_depth, - uint64_t timeout_micros + uint32_t max_start_depth ) { if (!scratch_query_cursor) { scratch_query_cursor = ts_query_cursor_new(); @@ -894,7 +893,6 @@ void ts_query_matches_wasm( ts_query_cursor_set_byte_range(scratch_query_cursor, start_index, end_index); ts_query_cursor_set_match_limit(scratch_query_cursor, match_limit); ts_query_cursor_set_max_start_depth(scratch_query_cursor, max_start_depth); - ts_query_cursor_set_timeout_micros(scratch_query_cursor, timeout_micros); TSQueryCursorOptions options = {.payload = NULL, .progress_callback = query_progress_callback}; @@ -935,8 +933,7 @@ void ts_query_captures_wasm( uint32_t start_index, uint32_t end_index, uint32_t match_limit, - uint32_t max_start_depth, - uint64_t timeout_micros + uint32_t max_start_depth ) { if (!scratch_query_cursor) { scratch_query_cursor = ts_query_cursor_new(); @@ -951,7 +948,6 @@ void ts_query_captures_wasm( ts_query_cursor_set_byte_range(scratch_query_cursor, start_index, end_index); ts_query_cursor_set_match_limit(scratch_query_cursor, match_limit); ts_query_cursor_set_max_start_depth(scratch_query_cursor, max_start_depth); - ts_query_cursor_set_timeout_micros(scratch_query_cursor, timeout_micros); ts_query_cursor_exec(scratch_query_cursor, self, node); unsigned index = 0; diff --git a/lib/binding_web/lib/web-tree-sitter.d.ts b/lib/binding_web/lib/web-tree-sitter.d.ts index c8b7c70a..c19d7bf4 100644 --- a/lib/binding_web/lib/web-tree-sitter.d.ts +++ b/lib/binding_web/lib/web-tree-sitter.d.ts @@ -56,7 +56,6 @@ interface WasmModule { _memcmp(_0: number, _1: number, _2: number): number; _ts_language_symbol_count(_0: number): number; _ts_language_state_count(_0: number): number; - _ts_language_version(_0: number): number; _ts_language_abi_version(_0: number): number; _ts_language_name(_0: number): number; _ts_language_field_count(_0: number): number; @@ -75,8 +74,6 @@ interface WasmModule { _ts_parser_delete(_0: number): void; _ts_parser_reset(_0: number): void; _ts_parser_set_language(_0: number, _1: number): number; - _ts_parser_timeout_micros(_0: number): bigint; - _ts_parser_set_timeout_micros(_0: number, _1: bigint): void; _ts_parser_set_included_ranges(_0: number, _1: number, _2: number): number; _ts_query_new(_0: number, _1: number, _2: number, _3: number, _4: number): number; _ts_query_delete(_0: number): void; @@ -178,8 +175,8 @@ interface WasmModule { _ts_node_is_extra_wasm(_0: number): number; _ts_node_parse_state_wasm(_0: number): number; _ts_node_next_parse_state_wasm(_0: number): number; - _ts_query_matches_wasm(_0: number, _1: number, _2: number, _3: number, _4: number, _5: number, _6: number, _7: number, _8: number, _9: number, _10: bigint): void; - _ts_query_captures_wasm(_0: number, _1: number, _2: number, _3: number, _4: number, _5: number, _6: number, _7: number, _8: number, _9: number, _10: bigint): void; + _ts_query_matches_wasm(_0: number, _1: number, _2: number, _3: number, _4: number, _5: number, _6: number, _7: number, _8: number, _9: number): void; + _ts_query_captures_wasm(_0: number, _1: number, _2: number, _3: number, _4: number, _5: number, _6: number, _7: number, _8: number, _9: number): void; _memset(_0: number, _1: number, _2: number): number; _memcpy(_0: number, _1: number, _2: number): number; _memmove(_0: number, _1: number, _2: number): number; diff --git a/lib/binding_web/src/language.ts b/lib/binding_web/src/language.ts index ea305836..664e355b 100644 --- a/lib/binding_web/src/language.ts +++ b/lib/binding_web/src/language.ts @@ -2,7 +2,6 @@ import { C, INTERNAL, Internal, assertInternal, SIZE_OF_INT, SIZE_OF_SHORT } fro import { LookaheadIterator } from './lookahead_iterator'; import { unmarshalLanguageMetadata } from './marshal'; import { TRANSFER_BUFFER } from './parser'; -import { Query } from './query'; const LANGUAGE_FUNCTION_REGEX = /^tree_sitter_\w+$/; @@ -63,14 +62,6 @@ export class Language { return C.UTF8ToString(ptr); } - /** - * @deprecated since version 0.25.0, use {@link Language#abiVersion} instead - * Gets the version of the language. - */ - get version(): number { - return C._ts_language_version(this[0]); - } - /** * Gets the ABI version of the language. */ @@ -232,23 +223,6 @@ export class Language { return null; } - /** - * @deprecated since version 0.25.0, call `new` on a {@link Query} instead - * - * Create a new query from a string containing one or more S-expression - * patterns. - * - * The query is associated with a particular language, and can only be run - * on syntax nodes parsed with that language. References to Queries can be - * shared between multiple threads. - * - * @link {@see https://tree-sitter.github.io/tree-sitter/using-parsers/queries} - */ - query(source: string): Query { - console.warn('Language.query is deprecated. Use new Query(language, source) instead.'); - return new Query(this, source); - } - /** * Load a language from a WebAssembly module. * The module can be provided as a path to a file or as a buffer. diff --git a/lib/binding_web/src/parser.ts b/lib/binding_web/src/parser.ts index e60fe2a3..efcadf05 100644 --- a/lib/binding_web/src/parser.ts +++ b/lib/binding_web/src/parser.ts @@ -153,7 +153,7 @@ export class Parser { this.language = null; } else if (language.constructor === Language) { address = language[0]; - const version = C._ts_language_version(address); + const version = C._ts_language_abi_version(address); if (version < MIN_COMPATIBLE_VERSION || LANGUAGE_VERSION < version) { throw new Error( `Incompatible language version ${version}. ` + @@ -253,8 +253,8 @@ export class Parser { /** * Instruct the parser to start the next parse from the beginning. * - * If the parser previously failed because of a timeout, cancellation, - * or callback, then by default, it will resume where it left off on the + * If the parser previously failed because of a callback, + * then by default, it will resume where it left off on the * next call to {@link Parser#parse} or other parsing functions. * If you don't want to resume, and instead intend to use this parser to * parse some other document, you must call `reset` first. @@ -282,30 +282,6 @@ export class Parser { return result; } - /** - * @deprecated since version 0.25.0, prefer passing a progress callback to {@link Parser#parse} - * - * Get the duration in microseconds that parsing is allowed to take. - * - * This is set via {@link Parser#setTimeoutMicros}. - */ - getTimeoutMicros(): bigint { - return C._ts_parser_timeout_micros(this[0]); - } - - /** - * @deprecated since version 0.25.0, prefer passing a progress callback to {@link Parser#parse} - * - * Set the maximum duration in microseconds that parsing should be allowed - * to take before halting. - * - * If parsing takes longer than this, it will halt early, returning `null`. - * See {@link Parser#parse} for more information. - */ - setTimeoutMicros(timeout: bigint): void { - C._ts_parser_set_timeout_micros(this[0], timeout); - } - /** Set the logging callback that a parser should use during parsing. */ setLogger(callback: LogCallback | boolean | null): this { if (!callback) { diff --git a/lib/binding_web/src/query.ts b/lib/binding_web/src/query.ts index 635a95dc..6f3064a8 100644 --- a/lib/binding_web/src/query.ts +++ b/lib/binding_web/src/query.ts @@ -50,14 +50,6 @@ export interface QueryOptions { */ maxStartDepth?: number; - /** - * The maximum duration in microseconds that query execution should be allowed to - * take before halting. - * - * If query execution takes longer than this, it will halt early, returning an empty array. - */ - timeoutMicros?: bigint; - /** * A function that will be called periodically during the execution of the query to check * if query execution should be cancelled. You can also use this to instrument query execution @@ -116,9 +108,6 @@ export interface QueryCapture { /** A match of a {@link Query} to a particular set of {@link Node}s. */ export interface QueryMatch { - /** @deprecated since version 0.25.0, use `patternIndex` instead. */ - pattern: number; - /** The index of the pattern that matched. */ patternIndex: number; @@ -708,7 +697,6 @@ export class Query { const endIndex = options.endIndex ?? 0; const matchLimit = options.matchLimit ?? 0xFFFFFFFF; const maxStartDepth = options.maxStartDepth ?? 0xFFFFFFFF; - const timeoutMicros = options.timeoutMicros ?? 0n; const progressCallback = options.progressCallback; if (typeof matchLimit !== 'number') { @@ -744,7 +732,6 @@ export class Query { endIndex, matchLimit, maxStartDepth, - timeoutMicros, ); const rawCount = C.getValue(TRANSFER_BUFFER, 'i32'); @@ -765,7 +752,7 @@ export class Query { address = unmarshalCaptures(this, node.tree, address, patternIndex, captures); if (this.textPredicates[patternIndex].every((p) => p(captures))) { - result[filteredCount] = { pattern: patternIndex, patternIndex, captures }; + result[filteredCount] = { patternIndex, captures }; const setProperties = this.setProperties[patternIndex]; result[filteredCount].setProperties = setProperties; const assertedProperties = this.assertedProperties[patternIndex]; @@ -803,7 +790,6 @@ export class Query { const endIndex = options.endIndex ?? 0; const matchLimit = options.matchLimit ?? 0xFFFFFFFF; const maxStartDepth = options.maxStartDepth ?? 0xFFFFFFFF; - const timeoutMicros = options.timeoutMicros ?? 0n; const progressCallback = options.progressCallback; if (typeof matchLimit !== 'number') { @@ -839,7 +825,6 @@ export class Query { endIndex, matchLimit, maxStartDepth, - timeoutMicros, ); const count = C.getValue(TRANSFER_BUFFER, 'i32'); diff --git a/lib/binding_web/test/query.test.ts b/lib/binding_web/test/query.test.ts index a6924dbf..ad6a6660 100644 --- a/lib/binding_web/test/query.test.ts +++ b/lib/binding_web/test/query.test.ts @@ -461,17 +461,6 @@ describe('Query', () => { }); }); - describe('Set a timeout', () => { - it('returns less than the expected matches', { timeout: 10000 }, () => { - tree = parser.parse('function foo() while (true) { } }\n'.repeat(1000))!; - query = new Query(JavaScript, '(function_declaration name: (identifier) @function)'); - const matches = query.matches(tree.rootNode, { timeoutMicros: 1000n }); - expect(matches.length).toBeLessThan(1000); - const matches2 = query.matches(tree.rootNode, { timeoutMicros: 0n }); - expect(matches2).toHaveLength(1000); - }); - }); - describe('Start and end indices for patterns', () => { it('Returns the start and end indices for a pattern', () => { const patterns1 = ` From ca8b944b5328586e90575873c5090d519939537a Mon Sep 17 00:00:00 2001 From: RedCMD <33529441+RedCMD@users.noreply.github.com> Date: Sat, 13 Sep 2025 21:51:42 +1200 Subject: [PATCH 437/663] build(web): fix cjs build --- crates/xtask/src/build_wasm.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/xtask/src/build_wasm.rs b/crates/xtask/src/build_wasm.rs index 62e6c95b..1f23b14d 100644 --- a/crates/xtask/src/build_wasm.rs +++ b/crates/xtask/src/build_wasm.rs @@ -199,7 +199,7 @@ pub fn run_wasm(args: &BuildWasm) -> Result<()> { "-I", "lib/include", "--js-library", "lib/binding_web/lib/imports.js", "--pre-js", "lib/binding_web/lib/prefix.js", - "-o", if args.cjs { binding_file!("cjs") } else { binding_file!(".mjs") }, + "-o", if args.cjs { binding_file!(".cjs") } else { binding_file!(".mjs") }, "lib/src/lib.c", "lib/binding_web/lib/tree-sitter.c", ]); From 06741d0d5d322ffb47e96d0299124a9728a8b737 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sat, 13 Sep 2025 21:38:07 -0400 Subject: [PATCH 438/663] fix(playground): check that `languageVersion` exists for compat --- docs/src/assets/js/playground.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/assets/js/playground.js b/docs/src/assets/js/playground.js index 5d167215..595fe565 100644 --- a/docs/src/assets/js/playground.js +++ b/docs/src/assets/js/playground.js @@ -206,10 +206,10 @@ window.initializePlayground = async (opts) => { languageName = newLanguageName; const metadata = languagesByName[languageName].metadata; - if (metadata) { + if (languageVersion && metadata) { languageVersion.textContent = `v${metadata.major_version}.${metadata.minor_version}.${metadata.patch_version}`; languageVersion.style.visibility = 'visible'; - } else { + } else if (languageVersion) { languageVersion.style.visibility = 'hidden'; } From 0c35511aeaf6436b0acb381a71fc3a5968a4ee65 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Fri, 12 Sep 2025 01:39:54 -0400 Subject: [PATCH 439/663] fix(lib): improve wasm scanner serialization error handling Co-authored-by: Amaan Qureshi --- lib/src/parser.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/src/parser.c b/lib/src/parser.c index 9362dc63..bb247911 100644 --- a/lib/src/parser.c +++ b/lib/src/parser.c @@ -390,20 +390,24 @@ static void ts_parser__external_scanner_destroy( static unsigned ts_parser__external_scanner_serialize( TSParser *self ) { + uint32_t length; if (ts_language_is_wasm(self->language)) { - return ts_wasm_store_call_scanner_serialize( + length = ts_wasm_store_call_scanner_serialize( self->wasm_store, (uintptr_t)self->external_scanner_payload, self->lexer.debug_buffer ); + if (ts_wasm_store_has_error(self->wasm_store)) { + self->has_scanner_error = true; + } } else { - uint32_t length = self->language->external_scanner.serialize( + length = self->language->external_scanner.serialize( self->external_scanner_payload, self->lexer.debug_buffer ); - ts_assert(length <= TREE_SITTER_SERIALIZATION_BUFFER_SIZE); - return length; } + ts_assert(length <= TREE_SITTER_SERIALIZATION_BUFFER_SIZE); + return length; } static void ts_parser__external_scanner_deserialize( From b863b1645437d7cba22aedd09a3e4c75a09bbbcc Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Fri, 12 Sep 2025 01:44:27 -0400 Subject: [PATCH 440/663] fix(xtask): make building the wasm stdlib work again Co-authored-by: Will Lillis --- crates/xtask/src/build_wasm.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/xtask/src/build_wasm.rs b/crates/xtask/src/build_wasm.rs index 1f23b14d..bbd28c24 100644 --- a/crates/xtask/src/build_wasm.rs +++ b/crates/xtask/src/build_wasm.rs @@ -353,7 +353,6 @@ pub fn run_wasm_stdlib() -> Result<()> { .collect::>(); let clang_exe = get_wasi_binary()?; - println!("Using WASI clang at: {}", clang_exe.display()); let output = Command::new(&clang_exe) .args([ @@ -361,6 +360,7 @@ pub fn run_wasm_stdlib() -> Result<()> { "stdlib.wasm", "-Os", "-fPIC", + "-DTREE_SITTER_FEATURE_WASM", "-Wl,--no-entry", "-Wl,--stack-first", "-Wl,-z", @@ -371,6 +371,7 @@ pub fn run_wasm_stdlib() -> Result<()> { "-Wl,--strip-debug", "-Wl,--export=__wasm_call_ctors", "-Wl,--export=__stack_pointer", + "-Wl,--export=reset_heap", ]) .args(&export_flags) .arg("lib/src/wasm/stdlib.c") From 69c42450c32a528fc716afbce6c0f52e77776ddf Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Fri, 12 Sep 2025 01:46:28 -0400 Subject: [PATCH 441/663] fix(lib/wasm): keep track of freed blocks that are not the last allocated pointer This fixes issues where the scanner allocates and frees a lot of data during a single parse. Co-authored-by: Will Lillis --- lib/src/wasm/stdlib.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/lib/src/wasm/stdlib.c b/lib/src/wasm/stdlib.c index 1ab3440e..1e6cf4a0 100644 --- a/lib/src/wasm/stdlib.c +++ b/lib/src/wasm/stdlib.c @@ -1,7 +1,10 @@ // This file implements a very simple allocator for external scanners running // in Wasm. Allocation is just bumping a static pointer and growing the heap -// as needed, and freeing is mostly a noop. But in the special case of freeing -// the last-allocated pointer, we'll reuse that pointer again. +// as needed, and freeing is just adding the freed region to a free list. +// When additional memory is allocated, the free list is searched first. +// If there is not a suitable region in the free list, the heap is +// grown as necessary, and the allocation is made at the end of the heap. +// When the heap is reset, all allocated memory is considered freed. #ifdef TREE_SITTER_FEATURE_WASM @@ -17,12 +20,14 @@ extern void tree_sitter_debug_message(const char *, size_t); typedef struct { size_t size; + struct Region *next; char data[0]; } Region; static Region *heap_end = NULL; static Region *heap_start = NULL; static Region *next = NULL; +static Region *free_list = NULL; // Get the region metadata for the given heap pointer. static inline Region *region_for_ptr(void *ptr) { @@ -51,9 +56,25 @@ void reset_heap(void *new_heap_start) { heap_start = new_heap_start; next = new_heap_start; heap_end = get_heap_end(); + free_list = NULL; } void *malloc(size_t size) { + Region *prev = NULL; + Region *curr = free_list; + while (curr != NULL) { + if (curr->size >= size) { + if (prev == NULL) { + free_list = curr->next; + } else { + prev->next = curr->next; + } + return &curr->data; + } + prev = curr; + curr = curr->next; + } + Region *region_end = region_after(next, size); if (region_end > heap_end) { @@ -81,6 +102,9 @@ void free(void *ptr) { // pointer for the next allocation. if (region_end == next) { next = region; + } else { + region->next = free_list; + free_list = region; } } From c4d02a525471d8ee4ca62eb925de7c9b96d141fe Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Fri, 12 Sep 2025 01:54:14 -0400 Subject: [PATCH 442/663] build(lib): regenerate wasm stdlib Co-authored-by: Will Lillis --- lib/src/wasm/wasm-stdlib.h | 2284 ++++++++++++++++++------------------ 1 file changed, 1152 insertions(+), 1132 deletions(-) diff --git a/lib/src/wasm/wasm-stdlib.h b/lib/src/wasm/wasm-stdlib.h index a9d241d7..d7929f03 100644 --- a/lib/src/wasm/wasm-stdlib.h +++ b/lib/src/wasm/wasm-stdlib.h @@ -1,5 +1,3 @@ -#ifdef TREE_SITTER_FEATURE_WASM - unsigned char STDLIB_WASM[] = { 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1e, 0x06, 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x00, 0x00, @@ -48,8 +46,8 @@ unsigned char STDLIB_WASM[] = { 0x72, 0x63, 0x6d, 0x70, 0x00, 0x19, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x61, 0x74, 0x00, 0x24, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x6d, 0x70, 0x00, 0x1d, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x70, 0x79, 0x00, 0x26, - 0x08, 0x01, 0x05, 0x0a, 0xff, 0x2b, 0x29, 0x02, 0x00, 0x0b, 0x03, 0x00, - 0x00, 0x0b, 0x0d, 0x00, 0x41, 0xe8, 0xc2, 0x04, 0x41, 0x00, 0x41, 0x10, + 0x08, 0x01, 0x05, 0x0a, 0x8c, 0x2f, 0x29, 0x02, 0x00, 0x0b, 0x03, 0x00, + 0x00, 0x0b, 0x0d, 0x00, 0x41, 0xe8, 0xc2, 0x04, 0x41, 0x00, 0x41, 0x14, 0xfc, 0x0b, 0x00, 0x0b, 0x51, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xe8, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x0d, 0x00, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, @@ -57,912 +55,945 @@ unsigned char STDLIB_WASM[] = { 0x10, 0x83, 0x80, 0x80, 0x80, 0x00, 0x10, 0x8d, 0x80, 0x80, 0x80, 0x00, 0x21, 0x00, 0x10, 0x92, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x0d, 0x01, 0x0f, 0x0b, 0x00, 0x0b, 0x20, 0x00, 0x10, 0x90, 0x80, 0x80, 0x80, 0x00, - 0x00, 0x0b, 0x37, 0x01, 0x01, 0x7f, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, + 0x00, 0x0b, 0x49, 0x01, 0x01, 0x7f, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0xec, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, - 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0xf4, 0xc2, 0x84, 0x80, 0x00, - 0x6a, 0x3f, 0x00, 0x41, 0x10, 0x74, 0x36, 0x02, 0x00, 0x0b, 0xb4, 0x01, - 0x01, 0x03, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, - 0x00, 0x22, 0x01, 0x41, 0xf4, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, - 0x00, 0x20, 0x01, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, - 0x00, 0x22, 0x01, 0x20, 0x00, 0x6a, 0x41, 0x07, 0x6a, 0x41, 0x7c, 0x71, - 0x22, 0x02, 0x4f, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x01, 0x20, 0x02, 0x23, - 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xec, 0xc2, 0x84, 0x80, 0x00, 0x6a, - 0x28, 0x02, 0x00, 0x6b, 0x41, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x0d, 0x01, - 0x20, 0x00, 0x41, 0x7f, 0x6a, 0x41, 0x10, 0x76, 0x41, 0x01, 0x6a, 0x40, - 0x00, 0x41, 0x7f, 0x46, 0x0d, 0x01, 0x3f, 0x00, 0x21, 0x01, 0x23, 0x81, - 0x80, 0x80, 0x80, 0x00, 0x22, 0x03, 0x41, 0xf4, 0xc2, 0x84, 0x80, 0x00, - 0x6a, 0x20, 0x01, 0x41, 0x10, 0x74, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, - 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x21, 0x01, 0x0b, - 0x20, 0x01, 0x20, 0x00, 0x36, 0x02, 0x00, 0x23, 0x81, 0x80, 0x80, 0x80, - 0x00, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x02, 0x36, 0x02, - 0x00, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x0b, 0x20, 0x01, 0x0b, - 0x48, 0x01, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, 0x00, 0x20, - 0x00, 0x41, 0x7c, 0x6a, 0x22, 0x01, 0x28, 0x02, 0x00, 0x21, 0x02, 0x23, - 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, - 0x28, 0x02, 0x00, 0x20, 0x00, 0x20, 0x02, 0x6a, 0x41, 0x03, 0x6a, 0x41, - 0x7c, 0x71, 0x47, 0x0d, 0x00, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, - 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x01, 0x36, 0x02, 0x00, 0x0b, - 0x0b, 0x19, 0x00, 0x20, 0x01, 0x20, 0x00, 0x6c, 0x22, 0x00, 0x10, 0x88, - 0x80, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x00, 0x10, 0x94, 0x80, 0x80, - 0x80, 0x00, 0x0b, 0x6b, 0x01, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x45, - 0x0d, 0x00, 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x22, 0x02, 0x28, 0x02, 0x00, - 0x21, 0x03, 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf0, - 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x20, 0x00, 0x20, 0x03, - 0x6a, 0x41, 0x03, 0x6a, 0x41, 0x7c, 0x71, 0x47, 0x0d, 0x00, 0x23, 0x81, - 0x80, 0x80, 0x80, 0x00, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, - 0x02, 0x36, 0x02, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x01, 0x10, 0x88, 0x80, - 0x80, 0x80, 0x00, 0x20, 0x00, 0x20, 0x02, 0x28, 0x02, 0x00, 0x10, 0x93, - 0x80, 0x80, 0x80, 0x00, 0x0f, 0x0b, 0x20, 0x01, 0x10, 0x88, 0x80, 0x80, - 0x80, 0x00, 0x0b, 0x0b, 0x00, 0x20, 0x00, 0x10, 0x90, 0x80, 0x80, 0x80, - 0x00, 0x00, 0x0b, 0xd5, 0x01, 0x01, 0x03, 0x7f, 0x23, 0x80, 0x80, 0x80, - 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x00, 0x24, 0x80, 0x80, 0x80, 0x80, - 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, - 0x00, 0x41, 0x08, 0x6a, 0x20, 0x00, 0x41, 0x0c, 0x6a, 0x10, 0x8f, 0x80, - 0x80, 0x80, 0x00, 0x0d, 0x00, 0x20, 0x00, 0x28, 0x02, 0x08, 0x41, 0x01, - 0x6a, 0x22, 0x01, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x28, 0x02, 0x0c, 0x10, - 0x88, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x01, - 0x41, 0x04, 0x10, 0x8a, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x45, 0x0d, - 0x03, 0x20, 0x01, 0x20, 0x02, 0x10, 0x8e, 0x80, 0x80, 0x80, 0x00, 0x0d, - 0x04, 0x20, 0x00, 0x28, 0x02, 0x08, 0x20, 0x01, 0x10, 0x84, 0x80, 0x80, - 0x80, 0x00, 0x21, 0x01, 0x20, 0x00, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, - 0x80, 0x80, 0x00, 0x20, 0x01, 0x0f, 0x0b, 0x41, 0xc7, 0x00, 0x10, 0x8c, - 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x8c, 0x80, - 0x80, 0x80, 0x00, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x8c, 0x80, 0x80, - 0x80, 0x00, 0x00, 0x0b, 0x20, 0x02, 0x10, 0x89, 0x80, 0x80, 0x80, 0x00, - 0x41, 0xc6, 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x20, - 0x02, 0x10, 0x89, 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x10, 0x89, 0x80, - 0x80, 0x80, 0x00, 0x41, 0xc7, 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, 0x00, - 0x00, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x80, 0x80, 0x80, - 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x11, 0x00, 0x20, 0x00, - 0x20, 0x01, 0x10, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, - 0x71, 0x0b, 0x0b, 0x00, 0x20, 0x00, 0x10, 0x82, 0x80, 0x80, 0x80, 0x00, - 0x00, 0x0b, 0x02, 0x00, 0x0b, 0x0e, 0x00, 0x10, 0x91, 0x80, 0x80, 0x80, - 0x00, 0x10, 0x91, 0x80, 0x80, 0x80, 0x00, 0x0b, 0xee, 0x07, 0x01, 0x04, - 0x7f, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x20, 0x4b, - 0x0d, 0x00, 0x20, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x02, - 0x45, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, - 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, - 0x6a, 0x21, 0x04, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x22, 0x05, 0x41, 0x03, - 0x71, 0x45, 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x20, - 0x01, 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02, 0x41, 0x7e, 0x6a, - 0x21, 0x03, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x41, - 0x02, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x02, 0x20, 0x03, - 0x45, 0x0d, 0x02, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, - 0x02, 0x20, 0x02, 0x41, 0x7d, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x03, - 0x6a, 0x21, 0x04, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x22, 0x05, 0x41, 0x03, - 0x71, 0x45, 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x20, - 0x01, 0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x02, 0x41, 0x7c, 0x6a, - 0x21, 0x03, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x41, - 0x04, 0x6a, 0x21, 0x05, 0x0c, 0x02, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x20, - 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x21, - 0x03, 0x20, 0x00, 0x21, 0x04, 0x20, 0x01, 0x21, 0x05, 0x0b, 0x02, 0x40, - 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x22, 0x02, 0x0d, 0x00, 0x02, - 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x10, 0x4f, 0x0d, 0x00, 0x20, 0x03, - 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x70, 0x6a, - 0x22, 0x02, 0x41, 0x10, 0x71, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, - 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x08, - 0x37, 0x02, 0x08, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, 0x04, 0x20, 0x05, - 0x41, 0x10, 0x6a, 0x21, 0x05, 0x20, 0x02, 0x21, 0x03, 0x0b, 0x20, 0x02, - 0x41, 0x10, 0x49, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x03, 0x40, 0x20, - 0x04, 0x20, 0x05, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x20, - 0x05, 0x29, 0x02, 0x08, 0x37, 0x02, 0x08, 0x20, 0x04, 0x20, 0x05, 0x29, - 0x02, 0x10, 0x37, 0x02, 0x10, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x18, - 0x37, 0x02, 0x18, 0x20, 0x04, 0x41, 0x20, 0x6a, 0x21, 0x04, 0x20, 0x05, - 0x41, 0x20, 0x6a, 0x21, 0x05, 0x20, 0x02, 0x41, 0x60, 0x6a, 0x22, 0x02, - 0x41, 0x0f, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, - 0x08, 0x49, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x00, 0x37, - 0x02, 0x00, 0x20, 0x05, 0x41, 0x08, 0x6a, 0x21, 0x05, 0x20, 0x04, 0x41, - 0x08, 0x6a, 0x21, 0x04, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0x04, 0x71, - 0x45, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, 0x28, 0x02, 0x00, 0x36, 0x02, - 0x00, 0x20, 0x05, 0x41, 0x04, 0x6a, 0x21, 0x05, 0x20, 0x04, 0x41, 0x04, - 0x6a, 0x21, 0x04, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0x02, 0x71, 0x45, - 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, - 0x20, 0x04, 0x41, 0x02, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x02, 0x6a, - 0x21, 0x05, 0x0b, 0x20, 0x02, 0x41, 0x01, 0x71, 0x45, 0x0d, 0x01, 0x20, - 0x04, 0x20, 0x05, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0f, - 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, - 0x03, 0x41, 0x20, 0x49, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, 0x28, 0x02, - 0x00, 0x22, 0x03, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, - 0x41, 0x7f, 0x6a, 0x0e, 0x03, 0x03, 0x00, 0x01, 0x03, 0x0b, 0x20, 0x04, - 0x20, 0x03, 0x41, 0x08, 0x76, 0x3a, 0x00, 0x01, 0x20, 0x04, 0x20, 0x05, - 0x41, 0x06, 0x6a, 0x29, 0x01, 0x00, 0x37, 0x02, 0x06, 0x20, 0x04, 0x20, - 0x05, 0x28, 0x02, 0x04, 0x41, 0x10, 0x74, 0x20, 0x03, 0x41, 0x10, 0x76, - 0x72, 0x36, 0x02, 0x02, 0x20, 0x04, 0x41, 0x12, 0x6a, 0x21, 0x02, 0x20, - 0x05, 0x41, 0x12, 0x6a, 0x21, 0x01, 0x41, 0x0e, 0x21, 0x06, 0x20, 0x05, - 0x41, 0x0e, 0x6a, 0x28, 0x01, 0x00, 0x21, 0x05, 0x41, 0x0e, 0x21, 0x03, - 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x41, 0x05, 0x6a, 0x29, 0x00, - 0x00, 0x37, 0x02, 0x05, 0x20, 0x04, 0x20, 0x05, 0x28, 0x02, 0x04, 0x41, - 0x18, 0x74, 0x20, 0x03, 0x41, 0x08, 0x76, 0x72, 0x36, 0x02, 0x01, 0x20, - 0x04, 0x41, 0x11, 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, 0x11, 0x6a, 0x21, - 0x01, 0x41, 0x0d, 0x21, 0x06, 0x20, 0x05, 0x41, 0x0d, 0x6a, 0x28, 0x00, - 0x00, 0x21, 0x05, 0x41, 0x0f, 0x21, 0x03, 0x0c, 0x02, 0x0b, 0x02, 0x40, - 0x02, 0x40, 0x20, 0x03, 0x41, 0x10, 0x4f, 0x0d, 0x00, 0x20, 0x04, 0x21, - 0x02, 0x20, 0x05, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x20, 0x05, - 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x20, 0x05, 0x28, 0x00, - 0x01, 0x36, 0x00, 0x01, 0x20, 0x04, 0x20, 0x05, 0x29, 0x00, 0x05, 0x37, - 0x00, 0x05, 0x20, 0x04, 0x20, 0x05, 0x2f, 0x00, 0x0d, 0x3b, 0x00, 0x0d, - 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x0f, 0x3a, 0x00, 0x0f, 0x20, 0x04, - 0x41, 0x10, 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, 0x10, 0x6a, 0x21, 0x01, - 0x0b, 0x20, 0x03, 0x41, 0x08, 0x71, 0x0d, 0x02, 0x0c, 0x03, 0x0b, 0x20, - 0x04, 0x20, 0x03, 0x41, 0x10, 0x76, 0x3a, 0x00, 0x02, 0x20, 0x04, 0x20, - 0x03, 0x41, 0x08, 0x76, 0x3a, 0x00, 0x01, 0x20, 0x04, 0x20, 0x05, 0x41, - 0x07, 0x6a, 0x29, 0x00, 0x00, 0x37, 0x02, 0x07, 0x20, 0x04, 0x20, 0x05, - 0x28, 0x02, 0x04, 0x41, 0x08, 0x74, 0x20, 0x03, 0x41, 0x18, 0x76, 0x72, - 0x36, 0x02, 0x03, 0x20, 0x04, 0x41, 0x13, 0x6a, 0x21, 0x02, 0x20, 0x05, - 0x41, 0x13, 0x6a, 0x21, 0x01, 0x41, 0x0f, 0x21, 0x06, 0x20, 0x05, 0x41, - 0x0f, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x05, 0x41, 0x0d, 0x21, 0x03, 0x0b, - 0x20, 0x04, 0x20, 0x06, 0x6a, 0x20, 0x05, 0x36, 0x02, 0x00, 0x0b, 0x20, - 0x02, 0x20, 0x01, 0x29, 0x00, 0x00, 0x37, 0x00, 0x00, 0x20, 0x02, 0x41, - 0x08, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, 0x0b, - 0x02, 0x40, 0x20, 0x03, 0x41, 0x04, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, - 0x20, 0x01, 0x28, 0x00, 0x00, 0x36, 0x00, 0x00, 0x20, 0x02, 0x41, 0x04, - 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x0b, 0x02, - 0x40, 0x20, 0x03, 0x41, 0x02, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, - 0x01, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x02, 0x41, 0x02, 0x6a, - 0x21, 0x02, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x21, 0x01, 0x0b, 0x20, 0x03, - 0x41, 0x01, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, - 0x00, 0x3a, 0x00, 0x00, 0x0b, 0x20, 0x00, 0x0b, 0x88, 0x03, 0x02, 0x03, - 0x7f, 0x01, 0x7e, 0x02, 0x40, 0x20, 0x02, 0x41, 0x21, 0x49, 0x0d, 0x00, - 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0b, 0x00, 0x20, 0x00, 0x0f, - 0x0b, 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, - 0x3a, 0x00, 0x00, 0x20, 0x00, 0x20, 0x02, 0x6a, 0x22, 0x03, 0x41, 0x7f, - 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x03, 0x49, 0x0d, - 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x02, 0x20, 0x00, 0x20, 0x01, - 0x3a, 0x00, 0x01, 0x20, 0x03, 0x41, 0x7d, 0x6a, 0x20, 0x01, 0x3a, 0x00, - 0x00, 0x20, 0x03, 0x41, 0x7e, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, - 0x02, 0x41, 0x07, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, - 0x03, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, - 0x02, 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x20, 0x00, - 0x6b, 0x41, 0x03, 0x71, 0x22, 0x04, 0x6a, 0x22, 0x05, 0x20, 0x01, 0x41, - 0xff, 0x01, 0x71, 0x41, 0x81, 0x82, 0x84, 0x08, 0x6c, 0x22, 0x03, 0x36, - 0x02, 0x00, 0x20, 0x05, 0x20, 0x02, 0x20, 0x04, 0x6b, 0x41, 0x3c, 0x71, - 0x22, 0x01, 0x6a, 0x22, 0x02, 0x41, 0x7c, 0x6a, 0x20, 0x03, 0x36, 0x02, - 0x00, 0x20, 0x01, 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x03, - 0x36, 0x02, 0x08, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x04, 0x20, 0x02, - 0x41, 0x78, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x74, - 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x19, 0x49, 0x0d, - 0x00, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x18, 0x20, 0x05, 0x20, 0x03, - 0x36, 0x02, 0x14, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x10, 0x20, 0x05, - 0x20, 0x03, 0x36, 0x02, 0x0c, 0x20, 0x02, 0x41, 0x70, 0x6a, 0x20, 0x03, - 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x6c, 0x6a, 0x20, 0x03, 0x36, 0x02, - 0x00, 0x20, 0x02, 0x41, 0x68, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, - 0x02, 0x41, 0x64, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x20, - 0x05, 0x41, 0x04, 0x71, 0x41, 0x18, 0x72, 0x22, 0x02, 0x6b, 0x22, 0x01, - 0x41, 0x20, 0x49, 0x0d, 0x00, 0x20, 0x03, 0xad, 0x42, 0x81, 0x80, 0x80, - 0x80, 0x10, 0x7e, 0x21, 0x06, 0x20, 0x05, 0x20, 0x02, 0x6a, 0x21, 0x02, - 0x03, 0x40, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, 0x18, 0x20, 0x02, 0x20, - 0x06, 0x37, 0x03, 0x10, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, 0x08, 0x20, - 0x02, 0x20, 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x20, 0x6a, 0x21, - 0x02, 0x20, 0x01, 0x41, 0x60, 0x6a, 0x22, 0x01, 0x41, 0x1f, 0x4b, 0x0d, - 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0xcf, 0x01, 0x01, 0x03, 0x7f, 0x20, - 0x00, 0x21, 0x01, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x71, - 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x0d, 0x00, - 0x20, 0x00, 0x20, 0x00, 0x6b, 0x0f, 0x0b, 0x20, 0x00, 0x41, 0x01, 0x6a, - 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, - 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x01, 0x41, - 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, - 0x01, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, - 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, - 0x41, 0x04, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x0d, 0x01, 0x0b, 0x20, - 0x01, 0x41, 0x7c, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x7b, 0x6a, 0x21, - 0x01, 0x03, 0x40, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x41, 0x80, - 0x82, 0x84, 0x08, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x22, 0x02, 0x28, 0x02, - 0x00, 0x22, 0x03, 0x6b, 0x20, 0x03, 0x72, 0x41, 0x80, 0x81, 0x82, 0x84, - 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x46, 0x0d, 0x00, 0x0b, - 0x03, 0x40, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x2d, - 0x00, 0x00, 0x21, 0x03, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x21, 0x02, 0x20, - 0x03, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x01, 0x20, 0x00, 0x6b, 0x0b, 0x44, - 0x00, 0x02, 0x40, 0x20, 0x00, 0x41, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, - 0x20, 0x00, 0x41, 0x08, 0x76, 0x41, 0x80, 0x80, 0x84, 0x80, 0x00, 0x6a, - 0x2d, 0x00, 0x00, 0x41, 0x05, 0x74, 0x20, 0x00, 0x41, 0x03, 0x76, 0x41, - 0x1f, 0x71, 0x72, 0x41, 0x80, 0x80, 0x84, 0x80, 0x00, 0x6a, 0x2d, 0x00, - 0x00, 0x20, 0x00, 0x41, 0x07, 0x71, 0x76, 0x41, 0x01, 0x71, 0x0f, 0x0b, - 0x20, 0x00, 0x41, 0xfe, 0xff, 0x0b, 0x49, 0x0b, 0x49, 0x01, 0x03, 0x7f, - 0x41, 0x00, 0x21, 0x03, 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x02, - 0x40, 0x03, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x20, 0x01, - 0x2d, 0x00, 0x00, 0x22, 0x05, 0x47, 0x0d, 0x01, 0x20, 0x01, 0x41, 0x01, - 0x6a, 0x21, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x02, - 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0c, 0x02, 0x0b, 0x0b, 0x20, - 0x04, 0x20, 0x05, 0x6b, 0x21, 0x03, 0x0b, 0x20, 0x03, 0x0b, 0xf6, 0x02, - 0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, 0x00, 0x47, 0x21, 0x03, 0x02, 0x40, - 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x71, 0x45, - 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x2d, - 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x47, 0x0d, 0x00, 0x20, - 0x00, 0x21, 0x04, 0x20, 0x02, 0x21, 0x05, 0x0c, 0x03, 0x0b, 0x20, 0x02, - 0x41, 0x7f, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x20, 0x00, - 0x41, 0x01, 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, + 0x00, 0x36, 0x02, 0x00, 0x3f, 0x00, 0x21, 0x00, 0x20, 0x01, 0x41, 0xf8, + 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x41, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, + 0x41, 0xf4, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x00, 0x41, 0x10, 0x74, + 0x36, 0x02, 0x00, 0x0b, 0xa8, 0x02, 0x01, 0x03, 0x7f, 0x02, 0x40, 0x23, + 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf8, 0xc2, 0x84, 0x80, 0x00, 0x6a, + 0x28, 0x02, 0x00, 0x22, 0x01, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x02, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x00, 0x20, 0x00, 0x49, + 0x0d, 0x00, 0x20, 0x01, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x03, 0x40, 0x20, + 0x01, 0x28, 0x02, 0x04, 0x22, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x01, 0x21, + 0x02, 0x20, 0x03, 0x21, 0x01, 0x20, 0x03, 0x28, 0x02, 0x00, 0x20, 0x00, + 0x49, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x23, 0x81, + 0x80, 0x80, 0x80, 0x00, 0x41, 0xf8, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, + 0x02, 0x1b, 0x20, 0x03, 0x28, 0x02, 0x04, 0x36, 0x02, 0x00, 0x20, 0x03, + 0x41, 0x08, 0x6a, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x23, 0x81, 0x80, + 0x80, 0x80, 0x00, 0x22, 0x01, 0x41, 0xf4, 0xc2, 0x84, 0x80, 0x00, 0x6a, + 0x28, 0x02, 0x00, 0x20, 0x01, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, + 0x28, 0x02, 0x00, 0x22, 0x01, 0x20, 0x00, 0x6a, 0x41, 0x0b, 0x6a, 0x41, + 0x7c, 0x71, 0x22, 0x03, 0x4f, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x01, 0x20, + 0x03, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xec, 0xc2, 0x84, 0x80, + 0x00, 0x6a, 0x28, 0x02, 0x00, 0x6b, 0x41, 0x80, 0x80, 0x80, 0x02, 0x4a, + 0x0d, 0x01, 0x20, 0x00, 0x41, 0x7f, 0x6a, 0x41, 0x10, 0x76, 0x41, 0x01, + 0x6a, 0x40, 0x00, 0x41, 0x7f, 0x46, 0x0d, 0x01, 0x3f, 0x00, 0x21, 0x01, + 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x41, 0xf4, 0xc2, 0x84, + 0x80, 0x00, 0x6a, 0x20, 0x01, 0x41, 0x10, 0x74, 0x36, 0x02, 0x00, 0x20, + 0x02, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x21, + 0x01, 0x0b, 0x20, 0x01, 0x20, 0x00, 0x36, 0x02, 0x00, 0x23, 0x81, 0x80, + 0x80, 0x80, 0x00, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x03, + 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, 0x0b, 0x20, + 0x01, 0x0b, 0x5c, 0x01, 0x03, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, + 0x00, 0x20, 0x00, 0x41, 0x78, 0x6a, 0x22, 0x01, 0x28, 0x02, 0x00, 0x21, + 0x02, 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf0, 0xc2, + 0x84, 0x80, 0x00, 0x6a, 0x22, 0x03, 0x28, 0x02, 0x00, 0x20, 0x00, 0x20, + 0x02, 0x6a, 0x41, 0x03, 0x6a, 0x41, 0x7c, 0x71, 0x46, 0x0d, 0x00, 0x20, + 0x00, 0x41, 0x7c, 0x6a, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf8, + 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x22, 0x03, 0x28, 0x02, 0x00, 0x36, 0x02, + 0x00, 0x0b, 0x20, 0x03, 0x20, 0x01, 0x36, 0x02, 0x00, 0x0b, 0x0b, 0x19, + 0x00, 0x20, 0x01, 0x20, 0x00, 0x6c, 0x22, 0x00, 0x10, 0x88, 0x80, 0x80, + 0x80, 0x00, 0x41, 0x00, 0x20, 0x00, 0x10, 0x94, 0x80, 0x80, 0x80, 0x00, + 0x0b, 0x6b, 0x01, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, 0x00, + 0x20, 0x00, 0x41, 0x78, 0x6a, 0x22, 0x02, 0x28, 0x02, 0x00, 0x21, 0x03, + 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf0, 0xc2, 0x84, + 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x20, 0x00, 0x20, 0x03, 0x6a, 0x41, + 0x03, 0x6a, 0x41, 0x7c, 0x71, 0x47, 0x0d, 0x00, 0x23, 0x81, 0x80, 0x80, + 0x80, 0x00, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x02, 0x36, + 0x02, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x01, 0x10, 0x88, 0x80, 0x80, 0x80, + 0x00, 0x20, 0x00, 0x20, 0x02, 0x28, 0x02, 0x00, 0x10, 0x93, 0x80, 0x80, + 0x80, 0x00, 0x0f, 0x0b, 0x20, 0x01, 0x10, 0x88, 0x80, 0x80, 0x80, 0x00, + 0x0b, 0x0b, 0x00, 0x20, 0x00, 0x10, 0x90, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x0b, 0xd5, 0x01, 0x01, 0x03, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x41, 0x10, 0x6b, 0x22, 0x00, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, + 0x08, 0x6a, 0x20, 0x00, 0x41, 0x0c, 0x6a, 0x10, 0x8f, 0x80, 0x80, 0x80, + 0x00, 0x0d, 0x00, 0x20, 0x00, 0x28, 0x02, 0x08, 0x41, 0x01, 0x6a, 0x22, + 0x01, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x28, 0x02, 0x0c, 0x10, 0x88, 0x80, + 0x80, 0x80, 0x00, 0x22, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x01, 0x41, 0x04, + 0x10, 0x8a, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x45, 0x0d, 0x03, 0x20, + 0x01, 0x20, 0x02, 0x10, 0x8e, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x04, 0x20, + 0x00, 0x28, 0x02, 0x08, 0x20, 0x01, 0x10, 0x84, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x01, 0x20, 0x00, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x20, 0x01, 0x0f, 0x0b, 0x41, 0xc7, 0x00, 0x10, 0x8c, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, 0x00, + 0x00, 0x0b, 0x20, 0x02, 0x10, 0x89, 0x80, 0x80, 0x80, 0x00, 0x41, 0xc6, + 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x20, 0x02, 0x10, + 0x89, 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x10, 0x89, 0x80, 0x80, 0x80, + 0x00, 0x41, 0xc7, 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, + 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, + 0x10, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, + 0x0b, 0x00, 0x20, 0x00, 0x10, 0x82, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, + 0x02, 0x00, 0x0b, 0x0e, 0x00, 0x10, 0x91, 0x80, 0x80, 0x80, 0x00, 0x10, + 0x91, 0x80, 0x80, 0x80, 0x00, 0x0b, 0xd4, 0x08, 0x01, 0x04, 0x7f, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x20, 0x4b, 0x0d, 0x00, + 0x20, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x02, 0x45, 0x0d, + 0x01, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, + 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, + 0x04, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, + 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x41, 0x01, 0x6a, + 0x20, 0x01, 0x41, 0x01, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, + 0x02, 0x41, 0x7e, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x21, + 0x04, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, + 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x41, 0x02, 0x6a, + 0x20, 0x01, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, + 0x02, 0x41, 0x7d, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x21, + 0x04, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, + 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x41, 0x03, 0x6a, + 0x20, 0x01, 0x41, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, + 0x02, 0x41, 0x7c, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, + 0x04, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x05, 0x0c, 0x02, 0x0b, 0x20, + 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x20, 0x00, 0x0f, + 0x0b, 0x20, 0x02, 0x21, 0x03, 0x20, 0x00, 0x21, 0x04, 0x20, 0x01, 0x21, + 0x05, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x22, + 0x02, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x10, 0x4f, + 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, + 0x03, 0x41, 0x70, 0x6a, 0x22, 0x02, 0x41, 0x10, 0x71, 0x0d, 0x00, 0x20, + 0x04, 0x20, 0x05, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, + 0x08, 0x6a, 0x20, 0x05, 0x41, 0x08, 0x6a, 0x29, 0x02, 0x00, 0x37, 0x02, + 0x00, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x10, + 0x6a, 0x21, 0x05, 0x20, 0x02, 0x21, 0x03, 0x0b, 0x20, 0x02, 0x41, 0x10, + 0x49, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x03, 0x40, 0x20, 0x04, 0x20, + 0x05, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, 0x08, 0x6a, + 0x20, 0x05, 0x41, 0x08, 0x6a, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, + 0x04, 0x41, 0x10, 0x6a, 0x20, 0x05, 0x41, 0x10, 0x6a, 0x29, 0x02, 0x00, + 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, 0x18, 0x6a, 0x20, 0x05, 0x41, 0x18, + 0x6a, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, 0x20, 0x6a, + 0x21, 0x04, 0x20, 0x05, 0x41, 0x20, 0x6a, 0x21, 0x05, 0x20, 0x02, 0x41, + 0x60, 0x6a, 0x22, 0x02, 0x41, 0x0f, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x02, + 0x40, 0x20, 0x02, 0x41, 0x08, 0x49, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, + 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x05, 0x41, 0x08, 0x6a, 0x21, + 0x05, 0x20, 0x04, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0b, 0x02, 0x40, 0x20, + 0x02, 0x41, 0x04, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, 0x28, + 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x05, 0x41, 0x04, 0x6a, 0x21, 0x05, + 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x0b, 0x02, 0x40, 0x20, 0x02, + 0x41, 0x02, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, 0x2f, 0x00, + 0x00, 0x3b, 0x00, 0x00, 0x20, 0x04, 0x41, 0x02, 0x6a, 0x21, 0x04, 0x20, + 0x05, 0x41, 0x02, 0x6a, 0x21, 0x05, 0x0b, 0x20, 0x02, 0x41, 0x01, 0x71, + 0x45, 0x0d, 0x01, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x00, 0x3a, 0x00, + 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x20, 0x49, 0x0d, 0x00, 0x20, 0x04, + 0x20, 0x05, 0x28, 0x02, 0x00, 0x22, 0x03, 0x3a, 0x00, 0x00, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x0e, 0x03, 0x03, 0x00, 0x01, + 0x03, 0x0b, 0x20, 0x04, 0x41, 0x01, 0x6a, 0x20, 0x03, 0x41, 0x08, 0x76, + 0x3a, 0x00, 0x00, 0x20, 0x04, 0x41, 0x06, 0x6a, 0x20, 0x05, 0x41, 0x06, + 0x6a, 0x29, 0x01, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, 0x02, 0x6a, + 0x20, 0x05, 0x41, 0x04, 0x6a, 0x28, 0x02, 0x00, 0x41, 0x10, 0x74, 0x20, + 0x03, 0x41, 0x10, 0x76, 0x72, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0x12, + 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, 0x12, 0x6a, 0x21, 0x01, 0x41, 0x0e, + 0x21, 0x06, 0x20, 0x05, 0x41, 0x0e, 0x6a, 0x28, 0x01, 0x00, 0x21, 0x05, + 0x41, 0x0e, 0x21, 0x03, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x41, 0x05, 0x6a, + 0x20, 0x05, 0x41, 0x05, 0x6a, 0x29, 0x00, 0x00, 0x37, 0x02, 0x00, 0x20, + 0x04, 0x41, 0x01, 0x6a, 0x20, 0x05, 0x41, 0x04, 0x6a, 0x28, 0x02, 0x00, + 0x41, 0x18, 0x74, 0x20, 0x03, 0x41, 0x08, 0x76, 0x72, 0x36, 0x02, 0x00, + 0x20, 0x04, 0x41, 0x11, 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, 0x11, 0x6a, + 0x21, 0x01, 0x41, 0x0d, 0x21, 0x06, 0x20, 0x05, 0x41, 0x0d, 0x6a, 0x28, + 0x00, 0x00, 0x21, 0x05, 0x41, 0x0f, 0x21, 0x03, 0x0c, 0x02, 0x0b, 0x02, + 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x10, 0x4f, 0x0d, 0x00, 0x20, 0x04, + 0x21, 0x02, 0x20, 0x05, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x20, + 0x05, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x41, 0x01, 0x6a, + 0x20, 0x05, 0x41, 0x01, 0x6a, 0x28, 0x00, 0x00, 0x36, 0x00, 0x00, 0x20, + 0x04, 0x41, 0x05, 0x6a, 0x20, 0x05, 0x41, 0x05, 0x6a, 0x29, 0x00, 0x00, + 0x37, 0x00, 0x00, 0x20, 0x04, 0x41, 0x0d, 0x6a, 0x20, 0x05, 0x41, 0x0d, + 0x6a, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x04, 0x41, 0x0f, 0x6a, + 0x20, 0x05, 0x41, 0x0f, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, + 0x04, 0x41, 0x10, 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, 0x10, 0x6a, 0x21, + 0x01, 0x0b, 0x20, 0x03, 0x41, 0x08, 0x71, 0x0d, 0x02, 0x0c, 0x03, 0x0b, + 0x20, 0x04, 0x41, 0x02, 0x6a, 0x20, 0x03, 0x41, 0x10, 0x76, 0x3a, 0x00, + 0x00, 0x20, 0x04, 0x41, 0x01, 0x6a, 0x20, 0x03, 0x41, 0x08, 0x76, 0x3a, + 0x00, 0x00, 0x20, 0x04, 0x41, 0x07, 0x6a, 0x20, 0x05, 0x41, 0x07, 0x6a, + 0x29, 0x00, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, 0x03, 0x6a, 0x20, + 0x05, 0x41, 0x04, 0x6a, 0x28, 0x02, 0x00, 0x41, 0x08, 0x74, 0x20, 0x03, + 0x41, 0x18, 0x76, 0x72, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0x13, 0x6a, + 0x21, 0x02, 0x20, 0x05, 0x41, 0x13, 0x6a, 0x21, 0x01, 0x41, 0x0f, 0x21, + 0x06, 0x20, 0x05, 0x41, 0x0f, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x05, 0x41, + 0x0d, 0x21, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x06, 0x6a, 0x20, 0x05, 0x36, + 0x02, 0x00, 0x0b, 0x20, 0x02, 0x20, 0x01, 0x29, 0x00, 0x00, 0x37, 0x00, + 0x00, 0x20, 0x02, 0x41, 0x08, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x08, + 0x6a, 0x21, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x04, 0x71, 0x45, + 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, 0x28, 0x00, 0x00, 0x36, 0x00, 0x00, + 0x20, 0x02, 0x41, 0x04, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x04, 0x6a, + 0x21, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x02, 0x71, 0x45, 0x0d, + 0x00, 0x20, 0x02, 0x20, 0x01, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, + 0x02, 0x41, 0x02, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x21, + 0x01, 0x0b, 0x20, 0x03, 0x41, 0x01, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, + 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x0b, 0x20, 0x00, 0x0b, + 0xac, 0x03, 0x02, 0x03, 0x7f, 0x01, 0x7e, 0x02, 0x40, 0x20, 0x02, 0x41, + 0x21, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0b, + 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x20, 0x02, 0x6a, + 0x22, 0x03, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, + 0x41, 0x03, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x20, 0x01, + 0x3a, 0x00, 0x00, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x20, 0x01, 0x3a, 0x00, + 0x00, 0x20, 0x03, 0x41, 0x7d, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, + 0x03, 0x41, 0x7e, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, + 0x07, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x20, 0x01, 0x3a, + 0x00, 0x00, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, + 0x20, 0x02, 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x20, + 0x00, 0x6b, 0x41, 0x03, 0x71, 0x22, 0x04, 0x6a, 0x22, 0x05, 0x20, 0x01, + 0x41, 0xff, 0x01, 0x71, 0x41, 0x81, 0x82, 0x84, 0x08, 0x6c, 0x22, 0x03, + 0x36, 0x02, 0x00, 0x20, 0x05, 0x20, 0x02, 0x20, 0x04, 0x6b, 0x41, 0x3c, + 0x71, 0x22, 0x01, 0x6a, 0x22, 0x02, 0x41, 0x7c, 0x6a, 0x20, 0x03, 0x36, + 0x02, 0x00, 0x20, 0x01, 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x05, 0x41, + 0x08, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x05, 0x41, 0x04, 0x6a, + 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x78, 0x6a, 0x20, 0x03, + 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x74, 0x6a, 0x20, 0x03, 0x36, 0x02, + 0x00, 0x20, 0x01, 0x41, 0x19, 0x49, 0x0d, 0x00, 0x20, 0x05, 0x41, 0x18, + 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x05, 0x41, 0x14, 0x6a, 0x20, + 0x03, 0x36, 0x02, 0x00, 0x20, 0x05, 0x41, 0x10, 0x6a, 0x20, 0x03, 0x36, + 0x02, 0x00, 0x20, 0x05, 0x41, 0x0c, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, + 0x20, 0x02, 0x41, 0x70, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, + 0x41, 0x6c, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x68, + 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x64, 0x6a, 0x20, + 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x05, 0x41, 0x04, 0x71, 0x41, + 0x18, 0x72, 0x22, 0x02, 0x6b, 0x22, 0x01, 0x41, 0x20, 0x49, 0x0d, 0x00, + 0x20, 0x03, 0xad, 0x42, 0x81, 0x80, 0x80, 0x80, 0x10, 0x7e, 0x21, 0x06, + 0x20, 0x05, 0x20, 0x02, 0x6a, 0x21, 0x02, 0x03, 0x40, 0x20, 0x02, 0x20, + 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x18, 0x6a, 0x20, 0x06, 0x37, + 0x03, 0x00, 0x20, 0x02, 0x41, 0x10, 0x6a, 0x20, 0x06, 0x37, 0x03, 0x00, + 0x20, 0x02, 0x41, 0x08, 0x6a, 0x20, 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, + 0x41, 0x20, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x60, 0x6a, 0x22, 0x01, + 0x41, 0x1f, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0xcf, 0x01, + 0x01, 0x03, 0x7f, 0x20, 0x00, 0x21, 0x01, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x00, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x6b, 0x0f, 0x0b, 0x20, + 0x00, 0x41, 0x01, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, + 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x02, + 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, + 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, 0x01, + 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, + 0x0d, 0x01, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, + 0x0d, 0x01, 0x0b, 0x20, 0x01, 0x41, 0x7c, 0x6a, 0x21, 0x02, 0x20, 0x01, + 0x41, 0x7b, 0x6a, 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, 0x41, 0x04, 0x6a, + 0x21, 0x01, 0x41, 0x80, 0x82, 0x84, 0x08, 0x20, 0x02, 0x41, 0x04, 0x6a, + 0x22, 0x02, 0x28, 0x02, 0x00, 0x22, 0x03, 0x6b, 0x20, 0x03, 0x72, 0x41, + 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, + 0x46, 0x0d, 0x00, 0x0b, 0x03, 0x40, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, + 0x01, 0x20, 0x02, 0x2d, 0x00, 0x00, 0x21, 0x03, 0x20, 0x02, 0x41, 0x01, + 0x6a, 0x21, 0x02, 0x20, 0x03, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x01, 0x20, + 0x00, 0x6b, 0x0b, 0x44, 0x00, 0x02, 0x40, 0x20, 0x00, 0x41, 0xff, 0xff, + 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x08, 0x76, 0x41, 0x80, 0x80, + 0x84, 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x41, 0x05, 0x74, 0x20, 0x00, + 0x41, 0x03, 0x76, 0x41, 0x1f, 0x71, 0x72, 0x41, 0x80, 0x80, 0x84, 0x80, + 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x20, 0x00, 0x41, 0x07, 0x71, 0x76, 0x41, + 0x01, 0x71, 0x0f, 0x0b, 0x20, 0x00, 0x41, 0xfe, 0xff, 0x0b, 0x49, 0x0b, + 0x49, 0x01, 0x03, 0x7f, 0x41, 0x00, 0x21, 0x03, 0x02, 0x40, 0x20, 0x02, + 0x45, 0x0d, 0x00, 0x02, 0x40, 0x03, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x22, 0x04, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x05, 0x47, 0x0d, 0x01, + 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6a, + 0x21, 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0c, + 0x02, 0x0b, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x6b, 0x21, 0x03, 0x0b, 0x20, + 0x03, 0x0b, 0xf6, 0x02, 0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, 0x00, 0x47, + 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, + 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x02, + 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, + 0x47, 0x0d, 0x00, 0x20, 0x00, 0x21, 0x04, 0x20, 0x02, 0x21, 0x05, 0x0c, + 0x03, 0x0b, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, + 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, + 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x2d, 0x00, + 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, 0x02, + 0x41, 0x7e, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x20, 0x00, + 0x41, 0x02, 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, - 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x22, - 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, + 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, 0x02, 0x41, 0x7d, 0x6a, 0x22, + 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, - 0x0d, 0x02, 0x20, 0x02, 0x41, 0x7d, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, - 0x21, 0x03, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, - 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x2d, 0x00, - 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, 0x00, - 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x05, - 0x41, 0x00, 0x47, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x21, 0x05, - 0x20, 0x00, 0x21, 0x04, 0x0b, 0x20, 0x03, 0x45, 0x0d, 0x01, 0x02, 0x40, - 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, - 0x0d, 0x00, 0x20, 0x05, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x20, 0x01, 0x41, - 0xff, 0x01, 0x71, 0x41, 0x81, 0x82, 0x84, 0x08, 0x6c, 0x21, 0x00, 0x03, - 0x40, 0x41, 0x80, 0x82, 0x84, 0x08, 0x20, 0x04, 0x28, 0x02, 0x00, 0x20, - 0x00, 0x73, 0x22, 0x02, 0x6b, 0x20, 0x02, 0x72, 0x41, 0x80, 0x81, 0x82, - 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x47, 0x0d, 0x02, - 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x7c, 0x6a, - 0x22, 0x05, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x05, 0x45, - 0x0d, 0x01, 0x0b, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x21, 0x02, 0x03, - 0x40, 0x02, 0x40, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x02, 0x47, 0x0d, - 0x00, 0x20, 0x04, 0x0f, 0x0b, 0x20, 0x04, 0x41, 0x01, 0x6a, 0x21, 0x04, - 0x20, 0x05, 0x41, 0x7f, 0x6a, 0x22, 0x05, 0x0d, 0x00, 0x0b, 0x0b, 0x41, - 0x00, 0x0b, 0x67, 0x01, 0x02, 0x7f, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x21, - 0x02, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x03, 0x45, 0x0d, - 0x00, 0x20, 0x03, 0x20, 0x02, 0x41, 0xff, 0x01, 0x71, 0x47, 0x0d, 0x00, - 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, - 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x21, 0x02, 0x20, - 0x00, 0x2d, 0x00, 0x00, 0x22, 0x03, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, - 0x01, 0x6a, 0x21, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, - 0x03, 0x20, 0x02, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x00, 0x0b, 0x0b, - 0x20, 0x03, 0x20, 0x02, 0x41, 0xff, 0x01, 0x71, 0x6b, 0x0b, 0x0c, 0x00, - 0x20, 0x00, 0x41, 0x00, 0x10, 0x9b, 0x80, 0x80, 0x80, 0x00, 0x0b, 0xb4, - 0x02, 0x01, 0x07, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x41, 0xff, 0xff, 0x07, - 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x41, 0xff, 0x01, 0x71, 0x22, - 0x02, 0x41, 0x03, 0x6e, 0x22, 0x03, 0x41, 0x03, 0x6c, 0x6b, 0x41, 0xff, - 0x01, 0x71, 0x41, 0x02, 0x74, 0x41, 0xc0, 0x9e, 0x84, 0x80, 0x00, 0x6a, - 0x28, 0x02, 0x00, 0x20, 0x00, 0x41, 0x08, 0x76, 0x22, 0x04, 0x41, 0xa0, - 0xa9, 0x84, 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x41, 0xd6, 0x00, 0x6c, - 0x20, 0x03, 0x6a, 0x41, 0xa0, 0xa9, 0x84, 0x80, 0x00, 0x6a, 0x2d, 0x00, - 0x00, 0x6c, 0x41, 0x0b, 0x76, 0x41, 0x06, 0x70, 0x20, 0x04, 0x41, 0x90, - 0xbe, 0x84, 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x6a, 0x41, 0x02, 0x74, - 0x41, 0xd0, 0x9e, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x03, - 0x41, 0x08, 0x75, 0x21, 0x04, 0x02, 0x40, 0x20, 0x03, 0x41, 0xff, 0x01, - 0x71, 0x22, 0x03, 0x41, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x04, 0x41, 0x00, - 0x20, 0x03, 0x20, 0x01, 0x73, 0x6b, 0x71, 0x20, 0x00, 0x6a, 0x0f, 0x0b, - 0x20, 0x04, 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, 0x45, 0x0d, 0x00, 0x20, - 0x04, 0x41, 0x08, 0x76, 0x21, 0x04, 0x03, 0x40, 0x02, 0x40, 0x20, 0x02, - 0x20, 0x03, 0x41, 0x01, 0x76, 0x22, 0x05, 0x20, 0x04, 0x6a, 0x22, 0x06, - 0x41, 0x01, 0x74, 0x41, 0x90, 0xa6, 0x84, 0x80, 0x00, 0x6a, 0x22, 0x07, - 0x2d, 0x00, 0x00, 0x22, 0x08, 0x47, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x07, - 0x2d, 0x00, 0x01, 0x41, 0x02, 0x74, 0x41, 0xd0, 0x9e, 0x84, 0x80, 0x00, - 0x6a, 0x28, 0x02, 0x00, 0x22, 0x03, 0x41, 0xff, 0x01, 0x71, 0x22, 0x04, - 0x41, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x03, 0x41, 0x08, 0x75, 0x41, 0x00, - 0x20, 0x04, 0x20, 0x01, 0x73, 0x6b, 0x71, 0x20, 0x00, 0x6a, 0x0f, 0x0b, - 0x41, 0x7f, 0x41, 0x01, 0x20, 0x01, 0x1b, 0x20, 0x00, 0x6a, 0x0f, 0x0b, - 0x20, 0x04, 0x20, 0x06, 0x20, 0x02, 0x20, 0x08, 0x49, 0x22, 0x08, 0x1b, - 0x21, 0x04, 0x20, 0x05, 0x20, 0x03, 0x20, 0x05, 0x6b, 0x20, 0x08, 0x1b, - 0x22, 0x03, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0x0c, 0x00, 0x20, - 0x00, 0x41, 0x01, 0x10, 0x9b, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x87, 0x01, - 0x01, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x02, 0x0d, 0x00, 0x41, 0x00, 0x0f, - 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x03, - 0x0d, 0x00, 0x41, 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x41, - 0x01, 0x6a, 0x21, 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x02, 0x02, - 0x40, 0x03, 0x40, 0x20, 0x03, 0x41, 0xff, 0x01, 0x71, 0x20, 0x01, 0x2d, - 0x00, 0x00, 0x22, 0x04, 0x47, 0x0d, 0x01, 0x20, 0x04, 0x45, 0x0d, 0x01, - 0x20, 0x02, 0x41, 0x00, 0x46, 0x0d, 0x01, 0x20, 0x02, 0x41, 0x7f, 0x6a, - 0x21, 0x02, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x00, 0x2d, - 0x00, 0x00, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, - 0x03, 0x0d, 0x00, 0x0b, 0x41, 0x00, 0x21, 0x03, 0x0b, 0x20, 0x03, 0x41, - 0xff, 0x01, 0x71, 0x21, 0x03, 0x0b, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, - 0x00, 0x6b, 0x0b, 0x0d, 0x00, 0x20, 0x00, 0x10, 0x9a, 0x80, 0x80, 0x80, - 0x00, 0x20, 0x00, 0x47, 0x0b, 0xbf, 0x09, 0x01, 0x04, 0x7f, 0x02, 0x40, - 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x21, 0x4f, 0x0d, 0x00, 0x20, - 0x00, 0x20, 0x01, 0x46, 0x0d, 0x02, 0x20, 0x01, 0x20, 0x00, 0x20, 0x02, - 0x6a, 0x22, 0x03, 0x6b, 0x41, 0x00, 0x20, 0x02, 0x41, 0x01, 0x74, 0x6b, - 0x4b, 0x0d, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0a, - 0x00, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x01, 0x20, 0x00, 0x73, 0x41, 0x03, - 0x71, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x20, - 0x01, 0x4f, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x04, 0x45, 0x0d, 0x00, 0x20, - 0x02, 0x21, 0x05, 0x20, 0x00, 0x21, 0x03, 0x0c, 0x03, 0x0b, 0x02, 0x40, - 0x20, 0x00, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x02, 0x21, 0x05, 0x20, - 0x00, 0x21, 0x03, 0x0c, 0x02, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x03, 0x20, - 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, - 0x7f, 0x6a, 0x21, 0x05, 0x02, 0x40, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, - 0x03, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, - 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, - 0x01, 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02, 0x41, 0x7e, 0x6a, - 0x21, 0x05, 0x02, 0x40, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x03, 0x41, - 0x03, 0x71, 0x0d, 0x00, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x21, 0x01, 0x0c, - 0x02, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, 0x01, 0x2d, - 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x02, 0x41, 0x7d, 0x6a, 0x21, 0x05, - 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, - 0x0d, 0x00, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, - 0x20, 0x05, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x03, - 0x3a, 0x00, 0x03, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x01, - 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x21, 0x05, - 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x04, 0x0d, 0x00, 0x02, 0x40, 0x20, - 0x03, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, 0x04, - 0x20, 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x03, 0x6a, 0x22, 0x04, - 0x20, 0x01, 0x20, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x02, - 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, - 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, - 0x41, 0x7e, 0x6a, 0x22, 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, 0x03, - 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x04, 0x41, - 0x03, 0x71, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, - 0x03, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x7d, 0x6a, 0x22, - 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, 0x03, 0x6a, 0x2d, 0x00, 0x00, - 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x0d, 0x00, - 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x45, 0x0d, 0x04, - 0x20, 0x00, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x02, 0x6a, 0x20, 0x01, - 0x20, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x0b, 0x20, 0x02, - 0x41, 0x04, 0x49, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x02, 0x41, 0x7c, 0x6a, - 0x22, 0x06, 0x41, 0x02, 0x76, 0x41, 0x01, 0x6a, 0x41, 0x03, 0x71, 0x22, - 0x03, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x41, 0x7c, 0x6a, 0x21, 0x04, 0x20, - 0x00, 0x41, 0x7c, 0x6a, 0x21, 0x05, 0x03, 0x40, 0x20, 0x05, 0x20, 0x02, - 0x6a, 0x20, 0x04, 0x20, 0x02, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, - 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x21, 0x02, 0x20, 0x03, 0x41, 0x7f, 0x6a, - 0x22, 0x03, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x06, 0x41, 0x0c, 0x49, 0x0d, - 0x00, 0x20, 0x01, 0x41, 0x70, 0x6a, 0x21, 0x05, 0x20, 0x00, 0x41, 0x70, - 0x6a, 0x21, 0x06, 0x03, 0x40, 0x20, 0x06, 0x20, 0x02, 0x6a, 0x22, 0x03, - 0x41, 0x0c, 0x6a, 0x20, 0x05, 0x20, 0x02, 0x6a, 0x22, 0x04, 0x41, 0x0c, + 0x0d, 0x02, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x02, 0x41, + 0x7c, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x0c, 0x01, 0x0b, + 0x20, 0x02, 0x21, 0x05, 0x20, 0x00, 0x21, 0x04, 0x0b, 0x20, 0x03, 0x45, + 0x0d, 0x01, 0x02, 0x40, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, + 0xff, 0x01, 0x71, 0x46, 0x0d, 0x00, 0x20, 0x05, 0x41, 0x04, 0x49, 0x0d, + 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x41, 0x81, 0x82, 0x84, 0x08, + 0x6c, 0x21, 0x00, 0x03, 0x40, 0x41, 0x80, 0x82, 0x84, 0x08, 0x20, 0x04, + 0x28, 0x02, 0x00, 0x20, 0x00, 0x73, 0x22, 0x02, 0x6b, 0x20, 0x02, 0x72, + 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, + 0x78, 0x47, 0x0d, 0x02, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, + 0x05, 0x41, 0x7c, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x01, 0x41, 0xff, 0x01, + 0x71, 0x21, 0x02, 0x03, 0x40, 0x02, 0x40, 0x20, 0x04, 0x2d, 0x00, 0x00, + 0x20, 0x02, 0x47, 0x0d, 0x00, 0x20, 0x04, 0x0f, 0x0b, 0x20, 0x04, 0x41, + 0x01, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x7f, 0x6a, 0x22, 0x05, 0x0d, + 0x00, 0x0b, 0x0b, 0x41, 0x00, 0x0b, 0x67, 0x01, 0x02, 0x7f, 0x20, 0x01, + 0x2d, 0x00, 0x00, 0x21, 0x02, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x22, 0x03, 0x45, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x02, 0x41, 0xff, 0x01, + 0x71, 0x47, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, + 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, + 0x00, 0x21, 0x02, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x03, 0x45, 0x0d, + 0x01, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x01, 0x41, 0x01, + 0x6a, 0x21, 0x01, 0x20, 0x03, 0x20, 0x02, 0x41, 0xff, 0x01, 0x71, 0x46, + 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x03, 0x20, 0x02, 0x41, 0xff, 0x01, 0x71, + 0x6b, 0x0b, 0x0c, 0x00, 0x20, 0x00, 0x41, 0x00, 0x10, 0x9b, 0x80, 0x80, + 0x80, 0x00, 0x0b, 0xb7, 0x02, 0x01, 0x07, 0x7f, 0x02, 0x40, 0x20, 0x00, + 0x41, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x41, + 0xff, 0x01, 0x71, 0x22, 0x02, 0x41, 0x03, 0x6e, 0x22, 0x03, 0x41, 0x03, + 0x6c, 0x6b, 0x41, 0xff, 0x01, 0x71, 0x41, 0x02, 0x74, 0x41, 0xc0, 0x9e, + 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x20, 0x00, 0x41, 0x08, 0x76, + 0x22, 0x04, 0x41, 0xa0, 0xa9, 0x84, 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x00, + 0x41, 0xd6, 0x00, 0x6c, 0x20, 0x03, 0x6a, 0x41, 0xa0, 0xa9, 0x84, 0x80, + 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x6c, 0x41, 0x0b, 0x76, 0x41, 0x06, 0x70, + 0x20, 0x04, 0x41, 0x90, 0xbe, 0x84, 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x00, + 0x6a, 0x41, 0x02, 0x74, 0x41, 0xd0, 0x9e, 0x84, 0x80, 0x00, 0x6a, 0x28, + 0x02, 0x00, 0x22, 0x03, 0x41, 0x08, 0x75, 0x21, 0x04, 0x02, 0x40, 0x20, + 0x03, 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, 0x41, 0x01, 0x4b, 0x0d, 0x00, + 0x20, 0x04, 0x41, 0x00, 0x20, 0x03, 0x20, 0x01, 0x73, 0x6b, 0x71, 0x20, + 0x00, 0x6a, 0x0f, 0x0b, 0x20, 0x04, 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, + 0x45, 0x0d, 0x00, 0x20, 0x04, 0x41, 0x08, 0x76, 0x21, 0x04, 0x03, 0x40, + 0x02, 0x40, 0x20, 0x02, 0x20, 0x03, 0x41, 0x01, 0x76, 0x22, 0x05, 0x20, + 0x04, 0x6a, 0x22, 0x06, 0x41, 0x01, 0x74, 0x41, 0x90, 0xa6, 0x84, 0x80, + 0x00, 0x6a, 0x22, 0x07, 0x2d, 0x00, 0x00, 0x22, 0x08, 0x47, 0x0d, 0x00, + 0x02, 0x40, 0x20, 0x07, 0x41, 0x01, 0x6a, 0x2d, 0x00, 0x00, 0x41, 0x02, + 0x74, 0x41, 0xd0, 0x9e, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x22, + 0x03, 0x41, 0xff, 0x01, 0x71, 0x22, 0x04, 0x41, 0x01, 0x4b, 0x0d, 0x00, + 0x20, 0x03, 0x41, 0x08, 0x75, 0x41, 0x00, 0x20, 0x04, 0x20, 0x01, 0x73, + 0x6b, 0x71, 0x20, 0x00, 0x6a, 0x0f, 0x0b, 0x41, 0x7f, 0x41, 0x01, 0x20, + 0x01, 0x1b, 0x20, 0x00, 0x6a, 0x0f, 0x0b, 0x20, 0x04, 0x20, 0x06, 0x20, + 0x02, 0x20, 0x08, 0x49, 0x22, 0x08, 0x1b, 0x21, 0x04, 0x20, 0x05, 0x20, + 0x03, 0x20, 0x05, 0x6b, 0x20, 0x08, 0x1b, 0x22, 0x03, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x00, 0x0b, 0x0c, 0x00, 0x20, 0x00, 0x41, 0x01, 0x10, 0x9b, + 0x80, 0x80, 0x80, 0x00, 0x0b, 0x87, 0x01, 0x01, 0x02, 0x7f, 0x02, 0x40, + 0x20, 0x02, 0x0d, 0x00, 0x41, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x03, 0x0d, 0x00, 0x41, 0x00, 0x21, + 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, + 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x02, 0x02, 0x40, 0x03, 0x40, 0x20, 0x03, + 0x41, 0xff, 0x01, 0x71, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x47, + 0x0d, 0x01, 0x20, 0x04, 0x45, 0x0d, 0x01, 0x20, 0x02, 0x41, 0x00, 0x46, + 0x0d, 0x01, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, + 0x01, 0x6a, 0x21, 0x01, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x21, 0x03, 0x20, + 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x03, 0x0d, 0x00, 0x0b, 0x41, + 0x00, 0x21, 0x03, 0x0b, 0x20, 0x03, 0x41, 0xff, 0x01, 0x71, 0x21, 0x03, + 0x0b, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x6b, 0x0b, 0x0d, 0x00, + 0x20, 0x00, 0x10, 0x9a, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x47, 0x0b, + 0xa5, 0x0a, 0x01, 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x02, 0x41, 0x21, 0x4f, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x46, 0x0d, + 0x02, 0x20, 0x01, 0x20, 0x00, 0x20, 0x02, 0x6a, 0x22, 0x03, 0x6b, 0x41, + 0x00, 0x20, 0x02, 0x41, 0x01, 0x74, 0x6b, 0x4b, 0x0d, 0x01, 0x0b, 0x20, + 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x0c, 0x01, 0x0b, + 0x20, 0x01, 0x20, 0x00, 0x73, 0x41, 0x03, 0x71, 0x21, 0x04, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x20, 0x01, 0x4f, 0x0d, 0x00, 0x02, + 0x40, 0x20, 0x04, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x21, 0x05, 0x20, 0x00, + 0x21, 0x03, 0x0c, 0x03, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x71, + 0x0d, 0x00, 0x20, 0x02, 0x21, 0x05, 0x20, 0x00, 0x21, 0x03, 0x0c, 0x02, + 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, + 0x00, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x05, 0x02, + 0x40, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x0d, + 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, + 0x05, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x20, 0x01, 0x41, + 0x01, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x7e, + 0x6a, 0x21, 0x05, 0x02, 0x40, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x03, + 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x21, 0x01, + 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x41, 0x02, + 0x6a, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, + 0x20, 0x02, 0x41, 0x7d, 0x6a, 0x21, 0x05, 0x02, 0x40, 0x20, 0x00, 0x41, + 0x03, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x01, 0x41, + 0x03, 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x03, + 0x20, 0x00, 0x41, 0x03, 0x6a, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x2d, 0x00, + 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, + 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x21, + 0x05, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x04, 0x0d, 0x00, 0x02, 0x40, + 0x20, 0x03, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, + 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x03, 0x6a, 0x22, + 0x04, 0x20, 0x01, 0x20, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, + 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x03, 0x21, + 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, + 0x02, 0x41, 0x7e, 0x6a, 0x22, 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, + 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x04, + 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, + 0x20, 0x03, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x7d, 0x6a, + 0x22, 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, 0x03, 0x6a, 0x2d, 0x00, + 0x00, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x0d, + 0x00, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x45, 0x0d, + 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x02, 0x6a, 0x20, + 0x01, 0x20, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x0b, 0x20, + 0x02, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x02, 0x41, 0x7c, + 0x6a, 0x22, 0x06, 0x41, 0x02, 0x76, 0x41, 0x01, 0x6a, 0x41, 0x03, 0x71, + 0x22, 0x03, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x41, 0x7c, 0x6a, 0x21, 0x04, + 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x21, 0x05, 0x03, 0x40, 0x20, 0x05, 0x20, + 0x02, 0x6a, 0x20, 0x04, 0x20, 0x02, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, + 0x00, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x21, 0x02, 0x20, 0x03, 0x41, 0x7f, + 0x6a, 0x22, 0x03, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x06, 0x41, 0x0c, 0x49, + 0x0d, 0x00, 0x20, 0x01, 0x41, 0x70, 0x6a, 0x21, 0x05, 0x20, 0x00, 0x41, + 0x70, 0x6a, 0x21, 0x06, 0x03, 0x40, 0x20, 0x06, 0x20, 0x02, 0x6a, 0x22, + 0x03, 0x41, 0x0c, 0x6a, 0x20, 0x05, 0x20, 0x02, 0x6a, 0x22, 0x04, 0x41, + 0x0c, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x08, + 0x6a, 0x20, 0x04, 0x41, 0x08, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, + 0x20, 0x03, 0x41, 0x04, 0x6a, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x28, 0x02, + 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x04, 0x28, 0x02, 0x00, 0x36, + 0x02, 0x00, 0x20, 0x02, 0x41, 0x70, 0x6a, 0x22, 0x02, 0x41, 0x03, 0x4b, + 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x02, 0x21, + 0x03, 0x02, 0x40, 0x20, 0x02, 0x41, 0x03, 0x71, 0x22, 0x04, 0x45, 0x0d, + 0x00, 0x20, 0x01, 0x41, 0x7f, 0x6a, 0x21, 0x05, 0x20, 0x00, 0x41, 0x7f, + 0x6a, 0x21, 0x06, 0x20, 0x02, 0x21, 0x03, 0x03, 0x40, 0x20, 0x06, 0x20, + 0x03, 0x6a, 0x20, 0x05, 0x20, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, + 0x00, 0x20, 0x03, 0x41, 0x7f, 0x6a, 0x21, 0x03, 0x20, 0x04, 0x41, 0x7f, + 0x6a, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, + 0x0d, 0x02, 0x20, 0x01, 0x41, 0x7c, 0x6a, 0x21, 0x04, 0x20, 0x00, 0x41, + 0x7c, 0x6a, 0x21, 0x05, 0x03, 0x40, 0x20, 0x05, 0x20, 0x03, 0x6a, 0x22, + 0x01, 0x41, 0x03, 0x6a, 0x20, 0x04, 0x20, 0x03, 0x6a, 0x22, 0x02, 0x41, + 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x02, + 0x6a, 0x20, 0x02, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, + 0x20, 0x01, 0x41, 0x01, 0x6a, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x2d, 0x00, + 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x20, 0x02, 0x2d, 0x00, 0x00, 0x3a, + 0x00, 0x00, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x22, 0x03, 0x0d, 0x00, 0x0c, + 0x03, 0x0b, 0x0b, 0x20, 0x05, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x02, 0x40, + 0x20, 0x05, 0x41, 0x7c, 0x6a, 0x22, 0x04, 0x41, 0x02, 0x76, 0x41, 0x01, + 0x6a, 0x41, 0x07, 0x71, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x05, 0x20, + 0x02, 0x41, 0x02, 0x74, 0x6b, 0x21, 0x05, 0x03, 0x40, 0x20, 0x03, 0x20, + 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x04, 0x6a, + 0x21, 0x01, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, + 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x04, 0x41, 0x1c, + 0x49, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x00, + 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x08, 0x6a, - 0x20, 0x04, 0x41, 0x08, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, - 0x03, 0x41, 0x04, 0x6a, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x28, 0x02, 0x00, - 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x04, 0x28, 0x02, 0x00, 0x36, 0x02, - 0x00, 0x20, 0x02, 0x41, 0x70, 0x6a, 0x22, 0x02, 0x41, 0x03, 0x4b, 0x0d, - 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x02, 0x21, 0x03, - 0x02, 0x40, 0x20, 0x02, 0x41, 0x03, 0x71, 0x22, 0x04, 0x45, 0x0d, 0x00, - 0x20, 0x01, 0x41, 0x7f, 0x6a, 0x21, 0x05, 0x20, 0x00, 0x41, 0x7f, 0x6a, - 0x21, 0x06, 0x20, 0x02, 0x21, 0x03, 0x03, 0x40, 0x20, 0x06, 0x20, 0x03, - 0x6a, 0x20, 0x05, 0x20, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, - 0x20, 0x03, 0x41, 0x7f, 0x6a, 0x21, 0x03, 0x20, 0x04, 0x41, 0x7f, 0x6a, - 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, 0x0d, - 0x02, 0x20, 0x01, 0x41, 0x7c, 0x6a, 0x21, 0x04, 0x20, 0x00, 0x41, 0x7c, - 0x6a, 0x21, 0x05, 0x03, 0x40, 0x20, 0x05, 0x20, 0x03, 0x6a, 0x22, 0x01, - 0x41, 0x03, 0x6a, 0x20, 0x04, 0x20, 0x03, 0x6a, 0x22, 0x02, 0x41, 0x03, - 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x02, 0x6a, - 0x20, 0x02, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, - 0x01, 0x41, 0x01, 0x6a, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x2d, 0x00, 0x00, - 0x3a, 0x00, 0x00, 0x20, 0x01, 0x20, 0x02, 0x2d, 0x00, 0x00, 0x3a, 0x00, - 0x00, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x22, 0x03, 0x0d, 0x00, 0x0c, 0x03, - 0x0b, 0x0b, 0x20, 0x05, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x02, 0x40, 0x20, - 0x05, 0x41, 0x7c, 0x6a, 0x22, 0x04, 0x41, 0x02, 0x76, 0x41, 0x01, 0x6a, - 0x41, 0x07, 0x71, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x02, - 0x41, 0x02, 0x74, 0x6b, 0x21, 0x05, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, - 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, - 0x01, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x7f, - 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x04, 0x41, 0x1c, 0x49, - 0x0d, 0x00, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36, - 0x02, 0x00, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x04, 0x36, 0x02, 0x04, - 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x08, 0x36, 0x02, 0x08, 0x20, 0x03, - 0x20, 0x01, 0x28, 0x02, 0x0c, 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, 0x01, - 0x28, 0x02, 0x10, 0x36, 0x02, 0x10, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, - 0x14, 0x36, 0x02, 0x14, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x18, 0x36, - 0x02, 0x18, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x1c, 0x36, 0x02, 0x1c, - 0x20, 0x01, 0x41, 0x20, 0x6a, 0x21, 0x01, 0x20, 0x03, 0x41, 0x20, 0x6a, - 0x21, 0x03, 0x20, 0x05, 0x41, 0x60, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x4b, - 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, - 0x40, 0x20, 0x05, 0x41, 0x07, 0x71, 0x22, 0x02, 0x0d, 0x00, 0x20, 0x05, - 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x78, 0x71, 0x21, 0x04, - 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, - 0x20, 0x03, 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, - 0x21, 0x01, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, - 0x0b, 0x20, 0x05, 0x41, 0x08, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x03, - 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x20, 0x01, - 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, - 0x02, 0x3a, 0x00, 0x02, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x03, 0x3a, - 0x00, 0x03, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x04, 0x3a, 0x00, 0x04, - 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x05, 0x3a, 0x00, 0x05, 0x20, 0x03, - 0x20, 0x01, 0x2d, 0x00, 0x06, 0x3a, 0x00, 0x06, 0x20, 0x03, 0x20, 0x01, - 0x2d, 0x00, 0x07, 0x3a, 0x00, 0x07, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x21, - 0x03, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, 0x20, 0x04, 0x41, 0x78, - 0x6a, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0x0d, 0x00, - 0x20, 0x00, 0x10, 0x9c, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x47, 0x0b, - 0x0d, 0x00, 0x20, 0x00, 0x41, 0x20, 0x46, 0x20, 0x00, 0x41, 0x09, 0x46, - 0x72, 0x0b, 0x0a, 0x00, 0x20, 0x00, 0x10, 0xa1, 0x80, 0x80, 0x80, 0x00, - 0x0b, 0x0a, 0x00, 0x20, 0x00, 0x41, 0x50, 0x6a, 0x41, 0x0a, 0x49, 0x0b, - 0x4d, 0x01, 0x02, 0x7f, 0x20, 0x00, 0x20, 0x00, 0x10, 0x95, 0x80, 0x80, - 0x80, 0x00, 0x6a, 0x21, 0x03, 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, - 0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x01, - 0x20, 0x03, 0x20, 0x04, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x01, 0x6a, + 0x20, 0x01, 0x41, 0x08, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, + 0x03, 0x41, 0x0c, 0x6a, 0x20, 0x01, 0x41, 0x0c, 0x6a, 0x28, 0x02, 0x00, + 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x20, 0x01, 0x41, 0x10, + 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x14, 0x6a, + 0x20, 0x01, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, + 0x03, 0x41, 0x18, 0x6a, 0x20, 0x01, 0x41, 0x18, 0x6a, 0x28, 0x02, 0x00, + 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x1c, 0x6a, 0x20, 0x01, 0x41, 0x1c, + 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x20, 0x6a, + 0x21, 0x01, 0x20, 0x03, 0x41, 0x20, 0x6a, 0x21, 0x03, 0x20, 0x05, 0x41, + 0x60, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x05, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x05, 0x41, 0x07, + 0x71, 0x22, 0x02, 0x0d, 0x00, 0x20, 0x05, 0x21, 0x04, 0x0c, 0x01, 0x0b, + 0x20, 0x05, 0x41, 0x78, 0x71, 0x21, 0x04, 0x03, 0x40, 0x20, 0x03, 0x20, + 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, - 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x03, 0x41, 0x00, - 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0b, 0xf3, 0x03, 0x01, 0x04, 0x7f, 0x02, - 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, 0x20, - 0x00, 0x73, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x21, 0x03, - 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x41, 0x00, 0x47, 0x21, 0x04, 0x02, 0x40, - 0x02, 0x40, 0x20, 0x01, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x00, 0x21, - 0x03, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x0d, 0x00, 0x20, 0x00, - 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, - 0x22, 0x03, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x03, 0x0d, 0x00, 0x20, - 0x00, 0x21, 0x03, 0x20, 0x02, 0x21, 0x05, 0x0c, 0x05, 0x0b, 0x20, 0x00, - 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x05, - 0x41, 0x00, 0x47, 0x21, 0x04, 0x02, 0x40, 0x20, 0x01, 0x41, 0x01, 0x6a, - 0x22, 0x06, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x05, 0x45, 0x0d, - 0x00, 0x20, 0x03, 0x20, 0x06, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x3a, 0x00, - 0x00, 0x20, 0x04, 0x45, 0x0d, 0x05, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x21, - 0x03, 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, - 0x04, 0x02, 0x40, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x22, 0x06, 0x41, 0x03, - 0x71, 0x45, 0x0d, 0x00, 0x20, 0x05, 0x45, 0x0d, 0x00, 0x20, 0x03, 0x20, - 0x06, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x45, - 0x0d, 0x06, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, - 0x7d, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x04, 0x02, 0x40, 0x20, - 0x01, 0x41, 0x03, 0x6a, 0x22, 0x06, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, - 0x20, 0x05, 0x45, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x06, 0x2d, 0x00, 0x00, - 0x22, 0x04, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x45, 0x0d, 0x07, 0x20, 0x00, - 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, - 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x02, 0x41, 0x00, 0x47, 0x21, 0x04, - 0x0c, 0x03, 0x0b, 0x20, 0x06, 0x21, 0x01, 0x20, 0x05, 0x21, 0x02, 0x0c, - 0x02, 0x0b, 0x20, 0x06, 0x21, 0x01, 0x20, 0x05, 0x21, 0x02, 0x0c, 0x01, - 0x0b, 0x20, 0x06, 0x21, 0x01, 0x20, 0x05, 0x21, 0x02, 0x0b, 0x20, 0x04, - 0x45, 0x0d, 0x02, 0x02, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x0d, 0x00, - 0x20, 0x02, 0x21, 0x05, 0x0c, 0x04, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, - 0x0d, 0x00, 0x03, 0x40, 0x41, 0x80, 0x82, 0x84, 0x08, 0x20, 0x01, 0x28, - 0x02, 0x00, 0x22, 0x00, 0x6b, 0x20, 0x00, 0x72, 0x41, 0x80, 0x81, 0x82, - 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x47, 0x0d, 0x02, - 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x04, 0x6a, - 0x21, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, - 0x7c, 0x6a, 0x22, 0x02, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, - 0x02, 0x45, 0x0d, 0x01, 0x0b, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, 0x2d, - 0x00, 0x00, 0x22, 0x00, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x00, 0x0d, - 0x00, 0x20, 0x02, 0x21, 0x05, 0x0c, 0x03, 0x0b, 0x20, 0x03, 0x41, 0x01, + 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x05, 0x41, 0x08, + 0x49, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x00, + 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x20, 0x01, 0x41, 0x01, + 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x02, 0x6a, + 0x20, 0x01, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, + 0x03, 0x41, 0x03, 0x6a, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x2d, 0x00, 0x00, + 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x20, 0x01, 0x41, 0x04, + 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x05, 0x6a, + 0x20, 0x01, 0x41, 0x05, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, + 0x03, 0x41, 0x06, 0x6a, 0x20, 0x01, 0x41, 0x06, 0x6a, 0x2d, 0x00, 0x00, + 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x07, 0x6a, 0x20, 0x01, 0x41, 0x07, + 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x08, 0x6a, + 0x21, 0x03, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, 0x20, 0x04, 0x41, + 0x78, 0x6a, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0x0d, + 0x00, 0x20, 0x00, 0x10, 0x9c, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x47, + 0x0b, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x20, 0x46, 0x20, 0x00, 0x41, 0x09, + 0x46, 0x72, 0x0b, 0x0a, 0x00, 0x20, 0x00, 0x10, 0xa1, 0x80, 0x80, 0x80, + 0x00, 0x0b, 0x0a, 0x00, 0x20, 0x00, 0x41, 0x50, 0x6a, 0x41, 0x0a, 0x49, + 0x0b, 0x4d, 0x01, 0x02, 0x7f, 0x20, 0x00, 0x20, 0x00, 0x10, 0x95, 0x80, + 0x80, 0x80, 0x00, 0x6a, 0x21, 0x03, 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, + 0x00, 0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x45, 0x0d, + 0x01, 0x20, 0x03, 0x20, 0x04, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, - 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, 0x21, - 0x05, 0x0b, 0x20, 0x03, 0x41, 0x00, 0x20, 0x05, 0x10, 0x94, 0x80, 0x80, - 0x80, 0x00, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x10, - 0xa5, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, 0x00, 0x0b, 0x17, 0x00, 0x20, - 0x00, 0x41, 0x50, 0x6a, 0x41, 0x0a, 0x49, 0x20, 0x00, 0x41, 0x20, 0x72, - 0x41, 0x9f, 0x7f, 0x6a, 0x41, 0x06, 0x49, 0x72, 0x0b, 0x2a, 0x01, 0x03, - 0x7f, 0x41, 0x00, 0x21, 0x01, 0x03, 0x40, 0x20, 0x00, 0x20, 0x01, 0x6a, - 0x21, 0x02, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x22, 0x03, 0x21, 0x01, 0x20, - 0x02, 0x28, 0x02, 0x00, 0x0d, 0x00, 0x0b, 0x20, 0x03, 0x41, 0x7c, 0x6a, - 0x41, 0x02, 0x75, 0x0b, 0x45, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x20, 0x01, - 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x21, 0x00, 0x02, 0x40, - 0x03, 0x40, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x22, 0x00, 0x28, 0x02, 0x00, - 0x22, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x02, 0x20, 0x01, 0x47, 0x0d, 0x00, - 0x0b, 0x0b, 0x20, 0x00, 0x41, 0x00, 0x20, 0x02, 0x1b, 0x0f, 0x0b, 0x20, - 0x00, 0x20, 0x00, 0x10, 0xa8, 0x80, 0x80, 0x80, 0x00, 0x41, 0x02, 0x74, - 0x6a, 0x0b, 0x1d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, 0x00, - 0x0f, 0x0b, 0x41, 0x90, 0xc2, 0x84, 0x80, 0x00, 0x20, 0x00, 0x10, 0xa9, - 0x80, 0x80, 0x80, 0x00, 0x41, 0x00, 0x47, 0x0b, 0x24, 0x01, 0x01, 0x7f, - 0x41, 0x01, 0x21, 0x01, 0x02, 0x40, 0x20, 0x00, 0x41, 0x50, 0x6a, 0x41, - 0x0a, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x10, 0x96, 0x80, 0x80, 0x80, 0x00, - 0x41, 0x00, 0x47, 0x21, 0x01, 0x0b, 0x20, 0x01, 0x0b, 0x0b, 0xf1, 0x42, - 0x01, 0x00, 0x41, 0x80, 0x80, 0x04, 0x0b, 0xe8, 0x42, 0x12, 0x11, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, - 0x20, 0x21, 0x11, 0x22, 0x23, 0x24, 0x11, 0x25, 0x26, 0x27, 0x28, 0x29, - 0x2a, 0x2b, 0x2c, 0x11, 0x2d, 0x2e, 0x2f, 0x10, 0x10, 0x30, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x31, 0x32, 0x33, 0x10, 0x34, 0x35, 0x10, - 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x03, 0x41, + 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0b, 0xf3, 0x03, 0x01, 0x04, 0x7f, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, + 0x20, 0x00, 0x73, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x21, + 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x41, 0x00, 0x47, 0x21, 0x04, 0x02, + 0x40, 0x02, 0x40, 0x20, 0x01, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x00, + 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x0d, 0x00, 0x20, + 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, + 0x00, 0x22, 0x03, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x03, 0x0d, 0x00, + 0x20, 0x00, 0x21, 0x03, 0x20, 0x02, 0x21, 0x05, 0x0c, 0x05, 0x0b, 0x20, + 0x00, 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, + 0x05, 0x41, 0x00, 0x47, 0x21, 0x04, 0x02, 0x40, 0x20, 0x01, 0x41, 0x01, + 0x6a, 0x22, 0x06, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x05, 0x45, + 0x0d, 0x00, 0x20, 0x03, 0x20, 0x06, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x3a, + 0x00, 0x00, 0x20, 0x04, 0x45, 0x0d, 0x05, 0x20, 0x00, 0x41, 0x02, 0x6a, + 0x21, 0x03, 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, + 0x21, 0x04, 0x02, 0x40, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x22, 0x06, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x05, 0x45, 0x0d, 0x00, 0x20, 0x03, + 0x20, 0x06, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x3a, 0x00, 0x00, 0x20, 0x04, + 0x45, 0x0d, 0x06, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x21, 0x03, 0x20, 0x02, + 0x41, 0x7d, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x04, 0x02, 0x40, + 0x20, 0x01, 0x41, 0x03, 0x6a, 0x22, 0x06, 0x41, 0x03, 0x71, 0x45, 0x0d, + 0x00, 0x20, 0x05, 0x45, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x06, 0x2d, 0x00, + 0x00, 0x22, 0x04, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x45, 0x0d, 0x07, 0x20, + 0x00, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, + 0x01, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x02, 0x41, 0x00, 0x47, 0x21, + 0x04, 0x0c, 0x03, 0x0b, 0x20, 0x06, 0x21, 0x01, 0x20, 0x05, 0x21, 0x02, + 0x0c, 0x02, 0x0b, 0x20, 0x06, 0x21, 0x01, 0x20, 0x05, 0x21, 0x02, 0x0c, + 0x01, 0x0b, 0x20, 0x06, 0x21, 0x01, 0x20, 0x05, 0x21, 0x02, 0x0b, 0x20, + 0x04, 0x45, 0x0d, 0x02, 0x02, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x0d, + 0x00, 0x20, 0x02, 0x21, 0x05, 0x0c, 0x04, 0x0b, 0x20, 0x02, 0x41, 0x04, + 0x49, 0x0d, 0x00, 0x03, 0x40, 0x41, 0x80, 0x82, 0x84, 0x08, 0x20, 0x01, + 0x28, 0x02, 0x00, 0x22, 0x00, 0x6b, 0x20, 0x00, 0x72, 0x41, 0x80, 0x81, + 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x47, 0x0d, + 0x02, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x04, + 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, + 0x41, 0x7c, 0x6a, 0x22, 0x02, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x02, 0x45, 0x0d, 0x01, 0x0b, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, + 0x2d, 0x00, 0x00, 0x22, 0x00, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x00, + 0x0d, 0x00, 0x20, 0x02, 0x21, 0x05, 0x0c, 0x03, 0x0b, 0x20, 0x03, 0x41, + 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, + 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, + 0x21, 0x05, 0x0b, 0x20, 0x03, 0x41, 0x00, 0x20, 0x05, 0x10, 0x94, 0x80, + 0x80, 0x80, 0x00, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, + 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, 0x00, 0x0b, 0x17, 0x00, + 0x20, 0x00, 0x41, 0x50, 0x6a, 0x41, 0x0a, 0x49, 0x20, 0x00, 0x41, 0x20, + 0x72, 0x41, 0x9f, 0x7f, 0x6a, 0x41, 0x06, 0x49, 0x72, 0x0b, 0x2a, 0x01, + 0x03, 0x7f, 0x41, 0x00, 0x21, 0x01, 0x03, 0x40, 0x20, 0x00, 0x20, 0x01, + 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x22, 0x03, 0x21, 0x01, + 0x20, 0x02, 0x28, 0x02, 0x00, 0x0d, 0x00, 0x0b, 0x20, 0x03, 0x41, 0x7c, + 0x6a, 0x41, 0x02, 0x75, 0x0b, 0x45, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x20, + 0x01, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x21, 0x00, 0x02, + 0x40, 0x03, 0x40, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x22, 0x00, 0x28, 0x02, + 0x00, 0x22, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x02, 0x20, 0x01, 0x47, 0x0d, + 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x41, 0x00, 0x20, 0x02, 0x1b, 0x0f, 0x0b, + 0x20, 0x00, 0x20, 0x00, 0x10, 0xa8, 0x80, 0x80, 0x80, 0x00, 0x41, 0x02, + 0x74, 0x6a, 0x0b, 0x1d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, + 0x00, 0x0f, 0x0b, 0x41, 0x90, 0xc2, 0x84, 0x80, 0x00, 0x20, 0x00, 0x10, + 0xa9, 0x80, 0x80, 0x80, 0x00, 0x41, 0x00, 0x47, 0x0b, 0x24, 0x01, 0x01, + 0x7f, 0x41, 0x01, 0x21, 0x01, 0x02, 0x40, 0x20, 0x00, 0x41, 0x50, 0x6a, + 0x41, 0x0a, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x10, 0x96, 0x80, 0x80, 0x80, + 0x00, 0x41, 0x00, 0x47, 0x21, 0x01, 0x0b, 0x20, 0x01, 0x0b, 0x0b, 0xf1, + 0x42, 0x01, 0x00, 0x41, 0x80, 0x80, 0x04, 0x0b, 0xe8, 0x42, 0x12, 0x11, + 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, + 0x1f, 0x20, 0x21, 0x11, 0x22, 0x23, 0x24, 0x11, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x11, 0x2d, 0x2e, 0x2f, 0x10, 0x10, 0x30, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x31, 0x32, 0x33, 0x10, 0x34, 0x35, + 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x36, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x36, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x37, 0x11, 0x11, 0x11, 0x11, 0x38, 0x11, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, - 0x3e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x37, 0x11, 0x11, 0x11, 0x11, 0x38, 0x11, 0x39, 0x3a, 0x3b, 0x3c, + 0x3d, 0x3e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x3f, 0x10, 0x10, 0x10, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x3f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x40, 0x41, 0x11, 0x42, 0x43, - 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x11, 0x4b, 0x4c, 0x4d, 0x4e, - 0x4f, 0x50, 0x51, 0x10, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, - 0x5a, 0x5b, 0x5c, 0x5d, 0x10, 0x5e, 0x5f, 0x60, 0x10, 0x11, 0x11, 0x11, - 0x61, 0x62, 0x63, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x11, 0x11, 0x11, 0x11, 0x64, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x65, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x40, 0x41, 0x11, 0x42, + 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x11, 0x4b, 0x4c, 0x4d, + 0x4e, 0x4f, 0x50, 0x51, 0x10, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x10, 0x5e, 0x5f, 0x60, 0x10, 0x11, 0x11, + 0x11, 0x61, 0x62, 0x63, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x64, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, + 0x65, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x66, - 0x67, 0x10, 0x10, 0x68, 0x69, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, + 0x66, 0x67, 0x10, 0x10, 0x68, 0x69, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x6a, 0x11, 0x11, 0x6b, 0x10, 0x10, 0x10, 0x10, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x6a, 0x11, 0x11, 0x6b, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x6c, 0x6d, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x6e, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x6c, + 0x6d, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x6e, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x6f, 0x70, 0x71, - 0x72, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x73, 0x74, 0x75, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x76, 0x77, 0x10, 0x10, 0x10, 0x10, 0x78, - 0x10, 0x10, 0x79, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x6f, 0x70, + 0x71, 0x72, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x73, 0x74, + 0x75, 0x10, 0x10, 0x10, 0x10, 0x10, 0x76, 0x77, 0x10, 0x10, 0x10, 0x10, + 0x78, 0x10, 0x10, 0x79, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x04, 0xff, 0xff, 0x7f, - 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, + 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x04, 0xff, 0xff, + 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0x03, 0x00, 0x1f, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xdf, 0xbc, 0x40, 0xd7, 0xff, 0xff, 0xfb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0x03, 0x00, 0x1f, 0x50, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xdf, 0xbc, 0x40, 0xd7, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x03, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0x7f, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xbf, 0xb6, 0x00, 0xff, 0xff, 0xff, 0x87, 0x07, - 0x00, 0x00, 0x00, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xef, 0x1f, 0xfe, 0xe1, 0xff, 0x9f, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x07, 0x30, 0x04, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x1f, 0x00, - 0x00, 0xff, 0xff, 0xff, 0x01, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xdf, 0x3f, 0x00, 0x00, 0xf0, 0xff, 0xf8, 0x03, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xdf, 0xe1, - 0xff, 0xcf, 0xff, 0xfe, 0xff, 0xef, 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xc5, - 0xe3, 0x9f, 0x59, 0x80, 0xb0, 0xcf, 0xff, 0x03, 0x10, 0xee, 0x87, 0xf9, - 0xff, 0xff, 0xfd, 0x6d, 0xc3, 0x87, 0x19, 0x02, 0x5e, 0xc0, 0xff, 0x3f, - 0x00, 0xee, 0xbf, 0xfb, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0xbf, 0x1b, 0x01, - 0x00, 0xcf, 0xff, 0x00, 0x1e, 0xee, 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xed, - 0xe3, 0x9f, 0x19, 0xc0, 0xb0, 0xcf, 0xff, 0x02, 0x00, 0xec, 0xc7, 0x3d, - 0xd6, 0x18, 0xc7, 0xff, 0xc3, 0xc7, 0x1d, 0x81, 0x00, 0xc0, 0xff, 0x00, - 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, 0xfd, 0xff, 0xe3, 0xdf, 0x1d, 0x60, - 0x07, 0xcf, 0xff, 0x00, 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, 0xfd, 0xef, - 0xe3, 0xdf, 0x1d, 0x60, 0x40, 0xcf, 0xff, 0x06, 0x00, 0xef, 0xdf, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xe7, 0xdf, 0x5d, 0xf0, 0x80, 0xcf, 0xff, 0x00, - 0xfc, 0xec, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xfb, 0x2f, 0x7f, 0x80, 0x5f, - 0xff, 0xc0, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, - 0x07, 0x3f, 0x20, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xf7, 0xff, - 0xff, 0xaf, 0xff, 0xff, 0x3b, 0x5f, 0x20, 0xff, 0xf3, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0xfe, 0xff, - 0xff, 0xff, 0x1f, 0xfe, 0xff, 0x03, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x7f, 0xf9, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x20, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x3d, 0x7f, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, - 0xff, 0xff, 0xff, 0x3d, 0x7f, 0x3d, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x07, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3f, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xbf, 0xb6, 0x00, 0xff, 0xff, 0xff, 0x87, + 0x07, 0x00, 0x00, 0x00, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0x1f, 0xfe, 0xe1, 0xff, 0x9f, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x30, 0x04, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x1f, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xdf, 0x3f, 0x00, 0x00, 0xf0, 0xff, 0xf8, 0x03, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xdf, + 0xe1, 0xff, 0xcf, 0xff, 0xfe, 0xff, 0xef, 0x9f, 0xf9, 0xff, 0xff, 0xfd, + 0xc5, 0xe3, 0x9f, 0x59, 0x80, 0xb0, 0xcf, 0xff, 0x03, 0x10, 0xee, 0x87, + 0xf9, 0xff, 0xff, 0xfd, 0x6d, 0xc3, 0x87, 0x19, 0x02, 0x5e, 0xc0, 0xff, + 0x3f, 0x00, 0xee, 0xbf, 0xfb, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0xbf, 0x1b, + 0x01, 0x00, 0xcf, 0xff, 0x00, 0x1e, 0xee, 0x9f, 0xf9, 0xff, 0xff, 0xfd, + 0xed, 0xe3, 0x9f, 0x19, 0xc0, 0xb0, 0xcf, 0xff, 0x02, 0x00, 0xec, 0xc7, + 0x3d, 0xd6, 0x18, 0xc7, 0xff, 0xc3, 0xc7, 0x1d, 0x81, 0x00, 0xc0, 0xff, + 0x00, 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, 0xfd, 0xff, 0xe3, 0xdf, 0x1d, + 0x60, 0x07, 0xcf, 0xff, 0x00, 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, 0xfd, + 0xef, 0xe3, 0xdf, 0x1d, 0x60, 0x40, 0xcf, 0xff, 0x06, 0x00, 0xef, 0xdf, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xdf, 0x5d, 0xf0, 0x80, 0xcf, 0xff, + 0x00, 0xfc, 0xec, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xfb, 0x2f, 0x7f, 0x80, + 0x5f, 0xff, 0xc0, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0xff, 0x07, 0x3f, 0x20, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xf7, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0x3b, 0x5f, 0x20, 0xff, 0xf3, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0x03, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf9, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x20, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3d, 0x7f, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, + 0xff, 0xff, 0xff, 0xff, 0x3d, 0x7f, 0x3d, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, - 0x01, 0xff, 0xdf, 0x0f, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x0f, - 0x00, 0xff, 0xdf, 0x0d, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, - 0xff, 0xff, 0x01, 0x80, 0x10, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, - 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x0f, 0xff, - 0x01, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x1f, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x03, 0xff, 0x03, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7f, 0xfe, 0xff, 0x1f, 0x00, 0xff, 0x03, 0xff, 0x03, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xef, 0xff, 0xef, 0x0f, 0xff, 0x03, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xbf, 0xff, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, - 0x00, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x01, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x6f, - 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, + 0xff, 0x01, 0xff, 0xdf, 0x0f, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, + 0x0f, 0x00, 0xff, 0xdf, 0x0d, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0x01, 0x80, 0x10, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x0f, + 0xff, 0x01, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x1f, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x03, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xfe, 0xff, 0x1f, 0x00, 0xff, 0x03, 0xff, 0x03, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xef, 0x0f, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x01, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, + 0x6f, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x1f, 0x00, 0xff, 0xff, 0x3f, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3f, 0xff, 0xaa, 0xff, 0xff, 0xff, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x5f, 0xdc, 0x1f, 0xcf, - 0x0f, 0xff, 0x1f, 0xdc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0xff, - 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x84, 0xfc, 0x2f, 0x3e, 0x50, 0xbd, 0xff, 0xf3, 0xe0, 0x43, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x1f, 0x00, 0xff, 0xff, + 0x3f, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3f, 0xff, 0xaa, 0xff, 0xff, + 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x5f, 0xdc, 0x1f, + 0xcf, 0x0f, 0xff, 0x1f, 0xdc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x84, 0xfc, 0x2f, 0x3e, 0x50, 0xbd, 0xff, 0xf3, 0xe0, 0x43, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x78, 0x0c, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x78, + 0x0c, 0x00, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x20, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xfe, 0x03, 0x3e, - 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, - 0xe0, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xfe, 0x03, + 0x3e, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xe0, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, + 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x1f, + 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x2f, 0x00, 0xff, 0x03, 0x00, 0x00, 0xfc, 0xe8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, + 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x80, + 0xff, 0x03, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0xff, 0x3f, 0xff, 0x03, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x05, 0x00, 0x00, 0x38, 0xff, 0xff, + 0x3c, 0x00, 0x7e, 0x7e, 0x7e, 0x00, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0x03, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x7f, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0x00, 0xf8, 0xe0, 0xff, 0xfd, 0x7f, 0x5f, 0xdb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x03, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1f, 0x00, 0x00, 0xff, 0x03, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, + 0xff, 0x07, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xfc, 0xfc, 0xfc, 0x1c, 0x00, 0x00, 0x00, 0x00, 0xff, 0xef, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xb7, 0xff, 0x3f, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x07, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, + 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0x91, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, + 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x37, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xf0, + 0xef, 0xfe, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0x1f, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, + 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x07, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x00, + 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x7f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0x00, 0xc0, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xff, 0x03, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0x70, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x47, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0x00, + 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0x9f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xbd, + 0xff, 0xbf, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, + 0xff, 0x03, 0xef, 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0x9f, 0x19, + 0x81, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0x07, 0xff, 0x83, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x11, 0x00, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xe7, 0xff, 0x07, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1a, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x7f, 0x01, 0x00, 0xff, 0x03, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xb4, 0xcb, 0x00, + 0xff, 0x03, 0xbf, 0xfd, 0xff, 0xff, 0xff, 0x7f, 0x7b, 0x01, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x0f, 0x00, 0xff, 0x03, 0xf8, 0xff, 0xff, 0xe0, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, + 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xf0, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x07, 0xff, 0x1f, 0xff, 0x01, 0xff, 0x43, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x64, 0xde, 0xff, 0xeb, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xe7, 0xdf, 0xdf, 0xff, 0xff, + 0xff, 0x7b, 0x5f, 0xfc, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf9, 0xdb, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x3f, 0xff, 0x43, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x1f, 0xff, - 0xff, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x2f, 0x00, 0xff, 0x03, 0x00, 0x00, 0xfc, 0xe8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x80, 0xff, - 0x03, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, - 0x00, 0xff, 0x3f, 0xff, 0x03, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x7f, 0x05, 0x00, 0x00, 0x38, 0xff, 0xff, 0x3c, - 0x00, 0x7e, 0x7e, 0x7e, 0x00, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0x03, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x7f, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x7f, 0x00, 0xf8, 0xe0, 0xff, 0xfd, 0x7f, 0x5f, 0xdb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, - 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x1f, 0x00, 0x00, 0xff, 0x03, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, - 0x07, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7f, 0xfc, 0xfc, 0xfc, 0x1c, 0x00, 0x00, 0x00, 0x00, 0xff, 0xef, 0xff, - 0xff, 0x7f, 0xff, 0xff, 0xb7, 0xff, 0x3f, 0xff, 0x3f, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x08, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, + 0xff, 0xff, 0x96, 0xfe, 0xf7, 0x0a, 0x84, 0xea, 0x96, 0xaa, 0x96, 0xf7, + 0xf7, 0x5e, 0xff, 0xfb, 0xff, 0x0f, 0xee, 0xfb, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x07, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0x3e, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x3f, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, - 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xbf, - 0x91, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, - 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x37, - 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xf0, 0xef, - 0xfe, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0x1f, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0xff, - 0xff, 0x1f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, - 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x00, 0xff, - 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7f, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, - 0x00, 0xc0, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xff, 0x03, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc7, 0xff, 0x70, 0x00, 0xff, 0xff, 0xff, 0xff, 0x47, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0x00, 0xff, - 0x17, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x9f, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xbd, 0xff, - 0xbf, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, - 0x03, 0xef, 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0x9f, 0x19, 0x81, - 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0x07, 0xff, 0x83, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, 0xff, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x11, 0x00, 0xff, - 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, - 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xe7, 0xff, 0x07, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1a, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe7, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0x7f, - 0x7f, 0x01, 0x00, 0xff, 0x03, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xb4, 0xcb, 0x00, 0xff, - 0x03, 0xbf, 0xfd, 0xff, 0xff, 0xff, 0x7f, 0x7b, 0x01, 0xff, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x00, 0x0f, 0x00, 0xff, 0x03, 0xf8, 0xff, 0xff, 0xe0, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, - 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xf0, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x07, 0xff, 0x1f, 0xff, 0x01, 0xff, 0x43, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0x64, 0xde, 0xff, 0xeb, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xe7, 0xdf, 0xdf, 0xff, 0xff, 0xff, - 0x7b, 0x5f, 0xfc, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, - 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xdf, - 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, - 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf9, 0xdb, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x3f, 0xff, 0x43, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0f, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x08, 0xff, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, - 0xff, 0x96, 0xfe, 0xf7, 0x0a, 0x84, 0xea, 0x96, 0xaa, 0x96, 0xf7, 0xf7, - 0x5e, 0xff, 0xfb, 0xff, 0x0f, 0xee, 0xfb, 0xff, 0x0f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x39, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, - 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0xbf, 0x1d, 0x00, 0x00, 0xe7, 0x02, - 0x00, 0x00, 0x79, 0x00, 0x00, 0x02, 0x24, 0x00, 0x00, 0x01, 0x01, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, - 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x39, 0xff, 0xff, 0x00, 0x18, 0xff, - 0xff, 0x01, 0x87, 0xff, 0xff, 0x00, 0xd4, 0xfe, 0xff, 0x00, 0xc3, 0x00, - 0x00, 0x01, 0xd2, 0x00, 0x00, 0x01, 0xce, 0x00, 0x00, 0x01, 0xcd, 0x00, - 0x00, 0x01, 0x4f, 0x00, 0x00, 0x01, 0xca, 0x00, 0x00, 0x01, 0xcb, 0x00, - 0x00, 0x01, 0xcf, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x01, 0xd3, 0x00, - 0x00, 0x01, 0xd1, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x01, 0xd5, 0x00, - 0x00, 0x00, 0x82, 0x00, 0x00, 0x01, 0xd6, 0x00, 0x00, 0x01, 0xda, 0x00, - 0x00, 0x01, 0xd9, 0x00, 0x00, 0x01, 0xdb, 0x00, 0x00, 0x00, 0x38, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xb1, 0xff, 0xff, 0x01, 0x9f, 0xff, - 0xff, 0x01, 0xc8, 0xff, 0xff, 0x02, 0x28, 0x24, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x33, 0xff, - 0xff, 0x00, 0x26, 0xff, 0xff, 0x01, 0x7e, 0xff, 0xff, 0x01, 0x2b, 0x2a, - 0x00, 0x01, 0x5d, 0xff, 0xff, 0x01, 0x28, 0x2a, 0x00, 0x00, 0x3f, 0x2a, - 0x00, 0x01, 0x3d, 0xff, 0xff, 0x01, 0x45, 0x00, 0x00, 0x01, 0x47, 0x00, - 0x00, 0x00, 0x1f, 0x2a, 0x00, 0x00, 0x1c, 0x2a, 0x00, 0x00, 0x1e, 0x2a, - 0x00, 0x00, 0x2e, 0xff, 0xff, 0x00, 0x32, 0xff, 0xff, 0x00, 0x36, 0xff, - 0xff, 0x00, 0x35, 0xff, 0xff, 0x00, 0x4f, 0xa5, 0x00, 0x00, 0x4b, 0xa5, - 0x00, 0x00, 0x31, 0xff, 0xff, 0x00, 0x28, 0xa5, 0x00, 0x00, 0x44, 0xa5, - 0x00, 0x00, 0x2f, 0xff, 0xff, 0x00, 0x2d, 0xff, 0xff, 0x00, 0xf7, 0x29, - 0x00, 0x00, 0x41, 0xa5, 0x00, 0x00, 0xfd, 0x29, 0x00, 0x00, 0x2b, 0xff, - 0xff, 0x00, 0x2a, 0xff, 0xff, 0x00, 0xe7, 0x29, 0x00, 0x00, 0x43, 0xa5, - 0x00, 0x00, 0x2a, 0xa5, 0x00, 0x00, 0xbb, 0xff, 0xff, 0x00, 0x27, 0xff, - 0xff, 0x00, 0xb9, 0xff, 0xff, 0x00, 0x25, 0xff, 0xff, 0x00, 0x15, 0xa5, - 0x00, 0x00, 0x12, 0xa5, 0x00, 0x02, 0x24, 0x4c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x01, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x54, 0x00, 0x00, 0x01, 0x74, 0x00, - 0x00, 0x01, 0x26, 0x00, 0x00, 0x01, 0x25, 0x00, 0x00, 0x01, 0x40, 0x00, - 0x00, 0x01, 0x3f, 0x00, 0x00, 0x00, 0xda, 0xff, 0xff, 0x00, 0xdb, 0xff, - 0xff, 0x00, 0xe1, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xc1, 0xff, - 0xff, 0x01, 0x08, 0x00, 0x00, 0x00, 0xc2, 0xff, 0xff, 0x00, 0xc7, 0xff, - 0xff, 0x00, 0xd1, 0xff, 0xff, 0x00, 0xca, 0xff, 0xff, 0x00, 0xf8, 0xff, - 0xff, 0x00, 0xaa, 0xff, 0xff, 0x00, 0xb0, 0xff, 0xff, 0x00, 0x07, 0x00, - 0x00, 0x00, 0x8c, 0xff, 0xff, 0x01, 0xc4, 0xff, 0xff, 0x00, 0xa0, 0xff, - 0xff, 0x01, 0xf9, 0xff, 0xff, 0x02, 0x1a, 0x70, 0x00, 0x01, 0x01, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, - 0xff, 0x01, 0x50, 0x00, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x00, 0xf1, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x00, 0xd0, 0xff, - 0xff, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x0b, 0x00, 0x01, 0x60, 0x1c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xd0, 0x97, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0xf8, 0xff, - 0xff, 0x02, 0x05, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xf4, - 0xff, 0x00, 0x9e, 0xe7, 0xff, 0x00, 0xc2, 0x89, 0x00, 0x00, 0xdb, 0xe7, - 0xff, 0x00, 0x92, 0xe7, 0xff, 0x00, 0x93, 0xe7, 0xff, 0x00, 0x9c, 0xe7, - 0xff, 0x00, 0x9d, 0xe7, 0xff, 0x00, 0xa4, 0xe7, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x8a, 0x00, 0x00, 0x04, 0x8a, 0x00, 0x00, 0xe6, 0x0e, - 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc5, 0xff, 0xff, 0x01, 0x41, 0xe2, 0xff, 0x02, 0x1d, 0x8f, - 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x56, 0x00, 0x00, 0x01, 0xaa, 0xff, 0xff, 0x00, 0x4a, 0x00, - 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x01, 0xb6, 0xff, - 0xff, 0x01, 0xf7, 0xff, 0xff, 0x00, 0xdb, 0xe3, 0xff, 0x01, 0x9c, 0xff, - 0xff, 0x01, 0x90, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff, 0x01, 0x82, 0xff, - 0xff, 0x02, 0x05, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, - 0x00, 0x00, 0xf0, 0xff, 0xff, 0x01, 0x1c, 0x00, 0x00, 0x01, 0x01, 0x00, - 0x00, 0x01, 0xa3, 0xe2, 0xff, 0x01, 0x41, 0xdf, 0xff, 0x01, 0xba, 0xdf, - 0xff, 0x00, 0xe4, 0xff, 0xff, 0x02, 0x0b, 0xb1, 0x00, 0x01, 0x01, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0x30, 0x00, 0x00, 0x00, 0xd0, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x09, 0xd6, 0xff, 0x01, 0x1a, 0xf1, - 0xff, 0x01, 0x19, 0xd6, 0xff, 0x00, 0xd5, 0xd5, 0xff, 0x00, 0xd8, 0xd5, - 0xff, 0x01, 0xe4, 0xd5, 0xff, 0x01, 0x03, 0xd6, 0xff, 0x01, 0xe1, 0xd5, - 0xff, 0x01, 0xe2, 0xd5, 0xff, 0x01, 0xc1, 0xd5, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0xe3, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x02, 0x0c, 0xbc, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xbc, 0x5a, - 0xff, 0x01, 0xa0, 0x03, 0x00, 0x01, 0xfc, 0x75, 0xff, 0x01, 0xd8, 0x5a, - 0xff, 0x00, 0x30, 0x00, 0x00, 0x01, 0xb1, 0x5a, 0xff, 0x01, 0xb5, 0x5a, - 0xff, 0x01, 0xbf, 0x5a, 0xff, 0x01, 0xee, 0x5a, 0xff, 0x01, 0xd6, 0x5a, - 0xff, 0x01, 0xeb, 0x5a, 0xff, 0x01, 0xd0, 0xff, 0xff, 0x01, 0xbd, 0x5a, - 0xff, 0x01, 0xc8, 0x75, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x68, - 0xff, 0x00, 0x60, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, - 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, 0x00, - 0x00, 0x00, 0xd8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, - 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, - 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, - 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x22, 0x00, - 0x00, 0x00, 0xde, 0xff, 0xff, 0x30, 0x0c, 0x31, 0x0d, 0x78, 0x0e, 0x7f, - 0x0f, 0x80, 0x10, 0x81, 0x11, 0x86, 0x12, 0x89, 0x13, 0x8a, 0x13, 0x8e, - 0x14, 0x8f, 0x15, 0x90, 0x16, 0x93, 0x13, 0x94, 0x17, 0x95, 0x18, 0x96, - 0x19, 0x97, 0x1a, 0x9a, 0x1b, 0x9c, 0x19, 0x9d, 0x1c, 0x9e, 0x1d, 0x9f, - 0x1e, 0xa6, 0x1f, 0xa9, 0x1f, 0xae, 0x1f, 0xb1, 0x20, 0xb2, 0x20, 0xb7, - 0x21, 0xbf, 0x22, 0xc5, 0x23, 0xc8, 0x23, 0xcb, 0x23, 0xdd, 0x24, 0xf2, - 0x23, 0xf6, 0x25, 0xf7, 0x26, 0x20, 0x2d, 0x3a, 0x2e, 0x3d, 0x2f, 0x3e, - 0x30, 0x3f, 0x31, 0x40, 0x31, 0x43, 0x32, 0x44, 0x33, 0x45, 0x34, 0x50, - 0x35, 0x51, 0x36, 0x52, 0x37, 0x53, 0x38, 0x54, 0x39, 0x59, 0x3a, 0x5b, - 0x3b, 0x5c, 0x3c, 0x61, 0x3d, 0x63, 0x3e, 0x65, 0x3f, 0x66, 0x40, 0x68, - 0x41, 0x69, 0x42, 0x6a, 0x40, 0x6b, 0x43, 0x6c, 0x44, 0x6f, 0x42, 0x71, - 0x45, 0x72, 0x46, 0x75, 0x47, 0x7d, 0x48, 0x82, 0x49, 0x87, 0x4a, 0x89, - 0x4b, 0x8a, 0x4c, 0x8b, 0x4c, 0x8c, 0x4d, 0x92, 0x4e, 0x9d, 0x4f, 0x9e, - 0x50, 0x45, 0x57, 0x7b, 0x1d, 0x7c, 0x1d, 0x7d, 0x1d, 0x7f, 0x58, 0x86, - 0x59, 0x88, 0x5a, 0x89, 0x5a, 0x8a, 0x5a, 0x8c, 0x5b, 0x8e, 0x5c, 0x8f, - 0x5c, 0xac, 0x5d, 0xad, 0x5e, 0xae, 0x5e, 0xaf, 0x5e, 0xc2, 0x5f, 0xcc, - 0x60, 0xcd, 0x61, 0xce, 0x61, 0xcf, 0x62, 0xd0, 0x63, 0xd1, 0x64, 0xd5, - 0x65, 0xd6, 0x66, 0xd7, 0x67, 0xf0, 0x68, 0xf1, 0x69, 0xf2, 0x6a, 0xf3, - 0x6b, 0xf4, 0x6c, 0xf5, 0x6d, 0xf9, 0x6e, 0xfd, 0x2d, 0xfe, 0x2d, 0xff, - 0x2d, 0x50, 0x69, 0x51, 0x69, 0x52, 0x69, 0x53, 0x69, 0x54, 0x69, 0x55, - 0x69, 0x56, 0x69, 0x57, 0x69, 0x58, 0x69, 0x59, 0x69, 0x5a, 0x69, 0x5b, - 0x69, 0x5c, 0x69, 0x5d, 0x69, 0x5e, 0x69, 0x5f, 0x69, 0x82, 0x00, 0x83, - 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, - 0x00, 0xc0, 0x75, 0xcf, 0x76, 0x80, 0x89, 0x81, 0x8a, 0x82, 0x8b, 0x85, - 0x8c, 0x86, 0x8d, 0x70, 0x9d, 0x71, 0x9d, 0x76, 0x9e, 0x77, 0x9e, 0x78, - 0x9f, 0x79, 0x9f, 0x7a, 0xa0, 0x7b, 0xa0, 0x7c, 0xa1, 0x7d, 0xa1, 0xb3, - 0xa2, 0xba, 0xa3, 0xbb, 0xa3, 0xbc, 0xa4, 0xbe, 0xa5, 0xc3, 0xa2, 0xcc, - 0xa4, 0xda, 0xa6, 0xdb, 0xa6, 0xe5, 0x6a, 0xea, 0xa7, 0xeb, 0xa7, 0xec, - 0x6e, 0xf3, 0xa2, 0xf8, 0xa8, 0xf9, 0xa8, 0xfa, 0xa9, 0xfb, 0xa9, 0xfc, - 0xa4, 0x26, 0xb0, 0x2a, 0xb1, 0x2b, 0xb2, 0x4e, 0xb3, 0x84, 0x08, 0x62, - 0xba, 0x63, 0xbb, 0x64, 0xbc, 0x65, 0xbd, 0x66, 0xbe, 0x6d, 0xbf, 0x6e, - 0xc0, 0x6f, 0xc1, 0x70, 0xc2, 0x7e, 0xc3, 0x7f, 0xc3, 0x7d, 0xcf, 0x8d, - 0xd0, 0x94, 0xd1, 0xab, 0xd2, 0xac, 0xd3, 0xad, 0xd4, 0xb0, 0xd5, 0xb1, - 0xd6, 0xb2, 0xd7, 0xc4, 0xd8, 0xc5, 0xd9, 0xc6, 0xda, 0x07, 0x08, 0x09, - 0x0a, 0x0b, 0x0c, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x0d, 0x06, 0x06, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x0f, 0x10, 0x11, 0x12, 0x06, 0x13, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x14, 0x15, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x39, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0xbf, 0x1d, 0x00, 0x00, 0xe7, + 0x02, 0x00, 0x00, 0x79, 0x00, 0x00, 0x02, 0x24, 0x00, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x39, 0xff, 0xff, 0x00, 0x18, + 0xff, 0xff, 0x01, 0x87, 0xff, 0xff, 0x00, 0xd4, 0xfe, 0xff, 0x00, 0xc3, + 0x00, 0x00, 0x01, 0xd2, 0x00, 0x00, 0x01, 0xce, 0x00, 0x00, 0x01, 0xcd, + 0x00, 0x00, 0x01, 0x4f, 0x00, 0x00, 0x01, 0xca, 0x00, 0x00, 0x01, 0xcb, + 0x00, 0x00, 0x01, 0xcf, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x01, 0xd3, + 0x00, 0x00, 0x01, 0xd1, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x01, 0xd5, + 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x01, 0xd6, 0x00, 0x00, 0x01, 0xda, + 0x00, 0x00, 0x01, 0xd9, 0x00, 0x00, 0x01, 0xdb, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xb1, 0xff, 0xff, 0x01, 0x9f, + 0xff, 0xff, 0x01, 0xc8, 0xff, 0xff, 0x02, 0x28, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x33, + 0xff, 0xff, 0x00, 0x26, 0xff, 0xff, 0x01, 0x7e, 0xff, 0xff, 0x01, 0x2b, + 0x2a, 0x00, 0x01, 0x5d, 0xff, 0xff, 0x01, 0x28, 0x2a, 0x00, 0x00, 0x3f, + 0x2a, 0x00, 0x01, 0x3d, 0xff, 0xff, 0x01, 0x45, 0x00, 0x00, 0x01, 0x47, + 0x00, 0x00, 0x00, 0x1f, 0x2a, 0x00, 0x00, 0x1c, 0x2a, 0x00, 0x00, 0x1e, + 0x2a, 0x00, 0x00, 0x2e, 0xff, 0xff, 0x00, 0x32, 0xff, 0xff, 0x00, 0x36, + 0xff, 0xff, 0x00, 0x35, 0xff, 0xff, 0x00, 0x4f, 0xa5, 0x00, 0x00, 0x4b, + 0xa5, 0x00, 0x00, 0x31, 0xff, 0xff, 0x00, 0x28, 0xa5, 0x00, 0x00, 0x44, + 0xa5, 0x00, 0x00, 0x2f, 0xff, 0xff, 0x00, 0x2d, 0xff, 0xff, 0x00, 0xf7, + 0x29, 0x00, 0x00, 0x41, 0xa5, 0x00, 0x00, 0xfd, 0x29, 0x00, 0x00, 0x2b, + 0xff, 0xff, 0x00, 0x2a, 0xff, 0xff, 0x00, 0xe7, 0x29, 0x00, 0x00, 0x43, + 0xa5, 0x00, 0x00, 0x2a, 0xa5, 0x00, 0x00, 0xbb, 0xff, 0xff, 0x00, 0x27, + 0xff, 0xff, 0x00, 0xb9, 0xff, 0xff, 0x00, 0x25, 0xff, 0xff, 0x00, 0x15, + 0xa5, 0x00, 0x00, 0x12, 0xa5, 0x00, 0x02, 0x24, 0x4c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x01, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x54, 0x00, 0x00, 0x01, 0x74, + 0x00, 0x00, 0x01, 0x26, 0x00, 0x00, 0x01, 0x25, 0x00, 0x00, 0x01, 0x40, + 0x00, 0x00, 0x01, 0x3f, 0x00, 0x00, 0x00, 0xda, 0xff, 0xff, 0x00, 0xdb, + 0xff, 0xff, 0x00, 0xe1, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xc1, + 0xff, 0xff, 0x01, 0x08, 0x00, 0x00, 0x00, 0xc2, 0xff, 0xff, 0x00, 0xc7, + 0xff, 0xff, 0x00, 0xd1, 0xff, 0xff, 0x00, 0xca, 0xff, 0xff, 0x00, 0xf8, + 0xff, 0xff, 0x00, 0xaa, 0xff, 0xff, 0x00, 0xb0, 0xff, 0xff, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x8c, 0xff, 0xff, 0x01, 0xc4, 0xff, 0xff, 0x00, 0xa0, + 0xff, 0xff, 0x01, 0xf9, 0xff, 0xff, 0x02, 0x1a, 0x70, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, + 0xff, 0xff, 0x01, 0x50, 0x00, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x00, 0xf1, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x00, 0xd0, + 0xff, 0xff, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x0b, 0x00, 0x01, 0x60, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xd0, 0x97, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0xf8, + 0xff, 0xff, 0x02, 0x05, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, + 0xf4, 0xff, 0x00, 0x9e, 0xe7, 0xff, 0x00, 0xc2, 0x89, 0x00, 0x00, 0xdb, + 0xe7, 0xff, 0x00, 0x92, 0xe7, 0xff, 0x00, 0x93, 0xe7, 0xff, 0x00, 0x9c, + 0xe7, 0xff, 0x00, 0x9d, 0xe7, 0xff, 0x00, 0xa4, 0xe7, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x8a, 0x00, 0x00, 0x04, 0x8a, 0x00, 0x00, 0xe6, + 0x0e, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc5, 0xff, 0xff, 0x01, 0x41, 0xe2, 0xff, 0x02, 0x1d, + 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0xf8, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x01, 0xaa, 0xff, 0xff, 0x00, 0x4a, + 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x01, 0xb6, + 0xff, 0xff, 0x01, 0xf7, 0xff, 0xff, 0x00, 0xdb, 0xe3, 0xff, 0x01, 0x9c, + 0xff, 0xff, 0x01, 0x90, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff, 0x01, 0x82, + 0xff, 0xff, 0x02, 0x05, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, + 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x01, 0x1c, 0x00, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x01, 0xa3, 0xe2, 0xff, 0x01, 0x41, 0xdf, 0xff, 0x01, 0xba, + 0xdf, 0xff, 0x00, 0xe4, 0xff, 0xff, 0x02, 0x0b, 0xb1, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0x30, 0x00, 0x00, 0x00, 0xd0, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x09, 0xd6, 0xff, 0x01, 0x1a, + 0xf1, 0xff, 0x01, 0x19, 0xd6, 0xff, 0x00, 0xd5, 0xd5, 0xff, 0x00, 0xd8, + 0xd5, 0xff, 0x01, 0xe4, 0xd5, 0xff, 0x01, 0x03, 0xd6, 0xff, 0x01, 0xe1, + 0xd5, 0xff, 0x01, 0xe2, 0xd5, 0xff, 0x01, 0xc1, 0xd5, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa0, 0xe3, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x02, 0x0c, 0xbc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xbc, + 0x5a, 0xff, 0x01, 0xa0, 0x03, 0x00, 0x01, 0xfc, 0x75, 0xff, 0x01, 0xd8, + 0x5a, 0xff, 0x00, 0x30, 0x00, 0x00, 0x01, 0xb1, 0x5a, 0xff, 0x01, 0xb5, + 0x5a, 0xff, 0x01, 0xbf, 0x5a, 0xff, 0x01, 0xee, 0x5a, 0xff, 0x01, 0xd6, + 0x5a, 0xff, 0x01, 0xeb, 0x5a, 0xff, 0x01, 0xd0, 0xff, 0xff, 0x01, 0xbd, + 0x5a, 0xff, 0x01, 0xc8, 0x75, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x68, 0xff, 0x00, 0x60, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, + 0x00, 0x00, 0x00, 0xd8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, + 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x22, + 0x00, 0x00, 0x00, 0xde, 0xff, 0xff, 0x30, 0x0c, 0x31, 0x0d, 0x78, 0x0e, + 0x7f, 0x0f, 0x80, 0x10, 0x81, 0x11, 0x86, 0x12, 0x89, 0x13, 0x8a, 0x13, + 0x8e, 0x14, 0x8f, 0x15, 0x90, 0x16, 0x93, 0x13, 0x94, 0x17, 0x95, 0x18, + 0x96, 0x19, 0x97, 0x1a, 0x9a, 0x1b, 0x9c, 0x19, 0x9d, 0x1c, 0x9e, 0x1d, + 0x9f, 0x1e, 0xa6, 0x1f, 0xa9, 0x1f, 0xae, 0x1f, 0xb1, 0x20, 0xb2, 0x20, + 0xb7, 0x21, 0xbf, 0x22, 0xc5, 0x23, 0xc8, 0x23, 0xcb, 0x23, 0xdd, 0x24, + 0xf2, 0x23, 0xf6, 0x25, 0xf7, 0x26, 0x20, 0x2d, 0x3a, 0x2e, 0x3d, 0x2f, + 0x3e, 0x30, 0x3f, 0x31, 0x40, 0x31, 0x43, 0x32, 0x44, 0x33, 0x45, 0x34, + 0x50, 0x35, 0x51, 0x36, 0x52, 0x37, 0x53, 0x38, 0x54, 0x39, 0x59, 0x3a, + 0x5b, 0x3b, 0x5c, 0x3c, 0x61, 0x3d, 0x63, 0x3e, 0x65, 0x3f, 0x66, 0x40, + 0x68, 0x41, 0x69, 0x42, 0x6a, 0x40, 0x6b, 0x43, 0x6c, 0x44, 0x6f, 0x42, + 0x71, 0x45, 0x72, 0x46, 0x75, 0x47, 0x7d, 0x48, 0x82, 0x49, 0x87, 0x4a, + 0x89, 0x4b, 0x8a, 0x4c, 0x8b, 0x4c, 0x8c, 0x4d, 0x92, 0x4e, 0x9d, 0x4f, + 0x9e, 0x50, 0x45, 0x57, 0x7b, 0x1d, 0x7c, 0x1d, 0x7d, 0x1d, 0x7f, 0x58, + 0x86, 0x59, 0x88, 0x5a, 0x89, 0x5a, 0x8a, 0x5a, 0x8c, 0x5b, 0x8e, 0x5c, + 0x8f, 0x5c, 0xac, 0x5d, 0xad, 0x5e, 0xae, 0x5e, 0xaf, 0x5e, 0xc2, 0x5f, + 0xcc, 0x60, 0xcd, 0x61, 0xce, 0x61, 0xcf, 0x62, 0xd0, 0x63, 0xd1, 0x64, + 0xd5, 0x65, 0xd6, 0x66, 0xd7, 0x67, 0xf0, 0x68, 0xf1, 0x69, 0xf2, 0x6a, + 0xf3, 0x6b, 0xf4, 0x6c, 0xf5, 0x6d, 0xf9, 0x6e, 0xfd, 0x2d, 0xfe, 0x2d, + 0xff, 0x2d, 0x50, 0x69, 0x51, 0x69, 0x52, 0x69, 0x53, 0x69, 0x54, 0x69, + 0x55, 0x69, 0x56, 0x69, 0x57, 0x69, 0x58, 0x69, 0x59, 0x69, 0x5a, 0x69, + 0x5b, 0x69, 0x5c, 0x69, 0x5d, 0x69, 0x5e, 0x69, 0x5f, 0x69, 0x82, 0x00, + 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, + 0x89, 0x00, 0xc0, 0x75, 0xcf, 0x76, 0x80, 0x89, 0x81, 0x8a, 0x82, 0x8b, + 0x85, 0x8c, 0x86, 0x8d, 0x70, 0x9d, 0x71, 0x9d, 0x76, 0x9e, 0x77, 0x9e, + 0x78, 0x9f, 0x79, 0x9f, 0x7a, 0xa0, 0x7b, 0xa0, 0x7c, 0xa1, 0x7d, 0xa1, + 0xb3, 0xa2, 0xba, 0xa3, 0xbb, 0xa3, 0xbc, 0xa4, 0xbe, 0xa5, 0xc3, 0xa2, + 0xcc, 0xa4, 0xda, 0xa6, 0xdb, 0xa6, 0xe5, 0x6a, 0xea, 0xa7, 0xeb, 0xa7, + 0xec, 0x6e, 0xf3, 0xa2, 0xf8, 0xa8, 0xf9, 0xa8, 0xfa, 0xa9, 0xfb, 0xa9, + 0xfc, 0xa4, 0x26, 0xb0, 0x2a, 0xb1, 0x2b, 0xb2, 0x4e, 0xb3, 0x84, 0x08, + 0x62, 0xba, 0x63, 0xbb, 0x64, 0xbc, 0x65, 0xbd, 0x66, 0xbe, 0x6d, 0xbf, + 0x6e, 0xc0, 0x6f, 0xc1, 0x70, 0xc2, 0x7e, 0xc3, 0x7f, 0xc3, 0x7d, 0xcf, + 0x8d, 0xd0, 0x94, 0xd1, 0xab, 0xd2, 0xac, 0xd3, 0xad, 0xd4, 0xb0, 0xd5, + 0xb1, 0xd6, 0xb2, 0xd7, 0xc4, 0xd8, 0xc5, 0xd9, 0xc6, 0xda, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x0d, 0x06, 0x06, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x0f, 0x10, 0x11, 0x12, 0x06, 0x13, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x14, 0x15, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, @@ -972,24 +1003,24 @@ unsigned char STDLIB_WASM[] = { 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x16, 0x17, 0x06, 0x06, 0x06, - 0x18, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x16, 0x17, 0x06, 0x06, + 0x06, 0x18, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x19, 0x06, 0x06, 0x06, 0x06, 0x1a, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x1b, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x1c, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x19, 0x06, 0x06, 0x06, 0x06, 0x1a, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x1b, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x1c, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x1d, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x1d, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, @@ -999,9 +1030,9 @@ unsigned char STDLIB_WASM[] = { 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1e, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1010,182 +1041,182 @@ unsigned char STDLIB_WASM[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, - 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x2b, - 0x2b, 0x5b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x4a, 0x56, 0x56, - 0x05, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x24, 0x50, 0x79, 0x31, 0x50, 0x31, 0x50, - 0x31, 0x38, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x4e, 0x31, 0x02, 0x4e, 0x0d, 0x0d, 0x4e, - 0x03, 0x4e, 0x00, 0x24, 0x6e, 0x00, 0x4e, 0x31, 0x26, 0x6e, 0x51, 0x4e, - 0x24, 0x50, 0x4e, 0x39, 0x14, 0x81, 0x1b, 0x1d, 0x1d, 0x53, 0x31, 0x50, - 0x31, 0x50, 0x0d, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x1b, 0x53, 0x24, - 0x50, 0x31, 0x02, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, - 0x7b, 0x14, 0x79, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x2d, 0x2b, 0x49, 0x03, - 0x48, 0x03, 0x78, 0x5c, 0x7b, 0x14, 0x00, 0x96, 0x0a, 0x01, 0x2b, 0x28, - 0x06, 0x06, 0x00, 0x2a, 0x06, 0x2a, 0x2a, 0x2b, 0x07, 0xbb, 0xb5, 0x2b, - 0x1e, 0x00, 0x2b, 0x07, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0xcd, 0x46, 0xcd, 0x2b, 0x00, 0x25, - 0x2b, 0x07, 0x01, 0x06, 0x01, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x55, - 0x56, 0x56, 0x02, 0x24, 0x81, 0x81, 0x81, 0x81, 0x81, 0x15, 0x81, 0x81, - 0x81, 0x00, 0x00, 0x2b, 0x00, 0xb2, 0xd1, 0xb2, 0xd1, 0xb2, 0xd1, 0xb2, - 0xd1, 0x00, 0x00, 0xcd, 0xcc, 0x01, 0x00, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, - 0x83, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xac, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0x1c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x02, 0x00, 0x00, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x4e, - 0x31, 0x50, 0x31, 0x50, 0x4e, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x02, 0x87, 0xa6, 0x87, - 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, - 0xa6, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x00, 0x00, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x0c, 0x00, 0x0c, 0x2a, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x2a, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x6c, - 0x81, 0x15, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x6c, 0x03, - 0x41, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x2c, 0x56, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x6c, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x56, 0x7a, 0x9e, - 0x26, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x01, 0x2b, 0x2b, 0x4f, - 0x56, 0x56, 0x2c, 0x2b, 0x7f, 0x56, 0x56, 0x39, 0x2b, 0x2b, 0x55, 0x56, - 0x56, 0x2b, 0x2b, 0x4f, 0x56, 0x56, 0x2c, 0x2b, 0x7f, 0x56, 0x56, 0x81, - 0x37, 0x75, 0x5b, 0x7b, 0x5c, 0x2b, 0x2b, 0x4f, 0x56, 0x56, 0x02, 0xac, - 0x04, 0x00, 0x00, 0x39, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x2b, 0x2b, 0x4f, - 0x56, 0x56, 0x2c, 0x2b, 0x2b, 0x56, 0x56, 0x32, 0x13, 0x81, 0x57, 0x00, - 0x6f, 0x81, 0x7e, 0xc9, 0xd7, 0x7e, 0x2d, 0x81, 0x81, 0x0e, 0x7e, 0x39, - 0x7f, 0x6f, 0x57, 0x00, 0x81, 0x81, 0x7e, 0x15, 0x00, 0x7e, 0x03, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, - 0x2b, 0x24, 0x2b, 0x97, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x80, 0x81, 0x81, 0x81, 0x81, 0x39, 0xbb, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x01, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0xc9, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xd0, 0x0d, 0x00, 0x4e, - 0x31, 0x02, 0xb4, 0xc1, 0xc1, 0xd7, 0xd7, 0x24, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0xd7, 0xd7, 0x53, 0xc1, 0x47, 0xd4, 0xd7, - 0xd7, 0xd7, 0x05, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x07, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x4e, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x79, 0x5c, 0x7b, 0x5c, 0x7b, 0x4f, - 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, - 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x2d, 0x2b, 0x2b, 0x79, - 0x14, 0x5c, 0x7b, 0x5c, 0x2d, 0x79, 0x2a, 0x5c, 0x27, 0x5c, 0x7b, 0x5c, - 0x7b, 0x5c, 0x7b, 0xa4, 0x00, 0x0a, 0xb4, 0x5c, 0x7b, 0x5c, 0x7b, 0x4f, - 0x03, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x00, 0x48, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, - 0x00, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x54, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, + 0x2b, 0x2b, 0x5b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x4a, 0x56, + 0x56, 0x05, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, + 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x24, 0x50, 0x79, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x38, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, + 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x4e, 0x31, 0x02, 0x4e, 0x0d, 0x0d, + 0x4e, 0x03, 0x4e, 0x00, 0x24, 0x6e, 0x00, 0x4e, 0x31, 0x26, 0x6e, 0x51, + 0x4e, 0x24, 0x50, 0x4e, 0x39, 0x14, 0x81, 0x1b, 0x1d, 0x1d, 0x53, 0x31, + 0x50, 0x31, 0x50, 0x0d, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x1b, 0x53, + 0x24, 0x50, 0x31, 0x02, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, + 0x5c, 0x7b, 0x14, 0x79, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x2d, 0x2b, 0x49, + 0x03, 0x48, 0x03, 0x78, 0x5c, 0x7b, 0x14, 0x00, 0x96, 0x0a, 0x01, 0x2b, + 0x28, 0x06, 0x06, 0x00, 0x2a, 0x06, 0x2a, 0x2a, 0x2b, 0x07, 0xbb, 0xb5, + 0x2b, 0x1e, 0x00, 0x2b, 0x07, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x07, 0x00, 0x00, 0x00, 0x00, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0xcd, 0x46, 0xcd, 0x2b, 0x00, + 0x25, 0x2b, 0x07, 0x01, 0x06, 0x01, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x55, 0x56, 0x56, 0x02, 0x24, 0x81, 0x81, 0x81, 0x81, 0x81, 0x15, 0x81, + 0x81, 0x81, 0x00, 0x00, 0x2b, 0x00, 0xb2, 0xd1, 0xb2, 0xd1, 0xb2, 0xd1, + 0xb2, 0xd1, 0x00, 0x00, 0xcd, 0xcc, 0x01, 0x00, 0xd7, 0xd7, 0xd7, 0xd7, + 0xd7, 0x83, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, + 0x31, 0x50, 0x31, 0x02, 0x00, 0x00, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, + 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, + 0x4e, 0x31, 0x50, 0x31, 0x50, 0x4e, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, + 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x02, 0x87, 0xa6, + 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, + 0x87, 0xa6, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x00, 0x00, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0c, 0x00, 0x0c, 0x2a, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, + 0x2a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, + 0x6c, 0x81, 0x15, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x6c, + 0x03, 0x41, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x2c, 0x56, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x25, 0x06, 0x25, + 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, + 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, + 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, + 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x56, 0x7a, + 0x9e, 0x26, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, + 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, + 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x01, 0x2b, 0x2b, + 0x4f, 0x56, 0x56, 0x2c, 0x2b, 0x7f, 0x56, 0x56, 0x39, 0x2b, 0x2b, 0x55, + 0x56, 0x56, 0x2b, 0x2b, 0x4f, 0x56, 0x56, 0x2c, 0x2b, 0x7f, 0x56, 0x56, + 0x81, 0x37, 0x75, 0x5b, 0x7b, 0x5c, 0x2b, 0x2b, 0x4f, 0x56, 0x56, 0x02, + 0xac, 0x04, 0x00, 0x00, 0x39, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x2b, 0x2b, + 0x4f, 0x56, 0x56, 0x2c, 0x2b, 0x2b, 0x56, 0x56, 0x32, 0x13, 0x81, 0x57, + 0x00, 0x6f, 0x81, 0x7e, 0xc9, 0xd7, 0x7e, 0x2d, 0x81, 0x81, 0x0e, 0x7e, + 0x39, 0x7f, 0x6f, 0x57, 0x00, 0x81, 0x81, 0x7e, 0x15, 0x00, 0x7e, 0x03, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x07, 0x2b, 0x24, 0x2b, 0x97, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x80, 0x81, 0x81, 0x81, 0x81, 0x39, 0xbb, 0x2a, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x01, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0xc9, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xd0, 0x0d, 0x00, + 0x4e, 0x31, 0x02, 0xb4, 0xc1, 0xc1, 0xd7, 0xd7, 0x24, 0x50, 0x31, 0x50, + 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, + 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, + 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0xd7, 0xd7, 0x53, 0xc1, 0x47, 0xd4, + 0xd7, 0xd7, 0xd7, 0x05, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x4e, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, + 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x24, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x79, 0x5c, 0x7b, 0x5c, 0x7b, + 0x4f, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, + 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x2d, 0x2b, 0x2b, + 0x79, 0x14, 0x5c, 0x7b, 0x5c, 0x2d, 0x79, 0x2a, 0x5c, 0x27, 0x5c, 0x7b, + 0x5c, 0x7b, 0x5c, 0x7b, 0xa4, 0x00, 0x0a, 0xb4, 0x5c, 0x7b, 0x5c, 0x7b, + 0x4f, 0x03, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x00, 0x48, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x24, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x07, 0x00, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x07, 0x00, 0x00, 0x00, 0x00, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x55, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x27, 0x51, 0x6f, 0x77, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, - 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x8e, 0x92, - 0x97, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xb4, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x27, 0x51, 0x6f, 0x77, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, + 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x8e, + 0x92, 0x97, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xb4, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1195,23 +1226,24 @@ unsigned char STDLIB_WASM[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc6, 0xc9, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc9, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, - 0x00, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, + 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1221,94 +1253,82 @@ unsigned char STDLIB_WASM[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x20, 0x00, - 0x00, 0x02, 0x20, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x04, 0x20, 0x00, - 0x00, 0x05, 0x20, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, - 0x00, 0x09, 0x20, 0x00, 0x00, 0x0a, 0x20, 0x00, 0x00, 0x28, 0x20, 0x00, - 0x00, 0x29, 0x20, 0x00, 0x00, 0x5f, 0x20, 0x00, 0x00, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x05, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x00, 0x0c, 0x0b, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x2e, 0x77, - 0x61, 0x73, 0x6d, 0x01, 0xc9, 0x04, 0x2c, 0x00, 0x2a, 0x5f, 0x5f, 0x69, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, - 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, - 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, - 0x67, 0x65, 0x74, 0x01, 0x30, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, - 0x77, 0x31, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x73, 0x5f, 0x67, 0x65, 0x74, 0x02, 0x2b, 0x5f, 0x5f, 0x69, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x31, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, - 0x69, 0x74, 0x03, 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, - 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x04, 0x13, 0x75, - 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x77, 0x65, 0x61, - 0x6b, 0x3a, 0x6d, 0x61, 0x69, 0x6e, 0x05, 0x12, 0x5f, 0x5f, 0x77, 0x61, - 0x73, 0x6d, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x06, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x07, 0x0a, - 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x08, 0x06, - 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x09, 0x04, 0x66, 0x72, 0x65, 0x65, - 0x0a, 0x06, 0x63, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x0b, 0x07, 0x72, 0x65, - 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x0c, 0x05, 0x5f, 0x45, 0x78, 0x69, 0x74, - 0x0d, 0x0b, 0x5f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x76, 0x6f, 0x69, - 0x64, 0x0e, 0x0f, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x61, 0x72, - 0x67, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x0f, 0x15, 0x5f, 0x5f, 0x77, 0x61, - 0x73, 0x69, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x73, 0x5f, 0x67, 0x65, 0x74, 0x10, 0x10, 0x5f, 0x5f, 0x77, 0x61, 0x73, - 0x69, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x11, - 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x12, 0x11, 0x5f, 0x5f, 0x77, 0x61, - 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x74, 0x6f, 0x72, - 0x73, 0x13, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x70, 0x79, 0x14, 0x06, 0x6d, - 0x65, 0x6d, 0x73, 0x65, 0x74, 0x15, 0x06, 0x73, 0x74, 0x72, 0x6c, 0x65, - 0x6e, 0x16, 0x08, 0x69, 0x73, 0x77, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x17, - 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x6d, 0x70, 0x18, 0x06, 0x6d, 0x65, 0x6d, - 0x63, 0x68, 0x72, 0x19, 0x06, 0x73, 0x74, 0x72, 0x63, 0x6d, 0x70, 0x1a, - 0x08, 0x74, 0x6f, 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x1b, 0x07, 0x63, - 0x61, 0x73, 0x65, 0x6d, 0x61, 0x70, 0x1c, 0x08, 0x74, 0x6f, 0x77, 0x75, - 0x70, 0x70, 0x65, 0x72, 0x1d, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x6d, - 0x70, 0x1e, 0x08, 0x69, 0x73, 0x77, 0x75, 0x70, 0x70, 0x65, 0x72, 0x1f, - 0x07, 0x6d, 0x65, 0x6d, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x08, 0x69, 0x73, - 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x21, 0x07, 0x69, 0x73, 0x62, 0x6c, - 0x61, 0x6e, 0x6b, 0x22, 0x08, 0x69, 0x73, 0x77, 0x62, 0x6c, 0x61, 0x6e, - 0x6b, 0x23, 0x08, 0x69, 0x73, 0x77, 0x64, 0x69, 0x67, 0x69, 0x74, 0x24, - 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x61, 0x74, 0x25, 0x09, 0x5f, 0x5f, - 0x73, 0x74, 0x70, 0x6e, 0x63, 0x70, 0x79, 0x26, 0x07, 0x73, 0x74, 0x72, - 0x6e, 0x63, 0x70, 0x79, 0x27, 0x09, 0x69, 0x73, 0x77, 0x78, 0x64, 0x69, - 0x67, 0x69, 0x74, 0x28, 0x06, 0x77, 0x63, 0x73, 0x6c, 0x65, 0x6e, 0x29, - 0x06, 0x77, 0x63, 0x73, 0x63, 0x68, 0x72, 0x2a, 0x08, 0x69, 0x73, 0x77, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x2b, 0x08, 0x69, 0x73, 0x77, 0x61, 0x6c, - 0x6e, 0x75, 0x6d, 0x07, 0x33, 0x02, 0x00, 0x0f, 0x5f, 0x5f, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x01, - 0x1f, 0x47, 0x4f, 0x54, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x5f, 0x5f, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x09, 0x0a, 0x01, 0x00, - 0x07, 0x2e, 0x72, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x00, 0x8e, 0x01, 0x09, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x73, 0x02, 0x08, 0x6c, - 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x01, 0x03, 0x43, 0x31, 0x31, - 0x00, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x2d, - 0x62, 0x79, 0x01, 0x05, 0x63, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x31, 0x39, - 0x2e, 0x31, 0x2e, 0x35, 0x2d, 0x77, 0x61, 0x73, 0x69, 0x2d, 0x73, 0x64, - 0x6b, 0x20, 0x28, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x6c, - 0x76, 0x6d, 0x2f, 0x6c, 0x6c, 0x76, 0x6d, 0x2d, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x20, 0x61, 0x62, 0x34, 0x62, 0x35, 0x61, 0x32, 0x64, - 0x62, 0x35, 0x38, 0x32, 0x39, 0x35, 0x38, 0x61, 0x66, 0x31, 0x65, 0x65, - 0x33, 0x30, 0x38, 0x61, 0x37, 0x39, 0x30, 0x63, 0x66, 0x64, 0x62, 0x34, - 0x32, 0x62, 0x64, 0x32, 0x34, 0x37, 0x32, 0x30, 0x29, 0x00, 0x56, 0x0f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x05, 0x2b, 0x0b, 0x62, 0x75, 0x6c, 0x6b, 0x2d, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2b, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2b, 0x0f, 0x6d, 0x75, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2d, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x2b, 0x0f, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2d, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2b, 0x08, 0x73, 0x69, 0x67, 0x6e, 0x2d, 0x65, 0x78, - 0x74 + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x20, + 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x04, 0x20, + 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x08, 0x20, + 0x00, 0x00, 0x09, 0x20, 0x00, 0x00, 0x0a, 0x20, 0x00, 0x00, 0x28, 0x20, + 0x00, 0x00, 0x29, 0x20, 0x00, 0x00, 0x5f, 0x20, 0x00, 0x00, 0x00, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x05, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x00, 0x0c, 0x0b, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x2e, + 0x77, 0x61, 0x73, 0x6d, 0x01, 0xc9, 0x04, 0x2c, 0x00, 0x2a, 0x5f, 0x5f, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x61, 0x72, 0x67, 0x73, + 0x5f, 0x67, 0x65, 0x74, 0x01, 0x30, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x31, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x02, 0x2b, 0x5f, 0x5f, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, + 0x78, 0x69, 0x74, 0x03, 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, + 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x04, 0x13, + 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x77, 0x65, + 0x61, 0x6b, 0x3a, 0x6d, 0x61, 0x69, 0x6e, 0x05, 0x12, 0x5f, 0x5f, 0x77, + 0x61, 0x73, 0x6d, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x5f, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x06, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x07, + 0x0a, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x08, + 0x06, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x09, 0x04, 0x66, 0x72, 0x65, + 0x65, 0x0a, 0x06, 0x63, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x0b, 0x07, 0x72, + 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x0c, 0x05, 0x5f, 0x45, 0x78, 0x69, + 0x74, 0x0d, 0x0b, 0x5f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x76, 0x6f, + 0x69, 0x64, 0x0e, 0x0f, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x61, + 0x72, 0x67, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x0f, 0x15, 0x5f, 0x5f, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x10, 0x10, 0x5f, 0x5f, 0x77, 0x61, + 0x73, 0x69, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, 0x74, + 0x11, 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x12, 0x11, 0x5f, 0x5f, 0x77, + 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x74, 0x6f, + 0x72, 0x73, 0x13, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x70, 0x79, 0x14, 0x06, + 0x6d, 0x65, 0x6d, 0x73, 0x65, 0x74, 0x15, 0x06, 0x73, 0x74, 0x72, 0x6c, + 0x65, 0x6e, 0x16, 0x08, 0x69, 0x73, 0x77, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x17, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x6d, 0x70, 0x18, 0x06, 0x6d, 0x65, + 0x6d, 0x63, 0x68, 0x72, 0x19, 0x06, 0x73, 0x74, 0x72, 0x63, 0x6d, 0x70, + 0x1a, 0x08, 0x74, 0x6f, 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x1b, 0x07, + 0x63, 0x61, 0x73, 0x65, 0x6d, 0x61, 0x70, 0x1c, 0x08, 0x74, 0x6f, 0x77, + 0x75, 0x70, 0x70, 0x65, 0x72, 0x1d, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, + 0x6d, 0x70, 0x1e, 0x08, 0x69, 0x73, 0x77, 0x75, 0x70, 0x70, 0x65, 0x72, + 0x1f, 0x07, 0x6d, 0x65, 0x6d, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x08, 0x69, + 0x73, 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x21, 0x07, 0x69, 0x73, 0x62, + 0x6c, 0x61, 0x6e, 0x6b, 0x22, 0x08, 0x69, 0x73, 0x77, 0x62, 0x6c, 0x61, + 0x6e, 0x6b, 0x23, 0x08, 0x69, 0x73, 0x77, 0x64, 0x69, 0x67, 0x69, 0x74, + 0x24, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x61, 0x74, 0x25, 0x09, 0x5f, + 0x5f, 0x73, 0x74, 0x70, 0x6e, 0x63, 0x70, 0x79, 0x26, 0x07, 0x73, 0x74, + 0x72, 0x6e, 0x63, 0x70, 0x79, 0x27, 0x09, 0x69, 0x73, 0x77, 0x78, 0x64, + 0x69, 0x67, 0x69, 0x74, 0x28, 0x06, 0x77, 0x63, 0x73, 0x6c, 0x65, 0x6e, + 0x29, 0x06, 0x77, 0x63, 0x73, 0x63, 0x68, 0x72, 0x2a, 0x08, 0x69, 0x73, + 0x77, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2b, 0x08, 0x69, 0x73, 0x77, 0x61, + 0x6c, 0x6e, 0x75, 0x6d, 0x07, 0x33, 0x02, 0x00, 0x0f, 0x5f, 0x5f, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x01, 0x1f, 0x47, 0x4f, 0x54, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x5f, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x09, 0x0a, 0x01, + 0x00, 0x07, 0x2e, 0x72, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x00, 0x26, 0x09, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x73, 0x01, 0x0c, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x2d, 0x62, 0x79, 0x01, + 0x05, 0x63, 0x6c, 0x61, 0x6e, 0x67, 0x06, 0x31, 0x39, 0x2e, 0x31, 0x2e, + 0x37, 0x00, 0x56, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x05, 0x2b, 0x0b, 0x62, 0x75, + 0x6c, 0x6b, 0x2d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2b, 0x0a, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2b, 0x0f, 0x6d, + 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x73, 0x2b, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2b, 0x08, 0x73, 0x69, 0x67, + 0x6e, 0x2d, 0x65, 0x78, 0x74 }; -unsigned int STDLIB_WASM_LEN = 15673; - -#endif +unsigned int STDLIB_WASM_LEN = 15965; From ac39aed7c5767992dd487f7ec041c430eebde2d0 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Sat, 13 Sep 2025 20:16:29 -0400 Subject: [PATCH 443/663] fix(lib/wasm): return NULL for 0-sized allocations Co-authored-by: Amaan Qureshi --- lib/src/wasm/stdlib.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/src/wasm/stdlib.c b/lib/src/wasm/stdlib.c index 1e6cf4a0..65f87e90 100644 --- a/lib/src/wasm/stdlib.c +++ b/lib/src/wasm/stdlib.c @@ -60,6 +60,8 @@ void reset_heap(void *new_heap_start) { } void *malloc(size_t size) { + if (size == 0) return NULL; + Region *prev = NULL; Region *curr = free_list; while (curr != NULL) { From 63f48afaeb229e5110a33b4352c386f651f67d83 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sun, 14 Sep 2025 05:32:26 -0400 Subject: [PATCH 444/663] docs: explain extras in a bit more detail --- .../src/creating-parsers/2-the-grammar-dsl.md | 3 +- .../creating-parsers/3-writing-the-grammar.md | 81 +++++++++++++++++++ 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/docs/src/creating-parsers/2-the-grammar-dsl.md b/docs/src/creating-parsers/2-the-grammar-dsl.md index 55c59f68..24495b15 100644 --- a/docs/src/creating-parsers/2-the-grammar-dsl.md +++ b/docs/src/creating-parsers/2-the-grammar-dsl.md @@ -107,7 +107,7 @@ grammar rules themselves. These fields are: - **`extras`** — an array of tokens that may appear *anywhere* in the language. This is often used for whitespace and comments. The default value of `extras` is to accept whitespace. To control whitespace explicitly, specify -`extras: $ => []` in your grammar. +`extras: $ => []` in your grammar. See the section on [using extras][extras] for more details. - **`inline`** — an array of rule names that should be automatically *removed* from the grammar by replacing all of their usages with a copy of their definition. This is useful for rules that are used in multiple places but for which you *don't* @@ -144,6 +144,7 @@ empty array, signifying *no* keywords are reserved. [bison-dprec]: https://www.gnu.org/software/bison/manual/html_node/Generalized-LR-Parsing.html [ebnf]: https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form [external-scanners]: ./4-external-scanners.md +[extras]: ./3-writing-the-grammar.html#using-extras [keyword-extraction]: ./3-writing-the-grammar.md#keyword-extraction [lexical vs parse]: ./3-writing-the-grammar.md#lexical-precedence-vs-parse-precedence [lr-conflict]: https://en.wikipedia.org/wiki/LR_parser#Conflicts_in_the_constructed_tables diff --git a/docs/src/creating-parsers/3-writing-the-grammar.md b/docs/src/creating-parsers/3-writing-the-grammar.md index 047e6e92..3c7c40c5 100644 --- a/docs/src/creating-parsers/3-writing-the-grammar.md +++ b/docs/src/creating-parsers/3-writing-the-grammar.md @@ -395,6 +395,87 @@ function_definition: $ => Adding fields like this allows you to retrieve nodes using the [field APIs][field-names-section]. +## Using Extras + +Extras are tokens that can appear anywhere in the grammar, without being explicitly mentioned in a rule. This is useful +for things like whitespace and comments, which can appear between any two tokens in most programming languages. To define +an extra, you can use the `extras` function: + +```js +module.exports = grammar({ + name: "my_language", + + extras: ($) => [ + /\s/, // whitespace + $.comment, + ], + + rules: { + comment: ($) => + token( + choice(seq("//", /.*/), seq("/*", /[^*]*\*+([^/*][^*]*\*+)*/, "/")), + ), + }, +}); +``` + +```admonish warning +When adding more complicated tokens to `extras`, it's preferable to associate the pattern +with a rule. This way, you avoid the lexer inlining this pattern in a bunch of spots, +which can dramatically reduce the parser size. +``` + +For example, instead of defining the `comment` token inline in `extras`: + +```js +// ❌ Less preferable + +const comment = token( + choice(seq("//", /.*/), seq("/*", /[^*]*\*+([^/*][^*]*\*+)*/, "/")), +); + +module.exports = grammar({ + name: "my_language", + extras: ($) => [ + /\s/, // whitespace + comment, + ], + rules: { + // ... + }, +}); +``` + +We can define it as a rule and then reference it in `extras`: + +```js +// ✅ More preferable + +module.exports = grammar({ + name: "my_language", + + extras: ($) => [ + /\s/, // whitespace + $.comment, + ], + + rules: { + // ... + + comment: ($) => + token( + choice(seq("//", /.*/), seq("/*", /[^*]*\*+([^/*][^*]*\*+)*/, "/")), + ), + }, +}); +``` + +```admonish note +Tree-sitter intentionally simplifies some common regex patterns, both as a performance optimization and for simplicity, +typically in ways that don't affect the meaning of the pattern. For example, `\w` is simplified to `[a-zA-Z0-9_]`, `\s` +to `[ \t\n\r]`, and `\d` to `[0-9]`. If you need more complex behavior, you can always use a more explicit regex. +``` + # Lexical Analysis Tree-sitter's parsing process is divided into two phases: parsing (which is described above) and [lexing][lexing] — the From 3a911d578c91edbd78edbcadd689a9ddde871b91 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sun, 14 Sep 2025 05:40:19 -0400 Subject: [PATCH 445/663] docs: add more information on supertype nodes for grammars and queries --- .../src/creating-parsers/2-the-grammar-dsl.md | 11 ++- .../creating-parsers/3-writing-the-grammar.md | 76 +++++++++++++++---- docs/src/using-parsers/queries/1-syntax.md | 20 +++++ 3 files changed, 89 insertions(+), 18 deletions(-) diff --git a/docs/src/creating-parsers/2-the-grammar-dsl.md b/docs/src/creating-parsers/2-the-grammar-dsl.md index 24495b15..d210619b 100644 --- a/docs/src/creating-parsers/2-the-grammar-dsl.md +++ b/docs/src/creating-parsers/2-the-grammar-dsl.md @@ -129,8 +129,11 @@ than globally. Can only be used with parse precedence, not lexical precedence. - **`word`** — the name of a token that will match keywords to the [keyword extraction][keyword-extraction] optimization. -- **`supertypes`** — an array of hidden rule names which should be considered to be 'supertypes' in the generated -[*node types* file][static-node-types]. +- **`supertypes`** — an array of rule names which should be considered to be 'supertypes' in the generated +[*node types* file][static-node-types-supertypes]. Supertype rules are automatically hidden from the parse tree, regardless +of whether their names start with an underscore. The main use case for supertypes is to group together multiple different +kinds of nodes under a single abstract category, such as "expression" or "declaration". See the section on [`using supertypes`][supertypes] +for more details. - **`reserved`** — similar in structure to the main `rules` property, an object of reserved word sets associated with an array of reserved rules. The reserved rule in the array must be a terminal token meaning it must be a string, regex, token, @@ -144,11 +147,13 @@ empty array, signifying *no* keywords are reserved. [bison-dprec]: https://www.gnu.org/software/bison/manual/html_node/Generalized-LR-Parsing.html [ebnf]: https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form [external-scanners]: ./4-external-scanners.md -[extras]: ./3-writing-the-grammar.html#using-extras +[extras]: ./3-writing-the-grammar.md#using-extras [keyword-extraction]: ./3-writing-the-grammar.md#keyword-extraction [lexical vs parse]: ./3-writing-the-grammar.md#lexical-precedence-vs-parse-precedence [lr-conflict]: https://en.wikipedia.org/wiki/LR_parser#Conflicts_in_the_constructed_tables [named-vs-anonymous-nodes]: ../using-parsers/2-basic-parsing.md#named-vs-anonymous-nodes [rust regex]: https://docs.rs/regex/1.1.8/regex/#grouping-and-flags [static-node-types]: ../using-parsers/6-static-node-types.md +[static-node-types-supertypes]: ../using-parsers/6-static-node-types.md#supertype-nodes +[supertypes]: ./3-writing-the-grammar.md#using-supertypes [yacc-prec]: https://docs.oracle.com/cd/E19504-01/802-5880/6i9k05dh3/index.html diff --git a/docs/src/creating-parsers/3-writing-the-grammar.md b/docs/src/creating-parsers/3-writing-the-grammar.md index 3c7c40c5..0052198b 100644 --- a/docs/src/creating-parsers/3-writing-the-grammar.md +++ b/docs/src/creating-parsers/3-writing-the-grammar.md @@ -74,11 +74,11 @@ you might start with something like this: return_statement: $ => seq( 'return', - $._expression, + $.expression, ';' ), - _expression: $ => choice( + expression: $ => choice( $.identifier, $.number // TODO: other kinds of expressions @@ -202,7 +202,7 @@ To produce a readable syntax tree, we'd like to model JavaScript expressions usi { // ... - _expression: $ => choice( + expression: $ => choice( $.identifier, $.unary_expression, $.binary_expression, @@ -210,14 +210,14 @@ To produce a readable syntax tree, we'd like to model JavaScript expressions usi ), unary_expression: $ => choice( - seq('-', $._expression), - seq('!', $._expression), + seq('-', $.expression), + seq('!', $.expression), // ... ), binary_expression: $ => choice( - seq($._expression, '*', $._expression), - seq($._expression, '+', $._expression), + seq($.expression, '*', $.expression), + seq($.expression, '+', $.expression), // ... ), } @@ -252,7 +252,7 @@ ambiguity. For an expression like `-a * b`, it's not clear whether the `-` operator applies to the `a * b` or just to the `a`. This is where the `prec` function [described in the previous page][grammar dsl] comes into play. By wrapping a rule with `prec`, we can indicate that certain sequence of symbols should _bind to each other more tightly_ than others. For example, the -`'-', $._expression` sequence in `unary_expression` should bind more tightly than the `$._expression, '+', $._expression` +`'-', $.expression` sequence in `unary_expression` should bind more tightly than the `$.expression, '+', $.expression` sequence in `binary_expression`: ```js @@ -263,8 +263,8 @@ sequence in `binary_expression`: prec( 2, choice( - seq("-", $._expression), - seq("!", $._expression), + seq("-", $.expression), + seq("!", $.expression), // ... ), ); @@ -299,8 +299,8 @@ This is where `prec.left` and `prec.right` come into use. We want to select the // ... binary_expression: $ => choice( - prec.left(2, seq($._expression, '*', $._expression)), - prec.left(1, seq($._expression, '+', $._expression)), + prec.left(2, seq($.expression, '*', $.expression)), + prec.left(1, seq($.expression, '+', $.expression)), // ... ), } @@ -476,6 +476,51 @@ typically in ways that don't affect the meaning of the pattern. For example, `\w to `[ \t\n\r]`, and `\d` to `[0-9]`. If you need more complex behavior, you can always use a more explicit regex. ``` +## Using Supertypes + +Some rules in your grammar will represent abstract categories of syntax nodes, such as "expression", "type", or "declaration". +These rules are often defined as simple choices between several other rules. For example, in the JavaScript grammar, the +`_expression` rule is defined as a choice between many different kinds of expressions: + +```js +expression: $ => choice( + $.identifier, + $.unary_expression, + $.binary_expression, + $.call_expression, + $.member_expression, + // ... +), +``` + +By default, Tree-sitter will generate a visible node type for each of these abstract category rules, which can lead to +unnecessarily deep and complex syntax trees. To avoid this, you can add these abstract category rules to the grammar's `supertypes` +definition. Tree-sitter will then treat these rules as _supertypes_, and will not generate visible node types for them in +the syntax tree. + +```js +module.exports = grammar({ + name: "javascript", + + supertypes: $ => [ + $.expression, + ], + + rules: { + expression: $ => choice( + $.identifier, + // ... + ), + + // ... + }, +}); +_ +``` + +Although supertype rules are hidden from the syntax tree, they can still be used in queries. See the chapter on +[Query Syntax][query syntax] for more information. + # Lexical Analysis Tree-sitter's parsing process is divided into two phases: parsing (which is described above) and [lexing][lexing] — the @@ -554,7 +599,7 @@ grammar({ word: $ => $.identifier, rules: { - _expression: $ => + expression: $ => choice( $.identifier, $.unary_expression, @@ -564,13 +609,13 @@ grammar({ binary_expression: $ => choice( - prec.left(1, seq($._expression, "instanceof", $._expression)), + prec.left(1, seq($.expression, "instanceof", $.expression)), // ... ), unary_expression: $ => choice( - prec.left(2, seq("typeof", $._expression)), + prec.left(2, seq("typeof", $.expression)), // ... ), @@ -607,5 +652,6 @@ rule that's called something else, you should just alias the word token instead, [field-names-section]: ../using-parsers/2-basic-parsing.md#node-field-names [non-terminal]: https://en.wikipedia.org/wiki/Terminal_and_nonterminal_symbols [peg]: https://en.wikipedia.org/wiki/Parsing_expression_grammar +[query syntax]: ../using-parsers/queries/1-syntax.md#supertype-nodes [tree-sitter-javascript]: https://github.com/tree-sitter/tree-sitter-javascript [yacc]: https://en.wikipedia.org/wiki/Yacc diff --git a/docs/src/using-parsers/queries/1-syntax.md b/docs/src/using-parsers/queries/1-syntax.md index 5edd0047..a12cec70 100644 --- a/docs/src/using-parsers/queries/1-syntax.md +++ b/docs/src/using-parsers/queries/1-syntax.md @@ -96,6 +96,26 @@ by `(ERROR)` queries. Specific missing node types can also be queried: (MISSING ";") @missing-semicolon ``` +### Supertype Nodes + +Some node types are marked as _supertypes_ in a grammar. A supertype is a node type that contains multiple +subtypes. For example, in the [JavaScript grammar example][grammar], `expression` is a supertype that can represent any kind +of expression, such as a `binary_expression`, `call_expression`, or `identifier`. You can use supertypes in queries to match +any of their subtypes, rather than having to list out each subtype individually. For example, this pattern would match any +kind of expression, even though it's not a visible node in the syntax tree: + +```query +(expression) @any-expression +``` + +To query specific subtypes of a supertype, you can use the syntax `supertype/subtype`. For example, this pattern would +match a `binary_expression` only if it is a child of `expression`: + +```query +(expression/binary_expression) @binary-expression +``` + +[grammar]: ../../creating-parsers/3-writing-the-grammar.md#structuring-rules-well [node-field-names]: ../2-basic-parsing.md#node-field-names [named-vs-anonymous-nodes]: ../2-basic-parsing.md#named-vs-anonymous-nodes [s-exp]: https://en.wikipedia.org/wiki/S-expression From 4dbfb5b49a1af028e587f3419a5c0ae241d594c8 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sun, 14 Sep 2025 06:25:03 -0400 Subject: [PATCH 446/663] docs: document the `@ignore` capture in tags --- docs/src/3-syntax-highlighting.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/src/3-syntax-highlighting.md b/docs/src/3-syntax-highlighting.md index b11a2e86..a74836ab 100644 --- a/docs/src/3-syntax-highlighting.md +++ b/docs/src/3-syntax-highlighting.md @@ -180,6 +180,9 @@ The capture names are as follows: - `@local.reference` — indicates that a syntax node contains the *name*, which *may* refer to an earlier definition within some enclosing scope. +Additionally, to ignore certain nodes from being tagged, you can use the `@ignore` capture. This is useful if you want +to run a predicate or directive on a node, but don't want it to be tagged. + When highlighting a file, Tree-sitter will keep track of the set of scopes that contains any given position, and the set of definitions within each scope. When processing a syntax node that is captured as a `local.reference`, Tree-sitter will try to find a definition for a name that matches the node's text. If it finds a match, Tree-sitter will ensure that the From 2ae677162fb06d50f396144139cc5ec98f034417 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sun, 14 Sep 2025 15:47:23 -0400 Subject: [PATCH 447/663] docs: clarify that only the whitespace character class is simplfied --- docs/src/creating-parsers/3-writing-the-grammar.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/src/creating-parsers/3-writing-the-grammar.md b/docs/src/creating-parsers/3-writing-the-grammar.md index 0052198b..cb6ec3d4 100644 --- a/docs/src/creating-parsers/3-writing-the-grammar.md +++ b/docs/src/creating-parsers/3-writing-the-grammar.md @@ -471,9 +471,8 @@ module.exports = grammar({ ``` ```admonish note -Tree-sitter intentionally simplifies some common regex patterns, both as a performance optimization and for simplicity, -typically in ways that don't affect the meaning of the pattern. For example, `\w` is simplified to `[a-zA-Z0-9_]`, `\s` -to `[ \t\n\r]`, and `\d` to `[0-9]`. If you need more complex behavior, you can always use a more explicit regex. +Tree-sitter intentionally simplifies the whitespace character class, `\s`, to `[ \t\n\r]` as a performance +optimization. This is because typically users do not require the full Unicode definition of whitespace. ``` ## Using Supertypes From 46f7f860e60897011ce20119e4f33de28b51a881 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sun, 14 Sep 2025 15:53:31 -0400 Subject: [PATCH 448/663] docs: correct explanation about `@ignore` capture --- docs/src/3-syntax-highlighting.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/src/3-syntax-highlighting.md b/docs/src/3-syntax-highlighting.md index a74836ab..ca42c047 100644 --- a/docs/src/3-syntax-highlighting.md +++ b/docs/src/3-syntax-highlighting.md @@ -180,8 +180,15 @@ The capture names are as follows: - `@local.reference` — indicates that a syntax node contains the *name*, which *may* refer to an earlier definition within some enclosing scope. -Additionally, to ignore certain nodes from being tagged, you can use the `@ignore` capture. This is useful if you want -to run a predicate or directive on a node, but don't want it to be tagged. +Additionally, to ignore certain nodes from being tagged, you can use the `@ignore` capture. This is useful if you want to +exclude a subset of nodes from being tagged. When writing a query leveraging this, you should ensure this pattern comes +before any other patterns that would be used for tagging, for example: + +```scheme +(expression (identifier) @ignore) + +(identifier) @local.reference +``` When highlighting a file, Tree-sitter will keep track of the set of scopes that contains any given position, and the set of definitions within each scope. When processing a syntax node that is captured as a `local.reference`, Tree-sitter will From 3d26b8e50027198158c66755b646e2dd15d3860e Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Sun, 14 Sep 2025 23:18:33 +0300 Subject: [PATCH 449/663] feat(bindings): use CapsuleType in Python stub --- crates/cli/src/init.rs | 21 ++++++++++++++++++--- crates/cli/src/templates/__init__.pyi | 3 ++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index 2f3792a6..8e9cad06 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -646,9 +646,24 @@ pub fn generate_grammar_files( generate_file(path, INIT_PY_TEMPLATE, language_name, &generate_opts) })?; - missing_path(lang_path.join("__init__.pyi"), |path| { - generate_file(path, INIT_PYI_TEMPLATE, language_name, &generate_opts) - })?; + missing_path_else( + lang_path.join("__init__.pyi"), + allow_update, + |path| generate_file(path, INIT_PYI_TEMPLATE, language_name, &generate_opts), + |path| { + let mut contents = fs::read_to_string(path)?; + if !contents.contains("CapsuleType") { + contents = contents + .replace( + "from typing import Final", + "from typing import Final\nfrom typing_extensions import CapsuleType" + ) + .replace("-> object:", "-> CapsuleType:"); + write_file(path, contents)?; + } + Ok(()) + }, + )?; missing_path(lang_path.join("py.typed"), |path| { generate_file(path, "", language_name, &generate_opts) // py.typed is empty diff --git a/crates/cli/src/templates/__init__.pyi b/crates/cli/src/templates/__init__.pyi index abf6633f..5c63215d 100644 --- a/crates/cli/src/templates/__init__.pyi +++ b/crates/cli/src/templates/__init__.pyi @@ -1,4 +1,5 @@ from typing import Final +from typing_extensions import CapsuleType # NOTE: uncomment these to include any queries that this grammar contains: @@ -7,4 +8,4 @@ from typing import Final # LOCALS_QUERY: Final[str] # TAGS_QUERY: Final[str] -def language() -> object: ... +def language() -> CapsuleType: ... From b6f45b0a2ece4285c956837c51e3486c0574600a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 21:15:31 +0000 Subject: [PATCH 450/663] build(deps): bump the npm group across 1 directory with 4 updates Bumps the npm group with 4 updates in the /lib/binding_web directory: [@types/emscripten](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/emscripten), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [typescript](https://github.com/microsoft/TypeScript) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint). Updates `@types/emscripten` from 1.41.1 to 1.41.2 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/emscripten) Updates `@types/node` from 24.3.1 to 24.5.0 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `typescript` from 5.8.3 to 5.9.2 - [Release notes](https://github.com/microsoft/TypeScript/releases) - [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release-publish.yml) - [Commits](https://github.com/microsoft/TypeScript/compare/v5.8.3...v5.9.2) Updates `typescript-eslint` from 8.43.0 to 8.44.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.0/packages/typescript-eslint) --- updated-dependencies: - dependency-name: "@types/emscripten" dependency-version: 1.41.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm - dependency-name: "@types/node" dependency-version: 24.5.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: typescript dependency-version: 5.9.2 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: typescript-eslint dependency-version: 8.44.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm ... Signed-off-by: dependabot[bot] --- lib/binding_web/package-lock.json | 142 +++++++++++++++--------------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json index 17d24cb5..49d63180 100644 --- a/lib/binding_web/package-lock.json +++ b/lib/binding_web/package-lock.json @@ -1185,9 +1185,9 @@ "license": "MIT" }, "node_modules/@types/emscripten": { - "version": "1.41.1", - "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.41.1.tgz", - "integrity": "sha512-vW2aEgBUU1c2CB+qVMislA98amRVPszdALjqNCuUIJaEFZsNaFaM4g5IMXIs+6oHbmmb7q6zeXYubhtObJ9ZLg==", + "version": "1.41.2", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.41.2.tgz", + "integrity": "sha512-0EVXosRnffZuF+rsMM1ZVbfpwpvL2/hWycYQ/0GaH/VaoSJvcSmMl6fiPel9TZXHL3EhANxzqKOVFC6NFXyn8A==", "dev": true, "license": "MIT" }, @@ -1206,27 +1206,27 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.1.tgz", - "integrity": "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.0.tgz", + "integrity": "sha512-y1dMvuvJspJiPSDZUQ+WMBvF7dpnEqN4x9DDC9ie5Fs/HUZJA3wFp7EhHoVaKX/iI0cRoECV8X2jL8zi0xrHCg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.10.0" + "undici-types": "~7.12.0" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.43.0.tgz", - "integrity": "sha512-8tg+gt7ENL7KewsKMKDHXR1vm8tt9eMxjJBYINf6swonlWgkYn5NwyIgXpbbDxTNU5DgpDFfj95prcTq2clIQQ==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.0.tgz", + "integrity": "sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.43.0", - "@typescript-eslint/type-utils": "8.43.0", - "@typescript-eslint/utils": "8.43.0", - "@typescript-eslint/visitor-keys": "8.43.0", + "@typescript-eslint/scope-manager": "8.44.0", + "@typescript-eslint/type-utils": "8.44.0", + "@typescript-eslint/utils": "8.44.0", + "@typescript-eslint/visitor-keys": "8.44.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -1240,7 +1240,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.43.0", + "@typescript-eslint/parser": "^8.44.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -1256,16 +1256,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.43.0.tgz", - "integrity": "sha512-B7RIQiTsCBBmY+yW4+ILd6mF5h1FUwJsVvpqkrgpszYifetQ2Ke+Z4u6aZh0CblkUGIdR59iYVyXqqZGkZ3aBw==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.0.tgz", + "integrity": "sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.43.0", - "@typescript-eslint/types": "8.43.0", - "@typescript-eslint/typescript-estree": "8.43.0", - "@typescript-eslint/visitor-keys": "8.43.0", + "@typescript-eslint/scope-manager": "8.44.0", + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/typescript-estree": "8.44.0", + "@typescript-eslint/visitor-keys": "8.44.0", "debug": "^4.3.4" }, "engines": { @@ -1281,14 +1281,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.43.0.tgz", - "integrity": "sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.0.tgz", + "integrity": "sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.43.0", - "@typescript-eslint/types": "^8.43.0", + "@typescript-eslint/tsconfig-utils": "^8.44.0", + "@typescript-eslint/types": "^8.44.0", "debug": "^4.3.4" }, "engines": { @@ -1303,14 +1303,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.43.0.tgz", - "integrity": "sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.0.tgz", + "integrity": "sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.43.0", - "@typescript-eslint/visitor-keys": "8.43.0" + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/visitor-keys": "8.44.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1321,9 +1321,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.43.0.tgz", - "integrity": "sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.0.tgz", + "integrity": "sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==", "dev": true, "license": "MIT", "engines": { @@ -1338,15 +1338,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.43.0.tgz", - "integrity": "sha512-qaH1uLBpBuBBuRf8c1mLJ6swOfzCXryhKND04Igr4pckzSEW9JX5Aw9AgW00kwfjWJF0kk0ps9ExKTfvXfw4Qg==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.0.tgz", + "integrity": "sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.43.0", - "@typescript-eslint/typescript-estree": "8.43.0", - "@typescript-eslint/utils": "8.43.0", + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/typescript-estree": "8.44.0", + "@typescript-eslint/utils": "8.44.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -1363,9 +1363,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.43.0.tgz", - "integrity": "sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.0.tgz", + "integrity": "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==", "dev": true, "license": "MIT", "engines": { @@ -1377,16 +1377,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.43.0.tgz", - "integrity": "sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.0.tgz", + "integrity": "sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.43.0", - "@typescript-eslint/tsconfig-utils": "8.43.0", - "@typescript-eslint/types": "8.43.0", - "@typescript-eslint/visitor-keys": "8.43.0", + "@typescript-eslint/project-service": "8.44.0", + "@typescript-eslint/tsconfig-utils": "8.44.0", + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/visitor-keys": "8.44.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -1432,16 +1432,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.43.0.tgz", - "integrity": "sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.0.tgz", + "integrity": "sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.43.0", - "@typescript-eslint/types": "8.43.0", - "@typescript-eslint/typescript-estree": "8.43.0" + "@typescript-eslint/scope-manager": "8.44.0", + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/typescript-estree": "8.44.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1456,13 +1456,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.43.0.tgz", - "integrity": "sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.0.tgz", + "integrity": "sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.43.0", + "@typescript-eslint/types": "8.44.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -3612,16 +3612,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.43.0.tgz", - "integrity": "sha512-FyRGJKUGvcFekRRcBKFBlAhnp4Ng8rhe8tuvvkR9OiU0gfd4vyvTRQHEckO6VDlH57jbeUQem2IpqPq9kLJH+w==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.44.0.tgz", + "integrity": "sha512-ib7mCkYuIzYonCq9XWF5XNw+fkj2zg629PSa9KNIQ47RXFF763S5BIX4wqz1+FLPogTZoiw8KmCiRPRa8bL3qw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.43.0", - "@typescript-eslint/parser": "8.43.0", - "@typescript-eslint/typescript-estree": "8.43.0", - "@typescript-eslint/utils": "8.43.0" + "@typescript-eslint/eslint-plugin": "8.44.0", + "@typescript-eslint/parser": "8.44.0", + "@typescript-eslint/typescript-estree": "8.44.0", + "@typescript-eslint/utils": "8.44.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3636,9 +3636,9 @@ } }, "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", + "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==", "dev": true, "license": "MIT" }, From 7ba7c4a8ce4ea58a8166aba251bacc04c380d0e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 21:08:42 +0000 Subject: [PATCH 451/663] build(deps): bump the cargo group with 7 updates Bumps the cargo group with 7 updates: | Package | From | To | | --- | --- | --- | | [cc](https://github.com/rust-lang/cc-rs) | `1.2.36` | `1.2.37` | | [indexmap](https://github.com/indexmap-rs/indexmap) | `2.11.0` | `2.11.1` | | [semver](https://github.com/dtolnay/semver) | `1.0.26` | `1.0.27` | | [serde](https://github.com/serde-rs/serde) | `1.0.219` | `1.0.224` | | [serde_derive](https://github.com/serde-rs/serde) | `1.0.219` | `1.0.224` | | [serde_json](https://github.com/serde-rs/json) | `1.0.143` | `1.0.145` | | [tempfile](https://github.com/Stebalien/tempfile) | `3.21.0` | `3.22.0` | Updates `cc` from 1.2.36 to 1.2.37 - [Release notes](https://github.com/rust-lang/cc-rs/releases) - [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md) - [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.36...cc-v1.2.37) Updates `indexmap` from 2.11.0 to 2.11.1 - [Changelog](https://github.com/indexmap-rs/indexmap/blob/main/RELEASES.md) - [Commits](https://github.com/indexmap-rs/indexmap/compare/2.11.0...2.11.1) Updates `semver` from 1.0.26 to 1.0.27 - [Release notes](https://github.com/dtolnay/semver/releases) - [Commits](https://github.com/dtolnay/semver/compare/1.0.26...1.0.27) Updates `serde` from 1.0.219 to 1.0.224 - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](https://github.com/serde-rs/serde/compare/v1.0.219...v1.0.224) Updates `serde_derive` from 1.0.219 to 1.0.224 - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](https://github.com/serde-rs/serde/compare/v1.0.219...v1.0.224) Updates `serde_json` from 1.0.143 to 1.0.145 - [Release notes](https://github.com/serde-rs/json/releases) - [Commits](https://github.com/serde-rs/json/compare/v1.0.143...v1.0.145) Updates `tempfile` from 3.21.0 to 3.22.0 - [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md) - [Commits](https://github.com/Stebalien/tempfile/compare/v3.21.0...v3.22.0) --- updated-dependencies: - dependency-name: cc dependency-version: 1.2.37 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: indexmap dependency-version: 2.11.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: semver dependency-version: 1.0.27 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: serde dependency-version: 1.0.224 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: serde_derive dependency-version: 1.0.224 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: serde_json dependency-version: 1.0.145 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: tempfile dependency-version: 3.22.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 42 +++++++++++++++++++++++++++--------------- Cargo.toml | 10 +++++----- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6507507c..d42f2e23 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -169,9 +169,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.36" +version = "1.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54" +checksum = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44" dependencies = [ "find-msvc-tools", "shlex", @@ -868,9 +868,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" +checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921" dependencies = [ "equivalent", "hashbrown", @@ -1456,27 +1456,38 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", + "serde_core", ] [[package]] name = "serde" -version = "1.0.219" +version = "1.0.224" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "6aaeb1e94f53b16384af593c71e20b095e958dab1d26939c1b70645c5cfbcc0b" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.224" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f39390fa6346e24defbcdd3d9544ba8a19985d0af74df8501fbfe9a64341ab" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.224" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "87ff78ab5e8561c9a675bfc1785cb07ae721f0ee53329a595cefd8c04c2ac4e0" dependencies = [ "proc-macro2", "quote", @@ -1485,15 +1496,16 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.143" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "indexmap", "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -1583,15 +1595,15 @@ checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" [[package]] name = "tempfile" -version = "3.21.0" +version = "3.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" +checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", "rustix 1.0.8", - "windows-sys 0.60.2", + "windows-sys 0.61.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 6a7b0118..43e3b41c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -106,7 +106,7 @@ ansi_colours = "1.2.3" anstyle = "1.0.11" anyhow = "1.0.99" bstr = "1.12.0" -cc = "1.2.36" +cc = "1.2.37" clap = { version = "4.5.45", features = [ "cargo", "derive", @@ -126,7 +126,7 @@ fs4 = "0.12.0" glob = "0.3.3" heck = "0.5.0" html-escape = "0.2.13" -indexmap = "2.11.0" +indexmap = "2.11.1" indoc = "2.0.6" libloading = "0.8.8" log = { version = "0.4.28", features = ["std"] } @@ -138,14 +138,14 @@ rand = "0.8.5" regex = "1.11.2" regex-syntax = "0.8.6" rustc-hash = "2.1.1" -semver = { version = "1.0.26", features = ["serde"] } +semver = { version = "1.0.27", features = ["serde"] } serde = { version = "1.0.219", features = ["derive"] } serde_derive = "1.0.217" -serde_json = { version = "1.0.143", features = ["preserve_order"] } +serde_json = { version = "1.0.145", features = ["preserve_order"] } similar = "2.7.0" smallbitvec = "2.6.0" streaming-iterator = "0.1.9" -tempfile = "3.21.0" +tempfile = "3.22.0" thiserror = "2.0.16" tiny_http = "0.12.0" topological-sort = "0.2.2" From eedbec8f24966a64fe413c24fb5d52185c01e54a Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Thu, 11 Sep 2025 18:41:29 -0400 Subject: [PATCH 452/663] feat: remove the need of an external JS runtime for processing grammars --- Cargo.lock | 237 +++++++++++++++- crates/cli/Cargo.toml | 2 + crates/cli/package.nix | 5 + crates/cli/src/main.rs | 13 + crates/generate/Cargo.toml | 13 +- crates/generate/src/dsl.js | 24 +- crates/generate/src/generate.rs | 18 ++ crates/generate/src/quickjs.rs | 463 ++++++++++++++++++++++++++++++++ 8 files changed, 760 insertions(+), 15 deletions(-) create mode 100644 crates/generate/src/quickjs.rs diff --git a/Cargo.lock b/Cargo.lock index d42f2e23..0476d424 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -103,6 +103,29 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags 2.9.4", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn", + "which", +] + [[package]] name = "bindgen" version = "0.72.1" @@ -118,7 +141,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash", + "rustc-hash 2.1.1", "shlex", "syn", ] @@ -318,6 +341,15 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.10.1" @@ -391,7 +423,7 @@ dependencies = [ "log", "pulley-interpreter", "regalloc2", - "rustc-hash", + "rustc-hash 2.1.1", "serde", "smallvec", "target-lexicon", @@ -636,6 +668,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "foldhash" version = "0.1.5" @@ -845,6 +883,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "1.1.0" @@ -909,6 +953,15 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -985,6 +1038,18 @@ dependencies = [ "libc", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "leb128fmt" version = "0.1.0" @@ -1210,12 +1275,46 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + [[package]] name = "percent-encoding" version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -1272,6 +1371,15 @@ dependencies = [ "syn", ] +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", +] + [[package]] name = "proc-macro2" version = "1.0.101" @@ -1365,7 +1473,7 @@ dependencies = [ "bumpalo", "hashbrown", "log", - "rustc-hash", + "rustc-hash 2.1.1", "smallvec", ] @@ -1398,6 +1506,12 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" +[[package]] +name = "relative-path" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" + [[package]] name = "rgb" version = "0.8.52" @@ -1407,6 +1521,62 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "rquickjs" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5227859c4dfc83f428e58f9569bf439e628c8d139020e7faff437e6f5abaa0" +dependencies = [ + "rquickjs-core", + "rquickjs-macro", +] + +[[package]] +name = "rquickjs-core" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e82e0ca83028ad5b533b53b96c395bbaab905a5774de4aaf1004eeacafa3d85d" +dependencies = [ + "phf", + "relative-path", + "rquickjs-sys", +] + +[[package]] +name = "rquickjs-macro" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4d2eccd988a924a470a76fbd81a191b22d1f5f4f4619cf5662a8c1ab4ca1db7" +dependencies = [ + "convert_case", + "fnv", + "ident_case", + "indexmap", + "phf_generator", + "phf_shared", + "proc-macro-crate", + "proc-macro2", + "quote", + "rquickjs-core", + "syn", +] + +[[package]] +name = "rquickjs-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fed0097b0b4fbb2a87f6dd3b995a7c64ca56de30007eb7e867dfdfc78324ba5" +dependencies = [ + "bindgen 0.69.5", + "cc", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc-hash" version = "2.1.1" @@ -1526,6 +1696,12 @@ version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "smallbitvec" version = "2.6.0" @@ -1686,6 +1862,23 @@ dependencies = [ "zerovec", ] +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + [[package]] name = "topological-sort" version = "0.2.2" @@ -1727,7 +1920,7 @@ dependencies = [ name = "tree-sitter" version = "0.26.0" dependencies = [ - "bindgen", + "bindgen 0.72.1", "cc", "regex", "regex-syntax", @@ -1764,7 +1957,7 @@ dependencies = [ "rand", "regex", "regex-syntax", - "rustc-hash", + "rustc-hash 2.1.1", "semver", "serde", "serde_derive", @@ -1809,13 +2002,16 @@ dependencies = [ "indexmap", "indoc", "log", + "pathdiff", "regex", "regex-syntax", - "rustc-hash", + "rquickjs", + "rustc-hash 2.1.1", "semver", "serde", "serde_json", "smallbitvec", + "tempfile", "thiserror 2.0.16", "topological-sort", "tree-sitter", @@ -1886,6 +2082,12 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + [[package]] name = "unicode-width" version = "0.2.1" @@ -2263,6 +2465,18 @@ dependencies = [ "web-sys", ] +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix 0.38.44", +] + [[package]] name = "widestring" version = "1.2.0" @@ -2540,6 +2754,15 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +[[package]] +name = "winnow" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +dependencies = [ + "memchr", +] + [[package]] name = "wit-bindgen" version = "0.45.0" @@ -2558,7 +2781,7 @@ version = "0.1.0" dependencies = [ "anstyle", "anyhow", - "bindgen", + "bindgen 0.72.1", "cc", "clap", "indoc", diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 02de411b..741e8b42 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -30,7 +30,9 @@ name = "benchmark" harness = false [features] +default = ["qjs-rt"] wasm = ["tree-sitter/wasm", "tree-sitter-loader/wasm"] +qjs-rt = ["tree-sitter-generate/qjs-rt"] [dependencies] ansi_colours.workspace = true diff --git a/crates/cli/package.nix b/crates/cli/package.nix index ceab7bc7..eea05e12 100644 --- a/crates/cli/package.nix +++ b/crates/cli/package.nix @@ -3,6 +3,8 @@ src, rustPlatform, version, + clang, + libclang, cmake, pkg-config, nodejs_22, @@ -21,6 +23,7 @@ rustPlatform.buildRustPackage { cargoBuildFlags = [ "--all-features" ]; nativeBuildInputs = [ + clang cmake pkg-config nodejs_22 @@ -29,6 +32,8 @@ rustPlatform.buildRustPackage { cargoLock.lockFile = ../../Cargo.lock; + env.LIBCLANG_PATH = "${libclang.lib}/lib"; + preBuild = '' rm -rf test/fixtures mkdir -p test/fixtures diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index dab1806a..960c1f87 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -143,6 +143,7 @@ struct Generate { #[arg(long)] pub json: bool, /// The name or path of the JavaScript runtime to use for generating parsers + #[cfg(not(feature = "qjs-rt"))] #[arg( long, value_name = "EXECUTABLE", @@ -150,6 +151,17 @@ struct Generate { default_value = "node" )] pub js_runtime: Option, + + #[cfg(feature = "qjs-rt")] + #[arg( + long, + value_name = "EXECUTABLE", + env = "TREE_SITTER_JS_RUNTIME", + default_value = "node" + )] + /// The name or path of the JavaScript runtime to use for generating parsers, specify `native` + /// to use the native `QuickJS` runtime + pub js_runtime: Option, } #[derive(Args)] @@ -868,6 +880,7 @@ impl Generate { // TODO: migrate to `warn!` once https://github.com/tree-sitter/tree-sitter/pull/4604 is merged eprintln!("Warning: --build is deprecated, use --stage=lib instead"); } + if let Err(err) = tree_sitter_generate::generate_parser_in_directory( current_dir, self.output.as_deref(), diff --git a/crates/generate/Cargo.toml b/crates/generate/Cargo.toml index 20147948..1a296229 100644 --- a/crates/generate/Cargo.toml +++ b/crates/generate/Cargo.toml @@ -20,8 +20,9 @@ path = "src/generate.rs" workspace = true [features] -default = ["load"] +default = ["qjs-rt"] load = ["dep:semver", "dep:url"] +qjs-rt = ["load", "rquickjs", "pathdiff"] [dependencies] anyhow.workspace = true @@ -29,8 +30,15 @@ heck.workspace = true indexmap.workspace = true indoc.workspace = true log.workspace = true +pathdiff = { version = "0.2.3", optional = true } regex.workspace = true regex-syntax.workspace = true +rquickjs = { version = "0.9.0", optional = true, features = [ + "bindgen", + "loader", + "macro", + "phf", +] } rustc-hash.workspace = true semver = { workspace = true, optional = true } serde.workspace = true @@ -43,3 +51,6 @@ tree-sitter.workspace = true [target.'cfg(windows)'.dependencies] url = { workspace = true, optional = true } + +[dev-dependencies] +tempfile.workspace = true diff --git a/crates/generate/src/dsl.js b/crates/generate/src/dsl.js index faaace05..f522fd7f 100644 --- a/crates/generate/src/dsl.js +++ b/crates/generate/src/dsl.js @@ -70,7 +70,7 @@ function prec(number, rule) { }; } -prec.left = function(number, rule) { +prec.left = function (number, rule) { if (rule == null) { rule = number; number = 0; @@ -92,7 +92,7 @@ prec.left = function(number, rule) { }; } -prec.right = function(number, rule) { +prec.right = function (number, rule) { if (rule == null) { rule = number; number = 0; @@ -114,7 +114,7 @@ prec.right = function(number, rule) { }; } -prec.dynamic = function(number, rule) { +prec.dynamic = function (number, rule) { checkPrecedence(number); checkArguments( arguments, @@ -184,7 +184,7 @@ function token(value) { }; } -token.immediate = function(value) { +token.immediate = function (value) { checkArguments(arguments, arguments.length, token.immediate, 'token.immediate', '', 'literal'); return { type: "IMMEDIATE_TOKEN", @@ -517,6 +517,7 @@ function checkPrecedence(value) { } function getEnv(name) { + if (globalThis.native) return globalThis.__ts_grammar_path; if (globalThis.process) return process.env[name]; // Node/Bun if (globalThis.Deno) return Deno.env.get(name); // Deno throw Error("Unsupported JS runtime"); @@ -537,14 +538,23 @@ globalThis.grammar = grammar; globalThis.field = field; globalThis.RustRegex = RustRegex; -const result = await import(getEnv("TREE_SITTER_GRAMMAR_PATH")); +const grammarPath = getEnv("TREE_SITTER_GRAMMAR_PATH"); +let result = await import(grammarPath); +let grammarObj = result.default?.grammar ?? result.grammar; + +if (globalThis.native && !grammarObj) { + grammarObj = module.exports.grammar; +} + const object = { "$schema": "https://tree-sitter.github.io/tree-sitter/assets/schemas/grammar.schema.json", - ...(result.default?.grammar ?? result.grammar) + ...grammarObj, }; const output = JSON.stringify(object); -if (globalThis.process) { // Node/Bun +if (globalThis.native) { + globalThis.output = output; +} else if (globalThis.process) { // Node/Bun process.stdout.write(output); } else if (globalThis.Deno) { // Deno Deno.stdout.writeSync(new TextEncoder().encode(output)); diff --git a/crates/generate/src/generate.rs b/crates/generate/src/generate.rs index 983f0e1a..4583ab9a 100644 --- a/crates/generate/src/generate.rs +++ b/crates/generate/src/generate.rs @@ -25,6 +25,8 @@ mod nfa; mod node_types; pub mod parse_grammar; mod prepare_grammar; +#[cfg(feature = "qjs-rt")] +mod quickjs; mod render; mod rules; mod tables; @@ -150,6 +152,9 @@ pub enum JSError { Semver(String), #[error("Failed to serialze grammar JSON -- {0}")] Serialzation(String), + #[cfg(feature = "qjs-rt")] + #[error("QuickJS error: {0}")] + QuickJS(String), } #[cfg(feature = "load")] @@ -173,7 +178,15 @@ impl From for JSError { } } +#[cfg(feature = "qjs-rt")] +impl From for JSError { + fn from(value: rquickjs::Error) -> Self { + Self::QuickJS(value.to_string()) + } +} + #[cfg(feature = "load")] +#[allow(clippy::too_many_arguments)] pub fn generate_parser_in_directory( repo_path: T, out_path: Option, @@ -420,6 +433,11 @@ fn load_js_grammar_file(grammar_path: &Path, js_runtime: Option<&str>) -> JSResu .expect("Failed to convert path to URL") .to_string(); + #[cfg(feature = "qjs-rt")] + if js_runtime == Some("native") { + return quickjs::execute_native_runtime(&grammar_path); + } + let js_runtime = js_runtime.unwrap_or("node"); let mut js_command = Command::new(js_runtime); diff --git a/crates/generate/src/quickjs.rs b/crates/generate/src/quickjs.rs new file mode 100644 index 00000000..51703de5 --- /dev/null +++ b/crates/generate/src/quickjs.rs @@ -0,0 +1,463 @@ +use std::{ + collections::HashMap, + path::{Path, PathBuf}, + sync::{LazyLock, Mutex}, +}; + +use rquickjs::{ + loader::{FileResolver, ScriptLoader}, + Context, Ctx, Function, Module, Object, Runtime, Type, Value, +}; + +use super::{JSError, JSResult}; + +const DSL: &[u8] = include_bytes!("dsl.js"); + +trait JSResultExt { + fn or_js_error(self, ctx: &Ctx) -> JSResult; +} + +impl JSResultExt for Result { + fn or_js_error(self, ctx: &Ctx) -> JSResult { + match self { + Ok(v) => Ok(v), + Err(rquickjs::Error::Exception) => Err(format_js_exception(ctx.catch())), + Err(e) => Err(JSError::QuickJS(e.to_string())), + } + } +} + +fn format_js_exception(v: Value) -> JSError { + let Some(exception) = v.into_exception() else { + return JSError::QuickJS("Expected a JS exception".to_string()); + }; + + let error_obj = exception.as_object(); + let mut parts = Vec::new(); + + for (key, label) in [("message", "Message"), ("stack", "Stack"), ("name", "Type")] { + if let Ok(value) = error_obj.get::<_, String>(key) { + parts.push(format!("{label}: {value}")); + } + } + + if parts.is_empty() { + JSError::QuickJS(exception.to_string()) + } else { + JSError::QuickJS(parts.join("\n")) + } +} + +static FILE_CACHE: LazyLock>> = + LazyLock::new(|| Mutex::new(HashMap::new())); + +#[rquickjs::function] +fn load_file(path: String) -> rquickjs::Result { + { + let cache = FILE_CACHE.lock().unwrap(); + if let Some(cached) = cache.get(&path) { + return Ok(cached.clone()); + } + } + + let content = std::fs::read_to_string(&path).map_err(|e| { + rquickjs::Error::new_from_js_message("IOError", "FileReadError", e.to_string()) + })?; + + { + let mut cache = FILE_CACHE.lock().unwrap(); + cache.insert(path, content.clone()); + } + + Ok(content) +} + +#[rquickjs::class] +#[derive(rquickjs::class::Trace, rquickjs::JsLifetime, Default)] +pub struct Console {} + +impl Console { + fn format_args(args: &[Value<'_>]) -> String { + args.iter() + .map(|v| match v.type_of() { + Type::Bool => v.as_bool().unwrap().to_string(), + Type::Int => v.as_int().unwrap().to_string(), + Type::Float => v.as_float().unwrap().to_string(), + Type::String => v + .as_string() + .unwrap() + .to_string() + .unwrap_or_else(|_| String::new()), + Type::Null => "null".to_string(), + Type::Undefined => "undefined".to_string(), + Type::Uninitialized => "uninitialized".to_string(), + Type::Module => "module".to_string(), + Type::BigInt => v.get::().unwrap_or_else(|_| "BigInt".to_string()), + Type::Unknown => "unknown".to_string(), + Type::Symbol + | Type::Object + | Type::Array + | Type::Function + | Type::Constructor + | Type::Promise + | Type::Exception => "[object Object]".to_string(), + }) + .collect::>() + .join(" ") + } +} + +#[rquickjs::methods] +impl Console { + #[qjs(constructor)] + pub const fn new() -> Self { + Console {} + } + + #[allow(clippy::needless_pass_by_value)] + pub fn log(&self, args: rquickjs::function::Rest>) -> rquickjs::Result<()> { + println!("{}", Self::format_args(&args)); + Ok(()) + } + + #[allow(clippy::needless_pass_by_value)] + pub fn warn(&self, args: rquickjs::function::Rest>) -> rquickjs::Result<()> { + eprintln!("Warning: {}", Self::format_args(&args)); + Ok(()) + } + + #[allow(clippy::needless_pass_by_value)] + pub fn error(&self, args: rquickjs::function::Rest>) -> rquickjs::Result<()> { + eprintln!("Error: {}", Self::format_args(&args)); + Ok(()) + } +} + +fn resolve_module_path(base_path: &Path, module_path: &str) -> rquickjs::Result { + let candidates = if module_path.starts_with("./") || module_path.starts_with("../") { + let target = base_path.join(module_path); + vec![ + target.with_extension("js"), + target.with_extension("json"), + target.clone(), + ] + } else { + let local_target = base_path.join(module_path); + let node_modules_target = Path::new("node_modules").join(module_path); + + vec![ + local_target.with_extension("js"), + local_target.with_extension("json"), + local_target.clone(), + node_modules_target.with_extension("js"), + node_modules_target.with_extension("json"), + node_modules_target, + ] + }; + + for candidate in candidates { + if let Ok(resolved) = try_resolve_path(&candidate) { + return Ok(resolved); + } + } + + Err(rquickjs::Error::new_from_js_message( + "Error", + "ModuleNotFound", + format!("Module not found: {module_path}"), + )) +} + +fn try_resolve_path(path: &Path) -> rquickjs::Result { + let metadata = std::fs::metadata(path).map_err(|_| { + rquickjs::Error::new_from_js_message( + "Error", + "FileNotFound", + format!("Path not found: {}", path.display()), + ) + })?; + + if metadata.is_file() { + return Ok(path.to_path_buf()); + } + + if metadata.is_dir() { + let index_path = path.join("index.js"); + if index_path.exists() { + return Ok(index_path); + } + } + + Err(rquickjs::Error::new_from_js_message( + "Error", + "ResolutionFailed", + format!("Cannot resolve: {}", path.display()), + )) +} + +#[allow(clippy::needless_pass_by_value)] +fn require_from_module<'a>( + ctx: Ctx<'a>, + module_path: String, + from_module: &str, +) -> rquickjs::Result> { + let current_module = PathBuf::from(from_module); + let current_dir = if current_module.is_file() { + current_module.parent().unwrap_or(Path::new(".")) + } else { + current_module.as_path() + }; + + let resolved_path = resolve_module_path(current_dir, &module_path)?; + + let contents = load_file(resolved_path.to_string_lossy().to_string())?; + + load_module_from_content(&ctx, &resolved_path, &contents) +} + +fn load_module_from_content<'a>( + ctx: &Ctx<'a>, + path: &Path, + contents: &str, +) -> rquickjs::Result> { + if path.extension().is_some_and(|ext| ext == "json") { + return ctx.eval::(format!("JSON.parse({contents:?})")); + } + + let exports = Object::new(ctx.clone())?; + let module_obj = Object::new(ctx.clone())?; + module_obj.set("exports", exports.clone())?; + + let filename = path.to_string_lossy().to_string(); + let dirname = path + .parent() + .map_or_else(|| ".".to_string(), |p| p.to_string_lossy().to_string()); + + // Require function specific to *this* module + let module_path = filename.clone(); + let require = Function::new( + ctx.clone(), + move |ctx_inner: Ctx<'a>, target_path: String| -> rquickjs::Result> { + require_from_module(ctx_inner, target_path, &module_path) + }, + )?; + + let wrapper = + format!("(function(exports, require, module, __filename, __dirname) {{ {contents} }})"); + + let module_func = ctx.eval::(wrapper)?; + module_func.call::<_, Value>((exports, require, module_obj.clone(), filename, dirname))?; + + module_obj.get("exports") +} + +pub fn execute_native_runtime( + #[cfg(windows)] grammar_path: &str, + #[cfg(not(windows))] grammar_path: &Path, +) -> JSResult { + #[cfg(not(windows))] + let grammar_path = grammar_path.to_string_lossy(); + + let runtime = Runtime::new()?; + + runtime.set_memory_limit(64 * 1024 * 1024); // 64MB + runtime.set_max_stack_size(256 * 1024); // 256KB + + let context = Context::full(&runtime)?; + + let resolver = FileResolver::default() + .with_path("./") + .with_pattern("{}.mjs"); + let loader = ScriptLoader::default().with_extension("mjs"); + runtime.set_loader(resolver, loader); + + let cwd = std::env::current_dir()?; + let relative_path = pathdiff::diff_paths(&*grammar_path, &cwd) + .map(|p| p.to_string_lossy().to_string()) + .ok_or_else(|| JSError::IO("Failed to get relative path".to_string()))?; + + context.with(|ctx| -> JSResult { + let globals = ctx.globals(); + + globals.set("native", true).or_js_error(&ctx)?; + globals + .set("__ts_grammar_path", relative_path) + .or_js_error(&ctx)?; + + let console = rquickjs::Class::instance(ctx.clone(), Console::new()).or_js_error(&ctx)?; + globals.set("console", console).or_js_error(&ctx)?; + + let process = Object::new(ctx.clone()).or_js_error(&ctx)?; + let env = Object::new(ctx.clone()).or_js_error(&ctx)?; + for (key, value) in std::env::vars() { + env.set(key, value).or_js_error(&ctx)?; + } + process.set("env", env).or_js_error(&ctx)?; + globals.set("process", process).or_js_error(&ctx)?; + + let module = Object::new(ctx.clone()).or_js_error(&ctx)?; + module + .set("exports", Object::new(ctx.clone()).or_js_error(&ctx)?) + .or_js_error(&ctx)?; + globals.set("module", module).or_js_error(&ctx)?; + + let grammar_path_string = grammar_path.to_string(); + let main_require = Function::new( + ctx.clone(), + move |ctx_inner, target_path: String| -> rquickjs::Result { + require_from_module(ctx_inner, target_path, &grammar_path_string) + }, + )?; + globals.set("require", main_require).or_js_error(&ctx)?; + + let promise = Module::evaluate(ctx.clone(), "dsl", DSL).or_js_error(&ctx)?; + promise.finish::<()>().or_js_error(&ctx)?; + + let grammar_json = ctx + .eval::("globalThis.output") + .map(|s| s.to_string()) + .or_js_error(&ctx)? + .or_js_error(&ctx)?; + + let parsed = serde_json::from_str::(&grammar_json)?; + Ok(serde_json::to_string_pretty(&parsed)?) + }) +} + +#[cfg(test)] +mod tests { + use std::{ + fs, + sync::{Arc, Mutex, OnceLock}, + }; + use tempfile::TempDir; + + use super::*; + + static TEST_MUTEX: OnceLock>> = OnceLock::new(); + + fn with_test_lock(test: F) -> R + where + F: FnOnce() -> R, + { + let _guard = TEST_MUTEX.get_or_init(|| Arc::new(Mutex::new(()))).lock(); + let result = test(); + cleanup_runtime_state(); + result + } + + fn cleanup_runtime_state() { + FILE_CACHE.lock().unwrap().clear(); + } + + #[test] + fn test_basic_grammar_execution() { + with_test_lock(|| { + let temp_dir = TempDir::new().unwrap(); + std::env::set_current_dir(temp_dir.path()).unwrap(); + + let grammar_path = temp_dir.path().join("grammar.js"); + fs::write( + &grammar_path, + r" + module.exports = grammar({ + name: 'test', + rules: { source_file: $ => 'hello' } + }); + ", + ) + .unwrap(); + + let json = execute_native_runtime(&grammar_path).expect("Failed to execute grammar"); + assert!(json.contains("\"name\": \"test\"")); + assert!(json.contains("\"hello\"")); + }); + } + + #[test] + fn test_module_imports() { + with_test_lock(|| { + let temp_dir = TempDir::new().unwrap(); + std::env::set_current_dir(temp_dir.path()).unwrap(); + + fs::write( + temp_dir.path().join("common.js"), + r" + module.exports = { identifier: $ => /[a-zA-Z_][a-zA-Z0-9_]*/ }; + ", + ) + .unwrap(); + + fs::write( + temp_dir.path().join("grammar.js"), + r" + const common = require('./common'); + module.exports = grammar({ + name: 'test_import', + rules: { source_file: common.identifier } + }); + ", + ) + .unwrap(); + + let json = execute_native_runtime(&temp_dir.path().join("grammar.js")) + .expect("Failed to execute grammar with imports"); + assert!(json.contains("\"name\": \"test_import\"")); + }); + } + + #[test] + fn test_json_module_loading() { + with_test_lock(|| { + let temp_dir = TempDir::new().unwrap(); + std::env::set_current_dir(temp_dir.path()).unwrap(); + + fs::write( + temp_dir.path().join("package.json"), + r#"{"version": "1.0.0"}"#, + ) + .unwrap(); + fs::write( + temp_dir.path().join("grammar.js"), + r" + const pkg = require('./package.json'); + module.exports = grammar({ + name: 'json_test', + rules: { + source_file: $ => 'version_' + pkg.version.replace(/\./g, '_') + } + }); + ", + ) + .unwrap(); + + let json = execute_native_runtime(&temp_dir.path().join("grammar.js")) + .expect("Failed to execute grammar with JSON import"); + assert!(json.contains("version_1_0_0")); + }); + } + + #[test] + fn test_resource_limits() { + with_test_lock(|| { + let temp_dir = TempDir::new().unwrap(); + std::env::set_current_dir(temp_dir.path()).unwrap(); + + fs::write( + temp_dir.path().join("grammar.js"), + r" + const huge = new Array(10000000).fill('x'.repeat(1000)); + module.exports = grammar({ + name: 'resource_test', + rules: { source_file: $ => 'test' } + }); + ", + ) + .unwrap(); + + let result = execute_native_runtime(&temp_dir.path().join("grammar.js")); + assert!(result.is_err()); + assert!(matches!(result.unwrap_err(), JSError::QuickJS(_))); + }); + } +} From 67f50b85f57c6225d9de28ec05a3a9ab9d75472f Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Mon, 15 Sep 2025 18:42:54 -0400 Subject: [PATCH 453/663] docs: document the native js runtime --- docs/src/cli/generate.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/src/cli/generate.md b/docs/src/cli/generate.md index 26bc7e1e..80397820 100644 --- a/docs/src/cli/generate.md +++ b/docs/src/cli/generate.md @@ -63,4 +63,6 @@ Report conflicts in a JSON format. ### `--js-runtime ` The path to the JavaScript runtime executable to use when generating the parser. The default is `node`. -Note that you can also set this with `TREE_SITTER_JS_RUNTIME`. +Note that you can also set this with `TREE_SITTER_JS_RUNTIME`. Starting from version 0.26.0, you can +also pass in `native` to use the native QuickJS runtime that comes bundled with the CLI. This avoids +the dependency on a JavaScript runtime entirely. From 39a67eec6148fd3cd3e8d2ac0950e412951b1af0 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Mon, 15 Sep 2025 19:06:51 -0400 Subject: [PATCH 454/663] feat: migrate to ESM --- crates/cli/src/init.rs | 64 +++++++++++++++---- crates/cli/src/templates/binding_test.js | 10 +-- crates/cli/src/templates/grammar.js | 2 +- crates/cli/src/templates/index.js | 18 ++++-- crates/cli/src/templates/package.json | 1 + crates/generate/src/generate.rs | 9 +++ .../src/creating-parsers/1-getting-started.md | 2 +- .../creating-parsers/3-writing-the-grammar.md | 2 +- .../aliased_inlined_rules/grammar.js | 2 +- .../test_grammars/aliased_rules/grammar.js | 2 +- .../aliased_token_rules/grammar.js | 2 +- .../aliased_unit_reductions/grammar.js | 2 +- .../test_grammars/aliases_in_root/grammar.js | 2 +- .../test_grammars/anonymous_error/grammar.js | 2 +- .../grammar.js | 2 +- .../associativity_left/grammar.js | 2 +- .../associativity_missing/grammar.js | 2 +- .../associativity_right/grammar.js | 2 +- .../conflict_in_repeat_rule/grammar.js | 2 +- .../grammar.js | 4 +- .../conflicting_precedence/grammar.js | 2 +- .../depends_on_column/grammar.js | 2 +- .../dynamic_precedence/grammar.js | 2 +- .../epsilon_external_extra_tokens/grammar.js | 2 +- .../epsilon_external_tokens/grammar.js | 2 +- .../test_grammars/epsilon_rules/grammar.js | 2 +- .../grammar.js | 2 +- .../external_and_internal_tokens/grammar.js | 2 +- .../external_extra_tokens/grammar.js | 2 +- .../test_grammars/external_tokens/grammar.js | 2 +- .../grammar.js | 2 +- .../extra_non_terminals/grammar.js | 2 +- .../grammar.js | 2 +- .../test_grammars/get_col_eof/grammar.js | 2 +- .../get_col_should_hang_not_crash/grammar.js | 2 +- .../test_grammars/immediate_tokens/grammar.js | 2 +- .../grammar.js | 2 +- .../test_grammars/inline_rules/grammar.js | 2 +- .../inlined_aliased_rules/grammar.js | 2 +- .../inverted_external_token/grammar.js | 2 +- .../invisible_start_rule/grammar.js | 2 +- .../grammar.js | 2 +- .../named_precedences/grammar.js | 2 +- .../grammar.js | 2 +- .../nested_inlined_rules/grammar.js | 2 +- .../next_sibling_from_zwt/grammar.js | 2 +- .../partially_resolved_conflict/grammar.js | 2 +- .../grammar.js | 2 +- .../grammar.js | 2 +- .../grammar.js | 2 +- .../precedence_on_subsequence/grammar.js | 2 +- .../precedence_on_token/grammar.js | 2 +- .../test_grammars/readme_grammar/grammar.js | 2 +- .../test_grammars/reserved_words/grammar.js | 2 +- .../start_rule_is_blank/grammar.js | 2 +- .../start_rule_is_token/grammar.js | 2 +- .../test_grammars/unicode_classes/grammar.js | 2 +- .../test_grammars/unused_rules/grammar.js | 2 +- .../uses_current_column/grammar.js | 2 +- 59 files changed, 132 insertions(+), 80 deletions(-) diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index 8e9cad06..34318368 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -297,7 +297,7 @@ pub fn generate_grammar_files( ) }, |path| { - let contents = fs::read_to_string(path)? + let mut contents = fs::read_to_string(path)? .replace( r#""node-addon-api": "^8.3.1"#, r#""node-addon-api": "^8.5.0""#, @@ -311,6 +311,16 @@ pub fn generate_grammar_files( "tree-sitter": "^0.22.4", "tree-sitter-cli":"#}, ); + if !contents.contains("module") { + eprintln!("Updating package.json"); + contents = contents.replace( + indoc! {r#" + "repository": {"#}, + indoc! {r#" + "type": "module", + "repository": {"#}, + ); + } write_file(path, contents)?; Ok(()) }, @@ -318,9 +328,20 @@ pub fn generate_grammar_files( // Do not create a grammar.js file in a repo with multiple language configs if !tree_sitter_config.has_multiple_language_configs() { - missing_path(repo_path.join("grammar.js"), |path| { - generate_file(path, GRAMMAR_JS_TEMPLATE, language_name, &generate_opts) - })?; + missing_path_else( + repo_path.join("grammar.js"), + allow_update, + |path| generate_file(path, GRAMMAR_JS_TEMPLATE, language_name, &generate_opts), + |path| { + let mut contents = fs::read_to_string(path)?; + if contents.contains("module.exports") { + contents = contents.replace("module.exports =", "export default"); + write_file(path, contents)?; + } + + Ok(()) + }, + )?; } // Write .gitignore file @@ -410,7 +431,7 @@ pub fn generate_grammar_files( |path| generate_file(path, INDEX_JS_TEMPLATE, language_name, &generate_opts), |path| { let contents = fs::read_to_string(path)?; - if !contents.contains("bun") { + if !contents.contains("new URL") { eprintln!("Replacing index.js"); generate_file(path, INDEX_JS_TEMPLATE, language_name, &generate_opts)?; } @@ -422,14 +443,31 @@ pub fn generate_grammar_files( generate_file(path, INDEX_D_TS_TEMPLATE, language_name, &generate_opts) })?; - missing_path(path.join("binding_test.js"), |path| { - generate_file( - path, - BINDING_TEST_JS_TEMPLATE, - language_name, - &generate_opts, - ) - })?; + missing_path_else( + path.join("binding_test.js"), + allow_update, + |path| { + generate_file( + path, + BINDING_TEST_JS_TEMPLATE, + language_name, + &generate_opts, + ) + }, + |path| { + let contents = fs::read_to_string(path)?; + if !contents.contains("import") { + eprintln!("Replacing binding_test.js"); + generate_file( + path, + BINDING_TEST_JS_TEMPLATE, + language_name, + &generate_opts, + )?; + } + Ok(()) + }, + )?; missing_path(path.join("binding.cc"), |path| { generate_file(path, JS_BINDING_CC_TEMPLATE, language_name, &generate_opts) diff --git a/crates/cli/src/templates/binding_test.js b/crates/cli/src/templates/binding_test.js index 55becacf..e424b266 100644 --- a/crates/cli/src/templates/binding_test.js +++ b/crates/cli/src/templates/binding_test.js @@ -1,9 +1,9 @@ -const assert = require("node:assert"); -const { test } = require("node:test"); - -const Parser = require("tree-sitter"); +import assert from "node:assert"; +import { test } from "node:test"; +import Parser from "tree-sitter"; +import language from "./index.js"; test("can load grammar", () => { const parser = new Parser(); - assert.doesNotThrow(() => parser.setLanguage(require("."))); + assert.doesNotThrow(() => parser.setLanguage(language)); }); diff --git a/crates/cli/src/templates/grammar.js b/crates/cli/src/templates/grammar.js index 01586557..edee3cbc 100644 --- a/crates/cli/src/templates/grammar.js +++ b/crates/cli/src/templates/grammar.js @@ -7,7 +7,7 @@ /// // @ts-check -module.exports = grammar({ +export default grammar({ name: "LOWER_PARSER_NAME", rules: { diff --git a/crates/cli/src/templates/index.js b/crates/cli/src/templates/index.js index cbbaa32f..2782b741 100644 --- a/crates/cli/src/templates/index.js +++ b/crates/cli/src/templates/index.js @@ -1,11 +1,15 @@ -const root = require("path").join(__dirname, "..", ".."); +const root = new URL("../..", import.meta.url).pathname; -module.exports = - typeof process.versions.bun === "string" - // Support `bun build --compile` by being statically analyzable enough to find the .node file at build-time - ? require(`../../prebuilds/${process.platform}-${process.arch}/tree-sitter-KEBAB_PARSER_NAME.node`) - : require("node-gyp-build")(root); +const binding = typeof process.versions.bun === "string" + // Support `bun build --compile` by being statically analyzable enough to find the .node file at build-time + ? await import(`../../prebuilds/${process.platform}-${process.arch}/tree-sitter-KEBAB_PARSER_NAME.node`) + : await import("node-gyp-build"); + +const result = binding.default ? binding.default(root) : binding(root); try { - module.exports.nodeTypeInfo = require("../../src/node-types.json"); + const nodeTypeInfo = await import("../../src/node-types.json", {assert: {type: "json"}}); + result.nodeTypeInfo = nodeTypeInfo.default; } catch (_) {} + +export default result; diff --git a/crates/cli/src/templates/package.json b/crates/cli/src/templates/package.json index 93dc5854..95f5b638 100644 --- a/crates/cli/src/templates/package.json +++ b/crates/cli/src/templates/package.json @@ -2,6 +2,7 @@ "name": "tree-sitter-PARSER_NAME", "version": "PARSER_VERSION", "description": "PARSER_DESCRIPTION", + "type": "module", "repository": { "type": "git", "url": "git+PARSER_URL.git" diff --git a/crates/generate/src/generate.rs b/crates/generate/src/generate.rs index 4583ab9a..800a0319 100644 --- a/crates/generate/src/generate.rs +++ b/crates/generate/src/generate.rs @@ -428,6 +428,15 @@ pub fn load_grammar_file( fn load_js_grammar_file(grammar_path: &Path, js_runtime: Option<&str>) -> JSResult { let grammar_path = fs::canonicalize(grammar_path)?; + let grammar_uses_commonjs = fs::read_to_string(&grammar_path)?.contains("module.exports"); + if grammar_uses_commonjs { + eprintln!("Warning: Your grammar.js uses CommonJS."); + eprintln!("Consider migrating to ES modules (export default) for better compatibility."); + eprintln!( + "See: https://tree-sitter.github.io/tree-sitter/creating-parsers/#the-grammar-file" + ); + } + #[cfg(windows)] let grammar_path = url::Url::from_file_path(grammar_path) .expect("Failed to convert path to URL") diff --git a/docs/src/creating-parsers/1-getting-started.md b/docs/src/creating-parsers/1-getting-started.md index f452a85b..92159f4a 100644 --- a/docs/src/creating-parsers/1-getting-started.md +++ b/docs/src/creating-parsers/1-getting-started.md @@ -64,7 +64,7 @@ There should be a file called `grammar.js` with the following contents: /// // @ts-check -module.exports = grammar({ +export default grammar({ name: 'LOWER_PARSER_NAME', rules: { diff --git a/docs/src/creating-parsers/3-writing-the-grammar.md b/docs/src/creating-parsers/3-writing-the-grammar.md index cb6ec3d4..ebd2f5a4 100644 --- a/docs/src/creating-parsers/3-writing-the-grammar.md +++ b/docs/src/creating-parsers/3-writing-the-grammar.md @@ -313,7 +313,7 @@ A construct like `[x, y]` could be legitimately parsed as both an array literal pattern (like in `let [x, y] = arr`). ```js -module.exports = grammar({ +export default grammar({ name: "javascript", rules: { diff --git a/test/fixtures/test_grammars/aliased_inlined_rules/grammar.js b/test/fixtures/test_grammars/aliased_inlined_rules/grammar.js index 2f1091e7..9d41fef2 100644 --- a/test/fixtures/test_grammars/aliased_inlined_rules/grammar.js +++ b/test/fixtures/test_grammars/aliased_inlined_rules/grammar.js @@ -2,7 +2,7 @@ // shows that you can alias a rule that would otherwise be anonymous, and it will then appear as a // named node. -module.exports = grammar({ +export default grammar({ name: 'aliased_inlined_rules', extras: $ => [/\s/], diff --git a/test/fixtures/test_grammars/aliased_rules/grammar.js b/test/fixtures/test_grammars/aliased_rules/grammar.js index a615a90d..df721d5b 100644 --- a/test/fixtures/test_grammars/aliased_rules/grammar.js +++ b/test/fixtures/test_grammars/aliased_rules/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'aliased_rules', extras: $ => [ diff --git a/test/fixtures/test_grammars/aliased_token_rules/grammar.js b/test/fixtures/test_grammars/aliased_token_rules/grammar.js index 704a2a34..2a6f4be3 100644 --- a/test/fixtures/test_grammars/aliased_token_rules/grammar.js +++ b/test/fixtures/test_grammars/aliased_token_rules/grammar.js @@ -1,7 +1,7 @@ // This grammar shows that `ALIAS` rules can be applied directly to `TOKEN` and `IMMEDIATE_TOKEN` // rules. -module.exports = grammar({ +export default grammar({ name: 'aliased_token_rules', extras: $ => [/\s/], diff --git a/test/fixtures/test_grammars/aliased_unit_reductions/grammar.js b/test/fixtures/test_grammars/aliased_unit_reductions/grammar.js index 9b39de28..77186d07 100644 --- a/test/fixtures/test_grammars/aliased_unit_reductions/grammar.js +++ b/test/fixtures/test_grammars/aliased_unit_reductions/grammar.js @@ -5,7 +5,7 @@ // their parent rule. In that situation, eliminating the invisible node could cause the alias to be // incorrectly applied to its child. -module.exports = grammar({ +export default grammar({ name: 'aliased_unit_reductions', extras: $ => [/\s/], diff --git a/test/fixtures/test_grammars/aliases_in_root/grammar.js b/test/fixtures/test_grammars/aliases_in_root/grammar.js index 02d61646..9d46af2f 100644 --- a/test/fixtures/test_grammars/aliases_in_root/grammar.js +++ b/test/fixtures/test_grammars/aliases_in_root/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'aliases_in_root', extras: $ => [ diff --git a/test/fixtures/test_grammars/anonymous_error/grammar.js b/test/fixtures/test_grammars/anonymous_error/grammar.js index c06d1bd2..72870612 100644 --- a/test/fixtures/test_grammars/anonymous_error/grammar.js +++ b/test/fixtures/test_grammars/anonymous_error/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'anonymous_error', rules: { document: $ => repeat(choice('ok', 'ERROR')), diff --git a/test/fixtures/test_grammars/anonymous_tokens_with_escaped_chars/grammar.js b/test/fixtures/test_grammars/anonymous_tokens_with_escaped_chars/grammar.js index 3e7e294b..cffe374d 100644 --- a/test/fixtures/test_grammars/anonymous_tokens_with_escaped_chars/grammar.js +++ b/test/fixtures/test_grammars/anonymous_tokens_with_escaped_chars/grammar.js @@ -4,7 +4,7 @@ // characters. This grammar tests that this escaping works. The test is basically that the generated // parser compiles successfully. -module.exports = grammar({ +export default grammar({ name: "anonymous_tokens_with_escaped_chars", rules: { first_rule: $ => choice( diff --git a/test/fixtures/test_grammars/associativity_left/grammar.js b/test/fixtures/test_grammars/associativity_left/grammar.js index 6dbc4671..3b0b8e54 100644 --- a/test/fixtures/test_grammars/associativity_left/grammar.js +++ b/test/fixtures/test_grammars/associativity_left/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'associativity_left', rules: { diff --git a/test/fixtures/test_grammars/associativity_missing/grammar.js b/test/fixtures/test_grammars/associativity_missing/grammar.js index 9c1ed980..c540d132 100644 --- a/test/fixtures/test_grammars/associativity_missing/grammar.js +++ b/test/fixtures/test_grammars/associativity_missing/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'associativity_missing', rules: { diff --git a/test/fixtures/test_grammars/associativity_right/grammar.js b/test/fixtures/test_grammars/associativity_right/grammar.js index 69bfd065..a45a02fd 100644 --- a/test/fixtures/test_grammars/associativity_right/grammar.js +++ b/test/fixtures/test_grammars/associativity_right/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'associativity_right', rules: { diff --git a/test/fixtures/test_grammars/conflict_in_repeat_rule/grammar.js b/test/fixtures/test_grammars/conflict_in_repeat_rule/grammar.js index c23e8a7c..e3d4b2d8 100644 --- a/test/fixtures/test_grammars/conflict_in_repeat_rule/grammar.js +++ b/test/fixtures/test_grammars/conflict_in_repeat_rule/grammar.js @@ -2,7 +2,7 @@ // parser generator in order to implement repetition. There is no way of referring to these rules in // the grammar DSL, so these conflicts must be resolved by referring to their parent rules. -module.exports = grammar({ +export default grammar({ name: 'conflict_in_repeat_rule', rules: { diff --git a/test/fixtures/test_grammars/conflict_in_repeat_rule_after_external_token/grammar.js b/test/fixtures/test_grammars/conflict_in_repeat_rule_after_external_token/grammar.js index 27364b22..85145f7f 100644 --- a/test/fixtures/test_grammars/conflict_in_repeat_rule_after_external_token/grammar.js +++ b/test/fixtures/test_grammars/conflict_in_repeat_rule_after_external_token/grammar.js @@ -2,7 +2,7 @@ // after an external token is consumed. This tests that the logic for determining the repeat rule's // "parent" rule works in the presence of external tokens. -module.exports = grammar({ +export default grammar({ name: 'conflict_in_repeat_rule_after_external_token', externals: $ => [ @@ -29,4 +29,4 @@ module.exports = grammar({ identifier: $ => /[a-z]+/ } -}); \ No newline at end of file +}); diff --git a/test/fixtures/test_grammars/conflicting_precedence/grammar.js b/test/fixtures/test_grammars/conflicting_precedence/grammar.js index 8092f8e9..98b41def 100644 --- a/test/fixtures/test_grammars/conflicting_precedence/grammar.js +++ b/test/fixtures/test_grammars/conflicting_precedence/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'conflicting_precedence', rules: { diff --git a/test/fixtures/test_grammars/depends_on_column/grammar.js b/test/fixtures/test_grammars/depends_on_column/grammar.js index 6f74810e..95646d86 100644 --- a/test/fixtures/test_grammars/depends_on_column/grammar.js +++ b/test/fixtures/test_grammars/depends_on_column/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: "depends_on_column", rules: { x_is_at: ($) => seq(/[ \r\n]*/, choice($.odd_column, $.even_column), "x"), diff --git a/test/fixtures/test_grammars/dynamic_precedence/grammar.js b/test/fixtures/test_grammars/dynamic_precedence/grammar.js index 321f1139..e4ad3a8e 100644 --- a/test/fixtures/test_grammars/dynamic_precedence/grammar.js +++ b/test/fixtures/test_grammars/dynamic_precedence/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'dynamic_precedence', extras: $ => [/\s/], diff --git a/test/fixtures/test_grammars/epsilon_external_extra_tokens/grammar.js b/test/fixtures/test_grammars/epsilon_external_extra_tokens/grammar.js index b808de62..aefa4e0f 100644 --- a/test/fixtures/test_grammars/epsilon_external_extra_tokens/grammar.js +++ b/test/fixtures/test_grammars/epsilon_external_extra_tokens/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'epsilon_external_extra_tokens', extras: $ => [/\s/, $.comment], diff --git a/test/fixtures/test_grammars/epsilon_external_tokens/grammar.js b/test/fixtures/test_grammars/epsilon_external_tokens/grammar.js index 27deef47..14163d80 100644 --- a/test/fixtures/test_grammars/epsilon_external_tokens/grammar.js +++ b/test/fixtures/test_grammars/epsilon_external_tokens/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'epsilon_external_tokens', extras: $ => [/\s/], diff --git a/test/fixtures/test_grammars/epsilon_rules/grammar.js b/test/fixtures/test_grammars/epsilon_rules/grammar.js index 8cba729b..159ccd9f 100644 --- a/test/fixtures/test_grammars/epsilon_rules/grammar.js +++ b/test/fixtures/test_grammars/epsilon_rules/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'epsilon_rules', rules: { diff --git a/test/fixtures/test_grammars/external_and_internal_anonymous_tokens/grammar.js b/test/fixtures/test_grammars/external_and_internal_anonymous_tokens/grammar.js index e289f5ad..6e74b9d3 100644 --- a/test/fixtures/test_grammars/external_and_internal_anonymous_tokens/grammar.js +++ b/test/fixtures/test_grammars/external_and_internal_anonymous_tokens/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'external_and_internal_anonymous_tokens', externals: $ => [ diff --git a/test/fixtures/test_grammars/external_and_internal_tokens/grammar.js b/test/fixtures/test_grammars/external_and_internal_tokens/grammar.js index 6b70c98a..370a5723 100644 --- a/test/fixtures/test_grammars/external_and_internal_tokens/grammar.js +++ b/test/fixtures/test_grammars/external_and_internal_tokens/grammar.js @@ -2,7 +2,7 @@ // validity of an *internal* token. This is done by including the names of that internal token // (`line_break`) in the grammar's `externals` field. -module.exports = grammar({ +export default grammar({ name: 'external_and_internal_tokens', externals: $ => [ diff --git a/test/fixtures/test_grammars/external_extra_tokens/grammar.js b/test/fixtures/test_grammars/external_extra_tokens/grammar.js index a5390c8a..c64ecdc1 100644 --- a/test/fixtures/test_grammars/external_extra_tokens/grammar.js +++ b/test/fixtures/test_grammars/external_extra_tokens/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: "external_extra_tokens", externals: $ => [ diff --git a/test/fixtures/test_grammars/external_tokens/grammar.js b/test/fixtures/test_grammars/external_tokens/grammar.js index 457eee94..c4ff6cb7 100644 --- a/test/fixtures/test_grammars/external_tokens/grammar.js +++ b/test/fixtures/test_grammars/external_tokens/grammar.js @@ -2,7 +2,7 @@ // that track the nesting depth of parentheses, similar to Ruby's percent // string literals. -module.exports = grammar({ +export default grammar({ name: "external_tokens", externals: $ => [ diff --git a/test/fixtures/test_grammars/external_unicode_column_alignment/grammar.js b/test/fixtures/test_grammars/external_unicode_column_alignment/grammar.js index 3016b31d..e578920c 100644 --- a/test/fixtures/test_grammars/external_unicode_column_alignment/grammar.js +++ b/test/fixtures/test_grammars/external_unicode_column_alignment/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: "external_unicode_column_alignment", externals: $ => [ diff --git a/test/fixtures/test_grammars/extra_non_terminals/grammar.js b/test/fixtures/test_grammars/extra_non_terminals/grammar.js index e66bc9ac..116cb0a6 100644 --- a/test/fixtures/test_grammars/extra_non_terminals/grammar.js +++ b/test/fixtures/test_grammars/extra_non_terminals/grammar.js @@ -1,6 +1,6 @@ // This grammar has an "extra" rule, `comment`, that is a non-terminal. -module.exports = grammar({ +export default grammar({ name: "extra_non_terminals", extras: $ => [ diff --git a/test/fixtures/test_grammars/extra_non_terminals_with_shared_rules/grammar.js b/test/fixtures/test_grammars/extra_non_terminals_with_shared_rules/grammar.js index 28539871..993e89b4 100644 --- a/test/fixtures/test_grammars/extra_non_terminals_with_shared_rules/grammar.js +++ b/test/fixtures/test_grammars/extra_non_terminals_with_shared_rules/grammar.js @@ -1,7 +1,7 @@ // This grammar has a non-terminal extra rule `macro_statement` that contains // child rules that are also used elsewhere in the grammar. -module.exports = grammar({ +export default grammar({ name: "extra_non_terminals_with_shared_rules", extras: $ => [/\s+/, $.macro_statement], diff --git a/test/fixtures/test_grammars/get_col_eof/grammar.js b/test/fixtures/test_grammars/get_col_eof/grammar.js index 3b70db2f..a2cf6ef4 100644 --- a/test/fixtures/test_grammars/get_col_eof/grammar.js +++ b/test/fixtures/test_grammars/get_col_eof/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: "get_col_eof", externals: $ => [ diff --git a/test/fixtures/test_grammars/get_col_should_hang_not_crash/grammar.js b/test/fixtures/test_grammars/get_col_should_hang_not_crash/grammar.js index 83d57d2c..d45ea967 100644 --- a/test/fixtures/test_grammars/get_col_should_hang_not_crash/grammar.js +++ b/test/fixtures/test_grammars/get_col_should_hang_not_crash/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'get_col_should_hang_not_crash', externals: $ => [ diff --git a/test/fixtures/test_grammars/immediate_tokens/grammar.js b/test/fixtures/test_grammars/immediate_tokens/grammar.js index 7505a811..223de3d3 100644 --- a/test/fixtures/test_grammars/immediate_tokens/grammar.js +++ b/test/fixtures/test_grammars/immediate_tokens/grammar.js @@ -3,7 +3,7 @@ // When there are *no* leading `extras`, an immediate token is preferred over a normal token which // would otherwise match. -module.exports = grammar({ +export default grammar({ name: "immediate_tokens", extras: $ => [/\s/], diff --git a/test/fixtures/test_grammars/indirect_recursion_in_transitions/grammar.js b/test/fixtures/test_grammars/indirect_recursion_in_transitions/grammar.js index 65ff7b45..23ce2b24 100644 --- a/test/fixtures/test_grammars/indirect_recursion_in_transitions/grammar.js +++ b/test/fixtures/test_grammars/indirect_recursion_in_transitions/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'indirect_recursive_in_single_symbol_transitions', rules: { source_file: $ => repeat($._statement), diff --git a/test/fixtures/test_grammars/inline_rules/grammar.js b/test/fixtures/test_grammars/inline_rules/grammar.js index 4477097d..c8f3275c 100644 --- a/test/fixtures/test_grammars/inline_rules/grammar.js +++ b/test/fixtures/test_grammars/inline_rules/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: "inline_rules", extras: $ => [/\s/], diff --git a/test/fixtures/test_grammars/inlined_aliased_rules/grammar.js b/test/fixtures/test_grammars/inlined_aliased_rules/grammar.js index 8578659b..84612330 100644 --- a/test/fixtures/test_grammars/inlined_aliased_rules/grammar.js +++ b/test/fixtures/test_grammars/inlined_aliased_rules/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: "inlined_aliased_rules", extras: $ => [/\s/], diff --git a/test/fixtures/test_grammars/inverted_external_token/grammar.js b/test/fixtures/test_grammars/inverted_external_token/grammar.js index 3530d0db..e1d78b89 100644 --- a/test/fixtures/test_grammars/inverted_external_token/grammar.js +++ b/test/fixtures/test_grammars/inverted_external_token/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: "inverted_external_token", externals: $ => [$.line_break], diff --git a/test/fixtures/test_grammars/invisible_start_rule/grammar.js b/test/fixtures/test_grammars/invisible_start_rule/grammar.js index 4afa4d66..d9fdf6f5 100644 --- a/test/fixtures/test_grammars/invisible_start_rule/grammar.js +++ b/test/fixtures/test_grammars/invisible_start_rule/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: "invisible_start_rule", rules: { _value: $ => choice($.a, $.b), diff --git a/test/fixtures/test_grammars/lexical_conflicts_due_to_state_merging/grammar.js b/test/fixtures/test_grammars/lexical_conflicts_due_to_state_merging/grammar.js index 4868dc81..2dc3639b 100644 --- a/test/fixtures/test_grammars/lexical_conflicts_due_to_state_merging/grammar.js +++ b/test/fixtures/test_grammars/lexical_conflicts_due_to_state_merging/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'lexical_conflicts_due_to_state_merging', rules: { diff --git a/test/fixtures/test_grammars/named_precedences/grammar.js b/test/fixtures/test_grammars/named_precedences/grammar.js index 2132385b..52c767c5 100644 --- a/test/fixtures/test_grammars/named_precedences/grammar.js +++ b/test/fixtures/test_grammars/named_precedences/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'named_precedences', conflicts: $ => [ diff --git a/test/fixtures/test_grammars/named_rule_aliased_as_anonymous/grammar.js b/test/fixtures/test_grammars/named_rule_aliased_as_anonymous/grammar.js index 3f30de56..6bc56822 100644 --- a/test/fixtures/test_grammars/named_rule_aliased_as_anonymous/grammar.js +++ b/test/fixtures/test_grammars/named_rule_aliased_as_anonymous/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'named_rule_aliased_as_anonymous', rules: { diff --git a/test/fixtures/test_grammars/nested_inlined_rules/grammar.js b/test/fixtures/test_grammars/nested_inlined_rules/grammar.js index 7aaf601b..3ca4d264 100644 --- a/test/fixtures/test_grammars/nested_inlined_rules/grammar.js +++ b/test/fixtures/test_grammars/nested_inlined_rules/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'nested_inlined_rules', inline: $ => [ diff --git a/test/fixtures/test_grammars/next_sibling_from_zwt/grammar.js b/test/fixtures/test_grammars/next_sibling_from_zwt/grammar.js index 39c3c0ef..f9a31c44 100644 --- a/test/fixtures/test_grammars/next_sibling_from_zwt/grammar.js +++ b/test/fixtures/test_grammars/next_sibling_from_zwt/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: "next_sibling_from_zwt", extras: $ => [ /\s|\\\r?\n/, diff --git a/test/fixtures/test_grammars/partially_resolved_conflict/grammar.js b/test/fixtures/test_grammars/partially_resolved_conflict/grammar.js index cd0d1d65..23b11167 100644 --- a/test/fixtures/test_grammars/partially_resolved_conflict/grammar.js +++ b/test/fixtures/test_grammars/partially_resolved_conflict/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'partially_resolved_conflict', rules: { diff --git a/test/fixtures/test_grammars/precedence_on_single_child_missing/grammar.js b/test/fixtures/test_grammars/precedence_on_single_child_missing/grammar.js index fbdb450f..0c9c1b45 100644 --- a/test/fixtures/test_grammars/precedence_on_single_child_missing/grammar.js +++ b/test/fixtures/test_grammars/precedence_on_single_child_missing/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'precedence_on_single_child_missing', rules: { diff --git a/test/fixtures/test_grammars/precedence_on_single_child_negative/grammar.js b/test/fixtures/test_grammars/precedence_on_single_child_negative/grammar.js index 798075db..6d9ea114 100644 --- a/test/fixtures/test_grammars/precedence_on_single_child_negative/grammar.js +++ b/test/fixtures/test_grammars/precedence_on_single_child_negative/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'precedence_on_single_child_negative', rules: { diff --git a/test/fixtures/test_grammars/precedence_on_single_child_positive/grammar.js b/test/fixtures/test_grammars/precedence_on_single_child_positive/grammar.js index d2e57c30..0492f0ac 100644 --- a/test/fixtures/test_grammars/precedence_on_single_child_positive/grammar.js +++ b/test/fixtures/test_grammars/precedence_on_single_child_positive/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'precedence_on_single_child_positive', rules: { diff --git a/test/fixtures/test_grammars/precedence_on_subsequence/grammar.js b/test/fixtures/test_grammars/precedence_on_subsequence/grammar.js index 3a5bdefb..f6caad5e 100644 --- a/test/fixtures/test_grammars/precedence_on_subsequence/grammar.js +++ b/test/fixtures/test_grammars/precedence_on_subsequence/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'precedence_on_subsequence', rules: { diff --git a/test/fixtures/test_grammars/precedence_on_token/grammar.js b/test/fixtures/test_grammars/precedence_on_token/grammar.js index e56f2d81..67a0b9bf 100644 --- a/test/fixtures/test_grammars/precedence_on_token/grammar.js +++ b/test/fixtures/test_grammars/precedence_on_token/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'precedence_on_token', extras: $ => [ diff --git a/test/fixtures/test_grammars/readme_grammar/grammar.js b/test/fixtures/test_grammars/readme_grammar/grammar.js index a24878df..0547df4c 100644 --- a/test/fixtures/test_grammars/readme_grammar/grammar.js +++ b/test/fixtures/test_grammars/readme_grammar/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'readme_grammar', // Things that can appear anywhere in the language, like comments diff --git a/test/fixtures/test_grammars/reserved_words/grammar.js b/test/fixtures/test_grammars/reserved_words/grammar.js index 67d0253e..74c88eea 100644 --- a/test/fixtures/test_grammars/reserved_words/grammar.js +++ b/test/fixtures/test_grammars/reserved_words/grammar.js @@ -1,7 +1,7 @@ const RESERVED_NAMES = ["if", "while", "var"]; const RESERVED_PROPERTY_NAMES = ["var"]; -module.exports = grammar({ +export default grammar({ name: "reserved_words", reserved: { diff --git a/test/fixtures/test_grammars/start_rule_is_blank/grammar.js b/test/fixtures/test_grammars/start_rule_is_blank/grammar.js index b38e0de0..6fa28ae5 100644 --- a/test/fixtures/test_grammars/start_rule_is_blank/grammar.js +++ b/test/fixtures/test_grammars/start_rule_is_blank/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'start_rule_is_blank', rules: { diff --git a/test/fixtures/test_grammars/start_rule_is_token/grammar.js b/test/fixtures/test_grammars/start_rule_is_token/grammar.js index f00433ea..05742687 100644 --- a/test/fixtures/test_grammars/start_rule_is_token/grammar.js +++ b/test/fixtures/test_grammars/start_rule_is_token/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'start_rule_is_token', rules: { diff --git a/test/fixtures/test_grammars/unicode_classes/grammar.js b/test/fixtures/test_grammars/unicode_classes/grammar.js index 25dcf13d..2aafdea4 100644 --- a/test/fixtures/test_grammars/unicode_classes/grammar.js +++ b/test/fixtures/test_grammars/unicode_classes/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'unicode_classes', rules: { diff --git a/test/fixtures/test_grammars/unused_rules/grammar.js b/test/fixtures/test_grammars/unused_rules/grammar.js index 462243c8..78020419 100644 --- a/test/fixtures/test_grammars/unused_rules/grammar.js +++ b/test/fixtures/test_grammars/unused_rules/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'unused_rules', rules: { diff --git a/test/fixtures/test_grammars/uses_current_column/grammar.js b/test/fixtures/test_grammars/uses_current_column/grammar.js index 795ad597..1e93f06b 100644 --- a/test/fixtures/test_grammars/uses_current_column/grammar.js +++ b/test/fixtures/test_grammars/uses_current_column/grammar.js @@ -1,4 +1,4 @@ -module.exports = grammar({ +export default grammar({ name: 'uses_current_column', externals: $ => [ From fd68c02072748313800af9c1e4367a4932d904ac Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Mon, 15 Sep 2025 19:15:23 -0400 Subject: [PATCH 455/663] fix(init): add missing quote in replacement --- crates/cli/src/init.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index 34318368..d6a554be 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -299,7 +299,7 @@ pub fn generate_grammar_files( |path| { let mut contents = fs::read_to_string(path)? .replace( - r#""node-addon-api": "^8.3.1"#, + r#""node-addon-api": "^8.3.1""#, r#""node-addon-api": "^8.5.0""#, ) .replace( From 0269357c5a3535f973079d2a02318bd531c9d01c Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sun, 14 Sep 2025 06:41:59 -0400 Subject: [PATCH 456/663] feat(generate): allow more characters for keywords --- crates/generate/src/build_tables.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/crates/generate/src/build_tables.rs b/crates/generate/src/build_tables.rs index f5709419..ea61834d 100644 --- a/crates/generate/src/build_tables.rs +++ b/crates/generate/src/build_tables.rs @@ -334,7 +334,7 @@ fn identify_keywords( .enumerate() .filter_map(|(i, variable)| { cursor.reset(vec![variable.start_state]); - if all_chars_are_alphabetical(&cursor) + if all_chars_are_valid_for_keywords(&cursor) && token_conflict_map.does_match_same_string(i, word_token.index) && !token_conflict_map.does_match_different_string(i, word_token.index) { @@ -531,12 +531,17 @@ fn report_state_info<'a>( } } -fn all_chars_are_alphabetical(cursor: &NfaCursor) -> bool { +/// This definition should match the set of characters that are typically +/// allowed in programming language keywords. Note that it is provisional, +/// and can be adjusted if necessary. +fn all_chars_are_valid_for_keywords(cursor: &NfaCursor) -> bool { cursor.transition_chars().all(|(chars, is_sep)| { if is_sep { true } else { - chars.chars().all(|c| c.is_alphabetic() || c == '_') + chars + .chars() + .all(|c| c.is_alphanumeric() || "_!@#$-:.?/`".contains(c)) } }) } From 9593737871708e62329fba79d695f8f0f45482ae Mon Sep 17 00:00:00 2001 From: bbb651 Date: Mon, 13 Jan 2025 01:07:07 +0200 Subject: [PATCH 457/663] build(generate): remove `tree-sitter` dependency It was only used to share two constants, and balloons its dependencies. This also makes `generate_parser_for_grammar` work in wasm. (Tested in `wasm32-wasip2` in wasmtime with the json grammar, `wasm32-unknown-unknown` running in the same setup exited successfully so I'm pretty confident it works as well) Co-authored-by: Amaan Qureshi --- .cargo/config.toml | 4 ++++ Cargo.lock | 1 - crates/generate/Cargo.toml | 2 -- crates/generate/build.rs | 11 +++++++++++ crates/generate/src/generate.rs | 7 +++++-- crates/generate/src/render.rs | 3 ++- 6 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 crates/generate/build.rs diff --git a/.cargo/config.toml b/.cargo/config.toml index 35049cbc..549ae022 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,2 +1,6 @@ [alias] xtask = "run --package xtask --" + +[env] +# See: https://github.com/rust-lang/cargo/issues/3946#issuecomment-973132993 +CARGO_WORKSPACE_DIR = { value = "", relative = true } diff --git a/Cargo.lock b/Cargo.lock index 0476d424..4458254d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2014,7 +2014,6 @@ dependencies = [ "tempfile", "thiserror 2.0.16", "topological-sort", - "tree-sitter", "url", ] diff --git a/crates/generate/Cargo.toml b/crates/generate/Cargo.toml index 1a296229..23eba6d8 100644 --- a/crates/generate/Cargo.toml +++ b/crates/generate/Cargo.toml @@ -47,8 +47,6 @@ smallbitvec.workspace = true thiserror.workspace = true topological-sort.workspace = true -tree-sitter.workspace = true - [target.'cfg(windows)'.dependencies] url = { workspace = true, optional = true } diff --git a/crates/generate/build.rs b/crates/generate/build.rs new file mode 100644 index 00000000..bbe8a4fa --- /dev/null +++ b/crates/generate/build.rs @@ -0,0 +1,11 @@ +use std::{env, fs, path::PathBuf}; + +fn main() { + // This will always be ran in CI before publishing. + // We don't use a symlink for windows compatibility. + fs::copy( + concat!(env!("CARGO_WORKSPACE_DIR"), "lib/src/parser.h"), + PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR should be set")).join("parser.h"), + ) + .expect("failed to copy parser.h template"); +} diff --git a/crates/generate/src/generate.rs b/crates/generate/src/generate.rs index 800a0319..6d846198 100644 --- a/crates/generate/src/generate.rs +++ b/crates/generate/src/generate.rs @@ -65,8 +65,11 @@ struct GeneratedParser { node_types_json: String, } +const LANGUAGE_VERSION: usize = 15; + pub const ALLOC_HEADER: &str = include_str!("templates/alloc.h"); pub const ARRAY_HEADER: &str = include_str!("templates/array.h"); +pub const PARSER_HEADER: &str = include_str!(concat!(env!("OUT_DIR"), "/parser.h")); pub type GenerateResult = Result; @@ -271,7 +274,7 @@ where fs::create_dir_all(&header_path)?; write_file(&header_path.join("alloc.h"), ALLOC_HEADER)?; write_file(&header_path.join("array.h"), ARRAY_HEADER)?; - write_file(&header_path.join("parser.h"), tree_sitter::PARSER_HEADER)?; + write_file(&header_path.join("parser.h"), PARSER_HEADER)?; Ok(()) } @@ -284,7 +287,7 @@ pub fn generate_parser_for_grammar( let input_grammar = parse_grammar(&grammar_json)?; let parser = generate_parser_for_grammar_with_opts( &input_grammar, - tree_sitter::LANGUAGE_VERSION, + LANGUAGE_VERSION, semantic_version, None, )?; diff --git a/crates/generate/src/render.rs b/crates/generate/src/render.rs index d08ccc47..826d0919 100644 --- a/crates/generate/src/render.rs +++ b/crates/generate/src/render.rs @@ -5,6 +5,7 @@ use std::{ mem::swap, }; +use crate::LANGUAGE_VERSION; use indoc::indoc; use super::{ @@ -21,7 +22,7 @@ use super::{ const SMALL_STATE_THRESHOLD: usize = 64; pub const ABI_VERSION_MIN: usize = 14; -pub const ABI_VERSION_MAX: usize = tree_sitter::LANGUAGE_VERSION; +pub const ABI_VERSION_MAX: usize = LANGUAGE_VERSION; const ABI_VERSION_WITH_RESERVED_WORDS: usize = 15; const BUILD_VERSION: &str = env!("CARGO_PKG_VERSION"); From 070b91628f0bbb7827643dfcbef33823f3443e88 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Tue, 16 Sep 2025 03:07:35 -0400 Subject: [PATCH 458/663] fix(rust): appease clippy --- crates/cli/src/tests/async_context_test.rs | 2 +- crates/cli/src/tree_sitter_cli.rs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/cli/src/tests/async_context_test.rs b/crates/cli/src/tests/async_context_test.rs index fbcc5c30..48849bd2 100644 --- a/crates/cli/src/tests/async_context_test.rs +++ b/crates/cli/src/tests/async_context_test.rs @@ -263,7 +263,7 @@ impl JoinHandle { Self { data: Some(data) } } - fn join(&mut self) -> T { + const fn join(&mut self) -> T { self.data.take().unwrap() } } diff --git a/crates/cli/src/tree_sitter_cli.rs b/crates/cli/src/tree_sitter_cli.rs index 7eaa2d35..3960d961 100644 --- a/crates/cli/src/tree_sitter_cli.rs +++ b/crates/cli/src/tree_sitter_cli.rs @@ -20,6 +20,5 @@ pub mod wasm; #[cfg(test)] mod tests; -// To run compile fail tests #[cfg(doctest)] mod tests; From c54bc441ba49e89d928f0efe735d1b07736e953f Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Tue, 16 Sep 2025 03:08:01 -0400 Subject: [PATCH 459/663] fix(test): include failing test's path in error message This helps when an empty folder was left behind in the corpus directory --- crates/cli/src/tests/corpus_test.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/crates/cli/src/tests/corpus_test.rs b/crates/cli/src/tests/corpus_test.rs index 6d272f51..1ef63b31 100644 --- a/crates/cli/src/tests/corpus_test.rs +++ b/crates/cli/src/tests/corpus_test.rs @@ -1,5 +1,6 @@ use std::{collections::HashMap, env, fs}; +use anyhow::Context; use tree_sitter::Parser; use tree_sitter_proc_macro::test_with_seed; @@ -363,7 +364,14 @@ fn test_feature_corpus_files() { grammar_path = test_path.join("grammar.json"); } let error_message_path = test_path.join("expected_error.txt"); - let grammar_json = tree_sitter_generate::load_grammar_file(&grammar_path, None).unwrap(); + let grammar_json = tree_sitter_generate::load_grammar_file(&grammar_path, None) + .with_context(|| { + format!( + "Could not load grammar file for test language '{language_name}' at {}", + grammar_path.display() + ) + }) + .unwrap(); let generate_result = tree_sitter_generate::generate_parser_for_grammar(&grammar_json, Some((0, 0, 0))); From 31ff62445bd017ddc4fed5547e5e75248f4649d6 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Tue, 16 Sep 2025 03:23:22 -0400 Subject: [PATCH 460/663] fix(generate): assert there is a Nfa last state before retrieving it Prevents unsigned subtraction wrapping antics in release builds --- crates/generate/src/nfa.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/generate/src/nfa.rs b/crates/generate/src/nfa.rs index 9a63cb97..eecbc40b 100644 --- a/crates/generate/src/nfa.rs +++ b/crates/generate/src/nfa.rs @@ -434,6 +434,7 @@ impl Nfa { } pub fn last_state_id(&self) -> u32 { + assert!(!self.states.is_empty()); self.states.len() as u32 - 1 } } From 339bad2de4696e79aaec629b9ef569f7b0b22f0e Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Tue, 16 Sep 2025 10:53:54 +0200 Subject: [PATCH 461/663] feat(generate): don't embed tree-sitter CLI version in parser Problem: embedding the CLI version used to generate a parser triggers CI failures on all grammars for every (patch) release of tree-sitter, even if there are no actual parser changes. Solution: do not embed the version; instead rely on whether the update introduces actual (presumably desirable) changes in the parser to indicate regeneration is necessary. --- crates/generate/src/render.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/crates/generate/src/render.rs b/crates/generate/src/render.rs index 826d0919..e4aea008 100644 --- a/crates/generate/src/render.rs +++ b/crates/generate/src/render.rs @@ -24,7 +24,6 @@ const SMALL_STATE_THRESHOLD: usize = 64; pub const ABI_VERSION_MIN: usize = 14; pub const ABI_VERSION_MAX: usize = LANGUAGE_VERSION; const ABI_VERSION_WITH_RESERVED_WORDS: usize = 15; -const BUILD_VERSION: &str = env!("CARGO_PKG_VERSION"); #[clippy::format_args] macro_rules! add { @@ -324,10 +323,7 @@ impl Generator { } fn add_header(&mut self) { - add_line!( - self, - "/* Automatically @generated by tree-sitter v{BUILD_VERSION} */", - ); + add_line!(self, "/* Automatically @generated by tree-sitter */",); add_line!(self, ""); } From 57c6105897678b5b379cd8ef195ca491e090092d Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Tue, 16 Sep 2025 06:00:33 -0400 Subject: [PATCH 462/663] fix(generate): remove warning message for CJS grammars --- crates/generate/src/generate.rs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/crates/generate/src/generate.rs b/crates/generate/src/generate.rs index 6d846198..3c3a067b 100644 --- a/crates/generate/src/generate.rs +++ b/crates/generate/src/generate.rs @@ -431,15 +431,6 @@ pub fn load_grammar_file( fn load_js_grammar_file(grammar_path: &Path, js_runtime: Option<&str>) -> JSResult { let grammar_path = fs::canonicalize(grammar_path)?; - let grammar_uses_commonjs = fs::read_to_string(&grammar_path)?.contains("module.exports"); - if grammar_uses_commonjs { - eprintln!("Warning: Your grammar.js uses CommonJS."); - eprintln!("Consider migrating to ES modules (export default) for better compatibility."); - eprintln!( - "See: https://tree-sitter.github.io/tree-sitter/creating-parsers/#the-grammar-file" - ); - } - #[cfg(windows)] let grammar_path = url::Url::from_file_path(grammar_path) .expect("Failed to convert path to URL") From 04cfee5664c1f8104e699cccbe498677862762a3 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Tue, 16 Sep 2025 18:13:41 -0400 Subject: [PATCH 463/663] build(rust): remove unused dependencies --- Cargo.lock | 50 ---------------------- Cargo.toml | 3 -- crates/cli/Cargo.toml | 7 --- crates/cli/src/tests/proc_macro/Cargo.toml | 1 - crates/generate/Cargo.toml | 1 - crates/loader/Cargo.toml | 1 - crates/xtask/Cargo.toml | 2 - 7 files changed, 65 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4458254d..0e9f51b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -650,18 +650,6 @@ dependencies = [ "windows-sys 0.60.2", ] -[[package]] -name = "filetime" -version = "0.2.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" -dependencies = [ - "cfg-if", - "libc", - "libredox", - "windows-sys 0.60.2", -] - [[package]] name = "find-msvc-tools" version = "0.1.1" @@ -1078,17 +1066,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" -[[package]] -name = "libredox" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" -dependencies = [ - "bitflags 2.9.4", - "libc", - "redox_syscall", -] - [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -1269,12 +1246,6 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" -[[package]] -name = "path-slash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" - [[package]] name = "pathdiff" version = "0.2.3" @@ -1454,15 +1425,6 @@ dependencies = [ "getrandom 0.2.16", ] -[[package]] -name = "redox_syscall" -version = "0.5.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" -dependencies = [ - "bitflags 2.9.4", -] - [[package]] name = "regalloc2" version = "0.12.2" @@ -1945,29 +1907,22 @@ dependencies = [ "ctrlc", "dialoguer", "encoding_rs", - "filetime", "glob", "heck", "html-escape", - "indexmap", "indoc", "log", "memchr", "pretty_assertions", "rand", "regex", - "regex-syntax", - "rustc-hash 2.1.1", "semver", "serde", - "serde_derive", "serde_json", "similar", - "smallbitvec", "streaming-iterator", "tempfile", "tiny_http", - "topological-sort", "tree-sitter", "tree-sitter-config", "tree-sitter-generate", @@ -1998,7 +1953,6 @@ name = "tree-sitter-generate" version = "0.26.0" dependencies = [ "anyhow", - "heck", "indexmap", "indoc", "log", @@ -2042,7 +1996,6 @@ dependencies = [ "indoc", "libloading", "once_cell", - "path-slash", "regex", "semver", "serde", @@ -2071,7 +2024,6 @@ version = "0.0.0" dependencies = [ "proc-macro2", "quote", - "rand", "syn", ] @@ -2781,14 +2733,12 @@ dependencies = [ "anstyle", "anyhow", "bindgen 0.72.1", - "cc", "clap", "indoc", "notify", "notify-debouncer-full", "regex", "semver", - "serde", "serde_json", ] diff --git a/Cargo.toml b/Cargo.toml index 43e3b41c..c30b8f02 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -121,7 +121,6 @@ ctor = "0.2.9" ctrlc = { version = "3.5.0", features = ["termination"] } dialoguer = { version = "0.11.0", features = ["fuzzy-select"] } etcetera = "0.10.0" -filetime = "0.2.26" fs4 = "0.12.0" glob = "0.3.3" heck = "0.5.0" @@ -132,7 +131,6 @@ libloading = "0.8.8" log = { version = "0.4.28", features = ["std"] } memchr = "2.7.5" once_cell = "1.21.3" -path-slash = "0.2.1" pretty_assertions = "1.4.1" rand = "0.8.5" regex = "1.11.2" @@ -140,7 +138,6 @@ regex-syntax = "0.8.6" rustc-hash = "2.1.1" semver = { version = "1.0.27", features = ["serde"] } serde = { version = "1.0.219", features = ["derive"] } -serde_derive = "1.0.217" serde_json = { version = "1.0.145", features = ["preserve_order"] } similar = "2.7.0" smallbitvec = "2.6.0" diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 741e8b42..677154ee 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -45,27 +45,20 @@ clap_complete_nushell.workspace = true ctor.workspace = true ctrlc.workspace = true dialoguer.workspace = true -filetime.workspace = true glob.workspace = true heck.workspace = true html-escape.workspace = true -indexmap.workspace = true indoc.workspace = true log.workspace = true memchr.workspace = true rand.workspace = true regex.workspace = true -regex-syntax.workspace = true -rustc-hash.workspace = true semver.workspace = true serde.workspace = true -serde_derive.workspace = true serde_json.workspace = true similar.workspace = true -smallbitvec.workspace = true streaming-iterator.workspace = true tiny_http.workspace = true -topological-sort.workspace = true url.workspace = true walkdir.workspace = true wasmparser.workspace = true diff --git a/crates/cli/src/tests/proc_macro/Cargo.toml b/crates/cli/src/tests/proc_macro/Cargo.toml index e834383b..915bd172 100644 --- a/crates/cli/src/tests/proc_macro/Cargo.toml +++ b/crates/cli/src/tests/proc_macro/Cargo.toml @@ -14,5 +14,4 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.93" quote = "1.0.38" -rand = "0.8.5" syn = { version = "2.0.96", features = ["full"] } diff --git a/crates/generate/Cargo.toml b/crates/generate/Cargo.toml index 23eba6d8..ee2b0632 100644 --- a/crates/generate/Cargo.toml +++ b/crates/generate/Cargo.toml @@ -26,7 +26,6 @@ qjs-rt = ["load", "rquickjs", "pathdiff"] [dependencies] anyhow.workspace = true -heck.workspace = true indexmap.workspace = true indoc.workspace = true log.workspace = true diff --git a/crates/loader/Cargo.toml b/crates/loader/Cargo.toml index 3d2146f8..272a1295 100644 --- a/crates/loader/Cargo.toml +++ b/crates/loader/Cargo.toml @@ -35,7 +35,6 @@ fs4.workspace = true indoc.workspace = true libloading.workspace = true once_cell.workspace = true -path-slash.workspace = true regex.workspace = true semver.workspace = true serde.workspace = true diff --git a/crates/xtask/Cargo.toml b/crates/xtask/Cargo.toml index b5d1bf6a..607d64ad 100644 --- a/crates/xtask/Cargo.toml +++ b/crates/xtask/Cargo.toml @@ -18,12 +18,10 @@ workspace = true anstyle.workspace = true anyhow.workspace = true bindgen = { version = "0.72.0" } -cc.workspace = true clap.workspace = true indoc.workspace = true regex.workspace = true semver.workspace = true -serde.workspace = true serde_json.workspace = true notify = "8.2.0" notify-debouncer-full = "0.6.0" From 317e2e74c2764f491610f2cf6950e1a4274dd931 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Wed, 17 Sep 2025 01:44:57 -0400 Subject: [PATCH 464/663] Revert "feat(generate): allow more characters for keywords" This reverts commit 0269357c5a3535f973079d2a02318bd531c9d01c. --- crates/generate/src/build_tables.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/crates/generate/src/build_tables.rs b/crates/generate/src/build_tables.rs index ea61834d..f5709419 100644 --- a/crates/generate/src/build_tables.rs +++ b/crates/generate/src/build_tables.rs @@ -334,7 +334,7 @@ fn identify_keywords( .enumerate() .filter_map(|(i, variable)| { cursor.reset(vec![variable.start_state]); - if all_chars_are_valid_for_keywords(&cursor) + if all_chars_are_alphabetical(&cursor) && token_conflict_map.does_match_same_string(i, word_token.index) && !token_conflict_map.does_match_different_string(i, word_token.index) { @@ -531,17 +531,12 @@ fn report_state_info<'a>( } } -/// This definition should match the set of characters that are typically -/// allowed in programming language keywords. Note that it is provisional, -/// and can be adjusted if necessary. -fn all_chars_are_valid_for_keywords(cursor: &NfaCursor) -> bool { +fn all_chars_are_alphabetical(cursor: &NfaCursor) -> bool { cursor.transition_chars().all(|(chars, is_sep)| { if is_sep { true } else { - chars - .chars() - .all(|c| c.is_alphanumeric() || "_!@#$-:.?/`".contains(c)) + chars.chars().all(|c| c.is_alphabetic() || c == '_') } }) } From db0d05fab34110e0630e82a28dc6a3048b50b5ea Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Wed, 17 Sep 2025 01:45:05 -0400 Subject: [PATCH 465/663] ci: fix cache paths --- .github/actions/cache/action.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/actions/cache/action.yml b/.github/actions/cache/action.yml index 12d3d7b3..f04dda31 100644 --- a/.github/actions/cache/action.yml +++ b/.github/actions/cache/action.yml @@ -17,10 +17,9 @@ runs: test/fixtures/grammars target/release/tree-sitter-*.wasm key: fixtures-${{ join(matrix.*, '_') }}-${{ hashFiles( - 'cli/generate/src/**', + 'crates/generate/src/**', 'lib/src/parser.h', 'lib/src/array.h', 'lib/src/alloc.h', - 'xtask/src/*', 'test/fixtures/grammars/*/**/src/*.c', '.github/actions/cache/action.yml') }} From 6a28a6236931de682f665bbc1d957afa423f93fc Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Wed, 17 Sep 2025 00:05:46 -0400 Subject: [PATCH 466/663] test: add safety checks to ensure langauge version constants are kept in sync The generate crate defines the `LANGUAGE_VERSION` constant separately from the TREE_SITTER_LANGUAGE_VERSION definition in `api.h`. --- crates/generate/src/generate.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/crates/generate/src/generate.rs b/crates/generate/src/generate.rs index 3c3a067b..cf8a8dd5 100644 --- a/crates/generate/src/generate.rs +++ b/crates/generate/src/generate.rs @@ -65,6 +65,8 @@ struct GeneratedParser { node_types_json: String, } +// NOTE: This constant must be kept in sync with the definition of +// `TREE_SITTER_LANGUAGE_VERSION` in `lib/include/tree_sitter/api.h`. const LANGUAGE_VERSION: usize = 15; pub const ALLOC_HEADER: &str = include_str!("templates/alloc.h"); @@ -532,3 +534,21 @@ pub fn write_file(path: &Path, body: impl AsRef<[u8]>) -> GenerateResult<()> { fs::write(path, body) .map_err(|e| GenerateError::IO(format!("Failed to write {:?} -- {e}", path.file_name()))) } + +#[cfg(test)] +mod tests { + use super::LANGUAGE_VERSION; + #[test] + fn the_language_versions_are_in_sync() { + let api_h = include_str!("../../../lib/include/tree_sitter/api.h"); + let api_language_version = api_h + .lines() + .find_map(|line| { + line.trim() + .strip_prefix("#define TREE_SITTER_LANGUAGE_VERSION ") + .and_then(|v| v.parse::().ok()) + }) + .expect("Failed to find TREE_SITTER_LANGUAGE_VERSION definition in api.h"); + assert_eq!(LANGUAGE_VERSION, api_language_version); + } +} From 46ea65c89b89ef5af6765c2f29131ecd72233b08 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Tue, 16 Sep 2025 21:42:42 -0400 Subject: [PATCH 467/663] refactor: remove url dependency --- Cargo.lock | 10 +++++++--- Cargo.toml | 1 - crates/cli/Cargo.toml | 1 - crates/cli/src/init.rs | 15 +++++---------- crates/cli/src/main.rs | 31 ++++--------------------------- crates/generate/Cargo.toml | 6 ++---- crates/generate/src/generate.rs | 12 ++++++------ crates/generate/src/quickjs.rs | 12 +++--------- crates/loader/Cargo.toml | 1 - crates/loader/src/loader.rs | 5 ++--- 10 files changed, 29 insertions(+), 65 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0e9f51b3..f5512195 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -569,6 +569,12 @@ dependencies = [ "syn", ] +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "either" version = "1.15.0" @@ -1931,7 +1937,6 @@ dependencies = [ "tree-sitter-tags", "tree-sitter-tests-proc-macro", "unindent", - "url", "walkdir", "wasmparser", "webbrowser", @@ -1953,6 +1958,7 @@ name = "tree-sitter-generate" version = "0.26.0" dependencies = [ "anyhow", + "dunce", "indexmap", "indoc", "log", @@ -1968,7 +1974,6 @@ dependencies = [ "tempfile", "thiserror 2.0.16", "topological-sort", - "url", ] [[package]] @@ -2004,7 +2009,6 @@ dependencies = [ "tree-sitter", "tree-sitter-highlight", "tree-sitter-tags", - "url", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index c30b8f02..6dd66122 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -147,7 +147,6 @@ thiserror = "2.0.16" tiny_http = "0.12.0" topological-sort = "0.2.2" unindent = "0.2.4" -url = { version = "2.5.4", features = ["serde"] } walkdir = "2.5.0" wasmparser = "0.229.0" webbrowser = "1.0.5" diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 677154ee..b8ac8222 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -59,7 +59,6 @@ serde_json.workspace = true similar.workspace = true streaming-iterator.workspace = true tiny_http.workspace = true -url.workspace = true walkdir.workspace = true wasmparser.workspace = true webbrowser.workspace = true diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index d6a554be..2294b82b 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -12,7 +12,6 @@ use serde::{Deserialize, Serialize}; use serde_json::{Map, Value}; use tree_sitter_generate::write_file; use tree_sitter_loader::{Author, Bindings, Grammar, Links, Metadata, PathsJSON, TreeSitterJSON}; -use url::Url; const CLI_VERSION: &str = env!("CARGO_PKG_VERSION"); const CLI_VERSION_PLACEHOLDER: &str = "CLI_VERSION"; @@ -110,9 +109,9 @@ pub struct JsonConfigOpts { pub title: String, pub description: String, #[serde(skip_serializing_if = "Option::is_none")] - pub repository: Option, + pub repository: Option, #[serde(skip_serializing_if = "Option::is_none")] - pub funding: Option, + pub funding: Option, pub scope: String, pub file_types: Vec, pub version: Version, @@ -121,7 +120,7 @@ pub struct JsonConfigOpts { #[serde(skip_serializing_if = "Option::is_none")] pub email: Option, #[serde(skip_serializing_if = "Option::is_none")] - pub url: Option, + pub url: Option, pub bindings: Bindings, } @@ -158,11 +157,7 @@ impl JsonConfigOpts { }]), links: Some(Links { repository: self.repository.unwrap_or_else(|| { - Url::parse(&format!( - "https://github.com/tree-sitter/tree-sitter-{}", - self.name - )) - .expect("Failed to parse default repository URL") + format!("https://github.com/tree-sitter/tree-sitter-{}", self.name) }), funding: self.funding, }), @@ -277,7 +272,7 @@ pub fn generate_grammar_files( .metadata .links .as_ref() - .and_then(|l| l.funding.as_ref().map(|f| f.as_str())), + .and_then(|l| l.funding.as_deref()), version: &tree_sitter_config.metadata.version, camel_parser_name: &camel_name, title_parser_name: &title_name, diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 960c1f87..b52f8db1 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -34,7 +34,6 @@ use tree_sitter_config::Config; use tree_sitter_highlight::Highlighter; use tree_sitter_loader::{self as loader, Bindings, TreeSitterJSON}; use tree_sitter_tags::TagsContext; -use url::Url; const BUILD_VERSION: &str = env!("CARGO_PKG_VERSION"); const BUILD_SHA: Option<&'static str> = option_env!("BUILD_SHA"); @@ -651,15 +650,10 @@ impl Init { }; let repository = |name: &str| { - Input::::with_theme(&ColorfulTheme::default()) + Input::::with_theme(&ColorfulTheme::default()) .with_prompt("Repository URL") .allow_empty(true) - .default( - Url::parse(&format!( - "https://github.com/tree-sitter/tree-sitter-{name}" - )) - .expect("Failed to parse default repository URL"), - ) + .default(format!("https://github.com/tree-sitter/tree-sitter-{name}")) .show_default(false) .interact_text() }; @@ -668,18 +662,8 @@ impl Init { Input::::with_theme(&ColorfulTheme::default()) .with_prompt("Funding URL") .allow_empty(true) - .validate_with(|input: &String| { - if input.trim().is_empty() - || Url::parse(input) - .is_ok_and(|u| u.scheme() == "http" || u.scheme() == "https") - { - Ok(()) - } else { - Err("The URL must start with 'http://' or 'https://'") - } - }) .interact_text() - .map(|e| (!e.trim().is_empty()).then(|| Url::parse(&e).unwrap())) + .map(|e| Some(e.trim().to_string())) }; let scope = |name: &str| { @@ -746,15 +730,8 @@ impl Init { Input::::with_theme(&ColorfulTheme::default()) .with_prompt("Author URL") .allow_empty(true) - .validate_with(|input: &String| -> Result<(), &str> { - if input.trim().is_empty() || Url::parse(input).is_ok() { - Ok(()) - } else { - Err("This is not a valid URL") - } - }) .interact_text() - .map(|e| (!e.trim().is_empty()).then(|| Url::parse(&e).unwrap())) + .map(|e| Some(e.trim().to_string())) }; let bindings = || { diff --git a/crates/generate/Cargo.toml b/crates/generate/Cargo.toml index ee2b0632..61b1686a 100644 --- a/crates/generate/Cargo.toml +++ b/crates/generate/Cargo.toml @@ -21,11 +21,12 @@ workspace = true [features] default = ["qjs-rt"] -load = ["dep:semver", "dep:url"] +load = ["dep:semver"] qjs-rt = ["load", "rquickjs", "pathdiff"] [dependencies] anyhow.workspace = true +dunce = "1.0.5" indexmap.workspace = true indoc.workspace = true log.workspace = true @@ -46,8 +47,5 @@ smallbitvec.workspace = true thiserror.workspace = true topological-sort.workspace = true -[target.'cfg(windows)'.dependencies] -url = { workspace = true, optional = true } - [dev-dependencies] tempfile.workspace = true diff --git a/crates/generate/src/generate.rs b/crates/generate/src/generate.rs index cf8a8dd5..4ac7f5e7 100644 --- a/crates/generate/src/generate.rs +++ b/crates/generate/src/generate.rs @@ -431,18 +431,18 @@ pub fn load_grammar_file( #[cfg(feature = "load")] fn load_js_grammar_file(grammar_path: &Path, js_runtime: Option<&str>) -> JSResult { - let grammar_path = fs::canonicalize(grammar_path)?; - - #[cfg(windows)] - let grammar_path = url::Url::from_file_path(grammar_path) - .expect("Failed to convert path to URL") - .to_string(); + let grammar_path = dunce::canonicalize(grammar_path)?; #[cfg(feature = "qjs-rt")] if js_runtime == Some("native") { return quickjs::execute_native_runtime(&grammar_path); } + // The "file:///" prefix is incompatible with the quickjs runtime, but is required + // for node and bun + #[cfg(windows)] + let grammar_path = PathBuf::from(format!("file:///{}", grammar_path.display())); + let js_runtime = js_runtime.unwrap_or("node"); let mut js_command = Command::new(js_runtime); diff --git a/crates/generate/src/quickjs.rs b/crates/generate/src/quickjs.rs index 51703de5..1ea7970c 100644 --- a/crates/generate/src/quickjs.rs +++ b/crates/generate/src/quickjs.rs @@ -251,13 +251,7 @@ fn load_module_from_content<'a>( module_obj.get("exports") } -pub fn execute_native_runtime( - #[cfg(windows)] grammar_path: &str, - #[cfg(not(windows))] grammar_path: &Path, -) -> JSResult { - #[cfg(not(windows))] - let grammar_path = grammar_path.to_string_lossy(); - +pub fn execute_native_runtime(grammar_path: &Path) -> JSResult { let runtime = Runtime::new()?; runtime.set_memory_limit(64 * 1024 * 1024); // 64MB @@ -272,7 +266,7 @@ pub fn execute_native_runtime( runtime.set_loader(resolver, loader); let cwd = std::env::current_dir()?; - let relative_path = pathdiff::diff_paths(&*grammar_path, &cwd) + let relative_path = pathdiff::diff_paths(grammar_path, &cwd) .map(|p| p.to_string_lossy().to_string()) .ok_or_else(|| JSError::IO("Failed to get relative path".to_string()))?; @@ -301,7 +295,7 @@ pub fn execute_native_runtime( .or_js_error(&ctx)?; globals.set("module", module).or_js_error(&ctx)?; - let grammar_path_string = grammar_path.to_string(); + let grammar_path_string = grammar_path.to_string_lossy().to_string(); let main_require = Function::new( ctx.clone(), move |ctx_inner, target_path: String| -> rquickjs::Result { diff --git a/crates/loader/Cargo.toml b/crates/loader/Cargo.toml index 272a1295..2bfa2c76 100644 --- a/crates/loader/Cargo.toml +++ b/crates/loader/Cargo.toml @@ -40,7 +40,6 @@ semver.workspace = true serde.workspace = true serde_json.workspace = true tempfile.workspace = true -url.workspace = true tree-sitter = { workspace = true } tree-sitter-highlight = { workspace = true, optional = true } diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index 4ea0475b..b4a28a71 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -36,7 +36,6 @@ use tree_sitter::QueryErrorKind; use tree_sitter_highlight::HighlightConfiguration; #[cfg(feature = "tree-sitter-tags")] use tree_sitter_tags::{Error as TagsError, TagsConfiguration}; -use url::Url; static GRAMMAR_NAME_REGEX: LazyLock = LazyLock::new(|| Regex::new(r#""name":\s*"(.*?)""#).unwrap()); @@ -214,9 +213,9 @@ pub struct Author { #[derive(Serialize, Deserialize)] pub struct Links { - pub repository: Url, + pub repository: String, #[serde(skip_serializing_if = "Option::is_none")] - pub funding: Option, + pub funding: Option, } #[derive(Serialize, Deserialize, Clone)] From 22553b33726ba9b28f94aa8e20d3782cd559771e Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sat, 13 Sep 2025 05:36:32 -0400 Subject: [PATCH 468/663] feat: support compiling to wasm32-unknown-unknown --- crates/cli/src/init.rs | 45 ++- crates/cli/src/templates/build.rs | 18 ++ crates/language/Cargo.toml | 5 +- crates/language/build.rs | 13 + crates/language/wasm/include/assert.h | 14 + crates/language/wasm/include/ctype.h | 8 + crates/language/wasm/include/endian.h | 12 + crates/language/wasm/include/inttypes.h | 8 + crates/language/wasm/include/stdint.h | 40 +++ crates/language/wasm/include/stdio.h | 36 +++ crates/language/wasm/include/stdlib.h | 15 + crates/language/wasm/include/string.h | 16 + crates/language/wasm/include/wctype.h | 168 ++++++++++ crates/language/wasm/src/stdio.c | 304 ++++++++++++++++++ .../language/wasm/src}/stdlib.c | 9 +- crates/language/wasm/src/string.c | 60 ++++ crates/xtask/src/build_wasm.rs | 2 +- lib/Cargo.toml | 2 +- lib/binding_rust/build.rs | 22 ++ lib/src/tree.c | 2 +- 20 files changed, 787 insertions(+), 12 deletions(-) create mode 100644 crates/language/build.rs create mode 100644 crates/language/wasm/include/assert.h create mode 100644 crates/language/wasm/include/ctype.h create mode 100644 crates/language/wasm/include/endian.h create mode 100644 crates/language/wasm/include/inttypes.h create mode 100644 crates/language/wasm/include/stdint.h create mode 100644 crates/language/wasm/include/stdio.h create mode 100644 crates/language/wasm/include/stdlib.h create mode 100644 crates/language/wasm/include/string.h create mode 100644 crates/language/wasm/include/wctype.h create mode 100644 crates/language/wasm/src/stdio.c rename {lib/src/wasm => crates/language/wasm/src}/stdlib.c (97%) create mode 100644 crates/language/wasm/src/string.c diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index 2294b82b..5c5edda3 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -389,9 +389,48 @@ pub fn generate_grammar_files( generate_file(path, LIB_RS_TEMPLATE, language_name, &generate_opts) })?; - missing_path(path.join("build.rs"), |path| { - generate_file(path, BUILD_RS_TEMPLATE, language_name, &generate_opts) - })?; + missing_path_else( + path.join("build.rs"), + allow_update, + |path| generate_file(path, BUILD_RS_TEMPLATE, language_name, &generate_opts), + |path| { + let replacement = indoc!{r#" + c_config.flag("-utf-8"); + + if std::env::var("TARGET").unwrap() == "wasm32-unknown-unknown" { + let Ok(wasm_headers) = std::env::var("DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS") else { + panic!("Environment variable DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS must be set by the language crate"); + }; + let Ok(wasm_src) = + std::env::var("DEP_TREE_SITTER_LANGUAGE_WASM_SRC").map(std::path::PathBuf::from) + else { + panic!("Environment variable DEP_TREE_SITTER_LANGUAGE_WASM_SRC must be set by the language crate"); + }; + + c_config.include(&wasm_headers); + c_config.files([ + wasm_src.join("stdio.c"), + wasm_src.join("stdlib.c"), + wasm_src.join("string.c"), + ]); + } + "#}; + + let indented_replacement = replacement + .lines() + .map(|line| if line.is_empty() { line.to_string() } else { format!(" {line}") }) + .collect::>() + .join("\n"); + + let mut contents = fs::read_to_string(path)?; + if !contents.contains("wasm32-unknown-unknown") { + contents = contents.replace(r#" c_config.flag("-utf-8");"#, &indented_replacement); + } + + write_file(path, contents)?; + Ok(()) + }, + )?; missing_path_else( repo_path.join("Cargo.toml"), diff --git a/crates/cli/src/templates/build.rs b/crates/cli/src/templates/build.rs index 5ef59e52..272d8961 100644 --- a/crates/cli/src/templates/build.rs +++ b/crates/cli/src/templates/build.rs @@ -7,6 +7,24 @@ fn main() { #[cfg(target_env = "msvc")] c_config.flag("-utf-8"); + if std::env::var("TARGET").unwrap() == "wasm32-unknown-unknown" { + let Ok(wasm_headers) = std::env::var("DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS") else { + panic!("Environment variable DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS must be set by the language crate"); + }; + let Ok(wasm_src) = + std::env::var("DEP_TREE_SITTER_LANGUAGE_WASM_SRC").map(std::path::PathBuf::from) + else { + panic!("Environment variable DEP_TREE_SITTER_LANGUAGE_WASM_SRC must be set by the language crate"); + }; + + c_config.include(&wasm_headers); + c_config.files([ + wasm_src.join("stdio.c"), + wasm_src.join("stdlib.c"), + wasm_src.join("string.c"), + ]); + } + let parser_path = src_dir.join("parser.c"); c_config.file(&parser_path); println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap()); diff --git a/crates/language/Cargo.toml b/crates/language/Cargo.toml index 8f64a86d..5b974117 100644 --- a/crates/language/Cargo.toml +++ b/crates/language/Cargo.toml @@ -4,7 +4,7 @@ description = "The tree-sitter Language type, used by the library and by languag version = "0.1.4" authors.workspace = true edition.workspace = true -rust-version = "1.76" +rust-version = "1.77" readme = "README.md" homepage.workspace = true repository.workspace = true @@ -13,6 +13,9 @@ license.workspace = true keywords.workspace = true categories = ["api-bindings", "development-tools::ffi", "parsing"] +build = "build.rs" +links = "tree-sitter-language" + [lints] workspace = true diff --git a/crates/language/build.rs b/crates/language/build.rs new file mode 100644 index 00000000..930b3dff --- /dev/null +++ b/crates/language/build.rs @@ -0,0 +1,13 @@ +fn main() { + if std::env::var("TARGET") + .unwrap_or_default() + .starts_with("wasm32-unknown") + { + let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap(); + let wasm_headers = std::path::Path::new(&manifest_dir).join("wasm/include"); + let wasm_src = std::path::Path::new(&manifest_dir).join("wasm/src"); + + println!("cargo::metadata=wasm-headers={}", wasm_headers.display()); + println!("cargo::metadata=wasm-src={}", wasm_src.display()); + } +} diff --git a/crates/language/wasm/include/assert.h b/crates/language/wasm/include/assert.h new file mode 100644 index 00000000..e981a20e --- /dev/null +++ b/crates/language/wasm/include/assert.h @@ -0,0 +1,14 @@ +#ifndef TREE_SITTER_WASM_ASSERT_H_ +#define TREE_SITTER_WASM_ASSERT_H_ + +#ifdef NDEBUG +#define assert(e) ((void)0) +#else +__attribute__((noreturn)) void __assert_fail(const char *assertion, const char *file, unsigned line, const char *function) { + __builtin_trap(); +} +#define assert(expression) \ + ((expression) ? (void)0 : __assert_fail(#expression, __FILE__, __LINE__, __func__)) +#endif + +#endif // TREE_SITTER_WASM_ASSERT_H_ diff --git a/crates/language/wasm/include/ctype.h b/crates/language/wasm/include/ctype.h new file mode 100644 index 00000000..cea32970 --- /dev/null +++ b/crates/language/wasm/include/ctype.h @@ -0,0 +1,8 @@ +#ifndef TREE_SITTER_WASM_CTYPE_H_ +#define TREE_SITTER_WASM_CTYPE_H_ + +static inline int isprint(int c) { + return c >= 0x20 && c <= 0x7E; +} + +#endif // TREE_SITTER_WASM_CTYPE_H_ diff --git a/crates/language/wasm/include/endian.h b/crates/language/wasm/include/endian.h new file mode 100644 index 00000000..f35a5962 --- /dev/null +++ b/crates/language/wasm/include/endian.h @@ -0,0 +1,12 @@ +#ifndef TREE_SITTER_WASM_ENDIAN_H_ +#define TREE_SITTER_WASM_ENDIAN_H_ + +#define be16toh(x) __builtin_bswap16(x) +#define be32toh(x) __builtin_bswap32(x) +#define be64toh(x) __builtin_bswap64(x) +#define le16toh(x) (x) +#define le32toh(x) (x) +#define le64toh(x) (x) + + +#endif // TREE_SITTER_WASM_ENDIAN_H_ diff --git a/crates/language/wasm/include/inttypes.h b/crates/language/wasm/include/inttypes.h new file mode 100644 index 00000000..f5cccd07 --- /dev/null +++ b/crates/language/wasm/include/inttypes.h @@ -0,0 +1,8 @@ +#ifndef TREE_SITTER_WASM_INTTYPES_H_ +#define TREE_SITTER_WASM_INTTYPES_H_ + +// https://github.com/llvm/llvm-project/blob/0c3cf200f5b918fb5c1114e9f1764c2d54d1779b/libc/include/llvm-libc-macros/inttypes-macros.h#L209 + +#define PRId32 "d" + +#endif // TREE_SITTER_WASM_INTTYPES_H_ diff --git a/crates/language/wasm/include/stdint.h b/crates/language/wasm/include/stdint.h new file mode 100644 index 00000000..5f7cb264 --- /dev/null +++ b/crates/language/wasm/include/stdint.h @@ -0,0 +1,40 @@ +#ifndef TREE_SITTER_WASM_STDINT_H_ +#define TREE_SITTER_WASM_STDINT_H_ + +// https://github.com/llvm/llvm-project/blob/0c3cf200f5b918fb5c1114e9f1764c2d54d1779b/clang/test/Preprocessor/init.c#L1672 + +typedef signed char int8_t; + +typedef short int16_t; + +typedef int int32_t; + +typedef long long int int64_t; + +typedef unsigned char uint8_t; + +typedef unsigned short uint16_t; + +typedef unsigned int uint32_t; + +typedef long long unsigned int uint64_t; + +typedef long unsigned int size_t; + +typedef long unsigned int uintptr_t; + +#define UINT16_MAX 65535 + +#define UINT32_MAX 4294967295U + +#if defined(__wasm32__) + +#define SIZE_MAX 4294967295UL + +#elif defined(__wasm64__) + +#define SIZE_MAX 18446744073709551615UL + +#endif + +#endif // TREE_SITTER_WASM_STDINT_H_ diff --git a/crates/language/wasm/include/stdio.h b/crates/language/wasm/include/stdio.h new file mode 100644 index 00000000..4089cccc --- /dev/null +++ b/crates/language/wasm/include/stdio.h @@ -0,0 +1,36 @@ +#ifndef TREE_SITTER_WASM_STDIO_H_ +#define TREE_SITTER_WASM_STDIO_H_ + +#include +#include + +typedef struct FILE FILE; + +typedef __builtin_va_list va_list; +#define va_start(ap, last) __builtin_va_start(ap, last) +#define va_end(ap) __builtin_va_end(ap) +#define va_arg(ap, type) __builtin_va_arg(ap, type) + +#define stdout ((FILE *)0) + +#define stderr ((FILE *)1) + +#define stdin ((FILE *)2) + +int fclose(FILE *stream); + +FILE *fdopen(int fd, const char *mode); + +int fputc(int c, FILE *stream); + +int fputs(const char *restrict s, FILE *restrict stream); + +size_t fwrite(const void *restrict buffer, size_t size, size_t nmemb, FILE *restrict stream); + +int fprintf(FILE *restrict stream, const char *restrict format, ...); + +int snprintf(char *restrict buffer, size_t buffsz, const char *restrict format, ...); + +int vsnprintf(char *restrict buffer, size_t buffsz, const char *restrict format, va_list vlist); + +#endif // TREE_SITTER_WASM_STDIO_H_ diff --git a/crates/language/wasm/include/stdlib.h b/crates/language/wasm/include/stdlib.h new file mode 100644 index 00000000..2da313ab --- /dev/null +++ b/crates/language/wasm/include/stdlib.h @@ -0,0 +1,15 @@ +#ifndef TREE_SITTER_WASM_STDLIB_H_ +#define TREE_SITTER_WASM_STDLIB_H_ + +#include + +#define NULL ((void*)0) + +void* malloc(size_t); +void* calloc(size_t, size_t); +void free(void*); +void* realloc(void*, size_t); + +__attribute__((noreturn)) void abort(void); + +#endif // TREE_SITTER_WASM_STDLIB_H_ diff --git a/crates/language/wasm/include/string.h b/crates/language/wasm/include/string.h new file mode 100644 index 00000000..2d576f08 --- /dev/null +++ b/crates/language/wasm/include/string.h @@ -0,0 +1,16 @@ +#ifndef TREE_SITTER_WASM_STRING_H_ +#define TREE_SITTER_WASM_STRING_H_ + +#include + +int memcmp(const void *lhs, const void *rhs, size_t count); + +void *memcpy(void *restrict dst, const void *restrict src, size_t size); + +void *memmove(void *dst, const void *src, size_t count); + +void *memset(void *dst, int value, size_t count); + +int strncmp(const char *left, const char *right, size_t n); + +#endif // TREE_SITTER_WASM_STRING_H_ diff --git a/crates/language/wasm/include/wctype.h b/crates/language/wasm/include/wctype.h new file mode 100644 index 00000000..8d1e8c82 --- /dev/null +++ b/crates/language/wasm/include/wctype.h @@ -0,0 +1,168 @@ +#ifndef TREE_SITTER_WASM_WCTYPE_H_ +#define TREE_SITTER_WASM_WCTYPE_H_ + +typedef int wint_t; + +static inline bool iswalpha(wint_t wch) { + switch (wch) { + case L'a': + case L'b': + case L'c': + case L'd': + case L'e': + case L'f': + case L'g': + case L'h': + case L'i': + case L'j': + case L'k': + case L'l': + case L'm': + case L'n': + case L'o': + case L'p': + case L'q': + case L'r': + case L's': + case L't': + case L'u': + case L'v': + case L'w': + case L'x': + case L'y': + case L'z': + case L'A': + case L'B': + case L'C': + case L'D': + case L'E': + case L'F': + case L'G': + case L'H': + case L'I': + case L'J': + case L'K': + case L'L': + case L'M': + case L'N': + case L'O': + case L'P': + case L'Q': + case L'R': + case L'S': + case L'T': + case L'U': + case L'V': + case L'W': + case L'X': + case L'Y': + case L'Z': + return true; + default: + return false; + } +} + +static inline bool iswdigit(wint_t wch) { + switch (wch) { + case L'0': + case L'1': + case L'2': + case L'3': + case L'4': + case L'5': + case L'6': + case L'7': + case L'8': + case L'9': + return true; + default: + return false; + } +} + +static inline bool iswalnum(wint_t wch) { + switch (wch) { + case L'a': + case L'b': + case L'c': + case L'd': + case L'e': + case L'f': + case L'g': + case L'h': + case L'i': + case L'j': + case L'k': + case L'l': + case L'm': + case L'n': + case L'o': + case L'p': + case L'q': + case L'r': + case L's': + case L't': + case L'u': + case L'v': + case L'w': + case L'x': + case L'y': + case L'z': + case L'A': + case L'B': + case L'C': + case L'D': + case L'E': + case L'F': + case L'G': + case L'H': + case L'I': + case L'J': + case L'K': + case L'L': + case L'M': + case L'N': + case L'O': + case L'P': + case L'Q': + case L'R': + case L'S': + case L'T': + case L'U': + case L'V': + case L'W': + case L'X': + case L'Y': + case L'Z': + case L'0': + case L'1': + case L'2': + case L'3': + case L'4': + case L'5': + case L'6': + case L'7': + case L'8': + case L'9': + return true; + default: + return false; + } +} + +static inline bool iswspace(wint_t wch) { + switch (wch) { + case L' ': + case L'\t': + case L'\n': + case L'\v': + case L'\f': + case L'\r': + return true; + default: + return false; + } +} + +#endif // TREE_SITTER_WASM_WCTYPE_H_ diff --git a/crates/language/wasm/src/stdio.c b/crates/language/wasm/src/stdio.c new file mode 100644 index 00000000..3432699a --- /dev/null +++ b/crates/language/wasm/src/stdio.c @@ -0,0 +1,304 @@ +#include + +typedef struct { + bool left_justify; // - + bool zero_pad; // 0 + bool show_sign; // + + bool space_prefix; // ' ' + bool alternate_form; // # +} format_flags_t; + +static const char* parse_format_spec( + const char *format, + int *width, + int *precision, + format_flags_t *flags +) { + *width = 0; + *precision = -1; + flags->left_justify = false; + flags->zero_pad = false; + flags->show_sign = false; + flags->space_prefix = false; + flags->alternate_form = false; + + const char *p = format; + + // Parse flags + while (*p == '-' || *p == '+' || *p == ' ' || *p == '#' || *p == '0') { + switch (*p) { + case '-': flags->left_justify = true; break; + case '0': flags->zero_pad = true; break; + case '+': flags->show_sign = true; break; + case ' ': flags->space_prefix = true; break; + case '#': flags->alternate_form = true; break; + } + p++; + } + + // width + while (*p >= '0' && *p <= '9') { + *width = (*width * 10) + (*p - '0'); + p++; + } + + // precision + if (*p == '.') { + p++; + *precision = 0; + while (*p >= '0' && *p <= '9') { + *precision = (*precision * 10) + (*p - '0'); + p++; + } + } + + return p; +} + +static int int_to_str( + long long value, + char *buffer, + int base, + bool is_signed, + bool uppercase +) { + if (base < 2 || base > 16) return 0; + + const char *digits = uppercase ? "0123456789ABCDEF" : "0123456789abcdef"; + char temp[32]; + int i = 0, len = 0; + bool is_negative = false; + + if (value == 0) { + buffer[0] = '0'; + buffer[1] = '\0'; + return 1; + } + + if (is_signed && value < 0 && base == 10) { + is_negative = true; + value = -value; + } + + unsigned long long uval = (unsigned long long)value; + while (uval > 0) { + temp[i++] = digits[uval % base]; + uval /= base; + } + + if (is_negative) { + buffer[len++] = '-'; + } + + while (i > 0) { + buffer[len++] = temp[--i]; + } + + buffer[len] = '\0'; + return len; +} + +static int ptr_to_str(void *ptr, char *buffer) { + buffer[0] = '0'; + buffer[1] = 'x'; + int len = int_to_str((uintptr_t)ptr, buffer + 2, 16, 0, 0); + return 2 + len; +} + +size_t strlen(const char *str) { + const char *s = str; + while (*s) s++; + return s - str; +} + +char *strncpy(char *dest, const char *src, size_t n) { + char *d = dest; + const char *s = src; + while (n-- && (*d++ = *s++)); + if (n == (size_t)-1) *d = '\0'; + return dest; +} + +static int write_formatted_to_buffer( + char *buffer, + size_t buffer_size, + size_t *pos, + const char *str, + int width, + const format_flags_t *flags +) { + int len = strlen(str); + int written = 0; + int pad_len = (width > len) ? (width - len) : 0; + int zero_pad = flags->zero_pad && !flags->left_justify; + + if (!flags->left_justify && pad_len > 0) { + char pad_char = zero_pad ? '0' : ' '; + for (int i = 0; i < pad_len && *pos < buffer_size - 1; i++) { + buffer[(*pos)++] = pad_char; + written++; + } + } + + for (int i = 0; i < len && *pos < buffer_size - 1; i++) { + buffer[(*pos)++] = str[i]; + written++; + } + + if (flags->left_justify && pad_len > 0) { + for (int i = 0; i < pad_len && *pos < buffer_size - 1; i++) { + buffer[(*pos)++] = ' '; + written++; + } + } + + return written; +} + +static int vsnprintf_impl(char *buffer, size_t buffsz, const char *format, va_list args) { + if (!buffer || buffsz == 0 || !format) return -1; + + size_t pos = 0; + int total_chars = 0; + const char *p = format; + + while (*p) { + if (*p == '%') { + p++; + if (*p == '%') { + if (pos < buffsz - 1) buffer[pos++] = '%'; + total_chars++; + p++; + continue; + } + + int width, precision; + format_flags_t flags; + p = parse_format_spec(p, &width, &precision, &flags); + + char temp_buf[64]; + const char *output_str = temp_buf; + + switch (*p) { + case 's': { + const char *str = va_arg(args, const char*); + if (!str) str = "(null)"; + + int str_len = strlen(str); + if (precision >= 0 && str_len > precision) { + strncpy(temp_buf, str, precision); + temp_buf[precision] = '\0'; + output_str = temp_buf; + } else { + output_str = str; + } + break; + } + case 'd': + case 'i': { + int value = va_arg(args, int); + int_to_str(value, temp_buf, 10, true, false); + break; + } + case 'u': { + unsigned int value = va_arg(args, unsigned int); + int_to_str(value, temp_buf, 10, false, false); + break; + } + case 'x': { + unsigned int value = va_arg(args, unsigned int); + int_to_str(value, temp_buf, 16, false, false); + break; + } + case 'X': { + unsigned int value = va_arg(args, unsigned int); + int_to_str(value, temp_buf, 16, false, true); + break; + } + case 'p': { + void *ptr = va_arg(args, void*); + ptr_to_str(ptr, temp_buf); + break; + } + case 'c': { + int c = va_arg(args, int); + temp_buf[0] = (char)c; + temp_buf[1] = '\0'; + break; + } + case 'z': { + if (*(p + 1) == 'u') { + size_t value = va_arg(args, size_t); + int_to_str(value, temp_buf, 10, false, false); + p++; + } else { + temp_buf[0] = 'z'; + temp_buf[1] = '\0'; + } + break; + } + default: + temp_buf[0] = '%'; + temp_buf[1] = *p; + temp_buf[2] = '\0'; + break; + } + + int str_len = strlen(output_str); + int formatted_len = (width > str_len) ? width : str_len; + total_chars += formatted_len; + + if (pos < buffsz - 1) { + write_formatted_to_buffer(buffer, buffsz, &pos, output_str, width, &flags); + } + + } else { + if (pos < buffsz - 1) buffer[pos++] = *p; + total_chars++; + } + p++; + } + + if (buffsz > 0) buffer[pos < buffsz ? pos : buffsz - 1] = '\0'; + + return total_chars; +} + +int snprintf(char *restrict buffer, size_t buffsz, const char *restrict format, ...) { + if (!buffer || buffsz == 0 || !format) return -1; + + va_list args; + va_start(args, format); + int result = vsnprintf_impl(buffer, buffsz, format, args); + va_end(args); + + return result; +} + +int vsnprintf(char *restrict buffer, size_t buffsz, const char *restrict format, va_list vlist) { + return vsnprintf_impl(buffer, buffsz, format, vlist); +} + +int fclose(FILE *stream) { + return 0; +} + +FILE* fdopen(int fd, const char *mode) { + return 0; +} + +int fputc(int c, FILE *stream) { + return c; +} + +int fputs(const char *restrict str, FILE *restrict stream) { + return 0; +} + +size_t fwrite(const void *restrict buffer, size_t size, size_t nmemb, FILE *restrict stream) { + return size * nmemb; +} + +int fprintf(FILE *restrict stream, const char *restrict format, ...) { + return 0; +} diff --git a/lib/src/wasm/stdlib.c b/crates/language/wasm/src/stdlib.c similarity index 97% rename from lib/src/wasm/stdlib.c rename to crates/language/wasm/src/stdlib.c index 65f87e90..f50e1da9 100644 --- a/lib/src/wasm/stdlib.c +++ b/crates/language/wasm/src/stdlib.c @@ -6,10 +6,7 @@ // grown as necessary, and the allocation is made at the end of the heap. // When the heap is reset, all allocated memory is considered freed. -#ifdef TREE_SITTER_FEATURE_WASM - -#include -#include +#include #include #include @@ -136,4 +133,6 @@ void *realloc(void *ptr, size_t new_size) { return result; } -#endif +__attribute__((noreturn)) void abort(void) { + __builtin_trap(); +} diff --git a/crates/language/wasm/src/string.c b/crates/language/wasm/src/string.c new file mode 100644 index 00000000..0fcf4b85 --- /dev/null +++ b/crates/language/wasm/src/string.c @@ -0,0 +1,60 @@ +#include + +int memcmp(const void *lhs, const void *rhs, size_t count) { + const unsigned char *l = lhs; + const unsigned char *r = rhs; + while (count--) { + if (*l != *r) { + return *l - *r; + } + l++; + r++; + } + return 0; +} + +void *memcpy(void *restrict dst, const void *restrict src, size_t size) { + unsigned char *d = dst; + const unsigned char *s = src; + while (size--) { + *d++ = *s++; + } + return dst; +} + +void *memmove(void *dst, const void *src, size_t count) { + unsigned char *d = dst; + const unsigned char *s = src; + if (d < s) { + while (count--) { + *d++ = *s++; + } + } else if (d > s) { + d += count; + s += count; + while (count--) { + *(--d) = *(--s); + } + } + return dst; +} + +void *memset(void *dst, int value, size_t count) { + unsigned char *p = dst; + while (count--) { + *p++ = (unsigned char)value; + } + return dst; +} + +int strncmp(const char *left, const char *right, size_t n) { + while (n-- > 0) { + if (*left != *right) { + return *(unsigned char *)left - *(unsigned char *)right; + } + if (*left == '\0') break; + left++; + right++; + } + return 0; +} diff --git a/crates/xtask/src/build_wasm.rs b/crates/xtask/src/build_wasm.rs index bbd28c24..67ca59d6 100644 --- a/crates/xtask/src/build_wasm.rs +++ b/crates/xtask/src/build_wasm.rs @@ -374,7 +374,7 @@ pub fn run_wasm_stdlib() -> Result<()> { "-Wl,--export=reset_heap", ]) .args(&export_flags) - .arg("lib/src/wasm/stdlib.c") + .arg("crates/language/wasm/src/stdlib.c") .output()?; bail_on_err(&output, "Failed to compile the Tree-sitter Wasm stdlib")?; diff --git a/lib/Cargo.toml b/lib/Cargo.toml index 3f6902d4..45434a7a 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -4,7 +4,7 @@ version.workspace = true description = "Rust bindings to the Tree-sitter parsing library" authors.workspace = true edition.workspace = true -rust-version = "1.76" +rust-version = "1.77" readme = "binding_rust/README.md" homepage.workspace = true repository.workspace = true diff --git a/lib/binding_rust/build.rs b/lib/binding_rust/build.rs index 0b356416..7268d615 100644 --- a/lib/binding_rust/build.rs +++ b/lib/binding_rust/build.rs @@ -2,6 +2,7 @@ use std::{env, fs, path::PathBuf}; fn main() { let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); + let target = env::var("TARGET").unwrap(); #[cfg(feature = "bindgen")] generate_bindings(&out_dir); @@ -26,6 +27,11 @@ fn main() { let include_path = manifest_path.join("include"); let src_path = manifest_path.join("src"); let wasm_path = src_path.join("wasm"); + + if target.starts_with("wasm32-unknown") { + configure_wasm_build(&mut config); + } + for entry in fs::read_dir(&src_path).unwrap() { let entry = entry.unwrap(); let path = src_path.join(entry.file_name()); @@ -50,6 +56,22 @@ fn main() { println!("cargo:include={}", include_path.display()); } +fn configure_wasm_build(config: &mut cc::Build) { + let Ok(wasm_headers) = env::var("DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS") else { + panic!("Environment variable DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS must be set by the language crate"); + }; + let Ok(wasm_src) = env::var("DEP_TREE_SITTER_LANGUAGE_WASM_SRC").map(PathBuf::from) else { + panic!("Environment variable DEP_TREE_SITTER_LANGUAGE_WASM_SRC must be set by the language crate"); + }; + + config.include(&wasm_headers); + config.files([ + wasm_src.join("stdio.c"), + wasm_src.join("stdlib.c"), + wasm_src.join("string.c"), + ]); +} + #[cfg(feature = "bindgen")] fn generate_bindings(out_dir: &std::path::Path) { use std::str::FromStr; diff --git a/lib/src/tree.c b/lib/src/tree.c index bb451180..705f174c 100644 --- a/lib/src/tree.c +++ b/lib/src/tree.c @@ -146,7 +146,7 @@ void ts_tree_print_dot_graph(const TSTree *self, int fd) { fclose(file); } -#elif !defined(__wasi__) // WASI doesn't support dup +#elif !defined(__wasm__) // Wasm doesn't support dup #include From d29132512b1fd73eff25099a2f7181a70c07e985 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sat, 13 Sep 2025 05:54:14 -0400 Subject: [PATCH 469/663] ci: build wasm32 --- .github/workflows/build.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d782dfbe..d0135df8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -46,6 +46,7 @@ jobs: - { platform: windows-x86 , target: i686-pc-windows-msvc , os: windows-latest } - { platform: macos-arm64 , target: aarch64-apple-darwin , os: macos-latest , features: wasm } - { platform: macos-x64 , target: x86_64-apple-darwin , os: macos-13 , features: wasm } + - { platform: wasm32 , target: wasm32-unknown-unknown , os: ubuntu-latest , no-run: true } # Cross compilers for C library - { platform: linux-arm64 , cc: aarch64-linux-gnu-gcc , ar: aarch64-linux-gnu-ar } @@ -262,7 +263,12 @@ jobs: $BUILD_CMD check --no-default-features --target=${{ matrix.target }} - name: Build target - run: $BUILD_CMD build --release --target=${{ matrix.target }} --features=${{ matrix.features }} + run: | + PACKAGE="" + if [[ "${{ matrix.target }}" == "wasm32-unknown-unknown" ]]; then + PACKAGE="-p tree-sitter" + fi + $BUILD_CMD build --release --target=${{ matrix.target }} --features=${{ matrix.features }} $PACKAGE - name: Cache fixtures id: cache @@ -290,6 +296,7 @@ jobs: run: $BUILD_CMD run -p xtask --target=${{ matrix.target }} -- test-wasm - name: Upload CLI artifact + if: ${{ matrix.platform != 'wasm32' }} uses: actions/upload-artifact@v4 with: name: tree-sitter.${{ matrix.platform }} From f222db57cedb0836dc6297ac327076f2cbce93b0 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Tue, 16 Sep 2025 19:35:45 +0300 Subject: [PATCH 470/663] fix(bindings): fix ESM errors in Node bindings 1. The module tries to call the native binary as a function. Only `node-gyp-build` returns a function, so the call is moved there. 2. `node-types.json` is imported with outdated syntax. Use import attributes which require Node 18. 3. The test does not properly catch import errors. This is solved by moving the import inside the assertion. --- crates/cli/src/init.rs | 5 ++--- crates/cli/src/templates/binding_test.js | 6 ++++-- crates/cli/src/templates/index.js | 12 +++++------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index 5c5edda3..ac9ea5e7 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -309,11 +309,10 @@ pub fn generate_grammar_files( if !contents.contains("module") { eprintln!("Updating package.json"); contents = contents.replace( - indoc! {r#" - "repository": {"#}, + r#""repository":"#, indoc! {r#" "type": "module", - "repository": {"#}, + "repository":"#}, ); } write_file(path, contents)?; diff --git a/crates/cli/src/templates/binding_test.js b/crates/cli/src/templates/binding_test.js index e424b266..7a91a84d 100644 --- a/crates/cli/src/templates/binding_test.js +++ b/crates/cli/src/templates/binding_test.js @@ -1,9 +1,11 @@ import assert from "node:assert"; import { test } from "node:test"; import Parser from "tree-sitter"; -import language from "./index.js"; test("can load grammar", () => { const parser = new Parser(); - assert.doesNotThrow(() => parser.setLanguage(language)); + assert.doesNotReject(async () => { + const { default: language } = await import("./index.js"); + parser.setLanguage(language); + }); }); diff --git a/crates/cli/src/templates/index.js b/crates/cli/src/templates/index.js index 2782b741..233261d0 100644 --- a/crates/cli/src/templates/index.js +++ b/crates/cli/src/templates/index.js @@ -2,14 +2,12 @@ const root = new URL("../..", import.meta.url).pathname; const binding = typeof process.versions.bun === "string" // Support `bun build --compile` by being statically analyzable enough to find the .node file at build-time - ? await import(`../../prebuilds/${process.platform}-${process.arch}/tree-sitter-KEBAB_PARSER_NAME.node`) - : await import("node-gyp-build"); - -const result = binding.default ? binding.default(root) : binding(root); + ? await import(`${root}/prebuilds/${process.platform}-${process.arch}/tree-sitter-KEBAB_PARSER_NAME.node`) + : (await import("node-gyp-build")).default(root); try { - const nodeTypeInfo = await import("../../src/node-types.json", {assert: {type: "json"}}); - result.nodeTypeInfo = nodeTypeInfo.default; + const nodeTypes = await import(`${root}/src/node-types.json`, {with: {type: "json"}}); + binding.nodeTypeInfo = nodeTypes.default; } catch (_) {} -export default result; +export default binding; From f09dc3cf463cf15e7b90dc492fa117f5cc76846d Mon Sep 17 00:00:00 2001 From: Nia Date: Fri, 19 Sep 2025 00:34:27 +0200 Subject: [PATCH 471/663] fix(wasm): fix alias map size computation This fixes a crash where parsing with certain languages can lead to a crash due to how the alias map was allocated and laid out in wasm memory --- crates/cli/src/main.rs | 11 +---- crates/cli/src/tests/helpers/fixtures.rs | 41 ++++++++++++++++++- crates/cli/src/tests/wasm_language_test.rs | 40 ++++++++++++++---- crates/cli/src/wasm.rs | 7 ++-- crates/loader/src/loader.rs | 2 - lib/src/wasm_store.c | 3 +- .../test_grammars/external_tokens/scanner.c | 2 +- 7 files changed, 80 insertions(+), 26 deletions(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index b52f8db1..76ba57ff 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -19,7 +19,7 @@ use tree_sitter_cli::{ LOG_GRAPH_ENABLED, START_SEED, }, highlight::{self, HighlightOptions}, - init::{generate_grammar_files, get_root_path, JsonConfigOpts}, + init::{generate_grammar_files, JsonConfigOpts}, input::{get_input, get_tmp_source_file, CliInput}, logger, parse::{self, ParseDebugType, ParseFileOptions, ParseOutput, ParseTheme}, @@ -895,14 +895,7 @@ impl Build { if self.wasm { let output_path = self.output.map(|path| current_dir.join(path)); - let root_path = get_root_path(&grammar_path.join("tree-sitter.json"))?; - wasm::compile_language_to_wasm( - &loader, - Some(&root_path), - &grammar_path, - current_dir, - output_path, - )?; + wasm::compile_language_to_wasm(&loader, &grammar_path, current_dir, output_path)?; } else { let output_path = if let Some(ref path) = self.output { let path = Path::new(path); diff --git a/crates/cli/src/tests/helpers/fixtures.rs b/crates/cli/src/tests/helpers/fixtures.rs index 0b046bcc..0e0ff69d 100644 --- a/crates/cli/src/tests/helpers/fixtures.rs +++ b/crates/cli/src/tests/helpers/fixtures.rs @@ -23,6 +23,9 @@ static TEST_LOADER: LazyLock = LazyLock::new(|| { loader }); +#[cfg(feature = "wasm")] +pub static ENGINE: LazyLock = LazyLock::new(Default::default); + pub fn test_loader() -> &'static Loader { &TEST_LOADER } @@ -43,10 +46,19 @@ pub fn get_language(name: &str) -> Language { } pub fn get_test_fixture_language(name: &str) -> Language { + get_test_fixture_language_internal(name, false) +} + +#[cfg(feature = "wasm")] +pub fn get_test_fixture_language_wasm(name: &str) -> Language { + get_test_fixture_language_internal(name, true) +} + +fn get_test_fixture_language_internal(name: &str, wasm: bool) -> Language { let grammar_dir_path = fixtures_dir().join("test_grammars").join(name); let grammar_json = load_grammar_file(&grammar_dir_path.join("grammar.js"), None).unwrap(); let (parser_name, parser_code) = generate_parser(&grammar_json).unwrap(); - get_test_language(&parser_name, &parser_code, Some(&grammar_dir_path)) + get_test_language_internal(&parser_name, &parser_code, Some(&grammar_dir_path), wasm) } pub fn get_language_queries_path(language_name: &str) -> PathBuf { @@ -87,6 +99,15 @@ pub fn get_tags_config(language_name: &str) -> TagsConfiguration { } pub fn get_test_language(name: &str, parser_code: &str, path: Option<&Path>) -> Language { + get_test_language_internal(name, parser_code, path, false) +} + +fn get_test_language_internal( + name: &str, + parser_code: &str, + path: Option<&Path>, + wasm: bool, +) -> Language { let src_dir = scratch_dir().join("src").join(name); fs::create_dir_all(&src_dir).unwrap(); @@ -136,5 +157,21 @@ pub fn get_test_language(name: &str, parser_code: &str, path: Option<&Path>) -> config.header_paths = vec![&HEADER_DIR]; config.name = name.to_string(); - TEST_LOADER.load_language_at_path_with_name(config).unwrap() + if wasm { + #[cfg(feature = "wasm")] + { + let mut loader = Loader::with_parser_lib_path(SCRATCH_DIR.clone()); + loader.use_wasm(&ENGINE); + if env::var("TREE_SITTER_GRAMMAR_DEBUG").is_ok() { + loader.debug_build(true); + } + loader.load_language_at_path_with_name(config).unwrap() + } + #[cfg(not(feature = "wasm"))] + { + unimplemented!("Wasm feature is not enabled") + } + } else { + TEST_LOADER.load_language_at_path_with_name(config).unwrap() + } } diff --git a/crates/cli/src/tests/wasm_language_test.rs b/crates/cli/src/tests/wasm_language_test.rs index 1a84f9a5..d62095c0 100644 --- a/crates/cli/src/tests/wasm_language_test.rs +++ b/crates/cli/src/tests/wasm_language_test.rs @@ -1,14 +1,13 @@ -use std::{fs, sync::LazyLock}; +use std::fs; use streaming_iterator::StreamingIterator; -use tree_sitter::{ - wasmtime::Engine, Parser, Query, QueryCursor, WasmError, WasmErrorKind, WasmStore, +use tree_sitter::{Parser, Query, QueryCursor, WasmError, WasmErrorKind, WasmStore}; + +use crate::tests::helpers::{ + allocations, + fixtures::{get_test_fixture_language_wasm, ENGINE, WASM_DIR}, }; -use crate::tests::helpers::{allocations, fixtures::WASM_DIR}; - -static ENGINE: LazyLock = LazyLock::new(Engine::default); - #[test] fn test_wasm_stdlib_symbols() { let symbols = tree_sitter::wasm_stdlib_symbols().collect::>(); @@ -92,6 +91,33 @@ fn test_load_wasm_javascript_language() { }); } +#[test] +fn test_load_wasm_python_language() { + allocations::record(|| { + let mut store = WasmStore::new(&ENGINE).unwrap(); + let mut parser = Parser::new(); + let wasm = fs::read(WASM_DIR.join("tree-sitter-python.wasm")).unwrap(); + let language = store.load_language("python", &wasm).unwrap(); + parser.set_wasm_store(store).unwrap(); + parser.set_language(&language).unwrap(); + let tree = parser.parse("a = b\nc = d", None).unwrap(); + assert_eq!(tree.root_node().to_sexp(), "(module (expression_statement (assignment left: (identifier) right: (identifier))) (expression_statement (assignment left: (identifier) right: (identifier))))"); + }); +} + +#[test] +fn test_load_fixture_language_wasm() { + allocations::record(|| { + let store = WasmStore::new(&ENGINE).unwrap(); + let mut parser = Parser::new(); + let language = get_test_fixture_language_wasm("epsilon_external_tokens"); + parser.set_wasm_store(store).unwrap(); + parser.set_language(&language).unwrap(); + let tree = parser.parse("hello", None).unwrap(); + assert_eq!(tree.root_node().to_sexp(), "(document (zero_width))"); + }); +} + #[test] fn test_load_multiple_wasm_languages() { allocations::record(|| { diff --git a/crates/cli/src/wasm.rs b/crates/cli/src/wasm.rs index f1142b1c..09fb459b 100644 --- a/crates/cli/src/wasm.rs +++ b/crates/cli/src/wasm.rs @@ -5,7 +5,7 @@ use std::{ use anyhow::{anyhow, Context, Result}; use tree_sitter::wasm_stdlib_symbols; -use tree_sitter_generate::parse_grammar::GrammarJSON; +use tree_sitter_generate::{load_grammar_file, parse_grammar::GrammarJSON}; use tree_sitter_loader::Loader; use wasmparser::Parser; @@ -40,19 +40,18 @@ pub fn get_grammar_name(language_dir: &Path) -> Result { pub fn compile_language_to_wasm( loader: &Loader, - root_dir: Option<&Path>, language_dir: &Path, output_dir: &Path, output_file: Option, ) -> Result<()> { - let grammar_name = get_grammar_name(language_dir)?; + let grammar_name = get_grammar_name(language_dir) + .or_else(|_| load_grammar_file(&language_dir.join("grammar.js"), None))?; let output_filename = output_file.unwrap_or_else(|| output_dir.join(format!("tree-sitter-{grammar_name}.wasm"))); let src_path = language_dir.join("src"); let scanner_path = loader.get_scanner_path(&src_path); loader.compile_parser_to_wasm( &grammar_name, - root_dir, &src_path, scanner_path .as_ref() diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index b4a28a71..2641eeeb 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -773,7 +773,6 @@ impl Loader { if recompile { self.compile_parser_to_wasm( &config.name, - None, config.src_path, config .scanner_path @@ -1026,7 +1025,6 @@ impl Loader { pub fn compile_parser_to_wasm( &self, language_name: &str, - _root_path: Option<&Path>, src_path: &Path, scanner_filename: Option<&Path>, output_path: &Path, diff --git a/lib/src/wasm_store.c b/lib/src/wasm_store.c index 583655a5..cd94f6a0 100644 --- a/lib/src/wasm_store.c +++ b/lib/src/wasm_store.c @@ -1377,11 +1377,12 @@ const TSLanguage *ts_wasm_store_load_language( if (symbol == 0) break; uint16_t value_count; memcpy(&value_count, &memory[wasm_language.alias_map + alias_map_size], sizeof(value_count)); + alias_map_size += sizeof(uint16_t); alias_map_size += value_count * sizeof(TSSymbol); } language->alias_map = copy( &memory[wasm_language.alias_map], - alias_map_size * sizeof(TSSymbol) + alias_map_size ); language->alias_sequences = copy( &memory[wasm_language.alias_sequences], diff --git a/test/fixtures/test_grammars/external_tokens/scanner.c b/test/fixtures/test_grammars/external_tokens/scanner.c index 6d80827e..da40c485 100644 --- a/test/fixtures/test_grammars/external_tokens/scanner.c +++ b/test/fixtures/test_grammars/external_tokens/scanner.c @@ -30,7 +30,7 @@ void tree_sitter_external_tokens_external_scanner_destroy(void *payload) { unsigned tree_sitter_external_tokens_external_scanner_serialize( void *payload, char *buffer -) { return true; } +) { return 0; } void tree_sitter_external_tokens_external_scanner_deserialize( void *payload, From 074e991280503111a9f37d2a948bcfe086455ea5 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Thu, 18 Sep 2025 19:45:21 -0400 Subject: [PATCH 472/663] refactor: deduplicate allocation code in tests --- crates/cli/src/fuzz.rs | 4 +- crates/cli/src/fuzz/allocations.rs | 33 +++++- crates/cli/src/tests/corpus_test.rs | 8 +- crates/cli/src/tests/helpers.rs | 2 +- crates/cli/src/tests/helpers/allocations.rs | 121 -------------------- 5 files changed, 34 insertions(+), 134 deletions(-) delete mode 100644 crates/cli/src/tests/helpers/allocations.rs diff --git a/crates/cli/src/fuzz.rs b/crates/cli/src/fuzz.rs index 996773c6..24c98d30 100644 --- a/crates/cli/src/fuzz.rs +++ b/crates/cli/src/fuzz.rs @@ -163,7 +163,7 @@ pub fn fuzz_language_corpus( println!(" {test_index}. {test_name}"); - let passed = allocations::record(|| { + let passed = allocations::record_checked(|| { let mut log_session = None; let mut parser = get_parser(&mut log_session, "log.html"); parser.set_language(language).unwrap(); @@ -207,7 +207,7 @@ pub fn fuzz_language_corpus( for trial in 0..options.iterations { let seed = start_seed + trial; - let passed = allocations::record(|| { + let passed = allocations::record_checked(|| { let mut rand = Rand::new(seed); let mut log_session = None; let mut parser = get_parser(&mut log_session, "log.html"); diff --git a/crates/cli/src/fuzz/allocations.rs b/crates/cli/src/fuzz/allocations.rs index 9d7c91ab..ca0c0860 100644 --- a/crates/cli/src/fuzz/allocations.rs +++ b/crates/cli/src/fuzz/allocations.rs @@ -40,7 +40,11 @@ extern "C" { fn free(ptr: *mut c_void); } -pub fn record(f: impl FnOnce() -> T) -> Result { +pub fn record(f: impl FnOnce() -> T) -> T { + record_checked(f).unwrap() +} + +pub fn record_checked(f: impl FnOnce() -> T) -> Result { RECORDER.with(|recorder| { recorder.enabled.store(true, SeqCst); recorder.allocation_count.store(0, SeqCst); @@ -93,19 +97,34 @@ fn record_dealloc(ptr: *mut c_void) { }); } -unsafe extern "C" fn ts_record_malloc(size: usize) -> *mut c_void { +/// # Safety +/// +/// The caller must ensure that the returned pointer is eventually +/// freed by calling `ts_record_free`. +#[must_use] +pub unsafe extern "C" fn ts_record_malloc(size: usize) -> *mut c_void { let result = malloc(size); record_alloc(result); result } -unsafe extern "C" fn ts_record_calloc(count: usize, size: usize) -> *mut c_void { +/// # Safety +/// +/// The caller must ensure that the returned pointer is eventually +/// freed by calling `ts_record_free`. +#[must_use] +pub unsafe extern "C" fn ts_record_calloc(count: usize, size: usize) -> *mut c_void { let result = calloc(count, size); record_alloc(result); result } -unsafe extern "C" fn ts_record_realloc(ptr: *mut c_void, size: usize) -> *mut c_void { +/// # Safety +/// +/// The caller must ensure that the returned pointer is eventually +/// freed by calling `ts_record_free`. +#[must_use] +pub unsafe extern "C" fn ts_record_realloc(ptr: *mut c_void, size: usize) -> *mut c_void { let result = realloc(ptr, size); if ptr.is_null() { record_alloc(result); @@ -116,7 +135,11 @@ unsafe extern "C" fn ts_record_realloc(ptr: *mut c_void, size: usize) -> *mut c_ result } -unsafe extern "C" fn ts_record_free(ptr: *mut c_void) { +/// # Safety +/// +/// The caller must ensure that `ptr` was allocated by a previous call +/// to `ts_record_malloc`, `ts_record_calloc`, or `ts_record_realloc`. +pub unsafe extern "C" fn ts_record_free(ptr: *mut c_void) { record_dealloc(ptr); free(ptr); } diff --git a/crates/cli/src/tests/corpus_test.rs b/crates/cli/src/tests/corpus_test.rs index 1ef63b31..fe2e2943 100644 --- a/crates/cli/src/tests/corpus_test.rs +++ b/crates/cli/src/tests/corpus_test.rs @@ -216,8 +216,7 @@ pub fn test_language_corpus( } true - }) - .unwrap(); + }); if !passed { failure_count += 1; @@ -312,7 +311,7 @@ pub fn test_language_corpus( } true - }).unwrap(); + }); if !passed { failure_count += 1; @@ -434,8 +433,7 @@ fn test_feature_corpus_files() { println!(); false } - }) - .unwrap(); + }); if !passed { failure_count += 1; diff --git a/crates/cli/src/tests/helpers.rs b/crates/cli/src/tests/helpers.rs index 298179c7..4d2e6128 100644 --- a/crates/cli/src/tests/helpers.rs +++ b/crates/cli/src/tests/helpers.rs @@ -1,4 +1,4 @@ -pub mod allocations; +pub use crate::fuzz::allocations; pub mod edits; pub(super) mod fixtures; pub(super) mod query_helpers; diff --git a/crates/cli/src/tests/helpers/allocations.rs b/crates/cli/src/tests/helpers/allocations.rs deleted file mode 100644 index dec67b11..00000000 --- a/crates/cli/src/tests/helpers/allocations.rs +++ /dev/null @@ -1,121 +0,0 @@ -use std::{ - collections::HashMap, - os::raw::c_void, - sync::{ - atomic::{AtomicBool, AtomicUsize, Ordering::SeqCst}, - Mutex, - }, -}; - -#[ctor::ctor] -unsafe fn initialize_allocation_recording() { - tree_sitter::set_allocator( - Some(ts_record_malloc), - Some(ts_record_calloc), - Some(ts_record_realloc), - Some(ts_record_free), - ); -} - -#[derive(Debug, PartialEq, Eq, Hash)] -struct Allocation(*const c_void); -unsafe impl Send for Allocation {} -unsafe impl Sync for Allocation {} - -#[derive(Default)] -struct AllocationRecorder { - enabled: AtomicBool, - allocation_count: AtomicUsize, - outstanding_allocations: Mutex>, -} - -thread_local! { - static RECORDER: AllocationRecorder = AllocationRecorder::default(); -} - -extern "C" { - fn malloc(size: usize) -> *mut c_void; - fn calloc(count: usize, size: usize) -> *mut c_void; - fn realloc(ptr: *mut c_void, size: usize) -> *mut c_void; - fn free(ptr: *mut c_void); -} - -pub fn record(f: impl FnOnce() -> T) -> T { - RECORDER.with(|recorder| { - recorder.enabled.store(true, SeqCst); - recorder.allocation_count.store(0, SeqCst); - recorder.outstanding_allocations.lock().unwrap().clear(); - }); - - let value = f(); - - let outstanding_allocation_indices = RECORDER.with(|recorder| { - recorder.enabled.store(false, SeqCst); - recorder.allocation_count.store(0, SeqCst); - recorder - .outstanding_allocations - .lock() - .unwrap() - .drain() - .map(|e| e.1) - .collect::>() - }); - assert!( - outstanding_allocation_indices.is_empty(), - "Leaked allocation indices: {outstanding_allocation_indices:?}" - ); - value -} - -fn record_alloc(ptr: *mut c_void) { - RECORDER.with(|recorder| { - if recorder.enabled.load(SeqCst) { - let count = recorder.allocation_count.fetch_add(1, SeqCst); - recorder - .outstanding_allocations - .lock() - .unwrap() - .insert(Allocation(ptr), count); - } - }); -} - -fn record_dealloc(ptr: *mut c_void) { - RECORDER.with(|recorder| { - if recorder.enabled.load(SeqCst) { - recorder - .outstanding_allocations - .lock() - .unwrap() - .remove(&Allocation(ptr)); - } - }); -} - -unsafe extern "C" fn ts_record_malloc(size: usize) -> *mut c_void { - let result = malloc(size); - record_alloc(result); - result -} - -unsafe extern "C" fn ts_record_calloc(count: usize, size: usize) -> *mut c_void { - let result = calloc(count, size); - record_alloc(result); - result -} - -unsafe extern "C" fn ts_record_realloc(ptr: *mut c_void, size: usize) -> *mut c_void { - let result = realloc(ptr, size); - if ptr.is_null() { - record_alloc(result); - } else if !core::ptr::eq(ptr, result) { - record_dealloc(ptr); - record_alloc(result); - } - result -} - -unsafe extern "C" fn ts_record_free(ptr: *mut c_void) { - record_dealloc(ptr); - free(ptr); -} From 9be3e2bdd8e1e62ad259e3c8ee7de7ebaed0553f Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 19 Sep 2025 08:14:00 -0700 Subject: [PATCH 473/663] 0.26.0 --- Cargo.lock | 14 +++++++------- Cargo.toml | 14 +++++++------- flake.nix | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f5512195..a96db54c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1886,7 +1886,7 @@ dependencies = [ [[package]] name = "tree-sitter" -version = "0.26.0" +version = "0.27.0" dependencies = [ "bindgen 0.72.1", "cc", @@ -1900,7 +1900,7 @@ dependencies = [ [[package]] name = "tree-sitter-cli" -version = "0.26.0" +version = "0.27.0" dependencies = [ "ansi_colours", "anstyle", @@ -1945,7 +1945,7 @@ dependencies = [ [[package]] name = "tree-sitter-config" -version = "0.26.0" +version = "0.27.0" dependencies = [ "anyhow", "etcetera", @@ -1955,7 +1955,7 @@ dependencies = [ [[package]] name = "tree-sitter-generate" -version = "0.26.0" +version = "0.27.0" dependencies = [ "anyhow", "dunce", @@ -1978,7 +1978,7 @@ dependencies = [ [[package]] name = "tree-sitter-highlight" -version = "0.26.0" +version = "0.27.0" dependencies = [ "regex", "streaming-iterator", @@ -1992,7 +1992,7 @@ version = "0.1.4" [[package]] name = "tree-sitter-loader" -version = "0.26.0" +version = "0.27.0" dependencies = [ "anyhow", "cc", @@ -2013,7 +2013,7 @@ dependencies = [ [[package]] name = "tree-sitter-tags" -version = "0.26.0" +version = "0.27.0" dependencies = [ "memchr", "regex", diff --git a/Cargo.toml b/Cargo.toml index 6dd66122..b2bf25ca 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ members = [ resolver = "2" [workspace.package] -version = "0.26.0" +version = "0.27.0" authors = [ "Max Brunsfeld ", "Amaan Qureshi ", @@ -151,10 +151,10 @@ walkdir = "2.5.0" wasmparser = "0.229.0" webbrowser = "1.0.5" -tree-sitter = { version = "0.26.0", path = "./lib" } -tree-sitter-generate = { version = "0.26.0", path = "./crates/generate" } +tree-sitter = { version = "0.27.0", path = "./lib" } +tree-sitter-generate = { version = "0.27.0", path = "./crates/generate" } tree-sitter-language = { path = "./crates/language" } -tree-sitter-loader = { version = "0.26.0", path = "./crates/loader" } -tree-sitter-config = { version = "0.26.0", path = "./crates/config" } -tree-sitter-highlight = { version = "0.26.0", path = "./crates/highlight" } -tree-sitter-tags = { version = "0.26.0", path = "./crates/tags" } +tree-sitter-loader = { version = "0.27.0", path = "./crates/loader" } +tree-sitter-config = { version = "0.27.0", path = "./crates/config" } +tree-sitter-highlight = { version = "0.27.0", path = "./crates/highlight" } +tree-sitter-tags = { version = "0.27.0", path = "./crates/tags" } diff --git a/flake.nix b/flake.nix index 70d3c474..b94b03fa 100644 --- a/flake.nix +++ b/flake.nix @@ -17,7 +17,7 @@ eachSystem = lib.genAttrs systems; pkgsFor = inputs.nixpkgs.legacyPackages; - version = "0.26.0"; + version = "0.26.0"; fs = lib.fileset; src = fs.toSource { From 1a0868c487ee23efd0468a958fa220d1962a082d Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Wed, 17 Sep 2025 20:27:40 -0400 Subject: [PATCH 474/663] build: add static and shared targets to Makefile --- Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 9d51093a..abd765b1 100644 --- a/Makefile +++ b/Makefile @@ -75,6 +75,10 @@ tree-sitter.pc: lib/tree-sitter.pc.in -e 's|@PROJECT_HOMEPAGE_URL@|$(HOMEPAGE_URL)|' \ -e 's|@CMAKE_INSTALL_PREFIX@|$(PREFIX)|' $< > $@ +shared: libtree-sitter.$(SOEXT) + +static: libtree-sitter.a + clean: $(RM) $(OBJ) tree-sitter.pc libtree-sitter.a libtree-sitter.$(SOEXT) libtree-stitter.dll.a @@ -102,7 +106,7 @@ uninstall: '$(DESTDIR)$(PCLIBDIR)'/tree-sitter.pc rmdir '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter -.PHONY: all install uninstall clean +.PHONY: all shared static install uninstall clean ##### Dev targets ##### From a69367f7399953a966d69a875cbda7e147c221e0 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Thu, 18 Sep 2025 23:28:34 -0400 Subject: [PATCH 475/663] feat: add API for editing points and ranges --- crates/cli/src/tests/node_test.rs | 88 ++++++++++++++++++++++++++++++- lib/binding_rust/bindings.rs | 8 +++ lib/binding_rust/lib.rs | 42 +++++++++++++++ lib/include/tree_sitter/api.h | 18 +++++++ lib/src/get_changed_ranges.c | 34 ++++++++++++ lib/src/lib.c | 1 + lib/src/node.c | 8 +-- lib/src/point.c | 17 ++++++ lib/src/tree.c | 32 +---------- 9 files changed, 209 insertions(+), 39 deletions(-) create mode 100644 lib/src/point.c diff --git a/crates/cli/src/tests/node_test.rs b/crates/cli/src/tests/node_test.rs index 515d73aa..614bfdb9 100644 --- a/crates/cli/src/tests/node_test.rs +++ b/crates/cli/src/tests/node_test.rs @@ -1,4 +1,4 @@ -use tree_sitter::{Node, Parser, Point, Tree}; +use tree_sitter::{InputEdit, Node, Parser, Point, Tree}; use tree_sitter_generate::load_grammar_file; use super::{ @@ -843,6 +843,92 @@ fn test_node_is_error() { assert!(child.is_error()); } +#[test] +fn test_edit_point() { + let edit = InputEdit { + start_byte: 5, + old_end_byte: 5, + new_end_byte: 10, + start_position: Point::new(0, 5), + old_end_position: Point::new(0, 5), + new_end_position: Point::new(0, 10), + }; + + // Point after edit + let mut point = Point::new(0, 8); + let mut byte = 8; + edit.edit_point(&mut point, &mut byte); + assert_eq!(point, Point::new(0, 13)); + assert_eq!(byte, 13); + + // Point before edit + let mut point = Point::new(0, 2); + let mut byte = 2; + edit.edit_point(&mut point, &mut byte); + assert_eq!(point, Point::new(0, 2)); + assert_eq!(byte, 2); + + // Point at edit start + let mut point = Point::new(0, 5); + let mut byte = 5; + edit.edit_point(&mut point, &mut byte); + assert_eq!(point, Point::new(0, 10)); + assert_eq!(byte, 10); +} + +#[test] +fn test_edit_range() { + use tree_sitter::{InputEdit, Point, Range}; + + let edit = InputEdit { + start_byte: 10, + old_end_byte: 15, + new_end_byte: 20, + start_position: Point::new(1, 0), + old_end_position: Point::new(1, 5), + new_end_position: Point::new(2, 0), + }; + + // Range after edit + let mut range = Range { + start_byte: 20, + end_byte: 25, + start_point: Point::new(2, 0), + end_point: Point::new(2, 5), + }; + edit.edit_range(&mut range); + assert_eq!(range.start_byte, 25); + assert_eq!(range.end_byte, 30); + assert_eq!(range.start_point, Point::new(3, 0)); + assert_eq!(range.end_point, Point::new(3, 5)); + + // Range before edit + let mut range = Range { + start_byte: 5, + end_byte: 8, + start_point: Point::new(0, 5), + end_point: Point::new(0, 8), + }; + edit.edit_range(&mut range); + assert_eq!(range.start_byte, 5); + assert_eq!(range.end_byte, 8); + assert_eq!(range.start_point, Point::new(0, 5)); + assert_eq!(range.end_point, Point::new(0, 8)); + + // Range overlapping edit + let mut range = Range { + start_byte: 8, + end_byte: 12, + start_point: Point::new(0, 8), + end_point: Point::new(1, 2), + }; + edit.edit_range(&mut range); + assert_eq!(range.start_byte, 8); + assert_eq!(range.end_byte, 10); + assert_eq!(range.start_point, Point::new(0, 8)); + assert_eq!(range.end_point, Point::new(1, 0)); +} + #[test] fn test_node_sexp() { let mut parser = Parser::new(); diff --git a/lib/binding_rust/bindings.rs b/lib/binding_rust/bindings.rs index 77bfef32..3feb8409 100644 --- a/lib/binding_rust/bindings.rs +++ b/lib/binding_rust/bindings.rs @@ -495,6 +495,14 @@ extern "C" { #[doc = " Check if two nodes are identical."] pub fn ts_node_eq(self_: TSNode, other: TSNode) -> bool; } +extern "C" { + #[doc = " Edit a point to keep it in-sync with source code that has been edited.\n\n This function updates a single point's byte offset and row/column position\n based on an edit operation. This is useful for editing points without\n requiring a tree or node instance."] + pub fn ts_point_edit(point: *mut TSPoint, point_byte: *mut u32, edit: *const TSInputEdit); +} +extern "C" { + #[doc = " Edit a range to keep it in-sync with source code that has been edited.\n\n This function updates a range's start and end positions based on an edit\n operation. This is useful for editing ranges without requiring a tree\n or node instance."] + pub fn ts_range_edit(range: *mut TSRange, edit: *const TSInputEdit); +} extern "C" { #[doc = " Create a new tree cursor starting from the given node.\n\n A tree cursor allows you to walk a syntax tree more efficiently than is\n possible using the [`TSNode`] functions. It is a mutable object that is always\n on a certain syntax node, and can be moved imperatively to different nodes.\n\n Note that the given node is considered the root of the cursor,\n and the cursor cannot walk outside this node."] pub fn ts_tree_cursor_new(node: TSNode) -> TSTreeCursor; diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs index 074981da..701ef7ac 100644 --- a/lib/binding_rust/lib.rs +++ b/lib/binding_rust/lib.rs @@ -120,6 +120,48 @@ pub struct InputEdit { pub new_end_position: Point, } +impl InputEdit { + /// Edit a point to keep it in-sync with source code that has been edited. + /// + /// This function updates a single point's byte offset and row/column position + /// based on this edit operation. This is useful for editing points without + /// requiring a tree or node instance. + #[doc(alias = "ts_point_edit")] + pub fn edit_point(&self, point: &mut Point, byte: &mut usize) { + let edit = self.into(); + let mut ts_point = (*point).into(); + let mut ts_byte = *byte as u32; + + unsafe { + ffi::ts_point_edit( + core::ptr::addr_of_mut!(ts_point), + core::ptr::addr_of_mut!(ts_byte), + &edit, + ); + } + + *point = ts_point.into(); + *byte = ts_byte as usize; + } + + /// Edit a range to keep it in-sync with source code that has been edited. + /// + /// This function updates a range's start and end positions based on this edit + /// operation. This is useful for editing ranges without requiring a tree + /// or node instance. + #[doc(alias = "ts_range_edit")] + pub fn edit_range(&self, range: &mut Range) { + let edit = self.into(); + let mut ts_range = (*range).into(); + + unsafe { + ffi::ts_range_edit(core::ptr::addr_of_mut!(ts_range), &edit); + } + + *range = ts_range.into(); + } +} + /// A single node within a syntax [`Tree`]. #[doc(alias = "TSNode")] #[derive(Clone, Copy)] diff --git a/lib/include/tree_sitter/api.h b/lib/include/tree_sitter/api.h index f1c69dec..264d405d 100644 --- a/lib/include/tree_sitter/api.h +++ b/lib/include/tree_sitter/api.h @@ -708,6 +708,24 @@ void ts_node_edit(TSNode *self, const TSInputEdit *edit); */ bool ts_node_eq(TSNode self, TSNode other); +/** + * Edit a point to keep it in-sync with source code that has been edited. + * + * This function updates a single point's byte offset and row/column position + * based on an edit operation. This is useful for editing points without + * requiring a tree or node instance. + */ +void ts_point_edit(TSPoint *point, uint32_t *point_byte, const TSInputEdit *edit); + +/** + * Edit a range to keep it in-sync with source code that has been edited. + * + * This function updates a range's start and end positions based on an edit + * operation. This is useful for editing ranges without requiring a tree + * or node instance. + */ +void ts_range_edit(TSRange *range, const TSInputEdit *edit); + /************************/ /* Section - TreeCursor */ /************************/ diff --git a/lib/src/get_changed_ranges.c b/lib/src/get_changed_ranges.c index 11084c33..c4c63653 100644 --- a/lib/src/get_changed_ranges.c +++ b/lib/src/get_changed_ranges.c @@ -103,6 +103,40 @@ void ts_range_array_get_changed_ranges( } } +void ts_range_edit(TSRange *range, const TSInputEdit *edit) { + if (range->end_byte >= edit->old_end_byte) { + if (range->end_byte != UINT32_MAX) { + range->end_byte = edit->new_end_byte + (range->end_byte - edit->old_end_byte); + range->end_point = point_add( + edit->new_end_point, + point_sub(range->end_point, edit->old_end_point) + ); + if (range->end_byte < edit->new_end_byte) { + range->end_byte = UINT32_MAX; + range->end_point = POINT_MAX; + } + } + } else if (range->end_byte > edit->start_byte) { + range->end_byte = edit->start_byte; + range->end_point = edit->start_point; + } + + if (range->start_byte >= edit->old_end_byte) { + range->start_byte = edit->new_end_byte + (range->start_byte - edit->old_end_byte); + range->start_point = point_add( + edit->new_end_point, + point_sub(range->start_point, edit->old_end_point) + ); + if (range->start_byte < edit->new_end_byte) { + range->start_byte = UINT32_MAX; + range->start_point = POINT_MAX; + } + } else if (range->start_byte > edit->start_byte) { + range->start_byte = edit->start_byte; + range->start_point = edit->start_point; + } +} + typedef struct { TreeCursor cursor; const TSLanguage *language; diff --git a/lib/src/lib.c b/lib/src/lib.c index 9bfb69f0..f56be97a 100644 --- a/lib/src/lib.c +++ b/lib/src/lib.c @@ -4,6 +4,7 @@ #include "./lexer.c" #include "./node.c" #include "./parser.c" +#include "./point.c" #include "./query.c" #include "./stack.c" #include "./subtree.c" diff --git a/lib/src/node.c b/lib/src/node.c index d83fa90b..84ffed28 100644 --- a/lib/src/node.c +++ b/lib/src/node.c @@ -861,13 +861,7 @@ void ts_node_edit(TSNode *self, const TSInputEdit *edit) { uint32_t start_byte = ts_node_start_byte(*self); TSPoint start_point = ts_node_start_point(*self); - if (start_byte >= edit->old_end_byte) { - start_byte = edit->new_end_byte + (start_byte - edit->old_end_byte); - start_point = point_add(edit->new_end_point, point_sub(start_point, edit->old_end_point)); - } else if (start_byte > edit->start_byte) { - start_byte = edit->new_end_byte; - start_point = edit->new_end_point; - } + ts_point_edit(&start_point, &start_byte, edit); self->context[0] = start_byte; self->context[1] = start_point.row; diff --git a/lib/src/point.c b/lib/src/point.c new file mode 100644 index 00000000..da46f61b --- /dev/null +++ b/lib/src/point.c @@ -0,0 +1,17 @@ +#include "point.h" + +void ts_point_edit(TSPoint *point, uint32_t *byte, const TSInputEdit *edit) { + uint32_t start_byte = *byte; + TSPoint start_point = *point; + + if (start_byte >= edit->old_end_byte) { + start_byte = edit->new_end_byte + (start_byte - edit->old_end_byte); + start_point = point_add(edit->new_end_point, point_sub(start_point, edit->old_end_point)); + } else if (start_byte > edit->start_byte) { + start_byte = edit->new_end_byte; + start_point = edit->new_end_point; + } + + *point = start_point; + *byte = start_byte; +} diff --git a/lib/src/tree.c b/lib/src/tree.c index 705f174c..6747fd6d 100644 --- a/lib/src/tree.c +++ b/lib/src/tree.c @@ -54,37 +54,7 @@ const TSLanguage *ts_tree_language(const TSTree *self) { void ts_tree_edit(TSTree *self, const TSInputEdit *edit) { for (unsigned i = 0; i < self->included_range_count; i++) { - TSRange *range = &self->included_ranges[i]; - if (range->end_byte >= edit->old_end_byte) { - if (range->end_byte != UINT32_MAX) { - range->end_byte = edit->new_end_byte + (range->end_byte - edit->old_end_byte); - range->end_point = point_add( - edit->new_end_point, - point_sub(range->end_point, edit->old_end_point) - ); - if (range->end_byte < edit->new_end_byte) { - range->end_byte = UINT32_MAX; - range->end_point = POINT_MAX; - } - } - } else if (range->end_byte > edit->start_byte) { - range->end_byte = edit->start_byte; - range->end_point = edit->start_point; - } - if (range->start_byte >= edit->old_end_byte) { - range->start_byte = edit->new_end_byte + (range->start_byte - edit->old_end_byte); - range->start_point = point_add( - edit->new_end_point, - point_sub(range->start_point, edit->old_end_point) - ); - if (range->start_byte < edit->new_end_byte) { - range->start_byte = UINT32_MAX; - range->start_point = POINT_MAX; - } - } else if (range->start_byte > edit->start_byte) { - range->start_byte = edit->start_byte; - range->start_point = edit->start_point; - } + ts_range_edit(&self->included_ranges[i], edit); } SubtreePool pool = ts_subtree_pool_new(0); From 48a5077035234c540bd368492e9395b34cc70a9d Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Fri, 19 Sep 2025 01:57:15 -0400 Subject: [PATCH 476/663] feat(web)!: add API for editing points and ranges --- lib/binding_web/lib/exports.txt | 2 + lib/binding_web/src/constants.ts | 23 ------ lib/binding_web/src/edit.ts | 125 ++++++++++++++++++++++++++++++ lib/binding_web/src/index.ts | 2 +- lib/binding_web/src/marshal.ts | 3 +- lib/binding_web/src/node.ts | 3 +- lib/binding_web/src/tree.ts | 3 +- lib/binding_web/test/edit.test.ts | 124 +++++++++++++++++++++++++++++ lib/binding_web/test/tree.test.ts | 12 +-- 9 files changed, 264 insertions(+), 33 deletions(-) create mode 100644 lib/binding_web/src/edit.ts create mode 100644 lib/binding_web/test/edit.test.ts diff --git a/lib/binding_web/lib/exports.txt b/lib/binding_web/lib/exports.txt index 43a42bd4..86104496 100644 --- a/lib/binding_web/lib/exports.txt +++ b/lib/binding_web/lib/exports.txt @@ -61,6 +61,7 @@ "ts_parser_set_language", "ts_parser_set_included_ranges", "ts_parser_included_ranges_wasm", +"ts_point_edit", "ts_query_capture_count", "ts_query_capture_name_for_id", "ts_query_captures_wasm", @@ -79,6 +80,7 @@ "ts_query_is_pattern_non_local", "ts_query_is_pattern_rooted", "ts_query_is_pattern_guaranteed_at_step", +"ts_range_edit", "ts_tree_copy", "ts_tree_cursor_current_field_id_wasm", "ts_tree_cursor_current_depth_wasm", diff --git a/lib/binding_web/src/constants.ts b/lib/binding_web/src/constants.ts index 287d8291..026e9f16 100644 --- a/lib/binding_web/src/constants.ts +++ b/lib/binding_web/src/constants.ts @@ -33,29 +33,6 @@ export interface Range { endIndex: number; } -/** - * A summary of a change to a text document. - */ -export interface Edit { - /** The start position of the change. */ - startPosition: Point; - - /** The end position of the change before the edit. */ - oldEndPosition: Point; - - /** The end position of the change after the edit. */ - newEndPosition: Point; - - /** The start index of the change. */ - startIndex: number; - - /** The end index of the change before the edit. */ - oldEndIndex: number; - - /** The end index of the change after the edit. */ - newEndIndex: number; -} - /** @internal */ export const SIZE_OF_SHORT = 2; diff --git a/lib/binding_web/src/edit.ts b/lib/binding_web/src/edit.ts new file mode 100644 index 00000000..ee3d2d46 --- /dev/null +++ b/lib/binding_web/src/edit.ts @@ -0,0 +1,125 @@ +import { Point, Range } from "./constants"; + +export class Edit { + /** The start position of the change. */ + startPosition: Point; + + /** The end position of the change before the edit. */ + oldEndPosition: Point; + + /** The end position of the change after the edit. */ + newEndPosition: Point; + + /** The start index of the change. */ + startIndex: number; + + /** The end index of the change before the edit. */ + oldEndIndex: number; + + /** The end index of the change after the edit. */ + newEndIndex: number; + + constructor({ + startIndex, + oldEndIndex, + newEndIndex, + startPosition, + oldEndPosition, + newEndPosition, + }: { + startIndex: number; + oldEndIndex: number; + newEndIndex: number; + startPosition: Point; + oldEndPosition: Point; + newEndPosition: Point; + }) { + this.startIndex = startIndex >>> 0; + this.oldEndIndex = oldEndIndex >>> 0; + this.newEndIndex = newEndIndex >>> 0; + this.startPosition = startPosition; + this.oldEndPosition = oldEndPosition; + this.newEndPosition = newEndPosition; + } + + /** + * Edit a point and index to keep it in-sync with source code that has been edited. + * + * This function updates a single point's byte offset and row/column position + * based on an edit operation. This is useful for editing points without + * requiring a tree or node instance. + */ + editPoint(point: Point, index: number): { point: Point; index: number } { + let newIndex = index; + const newPoint = { ...point }; + + if (index >= this.oldEndIndex) { + newIndex = this.newEndIndex + (index - this.oldEndIndex); + const originalRow = point.row; + newPoint.row = this.newEndPosition.row + (point.row - this.oldEndPosition.row); + newPoint.column = originalRow === this.oldEndPosition.row + ? this.newEndPosition.column + (point.column - this.oldEndPosition.column) + : point.column; + } else if (index > this.startIndex) { + newIndex = this.newEndIndex; + newPoint.row = this.newEndPosition.row; + newPoint.column = this.newEndPosition.column; + } + + return { point: newPoint, index: newIndex }; + } + + /** + * Edit a range to keep it in-sync with source code that has been edited. + * + * This function updates a range's start and end positions based on an edit + * operation. This is useful for editing ranges without requiring a tree + * or node instance. + */ + editRange(range: Range): Range { + const newRange: Range = { + startIndex: range.startIndex, + startPosition: { ...range.startPosition }, + endIndex: range.endIndex, + endPosition: { ...range.endPosition } + }; + + if (range.endIndex >= this.oldEndIndex) { + if (range.endIndex !== Number.MAX_SAFE_INTEGER) { + newRange.endIndex = this.newEndIndex + (range.endIndex - this.oldEndIndex); + newRange.endPosition = { + row: this.newEndPosition.row + (range.endPosition.row - this.oldEndPosition.row), + column: range.endPosition.row === this.oldEndPosition.row + ? this.newEndPosition.column + (range.endPosition.column - this.oldEndPosition.column) + : range.endPosition.column, + }; + if (newRange.endIndex < this.newEndIndex) { + newRange.endIndex = Number.MAX_SAFE_INTEGER; + newRange.endPosition = { row: Number.MAX_SAFE_INTEGER, column: Number.MAX_SAFE_INTEGER }; + } + } + } else if (range.endIndex > this.startIndex) { + newRange.endIndex = this.startIndex; + newRange.endPosition = { ...this.startPosition }; + } + + if (range.startIndex >= this.oldEndIndex) { + newRange.startIndex = this.newEndIndex + (range.startIndex - this.oldEndIndex); + newRange.startPosition = { + row: this.newEndPosition.row + (range.startPosition.row - this.oldEndPosition.row), + column: range.startPosition.row === this.oldEndPosition.row + ? this.newEndPosition.column + (range.startPosition.column - this.oldEndPosition.column) + : range.startPosition.column, + }; + if (newRange.startIndex < this.newEndIndex) { + newRange.startIndex = Number.MAX_SAFE_INTEGER; + newRange.startPosition = { row: Number.MAX_SAFE_INTEGER, column: Number.MAX_SAFE_INTEGER }; + } + } else if (range.startIndex > this.startIndex) { + newRange.startIndex = this.startIndex; + newRange.startPosition = { ...this.startPosition }; + } + + return newRange; + } +} diff --git a/lib/binding_web/src/index.ts b/lib/binding_web/src/index.ts index 92791145..5876db92 100644 --- a/lib/binding_web/src/index.ts +++ b/lib/binding_web/src/index.ts @@ -1,11 +1,11 @@ export type { Point, Range, - Edit, ParseCallback, ProgressCallback, LogCallback, } from './constants'; +export { Edit } from './edit'; export { type ParseOptions, type ParseState, diff --git a/lib/binding_web/src/marshal.ts b/lib/binding_web/src/marshal.ts index c742afc6..f09f8e23 100644 --- a/lib/binding_web/src/marshal.ts +++ b/lib/binding_web/src/marshal.ts @@ -1,4 +1,4 @@ -import { Edit, INTERNAL, Point, Range, SIZE_OF_INT, SIZE_OF_NODE, SIZE_OF_POINT, C } from "./constants"; +import { INTERNAL, Point, Range, SIZE_OF_INT, SIZE_OF_NODE, SIZE_OF_POINT, C } from "./constants"; import { Node } from "./node"; import { Tree } from "./tree"; // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -6,6 +6,7 @@ import { Query, QueryCapture, type QueryMatch } from "./query"; import { TreeCursor } from "./tree_cursor"; import { TRANSFER_BUFFER } from "./parser"; import { LanguageMetadata } from "./language"; +import { Edit } from "./edit"; /** * @internal diff --git a/lib/binding_web/src/node.ts b/lib/binding_web/src/node.ts index aeecbd21..1026d680 100644 --- a/lib/binding_web/src/node.ts +++ b/lib/binding_web/src/node.ts @@ -1,10 +1,11 @@ -import { INTERNAL, Internal, assertInternal, Point, Edit, SIZE_OF_INT, SIZE_OF_NODE, SIZE_OF_POINT, ZERO_POINT, isPoint, C } from './constants'; +import { INTERNAL, Internal, assertInternal, SIZE_OF_INT, SIZE_OF_NODE, SIZE_OF_POINT, ZERO_POINT, isPoint, C, Point } from './constants'; import { getText, Tree } from './tree'; import { TreeCursor } from './tree_cursor'; // eslint-disable-next-line @typescript-eslint/no-unused-vars import { Language } from './language'; import { marshalNode, marshalPoint, unmarshalNode, unmarshalPoint } from './marshal'; import { TRANSFER_BUFFER } from './parser'; +import { Edit } from './edit'; /** A single node within a syntax {@link Tree}. */ export class Node { diff --git a/lib/binding_web/src/tree.ts b/lib/binding_web/src/tree.ts index e45ca304..7a251440 100644 --- a/lib/binding_web/src/tree.ts +++ b/lib/binding_web/src/tree.ts @@ -1,9 +1,10 @@ -import { INTERNAL, Internal, assertInternal, ParseCallback, Point, Range, Edit, SIZE_OF_NODE, SIZE_OF_INT, SIZE_OF_RANGE, C } from './constants'; +import { INTERNAL, Internal, assertInternal, ParseCallback, Point, Range, SIZE_OF_NODE, SIZE_OF_INT, SIZE_OF_RANGE, C } from './constants'; import { Language } from './language'; import { Node } from './node'; import { TreeCursor } from './tree_cursor'; import { marshalEdit, marshalPoint, unmarshalNode, unmarshalRange } from './marshal'; import { TRANSFER_BUFFER } from './parser'; +import { Edit } from './edit'; /** @internal */ export function getText(tree: Tree, startIndex: number, endIndex: number, startPosition: Point): string { diff --git a/lib/binding_web/test/edit.test.ts b/lib/binding_web/test/edit.test.ts new file mode 100644 index 00000000..bd4cb194 --- /dev/null +++ b/lib/binding_web/test/edit.test.ts @@ -0,0 +1,124 @@ +import { describe, it, expect } from 'vitest'; +import { Edit } from '../src'; + +describe('Edit', () => { + it('edits a point after the edit', () => { + const edit = new Edit({ + startIndex: 5, + oldEndIndex: 5, + newEndIndex: 10, + startPosition: { row: 0, column: 5 }, + oldEndPosition: { row: 0, column: 5 }, + newEndPosition: { row: 0, column: 10 }, + }); + + const point = { row: 0, column: 8 }; + const index = 8; + const result = edit.editPoint(point, index); + expect(result.point).toEqual({ row: 0, column: 13 }); + expect(result.index).toBe(13); + }); + + it('edits a point before the edit', () => { + const edit = new Edit({ + startIndex: 5, + oldEndIndex: 5, + newEndIndex: 10, + startPosition: { row: 0, column: 5 }, + oldEndPosition: { row: 0, column: 5 }, + newEndPosition: { row: 0, column: 10 }, + }); + + const point = { row: 0, column: 2 }; + const index = 2; + const result = edit.editPoint(point, index); + expect(result.point).toEqual({ row: 0, column: 2 }); + expect(result.index).toBe(2); + }); + + it('edits a point at the start of the edit', () => { + const edit = new Edit({ + startIndex: 5, + oldEndIndex: 5, + newEndIndex: 10, + startPosition: { row: 0, column: 5 }, + oldEndPosition: { row: 0, column: 5 }, + newEndPosition: { row: 0, column: 10 }, + }); + + const point = { row: 0, column: 5 }; + const index = 5; + const result = edit.editPoint(point, index); + expect(result.point).toEqual({ row: 0, column: 10 }); + expect(result.index).toBe(10); + }); + + it('edits a range after the edit', () => { + const edit = new Edit({ + startIndex: 10, + oldEndIndex: 15, + newEndIndex: 20, + startPosition: { row: 1, column: 0 }, + oldEndPosition: { row: 1, column: 5 }, + newEndPosition: { row: 2, column: 0 }, + }); + + const range = { + startPosition: { row: 2, column: 0 }, + endPosition: { row: 2, column: 5 }, + startIndex: 20, + endIndex: 25, + }; + const result = edit.editRange(range); + expect(result.startIndex).toBe(25); + expect(result.endIndex).toBe(30); + expect(result.startPosition).toEqual({ row: 3, column: 0 }); + expect(result.endPosition).toEqual({ row: 3, column: 5 }); + }); + + it('edits a range before the edit', () => { + const edit = new Edit({ + startIndex: 10, + oldEndIndex: 15, + newEndIndex: 20, + startPosition: { row: 1, column: 0 }, + oldEndPosition: { row: 1, column: 5 }, + newEndPosition: { row: 2, column: 0 }, + }); + + const range = { + startPosition: { row: 0, column: 5 }, + endPosition: { row: 0, column: 8 }, + startIndex: 5, + endIndex: 8, + }; + const result = edit.editRange(range); + expect(result.startIndex).toBe(5); + expect(result.endIndex).toBe(8); + expect(result.startPosition).toEqual({ row: 0, column: 5 }); + expect(result.endPosition).toEqual({ row: 0, column: 8 }); + }); + + it('edits a range overlapping the edit', () => { + const edit = new Edit({ + startIndex: 10, + oldEndIndex: 15, + newEndIndex: 20, + startPosition: { row: 1, column: 0 }, + oldEndPosition: { row: 1, column: 5 }, + newEndPosition: { row: 2, column: 0 } + }); + + const range = { + startPosition: { row: 0, column: 8 }, + endPosition: { row: 1, column: 2 }, + startIndex: 8, + endIndex: 12, + }; + const result = edit.editRange(range); + expect(result.startIndex).toBe(8); + expect(result.endIndex).toBe(10); + expect(result.startPosition).toEqual({ row: 0, column: 8 }); + expect(result.endPosition).toEqual({ row: 1, column: 0 }); + }); +}); diff --git a/lib/binding_web/test/tree.test.ts b/lib/binding_web/test/tree.test.ts index 3cf40eab..85f895a7 100644 --- a/lib/binding_web/test/tree.test.ts +++ b/lib/binding_web/test/tree.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect, beforeAll, beforeEach, afterEach } from 'vitest'; -import type { Point, Language, Tree, Edit, TreeCursor } from '../src'; -import { Parser } from '../src'; +import type { Point, Language, Tree, TreeCursor } from '../src'; +import { Parser, Edit } from '../src'; import helper from './helper'; let JavaScript: Language; @@ -103,14 +103,14 @@ describe('Tree', () => { ); sourceCode = 'abc + defg + hij'; - tree.edit({ + tree.edit(new Edit({ startIndex: 2, oldEndIndex: 2, newEndIndex: 5, startPosition: { row: 0, column: 2 }, oldEndPosition: { row: 0, column: 2 }, newEndPosition: { row: 0, column: 5 }, - }); + })); const tree2 = parser.parse(sourceCode, tree)!; expect(tree2.rootNode.toString()).toBe( @@ -402,14 +402,14 @@ function spliceInput(input: string, startIndex: number, lengthRemoved: number, n const newEndPosition = getExtent(input.slice(0, newEndIndex)); return [ input, - { + new Edit({ startIndex, startPosition, oldEndIndex, oldEndPosition, newEndIndex, newEndPosition, - }, + }), ]; } From 0cf217179c83d04eb583b380a6b5c9c21748f2e8 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Fri, 19 Sep 2025 04:11:42 -0400 Subject: [PATCH 477/663] feat(rust): add `reborrow` method to `ParseOptions` --- crates/cli/src/tests/parser_test.rs | 51 +++++++++++++++++++++++++++++ lib/binding_rust/lib.rs | 28 ++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/crates/cli/src/tests/parser_test.rs b/crates/cli/src/tests/parser_test.rs index ba897163..72f917b3 100644 --- a/crates/cli/src/tests/parser_test.rs +++ b/crates/cli/src/tests/parser_test.rs @@ -2075,3 +2075,54 @@ const fn simple_range(start: usize, end: usize) -> Range { fn chunked_input<'a>(text: &'a str, size: usize) -> impl FnMut(usize, Point) -> &'a [u8] { move |offset, _| &text.as_bytes()[offset..text.len().min(offset + size)] } + +#[test] +fn test_parse_options_reborrow() { + let mut parser = Parser::new(); + parser.set_language(&get_language("rust")).unwrap(); + + let parse_count = AtomicUsize::new(0); + + let mut callback = |_: &ParseState| { + parse_count.fetch_add(1, Ordering::SeqCst); + ControlFlow::Continue(()) + }; + let mut options = ParseOptions::new().progress_callback(&mut callback); + + let text1 = "fn first() {}".repeat(20); + let text2 = "fn second() {}".repeat(20); + + let tree1 = parser + .parse_with_options( + &mut |offset, _| { + if offset >= text1.len() { + &[] + } else { + &text1.as_bytes()[offset..] + } + }, + None, + Some(options.reborrow()), + ) + .unwrap(); + + assert_eq!(tree1.root_node().child(0).unwrap().kind(), "function_item"); + + let tree2 = parser + .parse_with_options( + &mut |offset, _| { + if offset >= text2.len() { + &[] + } else { + &text2.as_bytes()[offset..] + } + }, + None, + Some(options.reborrow()), + ) + .unwrap(); + + assert_eq!(tree2.root_node().child(0).unwrap().kind(), "function_item"); + + assert!(parse_count.load(Ordering::SeqCst) > 0); +} diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs index 701ef7ac..6938c1db 100644 --- a/lib/binding_rust/lib.rs +++ b/lib/binding_rust/lib.rs @@ -225,6 +225,20 @@ impl<'a> ParseOptions<'a> { self.progress_callback = Some(callback); self } + + /// Create a new `ParseOptions` with a shorter lifetime, borrowing from this one. + /// + /// This is useful when you need to reuse parse options multiple times, e.g., calling + /// [`Parser::parse_with_options`] multiple times with the same options. + #[must_use] + pub fn reborrow(&mut self) -> ParseOptions { + ParseOptions { + progress_callback: match &mut self.progress_callback { + Some(cb) => Some(*cb), + None => None, + }, + } + } } #[derive(Default)] @@ -246,6 +260,20 @@ impl<'a> QueryCursorOptions<'a> { self.progress_callback = Some(callback); self } + + /// Create a new `QueryCursorOptions` with a shorter lifetime, borrowing from this one. + /// + /// This is useful when you need to reuse query cursor options multiple times, e.g., calling + /// [`QueryCursor::matches`] multiple times with the same options. + #[must_use] + pub fn reborrow(&mut self) -> QueryCursorOptions { + QueryCursorOptions { + progress_callback: match &mut self.progress_callback { + Some(cb) => Some(*cb), + None => None, + }, + } + } } struct QueryCursorOptionsDrop(*mut ffi::TSQueryCursorOptions); From 552ab537e80e9fc6e5a374ff1b7f82e7101c1950 Mon Sep 17 00:00:00 2001 From: John-Philip Taylor <41227383+jpt13653903@users.noreply.github.com> Date: Fri, 19 Sep 2025 23:52:08 +0200 Subject: [PATCH 478/663] docs(cli): add docs on new `version` features --- docs/src/cli/version.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/src/cli/version.md b/docs/src/cli/version.md index 94ec6282..e8f7a840 100644 --- a/docs/src/cli/version.md +++ b/docs/src/cli/version.md @@ -17,12 +17,26 @@ This will update the version in several files, if they exist: * CMakeLists.txt * pyproject.toml +Alternative forms can use the version in `tree-sitter.json` to bump automatically: + +```bash +tree-sitter version --bump patch # patch bump +tree-sitter version --bump minor # minor bump +tree-sitter version --bump major # major bump +``` + As a grammar author, you should keep the version of your grammar in sync across different bindings. However, doing so manually is error-prone and tedious, so this command takes care of the burden. If you are using a version control system, it is recommended to commit the changes made by this command, and to tag the commit with the new version. +To print the current version without bumping it, use: + +```bash +tree-sitter version +``` + ## Options ### `-p/--grammar-path ` From 0ca8fe8c12dde40008305e7925cac410952f0752 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Fri, 19 Sep 2025 05:18:24 -0400 Subject: [PATCH 479/663] feat(playground): add export flag --- crates/cli/src/main.rs | 13 +++++-- crates/cli/src/playground.rs | 66 ++++++++++++++++++++++++++++++++++++ docs/src/cli/playground.md | 4 +++ 3 files changed, 81 insertions(+), 2 deletions(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 76ba57ff..11545ff8 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -545,6 +545,9 @@ struct Playground { /// Path to the directory containing the grammar and Wasm files #[arg(long)] pub grammar_path: Option, + /// Export playground files to specified directory instead of serving them + #[arg(long, short)] + pub export: Option, } #[derive(Args)] @@ -1786,9 +1789,15 @@ impl Tags { impl Playground { fn run(self, current_dir: &Path) -> Result<()> { - let open_in_browser = !self.quiet; let grammar_path = self.grammar_path.as_deref().map_or(current_dir, Path::new); - playground::serve(grammar_path, open_in_browser)?; + + if let Some(export_path) = self.export { + playground::export(grammar_path, &export_path)?; + } else { + let open_in_browser = !self.quiet; + playground::serve(grammar_path, open_in_browser)?; + } + Ok(()) } } diff --git a/crates/cli/src/playground.rs b/crates/cli/src/playground.rs index 2344a805..a966d5c0 100644 --- a/crates/cli/src/playground.rs +++ b/crates/cli/src/playground.rs @@ -46,6 +46,72 @@ fn get_main_html(tree_sitter_dir: Option<&Path>) -> Cow<'static, [u8]> { ) } +pub fn export(grammar_path: &Path, export_path: &Path) -> Result<()> { + let (grammar_name, language_wasm) = wasm::load_language_wasm_file(grammar_path)?; + + fs::create_dir_all(export_path).with_context(|| { + format!( + "Failed to create export directory: {}", + export_path.display() + ) + })?; + + let tree_sitter_dir = env::var("TREE_SITTER_BASE_DIR").map(PathBuf::from).ok(); + + let playground_js = get_playground_js(tree_sitter_dir.as_deref()); + let lib_js = get_lib_js(tree_sitter_dir.as_deref()); + let lib_wasm = get_lib_wasm(tree_sitter_dir.as_deref()); + + let has_local_playground_js = !playground_js.is_empty(); + let has_local_lib_js = !lib_js.is_empty(); + let has_local_lib_wasm = !lib_wasm.is_empty(); + + let mut main_html = str::from_utf8(&get_main_html(tree_sitter_dir.as_deref())) + .unwrap() + .replace("THE_LANGUAGE_NAME", &grammar_name); + + if !has_local_playground_js { + main_html = main_html.replace( + r#""#, + r#""# + ); + } + if !has_local_lib_js { + main_html = main_html.replace( + "import * as TreeSitter from './web-tree-sitter.js';", + "import * as TreeSitter from 'https://tree-sitter.github.io/web-tree-sitter.js';", + ); + } + + fs::write(export_path.join("index.html"), main_html.as_bytes()) + .with_context(|| "Failed to write index.html")?; + + fs::write(export_path.join("tree-sitter-parser.wasm"), language_wasm) + .with_context(|| "Failed to write parser wasm file")?; + + if has_local_playground_js { + fs::write(export_path.join("playground.js"), playground_js) + .with_context(|| "Failed to write playground.js")?; + } + + if has_local_lib_js { + fs::write(export_path.join("web-tree-sitter.js"), lib_js) + .with_context(|| "Failed to write web-tree-sitter.js")?; + } + + if has_local_lib_wasm { + fs::write(export_path.join("web-tree-sitter.wasm"), lib_wasm) + .with_context(|| "Failed to write web-tree-sitter.wasm")?; + } + + println!( + "Exported playground to {}", + export_path.canonicalize()?.display() + ); + + Ok(()) +} + pub fn serve(grammar_path: &Path, open_in_browser: bool) -> Result<()> { let server = get_server()?; let (grammar_name, language_wasm) = wasm::load_language_wasm_file(grammar_path)?; diff --git a/docs/src/cli/playground.md b/docs/src/cli/playground.md index 4f194b9c..0dbff469 100644 --- a/docs/src/cli/playground.md +++ b/docs/src/cli/playground.md @@ -13,6 +13,10 @@ For this to work, you must have already built the parser as a Wasm module. This ## Options +### `-e/--export ` + +Export static playground files to the specified directory instead of serving them. + ### `-q/--quiet` Don't automatically open the playground in the default browser. From 2a1a33d6491de970ae515ab0f86dd0a4b9527768 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sat, 20 Sep 2025 02:59:17 -0400 Subject: [PATCH 480/663] patch zig --- build.zig | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/build.zig b/build.zig index e1b37719..66a448cb 100644 --- a/build.zig +++ b/build.zig @@ -60,7 +60,7 @@ pub fn wasmtimeDep(target: std.Target) []const u8 { const arch = target.cpu.arch; const os = target.os.tag; const abi = target.abi; - return switch (os) { + return @as(?[]const u8, switch (os) { .linux => switch (arch) { .x86_64 => switch (abi) { .gnu => "wasmtime_c_api_x86_64_linux", @@ -70,11 +70,26 @@ pub fn wasmtimeDep(target: std.Target) []const u8 { }, .aarch64 => switch (abi) { .gnu => "wasmtime_c_api_aarch64_linux", + .musl => "wasmtime_c_api_aarch64_musl", .android => "wasmtime_c_api_aarch64_android", else => null, }, - .s390x => "wasmtime_c_api_s390x_linux", - .riscv64 => "wasmtime_c_api_riscv64gc_linux", + .x86 => switch (abi) { + .gnu => "wasmtime_c_api_i686_linux", + else => null, + }, + .arm => switch (abi) { + .gnueabi => "wasmtime_c_api_armv7_linux", + else => null, + }, + .s390x => switch (abi) { + .gnu => "wasmtime_c_api_s390x_linux", + else => null, + }, + .riscv64 => switch (abi) { + .gnu => "wasmtime_c_api_riscv64gc_linux", + else => null, + }, else => null, }, .windows => switch (arch) { @@ -87,6 +102,10 @@ pub fn wasmtimeDep(target: std.Target) []const u8 { .msvc => "wasmtime_c_api_aarch64_windows", else => null, }, + .x86 => switch (abi) { + .msvc => "wasmtime_c_api_i686_windows", + else => null, + }, else => null, }, .macos => switch (arch) { @@ -95,7 +114,7 @@ pub fn wasmtimeDep(target: std.Target) []const u8 { else => null, }, else => null, - } orelse std.debug.panic( + }) orelse std.debug.panic( "Unsupported target for wasmtime: {s}-{s}-{s}", .{ @tagName(arch), @tagName(os), @tagName(abi) }, ); From 79ef484392d6500384a5f67ab65db2fc778f4743 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Sat, 20 Sep 2025 09:38:54 +0300 Subject: [PATCH 481/663] ci: cross-compile without cross-rs --- .github/scripts/cross.sh | 3 - .github/scripts/make.sh | 9 -- .github/scripts/tree-sitter.sh | 9 -- .github/workflows/build.yml | 243 ++++++++++++++--------------- .github/workflows/wasm_exports.yml | 6 +- 5 files changed, 116 insertions(+), 154 deletions(-) delete mode 100755 .github/scripts/cross.sh delete mode 100755 .github/scripts/make.sh delete mode 100755 .github/scripts/tree-sitter.sh diff --git a/.github/scripts/cross.sh b/.github/scripts/cross.sh deleted file mode 100755 index de1d4e94..00000000 --- a/.github/scripts/cross.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -eu - -exec docker run --rm -v /home/runner:/home/runner -w "$PWD" "$CROSS_IMAGE" "$@" diff --git a/.github/scripts/make.sh b/.github/scripts/make.sh deleted file mode 100755 index 175074f9..00000000 --- a/.github/scripts/make.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -eu - -tree_sitter="$ROOT"/target/"$TARGET"/release/tree-sitter - -if [[ $BUILD_CMD == cross ]]; then - cross.sh make CC="$CC" AR="$AR" "$@" -else - exec make "$@" -fi diff --git a/.github/scripts/tree-sitter.sh b/.github/scripts/tree-sitter.sh deleted file mode 100755 index 125a2d92..00000000 --- a/.github/scripts/tree-sitter.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -eu - -tree_sitter="$ROOT"/target/"$TARGET"/release/tree-sitter - -if [[ $BUILD_CMD == cross ]]; then - cross.sh "$CROSS_RUNNER" "$tree_sitter" "$@" -else - exec "$tree_sitter" "$@" -fi diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d0135df8..62b45485 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,10 +1,5 @@ name: Build & Test -env: - CARGO_TERM_COLOR: always - RUSTFLAGS: "-D warnings" - CROSS_DEBUG: 1 - on: workflow_call: inputs: @@ -31,39 +26,41 @@ jobs: - windows-x86 - macos-arm64 - macos-x64 + - wasm32 include: # When adding a new `target`: # 1. Define a new platform alias above - # 2. Add a new record to the matrix map in `cli/npm/install.js` - - { platform: linux-arm64 , target: aarch64-unknown-linux-gnu , os: ubuntu-24.04-arm , features: wasm } - - { platform: linux-arm , target: armv7-unknown-linux-gnueabihf , os: ubuntu-latest , use-cross: true } - - { platform: linux-x64 , target: x86_64-unknown-linux-gnu , os: ubuntu-22.04 , features: wasm } - - { platform: linux-x86 , target: i686-unknown-linux-gnu , os: ubuntu-latest , use-cross: true } - - { platform: linux-powerpc64 , target: powerpc64-unknown-linux-gnu , os: ubuntu-latest , use-cross: true } - - { platform: windows-arm64 , target: aarch64-pc-windows-msvc , os: windows-latest } - - { platform: windows-x64 , target: x86_64-pc-windows-msvc , os: windows-latest , features: wasm } - - { platform: windows-x86 , target: i686-pc-windows-msvc , os: windows-latest } - - { platform: macos-arm64 , target: aarch64-apple-darwin , os: macos-latest , features: wasm } - - { platform: macos-x64 , target: x86_64-apple-darwin , os: macos-13 , features: wasm } - - { platform: wasm32 , target: wasm32-unknown-unknown , os: ubuntu-latest , no-run: true } + # 2. Add a new record to the matrix map in `crates/cli/npm/install.js` + - { platform: linux-arm64 , target: aarch64-unknown-linux-gnu , os: ubuntu-24.04-arm } + - { platform: linux-arm , target: armv7-unknown-linux-gnueabihf , os: ubuntu-24.04-arm } + - { platform: linux-x64 , target: x86_64-unknown-linux-gnu , os: ubuntu-24.04 } + - { platform: linux-x86 , target: i686-unknown-linux-gnu , os: ubuntu-24.04 } + - { platform: linux-powerpc64 , target: powerpc64-unknown-linux-gnu , os: ubuntu-24.04 } + - { platform: windows-arm64 , target: aarch64-pc-windows-msvc , os: windows-11-arm } + - { platform: windows-x64 , target: x86_64-pc-windows-msvc , os: windows-2025 } + - { platform: windows-x86 , target: i686-pc-windows-msvc , os: windows-2025 } + - { platform: macos-arm64 , target: aarch64-apple-darwin , os: macos-15 } + - { platform: macos-x64 , target: x86_64-apple-darwin , os: macos-13 } + - { platform: wasm32 , target: wasm32-unknown-unknown , os: ubuntu-24.04 } - # Cross compilers for C library - - { platform: linux-arm64 , cc: aarch64-linux-gnu-gcc , ar: aarch64-linux-gnu-ar } - - { platform: linux-arm , cc: arm-linux-gnueabihf-gcc , ar: arm-linux-gnueabihf-ar } - - { platform: linux-x86 , cc: i686-linux-gnu-gcc , ar: i686-linux-gnu-ar } - - { platform: linux-powerpc64 , cc: powerpc64-linux-gnu-gcc , ar: powerpc64-linux-gnu-ar } + # Extra features + - { platform: linux-arm64 , features: wasm } + - { platform: linux-x64 , features: wasm } + - { platform: macos-arm64 , features: wasm } + - { platform: macos-x64 , features: wasm } - # Prevent race condition (see #2041) - - { platform: windows-x64 , rust-test-threads: 1 } - - { platform: windows-x86 , rust-test-threads: 1 } + # Cross-compilation + - { platform: linux-arm , cross: true } + - { platform: linux-x86 , cross: true } + - { platform: linux-powerpc64 , cross: true } - # Can't natively run CLI on Github runner's host - - { platform: windows-arm64 , no-run: true } + # Compile-only + - { platform: wasm32 , no-run: true } env: - BUILD_CMD: cargo - SUFFIX: ${{ contains(matrix.target, 'windows') && '.exe' || '' }} + CARGO_TERM_COLOR: always + RUSTFLAGS: -D warnings defaults: run: @@ -73,11 +70,28 @@ jobs: - name: Checkout repository uses: actions/checkout@v5 - - name: Read Emscripten version - run: printf 'EMSCRIPTEN_VERSION=%s\n' "$(> $GITHUB_ENV + - name: Set up environment + run: | + printf 'EMSCRIPTEN_VERSION=%s\n' "$(> $GITHUB_ENV + + if [[ '${{ matrix.platform }}' =~ ^windows ]]; then + # Prevent race condition (see #2041) + printf 'RUST_TEST_THREADS=1\n' >> $GITHUB_ENV + elif [[ '${{ matrix.cross }}' == true ]]; then + for target in armv7-unknown-linux-gnueabihf i686-unknown-linux-gnu powerpc64-unknown-linux-gnu; do + camel_target=${target//-/_}; target_cc=${target/-unknown/} + printf 'CC_%s=%s\n' "$camel_target" "${target_cc/v7/}-gcc" + printf 'AR_%s=%s\n' "$camel_target" "${target_cc/v7/}-ar" + printf 'CARGO_TARGET_%s_LINKER=%s\n' "${camel_target^^}" "${target_cc/v7/}-gcc" + done >> $GITHUB_ENV + { + printf 'CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_RUNNER=qemu-arm -L /usr/arm-linux-gnueabihf\n' + printf 'CARGO_TARGET_POWERPC64_UNKNOWN_LINUX_GNU_RUNNER=qemu-ppc64 -L /usr/powerpc64-linux-gnu\n' + } >> $GITHUB_ENV + fi - name: Install Emscripten - if: ${{ !matrix.no-run && !matrix.use-cross }} + if: contains(matrix.features, 'wasm') uses: mymindstorm/setup-emsdk@v14 with: version: ${{ env.EMSCRIPTEN_VERSION }} @@ -87,63 +101,35 @@ jobs: with: target: ${{ matrix.target }} - - name: Install cross - if: ${{ matrix.use-cross }} + - name: Install cross-compilation toolchain + if: matrix.cross run: | - if [ ! -x "$(command -v cross)" ]; then - # TODO: Remove 'RUSTFLAGS=""' once https://github.com/cross-rs/cross/issues/1561 is resolved - RUSTFLAGS="" cargo install cross --git https://github.com/cross-rs/cross + sudo apt-get update -qy + if [[ $PLATFORM == linux-arm ]]; then + sudo apt-get install -qy {binutils,gcc}-arm-linux-gnueabihf qemu-user + elif [[ $PLATFORM == linux-x86 ]]; then + sudo apt-get install -qy {binutils,gcc}-i686-linux-gnu + elif [[ $PLATFORM == linux-powerpc64 ]]; then + sudo apt-get install -qy {binutils,gcc}-powerpc64-linux-gnu qemu-user fi - - - name: Configure cross - if: ${{ matrix.use-cross }} - run: | - printf '%s\n' > Cross.toml \ - '[target.${{ matrix.target }}]' \ - 'image = "ghcr.io/cross-rs/${{ matrix.target }}:edge"' \ - '[build]' \ - 'pre-build = [' \ - ' "dpkg --add-architecture $CROSS_DEB_ARCH",' \ - ' "curl -fsSL https://deb.nodesource.com/setup_22.x | bash -",' \ - ' "apt-get update && apt-get -y install libssl-dev nodejs"' \ - ']' - cat - Cross.toml <<< 'Cross.toml:' - printf '%s\n' >> $GITHUB_ENV \ - "CROSS_CONFIG=$PWD/Cross.toml" \ - "CROSS_IMAGE=ghcr.io/cross-rs/${{ matrix.target }}:edge" - - - name: Set up environment env: - RUST_TEST_THREADS: ${{ matrix.rust-test-threads }} - USE_CROSS: ${{ matrix.use-cross }} - TARGET: ${{ matrix.target }} - CC: ${{ matrix.cc }} - AR: ${{ matrix.ar }} - run: | - PATH="$PWD/.github/scripts:$PATH" - printf '%s/.github/scripts\n' "$PWD" >> $GITHUB_PATH + PLATFORM: ${{ matrix.platform }} - printf '%s\n' >> $GITHUB_ENV \ - 'TREE_SITTER=tree-sitter.sh' \ - "TARGET=$TARGET" \ - "ROOT=$PWD" - - [[ -n $RUST_TEST_THREADS ]] && \ - printf 'RUST_TEST_THREADS=%s\n' "$RUST_TEST_THREADS" >> $GITHUB_ENV - - [[ -n $CC ]] && printf 'CC=%s\n' "$CC" >> $GITHUB_ENV - [[ -n $AR ]] && printf 'AR=%s\n' "$AR" >> $GITHUB_ENV - - if [[ $USE_CROSS == true ]]; then - printf 'BUILD_CMD=cross\n' >> $GITHUB_ENV - runner=$(cross.sh bash -c "env | sed -n 's/^CARGO_TARGET_.*_RUNNER=//p'") - [[ -n $runner ]] && printf 'CROSS_RUNNER=%s\n' "$runner" >> $GITHUB_ENV - fi + - name: Install MinGW and Clang (Windows x64 MSYS2) + if: matrix.platform == 'windows-x64' + uses: msys2/setup-msys2@v2 + with: + update: true + install: | + mingw-w64-x86_64-toolchain + mingw-w64-x86_64-clang + mingw-w64-x86_64-make + mingw-w64-x86_64-cmake # TODO: Remove RUSTFLAGS="--cap-lints allow" once we use a wasmtime release that addresses # the `mismatched-lifetime-syntaxes` lint - name: Build wasmtime library (Windows x64 MSYS2) - if: ${{ !matrix.use-cross && contains(matrix.features, 'wasm') && matrix.platform == 'windows-x64' }} + if: contains(matrix.features, 'wasm') && matrix.platform == 'windows-x64' run: | mkdir -p target WASMTIME_VERSION=$(cargo metadata --format-version=1 --locked --features wasm | \ @@ -159,21 +145,10 @@ jobs: printf 'CMAKE_PREFIX_PATH=%s\n' "$PWD/artifacts" >> $GITHUB_ENV env: WASMTIME_REPO: https://github.com/bytecodealliance/wasmtime - RUSTFLAGS: "--cap-lints allow" - - - name: Install MinGW and Clang (Windows x64 MSYS2) - if: ${{ matrix.platform == 'windows-x64' }} - uses: msys2/setup-msys2@v2 - with: - update: true - install: | - mingw-w64-x86_64-toolchain - mingw-w64-x86_64-clang - mingw-w64-x86_64-make - mingw-w64-x86_64-cmake + RUSTFLAGS: ${{ env.RUSTFLAGS }} --cap-lints allow - name: Build C library (Windows x64 MSYS2 CMake) - if: ${{ matrix.platform == 'windows-x64' }} + if: matrix.platform == 'windows-x64' shell: msys2 {0} run: | cmake -G Ninja -S . -B build/static \ @@ -183,7 +158,6 @@ jobs: -DTREE_SITTER_FEATURE_WASM=$WASM \ -DCMAKE_C_COMPILER=clang cmake --build build/static - rm -rf build/static cmake -G Ninja -S . -B build/shared \ -DBUILD_SHARED_LIBS=ON \ @@ -192,14 +166,17 @@ jobs: -DTREE_SITTER_FEATURE_WASM=$WASM \ -DCMAKE_C_COMPILER=clang cmake --build build/shared - rm -rf build/shared + rm -rf \ + build/{static,shared} \ + "${CMAKE_PREFIX_PATH}/artifacts" \ + target/wasmtime-${WASMTIME_VERSION} env: WASM: ${{ contains(matrix.features, 'wasm') && 'ON' || 'OFF' }} # TODO: Remove RUSTFLAGS="--cap-lints allow" once we use a wasmtime release that addresses # the `mismatched-lifetime-syntaxes` lint - name: Build wasmtime library - if: ${{ !matrix.use-cross && contains(matrix.features, 'wasm') }} + if: contains(matrix.features, 'wasm') run: | mkdir -p target WASMTIME_VERSION=$(cargo metadata --format-version=1 --locked --features wasm | \ @@ -215,16 +192,27 @@ jobs: printf 'CMAKE_PREFIX_PATH=%s\n' "$PWD/artifacts" >> $GITHUB_ENV env: WASMTIME_REPO: https://github.com/bytecodealliance/wasmtime - RUSTFLAGS: "--cap-lints allow" + RUSTFLAGS: ${{ env.RUSTFLAGS }} --cap-lints allow - name: Build C library (make) - if: ${{ runner.os != 'Windows' }} - run: make.sh -j CFLAGS="$CFLAGS" + if: runner.os != 'Windows' + run: | + if [[ $PLATFORM == linux-arm ]]; then + CC=arm-linux-gnueabihf-gcc; AR=arm-linux-gnueabihf-ar + elif [[ $PLATFORM == linux-x86 ]]; then + CC=i686-linux-gnu-gcc; AR=i686-linux-gnu-ar + elif [[ $PLATFORM == linux-powerpc64 ]]; then + CC=powerpc64-linux-gnu-gcc; AR=powerpc64-linux-gnu-ar + else + CC=gcc; AR=ar + fi + make -j CFLAGS="$CFLAGS" CC=$CC AR=$AR env: + PLATFORM: ${{ matrix.platform }} CFLAGS: -g -Werror -Wall -Wextra -Wshadow -Wpedantic -Werror=incompatible-pointer-types - name: Build C library (CMake) - if: ${{ !matrix.use-cross }} + if: "!matrix.cross" run: | cmake -S . -B build/static \ -DBUILD_SHARED_LIBS=OFF \ @@ -240,12 +228,11 @@ jobs: -DTREE_SITTER_FEATURE_WASM=$WASM cmake --build build/shared --verbose env: - CC: ${{ contains(matrix.target, 'linux') && 'clang' || '' }} + CC: ${{ contains(matrix.platform, 'linux') && 'clang' || '' }} WASM: ${{ contains(matrix.features, 'wasm') && 'ON' || 'OFF' }} - - name: Build wasm library - # No reason to build on the same Github runner hosts many times - if: ${{ !matrix.no-run && !matrix.use-cross }} + - name: Build Wasm library + if: contains(matrix.features, 'wasm') shell: bash run: | cd lib/binding_web @@ -256,56 +243,52 @@ jobs: npm run build:debug - name: Check no_std builds - if: ${{ !matrix.no-run && inputs.run-test }} + if: inputs.run-test && !matrix.no-run + working-directory: lib shell: bash - run: | - cd lib - $BUILD_CMD check --no-default-features --target=${{ matrix.target }} + run: cargo check --no-default-features --target='${{ matrix.target }}' - name: Build target - run: | - PACKAGE="" - if [[ "${{ matrix.target }}" == "wasm32-unknown-unknown" ]]; then - PACKAGE="-p tree-sitter" - fi - $BUILD_CMD build --release --target=${{ matrix.target }} --features=${{ matrix.features }} $PACKAGE + run: cargo build --release --target='${{ matrix.target }}' --features='${{ matrix.features }}' $PACKAGE + env: + PACKAGE: ${{ matrix.platform == 'wasm32' && '-p tree-sitter' || '' }} - name: Cache fixtures id: cache - if: ${{ !matrix.no-run && inputs.run-test }} + if: inputs.run-test && !matrix.no-run uses: ./.github/actions/cache - name: Fetch fixtures - if: ${{ !matrix.no-run && inputs.run-test }} - run: $BUILD_CMD run -p xtask --target=${{ matrix.target }} -- fetch-fixtures + if: inputs.run-test && !matrix.no-run + run: cargo run -p xtask --target='${{ matrix.target }}' -- fetch-fixtures - name: Generate fixtures - if: ${{ !matrix.no-run && inputs.run-test && steps.cache.outputs.cache-hit != 'true' }} - run: $BUILD_CMD run -p xtask --target=${{ matrix.target }} -- generate-fixtures + if: inputs.run-test && !matrix.no-run && steps.cache.outputs.cache-hit != 'true' + run: cargo run -p xtask --target='${{ matrix.target }}' -- generate-fixtures - name: Generate Wasm fixtures - if: ${{ !matrix.no-run && !matrix.use-cross && inputs.run-test && steps.cache.outputs.cache-hit != 'true' }} - run: $BUILD_CMD run -p xtask --target=${{ matrix.target }} -- generate-fixtures --wasm + if: inputs.run-test && !matrix.no-run && contains(matrix.features, 'wasm') && steps.cache.outputs.cache-hit != 'true' + run: cargo run -p xtask --target='${{ matrix.target }}' -- generate-fixtures --wasm - name: Run main tests - if: ${{ !matrix.no-run && inputs.run-test }} - run: $BUILD_CMD test --target=${{ matrix.target }} --features=${{ matrix.features }} + if: inputs.run-test && !matrix.no-run + run: cargo test --target='${{ matrix.target }}' --features='${{ matrix.features }}' - - name: Run wasm tests - if: ${{ !matrix.no-run && !matrix.use-cross && inputs.run-test }} - run: $BUILD_CMD run -p xtask --target=${{ matrix.target }} -- test-wasm + - name: Run Wasm tests + if: inputs.run-test && !matrix.no-run && contains(matrix.features, 'wasm') + run: cargo run -p xtask --target='${{ matrix.target }}' -- test-wasm - name: Upload CLI artifact - if: ${{ matrix.platform != 'wasm32' }} + if: "!matrix.no-run" uses: actions/upload-artifact@v4 with: name: tree-sitter.${{ matrix.platform }} - path: target/${{ matrix.target }}/release/tree-sitter${{ env.SUFFIX }} + path: target/${{ matrix.target }}/release/tree-sitter${{ contains(matrix.target, 'windows') && '.exe' || '' }} if-no-files-found: error retention-days: 7 - name: Upload Wasm artifacts - if: ${{ matrix.platform == 'linux-x64' }} + if: matrix.platform == 'linux-x64' uses: actions/upload-artifact@v4 with: name: tree-sitter.wasm diff --git a/.github/workflows/wasm_exports.yml b/.github/workflows/wasm_exports.yml index ee28e8ea..d04e1052 100644 --- a/.github/workflows/wasm_exports.yml +++ b/.github/workflows/wasm_exports.yml @@ -1,4 +1,4 @@ -name: Check WASM Exports +name: Check Wasm Exports on: pull_request: @@ -33,9 +33,9 @@ jobs: env: CFLAGS: -g -Werror -Wall -Wextra -Wshadow -Wpedantic -Werror=incompatible-pointer-types - - name: Build WASM Library + - name: Build Wasm Library working-directory: lib/binding_web run: npm ci && npm run build:debug - - name: Check WASM exports + - name: Check Wasm exports run: cargo xtask check-wasm-exports From 6dfa79013f2e095dd4ef014c911f201f3d92cad6 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Sat, 20 Sep 2025 17:42:09 +0300 Subject: [PATCH 482/663] feat(loader): respect NM env var --- crates/loader/src/loader.rs | 13 +++++++++---- crates/xtask/src/check_wasm_exports.rs | 4 +++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index 2641eeeb..f6608eb3 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -946,6 +946,11 @@ impl Loader { } else { "" }; + let section = if cfg!(all(target_arch = "powerpc64", target_os = "linux")) { + " D " + } else { + " T " + }; let mut must_have = vec![ format!("{prefix}tree_sitter_{name}_external_scanner_create"), format!("{prefix}tree_sitter_{name}_external_scanner_destroy"), @@ -954,16 +959,16 @@ impl Loader { format!("{prefix}tree_sitter_{name}_external_scanner_scan"), ]; - let command = Command::new("nm") - .arg("-W") - .arg("-U") + let nm_cmd = env::var("NM").unwrap_or_else(|_| "nm".to_owned()); + let command = Command::new(nm_cmd) + .arg("--defined-only") .arg(library_path) .output(); if let Ok(output) = command { if output.status.success() { let mut found_non_static = false; for line in String::from_utf8_lossy(&output.stdout).lines() { - if line.contains(" T ") { + if line.contains(section) { if let Some(function_name) = line.split_whitespace().collect::>().get(2) { diff --git a/crates/xtask/src/check_wasm_exports.rs b/crates/xtask/src/check_wasm_exports.rs index b2193bb3..124725b7 100644 --- a/crates/xtask/src/check_wasm_exports.rs +++ b/crates/xtask/src/check_wasm_exports.rs @@ -1,5 +1,6 @@ use std::{ collections::HashSet, + env, io::BufRead, path::PathBuf, process::{Command, Stdio}, @@ -94,7 +95,8 @@ fn check_wasm_exports() -> Result<()> { }), ); - let nm_child = Command::new("nm") + let nm_cmd = env::var("NM").unwrap_or_else(|_| "nm".to_owned()); + let nm_child = Command::new(nm_cmd) .arg("-W") .arg("-U") .arg("libtree-sitter.so") From 60c3bed6a4b3e3f8aad2fcfba13a9916e2625563 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Sat, 20 Sep 2025 10:09:57 +0300 Subject: [PATCH 483/663] fix(loader): install arm64 wasi-sdk on arm64 windows --- crates/loader/src/loader.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index f6608eb3..9e52f784 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -1156,7 +1156,11 @@ impl Loader { "x86_64-macos" } } else if cfg!(target_os = "windows") { - "x86_64-windows" + if cfg!(target_arch = "aarch64") { + "arm64-windows" + } else { + "x86_64-windows" + } } else if cfg!(target_os = "linux") { if cfg!(target_arch = "aarch64") { "arm64-linux" From 311585d30430209147a7bcc7b1e0d1fa8d75cb3c Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Fri, 19 Sep 2025 21:30:15 -0400 Subject: [PATCH 484/663] refactor!: rename `stage` flag to `emit` --- crates/cli/src/init.rs | 8 ++++---- crates/cli/src/main.rs | 18 +++++++++--------- crates/cli/src/templates/cmakelists.cmake | 4 ++-- crates/cli/src/templates/makefile | 4 ++-- crates/generate/src/generate.rs | 10 ++++------ 5 files changed, 21 insertions(+), 23 deletions(-) diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index ac9ea5e7..63ba73e8 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -572,10 +572,10 @@ pub fn generate_grammar_files( "}, indoc! {r" $(SRC_DIR)/grammar.json: grammar.js - $(TS) generate --stage=json $^ + $(TS) generate --emit=json $^ $(PARSER): $(SRC_DIR)/grammar.json - $(TS) generate --stage=parser $^ + $(TS) generate --emit=parser $^ "} ); write_file(path, contents)?; @@ -623,14 +623,14 @@ pub fn generate_grammar_files( add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/grammar.js" COMMAND "${TREE_SITTER_CLI}" generate grammar.js - --stage=json + --emit=json WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMENT "Generating grammar.json") add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/parser.c" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json" COMMAND "${TREE_SITTER_CLI}" generate src/grammar.json - --stage=parser --abi=${TREE_SITTER_ABI_VERSION} + --emit=parser --abi=${TREE_SITTER_ABI_VERSION} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMENT "Generating parser.c") "#} diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 11545ff8..b997fdd6 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -87,7 +87,7 @@ struct Init { } #[derive(Clone, Debug, Default, ValueEnum, PartialEq, Eq)] -enum GenerationStage { +enum GenerationEmit { /// Generate `grammar.json` and `node-types.json` Json, /// Generate `parser.c` and related files @@ -119,12 +119,12 @@ struct Generate { ) )] pub abi_version: Option, - /// Which generation stage to end after + /// What generated files to emit #[arg(long)] - #[clap(value_enum, default_value_t=GenerationStage::Parser)] - pub stage: GenerationStage, - /// Deprecated: use --stage=lib. - #[arg(long, short = 'b', conflicts_with = "stage")] + #[clap(value_enum, default_value_t=GenerationEmit::Parser)] + pub emit: GenerationEmit, + /// Deprecated: use --emit=lib. + #[arg(long, short = 'b', conflicts_with = "emit")] pub build: bool, /// Compile a parser in debug mode #[arg(long, short = '0')] @@ -858,7 +858,7 @@ impl Generate { if self.build { // TODO: remove the `--build` argument in 0.27 // TODO: migrate to `warn!` once https://github.com/tree-sitter/tree-sitter/pull/4604 is merged - eprintln!("Warning: --build is deprecated, use --stage=lib instead"); + eprintln!("Warning: --build is deprecated, use --emit=lib instead"); } if let Err(err) = tree_sitter_generate::generate_parser_in_directory( @@ -868,7 +868,7 @@ impl Generate { abi_version, self.report_states_for_rule.as_deref(), self.js_runtime.as_deref(), - self.stage != GenerationStage::Json, + self.emit != GenerationEmit::Json, ) { if self.json { eprintln!("{}", serde_json::to_string_pretty(&err)?); @@ -879,7 +879,7 @@ impl Generate { Err(anyhow!(err.to_string())).with_context(|| "Error when generating parser")?; } } - if self.stage == GenerationStage::Lib || self.build { + if self.emit == GenerationEmit::Lib || self.build { if let Some(path) = self.libdir { loader = loader::Loader::with_parser_lib_path(path); } diff --git a/crates/cli/src/templates/cmakelists.cmake b/crates/cli/src/templates/cmakelists.cmake index 2b7a53f4..c2fd82fd 100644 --- a/crates/cli/src/templates/cmakelists.cmake +++ b/crates/cli/src/templates/cmakelists.cmake @@ -22,14 +22,14 @@ find_program(TREE_SITTER_CLI tree-sitter DOC "Tree-sitter CLI") add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/grammar.js" COMMAND "${TREE_SITTER_CLI}" generate grammar.js - --stage=json + --emit=json WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMENT "Generating grammar.json") add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/parser.c" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json" COMMAND "${TREE_SITTER_CLI}" generate src/grammar.json - --stage=parser --abi=${TREE_SITTER_ABI_VERSION} + --emit=parser --abi=${TREE_SITTER_ABI_VERSION} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMENT "Generating parser.c") diff --git a/crates/cli/src/templates/makefile b/crates/cli/src/templates/makefile index 5cad3042..847381c5 100644 --- a/crates/cli/src/templates/makefile +++ b/crates/cli/src/templates/makefile @@ -73,10 +73,10 @@ $(LANGUAGE_NAME).pc: bindings/c/$(LANGUAGE_NAME).pc.in -e 's|@CMAKE_INSTALL_PREFIX@|$(PREFIX)|' $< > $@ $(SRC_DIR)/grammar.json: grammar.js - $(TS) generate --stage=json $^ + $(TS) generate --emit=json $^ $(PARSER): $(SRC_DIR)/grammar.json - $(TS) generate --stage=parser $^ + $(TS) generate --emit=parser $^ install: all install -d '$(DESTDIR)$(DATADIR)'/tree-sitter/queries/KEBAB_PARSER_NAME '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter '$(DESTDIR)$(PCLIBDIR)' '$(DESTDIR)$(LIBDIR)' diff --git a/crates/generate/src/generate.rs b/crates/generate/src/generate.rs index 4ac7f5e7..5c445902 100644 --- a/crates/generate/src/generate.rs +++ b/crates/generate/src/generate.rs @@ -49,7 +49,7 @@ static JSON_COMMENT_REGEX: LazyLock = LazyLock::new(|| { .unwrap() }); -struct JSONStageOutput { +struct JSONOutput { #[cfg(feature = "load")] node_types_json: String, syntax_grammar: SyntaxGrammar, @@ -296,9 +296,7 @@ pub fn generate_parser_for_grammar( Ok((input_grammar.name, parser.c_code)) } -fn generate_node_types_from_grammar( - input_grammar: &InputGrammar, -) -> GenerateResult { +fn generate_node_types_from_grammar(input_grammar: &InputGrammar) -> GenerateResult { let (syntax_grammar, lexical_grammar, inlines, simple_aliases) = prepare_grammar(input_grammar)?; let variable_info = @@ -311,7 +309,7 @@ fn generate_node_types_from_grammar( &simple_aliases, &variable_info, )?; - Ok(JSONStageOutput { + Ok(JSONOutput { #[cfg(feature = "load")] node_types_json: serde_json::to_string_pretty(&node_types_json).unwrap(), syntax_grammar, @@ -328,7 +326,7 @@ fn generate_parser_for_grammar_with_opts( semantic_version: Option<(u8, u8, u8)>, report_symbol_name: Option<&str>, ) -> GenerateResult { - let JSONStageOutput { + let JSONOutput { syntax_grammar, lexical_grammar, inlines, From fa28b430af5db821aa94478c609a586634a57f39 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sun, 21 Sep 2025 01:22:02 -0400 Subject: [PATCH 485/663] feat(bindings): update Zig bindings to use `Language.fromRaw` --- crates/cli/src/templates/test.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/cli/src/templates/test.zig b/crates/cli/src/templates/test.zig index 7baec557..af84322f 100644 --- a/crates/cli/src/templates/test.zig +++ b/crates/cli/src/templates/test.zig @@ -9,7 +9,7 @@ test "can load grammar" { const parser = Parser.create(); defer parser.destroy(); - const lang: *const ts.Language = @ptrCast(root.language()); + const lang: *const ts.Language = Language.fromRaw(root.language()); defer lang.destroy(); try testing.expectEqual(void{}, parser.setLanguage(lang)); From 804ef220755623af6e9f5686496859915ec1c471 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Mon, 15 Sep 2025 20:40:55 +0300 Subject: [PATCH 486/663] refactor(cli): use the logger Co-authored-by: Amaan Qureshi --- crates/cli/benches/benchmark.rs | 44 +++---- crates/cli/src/fuzz.rs | 33 ++--- crates/cli/src/highlight.rs | 15 +-- crates/cli/src/init.rs | 19 +-- crates/cli/src/logger.rs | 53 ++++++-- crates/cli/src/main.rs | 61 +++++---- crates/cli/src/parse.rs | 8 +- crates/cli/src/playground.rs | 5 +- crates/cli/src/query.rs | 10 +- crates/cli/src/test.rs | 142 ++++++++++----------- crates/cli/src/test_highlight.rs | 4 +- crates/cli/src/test_tags.rs | 4 +- crates/cli/src/tests/text_provider_test.rs | 1 - crates/cli/src/util.rs | 3 +- crates/cli/src/version.rs | 11 +- 15 files changed, 216 insertions(+), 197 deletions(-) diff --git a/crates/cli/benches/benchmark.rs b/crates/cli/benches/benchmark.rs index 943390c6..3edda96e 100644 --- a/crates/cli/benches/benchmark.rs +++ b/crates/cli/benches/benchmark.rs @@ -8,6 +8,7 @@ use std::{ }; use anyhow::Context; +use log::info; use tree_sitter::{Language, Parser, Query}; use tree_sitter_loader::{CompileConfig, Loader}; @@ -71,6 +72,8 @@ static EXAMPLE_AND_QUERY_PATHS_BY_LANGUAGE_DIR: LazyLock< }); fn main() { + tree_sitter_cli::logger::init(); + let max_path_length = EXAMPLE_AND_QUERY_PATHS_BY_LANGUAGE_DIR .values() .flat_map(|(e, q)| { @@ -81,7 +84,7 @@ fn main() { .max() .unwrap_or(0); - eprintln!("Benchmarking with {} repetitions", *REPETITION_COUNT); + info!("Benchmarking with {} repetitions", *REPETITION_COUNT); let mut parser = Parser::new(); let mut all_normal_speeds = Vec::new(); @@ -98,11 +101,11 @@ fn main() { } } - eprintln!("\nLanguage: {language_name}"); + info!("\nLanguage: {language_name}"); let language = get_language(language_path); parser.set_language(&language).unwrap(); - eprintln!(" Constructing Queries"); + info!(" Constructing Queries"); for path in query_paths { if let Some(filter) = EXAMPLE_FILTER.as_ref() { if !path.to_str().unwrap().contains(filter.as_str()) { @@ -117,7 +120,7 @@ fn main() { }); } - eprintln!(" Parsing Valid Code:"); + info!(" Parsing Valid Code:"); let mut normal_speeds = Vec::new(); for example_path in example_paths { if let Some(filter) = EXAMPLE_FILTER.as_ref() { @@ -131,7 +134,7 @@ fn main() { })); } - eprintln!(" Parsing Invalid Code (mismatched languages):"); + info!(" Parsing Invalid Code (mismatched languages):"); let mut error_speeds = Vec::new(); for (other_language_path, (example_paths, _)) in EXAMPLE_AND_QUERY_PATHS_BY_LANGUAGE_DIR.iter() @@ -152,30 +155,30 @@ fn main() { } if let Some((average_normal, worst_normal)) = aggregate(&normal_speeds) { - eprintln!(" Average Speed (normal): {average_normal} bytes/ms"); - eprintln!(" Worst Speed (normal): {worst_normal} bytes/ms"); + info!(" Average Speed (normal): {average_normal} bytes/ms"); + info!(" Worst Speed (normal): {worst_normal} bytes/ms"); } if let Some((average_error, worst_error)) = aggregate(&error_speeds) { - eprintln!(" Average Speed (errors): {average_error} bytes/ms"); - eprintln!(" Worst Speed (errors): {worst_error} bytes/ms"); + info!(" Average Speed (errors): {average_error} bytes/ms"); + info!(" Worst Speed (errors): {worst_error} bytes/ms"); } all_normal_speeds.extend(normal_speeds); all_error_speeds.extend(error_speeds); } - eprintln!("\n Overall"); + info!("\n Overall"); if let Some((average_normal, worst_normal)) = aggregate(&all_normal_speeds) { - eprintln!(" Average Speed (normal): {average_normal} bytes/ms"); - eprintln!(" Worst Speed (normal): {worst_normal} bytes/ms"); + info!(" Average Speed (normal): {average_normal} bytes/ms"); + info!(" Worst Speed (normal): {worst_normal} bytes/ms"); } if let Some((average_error, worst_error)) = aggregate(&all_error_speeds) { - eprintln!(" Average Speed (errors): {average_error} bytes/ms"); - eprintln!(" Worst Speed (errors): {worst_error} bytes/ms"); + info!(" Average Speed (errors): {average_error} bytes/ms"); + info!(" Worst Speed (errors): {worst_error} bytes/ms"); } - eprintln!(); + info!(""); } fn aggregate(speeds: &[usize]) -> Option<(usize, usize)> { @@ -194,12 +197,6 @@ fn aggregate(speeds: &[usize]) -> Option<(usize, usize)> { } fn parse(path: &Path, max_path_length: usize, mut action: impl FnMut(&[u8])) -> usize { - eprint!( - " {:width$}\t", - path.file_name().unwrap().to_str().unwrap(), - width = max_path_length - ); - let source_code = fs::read(path) .with_context(|| format!("Failed to read {}", path.display())) .unwrap(); @@ -210,8 +207,9 @@ fn parse(path: &Path, max_path_length: usize, mut action: impl FnMut(&[u8])) -> let duration = time.elapsed() / (*REPETITION_COUNT as u32); let duration_ns = duration.as_nanos(); let speed = ((source_code.len() as u128) * 1_000_000) / duration_ns; - eprintln!( - "time {:>7.2} ms\t\tspeed {speed:>6} bytes/ms", + info!( + " {:max_path_length$}\ttime {:>7.2} ms\t\tspeed {speed:>6} bytes/ms", + path.file_name().unwrap().to_str().unwrap(), (duration_ns as f64) / 1e6, ); speed as usize diff --git a/crates/cli/src/fuzz.rs b/crates/cli/src/fuzz.rs index 24c98d30..24806fca 100644 --- a/crates/cli/src/fuzz.rs +++ b/crates/cli/src/fuzz.rs @@ -5,6 +5,7 @@ use std::{ sync::LazyLock, }; +use log::{error, info}; use rand::Rng; use regex::Regex; use tree_sitter::{Language, Parser}; @@ -62,7 +63,7 @@ pub fn new_seed() -> usize { int_env_var("TREE_SITTER_SEED").unwrap_or_else(|| { let mut rng = rand::thread_rng(); let seed = rng.gen::(); - eprintln!("Seed: {seed}"); + info!("Seed: {seed}"); seed }) } @@ -108,12 +109,12 @@ pub fn fuzz_language_corpus( let corpus_dir = grammar_dir.join(subdir).join("test").join("corpus"); if !corpus_dir.exists() || !corpus_dir.is_dir() { - eprintln!("No corpus directory found, ensure that you have a `test/corpus` directory in your grammar directory with at least one test file."); + error!("No corpus directory found, ensure that you have a `test/corpus` directory in your grammar directory with at least one test file."); return; } if std::fs::read_dir(&corpus_dir).unwrap().count() == 0 { - eprintln!("No corpus files found in `test/corpus`, ensure that you have at least one test file in your corpus directory."); + error!("No corpus files found in `test/corpus`, ensure that you have at least one test file in your corpus directory."); return; } @@ -149,7 +150,7 @@ pub fn fuzz_language_corpus( let dump_edits = env::var("TREE_SITTER_DUMP_EDITS").is_ok(); if log_seed { - println!(" start seed: {start_seed}"); + info!(" start seed: {start_seed}"); } println!(); @@ -191,7 +192,7 @@ pub fn fuzz_language_corpus( true }) .unwrap_or_else(|e| { - eprintln!("Error: {e}"); + error!("{e}"); false }); @@ -216,7 +217,7 @@ pub fn fuzz_language_corpus( let mut input = test.input.clone(); if options.log_graphs { - eprintln!("{}\n", String::from_utf8_lossy(&input)); + info!("{}\n", String::from_utf8_lossy(&input)); } // Perform a random series of edits and reparse. @@ -229,7 +230,7 @@ pub fn fuzz_language_corpus( } if log_seed { - println!(" {test_index}.{trial:<2} seed: {seed}"); + info!(" {test_index}.{trial:<2} seed: {seed}"); } if dump_edits { @@ -243,7 +244,7 @@ pub fn fuzz_language_corpus( } if options.log_graphs { - eprintln!("{}\n", String::from_utf8_lossy(&input)); + info!("{}\n", String::from_utf8_lossy(&input)); } set_included_ranges(&mut parser, &input, test.template_delimiters); @@ -252,7 +253,7 @@ pub fn fuzz_language_corpus( // Check that the new tree is consistent. check_consistent_sizes(&tree2, &input); if let Err(message) = check_changed_ranges(&tree, &tree2, &input) { - println!("\nUnexpected scope change in seed {seed} with start seed {start_seed}\n{message}\n\n",); + error!("\nUnexpected scope change in seed {seed} with start seed {start_seed}\n{message}\n\n",); return false; } @@ -261,7 +262,7 @@ pub fn fuzz_language_corpus( perform_edit(&mut tree2, &mut input, &edit).unwrap(); } if options.log_graphs { - eprintln!("{}\n", String::from_utf8_lossy(&input)); + info!("{}\n", String::from_utf8_lossy(&input)); } set_included_ranges(&mut parser, &test.input, test.template_delimiters); @@ -284,13 +285,13 @@ pub fn fuzz_language_corpus( // Check that the edited tree is consistent. check_consistent_sizes(&tree3, &input); if let Err(message) = check_changed_ranges(&tree2, &tree3, &input) { - println!("Unexpected scope change in seed {seed} with start seed {start_seed}\n{message}\n\n"); + error!("Unexpected scope change in seed {seed} with start seed {start_seed}\n{message}\n\n"); return false; } true }).unwrap_or_else(|e| { - eprintln!("Error: {e}"); + error!("{e}"); false }); @@ -302,17 +303,17 @@ pub fn fuzz_language_corpus( } if failure_count != 0 { - eprintln!("{failure_count} {language_name} corpus tests failed fuzzing"); + info!("{failure_count} {language_name} corpus tests failed fuzzing"); } skipped.retain(|_, v| *v == 0); if !skipped.is_empty() { - println!("Non matchable skip definitions:"); + info!("Non matchable skip definitions:"); for k in skipped.keys() { - println!(" {k}"); + info!(" {k}"); } - panic!("Non matchable skip definitions needs to be removed"); + panic!("Non matchable skip definitions need to be removed"); } } diff --git a/crates/cli/src/highlight.rs b/crates/cli/src/highlight.rs index abb64020..a2cb01cf 100644 --- a/crates/cli/src/highlight.rs +++ b/crates/cli/src/highlight.rs @@ -12,6 +12,7 @@ use std::{ use ansi_colours::{ansi256_from_rgb, rgb_from_ansi256}; use anstyle::{Ansi256Color, AnsiColor, Color, Effects, RgbColor}; use anyhow::Result; +use log::{info, warn}; use serde::{ser::SerializeMap, Deserialize, Deserializer, Serialize, Serializer}; use serde_json::{json, Value}; use tree_sitter_highlight::{HighlightConfiguration, HighlightEvent, Highlighter, HtmlRenderer}; @@ -348,19 +349,17 @@ pub fn highlight( config.nonconformant_capture_names(&HashSet::new()) }; if names.is_empty() { - eprintln!("All highlight captures conform to standards."); + info!("All highlight captures conform to standards."); } else { - eprintln!( - "Non-standard highlight {} detected:", + warn!( + "Non-standard highlight {} detected:\n* {}", if names.len() > 1 { "captures" } else { "capture" - } + }, + names.join("\n* ") ); - for name in names { - eprintln!("* {name}"); - } } } @@ -451,7 +450,7 @@ pub fn highlight( } if opts.print_time { - eprintln!("Time: {}ms", time.elapsed().as_millis()); + info!("Time: {}ms", time.elapsed().as_millis()); } Ok(()) diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index 63ba73e8..3af16c6e 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -7,6 +7,7 @@ use std::{ use anyhow::{anyhow, Context, Result}; use heck::{ToKebabCase, ToShoutySnakeCase, ToSnakeCase, ToUpperCamelCase}; use indoc::{formatdoc, indoc}; +use log::warn; use semver::Version; use serde::{Deserialize, Serialize}; use serde_json::{Map, Value}; @@ -307,7 +308,7 @@ pub fn generate_grammar_files( "tree-sitter-cli":"#}, ); if !contents.contains("module") { - eprintln!("Updating package.json"); + warn!("Updating package.json"); contents = contents.replace( r#""repository":"#, indoc! {r#" @@ -346,7 +347,7 @@ pub fn generate_grammar_files( |path| { let contents = fs::read_to_string(path)?; if !contents.contains("Zig artifacts") { - eprintln!("Replacing .gitignore"); + warn!("Replacing .gitignore"); generate_file(path, GITIGNORE_TEMPLATE, language_name, &generate_opts)?; } Ok(()) @@ -465,7 +466,7 @@ pub fn generate_grammar_files( |path| { let contents = fs::read_to_string(path)?; if !contents.contains("new URL") { - eprintln!("Replacing index.js"); + warn!("Replacing index.js"); generate_file(path, INDEX_JS_TEMPLATE, language_name, &generate_opts)?; } Ok(()) @@ -490,7 +491,7 @@ pub fn generate_grammar_files( |path| { let contents = fs::read_to_string(path)?; if !contents.contains("import") { - eprintln!("Replacing binding_test.js"); + warn!("Replacing binding_test.js"); generate_file( path, BINDING_TEST_JS_TEMPLATE, @@ -561,7 +562,7 @@ pub fn generate_grammar_files( |path| { let mut contents = fs::read_to_string(path)?; if !contents.contains("cd '$(DESTDIR)$(LIBDIR)' && ln -sf") { - eprintln!("Replacing Makefile"); + warn!("Replacing Makefile"); generate_file(path, MAKEFILE_TEMPLATE, language_name, &generate_opts)?; } else { contents = contents @@ -777,7 +778,7 @@ pub fn generate_grammar_files( |path| { let contents = fs::read_to_string(path)?; if !contents.contains("build_ext") { - eprintln!("Replacing setup.py"); + warn!("Replacing setup.py"); generate_file(path, SETUP_PY_TEMPLATE, language_name, &generate_opts)?; } Ok(()) @@ -861,7 +862,7 @@ pub fn generate_grammar_files( |path| { let contents = fs::read_to_string(path)?; if !contents.contains("b.pkg_hash.len") { - eprintln!("Replacing build.zig"); + warn!("Replacing build.zig"); generate_file(path, BUILD_ZIG_TEMPLATE, language_name, &generate_opts) } else { Ok(()) @@ -876,7 +877,7 @@ pub fn generate_grammar_files( |path| { let contents = fs::read_to_string(path)?; if !contents.contains(".name = .tree_sitter_") { - eprintln!("Replacing build.zig.zon"); + warn!("Replacing build.zig.zon"); generate_file(path, BUILD_ZIG_ZON_TEMPLATE, language_name, &generate_opts) } else { Ok(()) @@ -892,7 +893,7 @@ pub fn generate_grammar_files( |path| { let contents = fs::read_to_string(path)?; if contents.contains("ts.Language") { - eprintln!("Replacing root.zig"); + warn!("Replacing root.zig"); generate_file(path, ROOT_ZIG_TEMPLATE, language_name, &generate_opts) } else { Ok(()) diff --git a/crates/cli/src/logger.rs b/crates/cli/src/logger.rs index ce4f74a3..41b11906 100644 --- a/crates/cli/src/logger.rs +++ b/crates/cli/src/logger.rs @@ -1,30 +1,55 @@ -use log::{LevelFilter, Log, Metadata, Record}; +use std::io::Write; -#[allow(dead_code)] -struct Logger { - pub filter: Option, +use anstyle::{AnsiColor, Color, Style}; +use log::{Level, LevelFilter, Log, Metadata, Record}; + +pub fn paint(color: Option>, text: &str) -> String { + let style = Style::new().fg_color(color.map(Into::into)); + format!("{style}{text}{style:#}") } +struct Logger; + impl Log for Logger { fn enabled(&self, _: &Metadata) -> bool { true } fn log(&self, record: &Record) { - eprintln!( - "[{}] {}", - record - .module_path() - .unwrap_or_default() - .trim_start_matches("rust_tree_sitter_cli::"), - record.args() - ); + match record.level() { + Level::Error => eprintln!( + "{} {}", + paint(Some(AnsiColor::Red), "Error:"), + record.args() + ), + Level::Warn => eprintln!( + "{} {}", + paint(Some(AnsiColor::Yellow), "Warning:"), + record.args() + ), + Level::Info | Level::Debug => eprintln!("{}", record.args()), + Level::Trace => eprintln!( + "[{}] {}", + record + .module_path() + .unwrap_or_default() + .trim_start_matches("rust_tree_sitter_cli::"), + record.args() + ), + } } - fn flush(&self) {} + fn flush(&self) { + let mut stderr = std::io::stderr().lock(); + let _ = stderr.flush(); + } } pub fn init() { - log::set_boxed_logger(Box::new(Logger { filter: None })).unwrap(); + log::set_boxed_logger(Box::new(Logger {})).unwrap(); log::set_max_level(LevelFilter::Info); } + +pub fn enable_debug() { + log::set_max_level(LevelFilter::Debug); +} diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index b997fdd6..6a6a202f 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -10,6 +10,7 @@ use clap::{crate_authors, Args, Command, FromArgMatches as _, Subcommand, ValueE use clap_complete::generate; use dialoguer::{theme::ColorfulTheme, Confirm, FuzzySelect, Input, MultiSelect}; use heck::ToUpperCamelCase; +use log::{error, info, warn}; use regex::Regex; use semver::Version as SemverVersion; use tree_sitter::{ffi, Parser, Point}; @@ -588,7 +589,7 @@ impl InitConfig { config.add(tree_sitter_loader::Config::initial())?; config.add(tree_sitter_cli::highlight::ThemeConfig::default())?; config.save()?; - println!( + info!( "Saved initial configuration to {}", config.location.display() ); @@ -800,7 +801,7 @@ impl Init { // Loop for editing the configuration loop { - println!( + info!( "Your current configuration:\n{}", serde_json::to_string_pretty(&opts)? ); @@ -843,7 +844,7 @@ impl Init { impl Generate { fn run(self, mut loader: loader::Loader, current_dir: &Path) -> Result<()> { if self.log { - logger::init(); + logger::enable_debug(); } let abi_version = self.abi_version @@ -856,9 +857,7 @@ impl Generate { } }); if self.build { - // TODO: remove the `--build` argument in 0.27 - // TODO: migrate to `warn!` once https://github.com/tree-sitter/tree-sitter/pull/4604 is merged - eprintln!("Warning: --build is deprecated, use --emit=lib instead"); + warn!("--build is deprecated, use --emit=lib instead"); } if let Err(err) = tree_sitter_generate::generate_parser_in_directory( @@ -1039,7 +1038,7 @@ impl Parse { }; if self.lib_path.is_none() && self.lang_name.is_some() { - eprintln!("Warning: --lang-name` specified without --lib-path. This argument will be ignored."); + warn!("--lang-name` specified without --lib-path. This argument will be ignored."); } let lib_info = get_lib_info(self.lib_path.as_ref(), self.lang_name.as_ref(), current_dir); @@ -1178,7 +1177,7 @@ impl Test { } if self.lib_path.is_none() && self.lang_name.is_some() { - eprintln!("Warning: --lang-name` specified without --lib-path. This argument will be ignored."); + warn!("--lang-name` specified without --lib-path. This argument will be ignored."); } let languages = loader.languages_at_path(current_dir)?; let language = if let Some(ref lib_path) = self.lib_path { @@ -1324,7 +1323,7 @@ impl Fuzz { loader.force_rebuild(self.rebuild || self.grammar_path.is_some()); if self.lib_path.is_none() && self.lang_name.is_some() { - eprintln!("Warning: --lang-name` specified without --lib-path. This argument will be ignored."); + warn!("--lang-name` specified without --lib-path. This argument will be ignored."); } let languages = loader.languages_at_path(current_dir)?; let (language, language_name) = if let Some(ref lib_path) = self.lib_path { @@ -1394,9 +1393,7 @@ impl Query { let cancellation_flag = util::cancel_on_signal(); if self.lib_path.is_none() && self.lang_name.is_some() { - eprintln!( - "Warning: --lang-name specified without --lib-path. This argument will be ignored." - ); + warn!("--lang-name specified without --lib-path. This argument will be ignored."); } let lib_info = get_lib_info(self.lib_path.as_ref(), self.lang_name.as_ref(), current_dir); @@ -1551,7 +1548,7 @@ impl Highlight { { (lang, lang_config) } else { - eprintln!( + warn!( "{}", util::lang_not_found_for_path(&path, &loader_config) ); @@ -1572,7 +1569,7 @@ impl Highlight { &options, )?; } else { - eprintln!( + warn!( "No syntax highlighting config found for path {}", path.display() ); @@ -1603,7 +1600,7 @@ impl Highlight { { highlight::highlight(&loader, &path, &name, highlight_config, false, &options)?; } else { - eprintln!("No syntax highlighting config found for test {name}"); + warn!("No syntax highlighting config found for test {name}"); } fs::remove_file(path)?; } @@ -1643,7 +1640,7 @@ impl Highlight { &options, )?; } else { - eprintln!( + warn!( "No syntax highlighting config found for path {}", current_dir.display() ); @@ -1702,7 +1699,7 @@ impl Tags { { (lang, lang_config) } else { - eprintln!( + warn!( "{}", util::lang_not_found_for_path(&path, &loader_config) ); @@ -1720,7 +1717,7 @@ impl Tags { &options, )?; } else { - eprintln!("No tags config found for path {}", path.display()); + warn!("No tags config found for path {}", path.display()); } } } @@ -1746,7 +1743,7 @@ impl Tags { if let Some(tags_config) = language_config.tags_config(language)? { tags::generate_tags(&path, &name, tags_config, false, &options)?; } else { - eprintln!("No tags config found for test {name}"); + warn!("No tags config found for test {name}"); } fs::remove_file(path)?; } @@ -1777,7 +1774,7 @@ impl Tags { if let Some(tags_config) = language_config.tags_config(language)? { tags::generate_tags(&path, "stdin", tags_config, false, &options)?; } else { - eprintln!("No tags config found for path {}", current_dir.display()); + warn!("No tags config found for path {}", current_dir.display()); } fs::remove_file(path)?; } @@ -1808,7 +1805,7 @@ impl DumpLanguages { let loader_config = config.get()?; loader.find_all_languages(&loader_config)?; for (configuration, language_path) in loader.get_all_language_configurations() { - println!( + info!( concat!( "name: {}\n", "scope: {}\n", @@ -1859,28 +1856,30 @@ fn main() { } } if !err.to_string().is_empty() { - eprintln!("{err:?}"); + error!("{err:?}"); } std::process::exit(1); } } fn run() -> Result<()> { + logger::init(); + let version = BUILD_SHA.map_or_else( || BUILD_VERSION.to_string(), |build_sha| format!("{BUILD_VERSION} ({build_sha})"), ); let cli = Command::new("tree-sitter") - .help_template( - "\ -{before-help}{name} {version} -{author-with-newline}{about-with-newline} -{usage-heading} {usage} - -{all-args}{after-help} -", - ) + .help_template(concat!( + "\n", + "{before-help}{name} {version}\n", + "{author-with-newline}{about-with-newline}\n", + "{usage-heading} {usage}\n", + "\n", + "{all-args}{after-help}\n", + "\n" + )) .version(version) .subcommand_required(true) .arg_required_else_help(true) diff --git a/crates/cli/src/parse.rs b/crates/cli/src/parse.rs index ed0ac9f6..e1ee20c4 100644 --- a/crates/cli/src/parse.rs +++ b/crates/cli/src/parse.rs @@ -10,14 +10,14 @@ use std::{ use anstyle::{AnsiColor, Color, RgbColor}; use anyhow::{anyhow, Context, Result}; use clap::ValueEnum; +use log::info; use serde::{Deserialize, Serialize}; use tree_sitter::{ ffi, InputEdit, Language, LogType, ParseOptions, ParseState, Parser, Point, Range, Tree, TreeCursor, }; -use super::util; -use crate::{fuzz::edits::Edit, test::paint}; +use crate::{fuzz::edits::Edit, logger::paint, util}; #[derive(Debug, Default, Serialize)] pub struct Stats { @@ -425,7 +425,7 @@ pub fn parse_file_at_path( if let Some(mut tree) = tree { if opts.debug_graph && !opts.edits.is_empty() { - println!("BEFORE:\n{}", String::from_utf8_lossy(&source_code)); + info!("BEFORE:\n{}", String::from_utf8_lossy(&source_code)); } let edit_time = Instant::now(); @@ -435,7 +435,7 @@ pub fn parse_file_at_path( tree = parser.parse(&source_code, Some(&tree)).unwrap(); if opts.debug_graph { - println!("AFTER {i}:\n{}", String::from_utf8_lossy(&source_code)); + info!("AFTER {i}:\n{}", String::from_utf8_lossy(&source_code)); } } let edit_duration = edit_time.elapsed(); diff --git a/crates/cli/src/playground.rs b/crates/cli/src/playground.rs index a966d5c0..f2c04fed 100644 --- a/crates/cli/src/playground.rs +++ b/crates/cli/src/playground.rs @@ -7,6 +7,7 @@ use std::{ }; use anyhow::{anyhow, Context, Result}; +use log::{error, info}; use tiny_http::{Header, Response, Server}; use super::wasm; @@ -116,9 +117,9 @@ pub fn serve(grammar_path: &Path, open_in_browser: bool) -> Result<()> { let server = get_server()?; let (grammar_name, language_wasm) = wasm::load_language_wasm_file(grammar_path)?; let url = format!("http://{}", server.server_addr()); - println!("Started playground on: {url}"); + info!("Started playground on: {url}"); if open_in_browser && webbrowser::open(&url).is_err() { - eprintln!("Failed to open '{url}' in a web browser"); + error!("Failed to open '{url}' in a web browser"); } let tree_sitter_dir = env::var("TREE_SITTER_BASE_DIR").map(PathBuf::from).ok(); diff --git a/crates/cli/src/query.rs b/crates/cli/src/query.rs index 81ccea50..ea074b75 100644 --- a/crates/cli/src/query.rs +++ b/crates/cli/src/query.rs @@ -8,12 +8,13 @@ use std::{ use anstyle::AnsiColor; use anyhow::{Context, Result}; +use log::warn; use streaming_iterator::StreamingIterator; use tree_sitter::{Language, Parser, Point, Query, QueryCursor}; use crate::{ + logger::paint, query_testing::{self, to_utf8_point}, - test::paint, }; #[allow(clippy::too_many_arguments)] @@ -114,11 +115,8 @@ pub fn query_file_at_path( } } } - if query_cursor.did_exceed_match_limit() { - writeln!( - &mut stdout, - " WARNING: Query exceeded maximum number of in-progress captures!" - )?; + if !query_cursor.did_exceed_match_limit() { + warn!("Query exceeded maximum number of in-progress captures!"); } if should_test { let path_name = if stdin { diff --git a/crates/cli/src/test.rs b/crates/cli/src/test.rs index 1df020dd..d3a120e3 100644 --- a/crates/cli/src/test.rs +++ b/crates/cli/src/test.rs @@ -10,7 +10,7 @@ use std::{ time::Duration, }; -use anstyle::{AnsiColor, Color, Style}; +use anstyle::AnsiColor; use anyhow::{anyhow, Context, Result}; use clap::ValueEnum; use indoc::indoc; @@ -23,8 +23,11 @@ use tree_sitter::{format_sexp, Language, LogType, Parser, Query, Tree}; use walkdir::WalkDir; use super::util; -use crate::parse::{ - render_cst, ParseDebugType, ParseFileOptions, ParseOutput, ParseStats, ParseTheme, Stats, +use crate::{ + logger::paint, + parse::{ + render_cst, ParseDebugType, ParseFileOptions, ParseOutput, ParseStats, ParseTheme, Stats, + }, }; static HEADER_REGEX: LazyLock = LazyLock::new(|| { @@ -205,7 +208,7 @@ pub fn run_tests_at_path(parser: &mut Parser, opts: &mut TestOptions) -> Result< // 3 standard deviations below the mean, aka the "Empirical Rule" if *adj_rate < 3.0f64.mul_add(-std_dev, avg) { stats += &paint( - opts.color.then_some(AnsiColor::Red), + opts.color.then_some(AnsiColor::Yellow), &format!(" -- Warning: Slow parse rate ({true_rate:.3} bytes/ms)"), ); } @@ -219,78 +222,76 @@ pub fn run_tests_at_path(parser: &mut Parser, opts: &mut TestOptions) -> Result< parser.stop_printing_dot_graphs(); if failures.is_empty() { + Ok(()) + } else if opts.update && !has_parse_errors { + println!( + "\n{} update{}:\n", + failures.len(), + if failures.len() == 1 { "" } else { "s" } + ); + + for (i, TestFailure { name, .. }) in failures.iter().enumerate() { + println!(" {}. {name}", i + 1); + } + Ok(()) } else { - println!(); + has_parse_errors = opts.update && has_parse_errors; - if opts.update && !has_parse_errors { - if failures.len() == 1 { - println!("1 update:\n"); - } else { - println!("{} updates:\n", failures.len()); + if !opts.overview_only { + if !has_parse_errors { + println!( + "\n{} failure{}:", + failures.len(), + if failures.len() == 1 { "" } else { "s" } + ); } - for (i, TestFailure { name, .. }) in failures.iter().enumerate() { - println!(" {}. {name}", i + 1); + if opts.color { + print_diff_key(); + } + for ( + i, + TestFailure { + name, + actual, + expected, + is_cst, + }, + ) in failures.iter().enumerate() + { + if expected == "NO ERROR" { + println!("\n {}. {name}:\n", i + 1); + println!(" Expected an ERROR node, but got:"); + let actual = if *is_cst { + actual + } else { + &format_sexp(actual, 2) + }; + println!(" {}", paint(opts.color.then_some(AnsiColor::Red), actual)); + } else { + println!("\n {}. {name}:", i + 1); + if *is_cst { + print_diff(actual, expected, opts.color); + } else { + print_diff( + &format_sexp(actual, 2), + &format_sexp(expected, 2), + opts.color, + ); + } + } } - - Ok(()) } else { - has_parse_errors = opts.update && has_parse_errors; + println!(); + } - if !opts.overview_only { - if !has_parse_errors { - if failures.len() == 1 { - println!("1 failure:"); - } else { - println!("{} failures:", failures.len()); - } - } - - if opts.color { - print_diff_key(); - } - for ( - i, - TestFailure { - name, - actual, - expected, - is_cst, - }, - ) in failures.iter().enumerate() - { - if expected == "NO ERROR" { - println!("\n {}. {name}:\n", i + 1); - println!(" Expected an ERROR node, but got:"); - let actual = if *is_cst { - actual - } else { - &format_sexp(actual, 2) - }; - println!(" {}", paint(opts.color.then_some(AnsiColor::Red), actual)); - } else { - println!("\n {}. {name}:", i + 1); - if *is_cst { - print_diff(actual, expected, opts.color); - } else { - print_diff( - &format_sexp(actual, 2), - &format_sexp(expected, 2), - opts.color, - ); - } - } - } - } - - if has_parse_errors { - Err(anyhow!(indoc! {" - Some tests failed to parse with unexpected `ERROR` or `MISSING` nodes, as shown above, and cannot be updated automatically. - Either fix the grammar or manually update the tests if this is expected."})) - } else { - Err(anyhow!("")) - } + if has_parse_errors { + Err(anyhow!(indoc! {" + Some tests failed to parse with unexpected `ERROR` or `MISSING` nodes, as shown above, and cannot be updated automatically. + Either fix the grammar or manually update the tests if this is expected."})) + } else { + Err(anyhow!("")) } } } @@ -361,11 +362,6 @@ pub fn print_diff(actual: &str, expected: &str, use_color: bool) { println!(); } -pub fn paint(color: Option>, text: &str) -> String { - let style = Style::new().fg_color(color.map(Into::into)); - format!("{style}{text}{style:#}") -} - struct TestFailure { name: String, actual: String, diff --git a/crates/cli/src/test_highlight.rs b/crates/cli/src/test_highlight.rs index d2f37e2f..b03270c6 100644 --- a/crates/cli/src/test_highlight.rs +++ b/crates/cli/src/test_highlight.rs @@ -6,9 +6,9 @@ use tree_sitter::Point; use tree_sitter_highlight::{Highlight, HighlightConfiguration, HighlightEvent, Highlighter}; use tree_sitter_loader::{Config, Loader}; -use super::{ +use crate::{ + logger::paint, query_testing::{parse_position_comments, to_utf8_point, Assertion, Utf8Point}, - test::paint, util, }; diff --git a/crates/cli/src/test_tags.rs b/crates/cli/src/test_tags.rs index a0e6e3e9..e5a68443 100644 --- a/crates/cli/src/test_tags.rs +++ b/crates/cli/src/test_tags.rs @@ -5,9 +5,9 @@ use anyhow::{anyhow, Result}; use tree_sitter_loader::{Config, Loader}; use tree_sitter_tags::{TagsConfiguration, TagsContext}; -use super::{ +use crate::{ + logger::paint, query_testing::{parse_position_comments, to_utf8_point, Assertion, Utf8Point}, - test::paint, util, }; diff --git a/crates/cli/src/tests/text_provider_test.rs b/crates/cli/src/tests/text_provider_test.rs index d9ed454e..6c4e8939 100644 --- a/crates/cli/src/tests/text_provider_test.rs +++ b/crates/cli/src/tests/text_provider_test.rs @@ -21,7 +21,6 @@ where let mut parser = Parser::new(); parser.set_language(&language).unwrap(); let tree = parser.parse_with_options(callback, None, None).unwrap(); - // eprintln!("{}", tree.clone().root_node().to_sexp()); assert_eq!("comment", tree.root_node().child(0).unwrap().kind()); (tree, language) } diff --git a/crates/cli/src/util.rs b/crates/cli/src/util.rs index fd4f4699..72968db8 100644 --- a/crates/cli/src/util.rs +++ b/crates/cli/src/util.rs @@ -9,6 +9,7 @@ use std::{ use anyhow::{anyhow, Context, Result}; use indoc::indoc; +use log::error; use tree_sitter::{Parser, Tree}; use tree_sitter_config::Config; use tree_sitter_loader::Config as LoaderConfig; @@ -120,7 +121,7 @@ impl Drop for LogSession { webbrowser::open(&self.path.to_string_lossy()).unwrap(); } } else { - eprintln!( + error!( "Dot failed: {} {}", String::from_utf8_lossy(&output.stdout), String::from_utf8_lossy(&output.stderr) diff --git a/crates/cli/src/version.rs b/crates/cli/src/version.rs index 3064ead7..39cd5481 100644 --- a/crates/cli/src/version.rs +++ b/crates/cli/src/version.rs @@ -2,6 +2,7 @@ use std::{fs, path::PathBuf, process::Command}; use anyhow::{anyhow, Context, Result}; use clap::ValueEnum; +use log::{info, warn}; use regex::Regex; use semver::Version as SemverVersion; use std::cmp::Ordering; @@ -44,7 +45,7 @@ impl Version { let current_version = tree_sitter_json.metadata.version; self.version = match (self.version.is_some(), self.bump) { (false, None) => { - println!("Current version: {current_version}"); + info!("Current version: {current_version}"); return Ok(()); } (true, None) => self.version, @@ -70,14 +71,14 @@ impl Version { let new_version = self.version.as_ref().unwrap(); match new_version.cmp(¤t_version) { Ordering::Less => { - eprintln!("Warning: new version is lower than current!"); - println!("Reverting version {current_version} to {new_version}"); + warn!("New version is lower than current!"); + warn!("Reverting version {current_version} to {new_version}"); } Ordering::Greater => { - println!("Bumping version {current_version} to {new_version}"); + info!("Bumping version {current_version} to {new_version}"); } Ordering::Equal => { - println!("Keeping version {current_version}"); + info!("Keeping version {current_version}"); } } From d13657c40c76a2a72cad5a69812a378c4dec02b1 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Mon, 15 Sep 2025 20:43:02 +0300 Subject: [PATCH 487/663] refactor(generate): use the logger Co-authored-by: Amaan Qureshi --- crates/generate/src/build_tables.rs | 53 ++++++++++--------- .../src/build_tables/build_lex_table.rs | 4 +- .../src/build_tables/build_parse_table.rs | 27 ++++++---- .../src/build_tables/minimize_parse_table.rs | 20 +++---- crates/generate/src/generate.rs | 13 ++++- crates/generate/src/parse_grammar.rs | 16 ++++-- .../src/prepare_grammar/intern_symbols.rs | 11 ++-- crates/generate/src/quickjs.rs | 7 +-- 8 files changed, 89 insertions(+), 62 deletions(-) diff --git a/crates/generate/src/build_tables.rs b/crates/generate/src/build_tables.rs index f5709419..c6020cd2 100644 --- a/crates/generate/src/build_tables.rs +++ b/crates/generate/src/build_tables.rs @@ -11,7 +11,7 @@ use std::collections::{BTreeSet, HashMap}; pub use build_lex_table::LARGE_CHARACTER_RANGE_COUNT; use build_parse_table::BuildTableResult; pub use build_parse_table::ParseTableBuilderError; -use log::info; +use log::{debug, info}; use self::{ build_lex_table::build_lex_table, @@ -172,7 +172,7 @@ fn populate_error_state( if conflicts_with_other_tokens { None } else { - info!( + debug!( "error recovery - token {} has no conflicts", lexical_grammar.variables[i].name ); @@ -198,14 +198,14 @@ fn populate_error_state( !coincident_token_index.contains(symbol, *t) && token_conflict_map.does_conflict(symbol.index, t.index) }) { - info!( + debug!( "error recovery - exclude token {} because of conflict with {}", lexical_grammar.variables[i].name, lexical_grammar.variables[t.index].name ); continue; } } - info!( + debug!( "error recovery - include token {}", lexical_grammar.variables[i].name ); @@ -338,7 +338,7 @@ fn identify_keywords( && token_conflict_map.does_match_same_string(i, word_token.index) && !token_conflict_map.does_match_different_string(i, word_token.index) { - info!( + debug!( "Keywords - add candidate {}", lexical_grammar.variables[i].name ); @@ -357,7 +357,7 @@ fn identify_keywords( if other_token != *token && token_conflict_map.does_match_same_string(other_token.index, token.index) { - info!( + debug!( "Keywords - exclude {} because it matches the same string as {}", lexical_grammar.variables[token.index].name, lexical_grammar.variables[other_token.index].name @@ -399,7 +399,7 @@ fn identify_keywords( word_token.index, other_index, ) { - info!( + debug!( "Keywords - exclude {} because of conflict with {}", lexical_grammar.variables[token.index].name, lexical_grammar.variables[other_index].name @@ -408,7 +408,7 @@ fn identify_keywords( } } - info!( + debug!( "Keywords - include {}", lexical_grammar.variables[token.index].name, ); @@ -480,14 +480,14 @@ fn report_state_info<'a>( .max() .unwrap(); for (symbol, states) in &symbols_with_state_indices { - eprintln!( + info!( "{:width$}\t{}", syntax_grammar.variables[symbol.index].name, states.len(), width = max_symbol_name_length ); } - eprintln!(); + info!(""); let state_indices = if report_symbol_name == "*" { Some(&all_state_indices) @@ -510,20 +510,25 @@ fn report_state_info<'a>( for state_index in state_indices { let id = parse_table.states[state_index].id; let (preceding_symbols, item_set) = &parse_state_info[id]; - eprintln!("state index: {state_index}"); - eprintln!("state id: {id}"); - eprint!("symbol sequence:"); - for symbol in preceding_symbols { - let name = if symbol.is_terminal() { - &lexical_grammar.variables[symbol.index].name - } else if symbol.is_external() { - &syntax_grammar.external_tokens[symbol.index].name - } else { - &syntax_grammar.variables[symbol.index].name - }; - eprint!(" {name}"); - } - eprintln!( + info!("state index: {state_index}"); + info!("state id: {id}"); + info!( + "symbol sequence: {}", + preceding_symbols + .iter() + .map(|symbol| { + if symbol.is_terminal() { + lexical_grammar.variables[symbol.index].name.clone() + } else if symbol.is_external() { + syntax_grammar.external_tokens[symbol.index].name.clone() + } else { + syntax_grammar.variables[symbol.index].name.clone() + } + }) + .collect::>() + .join(" ") + ); + info!( "\nitems:\n{}", item::ParseItemSetDisplay(item_set, syntax_grammar, lexical_grammar), ); diff --git a/crates/generate/src/build_tables/build_lex_table.rs b/crates/generate/src/build_tables/build_lex_table.rs index 2de6c0f8..9d0d4fb7 100644 --- a/crates/generate/src/build_tables/build_lex_table.rs +++ b/crates/generate/src/build_tables/build_lex_table.rs @@ -3,7 +3,7 @@ use std::{ mem, }; -use log::info; +use log::debug; use super::{coincident_tokens::CoincidentTokenIndex, token_conflicts::TokenConflictMap}; use crate::{ @@ -176,7 +176,7 @@ impl<'a> LexTableBuilder<'a> { let (state_id, is_new) = self.add_state(nfa_states, eof_valid); if is_new { - info!( + debug!( "entry point state: {state_id}, tokens: {:?}", tokens .iter() diff --git a/crates/generate/src/build_tables/build_parse_table.rs b/crates/generate/src/build_tables/build_parse_table.rs index 77f3f4e2..f292542d 100644 --- a/crates/generate/src/build_tables/build_parse_table.rs +++ b/crates/generate/src/build_tables/build_parse_table.rs @@ -5,6 +5,7 @@ use std::{ }; use indexmap::{map::Entry, IndexMap}; +use log::warn; use rustc_hash::FxHasher; use serde::Serialize; use thiserror::Error; @@ -346,17 +347,21 @@ impl<'a> ParseTableBuilder<'a> { } if !self.actual_conflicts.is_empty() { - println!("Warning: unnecessary conflicts"); - for conflict in &self.actual_conflicts { - println!( - " {}", - conflict - .iter() - .map(|symbol| format!("`{}`", self.symbol_name(symbol))) - .collect::>() - .join(", ") - ); - } + warn!( + "unnecessary conflicts:\n {}", + &self + .actual_conflicts + .iter() + .map(|conflict| { + conflict + .iter() + .map(|symbol| format!("`{}`", self.symbol_name(symbol))) + .collect::>() + .join(", ") + }) + .collect::>() + .join("\n ") + ); } Ok((self.parse_table, self.parse_state_info_by_id)) diff --git a/crates/generate/src/build_tables/minimize_parse_table.rs b/crates/generate/src/build_tables/minimize_parse_table.rs index 86932121..9655cb88 100644 --- a/crates/generate/src/build_tables/minimize_parse_table.rs +++ b/crates/generate/src/build_tables/minimize_parse_table.rs @@ -3,7 +3,7 @@ use std::{ mem, }; -use log::info; +use log::debug; use super::token_conflicts::TokenConflictMap; use crate::{ @@ -244,7 +244,7 @@ impl Minimizer<'_> { let group1 = group_ids_by_state_id[*s1]; let group2 = group_ids_by_state_id[*s2]; if group1 != group2 { - info!( + debug!( "split states {} {} - successors for {} are split: {s1} {s2}", state1.id, state2.id, @@ -265,7 +265,7 @@ impl Minimizer<'_> { let group1 = group_ids_by_state_id[*s1]; let group2 = group_ids_by_state_id[*s2]; if group1 != group2 { - info!( + debug!( "split states {} {} - successors for {} are split: {s1} {s2}", state1.id, state2.id, @@ -295,7 +295,7 @@ impl Minimizer<'_> { let actions1 = &entry1.actions; let actions2 = &entry2.actions; if actions1.len() != actions2.len() { - info!( + debug!( "split states {state_id1} {state_id2} - differing action counts for token {}", self.symbol_name(token) ); @@ -322,13 +322,13 @@ impl Minimizer<'_> { if group1 == group2 && is_repetition1 == is_repetition2 { continue; } - info!( + debug!( "split states {state_id1} {state_id2} - successors for {} are split: {s1} {s2}", self.symbol_name(token), ); return true; } else if action1 != action2 { - info!( + debug!( "split states {state_id1} {state_id2} - unequal actions for {}", self.symbol_name(token), ); @@ -347,14 +347,14 @@ impl Minimizer<'_> { new_token: Symbol, ) -> bool { if new_token == Symbol::end_of_nonterminal_extra() { - info!("split states {left_id} {right_id} - end of non-terminal extra",); + debug!("split states {left_id} {right_id} - end of non-terminal extra",); return true; } // Do not add external tokens; they could conflict lexically with any of the state's // existing lookahead tokens. if new_token.is_external() { - info!( + debug!( "split states {left_id} {right_id} - external token {}", self.symbol_name(&new_token), ); @@ -373,7 +373,7 @@ impl Minimizer<'_> { .iter() .any(|external| external.corresponding_internal_token == Some(new_token)) { - info!( + debug!( "split states {left_id} {right_id} - internal/external token {}", self.symbol_name(&new_token), ); @@ -399,7 +399,7 @@ impl Minimizer<'_> { .token_conflict_map .does_match_same_string(new_token.index, token.index) { - info!( + debug!( "split states {} {} - token {} conflicts with {}", left_id, right_id, diff --git a/crates/generate/src/generate.rs b/crates/generate/src/generate.rs index 5c445902..9caeea39 100644 --- a/crates/generate/src/generate.rs +++ b/crates/generate/src/generate.rs @@ -8,6 +8,7 @@ use std::{ }; use anyhow::Result; +use log::warn; use node_types::VariableInfo; use regex::{Regex, RegexBuilder}; use rules::{Alias, Symbol}; @@ -255,8 +256,16 @@ where let semantic_version = read_grammar_version(&repo_path)?; if semantic_version.is_none() && abi_version > ABI_VERSION_MIN { - println!("Warning: No `tree-sitter.json` file found in your grammar, this file is required to generate with ABI {abi_version}. Using ABI version {ABI_VERSION_MIN} instead."); - println!("This file can be set up with `tree-sitter init`. For more information, see https://tree-sitter.github.io/tree-sitter/cli/init."); + warn!( + concat!( + "No `tree-sitter.json` file found in your grammar, ", + "this file is required to generate with ABI {}. ", + "Using ABI version {} instead.\n", + "This file can be set up with `tree-sitter init`. ", + "For more information, see https://tree-sitter.github.io/tree-sitter/cli/init." + ), + abi_version, ABI_VERSION_MIN + ); abi_version = ABI_VERSION_MIN; } diff --git a/crates/generate/src/parse_grammar.rs b/crates/generate/src/parse_grammar.rs index 2dbf7701..f95eaba4 100644 --- a/crates/generate/src/parse_grammar.rs +++ b/crates/generate/src/parse_grammar.rs @@ -1,16 +1,16 @@ use std::collections::HashSet; use anyhow::Result; +use log::warn; use regex::Regex; use serde::{Deserialize, Serialize}; use serde_json::{Map, Value}; use thiserror::Error; -use super::{ - grammars::{InputGrammar, PrecedenceEntry, Variable, VariableType}, +use crate::{ + grammars::{InputGrammar, PrecedenceEntry, ReservedWordContext, Variable, VariableType}, rules::{Precedence, Rule}, }; -use crate::grammars::ReservedWordContext; #[derive(Deserialize)] #[serde(tag = "type")] @@ -281,7 +281,13 @@ pub(crate) fn parse_grammar(input: &str) -> ParseGrammarResult { _ => false, }; if matches_empty { - eprintln!("Warning: Named extra rule `{name}` matches the empty string. Inline this to avoid infinite loops while parsing."); + warn!( + concat!( + "Named extra rule `{}` matches the empty string. ", + "Inline this to avoid infinite loops while parsing." + ), + name + ); } } variables.push(Variable { @@ -342,7 +348,7 @@ fn parse_rule(json: RuleJSON, is_token: bool) -> ParseGrammarResult { } else { // silently ignore unicode flags if c != 'u' && c != 'v' { - eprintln!("Warning: unsupported flag {c}"); + warn!("unsupported flag {c}"); } false } diff --git a/crates/generate/src/prepare_grammar/intern_symbols.rs b/crates/generate/src/prepare_grammar/intern_symbols.rs index a46c9f72..010967b8 100644 --- a/crates/generate/src/prepare_grammar/intern_symbols.rs +++ b/crates/generate/src/prepare_grammar/intern_symbols.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use log::warn; use serde::Serialize; use thiserror::Error; @@ -132,7 +133,7 @@ impl Interner<'_> { fn intern_rule(&self, rule: &Rule, name: Option<&str>) -> InternSymbolsResult { match rule { Rule::Choice(elements) => { - self.check_single(elements, name); + self.check_single(elements, name, "choice"); let mut result = Vec::with_capacity(elements.len()); for element in elements { result.push(self.intern_rule(element, name)?); @@ -140,7 +141,7 @@ impl Interner<'_> { Ok(Rule::Choice(result)) } Rule::Seq(elements) => { - self.check_single(elements, name); + self.check_single(elements, name, "seq"); let mut result = Vec::with_capacity(elements.len()); for element in elements { result.push(self.intern_rule(element, name)?); @@ -184,10 +185,10 @@ impl Interner<'_> { // In the case of a seq or choice rule of 1 element in a hidden rule, weird // inconsistent behavior with queries can occur. So we should warn the user about it. - fn check_single(&self, elements: &[Rule], name: Option<&str>) { + fn check_single(&self, elements: &[Rule], name: Option<&str>, kind: &str) { if elements.len() == 1 && matches!(elements[0], Rule::String(_) | Rule::Pattern(_, _)) { - eprintln!( - "Warning: rule {} contains a `seq` or `choice` rule with a single element. This is unnecessary.", + warn!( + "rule {} contains a `{kind}` rule with a single element. This is unnecessary.", name.unwrap_or_default() ); } diff --git a/crates/generate/src/quickjs.rs b/crates/generate/src/quickjs.rs index 1ea7970c..689615fc 100644 --- a/crates/generate/src/quickjs.rs +++ b/crates/generate/src/quickjs.rs @@ -4,6 +4,7 @@ use std::{ sync::{LazyLock, Mutex}, }; +use log::{error, info, warn}; use rquickjs::{ loader::{FileResolver, ScriptLoader}, Context, Ctx, Function, Module, Object, Runtime, Type, Value, @@ -116,19 +117,19 @@ impl Console { #[allow(clippy::needless_pass_by_value)] pub fn log(&self, args: rquickjs::function::Rest>) -> rquickjs::Result<()> { - println!("{}", Self::format_args(&args)); + info!("{}", Self::format_args(&args)); Ok(()) } #[allow(clippy::needless_pass_by_value)] pub fn warn(&self, args: rquickjs::function::Rest>) -> rquickjs::Result<()> { - eprintln!("Warning: {}", Self::format_args(&args)); + warn!("{}", Self::format_args(&args)); Ok(()) } #[allow(clippy::needless_pass_by_value)] pub fn error(&self, args: rquickjs::function::Rest>) -> rquickjs::Result<()> { - eprintln!("Error: {}", Self::format_args(&args)); + error!("Error: {}", Self::format_args(&args)); Ok(()) } } From e5c11d9efc3f4b23c4c4bcbdff527c1f1ac61664 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sat, 20 Sep 2025 01:10:37 -0400 Subject: [PATCH 488/663] refactor(config): use the logger --- crates/config/Cargo.toml | 1 + crates/config/src/tree_sitter_config.rs | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/config/Cargo.toml b/crates/config/Cargo.toml index 9fc0d493..b9bc239e 100644 --- a/crates/config/Cargo.toml +++ b/crates/config/Cargo.toml @@ -22,5 +22,6 @@ workspace = true [dependencies] anyhow.workspace = true etcetera.workspace = true +log.workspace = true serde.workspace = true serde_json.workspace = true diff --git a/crates/config/src/tree_sitter_config.rs b/crates/config/src/tree_sitter_config.rs index 757ed64e..85dc003d 100644 --- a/crates/config/src/tree_sitter_config.rs +++ b/crates/config/src/tree_sitter_config.rs @@ -4,6 +4,7 @@ use std::{env, fs, path::PathBuf}; use anyhow::{Context, Result}; use etcetera::BaseStrategy as _; +use log::warn; use serde::{Deserialize, Serialize}; use serde_json::Value; @@ -47,8 +48,8 @@ impl Config { if legacy_apple_path.is_file() { fs::create_dir_all(xdg_path.parent().unwrap())?; fs::rename(&legacy_apple_path, &xdg_path)?; - println!( - "Warning: your config.json file has been automatically migrated from \"{}\" to \"{}\"", + warn!( + "Your config.json file has been automatically migrated from \"{}\" to \"{}\"", legacy_apple_path.display(), xdg_path.display() ); From d543e2e50bf606e5f657ea11945ef8bb38e4486e Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sat, 20 Sep 2025 01:10:42 -0400 Subject: [PATCH 489/663] refactor(loader): use the logger --- Cargo.lock | 2 ++ crates/loader/Cargo.toml | 1 + crates/loader/src/loader.rs | 51 +++++++++++++++++++++---------------- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a96db54c..63d88dcf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1949,6 +1949,7 @@ version = "0.27.0" dependencies = [ "anyhow", "etcetera", + "log", "serde", "serde_json", ] @@ -2000,6 +2001,7 @@ dependencies = [ "fs4", "indoc", "libloading", + "log", "once_cell", "regex", "semver", diff --git a/crates/loader/Cargo.toml b/crates/loader/Cargo.toml index 2bfa2c76..ba6aa0f4 100644 --- a/crates/loader/Cargo.toml +++ b/crates/loader/Cargo.toml @@ -34,6 +34,7 @@ etcetera.workspace = true fs4.workspace = true indoc.workspace = true libloading.workspace = true +log.workspace = true once_cell.workspace = true regex.workspace = true semver.workspace = true diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index 9e52f784..a004c0d9 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -21,8 +21,8 @@ use anyhow::Error; use anyhow::{anyhow, Context, Result}; use etcetera::BaseStrategy as _; use fs4::fs_std::FileExt; -use indoc::indoc; use libloading::{Library, Symbol}; +use log::{error, info, warn}; use once_cell::unsync::OnceCell; use regex::{Regex, RegexBuilder}; use semver::Version; @@ -493,10 +493,12 @@ impl Loader { pub fn find_all_languages(&mut self, config: &Config) -> Result<()> { if config.parser_directories.is_empty() { - eprintln!("Warning: You have not configured any parser directories!"); - eprintln!("Please run `tree-sitter init-config` and edit the resulting"); - eprintln!("configuration file to indicate where we should look for"); - eprintln!("language grammars.\n"); + warn!(concat!( + "You have not configured any parser directories!\n", + "Please run `tree-sitter init-config` and edit the resulting\n", + "configuration file to indicate where we should look for\n", + "language grammars.\n" + )); } for parser_container_dir in &config.parser_directories { if let Ok(entries) = fs::read_dir(parser_container_dir) { @@ -975,9 +977,9 @@ impl Loader { if !line.contains("tree_sitter_") { if !found_non_static { found_non_static = true; - eprintln!("Warning: Found non-static non-tree-sitter functions in the external scannner"); + warn!("Found non-static non-tree-sitter functions in the external scanner"); } - eprintln!(" `{function_name}`"); + warn!(" `{function_name}`"); } else { must_have.retain(|f| f != function_name); } @@ -985,7 +987,10 @@ impl Loader { } } if found_non_static { - eprintln!("Consider making these functions static, they can cause conflicts when another tree-sitter project uses the same function name"); + warn!(concat!( + "Consider making these functions static, they can cause conflicts ", + "when another tree-sitter project uses the same function name." + )); } if !must_have.is_empty() { @@ -996,7 +1001,7 @@ impl Loader { .join("\n"); return Err(anyhow!(format!( - indoc! {" + indoc::indoc! {" Missing required functions in the external scanner, parsing won't work without these! {} @@ -1176,7 +1181,7 @@ impl Loader { "https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-25/{sdk_filename}", ); - eprintln!("Downloading wasi-sdk from {sdk_url}..."); + info!("Downloading wasi-sdk from {sdk_url}..."); let temp_tar_path = cache_dir.join(sdk_filename); let status = Command::new("curl") @@ -1192,7 +1197,7 @@ impl Loader { return Err(anyhow!("Failed to download wasi-sdk from {sdk_url}",)); } - eprintln!("Extracting wasi-sdk to {}...", wasi_sdk_dir.display()); + info!("Extracting wasi-sdk to {}...", wasi_sdk_dir.display()); self.extract_tar_gz_with_strip(&temp_tar_path, &wasi_sdk_dir) .context("Failed to extract wasi-sdk archive")?; @@ -1219,15 +1224,15 @@ impl Loader { ) -> Option<&'a HighlightConfiguration> { match self.language_configuration_for_injection_string(string) { Err(e) => { - eprintln!("Failed to load language for injection string '{string}': {e}",); + error!("Failed to load language for injection string '{string}': {e}",); None } Ok(None) => None, Ok(Some((language, configuration))) => { match configuration.highlight_config(language, None) { Err(e) => { - eprintln!( - "Failed to load property sheet for injection string '{string}': {e}", + error!( + "Failed to load higlight config for injection string '{string}': {e}" ); None } @@ -1349,8 +1354,8 @@ impl Loader { // This is noisy, and not really an issue. Some(e) if e.kind() == std::io::ErrorKind::NotFound => {} _ => { - eprintln!( - "Warning: Failed to parse {} -- {e}", + warn!( + "Failed to parse {} -- {e}", parser_path.join("tree-sitter.json").display() ); } @@ -1696,12 +1701,14 @@ impl LanguageConfiguration<'_> { } else { // highlights.scm is needed to test highlights, and tags.scm to test tags if default_path == "highlights.scm" || default_path == "tags.scm" { - eprintln!( - indoc! {" - Warning: you should add a `{}` entry pointing to the highlights path in the `tree-sitter` object in the grammar's tree-sitter.json file. - See more here: https://tree-sitter.github.io/tree-sitter/3-syntax-highlighting#query-paths - "}, - default_path.replace(".scm", "") + warn!( + concat!( + "You should add a `{}` entry pointing to the {} path in the `tree-sitter` ", + "object in the grammar's tree-sitter.json file. See more here: ", + "https://tree-sitter.github.io/tree-sitter/3-syntax-highlighting#query-paths" + ), + default_path.replace(".scm", ""), + default_path ); } let queries_path = self.root_path.join("queries"); From 8873c1aeff096ab5fee5e6f08494cae258c9c381 Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Sun, 27 Jul 2025 10:56:18 +0200 Subject: [PATCH 490/663] docs: update options for generate command --- docs/src/cli/generate.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/src/cli/generate.md b/docs/src/cli/generate.md index 80397820..956d5629 100644 --- a/docs/src/cli/generate.md +++ b/docs/src/cli/generate.md @@ -30,10 +30,13 @@ what keywords were extracted, what states were split and why, and the entry poin The ABI to use for parser generation. The default is ABI 15, with ABI 14 being a supported target. -### `-b/--build` +### `--stage` -Compile all defined languages in the current directory. The cli will automatically compile the parsers after generation, -and place them in the cache dir. +What generated files to emit. Possible values: + +- `json`: Generate `grammar.json` and `node-types.json` +- `parser` (default): Generate `parser.c` and related files. +- `lib`: Compile to a library (equivalent of the deprecated `--build` option) ### `-0/--debug-build` @@ -56,7 +59,7 @@ Print the overview of states from the given rule. This is useful for debugging a item sets for all given states in a given rule. To solely view state count numbers for rules, pass in `-` for the rule argument. To view the overview of states for every rule, pass in `*` for the rule argument. -### `json` +### `--json` Report conflicts in a JSON format. From c89e40f0086ac094da467f61d3130c8a43cd212a Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Fri, 19 Sep 2025 19:27:18 -0400 Subject: [PATCH 491/663] fix(generate): fix builds outside of crate workspace --- crates/generate/build.rs | 11 -- crates/generate/src/generate.rs | 15 +- crates/generate/src/parser.h.inc | 286 +++++++++++++++++++++++++++++++ 3 files changed, 298 insertions(+), 14 deletions(-) delete mode 100644 crates/generate/build.rs create mode 100644 crates/generate/src/parser.h.inc diff --git a/crates/generate/build.rs b/crates/generate/build.rs deleted file mode 100644 index bbe8a4fa..00000000 --- a/crates/generate/build.rs +++ /dev/null @@ -1,11 +0,0 @@ -use std::{env, fs, path::PathBuf}; - -fn main() { - // This will always be ran in CI before publishing. - // We don't use a symlink for windows compatibility. - fs::copy( - concat!(env!("CARGO_WORKSPACE_DIR"), "lib/src/parser.h"), - PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR should be set")).join("parser.h"), - ) - .expect("failed to copy parser.h template"); -} diff --git a/crates/generate/src/generate.rs b/crates/generate/src/generate.rs index 9caeea39..0551bb1d 100644 --- a/crates/generate/src/generate.rs +++ b/crates/generate/src/generate.rs @@ -72,7 +72,7 @@ const LANGUAGE_VERSION: usize = 15; pub const ALLOC_HEADER: &str = include_str!("templates/alloc.h"); pub const ARRAY_HEADER: &str = include_str!("templates/array.h"); -pub const PARSER_HEADER: &str = include_str!(concat!(env!("OUT_DIR"), "/parser.h")); +pub const PARSER_HEADER: &str = include_str!("parser.h.inc"); pub type GenerateResult = Result; @@ -544,9 +544,9 @@ pub fn write_file(path: &Path, body: impl AsRef<[u8]>) -> GenerateResult<()> { #[cfg(test)] mod tests { - use super::LANGUAGE_VERSION; + use super::{LANGUAGE_VERSION, PARSER_HEADER}; #[test] - fn the_language_versions_are_in_sync() { + fn test_language_versions_are_in_sync() { let api_h = include_str!("../../../lib/include/tree_sitter/api.h"); let api_language_version = api_h .lines() @@ -558,4 +558,13 @@ mod tests { .expect("Failed to find TREE_SITTER_LANGUAGE_VERSION definition in api.h"); assert_eq!(LANGUAGE_VERSION, api_language_version); } + + #[test] + fn test_parser_header_in_sync() { + let parser_h = include_str!("../../../lib/src/parser.h"); + assert!( + parser_h == PARSER_HEADER, + "parser.h.inc is out of sync with lib/src/parser.h. Run: cp lib/src/parser.h crates/generate/src/parser.h.inc" + ); + } } diff --git a/crates/generate/src/parser.h.inc b/crates/generate/src/parser.h.inc new file mode 100644 index 00000000..858107de --- /dev/null +++ b/crates/generate/src/parser.h.inc @@ -0,0 +1,286 @@ +#ifndef TREE_SITTER_PARSER_H_ +#define TREE_SITTER_PARSER_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +#define ts_builtin_sym_error ((TSSymbol)-1) +#define ts_builtin_sym_end 0 +#define TREE_SITTER_SERIALIZATION_BUFFER_SIZE 1024 + +#ifndef TREE_SITTER_API_H_ +typedef uint16_t TSStateId; +typedef uint16_t TSSymbol; +typedef uint16_t TSFieldId; +typedef struct TSLanguage TSLanguage; +typedef struct TSLanguageMetadata { + uint8_t major_version; + uint8_t minor_version; + uint8_t patch_version; +} TSLanguageMetadata; +#endif + +typedef struct { + TSFieldId field_id; + uint8_t child_index; + bool inherited; +} TSFieldMapEntry; + +// Used to index the field and supertype maps. +typedef struct { + uint16_t index; + uint16_t length; +} TSMapSlice; + +typedef struct { + bool visible; + bool named; + bool supertype; +} TSSymbolMetadata; + +typedef struct TSLexer TSLexer; + +struct TSLexer { + int32_t lookahead; + TSSymbol result_symbol; + void (*advance)(TSLexer *, bool); + void (*mark_end)(TSLexer *); + uint32_t (*get_column)(TSLexer *); + bool (*is_at_included_range_start)(const TSLexer *); + bool (*eof)(const TSLexer *); + void (*log)(const TSLexer *, const char *, ...); +}; + +typedef enum { + TSParseActionTypeShift, + TSParseActionTypeReduce, + TSParseActionTypeAccept, + TSParseActionTypeRecover, +} TSParseActionType; + +typedef union { + struct { + uint8_t type; + TSStateId state; + bool extra; + bool repetition; + } shift; + struct { + uint8_t type; + uint8_t child_count; + TSSymbol symbol; + int16_t dynamic_precedence; + uint16_t production_id; + } reduce; + uint8_t type; +} TSParseAction; + +typedef struct { + uint16_t lex_state; + uint16_t external_lex_state; +} TSLexMode; + +typedef struct { + uint16_t lex_state; + uint16_t external_lex_state; + uint16_t reserved_word_set_id; +} TSLexerMode; + +typedef union { + TSParseAction action; + struct { + uint8_t count; + bool reusable; + } entry; +} TSParseActionEntry; + +typedef struct { + int32_t start; + int32_t end; +} TSCharacterRange; + +struct TSLanguage { + uint32_t abi_version; + uint32_t symbol_count; + uint32_t alias_count; + uint32_t token_count; + uint32_t external_token_count; + uint32_t state_count; + uint32_t large_state_count; + uint32_t production_id_count; + uint32_t field_count; + uint16_t max_alias_sequence_length; + const uint16_t *parse_table; + const uint16_t *small_parse_table; + const uint32_t *small_parse_table_map; + const TSParseActionEntry *parse_actions; + const char * const *symbol_names; + const char * const *field_names; + const TSMapSlice *field_map_slices; + const TSFieldMapEntry *field_map_entries; + const TSSymbolMetadata *symbol_metadata; + const TSSymbol *public_symbol_map; + const uint16_t *alias_map; + const TSSymbol *alias_sequences; + const TSLexerMode *lex_modes; + bool (*lex_fn)(TSLexer *, TSStateId); + bool (*keyword_lex_fn)(TSLexer *, TSStateId); + TSSymbol keyword_capture_token; + struct { + const bool *states; + const TSSymbol *symbol_map; + void *(*create)(void); + void (*destroy)(void *); + bool (*scan)(void *, TSLexer *, const bool *symbol_whitelist); + unsigned (*serialize)(void *, char *); + void (*deserialize)(void *, const char *, unsigned); + } external_scanner; + const TSStateId *primary_state_ids; + const char *name; + const TSSymbol *reserved_words; + uint16_t max_reserved_word_set_size; + uint32_t supertype_count; + const TSSymbol *supertype_symbols; + const TSMapSlice *supertype_map_slices; + const TSSymbol *supertype_map_entries; + TSLanguageMetadata metadata; +}; + +static inline bool set_contains(const TSCharacterRange *ranges, uint32_t len, int32_t lookahead) { + uint32_t index = 0; + uint32_t size = len - index; + while (size > 1) { + uint32_t half_size = size / 2; + uint32_t mid_index = index + half_size; + const TSCharacterRange *range = &ranges[mid_index]; + if (lookahead >= range->start && lookahead <= range->end) { + return true; + } else if (lookahead > range->end) { + index = mid_index; + } + size -= half_size; + } + const TSCharacterRange *range = &ranges[index]; + return (lookahead >= range->start && lookahead <= range->end); +} + +/* + * Lexer Macros + */ + +#ifdef _MSC_VER +#define UNUSED __pragma(warning(suppress : 4101)) +#else +#define UNUSED __attribute__((unused)) +#endif + +#define START_LEXER() \ + bool result = false; \ + bool skip = false; \ + UNUSED \ + bool eof = false; \ + int32_t lookahead; \ + goto start; \ + next_state: \ + lexer->advance(lexer, skip); \ + start: \ + skip = false; \ + lookahead = lexer->lookahead; + +#define ADVANCE(state_value) \ + { \ + state = state_value; \ + goto next_state; \ + } + +#define ADVANCE_MAP(...) \ + { \ + static const uint16_t map[] = { __VA_ARGS__ }; \ + for (uint32_t i = 0; i < sizeof(map) / sizeof(map[0]); i += 2) { \ + if (map[i] == lookahead) { \ + state = map[i + 1]; \ + goto next_state; \ + } \ + } \ + } + +#define SKIP(state_value) \ + { \ + skip = true; \ + state = state_value; \ + goto next_state; \ + } + +#define ACCEPT_TOKEN(symbol_value) \ + result = true; \ + lexer->result_symbol = symbol_value; \ + lexer->mark_end(lexer); + +#define END_STATE() return result; + +/* + * Parse Table Macros + */ + +#define SMALL_STATE(id) ((id) - LARGE_STATE_COUNT) + +#define STATE(id) id + +#define ACTIONS(id) id + +#define SHIFT(state_value) \ + {{ \ + .shift = { \ + .type = TSParseActionTypeShift, \ + .state = (state_value) \ + } \ + }} + +#define SHIFT_REPEAT(state_value) \ + {{ \ + .shift = { \ + .type = TSParseActionTypeShift, \ + .state = (state_value), \ + .repetition = true \ + } \ + }} + +#define SHIFT_EXTRA() \ + {{ \ + .shift = { \ + .type = TSParseActionTypeShift, \ + .extra = true \ + } \ + }} + +#define REDUCE(symbol_name, children, precedence, prod_id) \ + {{ \ + .reduce = { \ + .type = TSParseActionTypeReduce, \ + .symbol = symbol_name, \ + .child_count = children, \ + .dynamic_precedence = precedence, \ + .production_id = prod_id \ + }, \ + }} + +#define RECOVER() \ + {{ \ + .type = TSParseActionTypeRecover \ + }} + +#define ACCEPT_INPUT() \ + {{ \ + .type = TSParseActionTypeAccept \ + }} + +#ifdef __cplusplus +} +#endif + +#endif // TREE_SITTER_PARSER_H_ From 6214f95e7e2f045b7a6c6a9a284c7f9ffccf1dd7 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Sun, 21 Sep 2025 15:22:11 -0400 Subject: [PATCH 492/663] docs: correct new generate flag: "stage"->"emit" --- docs/src/cli/generate.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/cli/generate.md b/docs/src/cli/generate.md index 956d5629..02fcec00 100644 --- a/docs/src/cli/generate.md +++ b/docs/src/cli/generate.md @@ -30,7 +30,7 @@ what keywords were extracted, what states were split and why, and the entry poin The ABI to use for parser generation. The default is ABI 15, with ABI 14 being a supported target. -### `--stage` +### `--emit` What generated files to emit. Possible values: From 1be51c2129d7b7a13b3643cf3f06fdb28217bfa5 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Sun, 21 Sep 2025 16:05:05 +0300 Subject: [PATCH 493/663] chore: upgrade emscripten to 4.0.15 --- crates/loader/emscripten-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/loader/emscripten-version b/crates/loader/emscripten-version index 4c05e4ef..af253c16 100644 --- a/crates/loader/emscripten-version +++ b/crates/loader/emscripten-version @@ -1 +1 @@ -4.0.12 +4.0.15 From a1640e4fe45d4f2bfa70441dc6ac29c0d241a37d Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Sun, 21 Sep 2025 16:09:18 +0300 Subject: [PATCH 494/663] chore: rebuild wasm stdlib --- lib/src/wasm/wasm-stdlib.h | 2217 +++++++++++++++++------------------- 1 file changed, 1046 insertions(+), 1171 deletions(-) diff --git a/lib/src/wasm/wasm-stdlib.h b/lib/src/wasm/wasm-stdlib.h index d7929f03..753a7abf 100644 --- a/lib/src/wasm/wasm-stdlib.h +++ b/lib/src/wasm/wasm-stdlib.h @@ -1,999 +1,920 @@ unsigned char STDLIB_WASM[] = { - 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1e, 0x06, 0x60, + 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1a, 0x05, 0x60, + 0x01, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x01, 0x7f, 0x01, 0x7f, 0x60, 0x00, 0x01, 0x7f, 0x60, 0x03, 0x7f, - 0x7f, 0x7f, 0x01, 0x7f, 0x02, 0x9e, 0x01, 0x05, 0x03, 0x65, 0x6e, 0x76, - 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x02, 0x03, 0x65, - 0x6e, 0x76, 0x19, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x01, 0x70, 0x00, 0x01, 0x16, 0x77, 0x61, 0x73, - 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, - 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x08, 0x61, 0x72, 0x67, 0x73, - 0x5f, 0x67, 0x65, 0x74, 0x00, 0x00, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, - 0x76, 0x69, 0x65, 0x77, 0x31, 0x0e, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x00, 0x00, 0x16, 0x77, - 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x09, 0x70, 0x72, - 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x00, 0x01, 0x03, 0x2a, 0x29, - 0x02, 0x00, 0x02, 0x02, 0x01, 0x03, 0x01, 0x00, 0x00, 0x01, 0x04, 0x00, - 0x00, 0x01, 0x02, 0x02, 0x05, 0x05, 0x03, 0x03, 0x05, 0x05, 0x00, 0x03, - 0x00, 0x03, 0x05, 0x03, 0x05, 0x03, 0x03, 0x03, 0x03, 0x05, 0x05, 0x05, - 0x03, 0x03, 0x00, 0x03, 0x03, 0x06, 0x0d, 0x02, 0x7f, 0x01, 0x41, 0x80, - 0x80, 0x04, 0x0b, 0x7f, 0x00, 0x41, 0x00, 0x0b, 0x07, 0xad, 0x02, 0x1c, - 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c, - 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x00, 0x03, 0x0f, 0x5f, 0x5f, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x03, 0x00, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x06, 0x0a, - 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x00, 0x07, - 0x06, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x00, 0x08, 0x04, 0x66, 0x72, - 0x65, 0x65, 0x00, 0x09, 0x06, 0x63, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x00, - 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x73, 0x65, 0x74, 0x00, 0x14, 0x07, 0x72, - 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x00, 0x0b, 0x06, 0x6d, 0x65, 0x6d, - 0x63, 0x70, 0x79, 0x00, 0x13, 0x06, 0x73, 0x74, 0x72, 0x6c, 0x65, 0x6e, - 0x00, 0x15, 0x08, 0x69, 0x73, 0x77, 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x00, - 0x2b, 0x08, 0x69, 0x73, 0x77, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x00, 0x16, - 0x08, 0x69, 0x73, 0x77, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x00, 0x22, 0x08, - 0x69, 0x73, 0x77, 0x64, 0x69, 0x67, 0x69, 0x74, 0x00, 0x23, 0x08, 0x69, - 0x73, 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x00, 0x20, 0x08, 0x69, 0x73, - 0x77, 0x73, 0x70, 0x61, 0x63, 0x65, 0x00, 0x2a, 0x08, 0x69, 0x73, 0x77, - 0x75, 0x70, 0x70, 0x65, 0x72, 0x00, 0x1e, 0x09, 0x69, 0x73, 0x77, 0x78, - 0x64, 0x69, 0x67, 0x69, 0x74, 0x00, 0x27, 0x08, 0x74, 0x6f, 0x77, 0x6c, - 0x6f, 0x77, 0x65, 0x72, 0x00, 0x1a, 0x08, 0x74, 0x6f, 0x77, 0x75, 0x70, - 0x70, 0x65, 0x72, 0x00, 0x1c, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x68, 0x72, - 0x00, 0x18, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x6d, 0x70, 0x00, 0x17, 0x07, - 0x6d, 0x65, 0x6d, 0x6d, 0x6f, 0x76, 0x65, 0x00, 0x1f, 0x06, 0x73, 0x74, - 0x72, 0x63, 0x6d, 0x70, 0x00, 0x19, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, - 0x61, 0x74, 0x00, 0x24, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x6d, 0x70, - 0x00, 0x1d, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x70, 0x79, 0x00, 0x26, - 0x08, 0x01, 0x05, 0x0a, 0x8c, 0x2f, 0x29, 0x02, 0x00, 0x0b, 0x03, 0x00, - 0x00, 0x0b, 0x0d, 0x00, 0x41, 0xe8, 0xc2, 0x04, 0x41, 0x00, 0x41, 0x14, - 0xfc, 0x0b, 0x00, 0x0b, 0x51, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x02, 0x40, - 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xe8, 0xc2, 0x84, 0x80, 0x00, - 0x6a, 0x28, 0x02, 0x00, 0x0d, 0x00, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, - 0x41, 0xe8, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x41, 0x01, 0x36, 0x02, 0x00, - 0x10, 0x83, 0x80, 0x80, 0x80, 0x00, 0x10, 0x8d, 0x80, 0x80, 0x80, 0x00, - 0x21, 0x00, 0x10, 0x92, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x0d, 0x01, - 0x0f, 0x0b, 0x00, 0x0b, 0x20, 0x00, 0x10, 0x90, 0x80, 0x80, 0x80, 0x00, - 0x00, 0x0b, 0x49, 0x01, 0x01, 0x7f, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, - 0x22, 0x01, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x00, 0x36, - 0x02, 0x00, 0x20, 0x01, 0x41, 0xec, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, + 0x02, 0x7c, 0x04, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x31, 0x08, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x00, + 0x02, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, + 0x0e, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, + 0x67, 0x65, 0x74, 0x00, 0x02, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x31, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, + 0x69, 0x74, 0x00, 0x03, 0x03, 0x65, 0x6e, 0x76, 0x06, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x02, 0x00, 0x02, 0x03, 0x1f, 0x1e, 0x04, 0x04, 0x04, + 0x03, 0x00, 0x03, 0x02, 0x02, 0x03, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, + 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x06, 0x08, 0x01, 0x7f, 0x01, 0x41, 0x80, 0x80, 0x04, + 0x0b, 0x07, 0xad, 0x02, 0x1c, 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, + 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x00, + 0x03, 0x0f, 0x5f, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x03, 0x00, 0x06, 0x5f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x00, 0x05, 0x0a, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x68, + 0x65, 0x61, 0x70, 0x00, 0x06, 0x06, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, + 0x00, 0x07, 0x04, 0x66, 0x72, 0x65, 0x65, 0x00, 0x08, 0x06, 0x63, 0x61, + 0x6c, 0x6c, 0x6f, 0x63, 0x00, 0x09, 0x06, 0x6d, 0x65, 0x6d, 0x73, 0x65, + 0x74, 0x00, 0x0d, 0x07, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x00, + 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x70, 0x79, 0x00, 0x0c, 0x06, 0x73, + 0x74, 0x72, 0x6c, 0x65, 0x6e, 0x00, 0x0e, 0x08, 0x69, 0x73, 0x77, 0x61, + 0x6c, 0x6e, 0x75, 0x6d, 0x00, 0x20, 0x08, 0x69, 0x73, 0x77, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x00, 0x0f, 0x08, 0x69, 0x73, 0x77, 0x62, 0x6c, 0x61, + 0x6e, 0x6b, 0x00, 0x1a, 0x08, 0x69, 0x73, 0x77, 0x64, 0x69, 0x67, 0x69, + 0x74, 0x00, 0x1b, 0x08, 0x69, 0x73, 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, + 0x00, 0x19, 0x08, 0x69, 0x73, 0x77, 0x73, 0x70, 0x61, 0x63, 0x65, 0x00, + 0x1f, 0x08, 0x69, 0x73, 0x77, 0x75, 0x70, 0x70, 0x65, 0x72, 0x00, 0x17, + 0x09, 0x69, 0x73, 0x77, 0x78, 0x64, 0x69, 0x67, 0x69, 0x74, 0x00, 0x1e, + 0x08, 0x74, 0x6f, 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x00, 0x13, 0x08, + 0x74, 0x6f, 0x77, 0x75, 0x70, 0x70, 0x65, 0x72, 0x00, 0x15, 0x06, 0x6d, + 0x65, 0x6d, 0x63, 0x68, 0x72, 0x00, 0x11, 0x06, 0x6d, 0x65, 0x6d, 0x63, + 0x6d, 0x70, 0x00, 0x10, 0x07, 0x6d, 0x65, 0x6d, 0x6d, 0x6f, 0x76, 0x65, + 0x00, 0x18, 0x06, 0x73, 0x74, 0x72, 0x63, 0x6d, 0x70, 0x00, 0x12, 0x07, + 0x73, 0x74, 0x72, 0x6e, 0x63, 0x61, 0x74, 0x00, 0x1c, 0x07, 0x73, 0x74, + 0x72, 0x6e, 0x63, 0x6d, 0x70, 0x00, 0x16, 0x07, 0x73, 0x74, 0x72, 0x6e, + 0x63, 0x70, 0x79, 0x00, 0x1d, 0x08, 0x01, 0x04, 0x0c, 0x01, 0x01, 0x0a, + 0x8b, 0x28, 0x1e, 0x02, 0x00, 0x0b, 0x0d, 0x00, 0x41, 0xe8, 0xc2, 0x04, + 0x41, 0x00, 0x41, 0x14, 0xfc, 0x0b, 0x00, 0x0b, 0xa4, 0x01, 0x01, 0x03, + 0x7f, 0x41, 0xe8, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x45, 0x04, 0x40, 0x41, + 0xe8, 0xc2, 0x04, 0x41, 0x01, 0x36, 0x02, 0x00, 0x23, 0x00, 0x41, 0x10, + 0x6b, 0x22, 0x00, 0x24, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x00, 0x41, 0x08, 0x6a, 0x20, 0x00, 0x41, 0x0c, 0x6a, 0x10, + 0x01, 0x41, 0xff, 0xff, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x00, 0x28, + 0x02, 0x08, 0x41, 0x01, 0x6a, 0x22, 0x01, 0x45, 0x0d, 0x01, 0x20, 0x00, + 0x28, 0x02, 0x0c, 0x10, 0x07, 0x22, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x01, + 0x41, 0x04, 0x10, 0x09, 0x22, 0x01, 0x45, 0x0d, 0x03, 0x20, 0x01, 0x20, + 0x02, 0x10, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0d, 0x04, 0x20, 0x00, + 0x28, 0x02, 0x08, 0x00, 0x0b, 0x41, 0xc7, 0x00, 0x10, 0x0b, 0x00, 0x0b, + 0x41, 0xc6, 0x00, 0x10, 0x0b, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x0b, + 0x00, 0x0b, 0x20, 0x02, 0x10, 0x08, 0x41, 0xc6, 0x00, 0x10, 0x0b, 0x00, + 0x0b, 0x20, 0x02, 0x10, 0x08, 0x20, 0x01, 0x10, 0x08, 0x41, 0xc7, 0x00, + 0x10, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x35, 0x01, 0x01, 0x7f, 0x41, 0xf0, + 0xc2, 0x04, 0x20, 0x00, 0x36, 0x02, 0x00, 0x41, 0xec, 0xc2, 0x04, 0x20, 0x00, 0x36, 0x02, 0x00, 0x3f, 0x00, 0x21, 0x00, 0x20, 0x01, 0x41, 0xf8, - 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x41, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, - 0x41, 0xf4, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x00, 0x41, 0x10, 0x74, - 0x36, 0x02, 0x00, 0x0b, 0xa8, 0x02, 0x01, 0x03, 0x7f, 0x02, 0x40, 0x23, - 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf8, 0xc2, 0x84, 0x80, 0x00, 0x6a, - 0x28, 0x02, 0x00, 0x22, 0x01, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x02, - 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x00, 0x20, 0x00, 0x49, - 0x0d, 0x00, 0x20, 0x01, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x03, 0x40, 0x20, - 0x01, 0x28, 0x02, 0x04, 0x22, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x01, 0x21, - 0x02, 0x20, 0x03, 0x21, 0x01, 0x20, 0x03, 0x28, 0x02, 0x00, 0x20, 0x00, - 0x49, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x23, 0x81, - 0x80, 0x80, 0x80, 0x00, 0x41, 0xf8, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, - 0x02, 0x1b, 0x20, 0x03, 0x28, 0x02, 0x04, 0x36, 0x02, 0x00, 0x20, 0x03, - 0x41, 0x08, 0x6a, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x23, 0x81, 0x80, - 0x80, 0x80, 0x00, 0x22, 0x01, 0x41, 0xf4, 0xc2, 0x84, 0x80, 0x00, 0x6a, - 0x28, 0x02, 0x00, 0x20, 0x01, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, - 0x28, 0x02, 0x00, 0x22, 0x01, 0x20, 0x00, 0x6a, 0x41, 0x0b, 0x6a, 0x41, - 0x7c, 0x71, 0x22, 0x03, 0x4f, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x01, 0x20, - 0x03, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xec, 0xc2, 0x84, 0x80, - 0x00, 0x6a, 0x28, 0x02, 0x00, 0x6b, 0x41, 0x80, 0x80, 0x80, 0x02, 0x4a, - 0x0d, 0x01, 0x20, 0x00, 0x41, 0x7f, 0x6a, 0x41, 0x10, 0x76, 0x41, 0x01, - 0x6a, 0x40, 0x00, 0x41, 0x7f, 0x46, 0x0d, 0x01, 0x3f, 0x00, 0x21, 0x01, - 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x41, 0xf4, 0xc2, 0x84, - 0x80, 0x00, 0x6a, 0x20, 0x01, 0x41, 0x10, 0x74, 0x36, 0x02, 0x00, 0x20, - 0x02, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x21, - 0x01, 0x0b, 0x20, 0x01, 0x20, 0x00, 0x36, 0x02, 0x00, 0x23, 0x81, 0x80, - 0x80, 0x80, 0x00, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x03, - 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, 0x0b, 0x20, - 0x01, 0x0b, 0x5c, 0x01, 0x03, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, - 0x00, 0x20, 0x00, 0x41, 0x78, 0x6a, 0x22, 0x01, 0x28, 0x02, 0x00, 0x21, - 0x02, 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf0, 0xc2, - 0x84, 0x80, 0x00, 0x6a, 0x22, 0x03, 0x28, 0x02, 0x00, 0x20, 0x00, 0x20, - 0x02, 0x6a, 0x41, 0x03, 0x6a, 0x41, 0x7c, 0x71, 0x46, 0x0d, 0x00, 0x20, - 0x00, 0x41, 0x7c, 0x6a, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf8, - 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x22, 0x03, 0x28, 0x02, 0x00, 0x36, 0x02, - 0x00, 0x0b, 0x20, 0x03, 0x20, 0x01, 0x36, 0x02, 0x00, 0x0b, 0x0b, 0x19, - 0x00, 0x20, 0x01, 0x20, 0x00, 0x6c, 0x22, 0x00, 0x10, 0x88, 0x80, 0x80, - 0x80, 0x00, 0x41, 0x00, 0x20, 0x00, 0x10, 0x94, 0x80, 0x80, 0x80, 0x00, - 0x0b, 0x6b, 0x01, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, 0x00, - 0x20, 0x00, 0x41, 0x78, 0x6a, 0x22, 0x02, 0x28, 0x02, 0x00, 0x21, 0x03, - 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf0, 0xc2, 0x84, - 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x20, 0x00, 0x20, 0x03, 0x6a, 0x41, - 0x03, 0x6a, 0x41, 0x7c, 0x71, 0x47, 0x0d, 0x00, 0x23, 0x81, 0x80, 0x80, - 0x80, 0x00, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x02, 0x36, - 0x02, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x01, 0x10, 0x88, 0x80, 0x80, 0x80, - 0x00, 0x20, 0x00, 0x20, 0x02, 0x28, 0x02, 0x00, 0x10, 0x93, 0x80, 0x80, - 0x80, 0x00, 0x0f, 0x0b, 0x20, 0x01, 0x10, 0x88, 0x80, 0x80, 0x80, 0x00, - 0x0b, 0x0b, 0x00, 0x20, 0x00, 0x10, 0x90, 0x80, 0x80, 0x80, 0x00, 0x00, - 0x0b, 0xd5, 0x01, 0x01, 0x03, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, - 0x41, 0x10, 0x6b, 0x22, 0x00, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, - 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, - 0x08, 0x6a, 0x20, 0x00, 0x41, 0x0c, 0x6a, 0x10, 0x8f, 0x80, 0x80, 0x80, - 0x00, 0x0d, 0x00, 0x20, 0x00, 0x28, 0x02, 0x08, 0x41, 0x01, 0x6a, 0x22, - 0x01, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x28, 0x02, 0x0c, 0x10, 0x88, 0x80, - 0x80, 0x80, 0x00, 0x22, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x01, 0x41, 0x04, - 0x10, 0x8a, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x45, 0x0d, 0x03, 0x20, - 0x01, 0x20, 0x02, 0x10, 0x8e, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x04, 0x20, - 0x00, 0x28, 0x02, 0x08, 0x20, 0x01, 0x10, 0x84, 0x80, 0x80, 0x80, 0x00, - 0x21, 0x01, 0x20, 0x00, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, - 0x00, 0x20, 0x01, 0x0f, 0x0b, 0x41, 0xc7, 0x00, 0x10, 0x8c, 0x80, 0x80, - 0x80, 0x00, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, - 0x00, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, 0x00, - 0x00, 0x0b, 0x20, 0x02, 0x10, 0x89, 0x80, 0x80, 0x80, 0x00, 0x41, 0xc6, - 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x20, 0x02, 0x10, - 0x89, 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x10, 0x89, 0x80, 0x80, 0x80, - 0x00, 0x41, 0xc7, 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, - 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x80, 0x80, 0x80, 0x80, 0x00, - 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, - 0x10, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, - 0x0b, 0x00, 0x20, 0x00, 0x10, 0x82, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, - 0x02, 0x00, 0x0b, 0x0e, 0x00, 0x10, 0x91, 0x80, 0x80, 0x80, 0x00, 0x10, - 0x91, 0x80, 0x80, 0x80, 0x00, 0x0b, 0xd4, 0x08, 0x01, 0x04, 0x7f, 0x02, - 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x20, 0x4b, 0x0d, 0x00, - 0x20, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x02, 0x45, 0x0d, - 0x01, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, - 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, - 0x04, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, - 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x41, 0x01, 0x6a, - 0x20, 0x01, 0x41, 0x01, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, - 0x02, 0x41, 0x7e, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x21, - 0x04, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, - 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x41, 0x02, 0x6a, - 0x20, 0x01, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, - 0x02, 0x41, 0x7d, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x21, - 0x04, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, - 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x41, 0x03, 0x6a, - 0x20, 0x01, 0x41, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, - 0x02, 0x41, 0x7c, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, - 0x04, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x05, 0x0c, 0x02, 0x0b, 0x20, - 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x20, 0x00, 0x0f, - 0x0b, 0x20, 0x02, 0x21, 0x03, 0x20, 0x00, 0x21, 0x04, 0x20, 0x01, 0x21, - 0x05, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x22, - 0x02, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x10, 0x4f, - 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, - 0x03, 0x41, 0x70, 0x6a, 0x22, 0x02, 0x41, 0x10, 0x71, 0x0d, 0x00, 0x20, - 0x04, 0x20, 0x05, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, - 0x08, 0x6a, 0x20, 0x05, 0x41, 0x08, 0x6a, 0x29, 0x02, 0x00, 0x37, 0x02, - 0x00, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x10, - 0x6a, 0x21, 0x05, 0x20, 0x02, 0x21, 0x03, 0x0b, 0x20, 0x02, 0x41, 0x10, - 0x49, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x03, 0x40, 0x20, 0x04, 0x20, - 0x05, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, 0x08, 0x6a, - 0x20, 0x05, 0x41, 0x08, 0x6a, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, - 0x04, 0x41, 0x10, 0x6a, 0x20, 0x05, 0x41, 0x10, 0x6a, 0x29, 0x02, 0x00, - 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, 0x18, 0x6a, 0x20, 0x05, 0x41, 0x18, - 0x6a, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, 0x20, 0x6a, - 0x21, 0x04, 0x20, 0x05, 0x41, 0x20, 0x6a, 0x21, 0x05, 0x20, 0x02, 0x41, - 0x60, 0x6a, 0x22, 0x02, 0x41, 0x0f, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x02, - 0x40, 0x20, 0x02, 0x41, 0x08, 0x49, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, - 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x05, 0x41, 0x08, 0x6a, 0x21, - 0x05, 0x20, 0x04, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0b, 0x02, 0x40, 0x20, - 0x02, 0x41, 0x04, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, 0x28, - 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x05, 0x41, 0x04, 0x6a, 0x21, 0x05, - 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x0b, 0x02, 0x40, 0x20, 0x02, - 0x41, 0x02, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, 0x2f, 0x00, - 0x00, 0x3b, 0x00, 0x00, 0x20, 0x04, 0x41, 0x02, 0x6a, 0x21, 0x04, 0x20, - 0x05, 0x41, 0x02, 0x6a, 0x21, 0x05, 0x0b, 0x20, 0x02, 0x41, 0x01, 0x71, - 0x45, 0x0d, 0x01, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x00, 0x3a, 0x00, - 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, - 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x20, 0x49, 0x0d, 0x00, 0x20, 0x04, - 0x20, 0x05, 0x28, 0x02, 0x00, 0x22, 0x03, 0x3a, 0x00, 0x00, 0x02, 0x40, - 0x02, 0x40, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x0e, 0x03, 0x03, 0x00, 0x01, - 0x03, 0x0b, 0x20, 0x04, 0x41, 0x01, 0x6a, 0x20, 0x03, 0x41, 0x08, 0x76, - 0x3a, 0x00, 0x00, 0x20, 0x04, 0x41, 0x06, 0x6a, 0x20, 0x05, 0x41, 0x06, - 0x6a, 0x29, 0x01, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, 0x02, 0x6a, - 0x20, 0x05, 0x41, 0x04, 0x6a, 0x28, 0x02, 0x00, 0x41, 0x10, 0x74, 0x20, - 0x03, 0x41, 0x10, 0x76, 0x72, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0x12, - 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, 0x12, 0x6a, 0x21, 0x01, 0x41, 0x0e, - 0x21, 0x06, 0x20, 0x05, 0x41, 0x0e, 0x6a, 0x28, 0x01, 0x00, 0x21, 0x05, - 0x41, 0x0e, 0x21, 0x03, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x41, 0x05, 0x6a, - 0x20, 0x05, 0x41, 0x05, 0x6a, 0x29, 0x00, 0x00, 0x37, 0x02, 0x00, 0x20, - 0x04, 0x41, 0x01, 0x6a, 0x20, 0x05, 0x41, 0x04, 0x6a, 0x28, 0x02, 0x00, - 0x41, 0x18, 0x74, 0x20, 0x03, 0x41, 0x08, 0x76, 0x72, 0x36, 0x02, 0x00, - 0x20, 0x04, 0x41, 0x11, 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, 0x11, 0x6a, - 0x21, 0x01, 0x41, 0x0d, 0x21, 0x06, 0x20, 0x05, 0x41, 0x0d, 0x6a, 0x28, - 0x00, 0x00, 0x21, 0x05, 0x41, 0x0f, 0x21, 0x03, 0x0c, 0x02, 0x0b, 0x02, - 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x10, 0x4f, 0x0d, 0x00, 0x20, 0x04, - 0x21, 0x02, 0x20, 0x05, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x20, - 0x05, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x41, 0x01, 0x6a, - 0x20, 0x05, 0x41, 0x01, 0x6a, 0x28, 0x00, 0x00, 0x36, 0x00, 0x00, 0x20, - 0x04, 0x41, 0x05, 0x6a, 0x20, 0x05, 0x41, 0x05, 0x6a, 0x29, 0x00, 0x00, - 0x37, 0x00, 0x00, 0x20, 0x04, 0x41, 0x0d, 0x6a, 0x20, 0x05, 0x41, 0x0d, - 0x6a, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x04, 0x41, 0x0f, 0x6a, - 0x20, 0x05, 0x41, 0x0f, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, - 0x04, 0x41, 0x10, 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, 0x10, 0x6a, 0x21, - 0x01, 0x0b, 0x20, 0x03, 0x41, 0x08, 0x71, 0x0d, 0x02, 0x0c, 0x03, 0x0b, - 0x20, 0x04, 0x41, 0x02, 0x6a, 0x20, 0x03, 0x41, 0x10, 0x76, 0x3a, 0x00, - 0x00, 0x20, 0x04, 0x41, 0x01, 0x6a, 0x20, 0x03, 0x41, 0x08, 0x76, 0x3a, - 0x00, 0x00, 0x20, 0x04, 0x41, 0x07, 0x6a, 0x20, 0x05, 0x41, 0x07, 0x6a, - 0x29, 0x00, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, 0x03, 0x6a, 0x20, - 0x05, 0x41, 0x04, 0x6a, 0x28, 0x02, 0x00, 0x41, 0x08, 0x74, 0x20, 0x03, - 0x41, 0x18, 0x76, 0x72, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0x13, 0x6a, - 0x21, 0x02, 0x20, 0x05, 0x41, 0x13, 0x6a, 0x21, 0x01, 0x41, 0x0f, 0x21, - 0x06, 0x20, 0x05, 0x41, 0x0f, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x05, 0x41, - 0x0d, 0x21, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x06, 0x6a, 0x20, 0x05, 0x36, - 0x02, 0x00, 0x0b, 0x20, 0x02, 0x20, 0x01, 0x29, 0x00, 0x00, 0x37, 0x00, - 0x00, 0x20, 0x02, 0x41, 0x08, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x08, - 0x6a, 0x21, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x04, 0x71, 0x45, - 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, 0x28, 0x00, 0x00, 0x36, 0x00, 0x00, + 0xc2, 0x04, 0x6a, 0x41, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0xf4, + 0xc2, 0x04, 0x6a, 0x20, 0x00, 0x41, 0x10, 0x74, 0x36, 0x02, 0x00, 0x0b, + 0xd7, 0x01, 0x01, 0x04, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, 0x00, + 0x02, 0x40, 0x41, 0xf8, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x22, 0x01, 0x45, + 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x20, 0x01, 0x28, 0x02, 0x00, 0x4d, + 0x04, 0x40, 0x20, 0x01, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x03, 0x40, 0x20, + 0x01, 0x28, 0x02, 0x04, 0x22, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x01, 0x21, + 0x03, 0x20, 0x02, 0x22, 0x01, 0x28, 0x02, 0x00, 0x20, 0x00, 0x49, 0x0d, + 0x00, 0x0b, 0x0b, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x41, 0xf8, 0xc2, 0x04, + 0x20, 0x03, 0x1b, 0x20, 0x02, 0x28, 0x02, 0x04, 0x36, 0x02, 0x00, 0x20, + 0x02, 0x41, 0x08, 0x6a, 0x0f, 0x0b, 0x41, 0xf0, 0xc2, 0x04, 0x28, 0x02, + 0x00, 0x22, 0x01, 0x20, 0x00, 0x6a, 0x41, 0x0b, 0x6a, 0x41, 0x7c, 0x71, + 0x22, 0x02, 0x41, 0xf4, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x4b, 0x04, 0x40, + 0x20, 0x02, 0x41, 0xec, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x6b, 0x41, 0x80, + 0x80, 0x80, 0x02, 0x4a, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6b, 0x41, + 0x10, 0x76, 0x41, 0x01, 0x6a, 0x40, 0x00, 0x41, 0x7f, 0x46, 0x0d, 0x01, + 0x41, 0xf4, 0xc2, 0x04, 0x3f, 0x00, 0x41, 0x10, 0x74, 0x36, 0x02, 0x00, + 0x41, 0xf0, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x21, 0x01, 0x0b, 0x20, 0x01, + 0x20, 0x00, 0x36, 0x02, 0x00, 0x41, 0xf0, 0xc2, 0x04, 0x20, 0x02, 0x36, + 0x02, 0x00, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0b, 0x20, 0x04, + 0x0b, 0x41, 0x01, 0x02, 0x7f, 0x20, 0x00, 0x04, 0x40, 0x41, 0xf0, 0xc2, + 0x04, 0x22, 0x01, 0x28, 0x02, 0x00, 0x20, 0x00, 0x41, 0x08, 0x6b, 0x22, + 0x02, 0x28, 0x02, 0x00, 0x20, 0x00, 0x6a, 0x41, 0x03, 0x6a, 0x41, 0x7c, + 0x71, 0x47, 0x04, 0x40, 0x20, 0x00, 0x41, 0x04, 0x6b, 0x41, 0xf8, 0xc2, + 0x04, 0x22, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x0b, 0x20, 0x01, + 0x20, 0x02, 0x36, 0x02, 0x00, 0x0b, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x6c, 0x22, 0x00, 0x10, 0x07, 0x41, 0x00, 0x20, 0x00, 0x10, 0x0d, + 0x0b, 0x47, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, 0x00, + 0x41, 0xf0, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x20, 0x00, 0x41, 0x08, 0x6b, + 0x22, 0x02, 0x28, 0x02, 0x00, 0x20, 0x00, 0x6a, 0x41, 0x03, 0x6a, 0x41, + 0x7c, 0x71, 0x46, 0x04, 0x40, 0x41, 0xf0, 0xc2, 0x04, 0x20, 0x02, 0x36, + 0x02, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x01, 0x10, 0x07, 0x20, 0x00, 0x20, + 0x02, 0x28, 0x02, 0x00, 0x10, 0x0c, 0x0f, 0x0b, 0x20, 0x01, 0x10, 0x07, + 0x0b, 0x07, 0x00, 0x20, 0x00, 0x10, 0x02, 0x00, 0x0b, 0xbe, 0x07, 0x01, + 0x04, 0x7f, 0x02, 0x40, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x02, 0x41, 0x20, + 0x4d, 0x04, 0x40, 0x20, 0x01, 0x41, 0x03, 0x71, 0x45, 0x20, 0x02, 0x45, + 0x72, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, + 0x00, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x22, + 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x22, 0x05, + 0x45, 0x72, 0x0d, 0x02, 0x1a, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x01, + 0x3a, 0x00, 0x01, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x20, 0x01, 0x41, 0x02, + 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x02, 0x41, 0x02, 0x6b, + 0x22, 0x05, 0x45, 0x72, 0x0d, 0x02, 0x1a, 0x20, 0x00, 0x20, 0x01, 0x2d, + 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x20, 0x01, + 0x41, 0x03, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x02, 0x41, + 0x03, 0x6b, 0x22, 0x05, 0x45, 0x72, 0x0d, 0x02, 0x1a, 0x20, 0x00, 0x20, + 0x01, 0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x02, 0x41, 0x04, 0x6b, + 0x21, 0x05, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, + 0x04, 0x6a, 0x0c, 0x02, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, + 0x0a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x21, 0x05, 0x20, + 0x01, 0x21, 0x03, 0x20, 0x00, 0x0b, 0x22, 0x04, 0x41, 0x03, 0x71, 0x22, + 0x02, 0x45, 0x04, 0x40, 0x02, 0x40, 0x20, 0x05, 0x41, 0x10, 0x49, 0x04, + 0x40, 0x20, 0x05, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x10, + 0x6b, 0x22, 0x02, 0x41, 0x10, 0x71, 0x45, 0x04, 0x40, 0x20, 0x04, 0x20, + 0x03, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x20, 0x03, 0x29, + 0x02, 0x08, 0x37, 0x02, 0x08, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, 0x04, + 0x20, 0x03, 0x41, 0x10, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x21, 0x05, 0x0b, + 0x20, 0x02, 0x41, 0x10, 0x49, 0x0d, 0x00, 0x20, 0x05, 0x21, 0x02, 0x03, + 0x40, 0x20, 0x04, 0x20, 0x03, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, + 0x04, 0x20, 0x03, 0x29, 0x02, 0x08, 0x37, 0x02, 0x08, 0x20, 0x04, 0x20, + 0x03, 0x29, 0x02, 0x10, 0x37, 0x02, 0x10, 0x20, 0x04, 0x20, 0x03, 0x29, + 0x02, 0x18, 0x37, 0x02, 0x18, 0x20, 0x04, 0x41, 0x20, 0x6a, 0x21, 0x04, + 0x20, 0x03, 0x41, 0x20, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x20, 0x6b, + 0x22, 0x02, 0x41, 0x0f, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x41, + 0x08, 0x4f, 0x04, 0x40, 0x20, 0x04, 0x20, 0x03, 0x29, 0x02, 0x00, 0x37, + 0x02, 0x00, 0x20, 0x04, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x41, + 0x08, 0x6a, 0x21, 0x03, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x71, 0x04, 0x40, + 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x04, + 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, + 0x0b, 0x20, 0x02, 0x41, 0x02, 0x71, 0x04, 0x40, 0x20, 0x04, 0x20, 0x03, + 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x04, 0x41, 0x02, 0x6a, 0x21, + 0x04, 0x20, 0x03, 0x41, 0x02, 0x6a, 0x21, 0x03, 0x0b, 0x20, 0x02, 0x41, + 0x01, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x20, 0x03, 0x2d, 0x00, 0x00, + 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x7f, 0x02, 0x40, 0x20, 0x05, 0x41, 0x20, 0x4f, 0x04, 0x40, 0x20, 0x04, + 0x20, 0x03, 0x28, 0x02, 0x00, 0x22, 0x01, 0x3a, 0x00, 0x00, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x02, 0x41, 0x02, 0x6b, 0x0e, 0x02, 0x00, 0x01, 0x03, + 0x0b, 0x20, 0x04, 0x20, 0x01, 0x41, 0x08, 0x76, 0x3a, 0x00, 0x01, 0x20, + 0x04, 0x20, 0x03, 0x41, 0x06, 0x6a, 0x29, 0x01, 0x00, 0x37, 0x02, 0x06, + 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x04, 0x41, 0x10, 0x74, 0x20, 0x01, + 0x41, 0x10, 0x76, 0x72, 0x36, 0x02, 0x02, 0x20, 0x03, 0x41, 0x12, 0x6a, + 0x21, 0x01, 0x41, 0x0e, 0x21, 0x06, 0x20, 0x03, 0x41, 0x0e, 0x6a, 0x28, + 0x01, 0x00, 0x21, 0x03, 0x41, 0x0e, 0x21, 0x05, 0x20, 0x04, 0x41, 0x12, + 0x6a, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x03, 0x41, 0x05, 0x6a, 0x29, + 0x00, 0x00, 0x37, 0x02, 0x05, 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x04, + 0x41, 0x18, 0x74, 0x20, 0x01, 0x41, 0x08, 0x76, 0x72, 0x36, 0x02, 0x01, + 0x20, 0x03, 0x41, 0x11, 0x6a, 0x21, 0x01, 0x41, 0x0d, 0x21, 0x06, 0x20, + 0x03, 0x41, 0x0d, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x03, 0x41, 0x0f, 0x21, + 0x05, 0x20, 0x04, 0x41, 0x11, 0x6a, 0x0c, 0x02, 0x0b, 0x02, 0x7f, 0x20, + 0x05, 0x41, 0x10, 0x49, 0x04, 0x40, 0x20, 0x04, 0x21, 0x02, 0x20, 0x03, + 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x3a, 0x00, + 0x00, 0x20, 0x04, 0x20, 0x03, 0x28, 0x00, 0x01, 0x36, 0x00, 0x01, 0x20, + 0x04, 0x20, 0x03, 0x29, 0x00, 0x05, 0x37, 0x00, 0x05, 0x20, 0x04, 0x20, + 0x03, 0x2f, 0x00, 0x0d, 0x3b, 0x00, 0x0d, 0x20, 0x04, 0x20, 0x03, 0x2d, + 0x00, 0x0f, 0x3a, 0x00, 0x0f, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, 0x02, + 0x20, 0x03, 0x41, 0x10, 0x6a, 0x0b, 0x21, 0x01, 0x20, 0x05, 0x41, 0x08, + 0x71, 0x0d, 0x02, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x01, 0x41, 0x10, + 0x76, 0x3a, 0x00, 0x02, 0x20, 0x04, 0x20, 0x01, 0x41, 0x08, 0x76, 0x3a, + 0x00, 0x01, 0x20, 0x04, 0x20, 0x03, 0x41, 0x07, 0x6a, 0x29, 0x00, 0x00, + 0x37, 0x02, 0x07, 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x04, 0x41, 0x08, + 0x74, 0x20, 0x01, 0x41, 0x18, 0x76, 0x72, 0x36, 0x02, 0x03, 0x20, 0x03, + 0x41, 0x13, 0x6a, 0x21, 0x01, 0x41, 0x0f, 0x21, 0x06, 0x20, 0x03, 0x41, + 0x0f, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x03, 0x41, 0x0d, 0x21, 0x05, 0x20, + 0x04, 0x41, 0x13, 0x6a, 0x0b, 0x21, 0x02, 0x20, 0x04, 0x20, 0x06, 0x6a, + 0x20, 0x03, 0x36, 0x02, 0x00, 0x0b, 0x20, 0x02, 0x20, 0x01, 0x29, 0x00, + 0x00, 0x37, 0x00, 0x00, 0x20, 0x02, 0x41, 0x08, 0x6a, 0x21, 0x02, 0x20, + 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x04, 0x71, + 0x04, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x00, 0x00, 0x36, 0x00, 0x00, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x04, 0x6a, - 0x21, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x02, 0x71, 0x45, 0x0d, - 0x00, 0x20, 0x02, 0x20, 0x01, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, - 0x02, 0x41, 0x02, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x21, - 0x01, 0x0b, 0x20, 0x03, 0x41, 0x01, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, - 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x0b, 0x20, 0x00, 0x0b, - 0xac, 0x03, 0x02, 0x03, 0x7f, 0x01, 0x7e, 0x02, 0x40, 0x20, 0x02, 0x41, - 0x21, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0b, - 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, - 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x20, 0x02, 0x6a, - 0x22, 0x03, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, - 0x41, 0x03, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x20, 0x01, - 0x3a, 0x00, 0x00, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x20, 0x01, 0x3a, 0x00, - 0x00, 0x20, 0x03, 0x41, 0x7d, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, - 0x03, 0x41, 0x7e, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, - 0x07, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x20, 0x01, 0x3a, - 0x00, 0x00, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, - 0x20, 0x02, 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x20, - 0x00, 0x6b, 0x41, 0x03, 0x71, 0x22, 0x04, 0x6a, 0x22, 0x05, 0x20, 0x01, - 0x41, 0xff, 0x01, 0x71, 0x41, 0x81, 0x82, 0x84, 0x08, 0x6c, 0x22, 0x03, - 0x36, 0x02, 0x00, 0x20, 0x05, 0x20, 0x02, 0x20, 0x04, 0x6b, 0x41, 0x3c, - 0x71, 0x22, 0x01, 0x6a, 0x22, 0x02, 0x41, 0x7c, 0x6a, 0x20, 0x03, 0x36, - 0x02, 0x00, 0x20, 0x01, 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x05, 0x41, - 0x08, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x05, 0x41, 0x04, 0x6a, - 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x78, 0x6a, 0x20, 0x03, - 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x74, 0x6a, 0x20, 0x03, 0x36, 0x02, - 0x00, 0x20, 0x01, 0x41, 0x19, 0x49, 0x0d, 0x00, 0x20, 0x05, 0x41, 0x18, - 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x05, 0x41, 0x14, 0x6a, 0x20, - 0x03, 0x36, 0x02, 0x00, 0x20, 0x05, 0x41, 0x10, 0x6a, 0x20, 0x03, 0x36, - 0x02, 0x00, 0x20, 0x05, 0x41, 0x0c, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, - 0x20, 0x02, 0x41, 0x70, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, - 0x41, 0x6c, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x68, - 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x64, 0x6a, 0x20, - 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x05, 0x41, 0x04, 0x71, 0x41, - 0x18, 0x72, 0x22, 0x02, 0x6b, 0x22, 0x01, 0x41, 0x20, 0x49, 0x0d, 0x00, - 0x20, 0x03, 0xad, 0x42, 0x81, 0x80, 0x80, 0x80, 0x10, 0x7e, 0x21, 0x06, - 0x20, 0x05, 0x20, 0x02, 0x6a, 0x21, 0x02, 0x03, 0x40, 0x20, 0x02, 0x20, - 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x18, 0x6a, 0x20, 0x06, 0x37, - 0x03, 0x00, 0x20, 0x02, 0x41, 0x10, 0x6a, 0x20, 0x06, 0x37, 0x03, 0x00, - 0x20, 0x02, 0x41, 0x08, 0x6a, 0x20, 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, - 0x41, 0x20, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x60, 0x6a, 0x22, 0x01, - 0x41, 0x1f, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0xcf, 0x01, - 0x01, 0x03, 0x7f, 0x20, 0x00, 0x21, 0x01, 0x02, 0x40, 0x02, 0x40, 0x20, - 0x00, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x2d, - 0x00, 0x00, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x6b, 0x0f, 0x0b, 0x20, - 0x00, 0x41, 0x01, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, - 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x02, - 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, - 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, 0x01, - 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, - 0x0d, 0x01, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, - 0x0d, 0x01, 0x0b, 0x20, 0x01, 0x41, 0x7c, 0x6a, 0x21, 0x02, 0x20, 0x01, - 0x41, 0x7b, 0x6a, 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, 0x41, 0x04, 0x6a, - 0x21, 0x01, 0x41, 0x80, 0x82, 0x84, 0x08, 0x20, 0x02, 0x41, 0x04, 0x6a, - 0x22, 0x02, 0x28, 0x02, 0x00, 0x22, 0x03, 0x6b, 0x20, 0x03, 0x72, 0x41, - 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, - 0x46, 0x0d, 0x00, 0x0b, 0x03, 0x40, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, - 0x01, 0x20, 0x02, 0x2d, 0x00, 0x00, 0x21, 0x03, 0x20, 0x02, 0x41, 0x01, - 0x6a, 0x21, 0x02, 0x20, 0x03, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x01, 0x20, - 0x00, 0x6b, 0x0b, 0x44, 0x00, 0x02, 0x40, 0x20, 0x00, 0x41, 0xff, 0xff, - 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x08, 0x76, 0x41, 0x80, 0x80, - 0x84, 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x41, 0x05, 0x74, 0x20, 0x00, - 0x41, 0x03, 0x76, 0x41, 0x1f, 0x71, 0x72, 0x41, 0x80, 0x80, 0x84, 0x80, - 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x20, 0x00, 0x41, 0x07, 0x71, 0x76, 0x41, - 0x01, 0x71, 0x0f, 0x0b, 0x20, 0x00, 0x41, 0xfe, 0xff, 0x0b, 0x49, 0x0b, - 0x49, 0x01, 0x03, 0x7f, 0x41, 0x00, 0x21, 0x03, 0x02, 0x40, 0x20, 0x02, - 0x45, 0x0d, 0x00, 0x02, 0x40, 0x03, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, - 0x22, 0x04, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x05, 0x47, 0x0d, 0x01, - 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6a, - 0x21, 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0c, - 0x02, 0x0b, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x6b, 0x21, 0x03, 0x0b, 0x20, - 0x03, 0x0b, 0xf6, 0x02, 0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, 0x00, 0x47, - 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, - 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x02, - 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, - 0x47, 0x0d, 0x00, 0x20, 0x00, 0x21, 0x04, 0x20, 0x02, 0x21, 0x05, 0x0c, - 0x03, 0x0b, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, - 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, - 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x2d, 0x00, - 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, 0x02, - 0x41, 0x7e, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x20, 0x00, - 0x41, 0x02, 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, - 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, - 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, 0x02, 0x41, 0x7d, 0x6a, 0x22, - 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, - 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, 0x0d, 0x01, - 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, - 0x0d, 0x02, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x02, 0x41, - 0x7c, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x0c, 0x01, 0x0b, - 0x20, 0x02, 0x21, 0x05, 0x20, 0x00, 0x21, 0x04, 0x0b, 0x20, 0x03, 0x45, - 0x0d, 0x01, 0x02, 0x40, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, - 0xff, 0x01, 0x71, 0x46, 0x0d, 0x00, 0x20, 0x05, 0x41, 0x04, 0x49, 0x0d, - 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x41, 0x81, 0x82, 0x84, 0x08, - 0x6c, 0x21, 0x00, 0x03, 0x40, 0x41, 0x80, 0x82, 0x84, 0x08, 0x20, 0x04, - 0x28, 0x02, 0x00, 0x20, 0x00, 0x73, 0x22, 0x02, 0x6b, 0x20, 0x02, 0x72, + 0x21, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x02, 0x71, 0x04, 0x40, 0x20, 0x02, + 0x20, 0x01, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x02, 0x41, 0x02, + 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x21, 0x01, 0x0b, 0x20, + 0x05, 0x41, 0x01, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, 0x2d, + 0x00, 0x00, 0x3a, 0x00, 0x00, 0x0b, 0x20, 0x00, 0x0b, 0x86, 0x03, 0x02, + 0x03, 0x7f, 0x01, 0x7e, 0x20, 0x02, 0x41, 0x21, 0x4f, 0x04, 0x40, 0x20, + 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0b, 0x00, 0x20, 0x00, 0x0f, 0x0b, + 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, + 0x00, 0x00, 0x20, 0x00, 0x20, 0x02, 0x6a, 0x22, 0x03, 0x41, 0x01, 0x6b, + 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x03, 0x49, 0x0d, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x02, 0x20, 0x00, 0x20, 0x01, 0x3a, + 0x00, 0x01, 0x20, 0x03, 0x41, 0x03, 0x6b, 0x20, 0x01, 0x3a, 0x00, 0x00, + 0x20, 0x03, 0x41, 0x02, 0x6b, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, + 0x41, 0x07, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x03, + 0x20, 0x03, 0x41, 0x04, 0x6b, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, + 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x20, 0x00, 0x6b, + 0x41, 0x03, 0x71, 0x22, 0x05, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x41, 0xff, + 0x01, 0x71, 0x41, 0x81, 0x82, 0x84, 0x08, 0x6c, 0x22, 0x03, 0x36, 0x02, + 0x00, 0x20, 0x04, 0x20, 0x02, 0x20, 0x05, 0x6b, 0x41, 0x3c, 0x71, 0x22, + 0x02, 0x6a, 0x22, 0x01, 0x41, 0x04, 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, + 0x20, 0x02, 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x03, 0x36, + 0x02, 0x08, 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, 0x04, 0x20, 0x01, 0x41, + 0x08, 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x0c, 0x6b, + 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x19, 0x49, 0x0d, 0x00, + 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, 0x18, 0x20, 0x04, 0x20, 0x03, 0x36, + 0x02, 0x14, 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, 0x10, 0x20, 0x04, 0x20, + 0x03, 0x36, 0x02, 0x0c, 0x20, 0x01, 0x41, 0x10, 0x6b, 0x20, 0x03, 0x36, + 0x02, 0x00, 0x20, 0x01, 0x41, 0x14, 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, + 0x20, 0x01, 0x41, 0x18, 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, + 0x41, 0x1c, 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x20, 0x04, + 0x41, 0x04, 0x71, 0x41, 0x18, 0x72, 0x22, 0x02, 0x6b, 0x22, 0x01, 0x41, + 0x20, 0x49, 0x0d, 0x00, 0x20, 0x03, 0xad, 0x42, 0x81, 0x80, 0x80, 0x80, + 0x10, 0x7e, 0x21, 0x06, 0x20, 0x02, 0x20, 0x04, 0x6a, 0x21, 0x02, 0x03, + 0x40, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, 0x18, 0x20, 0x02, 0x20, 0x06, + 0x37, 0x03, 0x10, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, 0x08, 0x20, 0x02, + 0x20, 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x20, 0x6a, 0x21, 0x02, + 0x20, 0x01, 0x41, 0x20, 0x6b, 0x22, 0x01, 0x41, 0x1f, 0x4b, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0xc5, 0x01, 0x01, 0x03, 0x7f, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x00, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, + 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x04, 0x40, 0x41, 0x00, 0x0f, 0x0b, + 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, + 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, + 0x02, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, + 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, + 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, + 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x22, 0x01, 0x41, 0x03, + 0x71, 0x0d, 0x01, 0x0b, 0x20, 0x01, 0x41, 0x04, 0x6b, 0x21, 0x02, 0x20, + 0x01, 0x41, 0x05, 0x6b, 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, 0x41, 0x04, + 0x6a, 0x21, 0x01, 0x41, 0x80, 0x82, 0x84, 0x08, 0x20, 0x02, 0x41, 0x04, + 0x6a, 0x22, 0x02, 0x28, 0x02, 0x00, 0x22, 0x03, 0x6b, 0x20, 0x03, 0x72, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, - 0x78, 0x47, 0x0d, 0x02, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, - 0x05, 0x41, 0x7c, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, - 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x01, 0x41, 0xff, 0x01, - 0x71, 0x21, 0x02, 0x03, 0x40, 0x02, 0x40, 0x20, 0x04, 0x2d, 0x00, 0x00, - 0x20, 0x02, 0x47, 0x0d, 0x00, 0x20, 0x04, 0x0f, 0x0b, 0x20, 0x04, 0x41, - 0x01, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x7f, 0x6a, 0x22, 0x05, 0x0d, - 0x00, 0x0b, 0x0b, 0x41, 0x00, 0x0b, 0x67, 0x01, 0x02, 0x7f, 0x20, 0x01, - 0x2d, 0x00, 0x00, 0x21, 0x02, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, - 0x22, 0x03, 0x45, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x02, 0x41, 0xff, 0x01, - 0x71, 0x47, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, - 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, - 0x00, 0x21, 0x02, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x03, 0x45, 0x0d, - 0x01, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x01, 0x41, 0x01, - 0x6a, 0x21, 0x01, 0x20, 0x03, 0x20, 0x02, 0x41, 0xff, 0x01, 0x71, 0x46, - 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x03, 0x20, 0x02, 0x41, 0xff, 0x01, 0x71, - 0x6b, 0x0b, 0x0c, 0x00, 0x20, 0x00, 0x41, 0x00, 0x10, 0x9b, 0x80, 0x80, - 0x80, 0x00, 0x0b, 0xb7, 0x02, 0x01, 0x07, 0x7f, 0x02, 0x40, 0x20, 0x00, - 0x41, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x41, - 0xff, 0x01, 0x71, 0x22, 0x02, 0x41, 0x03, 0x6e, 0x22, 0x03, 0x41, 0x03, - 0x6c, 0x6b, 0x41, 0xff, 0x01, 0x71, 0x41, 0x02, 0x74, 0x41, 0xc0, 0x9e, - 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x20, 0x00, 0x41, 0x08, 0x76, - 0x22, 0x04, 0x41, 0xa0, 0xa9, 0x84, 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x00, - 0x41, 0xd6, 0x00, 0x6c, 0x20, 0x03, 0x6a, 0x41, 0xa0, 0xa9, 0x84, 0x80, - 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x6c, 0x41, 0x0b, 0x76, 0x41, 0x06, 0x70, - 0x20, 0x04, 0x41, 0x90, 0xbe, 0x84, 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x00, - 0x6a, 0x41, 0x02, 0x74, 0x41, 0xd0, 0x9e, 0x84, 0x80, 0x00, 0x6a, 0x28, - 0x02, 0x00, 0x22, 0x03, 0x41, 0x08, 0x75, 0x21, 0x04, 0x02, 0x40, 0x20, - 0x03, 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, 0x41, 0x01, 0x4b, 0x0d, 0x00, - 0x20, 0x04, 0x41, 0x00, 0x20, 0x03, 0x20, 0x01, 0x73, 0x6b, 0x71, 0x20, - 0x00, 0x6a, 0x0f, 0x0b, 0x20, 0x04, 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, - 0x45, 0x0d, 0x00, 0x20, 0x04, 0x41, 0x08, 0x76, 0x21, 0x04, 0x03, 0x40, - 0x02, 0x40, 0x20, 0x02, 0x20, 0x03, 0x41, 0x01, 0x76, 0x22, 0x05, 0x20, - 0x04, 0x6a, 0x22, 0x06, 0x41, 0x01, 0x74, 0x41, 0x90, 0xa6, 0x84, 0x80, - 0x00, 0x6a, 0x22, 0x07, 0x2d, 0x00, 0x00, 0x22, 0x08, 0x47, 0x0d, 0x00, - 0x02, 0x40, 0x20, 0x07, 0x41, 0x01, 0x6a, 0x2d, 0x00, 0x00, 0x41, 0x02, - 0x74, 0x41, 0xd0, 0x9e, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x22, - 0x03, 0x41, 0xff, 0x01, 0x71, 0x22, 0x04, 0x41, 0x01, 0x4b, 0x0d, 0x00, - 0x20, 0x03, 0x41, 0x08, 0x75, 0x41, 0x00, 0x20, 0x04, 0x20, 0x01, 0x73, - 0x6b, 0x71, 0x20, 0x00, 0x6a, 0x0f, 0x0b, 0x41, 0x7f, 0x41, 0x01, 0x20, - 0x01, 0x1b, 0x20, 0x00, 0x6a, 0x0f, 0x0b, 0x20, 0x04, 0x20, 0x06, 0x20, - 0x02, 0x20, 0x08, 0x49, 0x22, 0x08, 0x1b, 0x21, 0x04, 0x20, 0x05, 0x20, - 0x03, 0x20, 0x05, 0x6b, 0x20, 0x08, 0x1b, 0x22, 0x03, 0x0d, 0x00, 0x0b, - 0x0b, 0x20, 0x00, 0x0b, 0x0c, 0x00, 0x20, 0x00, 0x41, 0x01, 0x10, 0x9b, - 0x80, 0x80, 0x80, 0x00, 0x0b, 0x87, 0x01, 0x01, 0x02, 0x7f, 0x02, 0x40, - 0x20, 0x02, 0x0d, 0x00, 0x41, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, - 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x03, 0x0d, 0x00, 0x41, 0x00, 0x21, - 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, - 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x02, 0x02, 0x40, 0x03, 0x40, 0x20, 0x03, - 0x41, 0xff, 0x01, 0x71, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x47, - 0x0d, 0x01, 0x20, 0x04, 0x45, 0x0d, 0x01, 0x20, 0x02, 0x41, 0x00, 0x46, - 0x0d, 0x01, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, - 0x01, 0x6a, 0x21, 0x01, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x21, 0x03, 0x20, - 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x03, 0x0d, 0x00, 0x0b, 0x41, - 0x00, 0x21, 0x03, 0x0b, 0x20, 0x03, 0x41, 0xff, 0x01, 0x71, 0x21, 0x03, - 0x0b, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x6b, 0x0b, 0x0d, 0x00, - 0x20, 0x00, 0x10, 0x9a, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x47, 0x0b, - 0xa5, 0x0a, 0x01, 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, - 0x02, 0x41, 0x21, 0x4f, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x46, 0x0d, - 0x02, 0x20, 0x01, 0x20, 0x00, 0x20, 0x02, 0x6a, 0x22, 0x03, 0x6b, 0x41, - 0x00, 0x20, 0x02, 0x41, 0x01, 0x74, 0x6b, 0x4b, 0x0d, 0x01, 0x0b, 0x20, - 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x0c, 0x01, 0x0b, - 0x20, 0x01, 0x20, 0x00, 0x73, 0x41, 0x03, 0x71, 0x21, 0x04, 0x02, 0x40, - 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x20, 0x01, 0x4f, 0x0d, 0x00, 0x02, - 0x40, 0x20, 0x04, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x21, 0x05, 0x20, 0x00, - 0x21, 0x03, 0x0c, 0x03, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x71, - 0x0d, 0x00, 0x20, 0x02, 0x21, 0x05, 0x20, 0x00, 0x21, 0x03, 0x0c, 0x02, - 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, - 0x00, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x05, 0x02, - 0x40, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x0d, - 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, - 0x05, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x20, 0x01, 0x41, - 0x01, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x7e, - 0x6a, 0x21, 0x05, 0x02, 0x40, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x03, - 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x21, 0x01, - 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x41, 0x02, - 0x6a, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, - 0x20, 0x02, 0x41, 0x7d, 0x6a, 0x21, 0x05, 0x02, 0x40, 0x20, 0x00, 0x41, - 0x03, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x01, 0x41, - 0x03, 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x03, - 0x20, 0x00, 0x41, 0x03, 0x6a, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x2d, 0x00, - 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, - 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x21, - 0x05, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x04, 0x0d, 0x00, 0x02, 0x40, - 0x20, 0x03, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, - 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x03, 0x6a, 0x22, - 0x04, 0x20, 0x01, 0x20, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, - 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x03, 0x21, + 0x78, 0x46, 0x0d, 0x00, 0x0b, 0x03, 0x40, 0x20, 0x01, 0x41, 0x01, 0x6a, + 0x21, 0x01, 0x20, 0x02, 0x2d, 0x00, 0x00, 0x20, 0x02, 0x41, 0x01, 0x6a, + 0x21, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x01, 0x20, 0x00, 0x6b, 0x0b, + 0x3e, 0x00, 0x20, 0x00, 0x41, 0xff, 0xff, 0x07, 0x4d, 0x04, 0x40, 0x20, + 0x00, 0x41, 0x03, 0x76, 0x41, 0x1f, 0x71, 0x20, 0x00, 0x41, 0x08, 0x76, + 0x41, 0x80, 0x80, 0x04, 0x6a, 0x2d, 0x00, 0x00, 0x41, 0x05, 0x74, 0x72, + 0x41, 0x80, 0x80, 0x04, 0x6a, 0x2d, 0x00, 0x00, 0x20, 0x00, 0x41, 0x07, + 0x71, 0x76, 0x41, 0x01, 0x71, 0x0f, 0x0b, 0x20, 0x00, 0x41, 0xfe, 0xff, + 0x0b, 0x49, 0x0b, 0x43, 0x01, 0x03, 0x7f, 0x02, 0x40, 0x20, 0x02, 0x45, + 0x0d, 0x00, 0x03, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x20, + 0x01, 0x2d, 0x00, 0x00, 0x22, 0x05, 0x46, 0x04, 0x40, 0x20, 0x01, 0x41, + 0x01, 0x6a, 0x21, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, + 0x02, 0x41, 0x01, 0x6b, 0x22, 0x02, 0x0d, 0x01, 0x0c, 0x02, 0x0b, 0x0b, + 0x20, 0x04, 0x20, 0x05, 0x6b, 0x21, 0x03, 0x0b, 0x20, 0x03, 0x0b, 0xe9, + 0x02, 0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, 0x00, 0x47, 0x21, 0x05, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x71, 0x45, 0x20, + 0x02, 0x45, 0x72, 0x45, 0x04, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x20, + 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x04, 0x40, 0x20, 0x00, 0x21, 0x03, + 0x20, 0x02, 0x21, 0x04, 0x0c, 0x03, 0x0b, 0x20, 0x02, 0x41, 0x01, 0x6b, + 0x22, 0x04, 0x41, 0x00, 0x47, 0x21, 0x05, 0x20, 0x00, 0x41, 0x01, 0x6a, + 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x04, 0x45, 0x72, 0x0d, 0x01, + 0x20, 0x03, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, + 0x0d, 0x02, 0x20, 0x02, 0x41, 0x02, 0x6b, 0x22, 0x04, 0x41, 0x00, 0x47, + 0x21, 0x05, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, + 0x45, 0x20, 0x04, 0x45, 0x72, 0x0d, 0x01, 0x20, 0x03, 0x2d, 0x00, 0x00, + 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, 0x02, 0x41, + 0x03, 0x6b, 0x22, 0x04, 0x41, 0x00, 0x47, 0x21, 0x05, 0x20, 0x00, 0x41, + 0x03, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x04, 0x45, 0x72, + 0x0d, 0x01, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, + 0x71, 0x46, 0x0d, 0x02, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, + 0x02, 0x41, 0x04, 0x6b, 0x22, 0x04, 0x41, 0x00, 0x47, 0x21, 0x05, 0x0c, + 0x01, 0x0b, 0x20, 0x02, 0x21, 0x04, 0x20, 0x00, 0x21, 0x03, 0x0b, 0x20, + 0x05, 0x45, 0x0d, 0x01, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x22, 0x00, + 0x20, 0x03, 0x2d, 0x00, 0x00, 0x46, 0x20, 0x04, 0x41, 0x04, 0x49, 0x72, + 0x45, 0x04, 0x40, 0x20, 0x00, 0x41, 0x81, 0x82, 0x84, 0x08, 0x6c, 0x21, + 0x00, 0x03, 0x40, 0x41, 0x80, 0x82, 0x84, 0x08, 0x20, 0x03, 0x28, 0x02, + 0x00, 0x20, 0x00, 0x73, 0x22, 0x02, 0x6b, 0x20, 0x02, 0x72, 0x41, 0x80, + 0x81, 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x47, + 0x0d, 0x02, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x04, 0x41, + 0x04, 0x6b, 0x22, 0x04, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x04, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x21, + 0x00, 0x03, 0x40, 0x20, 0x00, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x46, 0x04, + 0x40, 0x20, 0x03, 0x0f, 0x0b, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x21, 0x03, + 0x20, 0x04, 0x41, 0x01, 0x6b, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x0b, 0x41, + 0x00, 0x0b, 0x58, 0x01, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, + 0x00, 0x22, 0x02, 0x45, 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, + 0x03, 0x47, 0x72, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, + 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, 0x2d, + 0x00, 0x00, 0x21, 0x03, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x02, 0x45, + 0x0d, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x01, 0x41, + 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x20, 0x03, 0x46, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x0b, 0x08, 0x00, 0x20, 0x00, 0x41, + 0x00, 0x10, 0x14, 0x0b, 0xa0, 0x02, 0x01, 0x07, 0x7f, 0x02, 0x40, 0x20, + 0x00, 0x41, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x00, + 0x41, 0xff, 0x01, 0x71, 0x22, 0x05, 0x41, 0x03, 0x6e, 0x22, 0x02, 0x41, + 0x03, 0x6c, 0x6b, 0x41, 0xff, 0x01, 0x71, 0x41, 0x02, 0x74, 0x41, 0xc0, + 0x9e, 0x04, 0x6a, 0x28, 0x02, 0x00, 0x20, 0x02, 0x20, 0x00, 0x41, 0x08, + 0x76, 0x22, 0x02, 0x41, 0xa0, 0xa9, 0x04, 0x6a, 0x2d, 0x00, 0x00, 0x41, + 0xd6, 0x00, 0x6c, 0x6a, 0x41, 0xa0, 0xa9, 0x04, 0x6a, 0x2d, 0x00, 0x00, + 0x6c, 0x41, 0x0b, 0x76, 0x41, 0x06, 0x70, 0x20, 0x02, 0x41, 0x90, 0xbe, + 0x04, 0x6a, 0x2d, 0x00, 0x00, 0x6a, 0x41, 0x02, 0x74, 0x41, 0xd0, 0x9e, + 0x04, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x03, 0x41, 0x08, 0x75, 0x21, 0x02, + 0x20, 0x03, 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, 0x41, 0x01, 0x4d, 0x04, + 0x40, 0x20, 0x02, 0x41, 0x00, 0x20, 0x01, 0x20, 0x03, 0x73, 0x6b, 0x71, + 0x20, 0x00, 0x6a, 0x0f, 0x0b, 0x20, 0x02, 0x41, 0xff, 0x01, 0x71, 0x22, + 0x03, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x41, 0x08, 0x76, 0x21, 0x02, 0x03, + 0x40, 0x20, 0x03, 0x41, 0x01, 0x76, 0x22, 0x06, 0x20, 0x02, 0x6a, 0x22, + 0x04, 0x41, 0x01, 0x74, 0x41, 0x90, 0xa6, 0x04, 0x6a, 0x22, 0x07, 0x2d, + 0x00, 0x00, 0x22, 0x08, 0x20, 0x05, 0x46, 0x04, 0x40, 0x20, 0x07, 0x2d, + 0x00, 0x01, 0x41, 0x02, 0x74, 0x41, 0xd0, 0x9e, 0x04, 0x6a, 0x28, 0x02, + 0x00, 0x22, 0x02, 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, 0x41, 0x01, 0x4d, + 0x04, 0x40, 0x41, 0x00, 0x20, 0x01, 0x20, 0x03, 0x73, 0x6b, 0x20, 0x02, + 0x41, 0x08, 0x75, 0x71, 0x20, 0x00, 0x6a, 0x0f, 0x0b, 0x41, 0x7f, 0x41, + 0x01, 0x20, 0x01, 0x1b, 0x20, 0x00, 0x6a, 0x0f, 0x0b, 0x20, 0x02, 0x20, + 0x04, 0x20, 0x05, 0x20, 0x08, 0x49, 0x22, 0x04, 0x1b, 0x21, 0x02, 0x20, + 0x06, 0x20, 0x03, 0x20, 0x06, 0x6b, 0x20, 0x04, 0x1b, 0x22, 0x03, 0x0d, + 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0x08, 0x00, 0x20, 0x00, 0x41, 0x01, + 0x10, 0x14, 0x0b, 0x75, 0x01, 0x02, 0x7f, 0x20, 0x02, 0x45, 0x04, 0x40, + 0x41, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, + 0x03, 0x45, 0x04, 0x40, 0x41, 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, + 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x21, + 0x02, 0x02, 0x40, 0x03, 0x40, 0x20, 0x02, 0x45, 0x20, 0x03, 0x20, 0x01, + 0x2d, 0x00, 0x00, 0x22, 0x04, 0x47, 0x20, 0x04, 0x45, 0x72, 0x72, 0x0d, + 0x01, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x21, 0x02, 0x20, 0x01, 0x41, 0x01, + 0x6a, 0x21, 0x01, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x21, 0x03, 0x20, 0x00, + 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x03, 0x0d, 0x00, 0x0b, 0x41, 0x00, + 0x21, 0x03, 0x0b, 0x0b, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x6b, + 0x0b, 0x09, 0x00, 0x20, 0x00, 0x10, 0x13, 0x20, 0x00, 0x47, 0x0b, 0xa1, + 0x09, 0x01, 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x21, + 0x49, 0x04, 0x40, 0x20, 0x00, 0x20, 0x01, 0x46, 0x0d, 0x02, 0x20, 0x01, + 0x20, 0x00, 0x20, 0x02, 0x6a, 0x22, 0x04, 0x6b, 0x41, 0x00, 0x20, 0x02, + 0x41, 0x01, 0x74, 0x6b, 0x4b, 0x0d, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, + 0x20, 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, + 0x01, 0x73, 0x41, 0x03, 0x71, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x00, 0x20, 0x01, 0x49, 0x04, 0x40, 0x20, 0x03, 0x04, 0x40, 0x20, 0x02, + 0x21, 0x04, 0x20, 0x00, 0x21, 0x03, 0x0c, 0x03, 0x0b, 0x20, 0x00, 0x41, + 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x02, 0x21, 0x04, 0x20, 0x00, 0x21, + 0x03, 0x0c, 0x02, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, + 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x01, 0x6b, + 0x21, 0x04, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, + 0x45, 0x04, 0x40, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x0c, 0x02, + 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, + 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02, 0x41, 0x02, 0x6b, 0x21, 0x04, 0x20, + 0x00, 0x41, 0x02, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, + 0x20, 0x01, 0x41, 0x02, 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x04, + 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, + 0x02, 0x20, 0x02, 0x41, 0x03, 0x6b, 0x21, 0x04, 0x20, 0x00, 0x41, 0x03, + 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x01, 0x41, + 0x03, 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x03, + 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x00, + 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, + 0x20, 0x02, 0x41, 0x04, 0x6b, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x02, 0x40, + 0x20, 0x03, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x45, + 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, + 0x01, 0x6b, 0x22, 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, 0x03, 0x6a, + 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x41, 0x03, 0x71, 0x45, + 0x04, 0x40, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x45, + 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x02, 0x6b, 0x22, 0x03, 0x6a, + 0x22, 0x04, 0x20, 0x01, 0x20, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, + 0x00, 0x20, 0x04, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, - 0x02, 0x41, 0x7e, 0x6a, 0x22, 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, - 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x04, - 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, - 0x20, 0x03, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x7d, 0x6a, - 0x22, 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, 0x03, 0x6a, 0x2d, 0x00, - 0x00, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x0d, - 0x00, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x45, 0x0d, - 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x02, 0x6a, 0x20, - 0x01, 0x20, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x0b, 0x20, - 0x02, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x02, 0x41, 0x7c, - 0x6a, 0x22, 0x06, 0x41, 0x02, 0x76, 0x41, 0x01, 0x6a, 0x41, 0x03, 0x71, - 0x22, 0x03, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x41, 0x7c, 0x6a, 0x21, 0x04, - 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x21, 0x05, 0x03, 0x40, 0x20, 0x05, 0x20, - 0x02, 0x6a, 0x20, 0x04, 0x20, 0x02, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, - 0x00, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x21, 0x02, 0x20, 0x03, 0x41, 0x7f, - 0x6a, 0x22, 0x03, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x06, 0x41, 0x0c, 0x49, - 0x0d, 0x00, 0x20, 0x01, 0x41, 0x70, 0x6a, 0x21, 0x05, 0x20, 0x00, 0x41, - 0x70, 0x6a, 0x21, 0x06, 0x03, 0x40, 0x20, 0x06, 0x20, 0x02, 0x6a, 0x22, - 0x03, 0x41, 0x0c, 0x6a, 0x20, 0x05, 0x20, 0x02, 0x6a, 0x22, 0x04, 0x41, + 0x02, 0x41, 0x03, 0x6b, 0x22, 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, + 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x41, 0x03, + 0x71, 0x45, 0x04, 0x40, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, + 0x03, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x04, 0x6b, 0x22, + 0x02, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, + 0x00, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x20, 0x02, 0x41, + 0x04, 0x6b, 0x22, 0x04, 0x41, 0x02, 0x76, 0x41, 0x01, 0x6a, 0x41, 0x03, + 0x71, 0x22, 0x03, 0x04, 0x40, 0x20, 0x01, 0x41, 0x04, 0x6b, 0x21, 0x05, + 0x20, 0x00, 0x41, 0x04, 0x6b, 0x21, 0x06, 0x03, 0x40, 0x20, 0x02, 0x20, + 0x06, 0x6a, 0x20, 0x02, 0x20, 0x05, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, + 0x00, 0x20, 0x02, 0x41, 0x04, 0x6b, 0x21, 0x02, 0x20, 0x03, 0x41, 0x01, + 0x6b, 0x22, 0x03, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x04, 0x41, 0x0c, 0x49, + 0x0d, 0x00, 0x20, 0x01, 0x41, 0x10, 0x6b, 0x21, 0x05, 0x20, 0x00, 0x41, + 0x10, 0x6b, 0x21, 0x06, 0x03, 0x40, 0x20, 0x02, 0x20, 0x06, 0x6a, 0x22, + 0x03, 0x41, 0x0c, 0x6a, 0x20, 0x02, 0x20, 0x05, 0x6a, 0x22, 0x04, 0x41, 0x0c, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x20, 0x04, 0x41, 0x08, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x04, 0x28, 0x02, 0x00, 0x36, - 0x02, 0x00, 0x20, 0x02, 0x41, 0x70, 0x6a, 0x22, 0x02, 0x41, 0x03, 0x4b, - 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x02, 0x21, - 0x03, 0x02, 0x40, 0x20, 0x02, 0x41, 0x03, 0x71, 0x22, 0x04, 0x45, 0x0d, - 0x00, 0x20, 0x01, 0x41, 0x7f, 0x6a, 0x21, 0x05, 0x20, 0x00, 0x41, 0x7f, - 0x6a, 0x21, 0x06, 0x20, 0x02, 0x21, 0x03, 0x03, 0x40, 0x20, 0x06, 0x20, - 0x03, 0x6a, 0x20, 0x05, 0x20, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, - 0x00, 0x20, 0x03, 0x41, 0x7f, 0x6a, 0x21, 0x03, 0x20, 0x04, 0x41, 0x7f, - 0x6a, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, - 0x0d, 0x02, 0x20, 0x01, 0x41, 0x7c, 0x6a, 0x21, 0x04, 0x20, 0x00, 0x41, - 0x7c, 0x6a, 0x21, 0x05, 0x03, 0x40, 0x20, 0x05, 0x20, 0x03, 0x6a, 0x22, - 0x01, 0x41, 0x03, 0x6a, 0x20, 0x04, 0x20, 0x03, 0x6a, 0x22, 0x02, 0x41, - 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x02, - 0x6a, 0x20, 0x02, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, - 0x20, 0x01, 0x41, 0x01, 0x6a, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x2d, 0x00, - 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x20, 0x02, 0x2d, 0x00, 0x00, 0x3a, - 0x00, 0x00, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x22, 0x03, 0x0d, 0x00, 0x0c, - 0x03, 0x0b, 0x0b, 0x20, 0x05, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x02, 0x40, - 0x20, 0x05, 0x41, 0x7c, 0x6a, 0x22, 0x04, 0x41, 0x02, 0x76, 0x41, 0x01, - 0x6a, 0x41, 0x07, 0x71, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x05, 0x20, - 0x02, 0x41, 0x02, 0x74, 0x6b, 0x21, 0x05, 0x03, 0x40, 0x20, 0x03, 0x20, + 0x02, 0x00, 0x20, 0x02, 0x41, 0x10, 0x6b, 0x22, 0x02, 0x41, 0x03, 0x4b, + 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x02, 0x22, + 0x03, 0x41, 0x03, 0x71, 0x22, 0x05, 0x04, 0x40, 0x20, 0x01, 0x41, 0x01, + 0x6b, 0x21, 0x04, 0x20, 0x00, 0x41, 0x01, 0x6b, 0x21, 0x06, 0x03, 0x40, + 0x20, 0x03, 0x20, 0x06, 0x6a, 0x20, 0x03, 0x20, 0x04, 0x6a, 0x2d, 0x00, + 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x01, 0x6b, 0x21, 0x03, 0x20, + 0x05, 0x41, 0x01, 0x6b, 0x22, 0x05, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, + 0x41, 0x04, 0x49, 0x0d, 0x02, 0x20, 0x01, 0x41, 0x04, 0x6b, 0x21, 0x04, + 0x20, 0x00, 0x41, 0x04, 0x6b, 0x21, 0x05, 0x03, 0x40, 0x20, 0x03, 0x20, + 0x05, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x6a, 0x20, 0x03, 0x20, 0x04, 0x6a, + 0x22, 0x02, 0x41, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, + 0x01, 0x41, 0x02, 0x6a, 0x20, 0x02, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, + 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x20, 0x02, 0x41, 0x01, + 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x20, 0x02, 0x2d, + 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x04, 0x6b, 0x22, 0x03, + 0x0d, 0x00, 0x0b, 0x0c, 0x02, 0x0b, 0x20, 0x04, 0x41, 0x04, 0x49, 0x0d, + 0x00, 0x20, 0x04, 0x41, 0x04, 0x6b, 0x22, 0x05, 0x41, 0x02, 0x76, 0x41, + 0x01, 0x6a, 0x41, 0x07, 0x71, 0x22, 0x02, 0x04, 0x40, 0x20, 0x04, 0x20, + 0x02, 0x41, 0x02, 0x74, 0x6b, 0x21, 0x04, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, - 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x04, 0x41, 0x1c, + 0x01, 0x6b, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x05, 0x41, 0x1c, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x00, - 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x20, 0x01, 0x41, 0x04, - 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x08, 0x6a, - 0x20, 0x01, 0x41, 0x08, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, - 0x03, 0x41, 0x0c, 0x6a, 0x20, 0x01, 0x41, 0x0c, 0x6a, 0x28, 0x02, 0x00, - 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x20, 0x01, 0x41, 0x10, - 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x14, 0x6a, - 0x20, 0x01, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, - 0x03, 0x41, 0x18, 0x6a, 0x20, 0x01, 0x41, 0x18, 0x6a, 0x28, 0x02, 0x00, - 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x1c, 0x6a, 0x20, 0x01, 0x41, 0x1c, - 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x20, 0x6a, - 0x21, 0x01, 0x20, 0x03, 0x41, 0x20, 0x6a, 0x21, 0x03, 0x20, 0x05, 0x41, - 0x60, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, - 0x05, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x05, 0x41, 0x07, - 0x71, 0x22, 0x02, 0x0d, 0x00, 0x20, 0x05, 0x21, 0x04, 0x0c, 0x01, 0x0b, - 0x20, 0x05, 0x41, 0x78, 0x71, 0x21, 0x04, 0x03, 0x40, 0x20, 0x03, 0x20, - 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x01, 0x6a, - 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, - 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x05, 0x41, 0x08, - 0x49, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x00, - 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x20, 0x01, 0x41, 0x01, - 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x02, 0x6a, - 0x20, 0x01, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, - 0x03, 0x41, 0x03, 0x6a, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x2d, 0x00, 0x00, - 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x20, 0x01, 0x41, 0x04, - 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x05, 0x6a, - 0x20, 0x01, 0x41, 0x05, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, - 0x03, 0x41, 0x06, 0x6a, 0x20, 0x01, 0x41, 0x06, 0x6a, 0x2d, 0x00, 0x00, - 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x07, 0x6a, 0x20, 0x01, 0x41, 0x07, - 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x08, 0x6a, - 0x21, 0x03, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, 0x20, 0x04, 0x41, - 0x78, 0x6a, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0x0d, - 0x00, 0x20, 0x00, 0x10, 0x9c, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x47, - 0x0b, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x20, 0x46, 0x20, 0x00, 0x41, 0x09, - 0x46, 0x72, 0x0b, 0x0a, 0x00, 0x20, 0x00, 0x10, 0xa1, 0x80, 0x80, 0x80, - 0x00, 0x0b, 0x0a, 0x00, 0x20, 0x00, 0x41, 0x50, 0x6a, 0x41, 0x0a, 0x49, - 0x0b, 0x4d, 0x01, 0x02, 0x7f, 0x20, 0x00, 0x20, 0x00, 0x10, 0x95, 0x80, - 0x80, 0x80, 0x00, 0x6a, 0x21, 0x03, 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, - 0x00, 0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x45, 0x0d, - 0x01, 0x20, 0x03, 0x20, 0x04, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x01, - 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, - 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x03, 0x41, - 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0b, 0xf3, 0x03, 0x01, 0x04, 0x7f, - 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, - 0x20, 0x00, 0x73, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x21, - 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x41, 0x00, 0x47, 0x21, 0x04, 0x02, - 0x40, 0x02, 0x40, 0x20, 0x01, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x00, - 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x0d, 0x00, 0x20, - 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, - 0x00, 0x22, 0x03, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x03, 0x0d, 0x00, - 0x20, 0x00, 0x21, 0x03, 0x20, 0x02, 0x21, 0x05, 0x0c, 0x05, 0x0b, 0x20, - 0x00, 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, - 0x05, 0x41, 0x00, 0x47, 0x21, 0x04, 0x02, 0x40, 0x20, 0x01, 0x41, 0x01, - 0x6a, 0x22, 0x06, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x05, 0x45, - 0x0d, 0x00, 0x20, 0x03, 0x20, 0x06, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x3a, - 0x00, 0x00, 0x20, 0x04, 0x45, 0x0d, 0x05, 0x20, 0x00, 0x41, 0x02, 0x6a, - 0x21, 0x03, 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, - 0x21, 0x04, 0x02, 0x40, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x22, 0x06, 0x41, - 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x05, 0x45, 0x0d, 0x00, 0x20, 0x03, - 0x20, 0x06, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x3a, 0x00, 0x00, 0x20, 0x04, - 0x45, 0x0d, 0x06, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x21, 0x03, 0x20, 0x02, - 0x41, 0x7d, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x04, 0x02, 0x40, - 0x20, 0x01, 0x41, 0x03, 0x6a, 0x22, 0x06, 0x41, 0x03, 0x71, 0x45, 0x0d, - 0x00, 0x20, 0x05, 0x45, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x06, 0x2d, 0x00, - 0x00, 0x22, 0x04, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x45, 0x0d, 0x07, 0x20, - 0x00, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, - 0x01, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x02, 0x41, 0x00, 0x47, 0x21, - 0x04, 0x0c, 0x03, 0x0b, 0x20, 0x06, 0x21, 0x01, 0x20, 0x05, 0x21, 0x02, - 0x0c, 0x02, 0x0b, 0x20, 0x06, 0x21, 0x01, 0x20, 0x05, 0x21, 0x02, 0x0c, - 0x01, 0x0b, 0x20, 0x06, 0x21, 0x01, 0x20, 0x05, 0x21, 0x02, 0x0b, 0x20, - 0x04, 0x45, 0x0d, 0x02, 0x02, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x0d, - 0x00, 0x20, 0x02, 0x21, 0x05, 0x0c, 0x04, 0x0b, 0x20, 0x02, 0x41, 0x04, - 0x49, 0x0d, 0x00, 0x03, 0x40, 0x41, 0x80, 0x82, 0x84, 0x08, 0x20, 0x01, - 0x28, 0x02, 0x00, 0x22, 0x00, 0x6b, 0x20, 0x00, 0x72, 0x41, 0x80, 0x81, - 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x47, 0x0d, - 0x02, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x04, - 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, - 0x41, 0x7c, 0x6a, 0x22, 0x02, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, - 0x20, 0x02, 0x45, 0x0d, 0x01, 0x0b, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, - 0x2d, 0x00, 0x00, 0x22, 0x00, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x00, - 0x0d, 0x00, 0x20, 0x02, 0x21, 0x05, 0x0c, 0x03, 0x0b, 0x20, 0x03, 0x41, - 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, - 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, - 0x21, 0x05, 0x0b, 0x20, 0x03, 0x41, 0x00, 0x20, 0x05, 0x10, 0x94, 0x80, - 0x80, 0x80, 0x00, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, - 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, 0x00, 0x0b, 0x17, 0x00, - 0x20, 0x00, 0x41, 0x50, 0x6a, 0x41, 0x0a, 0x49, 0x20, 0x00, 0x41, 0x20, - 0x72, 0x41, 0x9f, 0x7f, 0x6a, 0x41, 0x06, 0x49, 0x72, 0x0b, 0x2a, 0x01, - 0x03, 0x7f, 0x41, 0x00, 0x21, 0x01, 0x03, 0x40, 0x20, 0x00, 0x20, 0x01, - 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x22, 0x03, 0x21, 0x01, - 0x20, 0x02, 0x28, 0x02, 0x00, 0x0d, 0x00, 0x0b, 0x20, 0x03, 0x41, 0x7c, - 0x6a, 0x41, 0x02, 0x75, 0x0b, 0x45, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x20, - 0x01, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x21, 0x00, 0x02, - 0x40, 0x03, 0x40, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x22, 0x00, 0x28, 0x02, - 0x00, 0x22, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x02, 0x20, 0x01, 0x47, 0x0d, - 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x41, 0x00, 0x20, 0x02, 0x1b, 0x0f, 0x0b, - 0x20, 0x00, 0x20, 0x00, 0x10, 0xa8, 0x80, 0x80, 0x80, 0x00, 0x41, 0x02, - 0x74, 0x6a, 0x0b, 0x1d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, - 0x00, 0x0f, 0x0b, 0x41, 0x90, 0xc2, 0x84, 0x80, 0x00, 0x20, 0x00, 0x10, - 0xa9, 0x80, 0x80, 0x80, 0x00, 0x41, 0x00, 0x47, 0x0b, 0x24, 0x01, 0x01, - 0x7f, 0x41, 0x01, 0x21, 0x01, 0x02, 0x40, 0x20, 0x00, 0x41, 0x50, 0x6a, - 0x41, 0x0a, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x10, 0x96, 0x80, 0x80, 0x80, - 0x00, 0x41, 0x00, 0x47, 0x21, 0x01, 0x0b, 0x20, 0x01, 0x0b, 0x0b, 0xf1, - 0x42, 0x01, 0x00, 0x41, 0x80, 0x80, 0x04, 0x0b, 0xe8, 0x42, 0x12, 0x11, - 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, - 0x1f, 0x20, 0x21, 0x11, 0x22, 0x23, 0x24, 0x11, 0x25, 0x26, 0x27, 0x28, - 0x29, 0x2a, 0x2b, 0x2c, 0x11, 0x2d, 0x2e, 0x2f, 0x10, 0x10, 0x30, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x31, 0x32, 0x33, 0x10, 0x34, 0x35, - 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x04, 0x36, 0x02, + 0x04, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x08, 0x36, 0x02, 0x08, 0x20, + 0x03, 0x20, 0x01, 0x28, 0x02, 0x0c, 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, + 0x01, 0x28, 0x02, 0x10, 0x36, 0x02, 0x10, 0x20, 0x03, 0x20, 0x01, 0x28, + 0x02, 0x14, 0x36, 0x02, 0x14, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x18, + 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x1c, 0x36, 0x02, + 0x1c, 0x20, 0x01, 0x41, 0x20, 0x6a, 0x21, 0x01, 0x20, 0x03, 0x41, 0x20, + 0x6a, 0x21, 0x03, 0x20, 0x04, 0x41, 0x20, 0x6b, 0x22, 0x04, 0x41, 0x03, + 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x00, 0x02, 0x40, + 0x20, 0x04, 0x41, 0x07, 0x71, 0x22, 0x02, 0x45, 0x04, 0x40, 0x20, 0x04, + 0x21, 0x05, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x41, 0x78, 0x71, 0x21, 0x05, + 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, + 0x20, 0x03, 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, + 0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x22, 0x02, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x04, 0x41, 0x08, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x03, + 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x20, 0x01, + 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, + 0x02, 0x3a, 0x00, 0x02, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x03, 0x3a, + 0x00, 0x03, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x04, 0x3a, 0x00, 0x04, + 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x05, 0x3a, 0x00, 0x05, 0x20, 0x03, + 0x20, 0x01, 0x2d, 0x00, 0x06, 0x3a, 0x00, 0x06, 0x20, 0x03, 0x20, 0x01, + 0x2d, 0x00, 0x07, 0x3a, 0x00, 0x07, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x21, + 0x03, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, 0x20, 0x05, 0x41, 0x08, + 0x6b, 0x22, 0x05, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0x09, 0x00, + 0x20, 0x00, 0x10, 0x15, 0x20, 0x00, 0x47, 0x0b, 0x0d, 0x00, 0x20, 0x00, + 0x41, 0x20, 0x46, 0x20, 0x00, 0x41, 0x09, 0x46, 0x72, 0x0b, 0x0a, 0x00, + 0x20, 0x00, 0x41, 0x30, 0x6b, 0x41, 0x0a, 0x49, 0x0b, 0x49, 0x01, 0x02, + 0x7f, 0x20, 0x00, 0x10, 0x0e, 0x20, 0x00, 0x6a, 0x21, 0x03, 0x02, 0x40, + 0x20, 0x02, 0x45, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x00, + 0x22, 0x04, 0x45, 0x0d, 0x01, 0x20, 0x03, 0x20, 0x04, 0x3a, 0x00, 0x00, + 0x20, 0x03, 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, + 0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x22, 0x02, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x03, 0x41, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0b, 0xe6, + 0x03, 0x01, 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x00, 0x20, 0x01, 0x22, 0x03, 0x73, 0x41, 0x03, 0x71, 0x04, 0x40, + 0x20, 0x00, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x41, 0x00, 0x47, + 0x21, 0x06, 0x02, 0x40, 0x20, 0x03, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, + 0x20, 0x00, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x45, 0x04, 0x40, + 0x20, 0x00, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x03, 0x2d, + 0x00, 0x00, 0x22, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x45, 0x04, 0x40, + 0x20, 0x00, 0x21, 0x04, 0x20, 0x02, 0x21, 0x01, 0x0c, 0x05, 0x0b, 0x20, + 0x00, 0x41, 0x01, 0x6a, 0x21, 0x04, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x22, + 0x01, 0x41, 0x00, 0x47, 0x21, 0x06, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x22, + 0x05, 0x41, 0x03, 0x71, 0x45, 0x20, 0x01, 0x45, 0x72, 0x45, 0x04, 0x40, + 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x00, 0x22, 0x05, 0x3a, 0x00, 0x00, + 0x20, 0x05, 0x45, 0x0d, 0x05, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x21, 0x04, + 0x20, 0x02, 0x41, 0x02, 0x6b, 0x22, 0x01, 0x41, 0x00, 0x47, 0x21, 0x06, + 0x20, 0x03, 0x41, 0x02, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, 0x20, + 0x01, 0x45, 0x72, 0x45, 0x04, 0x40, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, + 0x00, 0x22, 0x05, 0x3a, 0x00, 0x00, 0x20, 0x05, 0x45, 0x0d, 0x06, 0x20, + 0x00, 0x41, 0x03, 0x6a, 0x21, 0x04, 0x20, 0x02, 0x41, 0x03, 0x6b, 0x22, + 0x01, 0x41, 0x00, 0x47, 0x21, 0x06, 0x20, 0x03, 0x41, 0x03, 0x6a, 0x22, + 0x05, 0x41, 0x03, 0x71, 0x45, 0x20, 0x01, 0x45, 0x72, 0x45, 0x04, 0x40, + 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x00, 0x22, 0x05, 0x3a, 0x00, 0x00, + 0x20, 0x05, 0x45, 0x0d, 0x07, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x04, + 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x04, 0x6b, + 0x22, 0x02, 0x41, 0x00, 0x47, 0x21, 0x06, 0x0c, 0x03, 0x0b, 0x20, 0x05, + 0x21, 0x03, 0x20, 0x01, 0x21, 0x02, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x21, + 0x03, 0x20, 0x01, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x21, 0x03, + 0x20, 0x01, 0x21, 0x02, 0x0b, 0x20, 0x06, 0x45, 0x0d, 0x02, 0x20, 0x03, + 0x2d, 0x00, 0x00, 0x45, 0x04, 0x40, 0x20, 0x02, 0x21, 0x01, 0x0c, 0x04, + 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x41, 0x80, + 0x82, 0x84, 0x08, 0x20, 0x03, 0x28, 0x02, 0x00, 0x22, 0x01, 0x6b, 0x20, + 0x01, 0x72, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, + 0x82, 0x84, 0x78, 0x47, 0x0d, 0x02, 0x20, 0x04, 0x20, 0x01, 0x36, 0x02, + 0x00, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x41, 0x04, + 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x04, 0x6b, 0x22, 0x02, 0x41, 0x03, + 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x01, 0x0b, 0x03, + 0x40, 0x20, 0x04, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x22, 0x01, 0x3a, 0x00, + 0x00, 0x20, 0x01, 0x45, 0x04, 0x40, 0x20, 0x02, 0x21, 0x01, 0x0c, 0x03, + 0x0b, 0x20, 0x04, 0x41, 0x01, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x41, 0x01, + 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x22, 0x02, 0x0d, 0x00, + 0x0b, 0x0b, 0x41, 0x00, 0x21, 0x01, 0x0b, 0x20, 0x04, 0x41, 0x00, 0x20, + 0x01, 0x10, 0x0d, 0x1a, 0x20, 0x00, 0x0b, 0x17, 0x00, 0x20, 0x00, 0x41, + 0x30, 0x6b, 0x41, 0x0a, 0x49, 0x20, 0x00, 0x41, 0x20, 0x72, 0x41, 0xe1, + 0x00, 0x6b, 0x41, 0x06, 0x49, 0x72, 0x0b, 0x67, 0x01, 0x02, 0x7f, 0x20, + 0x00, 0x45, 0x04, 0x40, 0x41, 0x00, 0x0f, 0x0b, 0x02, 0x7f, 0x20, 0x00, + 0x04, 0x40, 0x41, 0x8c, 0xc2, 0x04, 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, + 0x41, 0x04, 0x6a, 0x22, 0x01, 0x28, 0x02, 0x00, 0x22, 0x02, 0x41, 0x00, + 0x20, 0x00, 0x20, 0x02, 0x47, 0x1b, 0x0d, 0x00, 0x0b, 0x20, 0x01, 0x41, + 0x00, 0x20, 0x02, 0x1b, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, 0x00, 0x03, + 0x40, 0x20, 0x00, 0x41, 0x90, 0xc2, 0x04, 0x6a, 0x20, 0x00, 0x41, 0x04, + 0x6a, 0x21, 0x00, 0x28, 0x02, 0x00, 0x0d, 0x00, 0x0b, 0x20, 0x00, 0x41, + 0x04, 0x6b, 0x41, 0x7c, 0x71, 0x41, 0x90, 0xc2, 0x04, 0x6a, 0x0b, 0x41, + 0x00, 0x47, 0x0b, 0x1d, 0x01, 0x01, 0x7f, 0x41, 0x01, 0x21, 0x01, 0x20, + 0x00, 0x41, 0x30, 0x6b, 0x41, 0x0a, 0x4f, 0x04, 0x7f, 0x20, 0x00, 0x10, + 0x0f, 0x41, 0x00, 0x47, 0x05, 0x20, 0x01, 0x0b, 0x0b, 0x0b, 0xf1, 0x42, + 0x01, 0x00, 0x41, 0x80, 0x80, 0x04, 0x0b, 0xe8, 0x42, 0x12, 0x11, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x11, 0x22, 0x23, 0x24, 0x11, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x2a, 0x2b, 0x2c, 0x11, 0x2d, 0x2e, 0x2f, 0x10, 0x10, 0x30, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x31, 0x32, 0x33, 0x10, 0x34, 0x35, 0x10, + 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x36, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x36, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x37, 0x11, 0x11, 0x11, 0x11, 0x38, 0x11, 0x39, 0x3a, 0x3b, 0x3c, - 0x3d, 0x3e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x37, 0x11, 0x11, 0x11, 0x11, 0x38, 0x11, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, + 0x3e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x3f, 0x10, 0x10, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x3f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x40, 0x41, 0x11, 0x42, - 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x11, 0x4b, 0x4c, 0x4d, - 0x4e, 0x4f, 0x50, 0x51, 0x10, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, - 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x10, 0x5e, 0x5f, 0x60, 0x10, 0x11, 0x11, - 0x11, 0x61, 0x62, 0x63, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x64, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, - 0x65, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x40, 0x41, 0x11, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x11, 0x4b, 0x4c, 0x4d, 0x4e, + 0x4f, 0x50, 0x51, 0x10, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x10, 0x5e, 0x5f, 0x60, 0x10, 0x11, 0x11, 0x11, + 0x61, 0x62, 0x63, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x11, 0x11, 0x11, 0x11, 0x64, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x65, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, - 0x66, 0x67, 0x10, 0x10, 0x68, 0x69, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x66, + 0x67, 0x10, 0x10, 0x68, 0x69, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x6a, 0x11, 0x11, 0x6b, 0x10, 0x10, 0x10, + 0x11, 0x11, 0x11, 0x11, 0x6a, 0x11, 0x11, 0x6b, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x6c, - 0x6d, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x6e, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x6c, 0x6d, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x6e, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x6f, 0x70, - 0x71, 0x72, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x73, 0x74, - 0x75, 0x10, 0x10, 0x10, 0x10, 0x10, 0x76, 0x77, 0x10, 0x10, 0x10, 0x10, - 0x78, 0x10, 0x10, 0x79, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x6f, 0x70, 0x71, + 0x72, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x73, 0x74, 0x75, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x76, 0x77, 0x10, 0x10, 0x10, 0x10, 0x78, + 0x10, 0x10, 0x79, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, - 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x04, 0xff, 0xff, - 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x04, 0xff, 0xff, 0x7f, + 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0x03, 0x00, 0x1f, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xdf, 0xbc, 0x40, 0xd7, 0xff, 0xff, 0xfb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0x03, 0x00, 0x1f, 0x50, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xdf, 0xbc, 0x40, 0xd7, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xbf, 0xb6, 0x00, 0xff, 0xff, 0xff, 0x87, - 0x07, 0x00, 0x00, 0x00, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xef, 0x1f, 0xfe, 0xe1, 0xff, 0x9f, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x07, 0x30, 0x04, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x1f, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xdf, 0x3f, 0x00, 0x00, 0xf0, 0xff, 0xf8, 0x03, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xdf, - 0xe1, 0xff, 0xcf, 0xff, 0xfe, 0xff, 0xef, 0x9f, 0xf9, 0xff, 0xff, 0xfd, - 0xc5, 0xe3, 0x9f, 0x59, 0x80, 0xb0, 0xcf, 0xff, 0x03, 0x10, 0xee, 0x87, - 0xf9, 0xff, 0xff, 0xfd, 0x6d, 0xc3, 0x87, 0x19, 0x02, 0x5e, 0xc0, 0xff, - 0x3f, 0x00, 0xee, 0xbf, 0xfb, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0xbf, 0x1b, - 0x01, 0x00, 0xcf, 0xff, 0x00, 0x1e, 0xee, 0x9f, 0xf9, 0xff, 0xff, 0xfd, - 0xed, 0xe3, 0x9f, 0x19, 0xc0, 0xb0, 0xcf, 0xff, 0x02, 0x00, 0xec, 0xc7, - 0x3d, 0xd6, 0x18, 0xc7, 0xff, 0xc3, 0xc7, 0x1d, 0x81, 0x00, 0xc0, 0xff, - 0x00, 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, 0xfd, 0xff, 0xe3, 0xdf, 0x1d, - 0x60, 0x07, 0xcf, 0xff, 0x00, 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, 0xfd, - 0xef, 0xe3, 0xdf, 0x1d, 0x60, 0x40, 0xcf, 0xff, 0x06, 0x00, 0xef, 0xdf, - 0xfd, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xdf, 0x5d, 0xf0, 0x80, 0xcf, 0xff, - 0x00, 0xfc, 0xec, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xfb, 0x2f, 0x7f, 0x80, - 0x5f, 0xff, 0xc0, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, - 0xff, 0x07, 0x3f, 0x20, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xf7, - 0xff, 0xff, 0xaf, 0xff, 0xff, 0x3b, 0x5f, 0x20, 0xff, 0xf3, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0x03, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf9, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x20, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x3d, 0x7f, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, - 0xff, 0xff, 0xff, 0xff, 0x3d, 0x7f, 0x3d, 0xff, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3f, 0xfe, 0xff, + 0xff, 0x03, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0x7f, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xbf, 0xb6, 0x00, 0xff, 0xff, 0xff, 0x87, 0x07, + 0x00, 0x00, 0x00, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xef, 0x1f, 0xfe, 0xe1, 0xff, 0x9f, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x07, 0x30, 0x04, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x1f, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x01, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xdf, 0x3f, 0x00, 0x00, 0xf0, 0xff, 0xf8, 0x03, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xdf, 0xe1, + 0xff, 0xcf, 0xff, 0xfe, 0xff, 0xef, 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xc5, + 0xe3, 0x9f, 0x59, 0x80, 0xb0, 0xcf, 0xff, 0x03, 0x10, 0xee, 0x87, 0xf9, + 0xff, 0xff, 0xfd, 0x6d, 0xc3, 0x87, 0x19, 0x02, 0x5e, 0xc0, 0xff, 0x3f, + 0x00, 0xee, 0xbf, 0xfb, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0xbf, 0x1b, 0x01, + 0x00, 0xcf, 0xff, 0x00, 0x1e, 0xee, 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xed, + 0xe3, 0x9f, 0x19, 0xc0, 0xb0, 0xcf, 0xff, 0x02, 0x00, 0xec, 0xc7, 0x3d, + 0xd6, 0x18, 0xc7, 0xff, 0xc3, 0xc7, 0x1d, 0x81, 0x00, 0xc0, 0xff, 0x00, + 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, 0xfd, 0xff, 0xe3, 0xdf, 0x1d, 0x60, + 0x07, 0xcf, 0xff, 0x00, 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, 0xfd, 0xef, + 0xe3, 0xdf, 0x1d, 0x60, 0x40, 0xcf, 0xff, 0x06, 0x00, 0xef, 0xdf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0xdf, 0x5d, 0xf0, 0x80, 0xcf, 0xff, 0x00, + 0xfc, 0xec, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xfb, 0x2f, 0x7f, 0x80, 0x5f, + 0xff, 0xc0, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0x07, 0x3f, 0x20, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xf7, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0x3b, 0x5f, 0x20, 0xff, 0xf3, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0x1f, 0xfe, 0xff, 0x03, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0xf9, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x20, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3d, 0x7f, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0x3d, 0x7f, 0x3d, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x07, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xfe, 0xff, - 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, - 0xff, 0x01, 0xff, 0xdf, 0x0f, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, - 0x0f, 0x00, 0xff, 0xdf, 0x0d, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0x01, 0x80, 0x10, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, - 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x0f, - 0xff, 0x01, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x1f, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x03, 0xff, 0x03, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x7f, 0xfe, 0xff, 0x1f, 0x00, 0xff, 0x03, 0xff, 0x03, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xef, 0x0f, 0xff, 0x03, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xbf, 0xff, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7f, 0x00, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x01, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, - 0x6f, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, + 0x01, 0xff, 0xdf, 0x0f, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x0f, + 0x00, 0xff, 0xdf, 0x0d, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0x01, 0x80, 0x10, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x0f, 0xff, + 0x01, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x1f, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x03, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xfe, 0xff, 0x1f, 0x00, 0xff, 0x03, 0xff, 0x03, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xef, 0xff, 0xef, 0x0f, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x01, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x6f, + 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x1f, 0x00, 0xff, 0xff, - 0x3f, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3f, 0xff, 0xaa, 0xff, 0xff, - 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x5f, 0xdc, 0x1f, - 0xcf, 0x0f, 0xff, 0x1f, 0xdc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, - 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x84, 0xfc, 0x2f, 0x3e, 0x50, 0xbd, 0xff, 0xf3, 0xe0, 0x43, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x1f, 0x00, 0xff, 0xff, 0x3f, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3f, 0xff, 0xaa, 0xff, 0xff, 0xff, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x5f, 0xdc, 0x1f, 0xcf, + 0x0f, 0xff, 0x1f, 0xdc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x84, 0xfc, 0x2f, 0x3e, 0x50, 0xbd, 0xff, 0xf3, 0xe0, 0x43, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x78, - 0x0c, 0x00, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x20, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x78, 0x0c, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xfe, 0x03, - 0x3e, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7f, 0xe0, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xfe, 0x03, 0x3e, + 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0xe0, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x1f, - 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, - 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x2f, 0x00, 0xff, 0x03, 0x00, 0x00, 0xfc, 0xe8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, - 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x80, - 0xff, 0x03, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7f, 0x00, 0xff, 0x3f, 0xff, 0x03, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x05, 0x00, 0x00, 0x38, 0xff, 0xff, - 0x3c, 0x00, 0x7e, 0x7e, 0x7e, 0x00, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0x03, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x7f, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x7f, 0x00, 0xf8, 0xe0, 0xff, 0xfd, 0x7f, 0x5f, 0xdb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x03, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x1f, 0x00, 0x00, 0xff, 0x03, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, - 0xff, 0x07, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x7f, 0xfc, 0xfc, 0xfc, 0x1c, 0x00, 0x00, 0x00, 0x00, 0xff, 0xef, - 0xff, 0xff, 0x7f, 0xff, 0xff, 0xb7, 0xff, 0x3f, 0xff, 0x3f, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x07, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, - 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x3f, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, - 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfd, 0xff, 0xff, 0xff, 0xff, - 0xbf, 0x91, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, - 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x37, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xf0, - 0xef, 0xfe, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x1f, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, - 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x3f, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x07, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x00, - 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x7f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, - 0x00, 0x00, 0xc0, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xff, 0x03, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0x70, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x47, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0x00, - 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, - 0x9f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xbd, - 0xff, 0xbf, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, - 0xff, 0x03, 0xef, 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0x9f, 0x19, - 0x81, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0x07, 0xff, 0x83, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, - 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x11, 0x00, - 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x3f, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xe7, 0xff, 0x07, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, - 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1a, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe7, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, - 0x7f, 0x7f, 0x01, 0x00, 0xff, 0x03, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xb4, 0xcb, 0x00, - 0xff, 0x03, 0xbf, 0xfd, 0xff, 0xff, 0xff, 0x7f, 0x7b, 0x01, 0xff, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x0f, 0x00, 0xff, 0x03, 0xf8, 0xff, 0xff, 0xe0, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, - 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xf0, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x07, 0xff, 0x1f, 0xff, 0x01, 0xff, 0x43, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x64, 0xde, 0xff, 0xeb, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xe7, 0xdf, 0xdf, 0xff, 0xff, - 0xff, 0x7b, 0x5f, 0xfc, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, - 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, - 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf9, 0xdb, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x3f, 0xff, 0x43, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0f, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x08, - 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, - 0xff, 0xff, 0x96, 0xfe, 0xf7, 0x0a, 0x84, 0xea, 0x96, 0xaa, 0x96, 0xf7, - 0xf7, 0x5e, 0xff, 0xfb, 0xff, 0x0f, 0xee, 0xfb, 0xff, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x1f, 0xff, + 0xff, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x2f, 0x00, 0xff, 0x03, 0x00, 0x00, 0xfc, 0xe8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x80, 0xff, + 0x03, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0xff, 0x3f, 0xff, 0x03, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0x05, 0x00, 0x00, 0x38, 0xff, 0xff, 0x3c, + 0x00, 0x7e, 0x7e, 0x7e, 0x00, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0x03, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x7f, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x00, 0xf8, 0xe0, 0xff, 0xfd, 0x7f, 0x5f, 0xdb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x03, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, + 0x07, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xfc, 0xfc, 0xfc, 0x1c, 0x00, 0x00, 0x00, 0x00, 0xff, 0xef, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xb7, 0xff, 0x3f, 0xff, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x39, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, - 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0xbf, 0x1d, 0x00, 0x00, 0xe7, - 0x02, 0x00, 0x00, 0x79, 0x00, 0x00, 0x02, 0x24, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, - 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x39, 0xff, 0xff, 0x00, 0x18, - 0xff, 0xff, 0x01, 0x87, 0xff, 0xff, 0x00, 0xd4, 0xfe, 0xff, 0x00, 0xc3, - 0x00, 0x00, 0x01, 0xd2, 0x00, 0x00, 0x01, 0xce, 0x00, 0x00, 0x01, 0xcd, - 0x00, 0x00, 0x01, 0x4f, 0x00, 0x00, 0x01, 0xca, 0x00, 0x00, 0x01, 0xcb, - 0x00, 0x00, 0x01, 0xcf, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x01, 0xd3, - 0x00, 0x00, 0x01, 0xd1, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x01, 0xd5, - 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x01, 0xd6, 0x00, 0x00, 0x01, 0xda, - 0x00, 0x00, 0x01, 0xd9, 0x00, 0x00, 0x01, 0xdb, 0x00, 0x00, 0x00, 0x38, - 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xb1, 0xff, 0xff, 0x01, 0x9f, - 0xff, 0xff, 0x01, 0xc8, 0xff, 0xff, 0x02, 0x28, 0x24, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x33, - 0xff, 0xff, 0x00, 0x26, 0xff, 0xff, 0x01, 0x7e, 0xff, 0xff, 0x01, 0x2b, - 0x2a, 0x00, 0x01, 0x5d, 0xff, 0xff, 0x01, 0x28, 0x2a, 0x00, 0x00, 0x3f, - 0x2a, 0x00, 0x01, 0x3d, 0xff, 0xff, 0x01, 0x45, 0x00, 0x00, 0x01, 0x47, - 0x00, 0x00, 0x00, 0x1f, 0x2a, 0x00, 0x00, 0x1c, 0x2a, 0x00, 0x00, 0x1e, - 0x2a, 0x00, 0x00, 0x2e, 0xff, 0xff, 0x00, 0x32, 0xff, 0xff, 0x00, 0x36, - 0xff, 0xff, 0x00, 0x35, 0xff, 0xff, 0x00, 0x4f, 0xa5, 0x00, 0x00, 0x4b, - 0xa5, 0x00, 0x00, 0x31, 0xff, 0xff, 0x00, 0x28, 0xa5, 0x00, 0x00, 0x44, - 0xa5, 0x00, 0x00, 0x2f, 0xff, 0xff, 0x00, 0x2d, 0xff, 0xff, 0x00, 0xf7, - 0x29, 0x00, 0x00, 0x41, 0xa5, 0x00, 0x00, 0xfd, 0x29, 0x00, 0x00, 0x2b, - 0xff, 0xff, 0x00, 0x2a, 0xff, 0xff, 0x00, 0xe7, 0x29, 0x00, 0x00, 0x43, - 0xa5, 0x00, 0x00, 0x2a, 0xa5, 0x00, 0x00, 0xbb, 0xff, 0xff, 0x00, 0x27, - 0xff, 0xff, 0x00, 0xb9, 0xff, 0xff, 0x00, 0x25, 0xff, 0xff, 0x00, 0x15, - 0xa5, 0x00, 0x00, 0x12, 0xa5, 0x00, 0x02, 0x24, 0x4c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x01, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x54, 0x00, 0x00, 0x01, 0x74, - 0x00, 0x00, 0x01, 0x26, 0x00, 0x00, 0x01, 0x25, 0x00, 0x00, 0x01, 0x40, - 0x00, 0x00, 0x01, 0x3f, 0x00, 0x00, 0x00, 0xda, 0xff, 0xff, 0x00, 0xdb, - 0xff, 0xff, 0x00, 0xe1, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xc1, - 0xff, 0xff, 0x01, 0x08, 0x00, 0x00, 0x00, 0xc2, 0xff, 0xff, 0x00, 0xc7, - 0xff, 0xff, 0x00, 0xd1, 0xff, 0xff, 0x00, 0xca, 0xff, 0xff, 0x00, 0xf8, - 0xff, 0xff, 0x00, 0xaa, 0xff, 0xff, 0x00, 0xb0, 0xff, 0xff, 0x00, 0x07, - 0x00, 0x00, 0x00, 0x8c, 0xff, 0xff, 0x01, 0xc4, 0xff, 0xff, 0x00, 0xa0, - 0xff, 0xff, 0x01, 0xf9, 0xff, 0xff, 0x02, 0x1a, 0x70, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, - 0xff, 0xff, 0x01, 0x50, 0x00, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x00, 0xf1, - 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x00, 0xd0, - 0xff, 0xff, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x0b, 0x00, 0x01, 0x60, 0x1c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0xd0, 0x97, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0xf8, - 0xff, 0xff, 0x02, 0x05, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, - 0xf4, 0xff, 0x00, 0x9e, 0xe7, 0xff, 0x00, 0xc2, 0x89, 0x00, 0x00, 0xdb, - 0xe7, 0xff, 0x00, 0x92, 0xe7, 0xff, 0x00, 0x93, 0xe7, 0xff, 0x00, 0x9c, - 0xe7, 0xff, 0x00, 0x9d, 0xe7, 0xff, 0x00, 0xa4, 0xe7, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x38, 0x8a, 0x00, 0x00, 0x04, 0x8a, 0x00, 0x00, 0xe6, - 0x0e, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc5, 0xff, 0xff, 0x01, 0x41, 0xe2, 0xff, 0x02, 0x1d, - 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0xf8, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x01, 0xaa, 0xff, 0xff, 0x00, 0x4a, - 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x01, 0xb6, - 0xff, 0xff, 0x01, 0xf7, 0xff, 0xff, 0x00, 0xdb, 0xe3, 0xff, 0x01, 0x9c, - 0xff, 0xff, 0x01, 0x90, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff, 0x01, 0x82, - 0xff, 0xff, 0x02, 0x05, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, - 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x01, 0x1c, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x01, 0xa3, 0xe2, 0xff, 0x01, 0x41, 0xdf, 0xff, 0x01, 0xba, - 0xdf, 0xff, 0x00, 0xe4, 0xff, 0xff, 0x02, 0x0b, 0xb1, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0x30, 0x00, 0x00, 0x00, 0xd0, - 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x09, 0xd6, 0xff, 0x01, 0x1a, - 0xf1, 0xff, 0x01, 0x19, 0xd6, 0xff, 0x00, 0xd5, 0xd5, 0xff, 0x00, 0xd8, - 0xd5, 0xff, 0x01, 0xe4, 0xd5, 0xff, 0x01, 0x03, 0xd6, 0xff, 0x01, 0xe1, - 0xd5, 0xff, 0x01, 0xe2, 0xd5, 0xff, 0x01, 0xc1, 0xd5, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xa0, 0xe3, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x02, 0x0c, 0xbc, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xbc, - 0x5a, 0xff, 0x01, 0xa0, 0x03, 0x00, 0x01, 0xfc, 0x75, 0xff, 0x01, 0xd8, - 0x5a, 0xff, 0x00, 0x30, 0x00, 0x00, 0x01, 0xb1, 0x5a, 0xff, 0x01, 0xb5, - 0x5a, 0xff, 0x01, 0xbf, 0x5a, 0xff, 0x01, 0xee, 0x5a, 0xff, 0x01, 0xd6, - 0x5a, 0xff, 0x01, 0xeb, 0x5a, 0xff, 0x01, 0xd0, 0xff, 0xff, 0x01, 0xbd, - 0x5a, 0xff, 0x01, 0xc8, 0x75, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, - 0x68, 0xff, 0x00, 0x60, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, - 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, - 0x00, 0x00, 0x00, 0xd8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, - 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, - 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, - 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x22, - 0x00, 0x00, 0x00, 0xde, 0xff, 0xff, 0x30, 0x0c, 0x31, 0x0d, 0x78, 0x0e, - 0x7f, 0x0f, 0x80, 0x10, 0x81, 0x11, 0x86, 0x12, 0x89, 0x13, 0x8a, 0x13, - 0x8e, 0x14, 0x8f, 0x15, 0x90, 0x16, 0x93, 0x13, 0x94, 0x17, 0x95, 0x18, - 0x96, 0x19, 0x97, 0x1a, 0x9a, 0x1b, 0x9c, 0x19, 0x9d, 0x1c, 0x9e, 0x1d, - 0x9f, 0x1e, 0xa6, 0x1f, 0xa9, 0x1f, 0xae, 0x1f, 0xb1, 0x20, 0xb2, 0x20, - 0xb7, 0x21, 0xbf, 0x22, 0xc5, 0x23, 0xc8, 0x23, 0xcb, 0x23, 0xdd, 0x24, - 0xf2, 0x23, 0xf6, 0x25, 0xf7, 0x26, 0x20, 0x2d, 0x3a, 0x2e, 0x3d, 0x2f, - 0x3e, 0x30, 0x3f, 0x31, 0x40, 0x31, 0x43, 0x32, 0x44, 0x33, 0x45, 0x34, - 0x50, 0x35, 0x51, 0x36, 0x52, 0x37, 0x53, 0x38, 0x54, 0x39, 0x59, 0x3a, - 0x5b, 0x3b, 0x5c, 0x3c, 0x61, 0x3d, 0x63, 0x3e, 0x65, 0x3f, 0x66, 0x40, - 0x68, 0x41, 0x69, 0x42, 0x6a, 0x40, 0x6b, 0x43, 0x6c, 0x44, 0x6f, 0x42, - 0x71, 0x45, 0x72, 0x46, 0x75, 0x47, 0x7d, 0x48, 0x82, 0x49, 0x87, 0x4a, - 0x89, 0x4b, 0x8a, 0x4c, 0x8b, 0x4c, 0x8c, 0x4d, 0x92, 0x4e, 0x9d, 0x4f, - 0x9e, 0x50, 0x45, 0x57, 0x7b, 0x1d, 0x7c, 0x1d, 0x7d, 0x1d, 0x7f, 0x58, - 0x86, 0x59, 0x88, 0x5a, 0x89, 0x5a, 0x8a, 0x5a, 0x8c, 0x5b, 0x8e, 0x5c, - 0x8f, 0x5c, 0xac, 0x5d, 0xad, 0x5e, 0xae, 0x5e, 0xaf, 0x5e, 0xc2, 0x5f, - 0xcc, 0x60, 0xcd, 0x61, 0xce, 0x61, 0xcf, 0x62, 0xd0, 0x63, 0xd1, 0x64, - 0xd5, 0x65, 0xd6, 0x66, 0xd7, 0x67, 0xf0, 0x68, 0xf1, 0x69, 0xf2, 0x6a, - 0xf3, 0x6b, 0xf4, 0x6c, 0xf5, 0x6d, 0xf9, 0x6e, 0xfd, 0x2d, 0xfe, 0x2d, - 0xff, 0x2d, 0x50, 0x69, 0x51, 0x69, 0x52, 0x69, 0x53, 0x69, 0x54, 0x69, - 0x55, 0x69, 0x56, 0x69, 0x57, 0x69, 0x58, 0x69, 0x59, 0x69, 0x5a, 0x69, - 0x5b, 0x69, 0x5c, 0x69, 0x5d, 0x69, 0x5e, 0x69, 0x5f, 0x69, 0x82, 0x00, - 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, - 0x89, 0x00, 0xc0, 0x75, 0xcf, 0x76, 0x80, 0x89, 0x81, 0x8a, 0x82, 0x8b, - 0x85, 0x8c, 0x86, 0x8d, 0x70, 0x9d, 0x71, 0x9d, 0x76, 0x9e, 0x77, 0x9e, - 0x78, 0x9f, 0x79, 0x9f, 0x7a, 0xa0, 0x7b, 0xa0, 0x7c, 0xa1, 0x7d, 0xa1, - 0xb3, 0xa2, 0xba, 0xa3, 0xbb, 0xa3, 0xbc, 0xa4, 0xbe, 0xa5, 0xc3, 0xa2, - 0xcc, 0xa4, 0xda, 0xa6, 0xdb, 0xa6, 0xe5, 0x6a, 0xea, 0xa7, 0xeb, 0xa7, - 0xec, 0x6e, 0xf3, 0xa2, 0xf8, 0xa8, 0xf9, 0xa8, 0xfa, 0xa9, 0xfb, 0xa9, - 0xfc, 0xa4, 0x26, 0xb0, 0x2a, 0xb1, 0x2b, 0xb2, 0x4e, 0xb3, 0x84, 0x08, - 0x62, 0xba, 0x63, 0xbb, 0x64, 0xbc, 0x65, 0xbd, 0x66, 0xbe, 0x6d, 0xbf, - 0x6e, 0xc0, 0x6f, 0xc1, 0x70, 0xc2, 0x7e, 0xc3, 0x7f, 0xc3, 0x7d, 0xcf, - 0x8d, 0xd0, 0x94, 0xd1, 0xab, 0xd2, 0xac, 0xd3, 0xad, 0xd4, 0xb0, 0xd5, - 0xb1, 0xd6, 0xb2, 0xd7, 0xc4, 0xd8, 0xc5, 0xd9, 0xc6, 0xda, 0x07, 0x08, - 0x09, 0x0a, 0x0b, 0x0c, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x0d, 0x06, 0x06, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x0f, 0x10, 0x11, 0x12, 0x06, 0x13, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x14, 0x15, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x07, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, + 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0x91, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x37, + 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xf0, 0xef, + 0xfe, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0xff, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x00, 0xff, + 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7f, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xff, 0x03, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc7, 0xff, 0x70, 0x00, 0xff, 0xff, 0xff, 0xff, 0x47, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0x00, 0xff, + 0x17, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x9f, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xbd, 0xff, + 0xbf, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, + 0x03, 0xef, 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0x9f, 0x19, 0x81, + 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0x07, 0xff, 0x83, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x11, 0x00, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xe7, 0xff, 0x07, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1a, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0x7f, 0x01, 0x00, 0xff, 0x03, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xb4, 0xcb, 0x00, 0xff, + 0x03, 0xbf, 0xfd, 0xff, 0xff, 0xff, 0x7f, 0x7b, 0x01, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x0f, 0x00, 0xff, 0x03, 0xf8, 0xff, 0xff, 0xe0, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xf0, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x07, 0xff, 0x1f, 0xff, 0x01, 0xff, 0x43, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0x64, 0xde, 0xff, 0xeb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xe7, 0xdf, 0xdf, 0xff, 0xff, 0xff, + 0x7b, 0x5f, 0xfc, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf9, 0xdb, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x3f, 0xff, 0x43, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0f, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x08, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, + 0xff, 0x96, 0xfe, 0xf7, 0x0a, 0x84, 0xea, 0x96, 0xaa, 0x96, 0xf7, 0xf7, + 0x5e, 0xff, 0xfb, 0xff, 0x0f, 0xee, 0xfb, 0xff, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x39, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0xbf, 0x1d, 0x00, 0x00, 0xe7, 0x02, + 0x00, 0x00, 0x79, 0x00, 0x00, 0x02, 0x24, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x39, 0xff, 0xff, 0x00, 0x18, 0xff, + 0xff, 0x01, 0x87, 0xff, 0xff, 0x00, 0xd4, 0xfe, 0xff, 0x00, 0xc3, 0x00, + 0x00, 0x01, 0xd2, 0x00, 0x00, 0x01, 0xce, 0x00, 0x00, 0x01, 0xcd, 0x00, + 0x00, 0x01, 0x4f, 0x00, 0x00, 0x01, 0xca, 0x00, 0x00, 0x01, 0xcb, 0x00, + 0x00, 0x01, 0xcf, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x01, 0xd3, 0x00, + 0x00, 0x01, 0xd1, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x01, 0xd5, 0x00, + 0x00, 0x00, 0x82, 0x00, 0x00, 0x01, 0xd6, 0x00, 0x00, 0x01, 0xda, 0x00, + 0x00, 0x01, 0xd9, 0x00, 0x00, 0x01, 0xdb, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xb1, 0xff, 0xff, 0x01, 0x9f, 0xff, + 0xff, 0x01, 0xc8, 0xff, 0xff, 0x02, 0x28, 0x24, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x33, 0xff, + 0xff, 0x00, 0x26, 0xff, 0xff, 0x01, 0x7e, 0xff, 0xff, 0x01, 0x2b, 0x2a, + 0x00, 0x01, 0x5d, 0xff, 0xff, 0x01, 0x28, 0x2a, 0x00, 0x00, 0x3f, 0x2a, + 0x00, 0x01, 0x3d, 0xff, 0xff, 0x01, 0x45, 0x00, 0x00, 0x01, 0x47, 0x00, + 0x00, 0x00, 0x1f, 0x2a, 0x00, 0x00, 0x1c, 0x2a, 0x00, 0x00, 0x1e, 0x2a, + 0x00, 0x00, 0x2e, 0xff, 0xff, 0x00, 0x32, 0xff, 0xff, 0x00, 0x36, 0xff, + 0xff, 0x00, 0x35, 0xff, 0xff, 0x00, 0x4f, 0xa5, 0x00, 0x00, 0x4b, 0xa5, + 0x00, 0x00, 0x31, 0xff, 0xff, 0x00, 0x28, 0xa5, 0x00, 0x00, 0x44, 0xa5, + 0x00, 0x00, 0x2f, 0xff, 0xff, 0x00, 0x2d, 0xff, 0xff, 0x00, 0xf7, 0x29, + 0x00, 0x00, 0x41, 0xa5, 0x00, 0x00, 0xfd, 0x29, 0x00, 0x00, 0x2b, 0xff, + 0xff, 0x00, 0x2a, 0xff, 0xff, 0x00, 0xe7, 0x29, 0x00, 0x00, 0x43, 0xa5, + 0x00, 0x00, 0x2a, 0xa5, 0x00, 0x00, 0xbb, 0xff, 0xff, 0x00, 0x27, 0xff, + 0xff, 0x00, 0xb9, 0xff, 0xff, 0x00, 0x25, 0xff, 0xff, 0x00, 0x15, 0xa5, + 0x00, 0x00, 0x12, 0xa5, 0x00, 0x02, 0x24, 0x4c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x54, 0x00, 0x00, 0x01, 0x74, 0x00, + 0x00, 0x01, 0x26, 0x00, 0x00, 0x01, 0x25, 0x00, 0x00, 0x01, 0x40, 0x00, + 0x00, 0x01, 0x3f, 0x00, 0x00, 0x00, 0xda, 0xff, 0xff, 0x00, 0xdb, 0xff, + 0xff, 0x00, 0xe1, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xc1, 0xff, + 0xff, 0x01, 0x08, 0x00, 0x00, 0x00, 0xc2, 0xff, 0xff, 0x00, 0xc7, 0xff, + 0xff, 0x00, 0xd1, 0xff, 0xff, 0x00, 0xca, 0xff, 0xff, 0x00, 0xf8, 0xff, + 0xff, 0x00, 0xaa, 0xff, 0xff, 0x00, 0xb0, 0xff, 0xff, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x8c, 0xff, 0xff, 0x01, 0xc4, 0xff, 0xff, 0x00, 0xa0, 0xff, + 0xff, 0x01, 0xf9, 0xff, 0xff, 0x02, 0x1a, 0x70, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, + 0xff, 0x01, 0x50, 0x00, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x00, 0xf1, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x00, 0xd0, 0xff, + 0xff, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x0b, 0x00, 0x01, 0x60, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xd0, 0x97, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0xf8, 0xff, + 0xff, 0x02, 0x05, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xf4, + 0xff, 0x00, 0x9e, 0xe7, 0xff, 0x00, 0xc2, 0x89, 0x00, 0x00, 0xdb, 0xe7, + 0xff, 0x00, 0x92, 0xe7, 0xff, 0x00, 0x93, 0xe7, 0xff, 0x00, 0x9c, 0xe7, + 0xff, 0x00, 0x9d, 0xe7, 0xff, 0x00, 0xa4, 0xe7, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x8a, 0x00, 0x00, 0x04, 0x8a, 0x00, 0x00, 0xe6, 0x0e, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc5, 0xff, 0xff, 0x01, 0x41, 0xe2, 0xff, 0x02, 0x1d, 0x8f, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x56, 0x00, 0x00, 0x01, 0xaa, 0xff, 0xff, 0x00, 0x4a, 0x00, + 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, + 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x01, 0xb6, 0xff, + 0xff, 0x01, 0xf7, 0xff, 0xff, 0x00, 0xdb, 0xe3, 0xff, 0x01, 0x9c, 0xff, + 0xff, 0x01, 0x90, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff, 0x01, 0x82, 0xff, + 0xff, 0x02, 0x05, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, + 0x00, 0x00, 0xf0, 0xff, 0xff, 0x01, 0x1c, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x01, 0xa3, 0xe2, 0xff, 0x01, 0x41, 0xdf, 0xff, 0x01, 0xba, 0xdf, + 0xff, 0x00, 0xe4, 0xff, 0xff, 0x02, 0x0b, 0xb1, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0x30, 0x00, 0x00, 0x00, 0xd0, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x09, 0xd6, 0xff, 0x01, 0x1a, 0xf1, + 0xff, 0x01, 0x19, 0xd6, 0xff, 0x00, 0xd5, 0xd5, 0xff, 0x00, 0xd8, 0xd5, + 0xff, 0x01, 0xe4, 0xd5, 0xff, 0x01, 0x03, 0xd6, 0xff, 0x01, 0xe1, 0xd5, + 0xff, 0x01, 0xe2, 0xd5, 0xff, 0x01, 0xc1, 0xd5, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa0, 0xe3, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x02, 0x0c, 0xbc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xbc, 0x5a, + 0xff, 0x01, 0xa0, 0x03, 0x00, 0x01, 0xfc, 0x75, 0xff, 0x01, 0xd8, 0x5a, + 0xff, 0x00, 0x30, 0x00, 0x00, 0x01, 0xb1, 0x5a, 0xff, 0x01, 0xb5, 0x5a, + 0xff, 0x01, 0xbf, 0x5a, 0xff, 0x01, 0xee, 0x5a, 0xff, 0x01, 0xd6, 0x5a, + 0xff, 0x01, 0xeb, 0x5a, 0xff, 0x01, 0xd0, 0xff, 0xff, 0x01, 0xbd, 0x5a, + 0xff, 0x01, 0xc8, 0x75, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x68, + 0xff, 0x00, 0x60, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, 0x00, + 0x00, 0x00, 0xd8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, + 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x22, 0x00, + 0x00, 0x00, 0xde, 0xff, 0xff, 0x30, 0x0c, 0x31, 0x0d, 0x78, 0x0e, 0x7f, + 0x0f, 0x80, 0x10, 0x81, 0x11, 0x86, 0x12, 0x89, 0x13, 0x8a, 0x13, 0x8e, + 0x14, 0x8f, 0x15, 0x90, 0x16, 0x93, 0x13, 0x94, 0x17, 0x95, 0x18, 0x96, + 0x19, 0x97, 0x1a, 0x9a, 0x1b, 0x9c, 0x19, 0x9d, 0x1c, 0x9e, 0x1d, 0x9f, + 0x1e, 0xa6, 0x1f, 0xa9, 0x1f, 0xae, 0x1f, 0xb1, 0x20, 0xb2, 0x20, 0xb7, + 0x21, 0xbf, 0x22, 0xc5, 0x23, 0xc8, 0x23, 0xcb, 0x23, 0xdd, 0x24, 0xf2, + 0x23, 0xf6, 0x25, 0xf7, 0x26, 0x20, 0x2d, 0x3a, 0x2e, 0x3d, 0x2f, 0x3e, + 0x30, 0x3f, 0x31, 0x40, 0x31, 0x43, 0x32, 0x44, 0x33, 0x45, 0x34, 0x50, + 0x35, 0x51, 0x36, 0x52, 0x37, 0x53, 0x38, 0x54, 0x39, 0x59, 0x3a, 0x5b, + 0x3b, 0x5c, 0x3c, 0x61, 0x3d, 0x63, 0x3e, 0x65, 0x3f, 0x66, 0x40, 0x68, + 0x41, 0x69, 0x42, 0x6a, 0x40, 0x6b, 0x43, 0x6c, 0x44, 0x6f, 0x42, 0x71, + 0x45, 0x72, 0x46, 0x75, 0x47, 0x7d, 0x48, 0x82, 0x49, 0x87, 0x4a, 0x89, + 0x4b, 0x8a, 0x4c, 0x8b, 0x4c, 0x8c, 0x4d, 0x92, 0x4e, 0x9d, 0x4f, 0x9e, + 0x50, 0x45, 0x57, 0x7b, 0x1d, 0x7c, 0x1d, 0x7d, 0x1d, 0x7f, 0x58, 0x86, + 0x59, 0x88, 0x5a, 0x89, 0x5a, 0x8a, 0x5a, 0x8c, 0x5b, 0x8e, 0x5c, 0x8f, + 0x5c, 0xac, 0x5d, 0xad, 0x5e, 0xae, 0x5e, 0xaf, 0x5e, 0xc2, 0x5f, 0xcc, + 0x60, 0xcd, 0x61, 0xce, 0x61, 0xcf, 0x62, 0xd0, 0x63, 0xd1, 0x64, 0xd5, + 0x65, 0xd6, 0x66, 0xd7, 0x67, 0xf0, 0x68, 0xf1, 0x69, 0xf2, 0x6a, 0xf3, + 0x6b, 0xf4, 0x6c, 0xf5, 0x6d, 0xf9, 0x6e, 0xfd, 0x2d, 0xfe, 0x2d, 0xff, + 0x2d, 0x50, 0x69, 0x51, 0x69, 0x52, 0x69, 0x53, 0x69, 0x54, 0x69, 0x55, + 0x69, 0x56, 0x69, 0x57, 0x69, 0x58, 0x69, 0x59, 0x69, 0x5a, 0x69, 0x5b, + 0x69, 0x5c, 0x69, 0x5d, 0x69, 0x5e, 0x69, 0x5f, 0x69, 0x82, 0x00, 0x83, + 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, + 0x00, 0xc0, 0x75, 0xcf, 0x76, 0x80, 0x89, 0x81, 0x8a, 0x82, 0x8b, 0x85, + 0x8c, 0x86, 0x8d, 0x70, 0x9d, 0x71, 0x9d, 0x76, 0x9e, 0x77, 0x9e, 0x78, + 0x9f, 0x79, 0x9f, 0x7a, 0xa0, 0x7b, 0xa0, 0x7c, 0xa1, 0x7d, 0xa1, 0xb3, + 0xa2, 0xba, 0xa3, 0xbb, 0xa3, 0xbc, 0xa4, 0xbe, 0xa5, 0xc3, 0xa2, 0xcc, + 0xa4, 0xda, 0xa6, 0xdb, 0xa6, 0xe5, 0x6a, 0xea, 0xa7, 0xeb, 0xa7, 0xec, + 0x6e, 0xf3, 0xa2, 0xf8, 0xa8, 0xf9, 0xa8, 0xfa, 0xa9, 0xfb, 0xa9, 0xfc, + 0xa4, 0x26, 0xb0, 0x2a, 0xb1, 0x2b, 0xb2, 0x4e, 0xb3, 0x84, 0x08, 0x62, + 0xba, 0x63, 0xbb, 0x64, 0xbc, 0x65, 0xbd, 0x66, 0xbe, 0x6d, 0xbf, 0x6e, + 0xc0, 0x6f, 0xc1, 0x70, 0xc2, 0x7e, 0xc3, 0x7f, 0xc3, 0x7d, 0xcf, 0x8d, + 0xd0, 0x94, 0xd1, 0xab, 0xd2, 0xac, 0xd3, 0xad, 0xd4, 0xb0, 0xd5, 0xb1, + 0xd6, 0xb2, 0xd7, 0xc4, 0xd8, 0xc5, 0xd9, 0xc6, 0xda, 0x07, 0x08, 0x09, + 0x0a, 0x0b, 0x0c, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x0d, 0x06, 0x06, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x0f, 0x10, 0x11, 0x12, 0x06, 0x13, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x14, 0x15, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, @@ -1003,24 +924,24 @@ unsigned char STDLIB_WASM[] = { 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x16, 0x17, 0x06, 0x06, - 0x06, 0x18, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x16, 0x17, 0x06, 0x06, 0x06, + 0x18, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x19, 0x06, 0x06, 0x06, 0x06, 0x1a, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x1b, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x1c, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x19, 0x06, 0x06, 0x06, 0x06, 0x1a, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x1b, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x1c, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x1d, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x1d, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, @@ -1030,9 +951,9 @@ unsigned char STDLIB_WASM[] = { 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1e, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1041,45 +962,45 @@ unsigned char STDLIB_WASM[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x54, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, - 0x2b, 0x2b, 0x5b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x4a, 0x56, - 0x56, 0x05, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, - 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x24, 0x50, 0x79, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x38, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, - 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x4e, 0x31, 0x02, 0x4e, 0x0d, 0x0d, - 0x4e, 0x03, 0x4e, 0x00, 0x24, 0x6e, 0x00, 0x4e, 0x31, 0x26, 0x6e, 0x51, - 0x4e, 0x24, 0x50, 0x4e, 0x39, 0x14, 0x81, 0x1b, 0x1d, 0x1d, 0x53, 0x31, - 0x50, 0x31, 0x50, 0x0d, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x1b, 0x53, - 0x24, 0x50, 0x31, 0x02, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, - 0x5c, 0x7b, 0x14, 0x79, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x2d, 0x2b, 0x49, - 0x03, 0x48, 0x03, 0x78, 0x5c, 0x7b, 0x14, 0x00, 0x96, 0x0a, 0x01, 0x2b, - 0x28, 0x06, 0x06, 0x00, 0x2a, 0x06, 0x2a, 0x2a, 0x2b, 0x07, 0xbb, 0xb5, - 0x2b, 0x1e, 0x00, 0x2b, 0x07, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x2b, + 0x2b, 0x5b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x4a, 0x56, 0x56, + 0x05, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x24, 0x50, 0x79, 0x31, 0x50, 0x31, 0x50, + 0x31, 0x38, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x4e, 0x31, 0x02, 0x4e, 0x0d, 0x0d, 0x4e, + 0x03, 0x4e, 0x00, 0x24, 0x6e, 0x00, 0x4e, 0x31, 0x26, 0x6e, 0x51, 0x4e, + 0x24, 0x50, 0x4e, 0x39, 0x14, 0x81, 0x1b, 0x1d, 0x1d, 0x53, 0x31, 0x50, + 0x31, 0x50, 0x0d, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x1b, 0x53, 0x24, + 0x50, 0x31, 0x02, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, + 0x7b, 0x14, 0x79, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x2d, 0x2b, 0x49, 0x03, + 0x48, 0x03, 0x78, 0x5c, 0x7b, 0x14, 0x00, 0x96, 0x0a, 0x01, 0x2b, 0x28, + 0x06, 0x06, 0x00, 0x2a, 0x06, 0x2a, 0x2a, 0x2b, 0x07, 0xbb, 0xb5, 0x2b, + 0x1e, 0x00, 0x2b, 0x07, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0xcd, 0x46, 0xcd, 0x2b, 0x00, - 0x25, 0x2b, 0x07, 0x01, 0x06, 0x01, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x55, 0x56, 0x56, 0x02, 0x24, 0x81, 0x81, 0x81, 0x81, 0x81, 0x15, 0x81, - 0x81, 0x81, 0x00, 0x00, 0x2b, 0x00, 0xb2, 0xd1, 0xb2, 0xd1, 0xb2, 0xd1, - 0xb2, 0xd1, 0x00, 0x00, 0xcd, 0xcc, 0x01, 0x00, 0xd7, 0xd7, 0xd7, 0xd7, - 0xd7, 0x83, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0x1c, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, - 0x31, 0x50, 0x31, 0x02, 0x00, 0x00, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, - 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, - 0x4e, 0x31, 0x50, 0x31, 0x50, 0x4e, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, - 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x02, 0x87, 0xa6, - 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, - 0x87, 0xa6, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x00, 0x00, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0xcd, 0x46, 0xcd, 0x2b, 0x00, 0x25, + 0x2b, 0x07, 0x01, 0x06, 0x01, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x55, + 0x56, 0x56, 0x02, 0x24, 0x81, 0x81, 0x81, 0x81, 0x81, 0x15, 0x81, 0x81, + 0x81, 0x00, 0x00, 0x2b, 0x00, 0xb2, 0xd1, 0xb2, 0xd1, 0xb2, 0xd1, 0xb2, + 0xd1, 0x00, 0x00, 0xcd, 0xcc, 0x01, 0x00, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, + 0x83, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x02, 0x00, 0x00, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x4e, + 0x31, 0x50, 0x31, 0x50, 0x4e, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x02, 0x87, 0xa6, 0x87, + 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, + 0xa6, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x00, 0x00, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1087,61 +1008,61 @@ unsigned char STDLIB_WASM[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0c, 0x00, 0x0c, 0x2a, 0x2b, 0x2b, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x0c, 0x00, 0x0c, 0x2a, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x2a, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x6c, + 0x81, 0x15, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x6c, 0x03, + 0x41, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x2c, 0x56, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x6c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x56, 0x7a, 0x9e, + 0x26, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x01, 0x2b, 0x2b, 0x4f, + 0x56, 0x56, 0x2c, 0x2b, 0x7f, 0x56, 0x56, 0x39, 0x2b, 0x2b, 0x55, 0x56, + 0x56, 0x2b, 0x2b, 0x4f, 0x56, 0x56, 0x2c, 0x2b, 0x7f, 0x56, 0x56, 0x81, + 0x37, 0x75, 0x5b, 0x7b, 0x5c, 0x2b, 0x2b, 0x4f, 0x56, 0x56, 0x02, 0xac, + 0x04, 0x00, 0x00, 0x39, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x2b, 0x2b, 0x4f, + 0x56, 0x56, 0x2c, 0x2b, 0x2b, 0x56, 0x56, 0x32, 0x13, 0x81, 0x57, 0x00, + 0x6f, 0x81, 0x7e, 0xc9, 0xd7, 0x7e, 0x2d, 0x81, 0x81, 0x0e, 0x7e, 0x39, + 0x7f, 0x6f, 0x57, 0x00, 0x81, 0x81, 0x7e, 0x15, 0x00, 0x7e, 0x03, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, - 0x2a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, - 0x6c, 0x81, 0x15, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x6c, - 0x03, 0x41, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x2c, 0x56, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x6c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x25, 0x06, 0x25, - 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, - 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, - 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, - 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x56, 0x7a, - 0x9e, 0x26, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, - 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, - 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x01, 0x2b, 0x2b, - 0x4f, 0x56, 0x56, 0x2c, 0x2b, 0x7f, 0x56, 0x56, 0x39, 0x2b, 0x2b, 0x55, - 0x56, 0x56, 0x2b, 0x2b, 0x4f, 0x56, 0x56, 0x2c, 0x2b, 0x7f, 0x56, 0x56, - 0x81, 0x37, 0x75, 0x5b, 0x7b, 0x5c, 0x2b, 0x2b, 0x4f, 0x56, 0x56, 0x02, - 0xac, 0x04, 0x00, 0x00, 0x39, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x2b, 0x2b, - 0x4f, 0x56, 0x56, 0x2c, 0x2b, 0x2b, 0x56, 0x56, 0x32, 0x13, 0x81, 0x57, - 0x00, 0x6f, 0x81, 0x7e, 0xc9, 0xd7, 0x7e, 0x2d, 0x81, 0x81, 0x0e, 0x7e, - 0x39, 0x7f, 0x6f, 0x57, 0x00, 0x81, 0x81, 0x7e, 0x15, 0x00, 0x7e, 0x03, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x07, 0x2b, 0x24, 0x2b, 0x97, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x80, 0x81, 0x81, 0x81, 0x81, 0x39, 0xbb, 0x2a, 0x2b, 0x2b, 0x2b, + 0x2b, 0x24, 0x2b, 0x97, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x80, 0x81, 0x81, 0x81, 0x81, 0x39, 0xbb, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x01, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0xc9, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xd0, 0x0d, 0x00, - 0x4e, 0x31, 0x02, 0xb4, 0xc1, 0xc1, 0xd7, 0xd7, 0x24, 0x50, 0x31, 0x50, - 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, - 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, - 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0xd7, 0xd7, 0x53, 0xc1, 0x47, 0xd4, - 0xd7, 0xd7, 0xd7, 0x05, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0xc9, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xd0, 0x0d, 0x00, 0x4e, + 0x31, 0x02, 0xb4, 0xc1, 0xc1, 0xd7, 0xd7, 0x24, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0xd7, 0xd7, 0x53, 0xc1, 0x47, 0xd4, 0xd7, + 0xd7, 0xd7, 0x05, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x07, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1149,74 +1070,74 @@ unsigned char STDLIB_WASM[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x4e, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, - 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x24, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x00, 0x00, + 0x00, 0x00, 0x4e, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x79, 0x5c, 0x7b, 0x5c, 0x7b, - 0x4f, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, - 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x2d, 0x2b, 0x2b, - 0x79, 0x14, 0x5c, 0x7b, 0x5c, 0x2d, 0x79, 0x2a, 0x5c, 0x27, 0x5c, 0x7b, - 0x5c, 0x7b, 0x5c, 0x7b, 0xa4, 0x00, 0x0a, 0xb4, 0x5c, 0x7b, 0x5c, 0x7b, - 0x4f, 0x03, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x79, 0x5c, 0x7b, 0x5c, 0x7b, 0x4f, + 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, + 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x2d, 0x2b, 0x2b, 0x79, + 0x14, 0x5c, 0x7b, 0x5c, 0x2d, 0x79, 0x2a, 0x5c, 0x27, 0x5c, 0x7b, 0x5c, + 0x7b, 0x5c, 0x7b, 0xa4, 0x00, 0x0a, 0xb4, 0x5c, 0x7b, 0x5c, 0x7b, 0x4f, + 0x03, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, + 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x00, 0x48, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x00, 0x48, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x24, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x07, 0x00, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x07, 0x00, 0x00, 0x00, 0x00, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, + 0x00, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x07, 0x00, 0x00, 0x00, 0x00, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x55, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x27, 0x51, 0x6f, 0x77, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, - 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x8e, - 0x92, 0x97, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xb4, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x27, 0x51, 0x6f, 0x77, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, + 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x8e, 0x92, + 0x97, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xb4, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1226,24 +1147,23 @@ unsigned char STDLIB_WASM[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc9, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc6, 0xc9, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, - 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, + 0x00, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1253,82 +1173,37 @@ unsigned char STDLIB_WASM[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, - 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, - 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x20, - 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x04, 0x20, - 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x08, 0x20, - 0x00, 0x00, 0x09, 0x20, 0x00, 0x00, 0x0a, 0x20, 0x00, 0x00, 0x28, 0x20, - 0x00, 0x00, 0x29, 0x20, 0x00, 0x00, 0x5f, 0x20, 0x00, 0x00, 0x00, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x05, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x00, 0x0c, 0x0b, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x2e, - 0x77, 0x61, 0x73, 0x6d, 0x01, 0xc9, 0x04, 0x2c, 0x00, 0x2a, 0x5f, 0x5f, - 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, - 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, - 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x61, 0x72, 0x67, 0x73, - 0x5f, 0x67, 0x65, 0x74, 0x01, 0x30, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, - 0x65, 0x77, 0x31, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x02, 0x2b, 0x5f, 0x5f, 0x69, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, - 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, - 0x78, 0x69, 0x74, 0x03, 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, - 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x04, 0x13, - 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x77, 0x65, - 0x61, 0x6b, 0x3a, 0x6d, 0x61, 0x69, 0x6e, 0x05, 0x12, 0x5f, 0x5f, 0x77, - 0x61, 0x73, 0x6d, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x5f, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x06, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x07, - 0x0a, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x08, - 0x06, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x09, 0x04, 0x66, 0x72, 0x65, - 0x65, 0x0a, 0x06, 0x63, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x0b, 0x07, 0x72, - 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x0c, 0x05, 0x5f, 0x45, 0x78, 0x69, - 0x74, 0x0d, 0x0b, 0x5f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x76, 0x6f, - 0x69, 0x64, 0x0e, 0x0f, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x61, - 0x72, 0x67, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x0f, 0x15, 0x5f, 0x5f, 0x77, - 0x61, 0x73, 0x69, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x10, 0x10, 0x5f, 0x5f, 0x77, 0x61, - 0x73, 0x69, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, 0x74, - 0x11, 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x12, 0x11, 0x5f, 0x5f, 0x77, - 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x74, 0x6f, - 0x72, 0x73, 0x13, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x70, 0x79, 0x14, 0x06, - 0x6d, 0x65, 0x6d, 0x73, 0x65, 0x74, 0x15, 0x06, 0x73, 0x74, 0x72, 0x6c, - 0x65, 0x6e, 0x16, 0x08, 0x69, 0x73, 0x77, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x17, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x6d, 0x70, 0x18, 0x06, 0x6d, 0x65, - 0x6d, 0x63, 0x68, 0x72, 0x19, 0x06, 0x73, 0x74, 0x72, 0x63, 0x6d, 0x70, - 0x1a, 0x08, 0x74, 0x6f, 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x1b, 0x07, - 0x63, 0x61, 0x73, 0x65, 0x6d, 0x61, 0x70, 0x1c, 0x08, 0x74, 0x6f, 0x77, - 0x75, 0x70, 0x70, 0x65, 0x72, 0x1d, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, - 0x6d, 0x70, 0x1e, 0x08, 0x69, 0x73, 0x77, 0x75, 0x70, 0x70, 0x65, 0x72, - 0x1f, 0x07, 0x6d, 0x65, 0x6d, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x08, 0x69, - 0x73, 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x21, 0x07, 0x69, 0x73, 0x62, - 0x6c, 0x61, 0x6e, 0x6b, 0x22, 0x08, 0x69, 0x73, 0x77, 0x62, 0x6c, 0x61, - 0x6e, 0x6b, 0x23, 0x08, 0x69, 0x73, 0x77, 0x64, 0x69, 0x67, 0x69, 0x74, - 0x24, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x61, 0x74, 0x25, 0x09, 0x5f, - 0x5f, 0x73, 0x74, 0x70, 0x6e, 0x63, 0x70, 0x79, 0x26, 0x07, 0x73, 0x74, - 0x72, 0x6e, 0x63, 0x70, 0x79, 0x27, 0x09, 0x69, 0x73, 0x77, 0x78, 0x64, - 0x69, 0x67, 0x69, 0x74, 0x28, 0x06, 0x77, 0x63, 0x73, 0x6c, 0x65, 0x6e, - 0x29, 0x06, 0x77, 0x63, 0x73, 0x63, 0x68, 0x72, 0x2a, 0x08, 0x69, 0x73, - 0x77, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2b, 0x08, 0x69, 0x73, 0x77, 0x61, - 0x6c, 0x6e, 0x75, 0x6d, 0x07, 0x33, 0x02, 0x00, 0x0f, 0x5f, 0x5f, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x01, 0x1f, 0x47, 0x4f, 0x54, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x5f, 0x5f, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x09, 0x0a, 0x01, - 0x00, 0x07, 0x2e, 0x72, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x00, 0x26, 0x09, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x73, 0x01, 0x0c, 0x70, + 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, + 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x20, 0x00, + 0x00, 0x02, 0x20, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x04, 0x20, 0x00, + 0x00, 0x05, 0x20, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, + 0x00, 0x09, 0x20, 0x00, 0x00, 0x0a, 0x20, 0x00, 0x00, 0x28, 0x20, 0x00, + 0x00, 0x29, 0x20, 0x00, 0x00, 0x5f, 0x20, 0x00, 0x00, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x01, 0x09, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x65, 0x72, 0x73, 0x02, 0x08, 0x6c, 0x61, 0x6e, 0x67, + 0x75, 0x61, 0x67, 0x65, 0x01, 0x03, 0x43, 0x31, 0x31, 0x00, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x2d, 0x62, 0x79, 0x01, - 0x05, 0x63, 0x6c, 0x61, 0x6e, 0x67, 0x06, 0x31, 0x39, 0x2e, 0x31, 0x2e, - 0x37, 0x00, 0x56, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x05, 0x2b, 0x0b, 0x62, 0x75, - 0x6c, 0x6b, 0x2d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2b, 0x0a, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2b, 0x0f, 0x6d, - 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x73, 0x2b, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2b, 0x08, 0x73, 0x69, 0x67, - 0x6e, 0x2d, 0x65, 0x78, 0x74 + 0x05, 0x63, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x31, 0x39, 0x2e, 0x31, 0x2e, + 0x35, 0x2d, 0x77, 0x61, 0x73, 0x69, 0x2d, 0x73, 0x64, 0x6b, 0x20, 0x28, + 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x6c, 0x76, 0x6d, 0x2f, + 0x6c, 0x6c, 0x76, 0x6d, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x20, 0x61, 0x62, 0x34, 0x62, 0x35, 0x61, 0x32, 0x64, 0x62, 0x35, 0x38, + 0x32, 0x39, 0x35, 0x38, 0x61, 0x66, 0x31, 0x65, 0x65, 0x33, 0x30, 0x38, + 0x61, 0x37, 0x39, 0x30, 0x63, 0x66, 0x64, 0x62, 0x34, 0x32, 0x62, 0x64, + 0x32, 0x34, 0x37, 0x32, 0x30, 0x29, 0x00, 0x67, 0x0f, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x06, 0x2b, 0x0f, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x2b, 0x0b, 0x62, 0x75, 0x6c, 0x6b, + 0x2d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2b, 0x08, 0x73, 0x69, 0x67, + 0x6e, 0x2d, 0x65, 0x78, 0x74, 0x2b, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2b, 0x0a, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2b, 0x0f, + 0x62, 0x75, 0x6c, 0x6b, 0x2d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2d, + 0x6f, 0x70, 0x74 }; -unsigned int STDLIB_WASM_LEN = 15965; +unsigned int STDLIB_WASM_LEN = 14463; From 92678f0fc58f8b3055f2c26abb81c8ccc4bece5c Mon Sep 17 00:00:00 2001 From: WillLillis Date: Sun, 21 Sep 2025 13:55:44 -0400 Subject: [PATCH 495/663] fix(rust): pass correct fd to C lib's ts_tree_print_dot_graph Co-authored-by: Amaan Qureshi --- crates/cli/src/tests/parser_test.rs | 1 - lib/binding_rust/lib.rs | 8 +++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/crates/cli/src/tests/parser_test.rs b/crates/cli/src/tests/parser_test.rs index 72f917b3..0cd267c1 100644 --- a/crates/cli/src/tests/parser_test.rs +++ b/crates/cli/src/tests/parser_test.rs @@ -88,7 +88,6 @@ fn test_parsing_with_logging() { } #[test] -#[cfg(unix)] fn test_parsing_with_debug_graph_enabled() { use std::io::{BufRead, BufReader, Seek}; diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs index 6938c1db..c641a5b9 100644 --- a/lib/binding_rust/lib.rs +++ b/lib/binding_rust/lib.rs @@ -1386,6 +1386,11 @@ impl Drop for Parser { } } +#[cfg(windows)] +extern "C" { + fn _open_osfhandle(osfhandle: isize, flags: core::ffi::c_int) -> core::ffi::c_int; +} + impl Tree { /// Get the root node of the syntax tree. #[doc(alias = "ts_tree_root_node")] @@ -1495,7 +1500,8 @@ impl Tree { #[cfg(windows)] { let handle = file.as_raw_handle(); - unsafe { ffi::ts_tree_print_dot_graph(self.0.as_ptr(), handle as i32) } + let fd = unsafe { _open_osfhandle(handle as isize, 0) }; + unsafe { ffi::ts_tree_print_dot_graph(self.0.as_ptr(), fd) } } } } From 9b914885f1174b03cba72fe45787c290caf94ee6 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 22 Sep 2025 09:24:30 -0700 Subject: [PATCH 496/663] Fix issues preventing releases from successfully publishing (#4867) * Correct the path to the CLI npm package in release job * Specify a version for tree-sitter-language * Fix path to README in doc include --- .github/workflows/release.yml | 2 +- Cargo.toml | 3 ++- lib/binding_rust/lib.rs | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 803a69ec..6dc78f09 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -78,7 +78,7 @@ jobs: strategy: fail-fast: false matrix: - directory: [cli/npm, lib/binding_web] + directory: [crates/cli/npm, lib/binding_web] steps: - name: Checkout repository uses: actions/checkout@v5 diff --git a/Cargo.toml b/Cargo.toml index b2bf25ca..f8f3313e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -153,8 +153,9 @@ webbrowser = "1.0.5" tree-sitter = { version = "0.27.0", path = "./lib" } tree-sitter-generate = { version = "0.27.0", path = "./crates/generate" } -tree-sitter-language = { path = "./crates/language" } tree-sitter-loader = { version = "0.27.0", path = "./crates/loader" } tree-sitter-config = { version = "0.27.0", path = "./crates/config" } tree-sitter-highlight = { version = "0.27.0", path = "./crates/highlight" } tree-sitter-tags = { version = "0.27.0", path = "./crates/tags" } + +tree-sitter-language = { version = "0.1.4", path = "./crates/language" } diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs index c641a5b9..23506e03 100644 --- a/lib/binding_rust/lib.rs +++ b/lib/binding_rust/lib.rs @@ -1,4 +1,4 @@ -#![cfg_attr(not(any(test, doctest)), doc = include_str!("../README.md"))] +#![cfg_attr(not(any(test, doctest)), doc = include_str!("./README.md"))] #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(docsrs, feature(doc_cfg))] From 95ab17e444bf30f08dc9206164c0c3aee1f8ecca Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sun, 21 Sep 2025 23:07:59 -0400 Subject: [PATCH 497/663] build: define _DARWIN_C_SOURCE --- CMakeLists.txt | 2 +- Makefile | 2 +- Package.swift | 1 + build.zig | 1 + crates/xtask/src/build_wasm.rs | 1 + lib/binding_rust/build.rs | 1 + 6 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bc8bf049..f0d1d813 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,7 +81,7 @@ set_target_properties(tree-sitter SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}" DEFINE_SYMBOL "") -target_compile_definitions(tree-sitter PRIVATE _POSIX_C_SOURCE=200112L _DEFAULT_SOURCE) +target_compile_definitions(tree-sitter PRIVATE _POSIX_C_SOURCE=200112L _DEFAULT_SOURCE _DARWIN_C_SOURCE) include(GNUInstallDirs) diff --git a/Makefile b/Makefile index abd765b1..f8106fa0 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ OBJ := $(SRC:.c=.o) ARFLAGS := rcs CFLAGS ?= -O3 -Wall -Wextra -Wshadow -Wpedantic -Werror=incompatible-pointer-types override CFLAGS += -std=c11 -fPIC -fvisibility=hidden -override CFLAGS += -D_POSIX_C_SOURCE=200112L -D_DEFAULT_SOURCE +override CFLAGS += -D_POSIX_C_SOURCE=200112L -D_DEFAULT_SOURCE -D_DARWIN_C_SOURCE override CFLAGS += -Ilib/src -Ilib/src/wasm -Ilib/include # ABI versioning diff --git a/Package.swift b/Package.swift index 572ba684..a92d3d14 100644 --- a/Package.swift +++ b/Package.swift @@ -27,6 +27,7 @@ let package = Package( .headerSearchPath("src"), .define("_POSIX_C_SOURCE", to: "200112L"), .define("_DEFAULT_SOURCE"), + .define("_DARWIN_C_SOURCE"), ]), ], cLanguageStandard: .c11 diff --git a/build.zig b/build.zig index 66a448cb..bd7a0721 100644 --- a/build.zig +++ b/build.zig @@ -40,6 +40,7 @@ pub fn build(b: *std.Build) !void { lib.root_module.addCMacro("_POSIX_C_SOURCE", "200112L"); lib.root_module.addCMacro("_DEFAULT_SOURCE", ""); + lib.root_module.addCMacro("_DARWIN_C_SOURCE", ""); if (wasm) { if (b.lazyDependency(wasmtimeDep(target.result), .{})) |wasmtime| { diff --git a/crates/xtask/src/build_wasm.rs b/crates/xtask/src/build_wasm.rs index 67ca59d6..8b1f78d5 100644 --- a/crates/xtask/src/build_wasm.rs +++ b/crates/xtask/src/build_wasm.rs @@ -195,6 +195,7 @@ pub fn run_wasm(args: &BuildWasm) -> Result<()> { "-D", "NDEBUG=", "-D", "_POSIX_C_SOURCE=200112L", "-D", "_DEFAULT_SOURCE=", + "-D", "_DARWIN_C_SOURCE=", "-I", "lib/src", "-I", "lib/include", "--js-library", "lib/binding_web/lib/imports.js", diff --git a/lib/binding_rust/build.rs b/lib/binding_rust/build.rs index 7268d615..624001bc 100644 --- a/lib/binding_rust/build.rs +++ b/lib/binding_rust/build.rs @@ -49,6 +49,7 @@ fn main() { .include(&include_path) .define("_POSIX_C_SOURCE", "200112L") .define("_DEFAULT_SOURCE", None) + .define("_DARWIN_C_SOURCE", None) .warnings(false) .file(src_path.join("lib.c")) .compile("tree-sitter"); From e3294c3faf343bb83b3af09ad9d17eddda96a0cd Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 22 Sep 2025 12:54:15 -0700 Subject: [PATCH 498/663] build: bump tree-sitter-language to 0.1.5 --- Cargo.lock | 2 +- Cargo.toml | 2 +- crates/language/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 63d88dcf..02ce3488 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1989,7 +1989,7 @@ dependencies = [ [[package]] name = "tree-sitter-language" -version = "0.1.4" +version = "0.1.5" [[package]] name = "tree-sitter-loader" diff --git a/Cargo.toml b/Cargo.toml index f8f3313e..94ad08d2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -158,4 +158,4 @@ tree-sitter-config = { version = "0.27.0", path = "./crates/config" } tree-sitter-highlight = { version = "0.27.0", path = "./crates/highlight" } tree-sitter-tags = { version = "0.27.0", path = "./crates/tags" } -tree-sitter-language = { version = "0.1.4", path = "./crates/language" } +tree-sitter-language = { version = "0.1.5", path = "./crates/language" } diff --git a/crates/language/Cargo.toml b/crates/language/Cargo.toml index 5b974117..4de0f339 100644 --- a/crates/language/Cargo.toml +++ b/crates/language/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "tree-sitter-language" description = "The tree-sitter Language type, used by the library and by language implementations" -version = "0.1.4" +version = "0.1.5" authors.workspace = true edition.workspace = true rust-version = "1.77" From cf89840460040b295234121aaba0505eba3aa41e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Sep 2025 21:18:29 +0000 Subject: [PATCH 499/663] build(deps): bump the npm group across 1 directory with 6 updates Bumps the npm group with 6 updates in the /lib/binding_web directory: | Package | From | To | | --- | --- | --- | | [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) | `9.35.0` | `9.36.0` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `24.5.0` | `24.5.2` | | [esbuild](https://github.com/evanw/esbuild) | `0.25.9` | `0.25.10` | | [eslint](https://github.com/eslint/eslint) | `9.35.0` | `9.36.0` | | [typescript](https://github.com/microsoft/TypeScript) | `5.8.3` | `5.9.2` | | [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.44.0` | `8.44.1` | Updates `@eslint/js` from 9.35.0 to 9.36.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/commits/v9.36.0/packages/js) Updates `@types/node` from 24.5.0 to 24.5.2 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `esbuild` from 0.25.9 to 0.25.10 - [Release notes](https://github.com/evanw/esbuild/releases) - [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md) - [Commits](https://github.com/evanw/esbuild/compare/v0.25.9...v0.25.10) Updates `eslint` from 9.35.0 to 9.36.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v9.35.0...v9.36.0) Updates `typescript` from 5.8.3 to 5.9.2 - [Release notes](https://github.com/microsoft/TypeScript/releases) - [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release-publish.yml) - [Commits](https://github.com/microsoft/TypeScript/compare/v5.8.3...v5.9.2) Updates `typescript-eslint` from 8.44.0 to 8.44.1 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.1/packages/typescript-eslint) --- updated-dependencies: - dependency-name: "@eslint/js" dependency-version: 9.36.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: "@types/node" dependency-version: 24.5.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm - dependency-name: esbuild dependency-version: 0.25.10 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm - dependency-name: eslint dependency-version: 9.36.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: typescript dependency-version: 5.9.2 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: typescript-eslint dependency-version: 8.44.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm ... Signed-off-by: dependabot[bot] --- lib/binding_web/package-lock.json | 356 +++++++++++++++--------------- 1 file changed, 178 insertions(+), 178 deletions(-) diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json index 49d63180..e5c20f7d 100644 --- a/lib/binding_web/package-lock.json +++ b/lib/binding_web/package-lock.json @@ -98,9 +98,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", "cpu": [ "ppc64" ], @@ -115,9 +115,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", "cpu": [ "arm" ], @@ -132,9 +132,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", "cpu": [ "arm64" ], @@ -149,9 +149,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", "cpu": [ "x64" ], @@ -166,9 +166,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", "cpu": [ "arm64" ], @@ -183,9 +183,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", "cpu": [ "x64" ], @@ -200,9 +200,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", "cpu": [ "arm64" ], @@ -217,9 +217,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", "cpu": [ "x64" ], @@ -234,9 +234,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", "cpu": [ "arm" ], @@ -251,9 +251,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", "cpu": [ "arm64" ], @@ -268,9 +268,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", "cpu": [ "ia32" ], @@ -285,9 +285,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", "cpu": [ "loong64" ], @@ -302,9 +302,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", "cpu": [ "mips64el" ], @@ -319,9 +319,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", "cpu": [ "ppc64" ], @@ -336,9 +336,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", "cpu": [ "riscv64" ], @@ -353,9 +353,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", "cpu": [ "s390x" ], @@ -370,9 +370,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", "cpu": [ "x64" ], @@ -387,9 +387,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", "cpu": [ "arm64" ], @@ -404,9 +404,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", "cpu": [ "x64" ], @@ -421,9 +421,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", "cpu": [ "arm64" ], @@ -438,9 +438,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", "cpu": [ "x64" ], @@ -455,9 +455,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", "cpu": [ "arm64" ], @@ -472,9 +472,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", "cpu": [ "x64" ], @@ -489,9 +489,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", "cpu": [ "arm64" ], @@ -506,9 +506,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", "cpu": [ "ia32" ], @@ -523,9 +523,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", "cpu": [ "x64" ], @@ -644,9 +644,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz", - "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==", + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", + "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", "dev": true, "license": "MIT", "engines": { @@ -1206,9 +1206,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.0.tgz", - "integrity": "sha512-y1dMvuvJspJiPSDZUQ+WMBvF7dpnEqN4x9DDC9ie5Fs/HUZJA3wFp7EhHoVaKX/iI0cRoECV8X2jL8zi0xrHCg==", + "version": "24.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", + "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1216,17 +1216,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.0.tgz", - "integrity": "sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.1.tgz", + "integrity": "sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.44.0", - "@typescript-eslint/type-utils": "8.44.0", - "@typescript-eslint/utils": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0", + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/type-utils": "8.44.1", + "@typescript-eslint/utils": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -1240,7 +1240,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.44.0", + "@typescript-eslint/parser": "^8.44.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -1256,16 +1256,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.0.tgz", - "integrity": "sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.1.tgz", + "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.44.0", - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/typescript-estree": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0", + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "debug": "^4.3.4" }, "engines": { @@ -1281,14 +1281,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.0.tgz", - "integrity": "sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.1.tgz", + "integrity": "sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.44.0", - "@typescript-eslint/types": "^8.44.0", + "@typescript-eslint/tsconfig-utils": "^8.44.1", + "@typescript-eslint/types": "^8.44.1", "debug": "^4.3.4" }, "engines": { @@ -1303,14 +1303,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.0.tgz", - "integrity": "sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.1.tgz", + "integrity": "sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0" + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1321,9 +1321,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.0.tgz", - "integrity": "sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.1.tgz", + "integrity": "sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==", "dev": true, "license": "MIT", "engines": { @@ -1338,15 +1338,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.0.tgz", - "integrity": "sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.1.tgz", + "integrity": "sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/typescript-estree": "8.44.0", - "@typescript-eslint/utils": "8.44.0", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/utils": "8.44.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -1363,9 +1363,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.0.tgz", - "integrity": "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.1.tgz", + "integrity": "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==", "dev": true, "license": "MIT", "engines": { @@ -1377,16 +1377,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.0.tgz", - "integrity": "sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.1.tgz", + "integrity": "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.44.0", - "@typescript-eslint/tsconfig-utils": "8.44.0", - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0", + "@typescript-eslint/project-service": "8.44.1", + "@typescript-eslint/tsconfig-utils": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -1432,16 +1432,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.0.tgz", - "integrity": "sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.1.tgz", + "integrity": "sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.44.0", - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/typescript-estree": "8.44.0" + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1456,13 +1456,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.0.tgz", - "integrity": "sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.1.tgz", + "integrity": "sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/types": "8.44.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -1950,9 +1950,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -1963,32 +1963,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" } }, "node_modules/escape-string-regexp": { @@ -2005,9 +2005,9 @@ } }, "node_modules/eslint": { - "version": "9.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz", - "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==", + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", + "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2017,7 +2017,7 @@ "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.35.0", + "@eslint/js": "9.36.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -3612,16 +3612,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.44.0.tgz", - "integrity": "sha512-ib7mCkYuIzYonCq9XWF5XNw+fkj2zg629PSa9KNIQ47RXFF763S5BIX4wqz1+FLPogTZoiw8KmCiRPRa8bL3qw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.44.1.tgz", + "integrity": "sha512-0ws8uWGrUVTjEeN2OM4K1pLKHK/4NiNP/vz6ns+LjT/6sqpaYzIVFajZb1fj/IDwpsrrHb3Jy0Qm5u9CPcKaeg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.44.0", - "@typescript-eslint/parser": "8.44.0", - "@typescript-eslint/typescript-estree": "8.44.0", - "@typescript-eslint/utils": "8.44.0" + "@typescript-eslint/eslint-plugin": "8.44.1", + "@typescript-eslint/parser": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/utils": "8.44.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" From 47c9256976c0624ea762f48298c49f9cc3243453 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Mon, 22 Sep 2025 21:02:17 -0400 Subject: [PATCH 500/663] test: clean up parser hang test --- crates/cli/src/tests.rs | 1 - crates/cli/src/tests/parser_hang_test.rs | 104 ----------------------- crates/cli/src/tests/parser_test.rs | 58 ++++++++++++- 3 files changed, 55 insertions(+), 108 deletions(-) delete mode 100644 crates/cli/src/tests/parser_hang_test.rs diff --git a/crates/cli/src/tests.rs b/crates/cli/src/tests.rs index c64744f8..cc4d336d 100644 --- a/crates/cli/src/tests.rs +++ b/crates/cli/src/tests.rs @@ -5,7 +5,6 @@ mod helpers; mod highlight_test; mod language_test; mod node_test; -mod parser_hang_test; mod parser_test; mod pathological_test; mod query_test; diff --git a/crates/cli/src/tests/parser_hang_test.rs b/crates/cli/src/tests/parser_hang_test.rs deleted file mode 100644 index 1ff9d17e..00000000 --- a/crates/cli/src/tests/parser_hang_test.rs +++ /dev/null @@ -1,104 +0,0 @@ -// For some reasons `Command::spawn` doesn't work in CI env for many exotic arches. -#![cfg(all(any(target_arch = "x86_64", target_arch = "x86"), not(sanitizing)))] - -use std::{ - env::VarError, - process::{Command, Stdio}, -}; - -use tree_sitter::Parser; -use tree_sitter_generate::load_grammar_file; - -use super::generate_parser; -use crate::tests::helpers::fixtures::{fixtures_dir, get_test_language}; - -// The `sanitizing` cfg is required to don't run tests under specific sunitizer -// because they don't work well with subprocesses _(it's an assumption)_. -// -// Below are two alternative examples of how to disable tests for some arches -// if a way with excluding the whole mod from compilation wouldn't work well. -// -// XXX: Also may be it makes sense to keep such tests as ignored by default -// to omit surprises and enable them on CI by passing an extra option explicitly: -// -// > cargo test -- --include-ignored -// -// #[cfg(all(any(target_arch = "x86_64", target_arch = "x86"), not(sanitizing)))] -// #[cfg_attr(not(all(any(target_arch = "x86_64", target_arch = "x86"), not(sanitizing))), ignore)] -// -#[test] -fn test_grammar_that_should_hang_and_not_segfault() { - let parent_sleep_millis = 1000; - let test_name = "test_grammar_that_should_hang_and_not_segfault"; - let test_var = "CARGO_HANG_TEST"; - - eprintln!(" {test_name}"); - - let tests_exec_path = std::env::args() - .next() - .expect("Failed to get tests executable path"); - - match std::env::var(test_var) { - Ok(v) if v == test_name => { - eprintln!(" child process id {}", std::process::id()); - hang_test(); - } - - Err(VarError::NotPresent) => { - eprintln!(" parent process id {}", std::process::id()); - let mut command = Command::new(tests_exec_path); - command.arg(test_name).env(test_var, test_name); - - if std::env::args().any(|x| x == "--nocapture") { - command.arg("--nocapture"); - } else { - command.stdout(Stdio::null()).stderr(Stdio::null()); - } - - match command.spawn() { - Ok(mut child) => { - std::thread::sleep(std::time::Duration::from_millis(parent_sleep_millis)); - match child.try_wait() { - Ok(Some(status)) if status.success() => { - panic!("Child didn't hang and exited successfully") - } - Ok(Some(status)) => panic!( - "Child didn't hang and exited with status code: {:?}", - status.code() - ), - _ => (), - } - if let Err(e) = child.kill() { - eprintln!( - "Failed to kill hang test's process id: {}, error: {e}", - child.id() - ); - } - } - Err(e) => panic!("{e}"), - } - } - - Err(e) => panic!("Env var error: {e}"), - - _ => unreachable!(), - } -} - -fn hang_test() { - let test_grammar_dir = fixtures_dir() - .join("test_grammars") - .join("get_col_should_hang_not_crash"); - - let grammar_json = load_grammar_file(&test_grammar_dir.join("grammar.js"), None).unwrap(); - let (parser_name, parser_code) = generate_parser(grammar_json.as_str()).unwrap(); - - let language = get_test_language(&parser_name, &parser_code, Some(test_grammar_dir.as_path())); - - let mut parser = Parser::new(); - parser.set_language(&language).unwrap(); - - let code_that_should_hang = "\nHello"; - - parser.parse(code_that_should_hang, None).unwrap(); -} diff --git a/crates/cli/src/tests/parser_test.rs b/crates/cli/src/tests/parser_test.rs index 0cd267c1..f1d50319 100644 --- a/crates/cli/src/tests/parser_test.rs +++ b/crates/cli/src/tests/parser_test.rs @@ -1,12 +1,17 @@ use std::{ ops::ControlFlow, - sync::atomic::{AtomicUsize, Ordering}, - thread, time, + sync::{ + atomic::{AtomicUsize, Ordering}, + mpsc, + }, + thread, + time::{self, Duration}, }; use tree_sitter::{ Decode, IncludedRangesError, InputEdit, LogType, ParseOptions, ParseState, Parser, Point, Range, }; +use tree_sitter_generate::load_grammar_file; use tree_sitter_proc_macro::retry; use super::helpers::{ @@ -17,7 +22,11 @@ use super::helpers::{ use crate::{ fuzz::edits::Edit, parse::perform_edit, - tests::{generate_parser, helpers::fixtures::get_test_fixture_language, invert_edit}, + tests::{ + generate_parser, + helpers::fixtures::{fixtures_dir, get_test_fixture_language}, + invert_edit, + }, }; #[test] @@ -2125,3 +2134,46 @@ fn test_parse_options_reborrow() { assert!(parse_count.load(Ordering::SeqCst) > 0); } + +#[test] +fn test_grammar_that_should_hang_and_not_segfault() { + fn hang_test() { + let test_grammar_dir = fixtures_dir() + .join("test_grammars") + .join("get_col_should_hang_not_crash"); + + let grammar_json = load_grammar_file(&test_grammar_dir.join("grammar.js"), None) + .expect("Failed to load grammar file"); + + let (parser_name, parser_code) = + generate_parser(grammar_json.as_str()).expect("Failed to generate parser"); + + let language = + get_test_language(&parser_name, &parser_code, Some(test_grammar_dir.as_path())); + + let mut parser = Parser::new(); + parser + .set_language(&language) + .expect("Failed to set parser language"); + + let code_that_should_hang = "\nHello"; + + parser + .parse(code_that_should_hang, None) + .expect("Parse operation completed unexpectedly"); + } + + let timeout = Duration::from_millis(500); + let (tx, rx) = mpsc::channel(); + + thread::spawn(move || tx.send(std::panic::catch_unwind(hang_test))); + + match rx.recv_timeout(timeout) { + Ok(Ok(())) => panic!("The test completed rather than hanging"), + Ok(Err(panic_info)) => panic!("The test panicked unexpectedly: {panic_info:?}"), + Err(mpsc::RecvTimeoutError::Timeout) => {} // Expected + Err(mpsc::RecvTimeoutError::Disconnected) => { + panic!("The test thread disconnected unexpectedly") + } + } +} From b0cdab85fe52362229812248919bd5ff06b729ca Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Mon, 22 Sep 2025 21:06:50 -0400 Subject: [PATCH 501/663] refactor(rust): avoid panics where possible --- crates/generate/src/generate.rs | 5 ++++- lib/binding_rust/lib.rs | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/generate/src/generate.rs b/crates/generate/src/generate.rs index 0551bb1d..cf6d1009 100644 --- a/crates/generate/src/generate.rs +++ b/crates/generate/src/generate.rs @@ -505,7 +505,6 @@ fn load_js_grammar_file(grammar_path: &Path, js_runtime: Option<&str>) -> JSResu .wait_with_output() .map_err(|e| JSError::IO(format!("Failed to read output from `{js_runtime}` -- {e}")))?; match output.status.code() { - None => panic!("`{js_runtime}` process was killed"), Some(0) => { let stdout = String::from_utf8(output.stdout).map_err(|e| JSError::JSRuntimeUtf8 { runtime: js_runtime.to_string(), @@ -533,6 +532,10 @@ fn load_js_grammar_file(grammar_path: &Path, js_runtime: Option<&str>) -> JSResu runtime: js_runtime.to_string(), code, }), + None => Err(JSError::JSRuntimeExit { + runtime: js_runtime.to_string(), + code: -1, + }), } } diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs index 23506e03..5e0381bb 100644 --- a/lib/binding_rust/lib.rs +++ b/lib/binding_rust/lib.rs @@ -351,7 +351,7 @@ impl From for CaptureQuantifier { ffi::TSQuantifierZeroOrMore => Self::ZeroOrMore, ffi::TSQuantifierOne => Self::One, ffi::TSQuantifierOneOrMore => Self::OneOrMore, - _ => panic!("Unrecognized quantifier: {value}"), + _ => unreachable!(), } } } From ce5646519786f3ad5e616dbeea150ba19b61e2b3 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Mon, 22 Sep 2025 21:07:33 -0400 Subject: [PATCH 502/663] test(rust): prefer `assert`s to `panic`s --- crates/cli/src/tests/highlight_test.rs | 18 ++++++++----- crates/cli/src/tests/query_test.rs | 9 +++---- crates/cli/src/tests/tags_test.rs | 27 ++++++++++--------- .../src/prepare_grammar/extract_tokens.rs | 15 +++++------ .../src/prepare_grammar/intern_symbols.rs | 7 +++-- .../src/prepare_grammar/process_inlines.rs | 9 +++---- 6 files changed, 42 insertions(+), 43 deletions(-) diff --git a/crates/cli/src/tests/highlight_test.rs b/crates/cli/src/tests/highlight_test.rs index 76c43f43..88209bfe 100644 --- a/crates/cli/src/tests/highlight_test.rs +++ b/crates/cli/src/tests/highlight_test.rs @@ -481,7 +481,7 @@ fn test_highlighting_cancellation() { // The initial `highlight` call, which eagerly parses the outer document, should not fail. let mut highlighter = Highlighter::new(); - let events = highlighter + let mut events = highlighter .highlight( &HTML_HIGHLIGHT, source.as_bytes(), @@ -492,14 +492,18 @@ fn test_highlighting_cancellation() { // Iterating the scopes should not panic. It should return an error once the // cancellation is detected. - for event in events { - if let Err(e) = event { - assert_eq!(e, Error::Cancelled); - return; + let found_cancellation_error = events.any(|event| match event { + Ok(_) => false, + Err(Error::Cancelled) => true, + Err(Error::InvalidLanguage | Error::Unknown) => { + unreachable!("Unexpected error type while iterating events") } - } + }); - panic!("Expected an error while iterating highlighter"); + assert!( + found_cancellation_error, + "Expected a cancellation error while iterating events" + ); } #[test] diff --git a/crates/cli/src/tests/query_test.rs b/crates/cli/src/tests/query_test.rs index 835138ce..2fff0525 100644 --- a/crates/cli/src/tests/query_test.rs +++ b/crates/cli/src/tests/query_test.rs @@ -4186,12 +4186,9 @@ fn test_query_random() { let pattern = pattern_ast.to_string(); let expected_matches = pattern_ast.matches_in_tree(&test_tree); - let query = match Query::new(&language, &pattern) { - Ok(query) => query, - Err(e) => { - panic!("failed to build query for pattern {pattern} - {e}. seed: {seed}"); - } - }; + let query = Query::new(&language, &pattern).unwrap_or_else(|e| { + panic!("failed to build query for pattern {pattern}. seed: {seed}\n{e}") + }); let mut actual_matches = Vec::new(); let mut match_iter = cursor.matches( &query, diff --git a/crates/cli/src/tests/tags_test.rs b/crates/cli/src/tests/tags_test.rs index 232a01dc..0c9f7111 100644 --- a/crates/cli/src/tests/tags_test.rs +++ b/crates/cli/src/tests/tags_test.rs @@ -1,6 +1,7 @@ use std::{ ffi::{CStr, CString}, fs, ptr, slice, str, + sync::atomic::{AtomicUsize, Ordering}, }; use tree_sitter::Point; @@ -262,34 +263,34 @@ fn test_tags_ruby() { #[test] fn test_tags_cancellation() { - use std::sync::atomic::{AtomicUsize, Ordering}; - allocations::record(|| { // Large javascript document - let source = (0..500) - .map(|_| "/* hi */ class A { /* ok */ b() {} }\n") - .collect::(); - + let source = "/* hi */ class A { /* ok */ b() {} }\n".repeat(500); let cancellation_flag = AtomicUsize::new(0); let language = get_language("javascript"); let tags_config = TagsConfiguration::new(language, JS_TAG_QUERY, "").unwrap(); - let mut tag_context = TagsContext::new(); let tags = tag_context .generate_tags(&tags_config, source.as_bytes(), Some(&cancellation_flag)) .unwrap(); - for (i, tag) in tags.0.enumerate() { + let found_cancellation_error = tags.0.enumerate().any(|(i, tag)| { if i == 150 { cancellation_flag.store(1, Ordering::SeqCst); } - if let Err(e) = tag { - assert_eq!(e, Error::Cancelled); - return; + match tag { + Ok(_) => false, + Err(Error::Cancelled) => true, + Err(e) => { + unreachable!("Unexpected error type while iterating tags: {e}") + } } - } + }); - panic!("Expected to halt tagging with an error"); + assert!( + found_cancellation_error, + "Expected to halt tagging with a cancellation error" + ); }); } diff --git a/crates/generate/src/prepare_grammar/extract_tokens.rs b/crates/generate/src/prepare_grammar/extract_tokens.rs index cb40ce5a..b74a8e84 100644 --- a/crates/generate/src/prepare_grammar/extract_tokens.rs +++ b/crates/generate/src/prepare_grammar/extract_tokens.rs @@ -591,14 +591,13 @@ mod test { ]); grammar.external_tokens = vec![Variable::named("rule_1", Rule::non_terminal(1))]; - match extract_tokens(grammar) { - Err(e) => { - assert_eq!(e.to_string(), "Rule 'rule_1' cannot be used as both an external token and a non-terminal rule"); - } - _ => { - panic!("Expected an error but got no error"); - } - } + let result = extract_tokens(grammar); + assert!(result.is_err(), "Expected an error but got no error"); + let err = result.err().unwrap(); + assert_eq!( + err.to_string(), + "Rule 'rule_1' cannot be used as both an external token and a non-terminal rule" + ); } #[test] diff --git a/crates/generate/src/prepare_grammar/intern_symbols.rs b/crates/generate/src/prepare_grammar/intern_symbols.rs index 010967b8..241e6e99 100644 --- a/crates/generate/src/prepare_grammar/intern_symbols.rs +++ b/crates/generate/src/prepare_grammar/intern_symbols.rs @@ -279,10 +279,9 @@ mod tests { fn test_grammar_with_undefined_symbols() { let result = intern_symbols(&build_grammar(vec![Variable::named("x", Rule::named("y"))])); - match result { - Err(e) => assert_eq!(e.to_string(), "Undefined symbol `y`"), - _ => panic!("Expected an error but got none"), - } + assert!(result.is_err(), "Expected an error but got none"); + let e = result.err().unwrap(); + assert_eq!(e.to_string(), "Undefined symbol `y`"); } fn build_grammar(variables: Vec) -> InputGrammar { diff --git a/crates/generate/src/prepare_grammar/process_inlines.rs b/crates/generate/src/prepare_grammar/process_inlines.rs index 085e6732..f20e182d 100644 --- a/crates/generate/src/prepare_grammar/process_inlines.rs +++ b/crates/generate/src/prepare_grammar/process_inlines.rs @@ -549,10 +549,9 @@ mod tests { ..Default::default() }; - if let Err(error) = process_inlines(&grammar, &lexical_grammar) { - assert_eq!(error.to_string(), "Token `something` cannot be inlined"); - } else { - panic!("expected an error, but got none"); - } + let result = process_inlines(&grammar, &lexical_grammar); + assert!(result.is_err(), "expected an error, but got none"); + let err = result.err().unwrap(); + assert_eq!(err.to_string(), "Token `something` cannot be inlined",); } } From 021d9c447d5e1d4ddf2dd72a8b2ff043194d314a Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Mon, 22 Sep 2025 21:21:36 -0400 Subject: [PATCH 503/663] test: clean up async boundary test --- crates/cli/src/tests.rs | 2 +- crates/cli/src/tests/async_boundary_test.rs | 150 +++++++++++ crates/cli/src/tests/async_context_test.rs | 278 -------------------- 3 files changed, 151 insertions(+), 279 deletions(-) create mode 100644 crates/cli/src/tests/async_boundary_test.rs delete mode 100644 crates/cli/src/tests/async_context_test.rs diff --git a/crates/cli/src/tests.rs b/crates/cli/src/tests.rs index cc4d336d..9fc1c71b 100644 --- a/crates/cli/src/tests.rs +++ b/crates/cli/src/tests.rs @@ -1,4 +1,4 @@ -mod async_context_test; +mod async_boundary_test; mod corpus_test; mod detect_language; mod helpers; diff --git a/crates/cli/src/tests/async_boundary_test.rs b/crates/cli/src/tests/async_boundary_test.rs new file mode 100644 index 00000000..254ed931 --- /dev/null +++ b/crates/cli/src/tests/async_boundary_test.rs @@ -0,0 +1,150 @@ +use std::{ + future::Future, + pin::Pin, + ptr, + task::{Context, Poll, RawWaker, RawWakerVTable, Waker}, +}; + +use tree_sitter::Parser; + +use super::helpers::fixtures::get_language; + +#[test] +fn test_node_across_async_boundaries() { + let mut parser = Parser::new(); + let language = get_language("bash"); + parser.set_language(&language).unwrap(); + let tree = parser.parse("#", None).unwrap(); + let root = tree.root_node(); + + let (result, yields) = simple_async_executor(async { + let root_ref = &root; + + // Test node captured by value + let fut_by_value = async { + yield_once().await; + root.child(0).unwrap().kind() + }; + + // Test node captured by reference + let fut_by_ref = async { + yield_once().await; + root_ref.child(0).unwrap().kind() + }; + + let result1 = fut_by_value.await; + let result2 = fut_by_ref.await; + + assert_eq!(result1, result2); + result1 + }); + + assert_eq!(result, "comment"); + assert_eq!(yields, 2); +} + +#[test] +fn test_cursor_across_async_boundaries() { + let mut parser = Parser::new(); + let language = get_language("c"); + parser.set_language(&language).unwrap(); + let tree = parser.parse("#", None).unwrap(); + let mut cursor = tree.walk(); + + let ((), yields) = simple_async_executor(async { + cursor.goto_first_child(); + + // Test cursor usage across yield point + yield_once().await; + cursor.goto_first_child(); + + // Test cursor in async block + let cursor_ref = &mut cursor; + let fut = async { + yield_once().await; + cursor_ref.goto_first_child(); + }; + fut.await; + }); + + assert_eq!(yields, 2); +} + +#[test] +fn test_node_and_cursor_together() { + let mut parser = Parser::new(); + let language = get_language("javascript"); + parser.set_language(&language).unwrap(); + let tree = parser.parse("#", None).unwrap(); + let root = tree.root_node(); + let mut cursor = tree.walk(); + + let ((), yields) = simple_async_executor(async { + cursor.goto_first_child(); + + let fut = async { + yield_once().await; + let _ = root.to_sexp(); + cursor.goto_first_child(); + }; + + yield_once().await; + fut.await; + }); + + assert_eq!(yields, 2); +} + +fn simple_async_executor(future: F) -> (F::Output, u32) +where + F: Future, +{ + let waker = noop_waker(); + let mut cx = Context::from_waker(&waker); + let mut yields = 0; + let mut future = Box::pin(future); + + loop { + match future.as_mut().poll(&mut cx) { + Poll::Ready(result) => return (result, yields), + Poll::Pending => yields += 1, + } + } +} + +async fn yield_once() { + struct YieldOnce { + yielded: bool, + } + + impl Future for YieldOnce { + type Output = (); + + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> { + if self.yielded { + Poll::Ready(()) + } else { + self.yielded = true; + cx.waker().wake_by_ref(); + Poll::Pending + } + } + } + + YieldOnce { yielded: false }.await; +} + +const fn noop_waker() -> Waker { + const VTABLE: RawWakerVTable = RawWakerVTable::new( + // Cloning just returns a new no-op raw waker + |_| RAW, + // `wake` does nothing + |_| {}, + // `wake_by_ref` does nothing + |_| {}, + // Dropping does nothing as we don't allocate anything + |_| {}, + ); + const RAW: RawWaker = RawWaker::new(ptr::null(), &VTABLE); + unsafe { Waker::from_raw(RAW) } +} diff --git a/crates/cli/src/tests/async_context_test.rs b/crates/cli/src/tests/async_context_test.rs deleted file mode 100644 index 48849bd2..00000000 --- a/crates/cli/src/tests/async_context_test.rs +++ /dev/null @@ -1,278 +0,0 @@ -use std::{ - future::Future, - pin::{pin, Pin}, - ptr, - task::{self, Context, Poll, RawWaker, RawWakerVTable, Waker}, -}; - -use tree_sitter::Parser; - -use super::helpers::fixtures::get_language; - -#[test] -fn test_node_in_fut() { - let (ret, pended) = tokio_like_spawn(async { - let mut parser = Parser::new(); - let language = get_language("bash"); - parser.set_language(&language).unwrap(); - - let tree = parser.parse("#", None).unwrap(); - - let root = tree.root_node(); - let root_ref = &root; - - let fut_val_fn = || async { - yield_now().await; - root.child(0).unwrap().kind() - }; - - yield_now().await; - - let fut_ref_fn = || async { - yield_now().await; - root_ref.child(0).unwrap().kind() - }; - - let f1 = fut_val_fn().await; - let f2 = fut_ref_fn().await; - assert_eq!(f1, f2); - - let fut_val = async { - yield_now().await; - root.child(0).unwrap().kind() - }; - - let fut_ref = async { - yield_now().await; - root_ref.child(0).unwrap().kind() - }; - - let f1 = fut_val.await; - let f2 = fut_ref.await; - assert_eq!(f1, f2); - - f1 - }) - .join(); - assert_eq!(ret, "comment"); - assert_eq!(pended, 5); -} - -#[test] -fn test_node_and_cursor_ref_in_fut() { - let ((), pended) = tokio_like_spawn(async { - let mut parser = Parser::new(); - let language = get_language("c"); - parser.set_language(&language).unwrap(); - - let tree = parser.parse("#", None).unwrap(); - - let root = tree.root_node(); - let root_ref = &root; - - let mut cursor = tree.walk(); - let cursor_ref = &mut cursor; - - cursor_ref.goto_first_child(); - - let fut_val = async { - yield_now().await; - let _ = root.to_sexp(); - }; - - yield_now().await; - - let fut_ref = async { - yield_now().await; - let _ = root_ref.to_sexp(); - cursor_ref.goto_first_child(); - }; - - fut_val.await; - fut_ref.await; - - cursor_ref.goto_first_child(); - }) - .join(); - assert_eq!(pended, 3); -} - -#[test] -fn test_node_and_cursor_ref_in_fut_with_fut_fabrics() { - let ((), pended) = tokio_like_spawn(async { - let mut parser = Parser::new(); - let language = get_language("javascript"); - parser.set_language(&language).unwrap(); - - let tree = parser.parse("#", None).unwrap(); - - let root = tree.root_node(); - let root_ref = &root; - - let mut cursor = tree.walk(); - let cursor_ref = &mut cursor; - - cursor_ref.goto_first_child(); - - let fut_val = || async { - yield_now().await; - let _ = root.to_sexp(); - }; - - yield_now().await; - - let fut_ref = || async move { - yield_now().await; - let _ = root_ref.to_sexp(); - cursor_ref.goto_first_child(); - }; - - fut_val().await; - fut_val().await; - fut_ref().await; - }) - .join(); - assert_eq!(pended, 4); -} - -#[test] -fn test_node_and_cursor_ref_in_fut_with_inner_spawns() { - let (ret, pended) = tokio_like_spawn(async { - let mut parser = Parser::new(); - let language = get_language("rust"); - parser.set_language(&language).unwrap(); - - let tree = parser.parse("#", None).unwrap(); - - let mut cursor = tree.walk(); - let cursor_ref = &mut cursor; - - cursor_ref.goto_first_child(); - - let fut_val = || { - let tree = tree.clone(); - async move { - let root = tree.root_node(); - let mut cursor = tree.walk(); - let cursor_ref = &mut cursor; - yield_now().await; - let _ = root.to_sexp(); - cursor_ref.goto_first_child(); - } - }; - - yield_now().await; - - let fut_ref = || { - let tree = tree.clone(); - async move { - let root = tree.root_node(); - let root_ref = &root; - let mut cursor = tree.walk(); - let cursor_ref = &mut cursor; - yield_now().await; - let _ = root_ref.to_sexp(); - cursor_ref.goto_first_child(); - } - }; - - let ((), p1) = tokio_like_spawn(fut_val()).await.unwrap(); - let ((), p2) = tokio_like_spawn(fut_ref()).await.unwrap(); - - cursor_ref.goto_first_child(); - - fut_val().await; - fut_val().await; - fut_ref().await; - - cursor_ref.goto_first_child(); - - p1 + p2 - }) - .join(); - assert_eq!(pended, 4); - assert_eq!(ret, 2); -} - -fn tokio_like_spawn(future: T) -> JoinHandle<(T::Output, usize)> -where - T: Future + Send + 'static, - T::Output: Send + 'static, -{ - // No runtime, just noop waker - - let waker = noop_waker(); - let mut cx = task::Context::from_waker(&waker); - - let mut pending = 0; - let mut future = pin!(future); - let ret = loop { - match future.as_mut().poll(&mut cx) { - Poll::Pending => pending += 1, - Poll::Ready(r) => { - break r; - } - } - }; - JoinHandle::new((ret, pending)) -} - -async fn yield_now() { - struct SimpleYieldNow { - yielded: bool, - } - - impl Future for SimpleYieldNow { - type Output = (); - - fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> { - cx.waker().wake_by_ref(); - if self.yielded { - return Poll::Ready(()); - } - self.yielded = true; - Poll::Pending - } - } - - SimpleYieldNow { yielded: false }.await; -} - -pub const fn noop_waker() -> Waker { - const VTABLE: RawWakerVTable = RawWakerVTable::new( - // Cloning just returns a new no-op raw waker - |_| RAW, - // `wake` does nothing - |_| {}, - // `wake_by_ref` does nothing - |_| {}, - // Dropping does nothing as we don't allocate anything - |_| {}, - ); - const RAW: RawWaker = RawWaker::new(ptr::null(), &VTABLE); - unsafe { Waker::from_raw(RAW) } -} - -struct JoinHandle { - data: Option, -} - -impl JoinHandle { - #[must_use] - const fn new(data: T) -> Self { - Self { data: Some(data) } - } - - const fn join(&mut self) -> T { - self.data.take().unwrap() - } -} - -impl Future for JoinHandle { - type Output = std::result::Result; - - fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll { - let data = self.get_mut().data.take().unwrap(); - Poll::Ready(Ok(data)) - } -} From f26bd44a43e8985fe7d784e87056f996c8a576c9 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Mon, 22 Sep 2025 21:08:32 -0400 Subject: [PATCH 504/663] flake: remove cross, add llvm-cov support --- flake.nix | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index b94b03fa..be7d1bad 100644 --- a/flake.nix +++ b/flake.nix @@ -17,7 +17,7 @@ eachSystem = lib.genAttrs systems; pkgsFor = inputs.nixpkgs.legacyPackages; - version = "0.26.0"; + version = "0.26.0"; fs = lib.fileset; src = fs.toSource { @@ -326,11 +326,12 @@ clippy rust-analyzer rustfmt - cargo-cross + cargo-llvm-cov cmake gnumake pkg-config + llvm clang libclang @@ -392,6 +393,8 @@ env = { RUST_BACKTRACE = 1; LIBCLANG_PATH = "${pkgs.libclang.lib}/lib"; + LLVM_COV = "${pkgs.llvm}/bin/llvm-cov"; + LLVM_PROFDATA = "${pkgs.llvm}/bin/llvm-profdata"; TREE_SITTER_WASI_SDK_PATH = "${pkgs.pkgsCross.wasi32.stdenv.cc}"; }; }; From 90ee433c9bc3ecaeb65a76ba6066691c92c1e6c5 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Tue, 23 Sep 2025 03:38:16 -0400 Subject: [PATCH 505/663] fix(lib): account for unreachable patterns with children Co-authored-by: Will Lillis --- crates/cli/src/tests/query_test.rs | 58 ++++++++++++++++++++++++++++++ lib/src/query.c | 9 +++-- 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/crates/cli/src/tests/query_test.rs b/crates/cli/src/tests/query_test.rs index 2fff0525..fdbdaab8 100644 --- a/crates/cli/src/tests/query_test.rs +++ b/crates/cli/src/tests/query_test.rs @@ -8,6 +8,7 @@ use tree_sitter::{ QueryCursorOptions, QueryError, QueryErrorKind, QueryPredicate, QueryPredicateArg, QueryProperty, Range, }; +use tree_sitter_generate::load_grammar_file; use unindent::Unindent; use super::helpers::{ @@ -5762,3 +5763,60 @@ fn test_query_allows_error_nodes_with_children() { assert_eq!(matches, &[(0, vec![("error", ".bar")])]); }); } + +#[test] +fn test_query_assertion_on_unreachable_node_with_child() { + // The `await_binding` rule is unreachable because it has a lower precedence than + // `identifier`, so we'll always reduce to an expression of type `identifier` + // instead whenever we see the token `await` followed by an identifier. + // + // A query that tries to capture the `await` token in the `await_binding` rule + // should not cause an assertion failure during query analysis. + let grammar = r#" +module.exports = grammar({ + name: "query_assertion_crash", + + rules: { + source_file: $ => repeat($.expression), + + expression: $ => choice( + $.await_binding, + $.await_expr, + $.equal_expr, + prec(3, $.identifier), + ), + + await_binding: $ => prec(1, seq('await', $.identifier, '=', $.expression)), + + await_expr: $ => prec(1, seq('await', $.expression)), + + equal_expr: $ => prec.right(2, seq($.expression, '=', $.expression)), + + identifier: _ => /[a-z]+/, + } +}); + "#; + + let file = tempfile::NamedTempFile::with_suffix(".js").unwrap(); + std::fs::write(file.path(), grammar).unwrap(); + + let grammar_json = load_grammar_file(file.path(), None).unwrap(); + + let (parser_name, parser_code) = generate_parser(&grammar_json).unwrap(); + + let language = get_test_language(&parser_name, &parser_code, None); + + let query_result = Query::new(&language, r#"(await_binding "await")"#); + + assert!(query_result.is_err()); + assert_eq!( + query_result.unwrap_err(), + QueryError { + kind: QueryErrorKind::Structure, + row: 0, + offset: 0, + column: 0, + message: ["(await_binding \"await\")", "^"].join("\n"), + } + ); +} diff --git a/lib/src/query.c b/lib/src/query.c index 90dd30b6..9ea255ac 100644 --- a/lib/src/query.c +++ b/lib/src/query.c @@ -1759,8 +1759,13 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { // If this pattern cannot match, store the pattern index so that it can be // returned to the caller. if (analysis.finished_parent_symbols.size == 0) { - ts_assert(analysis.final_step_indices.size > 0); - uint16_t impossible_step_index = *array_back(&analysis.final_step_indices); + uint16_t impossible_step_index; + if (analysis.final_step_indices.size > 0) { + impossible_step_index = *array_back(&analysis.final_step_indices); + } else { + // If there isn't a final step, then that means the parent step itself is unreachable. + impossible_step_index = parent_step_index; + } uint32_t j, impossible_exists; array_search_sorted_by(&self->step_offsets, .step_index, impossible_step_index, &j, &impossible_exists); if (j >= self->step_offsets.size) j = self->step_offsets.size - 1; From 8c224262237ac18a01256c98d8ab805db5941f9c Mon Sep 17 00:00:00 2001 From: Riley Bruins Date: Tue, 23 Sep 2025 16:06:22 -0700 Subject: [PATCH 506/663] feat(rust): add `new_raw` to create a raw, unchecked query pointer --- lib/binding_rust/lib.rs | 168 +++++++++++++++++++++------------------- 1 file changed, 89 insertions(+), 79 deletions(-) diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs index 5e0381bb..cf22eb72 100644 --- a/lib/binding_rust/lib.rs +++ b/lib/binding_rust/lib.rs @@ -2343,6 +2343,16 @@ impl Query { /// on syntax nodes parsed with that language. References to Queries can be /// shared between multiple threads. pub fn new(language: &Language, source: &str) -> Result { + let ptr = Self::new_raw(language, source)?; + unsafe { Self::from_raw_parts(ptr, source) } + } + + /// Constructs a raw [`TSQuery`](ffi::TSQuery) pointer without performing extra checks specific to the rust + /// bindings, such as predicate validation. A [`Query`] object can be constructed from the + /// returned pointer using [`from_raw_parts`](Query::from_raw_parts). The caller is + /// responsible for ensuring that the returned pointer is eventually freed by calling + /// [`ts_query_delete`](ffi::ts_query_delete). + pub fn new_raw(language: &Language, source: &str) -> Result<*mut ffi::TSQuery, QueryError> { let mut error_offset = 0u32; let mut error_type: ffi::TSQueryError = 0; let bytes = source.as_bytes(); @@ -2358,90 +2368,90 @@ impl Query { ) }; + if !ptr.is_null() { + return Ok(ptr); + } + // On failure, build an error based on the error code and offset. - if ptr.is_null() { - if error_type == ffi::TSQueryErrorLanguage { - return Err(QueryError { - row: 0, - column: 0, - offset: 0, - message: LanguageError::Version(language.abi_version()).to_string(), - kind: QueryErrorKind::Language, - }); - } - - let offset = error_offset as usize; - let mut line_start = 0; - let mut row = 0; - let mut line_containing_error = None; - for line in source.lines() { - let line_end = line_start + line.len() + 1; - if line_end > offset { - line_containing_error = Some(line); - break; - } - line_start = line_end; - row += 1; - } - let column = offset - line_start; - - let kind; - let message; - match error_type { - // Error types that report names - ffi::TSQueryErrorNodeType | ffi::TSQueryErrorField | ffi::TSQueryErrorCapture => { - let suffix = source.split_at(offset).1; - let in_quotes = offset > 0 && source.as_bytes()[offset - 1] == b'"'; - let mut backslashes = 0; - let end_offset = suffix - .find(|c| { - if in_quotes { - if c == '"' && backslashes % 2 == 0 { - true - } else if c == '\\' { - backslashes += 1; - false - } else { - backslashes = 0; - false - } - } else { - !char::is_alphanumeric(c) && c != '_' && c != '-' - } - }) - .unwrap_or(suffix.len()); - message = format!("\"{}\"", suffix.split_at(end_offset).0); - kind = match error_type { - ffi::TSQueryErrorNodeType => QueryErrorKind::NodeType, - ffi::TSQueryErrorField => QueryErrorKind::Field, - ffi::TSQueryErrorCapture => QueryErrorKind::Capture, - _ => unreachable!(), - }; - } - - // Error types that report positions - _ => { - message = line_containing_error.map_or_else( - || "Unexpected EOF".to_string(), - |line| line.to_string() + "\n" + &" ".repeat(offset - line_start) + "^", - ); - kind = match error_type { - ffi::TSQueryErrorStructure => QueryErrorKind::Structure, - _ => QueryErrorKind::Syntax, - }; - } - } - + if error_type == ffi::TSQueryErrorLanguage { return Err(QueryError { - row, - column, - offset, - message, - kind, + row: 0, + column: 0, + offset: 0, + message: LanguageError::Version(language.abi_version()).to_string(), + kind: QueryErrorKind::Language, }); } - unsafe { Self::from_raw_parts(ptr, source) } + let offset = error_offset as usize; + let mut line_start = 0; + let mut row = 0; + let mut line_containing_error = None; + for line in source.lines() { + let line_end = line_start + line.len() + 1; + if line_end > offset { + line_containing_error = Some(line); + break; + } + line_start = line_end; + row += 1; + } + let column = offset - line_start; + + let kind; + let message; + match error_type { + // Error types that report names + ffi::TSQueryErrorNodeType | ffi::TSQueryErrorField | ffi::TSQueryErrorCapture => { + let suffix = source.split_at(offset).1; + let in_quotes = offset > 0 && source.as_bytes()[offset - 1] == b'"'; + let mut backslashes = 0; + let end_offset = suffix + .find(|c| { + if in_quotes { + if c == '"' && backslashes % 2 == 0 { + true + } else if c == '\\' { + backslashes += 1; + false + } else { + backslashes = 0; + false + } + } else { + !char::is_alphanumeric(c) && c != '_' && c != '-' + } + }) + .unwrap_or(suffix.len()); + message = format!("\"{}\"", suffix.split_at(end_offset).0); + kind = match error_type { + ffi::TSQueryErrorNodeType => QueryErrorKind::NodeType, + ffi::TSQueryErrorField => QueryErrorKind::Field, + ffi::TSQueryErrorCapture => QueryErrorKind::Capture, + _ => unreachable!(), + }; + } + + // Error types that report positions + _ => { + message = line_containing_error.map_or_else( + || "Unexpected EOF".to_string(), + |line| line.to_string() + "\n" + &" ".repeat(offset - line_start) + "^", + ); + kind = match error_type { + ffi::TSQueryErrorStructure => QueryErrorKind::Structure, + _ => QueryErrorKind::Syntax, + }; + } + } + + Err(QueryError { + row, + column, + offset, + message, + kind, + }) } #[doc(hidden)] From 9d66dbc28f6d59aff2c9327d6ac42f5765515b4d Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Wed, 24 Sep 2025 19:45:40 +0300 Subject: [PATCH 507/663] chore: remove CARGO_WORKSPACE_DIR var --- .cargo/config.toml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index 549ae022..35049cbc 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,6 +1,2 @@ [alias] xtask = "run --package xtask --" - -[env] -# See: https://github.com/rust-lang/cargo/issues/3946#issuecomment-973132993 -CARGO_WORKSPACE_DIR = { value = "", relative = true } From ea9c318afb0c038ea64d29d2ca6b13e83693c4db Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Wed, 24 Sep 2025 16:23:27 -0400 Subject: [PATCH 508/663] docs: update highlight crate link --- docs/src/3-syntax-highlighting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/3-syntax-highlighting.md b/docs/src/3-syntax-highlighting.md index ca42c047..de5308a0 100644 --- a/docs/src/3-syntax-highlighting.md +++ b/docs/src/3-syntax-highlighting.md @@ -433,7 +433,7 @@ not the `keyword` class. ``` [erb]: https://en.wikipedia.org/wiki/ERuby -[highlight crate]: https://github.com/tree-sitter/tree-sitter/tree/master/highlight +[highlight crate]: https://github.com/tree-sitter/tree-sitter/tree/master/crates/highlight [init-config]: ./cli/init-config.md [init]: ./cli/init.md#structure-of-tree-sitterjson [js grammar]: https://github.com/tree-sitter/tree-sitter-javascript From e1b424c19165268386d20cb800672856ad7752c4 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Wed, 24 Sep 2025 16:26:37 -0400 Subject: [PATCH 509/663] Revert "0.26.0" --- Cargo.lock | 14 +++++++------- Cargo.toml | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 02ce3488..9f92d9ed 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1886,7 +1886,7 @@ dependencies = [ [[package]] name = "tree-sitter" -version = "0.27.0" +version = "0.26.0" dependencies = [ "bindgen 0.72.1", "cc", @@ -1900,7 +1900,7 @@ dependencies = [ [[package]] name = "tree-sitter-cli" -version = "0.27.0" +version = "0.26.0" dependencies = [ "ansi_colours", "anstyle", @@ -1945,7 +1945,7 @@ dependencies = [ [[package]] name = "tree-sitter-config" -version = "0.27.0" +version = "0.26.0" dependencies = [ "anyhow", "etcetera", @@ -1956,7 +1956,7 @@ dependencies = [ [[package]] name = "tree-sitter-generate" -version = "0.27.0" +version = "0.26.0" dependencies = [ "anyhow", "dunce", @@ -1979,7 +1979,7 @@ dependencies = [ [[package]] name = "tree-sitter-highlight" -version = "0.27.0" +version = "0.26.0" dependencies = [ "regex", "streaming-iterator", @@ -1993,7 +1993,7 @@ version = "0.1.5" [[package]] name = "tree-sitter-loader" -version = "0.27.0" +version = "0.26.0" dependencies = [ "anyhow", "cc", @@ -2015,7 +2015,7 @@ dependencies = [ [[package]] name = "tree-sitter-tags" -version = "0.27.0" +version = "0.26.0" dependencies = [ "memchr", "regex", diff --git a/Cargo.toml b/Cargo.toml index 94ad08d2..ba497668 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ members = [ resolver = "2" [workspace.package] -version = "0.27.0" +version = "0.26.0" authors = [ "Max Brunsfeld ", "Amaan Qureshi ", @@ -151,11 +151,11 @@ walkdir = "2.5.0" wasmparser = "0.229.0" webbrowser = "1.0.5" -tree-sitter = { version = "0.27.0", path = "./lib" } -tree-sitter-generate = { version = "0.27.0", path = "./crates/generate" } -tree-sitter-loader = { version = "0.27.0", path = "./crates/loader" } -tree-sitter-config = { version = "0.27.0", path = "./crates/config" } -tree-sitter-highlight = { version = "0.27.0", path = "./crates/highlight" } -tree-sitter-tags = { version = "0.27.0", path = "./crates/tags" } +tree-sitter = { version = "0.26.0", path = "./lib" } +tree-sitter-generate = { version = "0.26.0", path = "./crates/generate" } +tree-sitter-loader = { version = "0.26.0", path = "./crates/loader" } +tree-sitter-config = { version = "0.26.0", path = "./crates/config" } +tree-sitter-highlight = { version = "0.26.0", path = "./crates/highlight" } +tree-sitter-tags = { version = "0.26.0", path = "./crates/tags" } tree-sitter-language = { version = "0.1.5", path = "./crates/language" } From 335bfabc608fc3a9b3e8ce59e0d8e198e39e38d6 Mon Sep 17 00:00:00 2001 From: WillLillis Date: Thu, 25 Sep 2025 01:14:37 -0500 Subject: [PATCH 510/663] feat(cli): include filenames in parsing xml output --- crates/cli/src/main.rs | 1 + crates/cli/src/parse.rs | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 6a6a202f..74f33268 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -1055,6 +1055,7 @@ impl Parse { .map(|p| p.to_string_lossy().chars().count()) .max() .unwrap_or(0); + options.stats.source_count = paths.len(); for path in &paths { let path = Path::new(&path); diff --git a/crates/cli/src/parse.rs b/crates/cli/src/parse.rs index e1ee20c4..61e4a86f 100644 --- a/crates/cli/src/parse.rs +++ b/crates/cli/src/parse.rs @@ -234,6 +234,7 @@ impl ParseSummary { pub struct ParseStats { pub parse_summaries: Vec, pub cumulative_stats: Stats, + pub source_count: usize, } #[derive(Serialize, ValueEnum, Debug, Copy, Clone, Default, Eq, PartialEq)] @@ -508,11 +509,18 @@ pub fn parse_file_at_path( if opts.output == ParseOutput::Xml { let mut needs_newline = false; - let mut indent_level = 0; + let mut indent_level = 2; let mut did_visit_children = false; let mut had_named_children = false; let mut tags = Vec::<&str>::new(); - writeln!(&mut stdout, "")?; + + // If we're parsing the first file, write the header + if opts.stats.parse_summaries.is_empty() { + writeln!(&mut stdout, "")?; + writeln!(&mut stdout, "")?; + } + writeln!(&mut stdout, " ", path.display())?; + loop { let node = cursor.node(); let is_named = node.is_named(); @@ -591,8 +599,14 @@ pub fn parse_file_at_path( } } } + writeln!(&mut stdout)?; + writeln!(&mut stdout, " ")?; + + // If we parsed the last file, write the closing tag for the `sources` header + if opts.stats.parse_summaries.len() == opts.stats.source_count - 1 { + writeln!(&mut stdout, "")?; + } cursor.reset(tree.root_node()); - println!(); } if opts.output == ParseOutput::Dot { From a9bce7c18a2c5824748befe97ffe3c9f72f15559 Mon Sep 17 00:00:00 2001 From: WillLillis Date: Thu, 25 Sep 2025 02:40:08 -0500 Subject: [PATCH 511/663] fix(generate): return error when generated grammar's state count exceeds the maximum allowed value. Co-authored-by: Amaan Qureshi --- crates/generate/src/build_tables.rs | 4 ++++ crates/generate/src/build_tables/build_parse_table.rs | 2 ++ 2 files changed, 6 insertions(+) diff --git a/crates/generate/src/build_tables.rs b/crates/generate/src/build_tables.rs index c6020cd2..f455664b 100644 --- a/crates/generate/src/build_tables.rs +++ b/crates/generate/src/build_tables.rs @@ -100,6 +100,10 @@ pub fn build_tables( ); } + if parse_table.states.len() > u16::MAX as usize { + Err(ParseTableBuilderError::StateCount(parse_table.states.len()))?; + } + Ok(Tables { parse_table, main_lex_table: lex_tables.main_lex_table, diff --git a/crates/generate/src/build_tables/build_parse_table.rs b/crates/generate/src/build_tables/build_parse_table.rs index f292542d..c832157a 100644 --- a/crates/generate/src/build_tables/build_parse_table.rs +++ b/crates/generate/src/build_tables/build_parse_table.rs @@ -77,6 +77,8 @@ pub enum ParseTableBuilderError { "The non-terminal rule `{0}` is used in a non-terminal `extra` rule, which is not allowed." )] ImproperNonTerminalExtra(String), + #[error("State count `{0}` exceeds the max value {max}.", max=u16::MAX)] + StateCount(usize), } #[derive(Default, Debug, Serialize)] From 5f7806f99e8788b4849819e78e0fafc2d3844556 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Thu, 25 Sep 2025 02:19:52 -0400 Subject: [PATCH 512/663] feat: add option to disable parse state optimizations --- Cargo.lock | 1 + crates/cli/src/main.rs | 11 +++++++++++ crates/generate/Cargo.toml | 1 + crates/generate/src/build_tables.rs | 3 +++ .../src/build_tables/minimize_parse_table.rs | 6 +++++- crates/generate/src/generate.rs | 19 +++++++++++++++++++ 6 files changed, 40 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 9f92d9ed..c1e8905f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1959,6 +1959,7 @@ name = "tree-sitter-generate" version = "0.26.0" dependencies = [ "anyhow", + "bitflags 2.9.4", "dunce", "indexmap", "indoc", diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 74f33268..6f64c801 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -32,6 +32,7 @@ use tree_sitter_cli::{ wasm, }; use tree_sitter_config::Config; +use tree_sitter_generate::OptLevel; use tree_sitter_highlight::Highlighter; use tree_sitter_loader::{self as loader, Bindings, TreeSitterJSON}; use tree_sitter_tags::TagsContext; @@ -162,6 +163,11 @@ struct Generate { /// The name or path of the JavaScript runtime to use for generating parsers, specify `native` /// to use the native `QuickJS` runtime pub js_runtime: Option, + + /// Disable optimizations when generating the parser. Currently, this only affects + /// the merging of compatible parse states. + #[arg(long)] + pub disable_optimizations: bool, } #[derive(Args)] @@ -868,6 +874,11 @@ impl Generate { self.report_states_for_rule.as_deref(), self.js_runtime.as_deref(), self.emit != GenerationEmit::Json, + if self.disable_optimizations { + OptLevel::empty() + } else { + OptLevel::default() + }, ) { if self.json { eprintln!("{}", serde_json::to_string_pretty(&err)?); diff --git a/crates/generate/Cargo.toml b/crates/generate/Cargo.toml index 61b1686a..1588763d 100644 --- a/crates/generate/Cargo.toml +++ b/crates/generate/Cargo.toml @@ -26,6 +26,7 @@ qjs-rt = ["load", "rquickjs", "pathdiff"] [dependencies] anyhow.workspace = true +bitflags = "2.9.4" dunce = "1.0.5" indexmap.workspace = true indoc.workspace = true diff --git a/crates/generate/src/build_tables.rs b/crates/generate/src/build_tables.rs index f455664b..8c6ef2a4 100644 --- a/crates/generate/src/build_tables.rs +++ b/crates/generate/src/build_tables.rs @@ -27,6 +27,7 @@ use crate::{ node_types::VariableInfo, rules::{AliasMap, Symbol, SymbolType, TokenSet}, tables::{LexTable, ParseAction, ParseTable, ParseTableEntry}, + OptLevel, }; pub struct Tables { @@ -43,6 +44,7 @@ pub fn build_tables( variable_info: &[VariableInfo], inlines: &InlinedProductionMap, report_symbol_name: Option<&str>, + optimizations: OptLevel, ) -> BuildTableResult { let item_set_builder = ParseItemSetBuilder::new(syntax_grammar, lexical_grammar, inlines); let following_tokens = @@ -78,6 +80,7 @@ pub fn build_tables( simple_aliases, &token_conflict_map, &keywords, + optimizations, ); let lex_tables = build_lex_table( &mut parse_table, diff --git a/crates/generate/src/build_tables/minimize_parse_table.rs b/crates/generate/src/build_tables/minimize_parse_table.rs index 9655cb88..1d70625e 100644 --- a/crates/generate/src/build_tables/minimize_parse_table.rs +++ b/crates/generate/src/build_tables/minimize_parse_table.rs @@ -11,6 +11,7 @@ use crate::{ grammars::{LexicalGrammar, SyntaxGrammar, VariableType}, rules::{AliasMap, Symbol, TokenSet}, tables::{GotoAction, ParseAction, ParseState, ParseStateId, ParseTable, ParseTableEntry}, + OptLevel, }; pub fn minimize_parse_table( @@ -20,6 +21,7 @@ pub fn minimize_parse_table( simple_aliases: &AliasMap, token_conflict_map: &TokenConflictMap, keywords: &TokenSet, + optimizations: OptLevel, ) { let mut minimizer = Minimizer { parse_table, @@ -29,7 +31,9 @@ pub fn minimize_parse_table( keywords, simple_aliases, }; - minimizer.merge_compatible_states(); + if optimizations.contains(OptLevel::MergeStates) { + minimizer.merge_compatible_states(); + } minimizer.remove_unit_reductions(); minimizer.remove_unused_states(); minimizer.reorder_states_by_descending_size(); diff --git a/crates/generate/src/generate.rs b/crates/generate/src/generate.rs index cf6d1009..09e6e389 100644 --- a/crates/generate/src/generate.rs +++ b/crates/generate/src/generate.rs @@ -8,6 +8,7 @@ use std::{ }; use anyhow::Result; +use bitflags::bitflags; use log::warn; use node_types::VariableInfo; use regex::{Regex, RegexBuilder}; @@ -191,6 +192,19 @@ impl From for JSError { } } +bitflags! { + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] + pub struct OptLevel: u32 { + const MergeStates = 1 << 0; + } +} + +impl Default for OptLevel { + fn default() -> Self { + Self::MergeStates + } +} + #[cfg(feature = "load")] #[allow(clippy::too_many_arguments)] pub fn generate_parser_in_directory( @@ -201,6 +215,7 @@ pub fn generate_parser_in_directory( report_symbol_name: Option<&str>, js_runtime: Option<&str>, generate_parser: bool, + optimizations: OptLevel, ) -> GenerateResult<()> where T: Into, @@ -278,6 +293,7 @@ where abi_version, semantic_version.map(|v| (v.major as u8, v.minor as u8, v.patch as u8)), report_symbol_name, + optimizations, )?; write_file(&src_path.join("parser.c"), c_code)?; @@ -301,6 +317,7 @@ pub fn generate_parser_for_grammar( LANGUAGE_VERSION, semantic_version, None, + OptLevel::empty(), )?; Ok((input_grammar.name, parser.c_code)) } @@ -334,6 +351,7 @@ fn generate_parser_for_grammar_with_opts( abi_version: usize, semantic_version: Option<(u8, u8, u8)>, report_symbol_name: Option<&str>, + optimizations: OptLevel, ) -> GenerateResult { let JSONOutput { syntax_grammar, @@ -353,6 +371,7 @@ fn generate_parser_for_grammar_with_opts( &variable_info, &inlines, report_symbol_name, + optimizations, )?; let c_code = render_c_code( &input_grammar.name, From 422866a437a5221617dc100cf6fef941b99ed089 Mon Sep 17 00:00:00 2001 From: WillLillis Date: Fri, 26 Sep 2025 04:11:28 -0400 Subject: [PATCH 513/663] fix(docs): update more broken links --- docs/src/5-implementation.md | 8 ++++---- docs/src/creating-parsers/1-getting-started.md | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/src/5-implementation.md b/docs/src/5-implementation.md index 987a91ff..36963d8e 100644 --- a/docs/src/5-implementation.md +++ b/docs/src/5-implementation.md @@ -51,10 +51,10 @@ WIP [crates]: https://crates.io [npm]: https://npmjs.com [gh]: https://github.com/tree-sitter/tree-sitter/releases/latest -[src]: https://github.com/tree-sitter/tree-sitter/tree/master/cli/src +[src]: https://github.com/tree-sitter/tree-sitter/tree/master/crates/cli/src [schema]: https://tree-sitter.github.io/tree-sitter/assets/schemas/grammar.schema.json -[parse grammar]: https://github.com/tree-sitter/tree-sitter/blob/master/cli/generate/src/parse_grammar.rs +[parse grammar]: https://github.com/tree-sitter/tree-sitter/blob/master/crates/generate/src/parse_grammar.rs [enum]: https://doc.rust-lang.org/book/ch06-01-defining-an-enum.html -[rules.rs]: https://github.com/tree-sitter/tree-sitter/blob/master/cli/generate/src/rules.rs -[prepare grammar]: https://github.com/tree-sitter/tree-sitter/tree/master/cli/generate/src/prepare_grammar +[rules.rs]: https://github.com/tree-sitter/tree-sitter/blob/master/crates/generate/src/rules.rs +[prepare grammar]: https://github.com/tree-sitter/tree-sitter/tree/master/crates/generate/src/prepare_grammar [symbols]: https://en.wikipedia.org/wiki/Terminal_and_nonterminal_symbols diff --git a/docs/src/creating-parsers/1-getting-started.md b/docs/src/creating-parsers/1-getting-started.md index 92159f4a..5095eb75 100644 --- a/docs/src/creating-parsers/1-getting-started.md +++ b/docs/src/creating-parsers/1-getting-started.md @@ -131,6 +131,6 @@ To learn more about this command, check the [reference page](../cli/generate.md) [npm]: https://docs.npmjs.com [path-env]: https://en.wikipedia.org/wiki/PATH_(variable) [releases]: https://github.com/tree-sitter/tree-sitter/releases/latest -[tree-sitter-cli]: https://github.com/tree-sitter/tree-sitter/tree/master/cli +[tree-sitter-cli]: https://github.com/tree-sitter/tree-sitter/tree/master/crates/cli [triple-slash]: https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html [ts-check]: https://www.typescriptlang.org/docs/handbook/intro-to-js-ts.html From d86e1b4f5e36f7e1c2d3dabccc58c26cceeaca82 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Thu, 25 Sep 2025 21:24:39 +0300 Subject: [PATCH 514/663] feat(bindings): generate zig fingerprint --- Cargo.lock | 1 + Cargo.toml | 1 + crates/cli/Cargo.toml | 1 + crates/cli/src/init.rs | 17 ++++++++++++++++- crates/cli/src/templates/build.zig.zon | 1 + 5 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index c1e8905f..5cfb21de 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1909,6 +1909,7 @@ dependencies = [ "clap", "clap_complete", "clap_complete_nushell", + "crc32fast", "ctor", "ctrlc", "dialoguer", diff --git a/Cargo.toml b/Cargo.toml index ba497668..4f6ef9a0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -117,6 +117,7 @@ clap = { version = "4.5.45", features = [ ] } clap_complete = "4.5.57" clap_complete_nushell = "4.5.8" +crc32fast = "1.5.0" ctor = "0.2.9" ctrlc = { version = "3.5.0", features = ["termination"] } dialoguer = { version = "0.11.0", features = ["fuzzy-select"] } diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index b8ac8222..cebbacd3 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -42,6 +42,7 @@ bstr.workspace = true clap.workspace = true clap_complete.workspace = true clap_complete_nushell.workspace = true +crc32fast.workspace = true ctor.workspace = true ctrlc.workspace = true dialoguer.workspace = true diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index 3af16c6e..53ab84f3 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -5,9 +5,11 @@ use std::{ }; use anyhow::{anyhow, Context, Result}; +use crc32fast::hash as crc32; use heck::{ToKebabCase, ToShoutySnakeCase, ToSnakeCase, ToUpperCamelCase}; use indoc::{formatdoc, indoc}; use log::warn; +use rand::{thread_rng, Rng}; use semver::Version; use serde::{Deserialize, Serialize}; use serde_json::{Map, Value}; @@ -33,6 +35,7 @@ const PARSER_LICENSE_PLACEHOLDER: &str = "PARSER_LICENSE"; const PARSER_URL_PLACEHOLDER: &str = "PARSER_URL"; const PARSER_URL_STRIPPED_PLACEHOLDER: &str = "PARSER_URL_STRIPPED"; const PARSER_VERSION_PLACEHOLDER: &str = "PARSER_VERSION"; +const PARSER_FINGERPRINT_PLACEHOLDER: &str = "PARSER_FINGERPRINT"; const AUTHOR_NAME_PLACEHOLDER: &str = "PARSER_AUTHOR_NAME"; const AUTHOR_EMAIL_PLACEHOLDER: &str = "PARSER_AUTHOR_EMAIL"; @@ -154,7 +157,7 @@ impl JsonConfigOpts { authors: Some(vec![Author { name: self.author, email: self.email, - url: self.url.map(|url| url.to_string()), + url: self.url, }]), links: Some(Links { repository: self.repository.unwrap_or_else(|| { @@ -1153,6 +1156,18 @@ fn generate_file( } } + if filename == "build.zig.zon" { + let id = thread_rng().gen_range(1u32..0xFFFF_FFFFu32); + let checksum = crc32(format!("tree_sitter_{language_name}").as_bytes()); + replacement = replacement.replace( + PARSER_FINGERPRINT_PLACEHOLDER, + #[cfg(target_endian = "little")] + &format!("0x{checksum:x}{id:x}"), + #[cfg(target_endian = "big")] + &format!("0x{id:x}{checksum:x}"), + ); + } + write_file(path, replacement)?; Ok(()) } diff --git a/crates/cli/src/templates/build.zig.zon b/crates/cli/src/templates/build.zig.zon index ef084d23..0d542675 100644 --- a/crates/cli/src/templates/build.zig.zon +++ b/crates/cli/src/templates/build.zig.zon @@ -1,5 +1,6 @@ .{ .name = .tree_sitter_PARSER_NAME, + .fingerprint = PARSER_FINGERPRINT, .version = "PARSER_VERSION", .dependencies = .{ .tree_sitter = .{ From 12a6400c63c09d24c404a937cdbe41e0c006c03c Mon Sep 17 00:00:00 2001 From: WillLillis Date: Sat, 27 Sep 2025 03:46:04 -0400 Subject: [PATCH 515/663] fix(test): trim trailing carriage return unconditionally in test contents --- crates/cli/src/test.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/cli/src/test.rs b/crates/cli/src/test.rs index d3a120e3..f192f51b 100644 --- a/crates/cli/src/test.rs +++ b/crates/cli/src/test.rs @@ -1027,7 +1027,6 @@ fn parse_test_content(name: String, content: &str, file_path: Option) - // Remove trailing newline from the input. input.pop(); - #[cfg(target_os = "windows")] if input.last() == Some(&b'\r') { input.pop(); } From bd02be25d52b6337c1fd89e9405ad5c6ee942486 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Fri, 26 Sep 2025 05:27:08 -0400 Subject: [PATCH 516/663] fix(lib): allow anonymous nodes in the supertype query syntax --- lib/src/query.c | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/lib/src/query.c b/lib/src/query.c index 9ea255ac..ead3a339 100644 --- a/lib/src/query.c +++ b/lib/src/query.c @@ -2415,6 +2415,7 @@ static TSQueryError ts_query__parse_pattern( stream_skip_whitespace(stream); + // Parse a supertype symbol if (stream->next == '/') { if (!step->supertype_symbol) { stream_reset(stream, node_name - 1); // reset to the start of the node @@ -2422,20 +2423,31 @@ static TSQueryError ts_query__parse_pattern( } stream_advance(stream); - if (!stream_is_ident_start(stream)) { + + const char *subtype_node_name = stream->input; + + if (stream_is_ident_start(stream)) { // Named node + stream_scan_identifier(stream); + uint32_t length = (uint32_t)(stream->input - subtype_node_name); + step->symbol = ts_language_symbol_for_name( + self->language, + subtype_node_name, + length, + true + ); + } else if (stream->next == '"') { // Anonymous leaf node + TSQueryError e = ts_query__parse_string_literal(self, stream); + if (e) return e; + step->symbol = ts_language_symbol_for_name( + self->language, + self->string_buffer.contents, + self->string_buffer.size, + false + ); + } else { return TSQueryErrorSyntax; } - const char *subtype_node_name = stream->input; - stream_scan_identifier(stream); - uint32_t length = (uint32_t)(stream->input - subtype_node_name); - - step->symbol = ts_language_symbol_for_name( - self->language, - subtype_node_name, - length, - true - ); if (!step->symbol) { stream_reset(stream, subtype_node_name); return TSQueryErrorNodeType; From 341665824c52b3c9259cfaea1fc179f615dccf3a Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Fri, 26 Sep 2025 16:58:10 -0400 Subject: [PATCH 517/663] fix(lib): validate subtypes in supertype queries --- crates/cli/src/tests/query_test.rs | 57 +++++++++++++++++-- docs/src/using-parsers/queries/1-syntax.md | 6 ++ .../queries/3-predicates-and-directives.md | 2 +- lib/src/query.c | 49 ++++++++++++++-- 4 files changed, 104 insertions(+), 10 deletions(-) diff --git a/crates/cli/src/tests/query_test.rs b/crates/cli/src/tests/query_test.rs index fdbdaab8..e70dd26b 100644 --- a/crates/cli/src/tests/query_test.rs +++ b/crates/cli/src/tests/query_test.rs @@ -416,11 +416,11 @@ fn test_query_errors_on_impossible_patterns() { Err(QueryError { kind: QueryErrorKind::Structure, row: 0, - offset: 51, - column: 51, + offset: 37, + column: 37, message: [ "(binary_expression left: (expression (identifier)) left: (expression (identifier)))", - " ^", + " ^", ] .join("\n"), }) @@ -5773,7 +5773,7 @@ fn test_query_assertion_on_unreachable_node_with_child() { // A query that tries to capture the `await` token in the `await_binding` rule // should not cause an assertion failure during query analysis. let grammar = r#" -module.exports = grammar({ +export default grammar({ name: "query_assertion_crash", rules: { @@ -5820,3 +5820,52 @@ module.exports = grammar({ } ); } + +#[test] +fn test_query_supertype_with_anonymous_node() { + let grammar = r#" +export default grammar({ + name: "supertype_anonymous_test", + + extras: $ => [/\s/, $.comment], + + supertypes: $ => [$.expression], + + word: $ => $.identifier, + + rules: { + source_file: $ => repeat($.expression), + + expression: $ => choice( + $.function_call, + '()' // an empty tuple, which should be queryable with the supertype syntax + ), + + function_call: $ => seq($.identifier, '()'), + + identifier: _ => /[a-zA-Z_][a-zA-Z0-9_]*/, + + comment: _ => token(seq('//', /.*/)), + } +}); + "#; + + let file = tempfile::NamedTempFile::with_suffix(".js").unwrap(); + std::fs::write(file.path(), grammar).unwrap(); + + let grammar_json = load_grammar_file(file.path(), None).unwrap(); + + let (parser_name, parser_code) = generate_parser(&grammar_json).unwrap(); + + let language = get_test_language(&parser_name, &parser_code, None); + + let query_result = Query::new(&language, r#"(expression/"()") @tuple"#); + + assert!(query_result.is_ok()); + + let query = query_result.unwrap(); + + let source = "foo()\n()"; + + assert_query_matches(&language, &query, source, &[(0, vec![("tuple", "()")])]); +} diff --git a/docs/src/using-parsers/queries/1-syntax.md b/docs/src/using-parsers/queries/1-syntax.md index a12cec70..0f02be61 100644 --- a/docs/src/using-parsers/queries/1-syntax.md +++ b/docs/src/using-parsers/queries/1-syntax.md @@ -115,6 +115,12 @@ match a `binary_expression` only if it is a child of `expression`: (expression/binary_expression) @binary-expression ``` +This also applies to anonymous nodes. For example, this pattern would match `"()"` only if it is a child of `expression`: + +```query +(expression/"()") @empty-expression +``` + [grammar]: ../../creating-parsers/3-writing-the-grammar.md#structuring-rules-well [node-field-names]: ../2-basic-parsing.md#node-field-names [named-vs-anonymous-nodes]: ../2-basic-parsing.md#named-vs-anonymous-nodes diff --git a/docs/src/using-parsers/queries/3-predicates-and-directives.md b/docs/src/using-parsers/queries/3-predicates-and-directives.md index a059a3ba..88e01e01 100644 --- a/docs/src/using-parsers/queries/3-predicates-and-directives.md +++ b/docs/src/using-parsers/queries/3-predicates-and-directives.md @@ -140,7 +140,7 @@ see fit. ```query ((comment) @injection.content - (#lua-match? @injection.content "/[*\/][!*\/]steps.size; i++) { QueryStep *step = array_get(&self->steps, i); if (step->depth == PATTERN_DONE_MARKER) { @@ -1510,8 +1511,45 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { has_children = true; } - if (has_children && !is_wildcard) { - array_push(&parent_step_indices, i); + if (has_children) { + if (!is_wildcard) { + array_push(&parent_step_indices, i); + } else if (step->supertype_symbol && self->language->abi_version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS) { + // Look at the child steps to see if any aren't valid subtypes for this supertype. + uint32_t subtype_length; + const TSSymbol *subtypes = ts_language_subtypes( + self->language, + step->supertype_symbol, + &subtype_length + ); + + for (unsigned j = i + 1; j < self->steps.size; j++) { + QueryStep *child_step = array_get(&self->steps, j); + if (child_step->depth == PATTERN_DONE_MARKER || child_step->depth <= step->depth) { + break; + } + if (child_step->depth == step->depth + 1 && child_step->symbol != WILDCARD_SYMBOL) { + bool is_valid_subtype = false; + for (uint32_t k = 0; k < subtype_length; k++) { + if (child_step->symbol == subtypes[k]) { + is_valid_subtype = true; + break; + } + } + + if (!is_valid_subtype) { + for (unsigned offset_idx = 0; offset_idx < self->step_offsets.size; offset_idx++) { + StepOffset *step_offset = array_get(&self->step_offsets, offset_idx); + if (step_offset->step_index >= j) { + *error_offset = step_offset->byte_offset; + all_patterns_are_valid = false; + goto supertype_cleanup; + } + } + } + } + } + } } } @@ -1684,7 +1722,6 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { // For each non-terminal pattern, determine if the pattern can successfully match, // and identify all of the possible children within the pattern where matching could fail. - bool all_patterns_are_valid = true; QueryAnalysis analysis = query_analysis__new(); for (unsigned i = 0; i < parent_step_indices.size; i++) { uint16_t parent_step_index = *array_get(&parent_step_indices, i); @@ -1962,11 +1999,13 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { array_delete(&subgraphs); query_analysis__delete(&analysis); array_delete(&next_nodes); - array_delete(&non_rooted_pattern_start_steps); - array_delete(&parent_step_indices); array_delete(&predicate_capture_ids); state_predecessor_map_delete(&predecessor_map); +supertype_cleanup: + array_delete(&non_rooted_pattern_start_steps); + array_delete(&parent_step_indices); + return all_patterns_are_valid; } From 00e394f0f18101c10e3dec8e42e2b6c215e68c16 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sat, 27 Sep 2025 20:49:45 -0400 Subject: [PATCH 518/663] feat(lib)!: disallow whitespace in supertype syntax --- crates/cli/src/tests/query_test.rs | 14 ++++++++++++++ lib/src/query.c | 6 ++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/crates/cli/src/tests/query_test.rs b/crates/cli/src/tests/query_test.rs index e70dd26b..b59a1f42 100644 --- a/crates/cli/src/tests/query_test.rs +++ b/crates/cli/src/tests/query_test.rs @@ -238,6 +238,20 @@ fn test_query_errors_on_invalid_syntax() { ] .join("\n") ); + assert_eq!( + Query::new(&language, "(statement / export_statement)").unwrap_err(), + QueryError { + row: 0, + offset: 11, + column: 11, + kind: QueryErrorKind::Syntax, + message: [ + "(statement / export_statement)", // + " ^" + ] + .join("\n") + } + ); }); } diff --git a/lib/src/query.c b/lib/src/query.c index 302e3f59..56e32873 100644 --- a/lib/src/query.c +++ b/lib/src/query.c @@ -2452,8 +2452,6 @@ static TSQueryError ts_query__parse_pattern( step->is_named = true; } - stream_skip_whitespace(stream); - // Parse a supertype symbol if (stream->next == '/') { if (!step->supertype_symbol) { @@ -2516,10 +2514,10 @@ static TSQueryError ts_query__parse_pattern( return TSQueryErrorStructure; } } - - stream_skip_whitespace(stream); } + stream_skip_whitespace(stream); + // Parse the child patterns bool child_is_immediate = false; uint16_t last_child_step_index = 0; From 443acf080a91d8c20648838aabfc238ae01d1cb6 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Sun, 28 Sep 2025 10:16:23 +0300 Subject: [PATCH 519/663] ci(dependabot): enable cooldown period This setting will delay package updates by 3 days which generally should be enough time for supply chain attacks to be discovered --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 1466f049..b338f1a5 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,6 +4,8 @@ updates: directory: "/" schedule: interval: "weekly" + cooldown: + default-days: 3 commit-message: prefix: "build(deps)" labels: @@ -16,6 +18,8 @@ updates: directory: "/" schedule: interval: "weekly" + cooldown: + default-days: 3 commit-message: prefix: "ci" labels: @@ -31,6 +35,8 @@ updates: - "/lib/binding_web" schedule: interval: "weekly" + cooldown: + default-days: 3 commit-message: prefix: "build(deps)" labels: From 35b1356e96bf5edacbd2ac7b25a11355dcb007dd Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Sun, 28 Sep 2025 11:12:41 +0300 Subject: [PATCH 520/663] ci(dependabot): update package.json as well --- .github/dependabot.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index b338f1a5..328f241d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -29,6 +29,7 @@ updates: actions: patterns: ["*"] - package-ecosystem: "npm" + versioning-strategy: increase directories: - "/crates/npm" - "/crates/eslint" From be0c44f871c54f19af061cacd01cee8548bd8682 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 Sep 2025 08:18:33 +0000 Subject: [PATCH 521/663] build(deps): bump the cargo group with 7 updates Bumps the cargo group with 7 updates: | Package | From | To | | --- | --- | --- | | [anyhow](https://github.com/dtolnay/anyhow) | `1.0.99` | `1.0.100` | | [cc](https://github.com/rust-lang/cc-rs) | `1.2.37` | `1.2.39` | | [clap](https://github.com/clap-rs/clap) | `4.5.47` | `4.5.48` | | [clap_complete](https://github.com/clap-rs/clap) | `4.5.57` | `4.5.58` | | [indexmap](https://github.com/indexmap-rs/indexmap) | `2.11.1` | `2.11.4` | | [libloading](https://github.com/nagisa/rust_libloading) | `0.8.8` | `0.8.9` | | [tempfile](https://github.com/Stebalien/tempfile) | `3.22.0` | `3.23.0` | Updates `anyhow` from 1.0.99 to 1.0.100 - [Release notes](https://github.com/dtolnay/anyhow/releases) - [Commits](https://github.com/dtolnay/anyhow/compare/1.0.99...1.0.100) Updates `cc` from 1.2.37 to 1.2.39 - [Release notes](https://github.com/rust-lang/cc-rs/releases) - [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md) - [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.37...cc-v1.2.39) Updates `clap` from 4.5.47 to 4.5.48 - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.47...clap_complete-v4.5.48) Updates `clap_complete` from 4.5.57 to 4.5.58 - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.57...clap_complete-v4.5.58) Updates `indexmap` from 2.11.1 to 2.11.4 - [Changelog](https://github.com/indexmap-rs/indexmap/blob/main/RELEASES.md) - [Commits](https://github.com/indexmap-rs/indexmap/compare/2.11.1...2.11.4) Updates `libloading` from 0.8.8 to 0.8.9 - [Commits](https://github.com/nagisa/rust_libloading/compare/0.8.8...0.8.9) Updates `tempfile` from 3.22.0 to 3.23.0 - [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md) - [Commits](https://github.com/Stebalien/tempfile/compare/v3.22.0...v3.23.0) --- updated-dependencies: - dependency-name: anyhow dependency-version: 1.0.100 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: cc dependency-version: 1.2.39 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: clap dependency-version: 4.5.48 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: clap_complete dependency-version: 4.5.58 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: indexmap dependency-version: 2.11.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: libloading dependency-version: 0.8.9 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: tempfile dependency-version: 3.23.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 39 ++++++++++++++++++++------------------- Cargo.toml | 14 +++++++------- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5cfb21de..07246ee0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -87,9 +87,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.99" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "arbitrary" @@ -192,9 +192,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.37" +version = "1.2.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44" +checksum = "e1354349954c6fc9cb0deab020f27f783cf0b604e8bb754dc4658ecf0d29c35f" dependencies = [ "find-msvc-tools", "shlex", @@ -246,9 +246,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.47" +version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" +checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" dependencies = [ "clap_builder", "clap_derive", @@ -256,9 +256,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.47" +version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" +checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" dependencies = [ "anstream", "anstyle", @@ -268,9 +268,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.57" +version = "4.5.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d9501bd3f5f09f7bbee01da9a511073ed30a80cd7a509f1214bb74eadea71ad" +checksum = "75bf0b32ad2e152de789bb635ea4d3078f6b838ad7974143e99b99f45a04af4a" dependencies = [ "clap", ] @@ -658,9 +658,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" +checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" [[package]] name = "fnv" @@ -906,13 +906,14 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.1" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", "hashbrown", "serde", + "serde_core", ] [[package]] @@ -1058,12 +1059,12 @@ checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libloading" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-targets 0.53.3", + "windows-link 0.2.0", ] [[package]] @@ -1739,9 +1740,9 @@ checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" [[package]] name = "tempfile" -version = "3.22.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", "getrandom 0.3.3", diff --git a/Cargo.toml b/Cargo.toml index 4f6ef9a0..c9c21300 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -104,10 +104,10 @@ codegen-units = 256 [workspace.dependencies] ansi_colours = "1.2.3" anstyle = "1.0.11" -anyhow = "1.0.99" +anyhow = "1.0.100" bstr = "1.12.0" -cc = "1.2.37" -clap = { version = "4.5.45", features = [ +cc = "1.2.39" +clap = { version = "4.5.48", features = [ "cargo", "derive", "env", @@ -115,7 +115,7 @@ clap = { version = "4.5.45", features = [ "string", "unstable-styles", ] } -clap_complete = "4.5.57" +clap_complete = "4.5.58" clap_complete_nushell = "4.5.8" crc32fast = "1.5.0" ctor = "0.2.9" @@ -126,9 +126,9 @@ fs4 = "0.12.0" glob = "0.3.3" heck = "0.5.0" html-escape = "0.2.13" -indexmap = "2.11.1" +indexmap = "2.11.4" indoc = "2.0.6" -libloading = "0.8.8" +libloading = "0.8.9" log = { version = "0.4.28", features = ["std"] } memchr = "2.7.5" once_cell = "1.21.3" @@ -143,7 +143,7 @@ serde_json = { version = "1.0.145", features = ["preserve_order"] } similar = "2.7.0" smallbitvec = "2.6.0" streaming-iterator = "0.1.9" -tempfile = "3.22.0" +tempfile = "3.23.0" thiserror = "2.0.16" tiny_http = "0.12.0" topological-sort = "0.2.2" From 4edcca985059aed686dfe8022a5e15dd322a8008 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sun, 28 Sep 2025 05:13:30 -0400 Subject: [PATCH 522/663] style(loader): appease clippy --- crates/loader/src/loader.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index a004c0d9..cbff2fc6 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -1291,7 +1291,9 @@ impl Loader { if path.starts_with(parser_path) { Ok(path) } else { - Err(anyhow!("External file path {path:?} is outside of parser directory {parser_path:?}")) + Err(anyhow!( + "External file path {} is outside of parser directory {}", path.display(), parser_path.display(), + )) } }) .collect::>>() From 122493b7171d1c78b0396921a47087fe708c919d Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sun, 28 Sep 2025 05:25:08 -0400 Subject: [PATCH 523/663] style(cli): appease clippy --- crates/cli/src/test_highlight.rs | 7 ++++++- crates/cli/src/test_tags.rs | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/crates/cli/src/test_highlight.rs b/crates/cli/src/test_highlight.rs index b03270c6..156cd047 100644 --- a/crates/cli/src/test_highlight.rs +++ b/crates/cli/src/test_highlight.rs @@ -98,7 +98,12 @@ fn test_highlights_indented( })?; let highlight_config = language_config .highlight_config(language, None)? - .ok_or_else(|| anyhow!("No highlighting config found for {test_file_path:?}"))?; + .ok_or_else(|| { + anyhow!( + "No highlighting config found for {}", + test_file_path.display() + ) + })?; match test_highlight( loader, highlighter, diff --git a/crates/cli/src/test_tags.rs b/crates/cli/src/test_tags.rs index e5a68443..9b3ed683 100644 --- a/crates/cli/src/test_tags.rs +++ b/crates/cli/src/test_tags.rs @@ -97,7 +97,7 @@ pub fn test_tags_indented( })?; let tags_config = language_config .tags_config(language)? - .ok_or_else(|| anyhow!("No tags config found for {test_file_path:?}"))?; + .ok_or_else(|| anyhow!("No tags config found for {}", test_file_path.display()))?; match test_tag( tags_context, tags_config, From 24c8feba3ea2e0e054de3f64333e554ca9353e38 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sun, 28 Sep 2025 07:28:27 -0400 Subject: [PATCH 524/663] fix(bindings): fix root detection on windows --- crates/cli/src/templates/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/cli/src/templates/index.js b/crates/cli/src/templates/index.js index 233261d0..4b363040 100644 --- a/crates/cli/src/templates/index.js +++ b/crates/cli/src/templates/index.js @@ -1,4 +1,6 @@ -const root = new URL("../..", import.meta.url).pathname; +import { fileURLToPath } from "node:url"; + +const root = fileURLToPath(new URL("../..", import.meta.url)); const binding = typeof process.versions.bun === "string" // Support `bun build --compile` by being statically analyzable enough to find the .node file at build-time From 92efd26380b103547678950c9d1a813aa8fb7efe Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sun, 21 Sep 2025 16:56:45 -0400 Subject: [PATCH 525/663] fix(loader): allow parallel compilation on windows --- .github/workflows/build.yml | 5 +---- crates/loader/src/loader.rs | 25 +++++++++++++++++++++++-- crates/xtask/src/test.rs | 6 ------ 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 62b45485..2131305f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -74,10 +74,7 @@ jobs: run: | printf 'EMSCRIPTEN_VERSION=%s\n' "$(> $GITHUB_ENV - if [[ '${{ matrix.platform }}' =~ ^windows ]]; then - # Prevent race condition (see #2041) - printf 'RUST_TEST_THREADS=1\n' >> $GITHUB_ENV - elif [[ '${{ matrix.cross }}' == true ]]; then + if [[ '${{ matrix.cross }}' == true ]]; then for target in armv7-unknown-linux-gnueabihf i686-unknown-linux-gnu powerpc64-unknown-linux-gnu; do camel_target=${target//-/_}; target_cc=${target/-unknown/} printf 'CC_%s=%s\n' "$camel_target" "${target_cc/v7/}-gcc" diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index cbff2fc6..39099797 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -904,12 +904,27 @@ impl Loader { let output_path = config.output_path.as_ref().unwrap(); - if compiler.is_like_msvc() { + let temp_dir = if compiler.is_like_msvc() { let out = format!("-out:{}", output_path.to_str().unwrap()); command.arg(if self.debug_build { "-LDd" } else { "-LD" }); command.arg("-utf-8"); + + // Windows creates intermediate files when compiling (.exp, .lib, .obj), which causes + // issues when multiple processes are compiling in the same directory. This creates a + // temporary directory for those files to go into, which is deleted after compilation. + let temp_dir = output_path.parent().unwrap().join(format!( + "tmp_{}_{:?}", + std::process::id(), + std::thread::current().id() + )); + std::fs::create_dir_all(&temp_dir).unwrap(); + + command.arg(format!("/Fo{}\\", temp_dir.display())); command.args(cc_config.get_files()); command.arg("-link").arg(out); + command.arg(format!("/IMPLIB:{}.lib", temp_dir.join("temp").display())); + + Some(temp_dir) } else { command.arg("-Werror=implicit-function-declaration"); if cfg!(any(target_os = "macos", target_os = "ios")) { @@ -921,12 +936,18 @@ impl Loader { } command.args(cc_config.get_files()); command.arg("-o").arg(output_path); - } + + None + }; let output = command.output().with_context(|| { format!("Failed to execute the C compiler with the following command:\n{command:?}") })?; + if let Some(temp_dir) = temp_dir { + let _ = fs::remove_dir_all(temp_dir); + } + FileExt::unlock(lock_file)?; fs::remove_file(lock_path)?; diff --git a/crates/xtask/src/test.rs b/crates/xtask/src/test.rs index 467245dc..6b8d8243 100644 --- a/crates/xtask/src/test.rs +++ b/crates/xtask/src/test.rs @@ -73,9 +73,6 @@ pub fn run(args: &Test) -> Result<()> { .arg("--no-run") .arg("--message-format=json"); - #[cfg(target_os = "windows")] - cargo_cmd.arg("--").arg("--test-threads=1"); - let cargo_cmd = cargo_cmd.stdout(Stdio::piped()).spawn()?; let jq_cmd = Command::new("jq") @@ -103,9 +100,6 @@ pub fn run(args: &Test) -> Result<()> { } cargo_cmd.args(&args.args); - #[cfg(target_os = "windows")] - cargo_cmd.arg("--").arg("--test-threads=1"); - if args.nocapture { #[cfg(not(target_os = "windows"))] cargo_cmd.arg("--"); From c5b22a1dc66bdeaed99596497dac7194d1da809f Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Mon, 29 Sep 2025 04:39:44 -0400 Subject: [PATCH 526/663] ci: split cross compilation and emscripten tag read --- .github/workflows/build.yml | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2131305f..7697ac8f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -70,22 +70,23 @@ jobs: - name: Checkout repository uses: actions/checkout@v5 - - name: Set up environment + - name: Set up cross-compilation + if: matrix.cross run: | - printf 'EMSCRIPTEN_VERSION=%s\n' "$(> $GITHUB_ENV + for target in armv7-unknown-linux-gnueabihf i686-unknown-linux-gnu powerpc64-unknown-linux-gnu; do + camel_target=${target//-/_}; target_cc=${target/-unknown/} + printf 'CC_%s=%s\n' "$camel_target" "${target_cc/v7/}-gcc" + printf 'AR_%s=%s\n' "$camel_target" "${target_cc/v7/}-ar" + printf 'CARGO_TARGET_%s_LINKER=%s\n' "${camel_target^^}" "${target_cc/v7/}-gcc" + done >> $GITHUB_ENV + { + printf 'CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_RUNNER=qemu-arm -L /usr/arm-linux-gnueabihf\n' + printf 'CARGO_TARGET_POWERPC64_UNKNOWN_LINUX_GNU_RUNNER=qemu-ppc64 -L /usr/powerpc64-linux-gnu\n' + } >> $GITHUB_ENV - if [[ '${{ matrix.cross }}' == true ]]; then - for target in armv7-unknown-linux-gnueabihf i686-unknown-linux-gnu powerpc64-unknown-linux-gnu; do - camel_target=${target//-/_}; target_cc=${target/-unknown/} - printf 'CC_%s=%s\n' "$camel_target" "${target_cc/v7/}-gcc" - printf 'AR_%s=%s\n' "$camel_target" "${target_cc/v7/}-ar" - printf 'CARGO_TARGET_%s_LINKER=%s\n' "${camel_target^^}" "${target_cc/v7/}-gcc" - done >> $GITHUB_ENV - { - printf 'CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_RUNNER=qemu-arm -L /usr/arm-linux-gnueabihf\n' - printf 'CARGO_TARGET_POWERPC64_UNKNOWN_LINUX_GNU_RUNNER=qemu-ppc64 -L /usr/powerpc64-linux-gnu\n' - } >> $GITHUB_ENV - fi + - name: Get emscripten version + if: contains(matrix.features, 'wasm') + run: printf 'EMSCRIPTEN_VERSION=%s\n' "$(> $GITHUB_ENV - name: Install Emscripten if: contains(matrix.features, 'wasm') From 1dc4804b6eed75d59b31cc7080d770f6a5ca85b2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Sep 2025 22:50:35 +0000 Subject: [PATCH 527/663] build(deps): bump the cargo group with 2 updates Bumps the cargo group with 2 updates: [memchr](https://github.com/BurntSushi/memchr) and [regex](https://github.com/rust-lang/regex). Updates `memchr` from 2.7.5 to 2.7.6 - [Commits](https://github.com/BurntSushi/memchr/compare/2.7.5...2.7.6) Updates `regex` from 1.11.2 to 1.11.3 - [Release notes](https://github.com/rust-lang/regex/releases) - [Changelog](https://github.com/rust-lang/regex/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-lang/regex/compare/1.11.2...1.11.3) --- updated-dependencies: - dependency-name: memchr dependency-version: 2.7.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: regex dependency-version: 1.11.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 12 ++++++------ Cargo.toml | 4 ++-- lib/Cargo.toml | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 07246ee0..65cfb44c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1108,9 +1108,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memfd" @@ -1448,9 +1448,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.2" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" dependencies = [ "aho-corasick", "memchr", @@ -1460,9 +1460,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" dependencies = [ "aho-corasick", "memchr", diff --git a/Cargo.toml b/Cargo.toml index c9c21300..23d11357 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -130,11 +130,11 @@ indexmap = "2.11.4" indoc = "2.0.6" libloading = "0.8.9" log = { version = "0.4.28", features = ["std"] } -memchr = "2.7.5" +memchr = "2.7.6" once_cell = "1.21.3" pretty_assertions = "1.4.1" rand = "0.8.5" -regex = "1.11.2" +regex = "1.11.3" regex-syntax = "0.8.6" rustc-hash = "2.1.1" semver = { version = "1.0.27", features = ["serde"] } diff --git a/lib/Cargo.toml b/lib/Cargo.toml index 45434a7a..64a9e8eb 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -47,7 +47,7 @@ std = ["regex/std", "regex/perf", "regex-syntax/unicode"] wasm = ["std", "wasmtime-c-api"] [dependencies] -regex = { version = "1.11.2", default-features = false, features = ["unicode"] } +regex = { version = "1.11.3", default-features = false, features = ["unicode"] } regex-syntax = { version = "0.8.6", default-features = false } tree-sitter-language.workspace = true streaming-iterator = "0.1.9" From 0cf6e7c5074e20781d8c4540bc71ab905843a24b Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Wed, 1 Oct 2025 09:33:38 +0300 Subject: [PATCH 528/663] fix(cli): prevent crash when parsing stdin When we are parsing stdin via a pipe or heredoc, the source count is 0 (unsigned) so the XML output crashes while trying to subtract from it. --- crates/cli/src/parse.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/crates/cli/src/parse.rs b/crates/cli/src/parse.rs index 61e4a86f..4b941fe3 100644 --- a/crates/cli/src/parse.rs +++ b/crates/cli/src/parse.rs @@ -230,13 +230,23 @@ impl ParseSummary { } } -#[derive(Serialize, Debug, Default)] +#[derive(Serialize, Debug)] pub struct ParseStats { pub parse_summaries: Vec, pub cumulative_stats: Stats, pub source_count: usize, } +impl Default for ParseStats { + fn default() -> Self { + Self { + parse_summaries: Vec::new(), + cumulative_stats: Stats::default(), + source_count: 1, + } + } +} + #[derive(Serialize, ValueEnum, Debug, Copy, Clone, Default, Eq, PartialEq)] pub enum ParseDebugType { #[default] From 0f5ccc4aba64096b74b7875fbc53d285515650ac Mon Sep 17 00:00:00 2001 From: Mihai-Daniel Potirniche Date: Sat, 4 Oct 2025 14:41:13 +0300 Subject: [PATCH 529/663] Fix typo --- crates/cli/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 6f64c801..5b1948e2 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -1078,7 +1078,7 @@ impl Parse { lib_info.as_ref(), ) .with_context(|| { - anyhow!("Failed to load langauge for path \"{}\"", path.display()) + anyhow!("Failed to load language for path \"{}\"", path.display()) })?; parse::parse_file_at_path( From 7d0e029e37a0c18d2a04bede09028a4f03c17d28 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Sat, 4 Oct 2025 10:39:28 +0300 Subject: [PATCH 530/663] chore: add schema for node-types.json --- .../src/assets/schemas/node-types.schema.json | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 docs/src/assets/schemas/node-types.schema.json diff --git a/docs/src/assets/schemas/node-types.schema.json b/docs/src/assets/schemas/node-types.schema.json new file mode 100644 index 00000000..7ea8a5af --- /dev/null +++ b/docs/src/assets/schemas/node-types.schema.json @@ -0,0 +1,108 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Tree-sitter node types specification", + "type": "array", + "items": { + "$ref": "#/definitions/NodeInfo" + }, + "definitions": { + "NodeInfo": { + "type": "object", + "required": [ + "type", + "named" + ], + "properties": { + "type": { + "type": "string" + }, + "named": { + "type": "boolean" + }, + "root": { + "type": "boolean", + "default": false + }, + "extra": { + "type": "boolean", + "default": false + }, + "fields": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/FieldInfo" + } + }, + "children": { + "$ref": "#/definitions/FieldInfo" + }, + "subtypes": { + "type": "array", + "items": { + "$ref": "#/definitions/NodeType" + } + } + }, + "oneOf": [ + { + "description": "Regular node", + "properties": { + "subtypes": false + } + }, + { + "description": "Supertype node", + "required": [ + "subtypes" + ], + "properties": { + "children": false, + "fields": false + } + } + ] + }, + "NodeType": { + "type": "object", + "required": [ + "type", + "named" + ], + "properties": { + "type": { + "type": "string", + "description": "The kind of node type" + }, + "named": { + "type": "boolean", + "description": "Whether the node type is named" + } + } + }, + "FieldInfo": { + "type": "object", + "required": [ + "multiple", + "required", + "types" + ], + "properties": { + "multiple": { + "type": "boolean", + "default": false + }, + "required": { + "type": "boolean", + "default": true + }, + "types": { + "type": "array", + "default": [], + "items": { + "$ref": "#/definitions/NodeType" + } + } + } + } + } +} From 3355825a687d6334d72c789cdbcc8417dd80920f Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Mon, 6 Oct 2025 18:03:18 -0400 Subject: [PATCH 531/663] fix(cli): don't load languages for `build` command --- crates/cli/src/main.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 5b1948e2..ad7667c2 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -939,9 +939,6 @@ impl Build { loader.force_rebuild(true); - let config = Config::load(None)?; - let loader_config = config.get()?; - loader.find_all_languages(&loader_config).unwrap(); loader .compile_parser_at_path(&grammar_path, output_path, flags) .unwrap(); From ae54350c768bef373c92791d782d12f7c86425be Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Thu, 9 Oct 2025 18:08:59 -0400 Subject: [PATCH 532/663] fix(generate): Add missing fields to `NodeInfoJson` sorting This ensures a deterministic ordering for node-types.json --- crates/generate/src/node_types.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/crates/generate/src/node_types.rs b/crates/generate/src/node_types.rs index 748a3d58..8b7eb397 100644 --- a/crates/generate/src/node_types.rs +++ b/crates/generate/src/node_types.rs @@ -784,6 +784,9 @@ pub fn generate_node_types_json( a_is_leaf.cmp(&b_is_leaf) }) .then_with(|| a.kind.cmp(&b.kind)) + .then_with(|| a.named.cmp(&b.named)) + .then_with(|| a.root.cmp(&b.root)) + .then_with(|| a.extra.cmp(&b.extra)) }); result.dedup(); Ok(result) From 00d172bf9f13a187756761ab300c9b5c05e4360d Mon Sep 17 00:00:00 2001 From: WillLillis Date: Mon, 6 Oct 2025 00:26:24 -0400 Subject: [PATCH 533/663] fix(generate): correct display of precedence for `--report-states-for-rule` --- crates/generate/src/build_tables/item.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/generate/src/build_tables/item.rs b/crates/generate/src/build_tables/item.rs index 0beb3e3c..cd70ce74 100644 --- a/crates/generate/src/build_tables/item.rs +++ b/crates/generate/src/build_tables/item.rs @@ -204,7 +204,7 @@ impl fmt::Display for ParseItemDisplay<'_> { || step.reserved_word_set_id != ReservedWordSetId::default() { write!(f, " (")?; - if step.precedence.is_none() { + if !step.precedence.is_none() { write!(f, " {}", step.precedence)?; } if let Some(associativity) = step.associativity { From 262f1782cc6d6194b9010c92274e8127e0432e50 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Sat, 11 Oct 2025 17:33:47 -0400 Subject: [PATCH 534/663] fix(generate): ensure deterministic iteration order for symbol aliases while constructing node-types.json --- crates/generate/src/node_types.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/crates/generate/src/node_types.rs b/crates/generate/src/node_types.rs index 8b7eb397..f50af44f 100644 --- a/crates/generate/src/node_types.rs +++ b/crates/generate/src/node_types.rs @@ -1,4 +1,4 @@ -use std::collections::{BTreeMap, HashMap, HashSet}; +use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use anyhow::Result; use serde::Serialize; @@ -378,11 +378,11 @@ pub fn get_variable_info( fn get_aliases_by_symbol( syntax_grammar: &SyntaxGrammar, default_aliases: &AliasMap, -) -> HashMap>> { +) -> HashMap>> { let mut aliases_by_symbol = HashMap::new(); for (symbol, alias) in default_aliases { aliases_by_symbol.insert(*symbol, { - let mut aliases = HashSet::new(); + let mut aliases = BTreeSet::new(); aliases.insert(Some(alias.clone())); aliases }); @@ -391,7 +391,7 @@ fn get_aliases_by_symbol( if !default_aliases.contains_key(extra_symbol) { aliases_by_symbol .entry(*extra_symbol) - .or_insert_with(HashSet::new) + .or_insert_with(BTreeSet::new) .insert(None); } } @@ -400,7 +400,7 @@ fn get_aliases_by_symbol( for step in &production.steps { aliases_by_symbol .entry(step.symbol) - .or_insert_with(HashSet::new) + .or_insert_with(BTreeSet::new) .insert( step.alias .as_ref() @@ -531,7 +531,7 @@ pub fn generate_node_types_json( let aliases_by_symbol = get_aliases_by_symbol(syntax_grammar, default_aliases); - let empty = HashSet::new(); + let empty = BTreeSet::new(); let extra_names = syntax_grammar .extra_symbols .iter() @@ -590,7 +590,7 @@ pub fn generate_node_types_json( } else if !syntax_grammar.variables_to_inline.contains(&symbol) { // If a rule is aliased under multiple names, then its information // contributes to multiple entries in the final JSON. - for alias in aliases_by_symbol.get(&symbol).unwrap_or(&HashSet::new()) { + for alias in aliases_by_symbol.get(&symbol).unwrap_or(&BTreeSet::new()) { let kind; let is_named; if let Some(alias) = alias { From b3bc7701cd09171635454b32ca37307354248d4a Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Sat, 11 Oct 2025 17:51:48 -0400 Subject: [PATCH 535/663] refactor(generate): make `AliasMap` use `BTreeMap` over `HashMap` --- crates/generate/src/generate.rs | 4 ++-- crates/generate/src/rules.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/generate/src/generate.rs b/crates/generate/src/generate.rs index 09e6e389..c4a1ec84 100644 --- a/crates/generate/src/generate.rs +++ b/crates/generate/src/generate.rs @@ -1,4 +1,4 @@ -use std::{collections::HashMap, sync::LazyLock}; +use std::{collections::BTreeMap, sync::LazyLock}; #[cfg(feature = "load")] use std::{ env, fs, @@ -57,7 +57,7 @@ struct JSONOutput { syntax_grammar: SyntaxGrammar, lexical_grammar: LexicalGrammar, inlines: InlinedProductionMap, - simple_aliases: HashMap, + simple_aliases: BTreeMap, variable_info: Vec, } diff --git a/crates/generate/src/rules.rs b/crates/generate/src/rules.rs index cd4aa482..a8499166 100644 --- a/crates/generate/src/rules.rs +++ b/crates/generate/src/rules.rs @@ -1,4 +1,4 @@ -use std::{collections::HashMap, fmt}; +use std::{collections::BTreeMap, fmt}; use serde::Serialize; use smallbitvec::SmallBitVec; @@ -34,7 +34,7 @@ pub enum Precedence { Name(String), } -pub type AliasMap = HashMap; +pub type AliasMap = BTreeMap; #[derive(Clone, Debug, Default, PartialEq, Eq, Hash, Serialize)] pub struct MetadataParams { From da5926d6f571475625bd631c593b255c437e9135 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 21:09:27 +0000 Subject: [PATCH 536/663] build(deps): bump the cargo group across 1 directory with 4 updates Bumps the cargo group with 4 updates in the / directory: [anstyle](https://github.com/rust-cli/anstyle), [cc](https://github.com/rust-lang/cc-rs), [thiserror](https://github.com/dtolnay/thiserror) and [widestring](https://github.com/VoidStarKat/widestring-rs). Updates `anstyle` from 1.0.11 to 1.0.13 - [Commits](https://github.com/rust-cli/anstyle/compare/v1.0.11...v1.0.13) Updates `cc` from 1.2.39 to 1.2.41 - [Release notes](https://github.com/rust-lang/cc-rs/releases) - [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md) - [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.39...cc-v1.2.41) Updates `thiserror` from 2.0.16 to 2.0.17 - [Release notes](https://github.com/dtolnay/thiserror/releases) - [Commits](https://github.com/dtolnay/thiserror/compare/2.0.16...2.0.17) Updates `widestring` from 1.2.0 to 1.2.1 - [Release notes](https://github.com/VoidStarKat/widestring-rs/releases) - [Changelog](https://github.com/VoidStarKat/widestring-rs/blob/main/CHANGELOG.md) - [Commits](https://github.com/VoidStarKat/widestring-rs/compare/v1.2.0...v1.2.1) --- updated-dependencies: - dependency-name: anstyle dependency-version: 1.0.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: cc dependency-version: 1.2.41 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: thiserror dependency-version: 2.0.17 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: widestring dependency-version: 1.2.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 38 +++++++++++++++++++------------------- Cargo.toml | 6 +++--- crates/cli/Cargo.toml | 2 +- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 65cfb44c..14838fdc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,9 +52,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" @@ -192,9 +192,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.39" +version = "1.2.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1354349954c6fc9cb0deab020f27f783cf0b604e8bb754dc4658ecf0d29c35f" +checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" dependencies = [ "find-msvc-tools", "shlex", @@ -309,7 +309,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" dependencies = [ - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -658,9 +658,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" [[package]] name = "fnv" @@ -1771,11 +1771,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.16", + "thiserror-impl 2.0.17", ] [[package]] @@ -1791,9 +1791,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", @@ -1976,7 +1976,7 @@ dependencies = [ "serde_json", "smallbitvec", "tempfile", - "thiserror 2.0.16", + "thiserror 2.0.17", "topological-sort", ] @@ -1986,7 +1986,7 @@ version = "0.26.0" dependencies = [ "regex", "streaming-iterator", - "thiserror 2.0.16", + "thiserror 2.0.17", "tree-sitter", ] @@ -2023,7 +2023,7 @@ dependencies = [ "memchr", "regex", "streaming-iterator", - "thiserror 2.0.16", + "thiserror 2.0.17", "tree-sitter", ] @@ -2300,7 +2300,7 @@ dependencies = [ "pulley-interpreter", "smallvec", "target-lexicon", - "thiserror 2.0.16", + "thiserror 2.0.17", "wasmparser", "wasmtime-environ", "wasmtime-versioned-export-macros", @@ -2439,9 +2439,9 @@ dependencies = [ [[package]] name = "widestring" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" [[package]] name = "winapi-util" @@ -2465,7 +2465,7 @@ dependencies = [ "regalloc2", "smallvec", "target-lexicon", - "thiserror 2.0.16", + "thiserror 2.0.17", "wasmparser", "wasmtime-cranelift", "wasmtime-environ", diff --git a/Cargo.toml b/Cargo.toml index 23d11357..1d5454e5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -103,10 +103,10 @@ codegen-units = 256 [workspace.dependencies] ansi_colours = "1.2.3" -anstyle = "1.0.11" +anstyle = "1.0.13" anyhow = "1.0.100" bstr = "1.12.0" -cc = "1.2.39" +cc = "1.2.41" clap = { version = "4.5.48", features = [ "cargo", "derive", @@ -144,7 +144,7 @@ similar = "2.7.0" smallbitvec = "2.6.0" streaming-iterator = "0.1.9" tempfile = "3.23.0" -thiserror = "2.0.16" +thiserror = "2.0.17" tiny_http = "0.12.0" topological-sort = "0.2.2" unindent = "0.2.4" diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index cebbacd3..d8df92c8 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -73,7 +73,7 @@ tree-sitter-tags.workspace = true [dev-dependencies] encoding_rs = "0.8.35" -widestring = "1.2.0" +widestring = "1.2.1" tree_sitter_proc_macro = { path = "src/tests/proc_macro", package = "tree-sitter-tests-proc-macro" } tempfile.workspace = true From bdee2c2dd3c618de2dcb1e5967fa40477eede53e Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Fri, 3 Oct 2025 20:11:52 +0300 Subject: [PATCH 537/663] ci: use macos-15-intel runner The macos-13 runner will soon be removed. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7697ac8f..8c5af22f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -41,7 +41,7 @@ jobs: - { platform: windows-x64 , target: x86_64-pc-windows-msvc , os: windows-2025 } - { platform: windows-x86 , target: i686-pc-windows-msvc , os: windows-2025 } - { platform: macos-arm64 , target: aarch64-apple-darwin , os: macos-15 } - - { platform: macos-x64 , target: x86_64-apple-darwin , os: macos-13 } + - { platform: macos-x64 , target: x86_64-apple-darwin , os: macos-15-intel } - { platform: wasm32 , target: wasm32-unknown-unknown , os: ubuntu-24.04 } # Extra features From e344837e35002c93d8805f3c9e0b51e24cca5f8f Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Tue, 14 Oct 2025 17:52:32 -0400 Subject: [PATCH 538/663] fix(rust): minor cleanup in generate code --- crates/generate/src/build_tables/build_parse_table.rs | 9 +++------ crates/generate/src/build_tables/minimize_parse_table.rs | 4 +--- crates/generate/src/build_tables/token_conflicts.rs | 2 +- crates/generate/src/prepare_grammar/expand_tokens.rs | 4 ++-- .../src/prepare_grammar/extract_default_aliases.rs | 4 +--- crates/generate/src/prepare_grammar/extract_tokens.rs | 2 +- lib/binding_rust/lib.rs | 6 +++--- 7 files changed, 12 insertions(+), 19 deletions(-) diff --git a/crates/generate/src/build_tables/build_parse_table.rs b/crates/generate/src/build_tables/build_parse_table.rs index c832157a..66f29609 100644 --- a/crates/generate/src/build_tables/build_parse_table.rs +++ b/crates/generate/src/build_tables/build_parse_table.rs @@ -81,7 +81,7 @@ pub enum ParseTableBuilderError { StateCount(usize), } -#[derive(Default, Debug, Serialize)] +#[derive(Default, Debug, Serialize, Error)] pub struct ConflictError { pub symbol_sequence: Vec, pub conflicting_lookahead: String, @@ -89,7 +89,7 @@ pub struct ConflictError { pub possible_resolutions: Vec, } -#[derive(Default, Debug, Serialize)] +#[derive(Default, Debug, Serialize, Error)] pub struct Interpretation { pub preceding_symbols: Vec, pub variable_name: String, @@ -108,7 +108,7 @@ pub enum Resolution { AddConflict { symbols: Vec }, } -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, Error)] pub struct AmbiguousExtraError { pub parent_symbols: Vec, } @@ -238,9 +238,6 @@ impl std::fmt::Display for AmbiguousExtraError { } } -impl std::error::Error for ConflictError {} -impl std::error::Error for AmbiguousExtraError {} - impl<'a> ParseTableBuilder<'a> { fn new( syntax_grammar: &'a SyntaxGrammar, diff --git a/crates/generate/src/build_tables/minimize_parse_table.rs b/crates/generate/src/build_tables/minimize_parse_table.rs index 1d70625e..6c26f1c4 100644 --- a/crates/generate/src/build_tables/minimize_parse_table.rs +++ b/crates/generate/src/build_tables/minimize_parse_table.rs @@ -306,9 +306,7 @@ impl Minimizer<'_> { return true; } - for (i, action1) in actions1.iter().enumerate() { - let action2 = &actions2[i]; - + for (action1, action2) in actions1.iter().zip(actions2.iter()) { // Two shift actions are equivalent if their destinations are in the same group. if let ( ParseAction::Shift { diff --git a/crates/generate/src/build_tables/token_conflicts.rs b/crates/generate/src/build_tables/token_conflicts.rs index bacac1b4..d72effd4 100644 --- a/crates/generate/src/build_tables/token_conflicts.rs +++ b/crates/generate/src/build_tables/token_conflicts.rs @@ -28,7 +28,7 @@ pub struct TokenConflictMap<'a> { impl<'a> TokenConflictMap<'a> { /// Create a token conflict map based on a lexical grammar, which describes the structure - /// each token, and a `following_token` map, which indicates which tokens may be appear + /// of each token, and a `following_token` map, which indicates which tokens may be appear /// immediately after each other token. /// /// This analyzes the possible kinds of overlap between each pair of tokens and stores diff --git a/crates/generate/src/prepare_grammar/expand_tokens.rs b/crates/generate/src/prepare_grammar/expand_tokens.rs index 2762b41c..4d8b4f11 100644 --- a/crates/generate/src/prepare_grammar/expand_tokens.rs +++ b/crates/generate/src/prepare_grammar/expand_tokens.rs @@ -27,7 +27,7 @@ pub enum ExpandTokensError { "The rule `{0}` matches the empty string. Tree-sitter does not support syntactic rules that match the empty string unless they are used only as the grammar's start rule. - " +" )] EmptyString(String), #[error(transparent)] @@ -189,7 +189,7 @@ impl NfaBuilder { } Rule::String(s) => { for c in s.chars().rev() { - self.push_advance(CharacterSet::empty().add_char(c), next_state_id); + self.push_advance(CharacterSet::from_char(c), next_state_id); next_state_id = self.nfa.last_state_id(); } Ok(!s.is_empty()) diff --git a/crates/generate/src/prepare_grammar/extract_default_aliases.rs b/crates/generate/src/prepare_grammar/extract_default_aliases.rs index 68ea1e48..cc977362 100644 --- a/crates/generate/src/prepare_grammar/extract_default_aliases.rs +++ b/crates/generate/src/prepare_grammar/extract_default_aliases.rs @@ -69,9 +69,7 @@ pub(super) fn extract_default_aliases( SymbolType::External => &mut external_status_list[symbol.index], SymbolType::NonTerminal => &mut non_terminal_status_list[symbol.index], SymbolType::Terminal => &mut terminal_status_list[symbol.index], - SymbolType::End | SymbolType::EndOfNonTerminalExtra => { - panic!("Unexpected end token") - } + SymbolType::End | SymbolType::EndOfNonTerminalExtra => panic!("Unexpected end token"), }; status.appears_unaliased = true; } diff --git a/crates/generate/src/prepare_grammar/extract_tokens.rs b/crates/generate/src/prepare_grammar/extract_tokens.rs index b74a8e84..a1fddbe6 100644 --- a/crates/generate/src/prepare_grammar/extract_tokens.rs +++ b/crates/generate/src/prepare_grammar/extract_tokens.rs @@ -153,7 +153,7 @@ pub(super) fn extract_tokens( } } - let mut external_tokens = Vec::new(); + let mut external_tokens = Vec::with_capacity(grammar.external_tokens.len()); for external_token in grammar.external_tokens { let rule = symbol_replacer.replace_symbols_in_rule(&external_token.rule); if let Rule::Symbol(symbol) = rule { diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs index cf22eb72..a02fa173 100644 --- a/lib/binding_rust/lib.rs +++ b/lib/binding_rust/lib.rs @@ -3190,9 +3190,9 @@ impl QueryCursor { /// The zero max start depth value can be used as a special behavior and /// it helps to destructure a subtree by staying on a node and using /// captures for interested parts. Note that the zero max start depth - /// only limit a search depth for a pattern's root node but other nodes - /// that are parts of the pattern may be searched at any depth what - /// defined by the pattern structure. + /// only limits a search depth for a pattern's root node but other nodes + /// that are parts of the pattern may be searched at any depth depending on + /// what is defined by the pattern structure. /// /// Set to `None` to remove the maximum start depth. #[doc(alias = "ts_query_cursor_set_max_start_depth")] From 87d778a1c6ded60e9c0622539ccf23b4f47632df Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Sun, 19 Oct 2025 23:16:42 -0400 Subject: [PATCH 539/663] fix(rust): apply `Self` usage in struct definition lint --- crates/cli/src/test.rs | 2 +- crates/cli/src/tests/helpers/query_helpers.rs | 2 +- crates/generate/src/parse_grammar.rs | 26 +++++++++---------- crates/generate/src/rules.rs | 10 +++---- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/crates/cli/src/test.rs b/crates/cli/src/test.rs index f192f51b..f107cb07 100644 --- a/crates/cli/src/test.rs +++ b/crates/cli/src/test.rs @@ -65,7 +65,7 @@ static POINT_REGEX: LazyLock = pub enum TestEntry { Group { name: String, - children: Vec, + children: Vec, file_path: Option, }, Example { diff --git a/crates/cli/src/tests/helpers/query_helpers.rs b/crates/cli/src/tests/helpers/query_helpers.rs index bc5617e8..e648ac8e 100644 --- a/crates/cli/src/tests/helpers/query_helpers.rs +++ b/crates/cli/src/tests/helpers/query_helpers.rs @@ -12,7 +12,7 @@ pub struct Pattern { named: bool, field: Option<&'static str>, capture: Option, - children: Vec, + children: Vec, } #[derive(Clone, Debug, PartialEq, Eq)] diff --git a/crates/generate/src/parse_grammar.rs b/crates/generate/src/parse_grammar.rs index f95eaba4..c48477f0 100644 --- a/crates/generate/src/parse_grammar.rs +++ b/crates/generate/src/parse_grammar.rs @@ -18,7 +18,7 @@ use crate::{ #[allow(clippy::upper_case_acronyms)] enum RuleJSON { ALIAS { - content: Box, + content: Box, named: bool, value: String, }, @@ -34,46 +34,46 @@ enum RuleJSON { name: String, }, CHOICE { - members: Vec, + members: Vec, }, FIELD { name: String, - content: Box, + content: Box, }, SEQ { - members: Vec, + members: Vec, }, REPEAT { - content: Box, + content: Box, }, REPEAT1 { - content: Box, + content: Box, }, PREC_DYNAMIC { value: i32, - content: Box, + content: Box, }, PREC_LEFT { value: PrecedenceValueJSON, - content: Box, + content: Box, }, PREC_RIGHT { value: PrecedenceValueJSON, - content: Box, + content: Box, }, PREC { value: PrecedenceValueJSON, - content: Box, + content: Box, }, TOKEN { - content: Box, + content: Box, }, IMMEDIATE_TOKEN { - content: Box, + content: Box, }, RESERVED { context_name: String, - content: Box, + content: Box, }, } diff --git a/crates/generate/src/rules.rs b/crates/generate/src/rules.rs index a8499166..05a0c426 100644 --- a/crates/generate/src/rules.rs +++ b/crates/generate/src/rules.rs @@ -60,15 +60,15 @@ pub enum Rule { Pattern(String, String), NamedSymbol(String), Symbol(Symbol), - Choice(Vec), + Choice(Vec), Metadata { params: MetadataParams, - rule: Box, + rule: Box, }, - Repeat(Box), - Seq(Vec), + Repeat(Box), + Seq(Vec), Reserved { - rule: Box, + rule: Box, context_name: String, }, } From a2f2b16acb67a7659331ab12ab7cfbef4567ba31 Mon Sep 17 00:00:00 2001 From: WillLillis Date: Mon, 6 Oct 2025 01:53:00 -0400 Subject: [PATCH 540/663] fix(xtask): require `version` argument for `bump-version` command --- crates/xtask/src/bump.rs | 100 +-------------------------------------- crates/xtask/src/main.rs | 4 +- 2 files changed, 4 insertions(+), 100 deletions(-) diff --git a/crates/xtask/src/bump.rs b/crates/xtask/src/bump.rs index 7e5f5dcd..02254274 100644 --- a/crates/xtask/src/bump.rs +++ b/crates/xtask/src/bump.rs @@ -2,7 +2,7 @@ use std::{cmp::Ordering, path::Path}; use anyhow::{anyhow, Context, Result}; use indoc::indoc; -use semver::{BuildMetadata, Prerelease, Version}; +use semver::{Prerelease, Version}; use crate::{create_commit, BumpVersion}; @@ -48,7 +48,6 @@ pub fn run(args: BumpVersion) -> Result<()> { String::from_utf8_lossy(&output.stderr) ); } - let latest_tag_sha = String::from_utf8(output.stdout)?.trim().to_string(); let workspace_toml_version = Version::parse(&fetch_workspace_version()?)?; @@ -65,102 +64,7 @@ pub fn run(args: BumpVersion) -> Result<()> { return Ok(()); } - let output = std::process::Command::new("git") - .args(["rev-list", &format!("{latest_tag_sha}..HEAD")]) - .output()?; - if !output.status.success() { - anyhow::bail!( - "Failed to get commits: {}", - String::from_utf8_lossy(&output.stderr) - ); - } - let commits = String::from_utf8(output.stdout)? - .lines() - .map(|s| s.to_string()) - .collect::>(); - - let mut should_increment_patch = false; - let mut should_increment_minor = false; - - for commit_sha in commits { - let output = std::process::Command::new("git") - .args(["log", "-1", "--format=%s", &commit_sha]) - .output()?; - if !output.status.success() { - continue; - } - let message = String::from_utf8(output.stdout)?.trim().to_string(); - - let output = std::process::Command::new("git") - .args([ - "diff-tree", - "--no-commit-id", - "--name-only", - "-r", - &commit_sha, - ]) - .output()?; - if !output.status.success() { - continue; - } - - let mut source_code_changed = false; - for path in String::from_utf8(output.stdout)?.lines() { - let path = Path::new(path); - if path.extension().is_some_and(|ext| { - ext.eq_ignore_ascii_case("rs") - || ext.eq_ignore_ascii_case("js") - || ext.eq_ignore_ascii_case("c") - }) { - source_code_changed = true; - break; - } - } - - if source_code_changed { - should_increment_patch = true; - - let Some((prefix, _)) = message.split_once(':') else { - continue; - }; - - let convention = if prefix.contains('(') { - prefix.split_once('(').unwrap().0 - } else { - prefix - }; - - if ["feat", "feat!"].contains(&convention) || prefix.ends_with('!') { - should_increment_minor = true; - } - } - } - - let next_version = if let Some(version) = args.version { - version - } else { - let mut next_version = current_version.clone(); - if should_increment_minor { - next_version.minor += 1; - next_version.patch = 0; - next_version.pre = Prerelease::EMPTY; - next_version.build = BuildMetadata::EMPTY; - } else if should_increment_patch { - next_version.patch += 1; - next_version.pre = Prerelease::EMPTY; - next_version.build = BuildMetadata::EMPTY; - } else { - return Err(anyhow!(format!( - "No source code changed since {current_version}" - ))); - } - next_version - }; - if next_version <= current_version { - return Err(anyhow!(format!( - "Next version {next_version} must be greater than current version {current_version}" - ))); - } + let next_version = args.version; println!("Bumping from {current_version} to {next_version}"); update_crates(¤t_version, &next_version)?; diff --git a/crates/xtask/src/main.rs b/crates/xtask/src/main.rs index 57f81dae..46b2e796 100644 --- a/crates/xtask/src/main.rs +++ b/crates/xtask/src/main.rs @@ -94,8 +94,8 @@ struct BuildWasm { #[derive(Args)] struct BumpVersion { /// The version to bump to. - #[arg(long, short)] - version: Option, + #[arg(index = 1, required = true)] + version: Version, } #[derive(Args)] From 605e58006351ff2d133e69dfc617268ab9887a8d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Oct 2025 22:41:26 +0000 Subject: [PATCH 541/663] ci: bump the actions group across 1 directory with 3 updates Bumps the actions group with 3 updates in the / directory: [actions/upload-artifact](https://github.com/actions/upload-artifact), [actions/download-artifact](https://github.com/actions/download-artifact) and [actions/setup-node](https://github.com/actions/setup-node). Updates `actions/upload-artifact` from 4 to 5 - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v4...v5) Updates `actions/download-artifact` from 5 to 6 - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v5...v6) Updates `actions/setup-node` from 5 to 6 - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions - dependency-name: actions/download-artifact dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions - dependency-name: actions/setup-node dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8c5af22f..38fd72af 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -278,7 +278,7 @@ jobs: - name: Upload CLI artifact if: "!matrix.no-run" - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: tree-sitter.${{ matrix.platform }} path: target/${{ matrix.target }}/release/tree-sitter${{ contains(matrix.target, 'windows') && '.exe' || '' }} @@ -287,7 +287,7 @@ jobs: - name: Upload Wasm artifacts if: matrix.platform == 'linux-x64' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: tree-sitter.wasm path: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6dc78f09..e89b0035 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -23,7 +23,7 @@ jobs: uses: actions/checkout@v5 - name: Download build artifacts - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: path: artifacts @@ -84,7 +84,7 @@ jobs: uses: actions/checkout@v5 - name: Set up Node - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: 20 registry-url: https://registry.npmjs.org From 77363a65c279f5c16611678b9dab135d040484ef Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Wed, 29 Oct 2025 12:30:59 +0100 Subject: [PATCH 542/663] build(deps): cargo update --- Cargo.lock | 534 ++++++++++++++++++++++++++++------------------------- 1 file changed, 286 insertions(+), 248 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 14838fdc..d2c5d98a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -37,9 +37,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.20" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -91,6 +91,15 @@ version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +[[package]] +name = "ar_archive_writer" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c269894b6fe5e9d7ada0cf69b5bf847ff35bc25fc271f08e1d080fce80339a" +dependencies = [ + "object 0.32.2", +] + [[package]] name = "arbitrary" version = "1.4.2" @@ -109,7 +118,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cexpr", "clang-sys", "itertools 0.12.1", @@ -132,7 +141,7 @@ version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -154,15 +163,24 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.4" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] [[package]] name = "bstr" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" dependencies = [ "memchr", "regex-automata", @@ -180,9 +198,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.23.2" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" [[package]] name = "bytes" @@ -192,9 +210,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.41" +version = "1.2.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" +checksum = "739eb0f94557554b3ca9a86d2d37bebd49c5e6d0c1d2bda35ba5bdac830befc2" dependencies = [ "find-msvc-tools", "shlex", @@ -217,9 +235,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -246,9 +264,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.48" +version = "4.5.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" +checksum = "0c2cfd7bf8a6017ddaa4e32ffe7403d547790db06bd171c1c53926faab501623" dependencies = [ "clap_builder", "clap_derive", @@ -256,9 +274,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.48" +version = "4.5.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" +checksum = "0a4c05b9e80c5ccd3a7ef080ad7b6ba7d6fc00a985b8b157197075677c82c7a0" dependencies = [ "anstream", "anstyle", @@ -268,18 +286,18 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.58" +version = "4.5.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75bf0b32ad2e152de789bb635ea4d3078f6b838ad7974143e99b99f45a04af4a" +checksum = "2348487adcd4631696ced64ccdb40d38ac4d31cae7f2eec8817fcea1b9d1c43c" dependencies = [ "clap", ] [[package]] name = "clap_complete_nushell" -version = "4.5.8" +version = "4.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a0c951694691e65bf9d421d597d68416c22de9632e884c28412cb8cd8b73dce" +checksum = "811159f339691baacdf7d534df2946b9d217014081099e23d31d887d99521e70" dependencies = [ "clap", "clap_complete", @@ -287,9 +305,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.47" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ "heck", "proc-macro2", @@ -299,9 +317,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "cobs" @@ -419,7 +437,7 @@ dependencies = [ "cranelift-entity", "cranelift-isle", "gimli", - "hashbrown", + "hashbrown 0.15.5", "log", "pulley-interpreter", "regalloc2", @@ -523,13 +541,13 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.5.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881c5d0a13b2f1498e2306e82cbada78390e152d4b1378fb28a84f4dcd0dc4f3" +checksum = "73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790" dependencies = [ - "dispatch", + "dispatch2", "nix", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -553,10 +571,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] -name = "dispatch" -version = "0.2.0" +name = "dispatch2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.10.0", + "block2", + "libc", + "objc2", +] [[package]] name = "displaydoc" @@ -616,12 +640,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -719,19 +743,19 @@ checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", "r-efi", - "wasi 0.14.3+wasi-0.2.4", + "wasip2", ] [[package]] @@ -761,6 +785,12 @@ dependencies = [ "serde", ] +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + [[package]] name = "heck" version = "0.5.0" @@ -769,11 +799,11 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "home" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -793,9 +823,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "icu_collections" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", "potential_utf", @@ -806,9 +836,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -819,11 +849,10 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", @@ -834,42 +863,38 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" dependencies = [ - "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", - "potential_utf", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" [[package]] name = "icu_provider" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", "icu_locale_core", - "stable_deref_trait", - "tinystr", "writeable", "yoke", "zerofrom", @@ -906,21 +931,24 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.4" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.16.0", "serde", "serde_core", ] [[package]] name = "indoc" -version = "2.0.6" +version = "2.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] [[package]] name = "inotify" @@ -928,7 +956,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "inotify-sys", "libc", ] @@ -944,9 +972,9 @@ dependencies = [ [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -1005,9 +1033,9 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ "once_cell", "wasm-bindgen", @@ -1053,9 +1081,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.175" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libloading" @@ -1064,7 +1092,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-link 0.2.0", + "windows-link", ] [[package]] @@ -1081,15 +1109,15 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "log" @@ -1118,7 +1146,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" dependencies = [ - "rustix 1.0.8", + "rustix 1.1.2", ] [[package]] @@ -1129,14 +1157,14 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "mio" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", "log", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "wasi", + "windows-sys 0.61.2", ] [[package]] @@ -1151,7 +1179,7 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cfg-if", "cfg_aliases", "libc", @@ -1173,7 +1201,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "fsevent-sys", "inotify", "kqueue", @@ -1206,9 +1234,9 @@ checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d" [[package]] name = "objc2" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561f357ba7f3a2a61563a186a163d0a3a5247e1089524a3981d49adb775078bc" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" dependencies = [ "objc2-encode", ] @@ -1221,14 +1249,23 @@ checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" [[package]] name = "objc2-foundation" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "objc2", ] +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + [[package]] name = "object" version = "0.36.7" @@ -1236,7 +1273,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "crc32fast", - "hashbrown", + "hashbrown 0.15.5", "indexmap", "memchr", ] @@ -1249,9 +1286,9 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "once_cell_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "pathdiff" @@ -1313,9 +1350,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ "zerovec", ] @@ -1351,28 +1388,29 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] [[package]] name = "psm" -version = "0.1.26" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e944464ec8536cd1beb0bbfd96987eb5e3b72f2ecdafdc5c769a37f1fa2ae1f" +checksum = "d11f2fedc3b7dafdc2851bc52f277377c5473d378859be234bc7ebb593144d01" dependencies = [ + "ar_archive_writer", "cc", ] @@ -1389,9 +1427,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -1440,7 +1478,7 @@ checksum = "5216b1837de2149f8bc8e6d5f88a9326b63b8c836ed58ce4a0a29ec736a59734" dependencies = [ "allocator-api2", "bumpalo", - "hashbrown", + "hashbrown 0.15.5", "log", "rustc-hash 2.1.1", "smallvec", @@ -1448,9 +1486,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.3" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -1460,9 +1498,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -1471,9 +1509,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "relative-path" @@ -1558,7 +1596,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -1567,17 +1605,23 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.8" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "errno", "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.60.2", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.2", ] +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "ryu" version = "1.0.20" @@ -1605,9 +1649,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.224" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aaeb1e94f53b16384af593c71e20b095e958dab1d26939c1b70645c5cfbcc0b" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", @@ -1615,18 +1659,18 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.224" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f39390fa6346e24defbcdd3d9544ba8a19985d0af74df8501fbfe9a64341ab" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.224" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ff78ab5e8561c9a675bfc1785cb07ae721f0ee53329a595cefd8c04c2ac4e0" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -1694,9 +1738,9 @@ checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "streaming-iterator" @@ -1712,9 +1756,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.106" +version = "2.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" dependencies = [ "proc-macro2", "quote", @@ -1734,9 +1778,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" +checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" [[package]] name = "tempfile" @@ -1745,10 +1789,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom 0.3.3", + "getrandom 0.3.4", "once_cell", - "rustix 1.0.8", - "windows-sys 0.61.0", + "rustix 1.1.2", + "windows-sys 0.61.2", ] [[package]] @@ -1823,9 +1867,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", @@ -1833,18 +1877,31 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.11" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] [[package]] name = "toml_edit" -version = "0.22.27" +version = "0.23.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" dependencies = [ "indexmap", "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ "winnow", ] @@ -1961,7 +2018,7 @@ name = "tree-sitter-generate" version = "0.26.0" dependencies = [ "anyhow", - "bitflags 2.9.4", + "bitflags 2.10.0", "dunce", "indexmap", "indoc", @@ -2038,9 +2095,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06" [[package]] name = "unicode-segmentation" @@ -2050,9 +2107,9 @@ checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "unindent" @@ -2107,44 +2164,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.14.3+wasi-0.2.4" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2152,22 +2197,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2", "quote", "syn", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" dependencies = [ "unicode-ident", ] @@ -2188,8 +2233,8 @@ version = "0.229.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc3b1f053f5d41aa55640a1fa9b6d1b8a9e4418d118ce308d20e24ff3575a8c" dependencies = [ - "bitflags 2.9.4", - "hashbrown", + "bitflags 2.10.0", + "hashbrown 0.15.5", "indexmap", "semver", "serde", @@ -2214,22 +2259,22 @@ checksum = "57373e1d8699662fb791270ac5dfac9da5c14f618ecf940cdb29dc3ad9472a3c" dependencies = [ "addr2line", "anyhow", - "bitflags 2.9.4", + "bitflags 2.10.0", "bumpalo", "cc", "cfg-if", - "hashbrown", + "hashbrown 0.15.5", "indexmap", "libc", "log", "mach2", "memfd", - "object", + "object 0.36.7", "once_cell", "postcard", "psm", "pulley-interpreter", - "rustix 1.0.8", + "rustix 1.1.2", "serde", "serde_derive", "smallvec", @@ -2296,7 +2341,7 @@ dependencies = [ "gimli", "itertools 0.14.0", "log", - "object", + "object 0.36.7", "pulley-interpreter", "smallvec", "target-lexicon", @@ -2318,7 +2363,7 @@ dependencies = [ "gimli", "indexmap", "log", - "object", + "object 0.36.7", "postcard", "serde", "serde_derive", @@ -2338,7 +2383,7 @@ dependencies = [ "anyhow", "cc", "cfg-if", - "rustix 1.0.8", + "rustix 1.1.2", "wasmtime-asm-macros", "wasmtime-versioned-export-macros", "windows-sys 0.59.0", @@ -2391,7 +2436,7 @@ dependencies = [ "anyhow", "cranelift-codegen", "gimli", - "object", + "object 0.36.7", "target-lexicon", "wasmparser", "wasmtime-cranelift", @@ -2401,9 +2446,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" dependencies = [ "js-sys", "wasm-bindgen", @@ -2411,9 +2456,9 @@ dependencies = [ [[package]] name = "webbrowser" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf4f3c0ba838e82b4e5ccc4157003fb8c324ee24c058470ffb82820becbde98" +checksum = "00f1243ef785213e3a32fa0396093424a3a6ea566f9948497e5a2309261a4c97" dependencies = [ "core-foundation", "jni", @@ -2445,11 +2490,11 @@ checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" [[package]] name = "winapi-util" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0978bf7171b3d90bac376700cb56d606feb40f251a475a5d6634613564460b22" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -2473,15 +2518,9 @@ dependencies = [ [[package]] name = "windows-link" -version = "0.1.3" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-link" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-sys" @@ -2516,16 +2555,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.5", ] [[package]] name = "windows-sys" -version = "0.61.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link 0.2.0", + "windows-link", ] [[package]] @@ -2561,19 +2600,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link 0.1.3", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -2590,9 +2629,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -2608,9 +2647,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -2626,9 +2665,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -2638,9 +2677,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -2656,9 +2695,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -2674,9 +2713,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -2692,9 +2731,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -2710,9 +2749,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" @@ -2725,15 +2764,15 @@ dependencies = [ [[package]] name = "wit-bindgen" -version = "0.45.0" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052283831dbae3d879dc7f51f3d92703a316ca49f91540417d38591826127814" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "xtask" @@ -2759,11 +2798,10 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yoke" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -2771,9 +2809,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", @@ -2783,18 +2821,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", @@ -2824,15 +2862,15 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] name = "zerotrie" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ "displaydoc", "yoke", @@ -2841,9 +2879,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ "yoke", "zerofrom", @@ -2852,9 +2890,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", From 70cde4a1100d64cb19ed4915f23575ef8f4d9c74 Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Wed, 29 Oct 2025 12:33:31 +0100 Subject: [PATCH 543/663] ci(dependabot): only update patch releases for cargo --- .github/dependabot.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 328f241d..c75a67e6 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -14,6 +14,10 @@ updates: groups: cargo: patterns: ["*"] + ignore: + - dependency-name: "*" + update-types: ["version-update:semver-major", "version-update:semver-minor"] + - package-ecosystem: "github-actions" directory: "/" schedule: @@ -28,6 +32,7 @@ updates: groups: actions: patterns: ["*"] + - package-ecosystem: "npm" versioning-strategy: increase directories: From 6188010f53bf8c4d75a961a54f1e1fe13436dc1e Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Wed, 29 Oct 2025 12:45:01 +0100 Subject: [PATCH 544/663] build(deps): bump rquickjs to v0.10.0 --- Cargo.lock | 132 ++++++++++++------------------------- crates/generate/Cargo.toml | 2 +- 2 files changed, 44 insertions(+), 90 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d2c5d98a..1639883b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -112,29 +112,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" -[[package]] -name = "bindgen" -version = "0.69.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" -dependencies = [ - "bitflags 2.10.0", - "cexpr", - "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash 1.1.0", - "shlex", - "syn", - "which", -] - [[package]] name = "bindgen" version = "0.72.1" @@ -150,7 +127,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash 2.1.1", + "rustc-hash", "shlex", "syn", ] @@ -361,9 +338,9 @@ dependencies = [ [[package]] name = "convert_case" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" dependencies = [ "unicode-segmentation", ] @@ -441,7 +418,7 @@ dependencies = [ "log", "pulley-interpreter", "regalloc2", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "smallvec", "target-lexicon", @@ -698,6 +675,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "form_urlencoded" version = "1.2.2" @@ -781,7 +764,7 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "foldhash", + "foldhash 0.1.5", "serde", ] @@ -790,6 +773,11 @@ name = "hashbrown" version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] [[package]] name = "heck" @@ -976,15 +964,6 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.13.0" @@ -1061,18 +1040,6 @@ dependencies = [ "libc", ] -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "leb128fmt" version = "0.1.0" @@ -1304,28 +1271,29 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "phf" -version = "0.11.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" dependencies = [ "phf_shared", + "serde", ] [[package]] name = "phf_generator" -version = "0.11.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" dependencies = [ + "fastrand", "phf_shared", - "rand", ] [[package]] name = "phf_shared" -version = "0.11.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" dependencies = [ "siphasher", ] @@ -1480,7 +1448,7 @@ dependencies = [ "bumpalo", "hashbrown 0.15.5", "log", - "rustc-hash 2.1.1", + "rustc-hash", "smallvec", ] @@ -1515,9 +1483,12 @@ checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "relative-path" -version = "1.9.3" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" +checksum = "bca40a312222d8ba74837cb474edef44b37f561da5f773981007a10bbaa992b0" +dependencies = [ + "serde", +] [[package]] name = "rgb" @@ -1530,9 +1501,9 @@ dependencies = [ [[package]] name = "rquickjs" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5227859c4dfc83f428e58f9569bf439e628c8d139020e7faff437e6f5abaa0" +checksum = "a135375fbac5ba723bb6a48f432a72f81539cedde422f0121a86c7c4e96d8e0d" dependencies = [ "rquickjs-core", "rquickjs-macro", @@ -1540,10 +1511,11 @@ dependencies = [ [[package]] name = "rquickjs-core" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e82e0ca83028ad5b533b53b96c395bbaab905a5774de4aaf1004eeacafa3d85d" +checksum = "bccb7121a123865c8ace4dea42e7ed84d78b90cbaf4ca32c59849d8d210c9672" dependencies = [ + "hashbrown 0.16.0", "phf", "relative-path", "rquickjs-sys", @@ -1551,9 +1523,9 @@ dependencies = [ [[package]] name = "rquickjs-macro" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4d2eccd988a924a470a76fbd81a191b22d1f5f4f4619cf5662a8c1ab4ca1db7" +checksum = "89f93602cc3112c7f30bf5f29e722784232138692c7df4c52ebbac7e035d900d" dependencies = [ "convert_case", "fnv", @@ -1570,20 +1542,14 @@ dependencies = [ [[package]] name = "rquickjs-sys" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fed0097b0b4fbb2a87f6dd3b995a7c64ca56de30007eb7e867dfdfc78324ba5" +checksum = "57b1b6528590d4d65dc86b5159eae2d0219709546644c66408b2441696d1d725" dependencies = [ - "bindgen 0.69.5", + "bindgen", "cc", ] -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc-hash" version = "2.1.1" @@ -1946,7 +1912,7 @@ dependencies = [ name = "tree-sitter" version = "0.26.0" dependencies = [ - "bindgen 0.72.1", + "bindgen", "cc", "regex", "regex-syntax", @@ -2027,7 +1993,7 @@ dependencies = [ "regex", "regex-syntax", "rquickjs", - "rustc-hash 2.1.1", + "rustc-hash", "semver", "serde", "serde_json", @@ -2470,18 +2436,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.44", -] - [[package]] name = "widestring" version = "1.2.1" @@ -2780,7 +2734,7 @@ version = "0.1.0" dependencies = [ "anstyle", "anyhow", - "bindgen 0.72.1", + "bindgen", "clap", "indoc", "notify", diff --git a/crates/generate/Cargo.toml b/crates/generate/Cargo.toml index 1588763d..09fc1850 100644 --- a/crates/generate/Cargo.toml +++ b/crates/generate/Cargo.toml @@ -34,7 +34,7 @@ log.workspace = true pathdiff = { version = "0.2.3", optional = true } regex.workspace = true regex-syntax.workspace = true -rquickjs = { version = "0.9.0", optional = true, features = [ +rquickjs = { version = "0.10.0", optional = true, features = [ "bindgen", "loader", "macro", From ecc787e221ff0b0b0c8cdea64775bfa0d6444ba0 Mon Sep 17 00:00:00 2001 From: WillLillis Date: Sat, 4 Oct 2025 11:51:40 -0400 Subject: [PATCH 545/663] fix(test): correct language typo in test name --- crates/cli/src/tests/detect_language.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/cli/src/tests/detect_language.rs b/crates/cli/src/tests/detect_language.rs index c94b30b4..c543c31e 100644 --- a/crates/cli/src/tests/detect_language.rs +++ b/crates/cli/src/tests/detect_language.rs @@ -90,7 +90,7 @@ fn detect_language_by_first_line_regex() { } #[test] -fn detect_langauge_by_double_barrel_file_extension() { +fn detect_language_by_double_barrel_file_extension() { let blade_dir = tree_sitter_dir( r#"{ "grammars": [ From b8f52210f973b0080d3f334af92abf9c9d27f898 Mon Sep 17 00:00:00 2001 From: WillLillis Date: Sun, 5 Oct 2025 01:42:01 -0400 Subject: [PATCH 546/663] perf: reduce needless allocations --- crates/cli/src/parse.rs | 10 ++++++---- crates/generate/src/render.rs | 12 ++++++------ crates/highlight/src/highlight.rs | 8 +++++--- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/crates/cli/src/parse.rs b/crates/cli/src/parse.rs index 4b941fe3..84bf0e85 100644 --- a/crates/cli/src/parse.rs +++ b/crates/cli/src/parse.rs @@ -674,10 +674,9 @@ pub fn parse_file_at_path( width = max_path_length )?; if let Some(node) = first_error { - let start = node.start_position(); - let end = node.end_position(); - let mut node_text = String::new(); - for c in node.kind().chars() { + let node_kind = node.kind(); + let mut node_text = String::with_capacity(node_kind.len()); + for c in node_kind.chars() { if let Some(escaped) = escape_invisible(c) { node_text += escaped; } else { @@ -694,6 +693,9 @@ pub fn parse_file_at_path( } else { write!(&mut stdout, "{node_text}")?; } + + let start = node.start_position(); + let end = node.end_position(); write!( &mut stdout, " [{}, {}] - [{}, {}])", diff --git a/crates/generate/src/render.rs b/crates/generate/src/render.rs index e4aea008..bcfc832e 100644 --- a/crates/generate/src/render.rs +++ b/crates/generate/src/render.rs @@ -34,6 +34,8 @@ macro_rules! add { macro_rules! add_whitespace { ($this:tt) => {{ + // 4 bytes per char, 2 spaces per indent level + $this.buffer.reserve(4 * 2 * $this.indent_level); for _ in 0..$this.indent_level { write!(&mut $this.buffer, " ").unwrap(); } @@ -688,13 +690,14 @@ impl Generator { flat_field_map.push((field_name.clone(), *location)); } } + let field_map_len = flat_field_map.len(); field_map_ids.push(( self.get_field_map_id( - flat_field_map.clone(), + flat_field_map, &mut flat_field_maps, &mut next_flat_field_map_index, ), - flat_field_map.len(), + field_map_len, )); } } @@ -962,10 +965,7 @@ impl Generator { large_char_set_ix = Some(char_set_ix); } - let mut line_break = "\n".to_string(); - for _ in 0..self.indent_level + 2 { - line_break.push_str(" "); - } + let line_break = format!("\n{}", " ".repeat(self.indent_level + 2)); let has_positive_condition = large_char_set_ix.is_some() || !asserted_chars.is_empty(); let has_negative_condition = !negated_chars.is_empty(); diff --git a/crates/highlight/src/highlight.rs b/crates/highlight/src/highlight.rs index bb81fc08..9a78d1ac 100644 --- a/crates/highlight/src/highlight.rs +++ b/crates/highlight/src/highlight.rs @@ -344,11 +344,13 @@ impl HighlightConfiguration { locals_query: &str, ) -> Result { // Concatenate the query strings, keeping track of the start offset of each section. - let mut query_source = String::new(); + let mut query_source = String::with_capacity( + injection_query.len() + locals_query.len() + highlights_query.len(), + ); query_source.push_str(injection_query); - let locals_query_offset = query_source.len(); + let locals_query_offset = injection_query.len(); query_source.push_str(locals_query); - let highlights_query_offset = query_source.len(); + let highlights_query_offset = injection_query.len() + locals_query.len(); query_source.push_str(highlights_query); // Construct a single query by concatenating the three query strings, but record the From 097c2d4f05c3b91132374c33068046beb5feeee7 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Fri, 31 Oct 2025 21:20:17 -0400 Subject: [PATCH 547/663] fix(cli): remove `--emit=lib` generate option This also replaces the `--emit` option with an `--no-parser` flag. The default value is false, meaning a parser is still generated by default. --- crates/cli/src/init.rs | 10 ++++----- crates/cli/src/main.rs | 27 +++++------------------ crates/cli/src/templates/cmakelists.cmake | 4 ++-- crates/cli/src/templates/makefile | 4 ++-- docs/src/cli/generate.md | 8 ++----- 5 files changed, 17 insertions(+), 36 deletions(-) diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index 53ab84f3..62923441 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -572,14 +572,14 @@ pub fn generate_grammar_files( .replace( indoc! {r" $(PARSER): $(SRC_DIR)/grammar.json - $(TS) generate $^ + $(TS) generate $^ "}, indoc! {r" $(SRC_DIR)/grammar.json: grammar.js - $(TS) generate --emit=json $^ + $(TS) generate --no-parser $^ $(PARSER): $(SRC_DIR)/grammar.json - $(TS) generate --emit=parser $^ + $(TS) generate $^ "} ); write_file(path, contents)?; @@ -627,14 +627,14 @@ pub fn generate_grammar_files( add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/grammar.js" COMMAND "${TREE_SITTER_CLI}" generate grammar.js - --emit=json + --no-parser WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMENT "Generating grammar.json") add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/parser.c" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json" COMMAND "${TREE_SITTER_CLI}" generate src/grammar.json - --emit=parser --abi=${TREE_SITTER_ABI_VERSION} + --abi=${TREE_SITTER_ABI_VERSION} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMENT "Generating parser.c") "#} diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index ad7667c2..26595f41 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -88,17 +88,6 @@ struct Init { pub grammar_path: Option, } -#[derive(Clone, Debug, Default, ValueEnum, PartialEq, Eq)] -enum GenerationEmit { - /// Generate `grammar.json` and `node-types.json` - Json, - /// Generate `parser.c` and related files - #[default] - Parser, - /// Compile to a library - Lib, -} - #[derive(Args)] #[command(alias = "gen", alias = "g")] struct Generate { @@ -121,12 +110,11 @@ struct Generate { ) )] pub abi_version: Option, - /// What generated files to emit + /// Only generate `grammar.json` and `node-types.json` #[arg(long)] - #[clap(value_enum, default_value_t=GenerationEmit::Parser)] - pub emit: GenerationEmit, - /// Deprecated: use --emit=lib. - #[arg(long, short = 'b', conflicts_with = "emit")] + pub no_parser: bool, + /// Compile all defined languages in the current dir + #[arg(long, short = 'b')] pub build: bool, /// Compile a parser in debug mode #[arg(long, short = '0')] @@ -862,9 +850,6 @@ impl Generate { version.parse().expect("invalid abi version flag") } }); - if self.build { - warn!("--build is deprecated, use --emit=lib instead"); - } if let Err(err) = tree_sitter_generate::generate_parser_in_directory( current_dir, @@ -873,7 +858,7 @@ impl Generate { abi_version, self.report_states_for_rule.as_deref(), self.js_runtime.as_deref(), - self.emit != GenerationEmit::Json, + !self.no_parser, if self.disable_optimizations { OptLevel::empty() } else { @@ -889,7 +874,7 @@ impl Generate { Err(anyhow!(err.to_string())).with_context(|| "Error when generating parser")?; } } - if self.emit == GenerationEmit::Lib || self.build { + if self.build { if let Some(path) = self.libdir { loader = loader::Loader::with_parser_lib_path(path); } diff --git a/crates/cli/src/templates/cmakelists.cmake b/crates/cli/src/templates/cmakelists.cmake index c2fd82fd..b0f4f790 100644 --- a/crates/cli/src/templates/cmakelists.cmake +++ b/crates/cli/src/templates/cmakelists.cmake @@ -22,14 +22,14 @@ find_program(TREE_SITTER_CLI tree-sitter DOC "Tree-sitter CLI") add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/grammar.js" COMMAND "${TREE_SITTER_CLI}" generate grammar.js - --emit=json + --no-parser WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMENT "Generating grammar.json") add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/parser.c" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json" COMMAND "${TREE_SITTER_CLI}" generate src/grammar.json - --emit=parser --abi=${TREE_SITTER_ABI_VERSION} + --abi=${TREE_SITTER_ABI_VERSION} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMENT "Generating parser.c") diff --git a/crates/cli/src/templates/makefile b/crates/cli/src/templates/makefile index 847381c5..b42dab97 100644 --- a/crates/cli/src/templates/makefile +++ b/crates/cli/src/templates/makefile @@ -73,10 +73,10 @@ $(LANGUAGE_NAME).pc: bindings/c/$(LANGUAGE_NAME).pc.in -e 's|@CMAKE_INSTALL_PREFIX@|$(PREFIX)|' $< > $@ $(SRC_DIR)/grammar.json: grammar.js - $(TS) generate --emit=json $^ + $(TS) generate --no-parser $^ $(PARSER): $(SRC_DIR)/grammar.json - $(TS) generate --emit=parser $^ + $(TS) generate $^ install: all install -d '$(DESTDIR)$(DATADIR)'/tree-sitter/queries/KEBAB_PARSER_NAME '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter '$(DESTDIR)$(PCLIBDIR)' '$(DESTDIR)$(LIBDIR)' diff --git a/docs/src/cli/generate.md b/docs/src/cli/generate.md index 02fcec00..9014e0ea 100644 --- a/docs/src/cli/generate.md +++ b/docs/src/cli/generate.md @@ -30,13 +30,9 @@ what keywords were extracted, what states were split and why, and the entry poin The ABI to use for parser generation. The default is ABI 15, with ABI 14 being a supported target. -### `--emit` +### `--no-parser` -What generated files to emit. Possible values: - -- `json`: Generate `grammar.json` and `node-types.json` -- `parser` (default): Generate `parser.c` and related files. -- `lib`: Compile to a library (equivalent of the deprecated `--build` option) +Only generate `grammar.json` and `node-types.json` ### `-0/--debug-build` From 8444cc3deb8fc4ddd283e7ae4c08bd5e79610938 Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Sun, 2 Nov 2025 11:29:24 +0100 Subject: [PATCH 548/663] fix(docs): remove multilingual config field Problem: "deploy docs" always pulls in the `latest` release of `mdbook`, which now is a v0.5.0 prerelease with breaking changes -- including removing an (apparently unused) `multilingual` config field in the TOML that is now an error (another breaking change). Solution: Delete the line. Add `workflow_dispatch` to the docs workflow in case follow-up changes are needed; see https://github.com/rust-lang/mdBook/blob/master/CHANGELOG.md#05-migration-guide --- .github/workflows/docs.yml | 1 + docs/book.toml | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 30fe914e..70f59a30 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -3,6 +3,7 @@ on: push: branches: [master] paths: [docs/**] + workflow_dispatch: jobs: deploy-docs: diff --git a/docs/book.toml b/docs/book.toml index 664a1f24..0894c988 100644 --- a/docs/book.toml +++ b/docs/book.toml @@ -4,7 +4,6 @@ authors = [ "Amaan Qureshi ", ] language = "en" -multilingual = false src = "src" title = "Tree-sitter" From 18a5243933402ad8fe22063a591ec3afe6e5dff3 Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Sun, 2 Nov 2025 23:18:31 +0100 Subject: [PATCH 549/663] ci(docs): pin mdbook to latest release --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 70f59a30..7c1d2c1d 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -26,7 +26,7 @@ jobs: GH_TOKEN: ${{ github.token }} run: | jq_expr='.assets[] | select(.name | contains("x86_64-unknown-linux-gnu")) | .browser_download_url' - url=$(gh api repos/rust-lang/mdbook/releases/latest --jq "$jq_expr") + url=$(gh api repos/rust-lang/mdbook/releases/v0.4.52 --jq "$jq_expr") mkdir mdbook curl -sSL "$url" | tar -xz -C mdbook printf '%s/mdbook\n' "$PWD" >> "$GITHUB_PATH" From ef03a3f8fe0ceb6cbea6a7adbafd42971f532c62 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Sun, 2 Nov 2025 18:13:19 -0500 Subject: [PATCH 550/663] fix(ci): correct mdbook release url --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 7c1d2c1d..fb23b271 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -26,7 +26,7 @@ jobs: GH_TOKEN: ${{ github.token }} run: | jq_expr='.assets[] | select(.name | contains("x86_64-unknown-linux-gnu")) | .browser_download_url' - url=$(gh api repos/rust-lang/mdbook/releases/v0.4.52 --jq "$jq_expr") + url=$(gh api repos/rust-lang/mdbook/releases/tags/v0.4.52 --jq "$jq_expr") mkdir mdbook curl -sSL "$url" | tar -xz -C mdbook printf '%s/mdbook\n' "$PWD" >> "$GITHUB_PATH" From 944386d25f088b8ac849dc7060d4ac80bb3e3702 Mon Sep 17 00:00:00 2001 From: WillLillis Date: Sat, 27 Sep 2025 19:12:53 -0400 Subject: [PATCH 551/663] refactor(test): clean up test filtering logic Also, only update the expected output of a case when it is skipped if the `update` flag has been passed --- crates/cli/src/test.rs | 43 ++++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/crates/cli/src/test.rs b/crates/cli/src/test.rs index f107cb07..f5cc5de4 100644 --- a/crates/cli/src/test.rs +++ b/crates/cli/src/test.rs @@ -421,12 +421,11 @@ impl TestCorrection { } /// This will return false if we want to "fail fast". It will bail and not parse any more tests. -#[allow(clippy::too_many_arguments)] fn run_tests( parser: &mut Parser, test_entry: TestEntry, opts: &mut TestOptions, - mut indent_level: u32, + indent_level: u32, failures: &mut Vec, corrected_entries: &mut Vec, has_parse_errors: &mut bool, @@ -660,7 +659,6 @@ fn run_tests( return Ok(true); } - indent_level += 1; let failure_count = failures.len(); let mut has_printed = false; @@ -680,16 +678,10 @@ fn run_tests( } }; - let should_skip = |entry: &TestEntry, opts: &TestOptions| match entry { - TestEntry::Example { - name, file_name, .. - } => !matches_filter(name, file_name, opts), - TestEntry::Group { .. } => false, - }; - for child in children { if let TestEntry::Example { ref name, + ref file_name, ref input, ref output, ref attributes_str, @@ -698,29 +690,30 @@ fn run_tests( .. } = child { - if should_skip(&child, opts) { - let input = String::from_utf8(input.clone()).unwrap(); - let output = format_sexp(output, 0); - corrected_entries.push(TestCorrection::new( - name, - input, - output, - attributes_str, - header_delim_len, - divider_delim_len, - )); + if !matches_filter(name, file_name, opts) { + if opts.update { + let input = String::from_utf8(input.clone()).unwrap(); + let output = format_sexp(output, 0); + corrected_entries.push(TestCorrection::new( + name, + input, + output, + attributes_str, + header_delim_len, + divider_delim_len, + )); + } opts.test_num += 1; - continue; } } - if !has_printed && indent_level > 1 { + if !has_printed && indent_level > 0 { has_printed = true; writeln!( opts.output, "{}{name}:", - " ".repeat((indent_level - 1) as usize) + " ".repeat(indent_level as usize) )?; opts.parse_rates.push((false, None)); } @@ -728,7 +721,7 @@ fn run_tests( parser, child, opts, - indent_level, + indent_level + 1, failures, corrected_entries, has_parse_errors, From 6a8676f335c986d93d2236162b466529256fb672 Mon Sep 17 00:00:00 2001 From: WillLillis Date: Sun, 28 Sep 2025 22:25:30 -0400 Subject: [PATCH 552/663] refactor(test): generalize printing of test diff keys and diffs --- crates/cli/src/fuzz.rs | 10 +-- crates/cli/src/test.rs | 99 +++++++++++++++++++---------- crates/cli/src/tests/corpus_test.rs | 14 ++-- 3 files changed, 76 insertions(+), 47 deletions(-) diff --git a/crates/cli/src/fuzz.rs b/crates/cli/src/fuzz.rs index 24806fca..f1524825 100644 --- a/crates/cli/src/fuzz.rs +++ b/crates/cli/src/fuzz.rs @@ -25,7 +25,7 @@ use crate::{ random::Rand, }, parse::perform_edit, - test::{parse_tests, print_diff, print_diff_key, strip_sexp_fields, TestEntry}, + test::{parse_tests, strip_sexp_fields, DiffKey, TestDiff, TestEntry}, }; pub static LOG_ENABLED: LazyLock = LazyLock::new(|| env::var("TREE_SITTER_LOG").is_ok()); @@ -183,8 +183,8 @@ pub fn fuzz_language_corpus( if actual_output != test.output { println!("Incorrect initial parse for {test_name}"); - print_diff_key(); - print_diff(&actual_output, &test.output, true); + println!("{DiffKey}"); + println!("{}", TestDiff::new(&actual_output, &test.output, true)); println!(); return false; } @@ -276,8 +276,8 @@ pub fn fuzz_language_corpus( if actual_output != test.output && !test.error { println!("Incorrect parse for {test_name} - seed {seed}"); - print_diff_key(); - print_diff(&actual_output, &test.output, true); + println!("{DiffKey}"); + println!("{}", TestDiff::new(&actual_output, &test.output, true)); println!(); return false; } diff --git a/crates/cli/src/test.rs b/crates/cli/src/test.rs index f5cc5de4..b19d7afd 100644 --- a/crates/cli/src/test.rs +++ b/crates/cli/src/test.rs @@ -317,49 +317,78 @@ pub fn check_queries_at_path(language: &Language, path: &Path) -> Result<()> { Ok(()) } -pub fn print_diff_key() { - println!( - "\ncorrect / {} / {}", - paint(Some(AnsiColor::Green), "expected"), - paint(Some(AnsiColor::Red), "unexpected") - ); +pub struct DiffKey; + +impl std::fmt::Display for DiffKey { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "\ncorrect / {} / {}", + paint(Some(AnsiColor::Green), "expected"), + paint(Some(AnsiColor::Red), "unexpected") + )?; + Ok(()) + } } -pub fn print_diff(actual: &str, expected: &str, use_color: bool) { - let diff = TextDiff::from_lines(actual, expected); - for diff in diff.iter_all_changes() { - match diff.tag() { - ChangeTag::Equal => { - if use_color { - print!("{diff}"); - } else { - print!(" {diff}"); +pub struct TestDiff<'a> { + pub actual: &'a str, + pub expected: &'a str, + pub use_color: bool, +} + +impl<'a> TestDiff<'a> { + #[must_use] + pub const fn new(actual: &'a str, expected: &'a str, use_color: bool) -> Self { + Self { + actual, + expected, + use_color, + } + } +} + +impl std::fmt::Display for TestDiff<'_> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let diff = TextDiff::from_lines(self.actual, self.expected); + for diff in diff.iter_all_changes() { + match diff.tag() { + ChangeTag::Equal => { + if self.use_color { + write!(f, "{diff}")?; + } else { + write!(f, " {diff}")?; + } } - } - ChangeTag::Insert => { - if use_color { - print!("{}", paint(Some(AnsiColor::Green), diff.as_str().unwrap())); - } else { - print!("+{diff}"); + ChangeTag::Insert => { + if self.use_color { + write!( + f, + "{}", + paint(Some(AnsiColor::Green), diff.as_str().unwrap()) + )?; + } else { + write!(f, "+{diff}")?; + } + if diff.missing_newline() { + writeln!(f)?; + } } - if diff.missing_newline() { - println!(); - } - } - ChangeTag::Delete => { - if use_color { - print!("{}", paint(Some(AnsiColor::Red), diff.as_str().unwrap())); - } else { - print!("-{diff}"); - } - if diff.missing_newline() { - println!(); + ChangeTag::Delete => { + if self.use_color { + write!(f, "{}", paint(Some(AnsiColor::Red), diff.as_str().unwrap()))?; + } else { + write!(f, "-{diff}")?; + } + if diff.missing_newline() { + writeln!(f)?; + } } } } - } - println!(); + Ok(()) + } } struct TestFailure { diff --git a/crates/cli/src/tests/corpus_test.rs b/crates/cli/src/tests/corpus_test.rs index fe2e2943..de797401 100644 --- a/crates/cli/src/tests/corpus_test.rs +++ b/crates/cli/src/tests/corpus_test.rs @@ -16,7 +16,7 @@ use crate::{ LOG_GRAPH_ENABLED, START_SEED, }, parse::perform_edit, - test::{parse_tests, print_diff, print_diff_key, strip_sexp_fields}, + test::{parse_tests, strip_sexp_fields, DiffKey, TestDiff}, tests::{ allocations, helpers::fixtures::{fixtures_dir, get_language, get_test_language, SCRATCH_BASE_DIR}, @@ -209,8 +209,8 @@ pub fn test_language_corpus( if actual_output != test.output { println!("Incorrect initial parse for {test_name}"); - print_diff_key(); - print_diff(&actual_output, &test.output, true); + println!("{DiffKey}"); + println!("{}", TestDiff::new(&actual_output, &test.output, true)); println!(); return false; } @@ -297,8 +297,8 @@ pub fn test_language_corpus( if actual_output != test.output { println!("Incorrect parse for {test_name} - seed {seed}"); - print_diff_key(); - print_diff(&actual_output, &test.output, true); + println!("{DiffKey}"); + println!("{}", TestDiff::new(&actual_output, &test.output, true)); println!(); return false; } @@ -428,8 +428,8 @@ fn test_feature_corpus_files() { if actual_output == test.output { true } else { - print_diff_key(); - print_diff(&actual_output, &test.output, true); + println!("{DiffKey}"); + print!("{}", TestDiff::new(&actual_output, &test.output, true)); println!(); false } From f02d7e7e335dc4d9355d4d2ca61729368bc4e959 Mon Sep 17 00:00:00 2001 From: WillLillis Date: Sun, 28 Sep 2025 22:57:56 -0400 Subject: [PATCH 553/663] feat(test): display test results in JSON format --- crates/cli/src/fuzz.rs | 8 +- crates/cli/src/main.rs | 198 ++++--- crates/cli/src/query.rs | 70 ++- crates/cli/src/test.rs | 794 ++++++++++++++++++++-------- crates/cli/src/test_highlight.rs | 68 +-- crates/cli/src/test_tags.rs | 68 +-- crates/cli/src/tests/corpus_test.rs | 12 +- 7 files changed, 799 insertions(+), 419 deletions(-) diff --git a/crates/cli/src/fuzz.rs b/crates/cli/src/fuzz.rs index f1524825..39ad7691 100644 --- a/crates/cli/src/fuzz.rs +++ b/crates/cli/src/fuzz.rs @@ -183,8 +183,8 @@ pub fn fuzz_language_corpus( if actual_output != test.output { println!("Incorrect initial parse for {test_name}"); - println!("{DiffKey}"); - println!("{}", TestDiff::new(&actual_output, &test.output, true)); + DiffKey::print(); + println!("{}", TestDiff::new(&actual_output, &test.output)); println!(); return false; } @@ -276,8 +276,8 @@ pub fn fuzz_language_corpus( if actual_output != test.output && !test.error { println!("Incorrect parse for {test_name} - seed {seed}"); - println!("{DiffKey}"); - println!("{}", TestDiff::new(&actual_output, &test.output, true)); + DiffKey::print(); + println!("{}", TestDiff::new(&actual_output, &test.output)); println!(); return false; } diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 26595f41..e5cc7317 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -24,11 +24,12 @@ use tree_sitter_cli::{ input::{get_input, get_tmp_source_file, CliInput}, logger, parse::{self, ParseDebugType, ParseFileOptions, ParseOutput, ParseTheme}, - playground, query, + playground, + query::{self, QueryFileOptions}, tags::{self, TagsOptions}, - test::{self, TestOptions, TestStats}, - test_highlight, test_tags, util, version, - version::BumpLevel, + test::{self, TestOptions, TestStats, TestSummary}, + test_highlight, test_tags, util, + version::{self, BumpLevel}, wasm, }; use tree_sitter_config::Config; @@ -328,6 +329,9 @@ struct Test { /// Show only the pass-fail overview tree #[arg(long)] pub overview_only: bool, + /// Output the test summary in a JSON output + #[arg(long)] + pub json_summary: bool, } #[derive(Args)] @@ -1150,6 +1154,28 @@ impl Parse { } } +/// In case an error is encountered, prints out the contents of `test_summary` and +/// propagates the error +fn check_test( + test_result: Result<()>, + test_summary: &TestSummary, + json_summary: bool, +) -> Result<()> { + if let Err(e) = test_result { + if json_summary { + let json_summary = serde_json::to_string_pretty(test_summary) + .expect("Failed to encode summary to JSON"); + println!("{json_summary}"); + } else { + println!("{test_summary}"); + } + + Err(e)?; + } + + Ok(()) +} + impl Test { fn run(self, mut loader: loader::Loader, current_dir: &Path) -> Result<()> { let config = Config::load(self.config_path)?; @@ -1194,15 +1220,18 @@ impl Test { parser.set_language(language)?; let test_dir = current_dir.join("test"); - let mut stats = parse::Stats::default(); + let mut test_summary = TestSummary::new( + color, + stat, + self.update, + self.overview_only, + self.json_summary, + ); // Run the corpus tests. Look for them in `test/corpus`. let test_corpus_dir = test_dir.join("corpus"); if test_corpus_dir.is_dir() { - let mut output = String::new(); - let mut rates = Vec::new(); - let mut opts = TestOptions { - output: &mut output, + let opts = TestOptions { path: test_corpus_dir, debug: self.debug, debug_graph: self.debug_graph, @@ -1213,51 +1242,67 @@ impl Test { open_log: self.open_log, languages: languages.iter().map(|(l, n)| (n.as_str(), l)).collect(), color, - test_num: 1, - parse_rates: &mut rates, - stat_display: stat, - stats: &mut stats, show_fields: self.show_fields, overview_only: self.overview_only, }; - test::run_tests_at_path(&mut parser, &mut opts)?; - println!("\n{stats}"); + check_test( + test::run_tests_at_path(&mut parser, &opts, &mut test_summary), + &test_summary, + self.json_summary, + )?; + test_summary.test_num = 1; } // Check that all of the queries are valid. - test::check_queries_at_path(language, ¤t_dir.join("queries"))?; + let query_dir = current_dir.join("queries"); + check_test( + test::check_queries_at_path(language, &query_dir), + &test_summary, + self.json_summary, + )?; + test_summary.test_num = 1; // Run the syntax highlighting tests. let test_highlight_dir = test_dir.join("highlight"); if test_highlight_dir.is_dir() { let mut highlighter = Highlighter::new(); highlighter.parser = parser; - test_highlight::test_highlights( - &loader, - &config.get()?, - &mut highlighter, - &test_highlight_dir, - color, + check_test( + test_highlight::test_highlights( + &loader, + &config.get()?, + &mut highlighter, + &test_highlight_dir, + &mut test_summary, + ), + &test_summary, + self.json_summary, )?; parser = highlighter.parser; + test_summary.test_num = 1; } let test_tag_dir = test_dir.join("tags"); if test_tag_dir.is_dir() { let mut tags_context = TagsContext::new(); tags_context.parser = parser; - test_tags::test_tags( - &loader, - &config.get()?, - &mut tags_context, - &test_tag_dir, - color, + check_test( + test_tags::test_tags( + &loader, + &config.get()?, + &mut tags_context, + &test_tag_dir, + &mut test_summary, + ), + &test_summary, + self.json_summary, )?; + test_summary.test_num = 1; } // For the rest of the queries, find their tests and run them - for entry in walkdir::WalkDir::new(current_dir.join("queries")) + for entry in walkdir::WalkDir::new(&query_dir) .into_iter() .filter_map(|e| e.ok()) .filter(|e| e.file_type().is_file()) @@ -1280,27 +1325,41 @@ impl Test { }) .collect::>(); if !entries.is_empty() { - println!("{stem}:"); + test_summary.query_results.add_group(stem); } - for entry in entries { + test_summary.test_num = 1; + let opts = QueryFileOptions::default(); + for entry in &entries { let path = entry.path(); - query::query_file_at_path( - language, - path, - &path.display().to_string(), - path, - false, - None, - None, - true, - false, - false, - false, + check_test( + query::query_file_at_path( + language, + path, + &path.display().to_string(), + path, + &opts, + Some(&mut test_summary), + ), + &test_summary, + self.json_summary, )?; } + if !entries.is_empty() { + test_summary.query_results.pop_traversal(); + } } } + test_summary.test_num = 1; + + if self.json_summary { + let json_summary = serde_json::to_string_pretty(&test_summary) + .expect("Failed to encode test summary to JSON"); + println!("{json_summary}"); + } else { + println!("{test_summary}"); + } + Ok(()) } } @@ -1407,19 +1466,22 @@ impl Query { lib_info.as_ref(), )?; + let opts = QueryFileOptions { + ordered_captures: self.captures, + byte_range, + point_range, + quiet: self.quiet, + print_time: self.time, + stdin: false, + }; for path in paths { query::query_file_at_path( &language, &path, &path.display().to_string(), query_path, - self.captures, - byte_range.clone(), - point_range.clone(), - self.test, - self.quiet, - self.time, - false, + &opts, + None, )?; } } @@ -1447,19 +1509,15 @@ impl Query { .map(|(l, _)| l.clone()) .ok_or_else(|| anyhow!("No language found"))? }; - query::query_file_at_path( - language, - &path, - &name, - query_path, - self.captures, + let opts = QueryFileOptions { + ordered_captures: self.captures, byte_range, point_range, - self.test, - self.quiet, - self.time, - true, - )?; + quiet: self.quiet, + print_time: self.time, + stdin: true, + }; + query::query_file_at_path(language, &path, &name, query_path, &opts, None)?; fs::remove_file(path)?; } CliInput::Stdin(contents) => { @@ -1469,19 +1527,15 @@ impl Query { let path = get_tmp_source_file(&contents)?; let language = loader.select_language(&path, current_dir, None, lib_info.as_ref())?; - query::query_file_at_path( - &language, - &path, - "stdin", - query_path, - self.captures, + let opts = QueryFileOptions { + ordered_captures: self.captures, byte_range, point_range, - self.test, - self.quiet, - self.time, - true, - )?; + quiet: self.quiet, + print_time: self.time, + stdin: true, + }; + query::query_file_at_path(&language, &path, "stdin", query_path, &opts, None)?; fs::remove_file(path)?; } } diff --git a/crates/cli/src/query.rs b/crates/cli/src/query.rs index ea074b75..c58e5f34 100644 --- a/crates/cli/src/query.rs +++ b/crates/cli/src/query.rs @@ -6,30 +6,33 @@ use std::{ time::Instant, }; -use anstyle::AnsiColor; use anyhow::{Context, Result}; use log::warn; use streaming_iterator::StreamingIterator; use tree_sitter::{Language, Parser, Point, Query, QueryCursor}; use crate::{ - logger::paint, query_testing::{self, to_utf8_point}, + test::{TestInfo, TestOutcome, TestResult, TestSummary}, }; -#[allow(clippy::too_many_arguments)] +#[derive(Default)] +pub struct QueryFileOptions { + pub ordered_captures: bool, + pub byte_range: Option>, + pub point_range: Option>, + pub quiet: bool, + pub print_time: bool, + pub stdin: bool, +} + pub fn query_file_at_path( language: &Language, path: &Path, name: &str, query_path: &Path, - ordered_captures: bool, - byte_range: Option>, - point_range: Option>, - should_test: bool, - quiet: bool, - print_time: bool, - stdin: bool, + opts: &QueryFileOptions, + test_summary: Option<&mut TestSummary>, ) -> Result<()> { let stdout = io::stdout(); let mut stdout = stdout.lock(); @@ -39,19 +42,20 @@ pub fn query_file_at_path( let query = Query::new(language, &query_source).with_context(|| "Query compilation failed")?; let mut query_cursor = QueryCursor::new(); - if let Some(range) = byte_range { - query_cursor.set_byte_range(range); + if let Some(ref range) = opts.byte_range { + query_cursor.set_byte_range(range.clone()); } - if let Some(range) = point_range { - query_cursor.set_point_range(range); + if let Some(ref range) = opts.point_range { + query_cursor.set_point_range(range.clone()); } let mut parser = Parser::new(); parser.set_language(language)?; let mut results = Vec::new(); + let should_test = test_summary.is_some(); - if !should_test && !stdin { + if !should_test && !opts.stdin { writeln!(&mut stdout, "{name}")?; } @@ -60,12 +64,12 @@ pub fn query_file_at_path( let tree = parser.parse(&source_code, None).unwrap(); let start = Instant::now(); - if ordered_captures { + if opts.ordered_captures { let mut captures = query_cursor.captures(&query, tree.root_node(), source_code.as_slice()); while let Some((mat, capture_index)) = captures.next() { let capture = mat.captures[*capture_index]; let capture_name = &query.capture_names()[capture.index as usize]; - if !quiet && !should_test { + if !opts.quiet && !should_test { writeln!( &mut stdout, " pattern: {:>2}, capture: {} - {capture_name}, start: {}, end: {}, text: `{}`", @@ -85,14 +89,14 @@ pub fn query_file_at_path( } else { let mut matches = query_cursor.matches(&query, tree.root_node(), source_code.as_slice()); while let Some(m) = matches.next() { - if !quiet && !should_test { + if !opts.quiet && !should_test { writeln!(&mut stdout, " pattern: {}", m.pattern_index)?; } for capture in m.captures { let start = capture.node.start_position(); let end = capture.node.end_position(); let capture_name = &query.capture_names()[capture.index as usize]; - if !quiet && !should_test { + if !opts.quiet && !should_test { if end.row == start.row { writeln!( &mut stdout, @@ -119,26 +123,38 @@ pub fn query_file_at_path( warn!("Query exceeded maximum number of in-progress captures!"); } if should_test { - let path_name = if stdin { + let path_name = if opts.stdin { "stdin" } else { Path::new(&path).file_name().unwrap().to_str().unwrap() }; + // Invariant: `test_summary` will always be `Some` when `should_test` is true + let test_summary = test_summary.unwrap(); match query_testing::assert_expected_captures(&results, path, &mut parser, language) { Ok(assertion_count) => { - println!( - " ✓ {} ({} assertions)", - paint(Some(AnsiColor::Green), path_name), - assertion_count - ); + test_summary.query_results.add_case(TestResult { + name: path_name.to_string(), + info: TestInfo::AssertionTest { + outcome: TestOutcome::AssertionPassed { assertion_count }, + test_num: test_summary.test_num, + }, + }); } Err(e) => { - println!(" ✗ {}", paint(Some(AnsiColor::Red), path_name)); + test_summary.query_results.add_case(TestResult { + name: path_name.to_string(), + info: TestInfo::AssertionTest { + outcome: TestOutcome::AssertionFailed { + error: e.to_string(), + }, + test_num: test_summary.test_num, + }, + }); return Err(e); } } } - if print_time { + if opts.print_time { writeln!(&mut stdout, "{:?}", start.elapsed())?; } diff --git a/crates/cli/src/test.rs b/crates/cli/src/test.rs index b19d7afd..90629b15 100644 --- a/crates/cli/src/test.rs +++ b/crates/cli/src/test.rs @@ -1,7 +1,7 @@ use std::{ collections::BTreeMap, ffi::OsStr, - fmt::Write as _, + fmt::Display as _, fs, io::{self, Write}, path::{Path, PathBuf}, @@ -18,6 +18,7 @@ use regex::{ bytes::{Regex as ByteRegex, RegexBuilder as ByteRegexBuilder}, Regex, }; +use serde::Serialize; use similar::{ChangeTag, TextDiff}; use tree_sitter::{format_sexp, Language, LogType, Parser, Query, Tree}; use walkdir::WalkDir; @@ -114,7 +115,7 @@ impl Default for TestAttributes { } } -#[derive(ValueEnum, Default, Copy, Clone, PartialEq, Eq)] +#[derive(ValueEnum, Default, Debug, Copy, Clone, PartialEq, Eq, Serialize)] pub enum TestStats { All, #[default] @@ -123,7 +124,6 @@ pub enum TestStats { } pub struct TestOptions<'a> { - pub output: &'a mut String, pub path: PathBuf, pub debug: bool, pub debug_graph: bool, @@ -134,17 +134,453 @@ pub struct TestOptions<'a> { pub open_log: bool, pub languages: BTreeMap<&'a str, &'a Language>, pub color: bool, - pub test_num: usize, - /// Whether a test ran for the nth line in `output`, the true parse rate, and the adjusted - /// parse rate - pub parse_rates: &'a mut Vec<(bool, Option<(f64, f64)>)>, - pub stat_display: TestStats, - pub stats: &'a mut Stats, pub show_fields: bool, pub overview_only: bool, } -pub fn run_tests_at_path(parser: &mut Parser, opts: &mut TestOptions) -> Result<()> { +/// A stateful object used to collect results from running a grammar's test suite +#[derive(Debug, Default, Serialize)] +pub struct TestSummary { + // Parse test results and associated data + #[serde(serialize_with = "serialize_as_array")] + pub parse_results: TestResultHierarchy, + pub parse_failures: Vec, + pub parse_stats: Stats, + #[serde(skip)] + pub has_parse_errors: bool, + #[serde(skip)] + pub parse_stat_display: TestStats, + + // Other test results + #[serde(serialize_with = "serialize_as_array")] + pub highlight_results: TestResultHierarchy, + #[serde(serialize_with = "serialize_as_array")] + pub tag_results: TestResultHierarchy, + #[serde(serialize_with = "serialize_as_array")] + pub query_results: TestResultHierarchy, + + // Data used during construction + #[serde(skip)] + pub test_num: usize, + // Options passed in from the CLI which control how the summary is displayed + #[serde(skip)] + pub color: bool, + #[serde(skip)] + pub overview_only: bool, + #[serde(skip)] + pub update: bool, + #[serde(skip)] + pub json: bool, +} + +impl TestSummary { + #[must_use] + pub fn new( + color: bool, + stat_display: TestStats, + parse_update: bool, + overview_only: bool, + json_summary: bool, + ) -> Self { + Self { + color, + parse_stat_display: stat_display, + update: parse_update, + overview_only, + json: json_summary, + test_num: 1, + ..Default::default() + } + } +} + +#[derive(Debug, Default)] +pub struct TestResultHierarchy { + root_group: Vec, + traversal_idxs: Vec, +} + +fn serialize_as_array(results: &TestResultHierarchy, serializer: S) -> Result +where + S: serde::Serializer, +{ + results.root_group.serialize(serializer) +} + +/// Stores arbitrarily nested parent test groups and child cases. Supports creation +/// in DFS traversal order +impl TestResultHierarchy { + /// Signifies the start of a new group's traversal during construction. + fn push_traversal(&mut self, idx: usize) { + self.traversal_idxs.push(idx); + } + + /// Signifies the end of the current group's traversal during construction. + /// Must be paired with a prior call to [`TestResultHierarchy::add_group`]. + pub fn pop_traversal(&mut self) { + self.traversal_idxs.pop(); + } + + /// Adds a new group as a child of the current group. Caller is responsible + /// for calling [`TestResultHierarchy::pop_traversal`] once the group is done + /// being traversed. + pub fn add_group(&mut self, group_name: &str) { + let new_group_idx = self.curr_group_len(); + self.push(TestResult { + name: group_name.to_string(), + info: TestInfo::Group { + children: Vec::new(), + }, + }); + self.push_traversal(new_group_idx); + } + + /// Adds a new test example as a child of the current group. + /// Asserts that `test_case.info` is not [`TestInfo::Group`]. + pub fn add_case(&mut self, test_case: TestResult) { + assert!(!matches!(test_case.info, TestInfo::Group { .. })); + self.push(test_case); + } + + /// Adds a new `TestResult` to the current group. + fn push(&mut self, result: TestResult) { + // If there are no traversal steps, we're adding to the root + if self.traversal_idxs.is_empty() { + self.root_group.push(result); + return; + } + + #[allow(clippy::manual_let_else)] + let mut curr_group = match self.root_group[self.traversal_idxs[0]].info { + TestInfo::Group { ref mut children } => children, + _ => unreachable!(), + }; + for idx in self.traversal_idxs.iter().skip(1) { + curr_group = match curr_group[*idx].info { + TestInfo::Group { ref mut children } => children, + _ => unreachable!(), + }; + } + + curr_group.push(result); + } + + fn curr_group_len(&self) -> usize { + if self.traversal_idxs.is_empty() { + return self.root_group.len(); + } + + #[allow(clippy::manual_let_else)] + let mut curr_group = match self.root_group[self.traversal_idxs[0]].info { + TestInfo::Group { ref children } => children, + _ => unreachable!(), + }; + for idx in self.traversal_idxs.iter().skip(1) { + curr_group = match curr_group[*idx].info { + TestInfo::Group { ref children } => children, + _ => unreachable!(), + }; + } + curr_group.len() + } + + #[allow(clippy::iter_without_into_iter)] + #[must_use] + pub fn iter(&self) -> TestResultIterWithDepth<'_> { + let mut stack = Vec::with_capacity(self.root_group.len()); + for child in self.root_group.iter().rev() { + stack.push((0, child)); + } + TestResultIterWithDepth { stack } + } +} + +pub struct TestResultIterWithDepth<'a> { + stack: Vec<(usize, &'a TestResult)>, +} + +impl<'a> Iterator for TestResultIterWithDepth<'a> { + type Item = (usize, &'a TestResult); + + fn next(&mut self) -> Option { + self.stack.pop().inspect(|(depth, result)| { + if let TestInfo::Group { children } = &result.info { + for child in children.iter().rev() { + self.stack.push((depth + 1, child)); + } + } + }) + } +} + +#[derive(Debug, Serialize)] +pub struct TestResult { + pub name: String, + #[serde(flatten)] + pub info: TestInfo, +} + +#[derive(Debug, Serialize)] +#[serde(untagged)] +pub enum TestInfo { + Group { + children: Vec, + }, + ParseTest { + outcome: TestOutcome, + // True parse rate, adjusted parse rate + #[serde(serialize_with = "serialize_parse_rates")] + parse_rate: Option<(f64, f64)>, + test_num: usize, + }, + AssertionTest { + outcome: TestOutcome, + test_num: usize, + }, +} + +fn serialize_parse_rates( + parse_rate: &Option<(f64, f64)>, + serializer: S, +) -> Result +where + S: serde::Serializer, +{ + match parse_rate { + None => serializer.serialize_none(), + Some((first, _)) => serializer.serialize_some(first), + } +} + +#[derive(Debug, Clone, Eq, PartialEq, Serialize)] +pub enum TestOutcome { + // Parse outcomes + Passed, + Failed, + Updated, + Skipped, + Platform, + + // Highlight/Tag/Query outcomes + AssertionPassed { assertion_count: usize }, + AssertionFailed { error: String }, +} + +impl TestSummary { + fn fmt_parse_results(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let (count, total_adj_parse_time) = self + .parse_results + .iter() + .filter_map(|(_, result)| match result.info { + TestInfo::Group { .. } => None, + TestInfo::ParseTest { parse_rate, .. } => parse_rate, + _ => unreachable!(), + }) + .fold((0usize, 0.0f64), |(count, rate_accum), (_, adj_rate)| { + (count + 1, rate_accum + adj_rate) + }); + + let avg = total_adj_parse_time / count as f64; + let std_dev = { + let variance = self + .parse_results + .iter() + .filter_map(|(_, result)| match result.info { + TestInfo::Group { .. } => None, + TestInfo::ParseTest { parse_rate, .. } => parse_rate, + _ => unreachable!(), + }) + .map(|(_, rate_i)| (rate_i - avg).powi(2)) + .sum::() + / count as f64; + variance.sqrt() + }; + + for (depth, entry) in self.parse_results.iter() { + write!(f, "{}", " ".repeat(depth + 1))?; + match &entry.info { + TestInfo::Group { .. } => writeln!(f, "{}:", entry.name)?, + TestInfo::ParseTest { + outcome, + parse_rate, + test_num, + } => { + let (color, result_char) = match outcome { + TestOutcome::Passed => (AnsiColor::Green, "✓"), + TestOutcome::Failed => (AnsiColor::Red, "✗"), + TestOutcome::Updated => (AnsiColor::Blue, "✓"), + TestOutcome::Skipped => (AnsiColor::Yellow, "⌀"), + TestOutcome::Platform => (AnsiColor::Magenta, "⌀"), + _ => unreachable!(), + }; + let stat_display = match (self.parse_stat_display, parse_rate) { + (TestStats::TotalOnly, _) | (_, None) => String::new(), + (display, Some((true_rate, adj_rate))) => { + let mut stats = if display == TestStats::All { + format!(" ({true_rate:.3} bytes/ms)") + } else { + String::new() + }; + // 3 standard deviations below the mean, aka the "Empirical Rule" + if *adj_rate < 3.0f64.mul_add(-std_dev, avg) { + stats += &paint( + self.color.then_some(AnsiColor::Yellow), + &format!( + " -- Warning: Slow parse rate ({true_rate:.3} bytes/ms)" + ), + ); + } + stats + } + }; + writeln!( + f, + "{test_num:>3}. {result_char} {}{stat_display}", + paint(self.color.then_some(color), &entry.name), + )?; + } + TestInfo::AssertionTest { .. } => unreachable!(), + } + } + + // Parse failure info + if !self.parse_failures.is_empty() && self.update && !self.has_parse_errors { + writeln!( + f, + "\n{} update{}:\n", + self.parse_failures.len(), + if self.parse_failures.len() == 1 { + "" + } else { + "s" + } + )?; + + for (i, TestFailure { name, .. }) in self.parse_failures.iter().enumerate() { + writeln!(f, " {}. {name}", i + 1)?; + } + } else if !self.parse_failures.is_empty() && !self.overview_only { + if !self.has_parse_errors { + writeln!( + f, + "\n{} failure{}:", + self.parse_failures.len(), + if self.parse_failures.len() == 1 { + "" + } else { + "s" + } + )?; + } + + if self.color { + DiffKey.fmt(f)?; + } + for ( + i, + TestFailure { + name, + actual, + expected, + is_cst, + }, + ) in self.parse_failures.iter().enumerate() + { + if expected == "NO ERROR" { + writeln!(f, "\n {}. {name}:\n", i + 1)?; + writeln!(f, " Expected an ERROR node, but got:")?; + let actual = if *is_cst { + actual + } else { + &format_sexp(actual, 2) + }; + writeln!( + f, + " {}", + paint(self.color.then_some(AnsiColor::Red), actual) + )?; + } else { + writeln!(f, "\n {}. {name}:", i + 1)?; + if *is_cst { + writeln!( + f, + "{}", + TestDiff::new(actual, expected).with_color(self.color) + )?; + } else { + writeln!( + f, + "{}", + TestDiff::new(&format_sexp(actual, 2), &format_sexp(expected, 2)) + .with_color(self.color,) + )?; + } + } + } + } else { + writeln!(f)?; + } + + Ok(()) + } +} + +impl std::fmt::Display for TestSummary { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.fmt_parse_results(f)?; + + let mut render_assertion_results = + |name: &str, results: &TestResultHierarchy| -> std::fmt::Result { + writeln!(f, "{name}:")?; + for (depth, entry) in results.iter() { + write!(f, "{}", " ".repeat(depth + 2))?; + match &entry.info { + TestInfo::Group { .. } => writeln!(f, "{}", entry.name)?, + TestInfo::AssertionTest { outcome, test_num } => match outcome { + TestOutcome::AssertionPassed { assertion_count } => writeln!( + f, + "{:>3}. ✓ {} ({assertion_count} assertions)", + test_num, + paint(self.color.then_some(AnsiColor::Green), &entry.name) + )?, + TestOutcome::AssertionFailed { error } => { + writeln!( + f, + "{:>3}. ✗ {}", + test_num, + paint(self.color.then_some(AnsiColor::Red), &entry.name) + )?; + writeln!(f, "{} {error}", " ".repeat(depth + 1))?; + } + _ => unreachable!(), + }, + TestInfo::ParseTest { .. } => unreachable!(), + } + } + Ok(()) + }; + + if !self.highlight_results.root_group.is_empty() { + render_assertion_results("syntax highlighting", &self.highlight_results)?; + } + + if !self.tag_results.root_group.is_empty() { + render_assertion_results("tags", &self.tag_results)?; + } + + if !self.query_results.root_group.is_empty() { + render_assertion_results("queries", &self.query_results)?; + } + + Ok(()) + } +} + +pub fn run_tests_at_path( + parser: &mut Parser, + opts: &TestOptions, + test_summary: &mut TestSummary, +) -> Result<()> { let test_entry = parse_tests(&opts.path)?; let mut _log_session = None; @@ -159,140 +595,26 @@ pub fn run_tests_at_path(parser: &mut Parser, opts: &mut TestOptions) -> Result< }))); } - let mut failures = Vec::new(); let mut corrected_entries = Vec::new(); - let mut has_parse_errors = false; run_tests( parser, test_entry, opts, - 0, - &mut failures, + test_summary, &mut corrected_entries, - &mut has_parse_errors, + true, )?; - let (count, total_adj_parse_time) = opts - .parse_rates - .iter() - .flat_map(|(_, rates)| rates) - .fold((0usize, 0.0f64), |(count, rate_accum), (_, adj_rate)| { - (count + 1, rate_accum + adj_rate) - }); - - let avg = total_adj_parse_time / count as f64; - let std_dev = { - let variance = opts - .parse_rates - .iter() - .flat_map(|(_, rates)| rates) - .map(|(_, rate_i)| (rate_i - avg).powi(2)) - .sum::() - / count as f64; - variance.sqrt() - }; - - for ((is_test, rates), out_line) in opts.parse_rates.iter().zip(opts.output.lines()) { - let stat_display = if !is_test { - // Test group, no actual parsing took place - String::new() - } else { - match (opts.stat_display, rates) { - (TestStats::TotalOnly, _) | (_, None) => String::new(), - (display, Some((true_rate, adj_rate))) => { - let mut stats = if display == TestStats::All { - format!(" ({true_rate:.3} bytes/ms)") - } else { - String::new() - }; - // 3 standard deviations below the mean, aka the "Empirical Rule" - if *adj_rate < 3.0f64.mul_add(-std_dev, avg) { - stats += &paint( - opts.color.then_some(AnsiColor::Yellow), - &format!(" -- Warning: Slow parse rate ({true_rate:.3} bytes/ms)"), - ); - } - stats - } - } - }; - println!("{out_line}{stat_display}"); - } - parser.stop_printing_dot_graphs(); - if failures.is_empty() { + if test_summary.parse_failures.is_empty() || (opts.update && !test_summary.has_parse_errors) { Ok(()) - } else if opts.update && !has_parse_errors { - println!( - "\n{} update{}:\n", - failures.len(), - if failures.len() == 1 { "" } else { "s" } - ); - - for (i, TestFailure { name, .. }) in failures.iter().enumerate() { - println!(" {}. {name}", i + 1); - } - - Ok(()) - } else { - has_parse_errors = opts.update && has_parse_errors; - - if !opts.overview_only { - if !has_parse_errors { - println!( - "\n{} failure{}:", - failures.len(), - if failures.len() == 1 { "" } else { "s" } - ); - } - - if opts.color { - print_diff_key(); - } - for ( - i, - TestFailure { - name, - actual, - expected, - is_cst, - }, - ) in failures.iter().enumerate() - { - if expected == "NO ERROR" { - println!("\n {}. {name}:\n", i + 1); - println!(" Expected an ERROR node, but got:"); - let actual = if *is_cst { - actual - } else { - &format_sexp(actual, 2) - }; - println!(" {}", paint(opts.color.then_some(AnsiColor::Red), actual)); - } else { - println!("\n {}. {name}:", i + 1); - if *is_cst { - print_diff(actual, expected, opts.color); - } else { - print_diff( - &format_sexp(actual, 2), - &format_sexp(expected, 2), - opts.color, - ); - } - } - } - } else { - println!(); - } - - if has_parse_errors { - Err(anyhow!(indoc! {" + } else if opts.update && test_summary.has_parse_errors { + Err(anyhow!(indoc! {" Some tests failed to parse with unexpected `ERROR` or `MISSING` nodes, as shown above, and cannot be updated automatically. Either fix the grammar or manually update the tests if this is expected."})) - } else { - Err(anyhow!("")) - } + } else { + Err(anyhow!("")) } } @@ -331,21 +653,34 @@ impl std::fmt::Display for DiffKey { } } +impl DiffKey { + /// Writes [`DiffKey`] to stdout + pub fn print() { + println!("{Self}"); + } +} + pub struct TestDiff<'a> { pub actual: &'a str, pub expected: &'a str, - pub use_color: bool, + pub color: bool, } impl<'a> TestDiff<'a> { #[must_use] - pub const fn new(actual: &'a str, expected: &'a str, use_color: bool) -> Self { + pub const fn new(actual: &'a str, expected: &'a str) -> Self { Self { actual, expected, - use_color, + color: true, } } + + #[must_use] + pub const fn with_color(mut self, color: bool) -> Self { + self.color = color; + self + } } impl std::fmt::Display for TestDiff<'_> { @@ -354,14 +689,14 @@ impl std::fmt::Display for TestDiff<'_> { for diff in diff.iter_all_changes() { match diff.tag() { ChangeTag::Equal => { - if self.use_color { + if self.color { write!(f, "{diff}")?; } else { write!(f, " {diff}")?; } } ChangeTag::Insert => { - if self.use_color { + if self.color { write!( f, "{}", @@ -375,7 +710,7 @@ impl std::fmt::Display for TestDiff<'_> { } } ChangeTag::Delete => { - if self.use_color { + if self.color { write!(f, "{}", paint(Some(AnsiColor::Red), diff.as_str().unwrap()))?; } else { write!(f, "-{diff}")?; @@ -391,7 +726,8 @@ impl std::fmt::Display for TestDiff<'_> { } } -struct TestFailure { +#[derive(Debug, Serialize)] +pub struct TestFailure { name: String, actual: String, expected: String, @@ -453,11 +789,10 @@ impl TestCorrection { fn run_tests( parser: &mut Parser, test_entry: TestEntry, - opts: &mut TestOptions, - indent_level: u32, - failures: &mut Vec, + opts: &TestOptions, + test_summary: &mut TestSummary, corrected_entries: &mut Vec, - has_parse_errors: &mut bool, + is_root: bool, ) -> Result { match test_entry { TestEntry::Example { @@ -471,29 +806,29 @@ fn run_tests( attributes, .. } => { - write!(opts.output, "{}", " ".repeat(indent_level as usize))?; - if attributes.skip { - writeln!( - opts.output, - "{:>3}. ⌀ {}", - opts.test_num, - paint(opts.color.then_some(AnsiColor::Yellow), &name), - )?; - opts.parse_rates.push((true, None)); - opts.test_num += 1; + test_summary.parse_results.add_case(TestResult { + name: name.clone(), + info: TestInfo::ParseTest { + outcome: TestOutcome::Skipped, + parse_rate: None, + test_num: test_summary.test_num, + }, + }); + test_summary.test_num += 1; return Ok(true); } if !attributes.platform { - writeln!( - opts.output, - "{:>3}. ⌀ {}", - opts.test_num, - paint(opts.color.then_some(AnsiColor::Magenta), &name), - )?; - opts.parse_rates.push((true, None)); - opts.test_num += 1; + test_summary.parse_results.add_case(TestResult { + name: name.clone(), + info: TestInfo::ParseTest { + outcome: TestOutcome::Platform, + parse_rate: None, + test_num: test_summary.test_num, + }, + }); + test_summary.test_num += 1; return Ok(true); } @@ -507,28 +842,30 @@ fn run_tests( } let start = std::time::Instant::now(); let tree = parser.parse(&input, None).unwrap(); - { + let parse_rate = { let parse_time = start.elapsed(); let true_parse_rate = tree.root_node().byte_range().len() as f64 / (parse_time.as_nanos() as f64 / 1_000_000.0); let adj_parse_rate = adjusted_parse_rate(&tree, parse_time); - opts.parse_rates - .push((true, Some((true_parse_rate, adj_parse_rate)))); - opts.stats.total_parses += 1; - opts.stats.total_duration += parse_time; - opts.stats.total_bytes += tree.root_node().byte_range().len(); - } + test_summary.parse_stats.total_parses += 1; + test_summary.parse_stats.total_duration += parse_time; + test_summary.parse_stats.total_bytes += tree.root_node().byte_range().len(); + + Some((true_parse_rate, adj_parse_rate)) + }; if attributes.error { if tree.root_node().has_error() { - writeln!( - opts.output, - "{:>3}. ✓ {}", - opts.test_num, - paint(opts.color.then_some(AnsiColor::Green), &name), - )?; - opts.stats.successful_parses += 1; + test_summary.parse_results.add_case(TestResult { + name: name.clone(), + info: TestInfo::ParseTest { + outcome: TestOutcome::Passed, + parse_rate, + test_num: test_summary.test_num, + }, + }); + test_summary.parse_stats.successful_parses += 1; if opts.update { let input = String::from_utf8(input.clone()).unwrap(); let output = if attributes.cst { @@ -563,18 +900,25 @@ fn run_tests( divider_delim_len, )); } - writeln!( - opts.output, - "{:>3}. ✗ {}", - opts.test_num, - paint(opts.color.then_some(AnsiColor::Red), &name), - )?; + test_summary.parse_results.add_case(TestResult { + name: name.clone(), + info: TestInfo::ParseTest { + outcome: TestOutcome::Failed, + parse_rate, + test_num: test_summary.test_num, + }, + }); let actual = if attributes.cst { render_test_cst(&input, &tree)? } else { tree.root_node().to_sexp() }; - failures.push(TestFailure::new(&name, actual, "NO ERROR", attributes.cst)); + test_summary.parse_failures.push(TestFailure::new( + &name, + actual, + "NO ERROR", + attributes.cst, + )); } if attributes.fail_fast { @@ -591,13 +935,15 @@ fn run_tests( } if actual == output { - writeln!( - opts.output, - "{:>3}. ✓ {}", - opts.test_num, - paint(opts.color.then_some(AnsiColor::Green), &name), - )?; - opts.stats.successful_parses += 1; + test_summary.parse_results.add_case(TestResult { + name: name.clone(), + info: TestInfo::ParseTest { + outcome: TestOutcome::Passed, + parse_rate, + test_num: test_summary.test_num, + }, + }); + test_summary.parse_stats.successful_parses += 1; if opts.update { let input = String::from_utf8(input.clone()).unwrap(); let output = if attributes.cst { @@ -628,7 +974,7 @@ fn run_tests( // are intended to have errors, hence why this // check isn't shown above if actual.contains("ERROR") || actual.contains("MISSING") { - *has_parse_errors = true; + test_summary.has_parse_errors = true; // keep the original `expected` output if the actual output has an // error @@ -649,22 +995,31 @@ fn run_tests( header_delim_len, divider_delim_len, )); - writeln!( - opts.output, - "{:>3}. ✓ {}", - opts.test_num, - paint(opts.color.then_some(AnsiColor::Blue), &name), - )?; + test_summary.parse_results.add_case(TestResult { + name: name.clone(), + info: TestInfo::ParseTest { + outcome: TestOutcome::Updated, + parse_rate, + test_num: test_summary.test_num, + }, + }); } } else { - writeln!( - opts.output, - "{:>3}. ✗ {}", - opts.test_num, - paint(opts.color.then_some(AnsiColor::Red), &name), - )?; + test_summary.parse_results.add_case(TestResult { + name: name.clone(), + info: TestInfo::ParseTest { + outcome: TestOutcome::Failed, + parse_rate, + test_num: test_summary.test_num, + }, + }); } - failures.push(TestFailure::new(&name, actual, &output, attributes.cst)); + test_summary.parse_failures.push(TestFailure::new( + &name, + actual, + &output, + attributes.cst, + )); if attributes.fail_fast { return Ok(false); @@ -677,7 +1032,7 @@ fn run_tests( parser.set_language(opts.languages.values().next().unwrap())?; } } - opts.test_num += 1; + test_summary.test_num += 1; } TestEntry::Group { name, @@ -688,8 +1043,8 @@ fn run_tests( return Ok(true); } - let failure_count = failures.len(); - let mut has_printed = false; + let failure_count = test_summary.parse_failures.len(); + let mut ran_test_in_group = false; let matches_filter = |name: &str, file_name: &Option, opts: &TestOptions| { if let (Some(test_file_path), Some(filter_file_name)) = (file_name, &opts.file_name) @@ -733,35 +1088,26 @@ fn run_tests( )); } - opts.test_num += 1; + test_summary.test_num += 1; continue; } } - if !has_printed && indent_level > 0 { - has_printed = true; - writeln!( - opts.output, - "{}{name}:", - " ".repeat(indent_level as usize) - )?; - opts.parse_rates.push((false, None)); + + if !ran_test_in_group && !is_root { + test_summary.parse_results.add_group(&name); + ran_test_in_group = true; } - if !run_tests( - parser, - child, - opts, - indent_level + 1, - failures, - corrected_entries, - has_parse_errors, - )? { + if !run_tests(parser, child, opts, test_summary, corrected_entries, false)? { // fail fast return Ok(false); } } + // Now that we're done traversing the children of the current group, pop + // the index + test_summary.parse_results.pop_traversal(); if let Some(file_path) = file_path { - if opts.update && failures.len() - failure_count > 0 { + if opts.update && test_summary.parse_failures.len() - failure_count > 0 { write_tests(&file_path, corrected_entries)?; } corrected_entries.clear(); diff --git a/crates/cli/src/test_highlight.rs b/crates/cli/src/test_highlight.rs index 156cd047..d96f90c2 100644 --- a/crates/cli/src/test_highlight.rs +++ b/crates/cli/src/test_highlight.rs @@ -1,14 +1,13 @@ use std::{fs, path::Path}; -use anstyle::AnsiColor; use anyhow::{anyhow, Result}; use tree_sitter::Point; use tree_sitter_highlight::{Highlight, HighlightConfiguration, HighlightEvent, Highlighter}; use tree_sitter_loader::{Config, Loader}; use crate::{ - logger::paint, query_testing::{parse_position_comments, to_utf8_point, Assertion, Utf8Point}, + test::{TestInfo, TestOutcome, TestResult, TestSummary}, util, }; @@ -48,19 +47,7 @@ pub fn test_highlights( loader_config: &Config, highlighter: &mut Highlighter, directory: &Path, - use_color: bool, -) -> Result<()> { - println!("syntax highlighting:"); - test_highlights_indented(loader, loader_config, highlighter, directory, use_color, 2) -} - -fn test_highlights_indented( - loader: &Loader, - loader_config: &Config, - highlighter: &mut Highlighter, - directory: &Path, - use_color: bool, - indent_level: usize, + test_summary: &mut TestSummary, ) -> Result<()> { let mut failed = false; @@ -68,25 +55,22 @@ fn test_highlights_indented( let highlight_test_file = highlight_test_file?; let test_file_path = highlight_test_file.path(); let test_file_name = highlight_test_file.file_name(); - print!( - "{indent:indent_level$}", - indent = "", - indent_level = indent_level * 2 - ); if test_file_path.is_dir() && test_file_path.read_dir()?.next().is_some() { - println!("{}:", test_file_name.to_string_lossy()); - if test_highlights_indented( + test_summary + .highlight_results + .add_group(test_file_name.to_string_lossy().as_ref()); + if test_highlights( loader, loader_config, highlighter, &test_file_path, - use_color, - indent_level + 1, + test_summary, ) .is_err() { failed = true; } + test_summary.highlight_results.pop_traversal(); } else { let (language, language_config) = loader .language_configuration_for_file_name(&test_file_path)? @@ -111,30 +95,28 @@ fn test_highlights_indented( fs::read(&test_file_path)?.as_slice(), ) { Ok(assertion_count) => { - println!( - "✓ {} ({assertion_count} assertions)", - paint( - use_color.then_some(AnsiColor::Green), - test_file_name.to_string_lossy().as_ref() - ), - ); + test_summary.highlight_results.add_case(TestResult { + name: test_file_name.to_string_lossy().to_string(), + info: TestInfo::AssertionTest { + outcome: TestOutcome::AssertionPassed { assertion_count }, + test_num: test_summary.test_num, + }, + }); } Err(e) => { - println!( - "✗ {}", - paint( - use_color.then_some(AnsiColor::Red), - test_file_name.to_string_lossy().as_ref() - ) - ); - println!( - "{indent:indent_level$} {e}", - indent = "", - indent_level = indent_level * 2 - ); + test_summary.highlight_results.add_case(TestResult { + name: test_file_name.to_string_lossy().to_string(), + info: TestInfo::AssertionTest { + outcome: TestOutcome::AssertionFailed { + error: e.to_string(), + }, + test_num: test_summary.test_num, + }, + }); failed = true; } } + test_summary.test_num += 1; } } diff --git a/crates/cli/src/test_tags.rs b/crates/cli/src/test_tags.rs index 9b3ed683..882718e5 100644 --- a/crates/cli/src/test_tags.rs +++ b/crates/cli/src/test_tags.rs @@ -1,13 +1,12 @@ use std::{fs, path::Path}; -use anstyle::AnsiColor; use anyhow::{anyhow, Result}; use tree_sitter_loader::{Config, Loader}; use tree_sitter_tags::{TagsConfiguration, TagsContext}; use crate::{ - logger::paint, query_testing::{parse_position_comments, to_utf8_point, Assertion, Utf8Point}, + test::{TestInfo, TestOutcome, TestResult, TestSummary}, util, }; @@ -47,19 +46,7 @@ pub fn test_tags( loader_config: &Config, tags_context: &mut TagsContext, directory: &Path, - use_color: bool, -) -> Result<()> { - println!("tags:"); - test_tags_indented(loader, loader_config, tags_context, directory, use_color, 2) -} - -pub fn test_tags_indented( - loader: &Loader, - loader_config: &Config, - tags_context: &mut TagsContext, - directory: &Path, - use_color: bool, - indent_level: usize, + test_summary: &mut TestSummary, ) -> Result<()> { let mut failed = false; @@ -67,25 +54,22 @@ pub fn test_tags_indented( let tag_test_file = tag_test_file?; let test_file_path = tag_test_file.path(); let test_file_name = tag_test_file.file_name(); - print!( - "{indent:indent_level$}", - indent = "", - indent_level = indent_level * 2 - ); if test_file_path.is_dir() && test_file_path.read_dir()?.next().is_some() { - println!("{}:", test_file_name.to_string_lossy()); - if test_tags_indented( + test_summary + .tag_results + .add_group(test_file_name.to_string_lossy().as_ref()); + if test_tags( loader, loader_config, tags_context, &test_file_path, - use_color, - indent_level + 1, + test_summary, ) .is_err() { failed = true; } + test_summary.tag_results.pop_traversal(); } else { let (language, language_config) = loader .language_configuration_for_file_name(&test_file_path)? @@ -104,30 +88,28 @@ pub fn test_tags_indented( fs::read(&test_file_path)?.as_slice(), ) { Ok(assertion_count) => { - println!( - "✓ {} ({assertion_count} assertions)", - paint( - use_color.then_some(AnsiColor::Green), - test_file_name.to_string_lossy().as_ref() - ), - ); + test_summary.tag_results.add_case(TestResult { + name: test_file_name.to_string_lossy().to_string(), + info: TestInfo::AssertionTest { + outcome: TestOutcome::AssertionPassed { assertion_count }, + test_num: test_summary.test_num, + }, + }); } Err(e) => { - println!( - "✗ {}", - paint( - use_color.then_some(AnsiColor::Red), - test_file_name.to_string_lossy().as_ref() - ) - ); - println!( - "{indent:indent_level$} {e}", - indent = "", - indent_level = indent_level * 2 - ); + test_summary.tag_results.add_case(TestResult { + name: test_file_name.to_string_lossy().to_string(), + info: TestInfo::AssertionTest { + outcome: TestOutcome::AssertionFailed { + error: e.to_string(), + }, + test_num: test_summary.test_num, + }, + }); failed = true; } } + test_summary.test_num += 1; } } diff --git a/crates/cli/src/tests/corpus_test.rs b/crates/cli/src/tests/corpus_test.rs index de797401..ba3fd68e 100644 --- a/crates/cli/src/tests/corpus_test.rs +++ b/crates/cli/src/tests/corpus_test.rs @@ -209,8 +209,8 @@ pub fn test_language_corpus( if actual_output != test.output { println!("Incorrect initial parse for {test_name}"); - println!("{DiffKey}"); - println!("{}", TestDiff::new(&actual_output, &test.output, true)); + DiffKey::print(); + println!("{}", TestDiff::new(&actual_output, &test.output)); println!(); return false; } @@ -297,8 +297,8 @@ pub fn test_language_corpus( if actual_output != test.output { println!("Incorrect parse for {test_name} - seed {seed}"); - println!("{DiffKey}"); - println!("{}", TestDiff::new(&actual_output, &test.output, true)); + DiffKey::print(); + println!("{}", TestDiff::new(&actual_output, &test.output)); println!(); return false; } @@ -428,8 +428,8 @@ fn test_feature_corpus_files() { if actual_output == test.output { true } else { - println!("{DiffKey}"); - print!("{}", TestDiff::new(&actual_output, &test.output, true)); + DiffKey::print(); + print!("{}", TestDiff::new(&actual_output, &test.output)); println!(); false } From fe67521b3d71eb992baa9d54145b93f068187bbd Mon Sep 17 00:00:00 2001 From: WillLillis Date: Mon, 29 Sep 2025 02:52:48 -0400 Subject: [PATCH 554/663] refactor(cli)!: deprecate `json` flags in favor of `json-summary` --- crates/cli/src/main.rs | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index e5cc7317..dbd74a14 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -129,9 +129,12 @@ struct Generate { /// Produce a report of the states for the given rule, use `-` to report every rule #[arg(long)] pub report_states_for_rule: Option, - /// Report conflicts in a JSON format - #[arg(long)] + /// Deprecated: use --json-summary + #[arg(long, conflicts_with = "json_summary")] pub json: bool, + /// Report conflicts in a JSON format + #[arg(long, conflicts_with = "json")] + pub json_summary: bool, /// The name or path of the JavaScript runtime to use for generating parsers #[cfg(not(feature = "qjs-rt"))] #[arg( @@ -249,9 +252,12 @@ struct Parse { /// Open `log.html` in the default browser, if `--debug-graph` is supplied #[arg(long)] pub open_log: bool, - /// Output parsing results in a JSON format - #[arg(long, short = 'j')] + /// Deprecated: use --json-summary + #[arg(long, short = 'j', conflicts_with = "json_summary")] pub json: bool, + /// Output parsing results in a JSON format + #[arg(long, conflicts_with = "json")] + pub json_summary: bool, /// The path to an alternative config.json file #[arg(long)] pub config_path: Option, @@ -855,6 +861,13 @@ impl Generate { } }); + let json_summary = if self.json { + warn!("--json is deprecated, use --json-summary instead"); + true + } else { + self.json_summary + }; + if let Err(err) = tree_sitter_generate::generate_parser_in_directory( current_dir, self.output.as_deref(), @@ -869,7 +882,7 @@ impl Generate { OptLevel::default() }, ) { - if self.json { + if json_summary { eprintln!("{}", serde_json::to_string_pretty(&err)?); // Exit early to prevent errors from being printed a second time in the caller std::process::exit(1); @@ -940,13 +953,19 @@ impl Parse { fn run(self, mut loader: loader::Loader, current_dir: &Path) -> Result<()> { let config = Config::load(self.config_path)?; let color = env::var("NO_COLOR").map_or(true, |v| v != "1"); + let json_summary = if self.json { + warn!("--json is deprecated, use --json-summary instead"); + true + } else { + self.json_summary + }; let output = if self.output_dot { ParseOutput::Dot } else if self.output_xml { ParseOutput::Xml } else if self.output_cst { ParseOutput::Cst - } else if self.quiet || self.json { + } else if self.quiet || json_summary { ParseOutput::Quiet } else { ParseOutput::Normal @@ -1142,7 +1161,7 @@ impl Parse { if should_track_stats { println!("\n{}", stats.cumulative_stats); } - if self.json { + if json_summary { println!("{}", serde_json::to_string_pretty(&stats)?); } From ff255a2354fabe8ec36a3a936e70cf9b73f05126 Mon Sep 17 00:00:00 2001 From: WillLillis Date: Wed, 1 Oct 2025 04:34:54 -0400 Subject: [PATCH 555/663] test: add coverage for new test aggregation method --- crates/cli/src/test.rs | 290 ++++++++++++++++++++++++++++++++++++++++ crates/cli/src/tests.rs | 2 + 2 files changed, 292 insertions(+) diff --git a/crates/cli/src/test.rs b/crates/cli/src/test.rs index 90629b15..18d07d23 100644 --- a/crates/cli/src/test.rs +++ b/crates/cli/src/test.rs @@ -1453,6 +1453,10 @@ fn parse_test_content(name: String, content: &str, file_path: Option) - #[cfg(test)] mod tests { + use serde_json::json; + + use crate::tests::get_language; + use super::*; #[test] @@ -2110,4 +2114,290 @@ Test with cst marker } ); } + + fn clear_parse_rate(result: &mut TestResult) { + let test_case_info = &mut result.info; + match test_case_info { + TestInfo::ParseTest { + ref mut parse_rate, .. + } => { + assert!(parse_rate.is_some()); + *parse_rate = None; + } + TestInfo::Group { .. } | TestInfo::AssertionTest { .. } => { + panic!("Unexpected test result") + } + } + } + + #[test] + fn run_tests_simple() { + let mut parser = Parser::new(); + let language = get_language("c"); + parser + .set_language(&language) + .expect("Failed to set language"); + let mut languages = BTreeMap::new(); + languages.insert("c", &language); + let opts = TestOptions { + path: PathBuf::from("foo"), + debug: true, + debug_graph: false, + include: None, + exclude: None, + file_name: None, + update: false, + open_log: false, + languages, + color: true, + show_fields: false, + overview_only: false, + }; + + // NOTE: The following test cases are combined to work around a race condition + // in the loader + { + let test_entry = TestEntry::Group { + name: "foo".to_string(), + file_path: None, + children: vec![TestEntry::Example { + name: "C Test 1".to_string(), + input: b"1;\n".to_vec(), + output: "(translation_unit (expression_statement (number_literal)))" + .to_string(), + header_delim_len: 25, + divider_delim_len: 3, + has_fields: false, + attributes_str: String::new(), + attributes: TestAttributes::default(), + file_name: None, + }], + }; + + let mut test_summary = TestSummary::new(true, TestStats::All, false, false, false); + let mut corrected_entries = Vec::new(); + run_tests( + &mut parser, + test_entry, + &opts, + &mut test_summary, + &mut corrected_entries, + true, + ) + .expect("Failed to run tests"); + + // parse rates will always be different, so we need to clear out these + // fields to reliably assert equality below + clear_parse_rate(&mut test_summary.parse_results.root_group[0]); + test_summary.parse_stats.total_duration = Duration::from_secs(0); + + let json_results = serde_json::to_string(&test_summary).unwrap(); + + assert_eq!( + json_results, + json!({ + "parse_results": [ + { + "name": "C Test 1", + "outcome": "Passed", + "parse_rate": null, + "test_num": 1 + } + ], + "parse_failures": [], + "parse_stats": { + "successful_parses": 1, + "total_parses": 1, + "total_bytes": 3, + "total_duration": { + "secs": 0, + "nanos": 0, + } + }, + "highlight_results": [], + "tag_results": [], + "query_results": [] + }) + .to_string() + ); + } + { + let test_entry = TestEntry::Group { + name: "corpus".to_string(), + file_path: None, + children: vec![ + TestEntry::Group { + name: "group1".to_string(), + // This test passes + children: vec![TestEntry::Example { + name: "C Test 1".to_string(), + input: b"1;\n".to_vec(), + output: "(translation_unit (expression_statement (number_literal)))" + .to_string(), + header_delim_len: 25, + divider_delim_len: 3, + has_fields: false, + attributes_str: String::new(), + attributes: TestAttributes::default(), + file_name: None, + }], + file_path: None, + }, + TestEntry::Group { + name: "group2".to_string(), + children: vec![ + // This test passes + TestEntry::Example { + name: "C Test 2".to_string(), + input: b"1;\n".to_vec(), + output: + "(translation_unit (expression_statement (number_literal)))" + .to_string(), + header_delim_len: 25, + divider_delim_len: 3, + has_fields: false, + attributes_str: String::new(), + attributes: TestAttributes::default(), + file_name: None, + }, + // This test fails, and is marked with fail-fast + TestEntry::Example { + name: "C Test 3".to_string(), + input: b"1;\n".to_vec(), + output: + "(translation_unit (expression_statement (string_literal)))" + .to_string(), + header_delim_len: 25, + divider_delim_len: 3, + has_fields: false, + attributes_str: String::new(), + attributes: TestAttributes { + fail_fast: true, + ..Default::default() + }, + file_name: None, + }, + ], + file_path: None, + }, + // This group never runs because of the previous failure + TestEntry::Group { + name: "group3".to_string(), + // This test fails, and is marked with fail-fast + children: vec![TestEntry::Example { + name: "C Test 4".to_string(), + input: b"1;\n".to_vec(), + output: "(translation_unit (expression_statement (number_literal)))" + .to_string(), + header_delim_len: 25, + divider_delim_len: 3, + has_fields: false, + attributes_str: String::new(), + attributes: TestAttributes::default(), + file_name: None, + }], + file_path: None, + }, + ], + }; + + let mut test_summary = TestSummary::new(true, TestStats::All, false, false, false); + let mut corrected_entries = Vec::new(); + run_tests( + &mut parser, + test_entry, + &opts, + &mut test_summary, + &mut corrected_entries, + true, + ) + .expect("Failed to run tests"); + + // parse rates will always be different, so we need to clear out these + // fields to reliably assert equality below + { + let test_group_1_info = &mut test_summary.parse_results.root_group[0].info; + match test_group_1_info { + TestInfo::Group { + ref mut children, .. + } => clear_parse_rate(&mut children[0]), + TestInfo::ParseTest { .. } | TestInfo::AssertionTest { .. } => { + panic!("Unexpected test result"); + } + } + let test_group_2_info = &mut test_summary.parse_results.root_group[1].info; + match test_group_2_info { + TestInfo::Group { + ref mut children, .. + } => { + clear_parse_rate(&mut children[0]); + clear_parse_rate(&mut children[1]); + } + TestInfo::ParseTest { .. } | TestInfo::AssertionTest { .. } => { + panic!("Unexpected test result"); + } + } + test_summary.parse_stats.total_duration = Duration::from_secs(0); + } + + let json_results = serde_json::to_string(&test_summary).unwrap(); + + assert_eq!( + json_results, + json!({ + "parse_results": [ + { + "name": "group1", + "children": [ + { + "name": "C Test 1", + "outcome": "Passed", + "parse_rate": null, + "test_num": 1 + } + ] + }, + { + "name": "group2", + "children": [ + { + "name": "C Test 2", + "outcome": "Passed", + "parse_rate": null, + "test_num": 2 + }, + { + "name": "C Test 3", + "outcome": "Failed", + "parse_rate": null, + "test_num": 3 + } + ] + } + ], + "parse_failures": [ + { + "name": "C Test 3", + "actual": "(translation_unit (expression_statement (number_literal)))", + "expected": "(translation_unit (expression_statement (string_literal)))", + "is_cst": false, + } + ], + "parse_stats": { + "successful_parses": 2, + "total_parses": 3, + "total_bytes": 9, + "total_duration": { + "secs": 0, + "nanos": 0, + } + }, + "highlight_results": [], + "tag_results": [], + "query_results": [] + }) + .to_string() + ); + } + } } diff --git a/crates/cli/src/tests.rs b/crates/cli/src/tests.rs index 9fc1c71b..2439be38 100644 --- a/crates/cli/src/tests.rs +++ b/crates/cli/src/tests.rs @@ -26,6 +26,8 @@ pub use crate::fuzz::{ ITERATION_COUNT, }; +pub use helpers::fixtures::get_language; + /// This is a simple wrapper around [`tree_sitter_generate::generate_parser_for_grammar`], because /// our tests do not need to pass in a version number, only the grammar JSON. fn generate_parser(grammar_json: &str) -> GenerateResult<(String, String)> { From 86e2fd23378727e760d7e2e7963dbf5be329412d Mon Sep 17 00:00:00 2001 From: WillLillis Date: Thu, 2 Oct 2025 01:27:59 -0400 Subject: [PATCH 556/663] fix(cli): correct behavior of parse `--stat` and `--json-summary` flags --- crates/cli/src/main.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index dbd74a14..23056be7 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -227,7 +227,7 @@ struct Parse { #[arg(long = "cst", short = 'c')] pub output_cst: bool, /// Show parsing statistic - #[arg(long, short)] + #[arg(long, short, conflicts_with = "json", conflicts_with = "json_summary")] pub stat: bool, /// Interrupt the parsing process by timeout (µs) #[arg(long)] @@ -253,10 +253,15 @@ struct Parse { #[arg(long)] pub open_log: bool, /// Deprecated: use --json-summary - #[arg(long, short = 'j', conflicts_with = "json_summary")] + #[arg( + long, + short = 'j', + conflicts_with = "json_summary", + conflicts_with = "stat" + )] pub json: bool, /// Output parsing results in a JSON format - #[arg(long, conflicts_with = "json")] + #[arg(long, conflicts_with = "json", conflicts_with = "stat")] pub json_summary: bool, /// The path to an alternative config.json file #[arg(long)] @@ -1039,7 +1044,7 @@ impl Parse { let mut update_stats = |stats: &mut parse::ParseStats| { let parse_result = stats.parse_summaries.last().unwrap(); - if should_track_stats { + if should_track_stats || json_summary { stats.cumulative_stats.total_parses += 1; if parse_result.successful { stats.cumulative_stats.successful_parses += 1; From d546e28abfb295a7d1039dbd6a23498bd487719c Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Sun, 12 Oct 2025 04:06:22 -0400 Subject: [PATCH 557/663] fix(cli): mark `report_states_for_rule` and `json`/`json_summary` flags for `generate` command as conflicting --- crates/cli/src/main.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 23056be7..9f895987 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -127,13 +127,21 @@ struct Generate { #[arg(long, short, value_name = "DIRECTORY")] pub output: Option, /// Produce a report of the states for the given rule, use `-` to report every rule - #[arg(long)] + #[arg(long, conflicts_with = "json", conflicts_with = "json_summary")] pub report_states_for_rule: Option, /// Deprecated: use --json-summary - #[arg(long, conflicts_with = "json_summary")] + #[arg( + long, + conflicts_with = "json_summary", + conflicts_with = "report_states_for_rule" + )] pub json: bool, /// Report conflicts in a JSON format - #[arg(long, conflicts_with = "json")] + #[arg( + long, + conflicts_with = "json", + conflicts_with = "report_states_for_rule" + )] pub json_summary: bool, /// The name or path of the JavaScript runtime to use for generating parsers #[cfg(not(feature = "qjs-rt"))] From c7b5f89392495fa144a504f28028f5e320ededa8 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Fri, 31 Oct 2025 18:23:21 -0400 Subject: [PATCH 558/663] feat(xtask): generate JSON schema for cli `TestSummary` --- Cargo.lock | 65 +++++ Cargo.toml | 1 + crates/cli/Cargo.toml | 1 + crates/cli/src/parse.rs | 3 +- crates/cli/src/test.rs | 35 ++- crates/xtask/Cargo.toml | 2 + crates/xtask/src/main.rs | 4 + crates/xtask/src/test_schema.rs | 25 ++ .../assets/schemas/test-summary.schema.json | 247 ++++++++++++++++++ 9 files changed, 376 insertions(+), 7 deletions(-) create mode 100644 crates/xtask/src/test_schema.rs create mode 100644 docs/src/assets/schemas/test-summary.schema.json diff --git a/Cargo.lock b/Cargo.lock index 1639883b..b351edac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -576,6 +576,12 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + [[package]] name = "either" version = "1.15.0" @@ -1438,6 +1444,26 @@ dependencies = [ "getrandom 0.2.16", ] +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "regalloc2" version = "0.12.2" @@ -1603,6 +1629,31 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schemars" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +dependencies = [ + "dyn-clone", + "ref-cast", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d020396d1d138dc19f1165df7545479dcd58d93810dc5d646a16e55abefa80" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn", +] + [[package]] name = "semver" version = "1.0.27" @@ -1643,6 +1694,17 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "serde_json" version = "1.0.145" @@ -1947,6 +2009,7 @@ dependencies = [ "pretty_assertions", "rand", "regex", + "schemars", "semver", "serde", "serde_json", @@ -2740,8 +2803,10 @@ dependencies = [ "notify", "notify-debouncer-full", "regex", + "schemars", "semver", "serde_json", + "tree-sitter-cli", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 1d5454e5..5473d9a1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -137,6 +137,7 @@ rand = "0.8.5" regex = "1.11.3" regex-syntax = "0.8.6" rustc-hash = "2.1.1" +schemars = "1.0.4" semver = { version = "1.0.27", features = ["serde"] } serde = { version = "1.0.219", features = ["derive"] } serde_json = { version = "1.0.145", features = ["preserve_order"] } diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index d8df92c8..31626eb2 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -54,6 +54,7 @@ log.workspace = true memchr.workspace = true rand.workspace = true regex.workspace = true +schemars.workspace = true semver.workspace = true serde.workspace = true serde_json.workspace = true diff --git a/crates/cli/src/parse.rs b/crates/cli/src/parse.rs index 84bf0e85..1023b0fc 100644 --- a/crates/cli/src/parse.rs +++ b/crates/cli/src/parse.rs @@ -11,6 +11,7 @@ use anstyle::{AnsiColor, Color, RgbColor}; use anyhow::{anyhow, Context, Result}; use clap::ValueEnum; use log::info; +use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use tree_sitter::{ ffi, InputEdit, Language, LogType, ParseOptions, ParseState, Parser, Point, Range, Tree, @@ -19,7 +20,7 @@ use tree_sitter::{ use crate::{fuzz::edits::Edit, logger::paint, util}; -#[derive(Debug, Default, Serialize)] +#[derive(Debug, Default, Serialize, JsonSchema)] pub struct Stats { pub successful_parses: usize, pub total_parses: usize, diff --git a/crates/cli/src/test.rs b/crates/cli/src/test.rs index 18d07d23..3753dcea 100644 --- a/crates/cli/src/test.rs +++ b/crates/cli/src/test.rs @@ -18,6 +18,7 @@ use regex::{ bytes::{Regex as ByteRegex, RegexBuilder as ByteRegexBuilder}, Regex, }; +use schemars::{JsonSchema, Schema, SchemaGenerator}; use serde::Serialize; use similar::{ChangeTag, TextDiff}; use tree_sitter::{format_sexp, Language, LogType, Parser, Query, Tree}; @@ -139,36 +140,47 @@ pub struct TestOptions<'a> { } /// A stateful object used to collect results from running a grammar's test suite -#[derive(Debug, Default, Serialize)] +#[derive(Debug, Default, Serialize, JsonSchema)] pub struct TestSummary { // Parse test results and associated data + #[schemars(schema_with = "schema_as_array")] #[serde(serialize_with = "serialize_as_array")] pub parse_results: TestResultHierarchy, pub parse_failures: Vec, pub parse_stats: Stats, + #[schemars(skip)] #[serde(skip)] pub has_parse_errors: bool, + #[schemars(skip)] #[serde(skip)] pub parse_stat_display: TestStats, // Other test results + #[schemars(schema_with = "schema_as_array")] #[serde(serialize_with = "serialize_as_array")] pub highlight_results: TestResultHierarchy, + #[schemars(schema_with = "schema_as_array")] #[serde(serialize_with = "serialize_as_array")] pub tag_results: TestResultHierarchy, + #[schemars(schema_with = "schema_as_array")] #[serde(serialize_with = "serialize_as_array")] pub query_results: TestResultHierarchy, // Data used during construction + #[schemars(skip)] #[serde(skip)] pub test_num: usize, // Options passed in from the CLI which control how the summary is displayed + #[schemars(skip)] #[serde(skip)] pub color: bool, + #[schemars(skip)] #[serde(skip)] pub overview_only: bool, + #[schemars(skip)] #[serde(skip)] pub update: bool, + #[schemars(skip)] #[serde(skip)] pub json: bool, } @@ -194,7 +206,7 @@ impl TestSummary { } } -#[derive(Debug, Default)] +#[derive(Debug, Default, JsonSchema)] pub struct TestResultHierarchy { root_group: Vec, traversal_idxs: Vec, @@ -207,6 +219,10 @@ where results.root_group.serialize(serializer) } +fn schema_as_array(gen: &mut SchemaGenerator) -> Schema { + gen.subschema_for::>() +} + /// Stores arbitrarily nested parent test groups and child cases. Supports creation /// in DFS traversal order impl TestResultHierarchy { @@ -313,14 +329,16 @@ impl<'a> Iterator for TestResultIterWithDepth<'a> { } } -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, JsonSchema)] pub struct TestResult { pub name: String, + #[schemars(flatten)] #[serde(flatten)] pub info: TestInfo, } -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, JsonSchema)] +#[schemars(untagged)] #[serde(untagged)] pub enum TestInfo { Group { @@ -329,6 +347,7 @@ pub enum TestInfo { ParseTest { outcome: TestOutcome, // True parse rate, adjusted parse rate + #[schemars(schema_with = "parse_rate_schema")] #[serde(serialize_with = "serialize_parse_rates")] parse_rate: Option<(f64, f64)>, test_num: usize, @@ -352,7 +371,11 @@ where } } -#[derive(Debug, Clone, Eq, PartialEq, Serialize)] +fn parse_rate_schema(gen: &mut SchemaGenerator) -> Schema { + gen.subschema_for::>() +} + +#[derive(Debug, Clone, Eq, PartialEq, Serialize, JsonSchema)] pub enum TestOutcome { // Parse outcomes Passed, @@ -726,7 +749,7 @@ impl std::fmt::Display for TestDiff<'_> { } } -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, JsonSchema)] pub struct TestFailure { name: String, actual: String, diff --git a/crates/xtask/Cargo.toml b/crates/xtask/Cargo.toml index 607d64ad..90134d03 100644 --- a/crates/xtask/Cargo.toml +++ b/crates/xtask/Cargo.toml @@ -21,7 +21,9 @@ bindgen = { version = "0.72.0" } clap.workspace = true indoc.workspace = true regex.workspace = true +schemars.workspace = true semver.workspace = true serde_json.workspace = true +tree-sitter-cli = { path = "../cli/" } notify = "8.2.0" notify-debouncer-full = "0.6.0" diff --git a/crates/xtask/src/main.rs b/crates/xtask/src/main.rs index 46b2e796..3814cf66 100644 --- a/crates/xtask/src/main.rs +++ b/crates/xtask/src/main.rs @@ -7,6 +7,7 @@ mod embed_sources; mod fetch; mod generate; mod test; +mod test_schema; mod upgrade_wasmtime; use std::{path::Path, process::Command}; @@ -40,6 +41,8 @@ enum Commands { GenerateBindings, /// Generates the fixtures for testing tree-sitter. GenerateFixtures(GenerateFixtures), + /// Generates the JSON schema for the test runner summary. + GenerateTestSchema, /// Generate the list of exports from Tree-sitter Wasm files. GenerateWasmExports, /// Run the test suite @@ -236,6 +239,7 @@ fn run() -> Result<()> { Commands::GenerateFixtures(generate_fixtures_options) => { generate::run_fixtures(&generate_fixtures_options)?; } + Commands::GenerateTestSchema => test_schema::run_test_schema()?, Commands::GenerateWasmExports => generate::run_wasm_exports()?, Commands::Test(test_options) => test::run(&test_options)?, Commands::TestWasm => test::run_wasm()?, diff --git a/crates/xtask/src/test_schema.rs b/crates/xtask/src/test_schema.rs new file mode 100644 index 00000000..a2f65ed2 --- /dev/null +++ b/crates/xtask/src/test_schema.rs @@ -0,0 +1,25 @@ +use std::path::PathBuf; + +use anyhow::Result; +use serde_json::to_writer_pretty; + +use tree_sitter_cli::test::TestSummary; + +pub fn run_test_schema() -> Result<()> { + let schema = schemars::schema_for!(TestSummary); + + let xtask_path: PathBuf = env!("CARGO_MANIFEST_DIR").into(); + let schema_path = xtask_path + .parent() + .unwrap() + .parent() + .unwrap() + .join("docs") + .join("src") + .join("assets") + .join("schemas") + .join("test-summary.schema.json"); + let mut file = std::fs::File::create(schema_path)?; + + Ok(to_writer_pretty(&mut file, &schema)?) +} diff --git a/docs/src/assets/schemas/test-summary.schema.json b/docs/src/assets/schemas/test-summary.schema.json new file mode 100644 index 00000000..6211d60c --- /dev/null +++ b/docs/src/assets/schemas/test-summary.schema.json @@ -0,0 +1,247 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "TestSummary", + "description": "A stateful object used to collect results from running a grammar's test suite", + "type": "object", + "properties": { + "parse_results": { + "type": "array", + "items": { + "$ref": "#/$defs/TestResult" + } + }, + "parse_failures": { + "type": "array", + "items": { + "$ref": "#/$defs/TestFailure" + } + }, + "parse_stats": { + "$ref": "#/$defs/Stats" + }, + "highlight_results": { + "type": "array", + "items": { + "$ref": "#/$defs/TestResult" + } + }, + "tag_results": { + "type": "array", + "items": { + "$ref": "#/$defs/TestResult" + } + }, + "query_results": { + "type": "array", + "items": { + "$ref": "#/$defs/TestResult" + } + } + }, + "required": [ + "parse_results", + "parse_failures", + "parse_stats", + "highlight_results", + "tag_results", + "query_results" + ], + "$defs": { + "TestResult": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "anyOf": [ + { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/TestResult" + } + } + }, + "required": [ + "children" + ] + }, + { + "type": "object", + "properties": { + "outcome": { + "$ref": "#/$defs/TestOutcome" + }, + "parse_rate": { + "type": [ + "number", + "null" + ], + "format": "double" + }, + "test_num": { + "type": "integer", + "format": "uint", + "minimum": 0 + } + }, + "required": [ + "outcome", + "parse_rate", + "test_num" + ] + }, + { + "type": "object", + "properties": { + "outcome": { + "$ref": "#/$defs/TestOutcome" + }, + "test_num": { + "type": "integer", + "format": "uint", + "minimum": 0 + } + }, + "required": [ + "outcome", + "test_num" + ] + } + ] + }, + "TestOutcome": { + "oneOf": [ + { + "type": "string", + "enum": [ + "Passed", + "Failed", + "Updated", + "Skipped", + "Platform" + ] + }, + { + "type": "object", + "properties": { + "AssertionPassed": { + "type": "object", + "properties": { + "assertion_count": { + "type": "integer", + "format": "uint", + "minimum": 0 + } + }, + "required": [ + "assertion_count" + ] + } + }, + "required": [ + "AssertionPassed" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "AssertionFailed": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + }, + "required": [ + "error" + ] + } + }, + "required": [ + "AssertionFailed" + ], + "additionalProperties": false + } + ] + }, + "TestFailure": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "actual": { + "type": "string" + }, + "expected": { + "type": "string" + }, + "is_cst": { + "type": "boolean" + } + }, + "required": [ + "name", + "actual", + "expected", + "is_cst" + ] + }, + "Stats": { + "type": "object", + "properties": { + "successful_parses": { + "type": "integer", + "format": "uint", + "minimum": 0 + }, + "total_parses": { + "type": "integer", + "format": "uint", + "minimum": 0 + }, + "total_bytes": { + "type": "integer", + "format": "uint", + "minimum": 0 + }, + "total_duration": { + "$ref": "#/$defs/Duration" + } + }, + "required": [ + "successful_parses", + "total_parses", + "total_bytes", + "total_duration" + ] + }, + "Duration": { + "type": "object", + "properties": { + "secs": { + "type": "integer", + "format": "uint64", + "minimum": 0 + }, + "nanos": { + "type": "integer", + "format": "uint32", + "minimum": 0 + } + }, + "required": [ + "secs", + "nanos" + ] + } + } +} \ No newline at end of file From 419a5a7305d157c530bacebe3fff03282a37dc3f Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Mon, 13 Oct 2025 01:49:00 -0400 Subject: [PATCH 559/663] fix(generate): don't short-circuit within `extend_sorted` --- crates/generate/src/node_types.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/generate/src/node_types.rs b/crates/generate/src/node_types.rs index f50af44f..0a964105 100644 --- a/crates/generate/src/node_types.rs +++ b/crates/generate/src/node_types.rs @@ -829,12 +829,12 @@ fn extend_sorted<'a, T>(vec: &mut Vec, values: impl IntoIterator Date: Tue, 4 Nov 2025 09:37:58 +0000 Subject: [PATCH 560/663] build(deps): bump the cargo group across 1 directory with 6 updates Bumps the cargo group with 6 updates in the / directory: | Package | From | To | | --- | --- | --- | | [cc](https://github.com/rust-lang/cc-rs) | `1.2.43` | `1.2.44` | | [clap](https://github.com/clap-rs/clap) | `4.5.50` | `4.5.51` | | [clap_complete](https://github.com/clap-rs/clap) | `4.5.59` | `4.5.60` | | [clap_complete_nushell](https://github.com/clap-rs/clap) | `4.5.9` | `4.5.10` | | [etcetera](https://github.com/lunacookies/etcetera) | `0.10.0` | `0.11.0` | | [wasmparser](https://github.com/bytecodealliance/wasm-tools) | `0.229.0` | `0.240.0` | Updates `cc` from 1.2.43 to 1.2.44 - [Release notes](https://github.com/rust-lang/cc-rs/releases) - [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md) - [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.43...cc-v1.2.44) Updates `clap` from 4.5.50 to 4.5.51 - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.50...clap_complete-v4.5.51) Updates `clap_complete` from 4.5.59 to 4.5.60 - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.59...clap_complete-v4.5.60) Updates `clap_complete_nushell` from 4.5.9 to 4.5.10 - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.5.9...clap_complete_nushell-v4.5.10) Updates `etcetera` from 0.10.0 to 0.11.0 - [Release notes](https://github.com/lunacookies/etcetera/releases) - [Commits](https://github.com/lunacookies/etcetera/compare/v0.10.0...v0.11.0) Updates `wasmparser` from 0.229.0 to 0.240.0 - [Release notes](https://github.com/bytecodealliance/wasm-tools/releases) - [Commits](https://github.com/bytecodealliance/wasm-tools/commits) --- updated-dependencies: - dependency-name: cc dependency-version: 1.2.44 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: clap dependency-version: 4.5.51 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: clap_complete dependency-version: 4.5.60 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: clap_complete_nushell dependency-version: 4.5.10 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: etcetera dependency-version: 0.11.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: cargo - dependency-name: wasmparser dependency-version: 0.240.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 65 ++++++++++++++++++++++++++++-------------------------- Cargo.toml | 12 +++++----- 2 files changed, 40 insertions(+), 37 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b351edac..8cf0a189 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -187,9 +187,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.43" +version = "1.2.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "739eb0f94557554b3ca9a86d2d37bebd49c5e6d0c1d2bda35ba5bdac830befc2" +checksum = "37521ac7aabe3d13122dc382493e20c9416f299d2ccd5b3a5340a2570cdeb0f3" dependencies = [ "find-msvc-tools", "shlex", @@ -241,9 +241,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.50" +version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2cfd7bf8a6017ddaa4e32ffe7403d547790db06bd171c1c53926faab501623" +checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" dependencies = [ "clap_builder", "clap_derive", @@ -251,9 +251,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.50" +version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4c05b9e80c5ccd3a7ef080ad7b6ba7d6fc00a985b8b157197075677c82c7a0" +checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" dependencies = [ "anstream", "anstyle", @@ -263,18 +263,18 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.59" +version = "4.5.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2348487adcd4631696ced64ccdb40d38ac4d31cae7f2eec8817fcea1b9d1c43c" +checksum = "8e602857739c5a4291dfa33b5a298aeac9006185229a700e5810a3ef7272d971" dependencies = [ "clap", ] [[package]] name = "clap_complete_nushell" -version = "4.5.9" +version = "4.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "811159f339691baacdf7d534df2946b9d217014081099e23d31d887d99521e70" +checksum = "685bc86fd34b7467e0532a4f8435ab107960d69a243785ef0275e571b35b641a" dependencies = [ "clap", "clap_complete", @@ -633,13 +633,12 @@ dependencies = [ [[package]] name = "etcetera" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c7b13d0780cb82722fd59f6f57f925e143427e4a75313a6c77243bf5326ae6" +checksum = "de48cc4d1c1d97a20fd819def54b890cadde72ed3ad0c614822a0a433361be96" dependencies = [ "cfg-if", - "home", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -791,15 +790,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "home" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" -dependencies = [ - "windows-sys 0.61.2", -] - [[package]] name = "html-escape" version = "0.2.13" @@ -2026,7 +2016,7 @@ dependencies = [ "tree-sitter-tests-proc-macro", "unindent", "walkdir", - "wasmparser", + "wasmparser 0.240.0", "webbrowser", "widestring", ] @@ -2253,7 +2243,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38ba1d491ecacb085a2552025c10a675a6fddcbd03b1fc9b36c536010ce265d2" dependencies = [ "leb128fmt", - "wasmparser", + "wasmparser 0.229.0", ] [[package]] @@ -2269,6 +2259,19 @@ dependencies = [ "serde", ] +[[package]] +name = "wasmparser" +version = "0.240.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b722dcf61e0ea47440b53ff83ccb5df8efec57a69d150e4f24882e4eba7e24a4" +dependencies = [ + "bitflags 2.10.0", + "hashbrown 0.15.5", + "indexmap", + "semver", + "serde", +] + [[package]] name = "wasmprinter" version = "0.229.0" @@ -2277,7 +2280,7 @@ checksum = "d25dac01892684a99b8fbfaf670eb6b56edea8a096438c75392daeb83156ae2e" dependencies = [ "anyhow", "termcolor", - "wasmparser", + "wasmparser 0.229.0", ] [[package]] @@ -2309,7 +2312,7 @@ dependencies = [ "smallvec", "sptr", "target-lexicon", - "wasmparser", + "wasmparser 0.229.0", "wasmtime-asm-macros", "wasmtime-cranelift", "wasmtime-environ", @@ -2375,7 +2378,7 @@ dependencies = [ "smallvec", "target-lexicon", "thiserror 2.0.17", - "wasmparser", + "wasmparser 0.229.0", "wasmtime-environ", "wasmtime-versioned-export-macros", ] @@ -2399,7 +2402,7 @@ dependencies = [ "smallvec", "target-lexicon", "wasm-encoder", - "wasmparser", + "wasmparser 0.229.0", "wasmprinter", ] @@ -2467,7 +2470,7 @@ dependencies = [ "gimli", "object 0.36.7", "target-lexicon", - "wasmparser", + "wasmparser 0.229.0", "wasmtime-cranelift", "wasmtime-environ", "winch-codegen", @@ -2528,7 +2531,7 @@ dependencies = [ "smallvec", "target-lexicon", "thiserror 2.0.17", - "wasmparser", + "wasmparser 0.229.0", "wasmtime-cranelift", "wasmtime-environ", ] diff --git a/Cargo.toml b/Cargo.toml index 5473d9a1..521ad684 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -106,8 +106,8 @@ ansi_colours = "1.2.3" anstyle = "1.0.13" anyhow = "1.0.100" bstr = "1.12.0" -cc = "1.2.41" -clap = { version = "4.5.48", features = [ +cc = "1.2.44" +clap = { version = "4.5.51", features = [ "cargo", "derive", "env", @@ -115,13 +115,13 @@ clap = { version = "4.5.48", features = [ "string", "unstable-styles", ] } -clap_complete = "4.5.58" -clap_complete_nushell = "4.5.8" +clap_complete = "4.5.60" +clap_complete_nushell = "4.5.10" crc32fast = "1.5.0" ctor = "0.2.9" ctrlc = { version = "3.5.0", features = ["termination"] } dialoguer = { version = "0.11.0", features = ["fuzzy-select"] } -etcetera = "0.10.0" +etcetera = "0.11.0" fs4 = "0.12.0" glob = "0.3.3" heck = "0.5.0" @@ -150,7 +150,7 @@ tiny_http = "0.12.0" topological-sort = "0.2.2" unindent = "0.2.4" walkdir = "2.5.0" -wasmparser = "0.229.0" +wasmparser = "0.240.0" webbrowser = "1.0.5" tree-sitter = { version = "0.26.0", path = "./lib" } From 361287fb56bd9a649281f6d2cf27e4a3b745fb4d Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Mon, 3 Nov 2025 01:46:05 -0500 Subject: [PATCH 561/663] fix(cli)!: deprecate `--build` flag for `generate` command --- crates/cli/src/main.rs | 7 ++++--- docs/src/cli/generate.md | 11 ----------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 9f895987..d9f8c174 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -114,13 +114,13 @@ struct Generate { /// Only generate `grammar.json` and `node-types.json` #[arg(long)] pub no_parser: bool, - /// Compile all defined languages in the current dir + /// Deprecated: use the `build` command #[arg(long, short = 'b')] pub build: bool, - /// Compile a parser in debug mode + /// Deprecated: use the `build` command #[arg(long, short = '0')] pub debug_build: bool, - /// The path to the directory containing the parser library + /// Deprecated: use the `build` command #[arg(long, value_name = "PATH")] pub libdir: Option, /// The path to output the generated source files @@ -905,6 +905,7 @@ impl Generate { } } if self.build { + warn!("--build is deprecated, use the `build` command"); if let Some(path) = self.libdir { loader = loader::Loader::with_parser_lib_path(path); } diff --git a/docs/src/cli/generate.md b/docs/src/cli/generate.md index 9014e0ea..32c8437a 100644 --- a/docs/src/cli/generate.md +++ b/docs/src/cli/generate.md @@ -34,17 +34,6 @@ The ABI to use for parser generation. The default is ABI 15, with ABI 14 being a Only generate `grammar.json` and `node-types.json` -### `-0/--debug-build` - -Compile the parser with debug flags enabled. This is useful when debugging issues that require a debugger like `gdb` or `lldb`. - -### `--libdir ` - -The directory to place the compiled parser(s) in. -On Unix systems, the default path is `$XDG_CACHE_HOME/tree-sitter` if `$XDG_CACHE_HOME` is set, -otherwise `$HOME/.config/tree-sitter` is used. On Windows, the default path is `%LOCALAPPDATA%\tree-sitter` if available, -otherwise `$HOME\AppData\Local\tree-sitter` is used. - ### `-o/--output` The directory to place the generated parser in. The default is `src/` in the current directory. From 13ff3935ac902ce050d29559072f31e4b4876536 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Nov 2025 21:22:31 +0000 Subject: [PATCH 562/663] build(deps): bump the cargo group with 3 updates Bumps the cargo group with 3 updates: [cc](https://github.com/rust-lang/cc-rs), [libloading](https://github.com/nagisa/rust_libloading) and [schemars](https://github.com/GREsau/schemars). Updates `cc` from 1.2.44 to 1.2.45 - [Release notes](https://github.com/rust-lang/cc-rs/releases) - [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md) - [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.44...cc-v1.2.45) Updates `libloading` from 0.8.9 to 0.9.0 - [Commits](https://github.com/nagisa/rust_libloading/compare/0.8.9...0.9.0) Updates `schemars` from 1.0.4 to 1.0.5 - [Release notes](https://github.com/GREsau/schemars/releases) - [Changelog](https://github.com/GREsau/schemars/blob/master/CHANGELOG.md) - [Commits](https://github.com/GREsau/schemars/compare/v1.0.4...v1.0.5) --- updated-dependencies: - dependency-name: cc dependency-version: 1.2.45 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: libloading dependency-version: 0.9.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: cargo - dependency-name: schemars dependency-version: 1.0.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 26 ++++++++++++++++++-------- Cargo.toml | 6 +++--- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8cf0a189..4021396a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -187,9 +187,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.44" +version = "1.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37521ac7aabe3d13122dc382493e20c9416f299d2ccd5b3a5340a2570cdeb0f3" +checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" dependencies = [ "find-msvc-tools", "shlex", @@ -236,7 +236,7 @@ checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", - "libloading", + "libloading 0.8.9", ] [[package]] @@ -1058,6 +1058,16 @@ dependencies = [ "windows-link", ] +[[package]] +name = "libloading" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60" +dependencies = [ + "cfg-if", + "windows-link", +] + [[package]] name = "libm" version = "0.2.15" @@ -1621,9 +1631,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" dependencies = [ "dyn-clone", "ref-cast", @@ -1634,9 +1644,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d020396d1d138dc19f1165df7545479dcd58d93810dc5d646a16e55abefa80" +checksum = "301858a4023d78debd2353c7426dc486001bddc91ae31a76fb1f55132f7e2633" dependencies = [ "proc-macro2", "quote", @@ -2079,7 +2089,7 @@ dependencies = [ "etcetera", "fs4", "indoc", - "libloading", + "libloading 0.9.0", "log", "once_cell", "regex", diff --git a/Cargo.toml b/Cargo.toml index 521ad684..5afc53b5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -106,7 +106,7 @@ ansi_colours = "1.2.3" anstyle = "1.0.13" anyhow = "1.0.100" bstr = "1.12.0" -cc = "1.2.44" +cc = "1.2.45" clap = { version = "4.5.51", features = [ "cargo", "derive", @@ -128,7 +128,7 @@ heck = "0.5.0" html-escape = "0.2.13" indexmap = "2.11.4" indoc = "2.0.6" -libloading = "0.8.9" +libloading = "0.9.0" log = { version = "0.4.28", features = ["std"] } memchr = "2.7.6" once_cell = "1.21.3" @@ -137,7 +137,7 @@ rand = "0.8.5" regex = "1.11.3" regex-syntax = "0.8.6" rustc-hash = "2.1.1" -schemars = "1.0.4" +schemars = "1.0.5" semver = { version = "1.0.27", features = ["serde"] } serde = { version = "1.0.219", features = ["derive"] } serde_json = { version = "1.0.145", features = ["preserve_order"] } From 7657cc9d356e922790e0cb9648f3d3dc8880761c Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Wed, 12 Nov 2025 00:02:44 -0500 Subject: [PATCH 563/663] fix(dsl): add `ReservedRule` to `Rule` type definition --- crates/cli/npm/dsl.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/cli/npm/dsl.d.ts b/crates/cli/npm/dsl.d.ts index 3ad9ea2a..accdb95f 100644 --- a/crates/cli/npm/dsl.d.ts +++ b/crates/cli/npm/dsl.d.ts @@ -29,6 +29,7 @@ type Rule = | PrecRule | Repeat1Rule | RepeatRule + | ReservedRule | SeqRule | StringRule | SymbolRule From 12a31536e1f8d1afdd2add375139cb31ac0e1c1a Mon Sep 17 00:00:00 2001 From: Marcono1234 Date: Wed, 12 Nov 2025 15:55:28 +0100 Subject: [PATCH 564/663] fix(docs): don't show mdbook help popup when using query editor --- docs/src/assets/js/playground.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/src/assets/js/playground.js b/docs/src/assets/js/playground.js index 595fe565..2b4b5708 100644 --- a/docs/src/assets/js/playground.js +++ b/docs/src/assets/js/playground.js @@ -146,8 +146,9 @@ window.initializePlayground = async (opts) => { }); queryEditor.on('keydown', (_, event) => { - if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') { - event.stopPropagation(); // Prevent mdBook from going back/forward + const key = event.key; + if (key === 'ArrowLeft' || key === 'ArrowRight' || key === '?') { + event.stopPropagation(); // Prevent mdBook from going back/forward, or showing help } }); From 67cb3cb88146dd9ce3a098e33ac0374b5ce1e22d Mon Sep 17 00:00:00 2001 From: WillLillis Date: Fri, 3 Oct 2025 22:32:50 -0400 Subject: [PATCH 565/663] refactor(loader)!: transition from anyhow to thiserror --- Cargo.lock | 2 +- crates/loader/Cargo.toml | 2 +- crates/loader/src/loader.rs | 714 +++++++++++++++++++++++------------- 3 files changed, 471 insertions(+), 247 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4021396a..90c00db3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2084,7 +2084,6 @@ version = "0.1.5" name = "tree-sitter-loader" version = "0.26.0" dependencies = [ - "anyhow", "cc", "etcetera", "fs4", @@ -2097,6 +2096,7 @@ dependencies = [ "serde", "serde_json", "tempfile", + "thiserror 2.0.16", "tree-sitter", "tree-sitter-highlight", "tree-sitter-tags", diff --git a/crates/loader/Cargo.toml b/crates/loader/Cargo.toml index ba6aa0f4..cecae218 100644 --- a/crates/loader/Cargo.toml +++ b/crates/loader/Cargo.toml @@ -28,7 +28,6 @@ wasm = ["tree-sitter/wasm"] default = ["tree-sitter-highlight", "tree-sitter-tags"] [dependencies] -anyhow.workspace = true cc.workspace = true etcetera.workspace = true fs4.workspace = true @@ -41,6 +40,7 @@ semver.workspace = true serde.workspace = true serde_json.workspace = true tempfile.workspace = true +thiserror.workspace = true tree-sitter = { workspace = true } tree-sitter-highlight = { workspace = true, optional = true } diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index 39099797..08d6af84 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -14,11 +14,9 @@ use std::{ path::{Path, PathBuf}, process::Command, sync::LazyLock, - time::SystemTime, + time::{SystemTime, SystemTimeError}, }; -use anyhow::Error; -use anyhow::{anyhow, Context, Result}; use etcetera::BaseStrategy as _; use fs4::fs_std::FileExt; use libloading::{Library, Symbol}; @@ -27,11 +25,14 @@ use once_cell::unsync::OnceCell; use regex::{Regex, RegexBuilder}; use semver::Version; use serde::{Deserialize, Deserializer, Serialize}; +use thiserror::Error; use tree_sitter::Language; #[cfg(any(feature = "tree-sitter-highlight", feature = "tree-sitter-tags"))] use tree_sitter::QueryError; #[cfg(feature = "tree-sitter-highlight")] use tree_sitter::QueryErrorKind; +#[cfg(feature = "wasm")] +use tree_sitter::WasmError; #[cfg(feature = "tree-sitter-highlight")] use tree_sitter_highlight::HighlightConfiguration; #[cfg(feature = "tree-sitter-tags")] @@ -40,6 +41,210 @@ use tree_sitter_tags::{Error as TagsError, TagsConfiguration}; static GRAMMAR_NAME_REGEX: LazyLock = LazyLock::new(|| Regex::new(r#""name":\s*"(.*?)""#).unwrap()); +pub type LoaderResult = Result; + +#[derive(Debug, Error)] +pub enum LoaderError { + #[error(transparent)] + Compiler(CompilerError), + #[error("Parser compilation failed.\nStdout: {0}\nStderr: {1}")] + Compilation(String, String), + #[error("Failed to execute curl for {0} -- {1}")] + Curl(String, std::io::Error), + #[error("Failed to load language in current directory:\n{0}")] + CurrentDirectoryLoad(Box), + #[error("External file path {0} is outside of parser directory {1}")] + ExternalFile(String, String), + #[error("Failed to extract archive {0} to {1}")] + Extraction(String, String), + #[error("Failed to load language for file name {0}:\n{1}")] + FileNameLoad(String, Box), + #[error("Failed to parse the language name from grammar.json at {0}")] + GrammarJSON(String), + #[error(transparent)] + HomeDir(#[from] etcetera::HomeDirError), + #[error(transparent)] + IO(IoError), + #[error(transparent)] + Library(LibraryError), + #[error("Failed to compare binary and source timestamps:\n{0}")] + ModifiedTime(Box), + #[error("No language found")] + NoLanguage, + #[error(transparent)] + Query(LoaderQueryError), + #[error(transparent)] + ScannerSymbols(ScannerSymbolError), + #[error("Failed to load language for scope '{0}':\n{1}")] + ScopeLoad(String, Box), + #[error(transparent)] + Serialization(#[from] serde_json::Error), + #[error(transparent)] + Symbol(SymbolError), + #[error(transparent)] + Tags(#[from] TagsError), + #[error("Failed to execute tar for {0} -- {1}")] + Tar(String, std::io::Error), + #[error(transparent)] + Time(#[from] SystemTimeError), + #[error("Unknown scope '{0}'")] + UnknownScope(String), + #[error("Failed to download wasi-sdk from {0}")] + WasiSDKDownload(String), + #[error(transparent)] + WasiSDKClang(#[from] WasiSDKClangError), + #[error("Unsupported platform for wasi-sdk")] + WasiSDKPlatform, + #[cfg(feature = "wasm")] + #[error(transparent)] + Wasm(#[from] WasmError), + #[error("Failed to run wasi-sdk clang -- {0}")] + WasmCompiler(std::io::Error), + #[error("wasi-sdk clang command failed: {0}")] + WasmCompilation(String), +} + +#[derive(Debug, Error)] +pub struct CompilerError { + pub error: std::io::Error, + pub command: Box, +} + +impl std::fmt::Display for CompilerError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "Failed to execute the C compiler with the following command:\n{:?}\nError: {}", + *self.command, self.error + )?; + Ok(()) + } +} + +#[derive(Debug, Error)] +pub struct IoError { + pub error: std::io::Error, + pub path: Option, +} + +impl IoError { + fn new(error: std::io::Error, path: Option<&Path>) -> Self { + Self { + error, + path: path.map(|p| p.to_string_lossy().to_string()), + } + } +} + +impl std::fmt::Display for IoError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.error)?; + if let Some(ref path) = self.path { + write!(f, " ({path})")?; + } + Ok(()) + } +} + +#[derive(Debug, Error)] +pub struct LibraryError { + pub error: libloading::Error, + pub path: String, +} + +impl std::fmt::Display for LibraryError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "Error opening dynamic library {} -- {}", + self.path, self.error + )?; + Ok(()) + } +} + +#[derive(Debug, Error)] +pub struct LoaderQueryError { + pub error: QueryError, + pub file: Option, +} + +impl std::fmt::Display for LoaderQueryError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if let Some(ref path) = self.file { + writeln!(f, "Error in query file {path}:")?; + } + write!(f, "{}", self.error)?; + Ok(()) + } +} + +#[derive(Debug, Error)] +pub struct SymbolError { + pub error: libloading::Error, + pub symbol_name: String, + pub path: String, +} + +impl std::fmt::Display for SymbolError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "Failed to load symbol {} from {} -- {}", + self.symbol_name, self.path, self.error + )?; + Ok(()) + } +} + +#[derive(Debug, Error)] +pub struct ScannerSymbolError { + pub missing: Vec, +} + +impl std::fmt::Display for ScannerSymbolError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + writeln!( + f, + "Missing required functions in the external scanner, parsing won't work without these!\n" + )?; + for symbol in &self.missing { + writeln!(f, " `{symbol}`")?; + } + writeln!( + f, + "You can read more about this at https://tree-sitter.github.io/tree-sitter/creating-parsers/4-external-scanners\n" + )?; + Ok(()) + } +} + +#[derive(Debug, Error)] +pub struct WasiSDKClangError { + pub wasi_sdk_dir: String, + pub possible_executables: Vec<&'static str>, + download: bool, +} + +impl std::fmt::Display for WasiSDKClangError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if self.download { + write!( + f, + "Failed to find clang executable in downloaded wasi-sdk at '{}'.", + self.wasi_sdk_dir + )?; + } else { + write!(f, "TREE_SITTER_WASI_SDK_PATH is set to '{}', but no clang executable found in 'bin/' directory.", self.wasi_sdk_dir)?; + } + + let possible_exes = self.possible_executables.join(", "); + write!(f, " Looked for: {possible_exes}.")?; + + Ok(()) + } +} + #[derive(Default, Deserialize, Serialize)] pub struct Config { #[serde(default)] @@ -143,9 +348,10 @@ pub struct TreeSitterJSON { } impl TreeSitterJSON { - pub fn from_file(path: &Path) -> Result { - Ok(serde_json::from_str(&fs::read_to_string( - path.join("tree-sitter.json"), + pub fn from_file(path: &Path) -> LoaderResult { + let path = path.join("tree-sitter.json"); + Ok(serde_json::from_str(&fs::read_to_string(&path).map_err( + |e| LoaderError::IO(IoError::new(e, Some(path.as_path()))), )?)?) } @@ -432,7 +638,7 @@ impl<'a> CompileConfig<'a> { unsafe impl Sync for Loader {} impl Loader { - pub fn new() -> Result { + pub fn new() -> LoaderResult { let parser_lib_path = if let Ok(path) = env::var("TREE_SITTER_LIBDIR") { PathBuf::from(path) } else { @@ -441,7 +647,9 @@ impl Loader { .cache_dir() // `$HOME/Library/Caches/` .join("tree-sitter"); if legacy_apple_path.exists() && legacy_apple_path.is_dir() { - std::fs::remove_dir_all(legacy_apple_path)?; + std::fs::remove_dir_all(&legacy_apple_path).map_err(|e| { + LoaderError::IO(IoError::new(e, Some(legacy_apple_path.as_path()))) + })?; } } @@ -491,7 +699,7 @@ impl Loader { self.highlight_names.lock().unwrap().clone() } - pub fn find_all_languages(&mut self, config: &Config) -> Result<()> { + pub fn find_all_languages(&mut self, config: &Config) -> LoaderResult<()> { if config.parser_directories.is_empty() { warn!(concat!( "You have not configured any parser directories!\n", @@ -503,7 +711,7 @@ impl Loader { for parser_container_dir in &config.parser_directories { if let Ok(entries) = fs::read_dir(parser_container_dir) { for entry in entries { - let entry = entry?; + let entry = entry.map_err(|e| LoaderError::IO(IoError::new(e, None)))?; if let Some(parser_dir_name) = entry.file_name().to_str() { if parser_dir_name.starts_with("tree-sitter-") { self.find_language_configurations_at_path( @@ -519,7 +727,7 @@ impl Loader { Ok(()) } - pub fn languages_at_path(&mut self, path: &Path) -> Result> { + pub fn languages_at_path(&mut self, path: &Path) -> LoaderResult> { if let Ok(configurations) = self.find_language_configurations_at_path(path, true) { let mut language_ids = configurations .iter() @@ -530,7 +738,7 @@ impl Loader { language_ids .into_iter() .map(|(id, name)| Ok((self.language_for_id(id)?, name))) - .collect::>>() + .collect::>>() } else { Ok(Vec::new()) } @@ -547,7 +755,7 @@ impl Loader { pub fn language_configuration_for_scope( &self, scope: &str, - ) -> Result> { + ) -> LoaderResult> { for configuration in &self.language_configurations { if configuration.scope.as_ref().is_some_and(|s| s == scope) { let language = self.language_for_id(configuration.language_id)?; @@ -560,14 +768,19 @@ impl Loader { pub fn language_configuration_for_first_line_regex( &self, path: &Path, - ) -> Result> { + ) -> LoaderResult> { self.language_configuration_ids_by_first_line_regex .iter() .try_fold(None, |_, (regex, ids)| { if let Some(regex) = Self::regex(Some(regex)) { - let file = fs::File::open(path)?; + let file = fs::File::open(path) + .map_err(|e| LoaderError::IO(IoError::new(e, Some(path))))?; let reader = BufReader::new(file); - let first_line = reader.lines().next().transpose()?; + let first_line = reader + .lines() + .next() + .transpose() + .map_err(|e| LoaderError::IO(IoError::new(e, Some(path))))?; if let Some(first_line) = first_line { if regex.is_match(&first_line) && !ids.is_empty() { let configuration = &self.language_configurations[ids[0]]; @@ -584,7 +797,7 @@ impl Loader { pub fn language_configuration_for_file_name( &self, path: &Path, - ) -> Result> { + ) -> LoaderResult> { // Find all the language configurations that match this file name // or a suffix of the file name. let configuration_ids = path @@ -611,8 +824,8 @@ impl Loader { // If multiple language configurations match, then determine which // one to use by applying the configurations' content regexes. else { - let file_contents = fs::read(path) - .with_context(|| format!("Failed to read path {}", path.display()))?; + let file_contents = + fs::read(path).map_err(|e| LoaderError::IO(IoError::new(e, Some(path))))?; let file_contents = String::from_utf8_lossy(&file_contents); let mut best_score = -2isize; let mut best_configuration_id = None; @@ -656,7 +869,7 @@ impl Loader { pub fn language_configuration_for_injection_string( &self, string: &str, - ) -> Result> { + ) -> LoaderResult> { let mut best_match_length = 0; let mut best_match_position = None; for (i, configuration) in self.language_configurations.iter().enumerate() { @@ -683,11 +896,11 @@ impl Loader { pub fn language_for_configuration( &self, configuration: &LanguageConfiguration, - ) -> Result { + ) -> LoaderResult { self.language_for_id(configuration.language_id) } - fn language_for_id(&self, id: usize) -> Result { + fn language_for_id(&self, id: usize) -> LoaderResult { let (path, language, externals) = &self.languages_by_id[id]; language .get_or_try_init(|| { @@ -706,20 +919,23 @@ impl Loader { grammar_path: &Path, output_path: PathBuf, flags: &[&str], - ) -> Result<()> { + ) -> LoaderResult<()> { let src_path = grammar_path.join("src"); let mut config = CompileConfig::new(&src_path, None, Some(output_path)); config.flags = flags; self.load_language_at_path(config).map(|_| ()) } - pub fn load_language_at_path(&self, mut config: CompileConfig) -> Result { + pub fn load_language_at_path(&self, mut config: CompileConfig) -> LoaderResult { let grammar_path = config.src_path.join("grammar.json"); config.name = Self::grammar_json_name(&grammar_path)?; self.load_language_at_path_with_name(config) } - pub fn load_language_at_path_with_name(&self, mut config: CompileConfig) -> Result { + pub fn load_language_at_path_with_name( + &self, + mut config: CompileConfig, + ) -> LoaderResult { let mut lib_name = config.name.clone(); let language_fn_name = format!("tree_sitter_{}", config.name.replace('-', "_")); if self.debug_build { @@ -732,7 +948,9 @@ impl Loader { } if config.output_path.is_none() { - fs::create_dir_all(&self.parser_lib_path)?; + fs::create_dir_all(&self.parser_lib_path).map_err(|e| { + LoaderError::IO(IoError::new(e, Some(self.parser_lib_path.as_path()))) + })?; } let mut recompile = self.force_rebuild || config.output_path.is_some(); // if specified, always recompile @@ -766,8 +984,7 @@ impl Loader { ); if !recompile { - recompile = needs_recompile(&output_path, &paths_to_check) - .with_context(|| "Failed to compare source and binary timestamps")?; + recompile = needs_recompile(&output_path, &paths_to_check)?; } #[cfg(feature = "wasm")] @@ -784,7 +1001,8 @@ impl Loader { )?; } - let wasm_bytes = fs::read(&output_path)?; + let wasm_bytes = fs::read(&output_path) + .map_err(|e| LoaderError::IO(IoError::new(e, Some(output_path.as_path()))))?; return Ok(wasm_store.load_language(&config.name, &wasm_bytes)?); } @@ -808,33 +1026,42 @@ impl Loader { if lock_file.try_lock_exclusive().is_err() { // if we can't acquire the lock, another process is compiling the parser, wait for // it and don't recompile - lock_file.lock_exclusive()?; + lock_file + .lock_exclusive() + .map_err(|e| LoaderError::IO(IoError::new(e, Some(lock_path.as_path()))))?; recompile = false; } else { // if we can acquire the lock, check if the lock file is older than 30 seconds, a // run that was interrupted and left the lock file behind should not block // subsequent runs - let time = lock_file.metadata()?.modified()?.elapsed()?.as_secs(); + let time = lock_file + .metadata() + .map_err(|e| LoaderError::IO(IoError::new(e, Some(lock_path.as_path()))))? + .modified() + .map_err(|e| LoaderError::IO(IoError::new(e, Some(lock_path.as_path()))))? + .elapsed()? + .as_secs(); if time > 30 { - fs::remove_file(&lock_path)?; + fs::remove_file(&lock_path) + .map_err(|e| LoaderError::IO(IoError::new(e, Some(lock_path.as_path()))))?; recompile = true; } } } if recompile { - fs::create_dir_all(lock_path.parent().unwrap()).with_context(|| { - format!( - "Failed to create directory {}", - lock_path.parent().unwrap().display() - ) - })?; + let parent_path = lock_path.parent().unwrap(); + fs::create_dir_all(parent_path) + .map_err(|e| LoaderError::IO(IoError::new(e, Some(parent_path))))?; let lock_file = fs::OpenOptions::new() .create(true) .truncate(true) .write(true) - .open(&lock_path)?; - lock_file.lock_exclusive()?; + .open(&lock_path) + .map_err(|e| LoaderError::IO(IoError::new(e, Some(lock_path.as_path()))))?; + lock_file + .lock_exclusive() + .map_err(|e| LoaderError::IO(IoError::new(e, Some(lock_path.as_path()))))?; self.compile_parser_to_dylib(&config, &lock_file, &lock_path)?; @@ -846,17 +1073,22 @@ impl Loader { Self::load_language(&output_path, &language_fn_name) } - pub fn load_language(path: &Path, function_name: &str) -> Result { - let library = unsafe { Library::new(path) } - .with_context(|| format!("Error opening dynamic library {}", path.display()))?; + pub fn load_language(path: &Path, function_name: &str) -> LoaderResult { + let library = unsafe { Library::new(path) }.map_err(|e| { + LoaderError::Library(LibraryError { + error: e, + path: path.to_string_lossy().to_string(), + }) + })?; let language = unsafe { let language_fn = library .get:: Language>>(function_name.as_bytes()) - .with_context(|| { - format!( - "Failed to load symbol {function_name} from {}", - path.display() - ) + .map_err(|e| { + LoaderError::Symbol(SymbolError { + error: e, + symbol_name: function_name.to_string(), + path: path.to_string_lossy().to_string(), + }) })?; language_fn() }; @@ -869,7 +1101,7 @@ impl Loader { config: &CompileConfig, lock_file: &fs::File, lock_path: &Path, - ) -> Result<(), Error> { + ) -> LoaderResult<()> { let mut cc_config = cc::Build::new(); cc_config .cargo_metadata(false) @@ -940,30 +1172,34 @@ impl Loader { None }; - let output = command.output().with_context(|| { - format!("Failed to execute the C compiler with the following command:\n{command:?}") + let output = command.output().map_err(|e| { + LoaderError::Compiler(CompilerError { + error: e, + command: Box::new(command), + }) })?; if let Some(temp_dir) = temp_dir { let _ = fs::remove_dir_all(temp_dir); } - FileExt::unlock(lock_file)?; - fs::remove_file(lock_path)?; + FileExt::unlock(lock_file) + .map_err(|e| LoaderError::IO(IoError::new(e, Some(lock_path))))?; + fs::remove_file(lock_path) + .map_err(|e| LoaderError::IO(IoError::new(e, Some(lock_path))))?; if output.status.success() { Ok(()) } else { - Err(anyhow!( - "Parser compilation failed.\nStdout: {}\nStderr: {}", - String::from_utf8_lossy(&output.stdout), - String::from_utf8_lossy(&output.stderr) + Err(LoaderError::Compilation( + String::from_utf8_lossy(&output.stdout).to_string(), + String::from_utf8_lossy(&output.stderr).to_string(), )) } } #[cfg(unix)] - fn check_external_scanner(&self, name: &str, library_path: &Path) -> Result<()> { + fn check_external_scanner(&self, name: &str, library_path: &Path) -> LoaderResult<()> { let prefix = if cfg!(any(target_os = "macos", target_os = "ios")) { "_" } else { @@ -1015,22 +1251,9 @@ impl Loader { } if !must_have.is_empty() { - let missing = must_have - .iter() - .map(|f| format!(" `{f}`")) - .collect::>() - .join("\n"); - - return Err(anyhow!(format!( - indoc::indoc! {" - Missing required functions in the external scanner, parsing won't work without these! - - {} - - You can read more about this at https://tree-sitter.github.io/tree-sitter/creating-parsers/4-external-scanners - "}, - missing, - ))); + return Err(LoaderError::ScannerSymbols(ScannerSymbolError { + missing: must_have, + })); } } } @@ -1039,7 +1262,7 @@ impl Loader { } #[cfg(windows)] - fn check_external_scanner(&self, _name: &str, _library_path: &Path) -> Result<()> { + fn check_external_scanner(&self, _name: &str, _library_path: &Path) -> LoaderResult<()> { // TODO: there's no nm command on windows, whoever wants to implement this can and should :) // let mut must_have = vec![ @@ -1059,7 +1282,7 @@ impl Loader { src_path: &Path, scanner_filename: Option<&Path>, output_path: &Path, - ) -> Result<(), Error> { + ) -> LoaderResult<()> { let clang_executable = self.ensure_wasi_sdk_exists()?; let output_name = "output.wasm"; @@ -1085,17 +1308,17 @@ impl Loader { command.arg(scanner_filename); } - let output = command.output().context("Failed to run wasi-sdk clang")?; + let output = command.output().map_err(LoaderError::WasmCompiler)?; if !output.status.success() { - return Err(anyhow!( - "wasi-sdk clang command failed: {}", - String::from_utf8_lossy(&output.stderr) + return Err(LoaderError::WasmCompilation( + String::from_utf8_lossy(&output.stderr).to_string(), )); } - fs::rename(src_path.join(output_name), output_path) - .context("failed to rename Wasm output file")?; + let current_path = src_path.join(output_name); + fs::rename(¤t_path, output_path) + .map_err(|e| LoaderError::IO(IoError::new(e, Some(current_path.as_path()))))?; Ok(()) } @@ -1105,7 +1328,7 @@ impl Loader { &self, archive_path: &Path, destination: &Path, - ) -> Result<(), Error> { + ) -> LoaderResult<()> { let status = Command::new("tar") .arg("-xzf") .arg(archive_path) @@ -1113,13 +1336,12 @@ impl Loader { .arg("-C") .arg(destination) .status() - .with_context(|| format!("Failed to execute tar for {}", archive_path.display()))?; + .map_err(|e| LoaderError::Tar(archive_path.to_string_lossy().to_string(), e))?; if !status.success() { - return Err(anyhow!( - "Failed to extract archive {} to {}", - archive_path.display(), - destination.display() + return Err(LoaderError::Extraction( + archive_path.to_string_lossy().to_string(), + destination.to_string_lossy().to_string(), )); } @@ -1130,7 +1352,7 @@ impl Loader { /// and returns the path to the `clang` executable. /// /// If `TREE_SITTER_WASI_SDK_PATH` is set, it will use that path to look for the clang executable. - fn ensure_wasi_sdk_exists(&self) -> Result { + fn ensure_wasi_sdk_exists(&self) -> LoaderResult { let possible_executables = if cfg!(windows) { vec![ "clang.exe", @@ -1151,18 +1373,18 @@ impl Loader { } } - return Err(anyhow!( - "TREE_SITTER_WASI_SDK_PATH is set to '{}', but no clang executable found in 'bin/' directory. \ - Looked for: {}", - wasi_sdk_dir.display(), - possible_executables.join(", ") - )); + return Err(LoaderError::WasiSDKClang(WasiSDKClangError { + wasi_sdk_dir: wasi_sdk_dir.to_string_lossy().to_string(), + possible_executables, + download: false, + })); } let cache_dir = etcetera::choose_base_strategy()? .cache_dir() .join("tree-sitter"); - fs::create_dir_all(&cache_dir)?; + fs::create_dir_all(&cache_dir) + .map_err(|e| LoaderError::IO(IoError::new(e, Some(cache_dir.as_path()))))?; let wasi_sdk_dir = cache_dir.join("wasi-sdk"); @@ -1173,7 +1395,8 @@ impl Loader { } } - fs::create_dir_all(&wasi_sdk_dir)?; + fs::create_dir_all(&wasi_sdk_dir) + .map_err(|e| LoaderError::IO(IoError::new(e, Some(wasi_sdk_dir.as_path()))))?; let arch_os = if cfg!(target_os = "macos") { if cfg!(target_arch = "aarch64") { @@ -1194,7 +1417,7 @@ impl Loader { "x86_64-linux" } } else { - return Err(anyhow!("Unsupported platform for wasi-sdk")); + return Err(LoaderError::WasiSDKPlatform); }; let sdk_filename = format!("wasi-sdk-25.0-{arch_os}.tar.gz"); @@ -1212,15 +1435,14 @@ impl Loader { .arg(&temp_tar_path) .arg(&sdk_url) .status() - .with_context(|| format!("Failed to execute curl for {sdk_url}"))?; + .map_err(|e| LoaderError::Curl(sdk_url.clone(), e))?; if !status.success() { - return Err(anyhow!("Failed to download wasi-sdk from {sdk_url}",)); + return Err(LoaderError::WasiSDKDownload(sdk_url)); } info!("Extracting wasi-sdk to {}...", wasi_sdk_dir.display()); - self.extract_tar_gz_with_strip(&temp_tar_path, &wasi_sdk_dir) - .context("Failed to extract wasi-sdk archive")?; + self.extract_tar_gz_with_strip(&temp_tar_path, &wasi_sdk_dir)?; fs::remove_file(temp_tar_path).ok(); for exe in &possible_executables { @@ -1230,11 +1452,11 @@ impl Loader { } } - Err(anyhow!( - "Failed to find clang executable in downloaded wasi-sdk at '{}'. Looked for: {}", - wasi_sdk_dir.display(), - possible_executables.join(", ") - )) + Err(LoaderError::WasiSDKClang(WasiSDKClangError { + wasi_sdk_dir: wasi_sdk_dir.to_string_lossy().to_string(), + possible_executables, + download: true, + })) } #[must_use] @@ -1274,115 +1496,121 @@ impl Loader { &mut self, parser_path: &Path, set_current_path_config: bool, - ) -> Result<&[LanguageConfiguration]> { + ) -> LoaderResult<&[LanguageConfiguration]> { let initial_language_configuration_count = self.language_configurations.len(); - let ts_json = TreeSitterJSON::from_file(parser_path); - if let Ok(config) = ts_json { - let language_count = self.languages_by_id.len(); - for grammar in config.grammars { - // Determine the path to the parser directory. This can be specified in - // the tree-sitter.json, but defaults to the directory containing the - // tree-sitter.json. - let language_path = parser_path.join(grammar.path.unwrap_or(PathBuf::from("."))); + match TreeSitterJSON::from_file(parser_path) { + Ok(config) => { + let language_count = self.languages_by_id.len(); + for grammar in config.grammars { + // Determine the path to the parser directory. This can be specified in + // the tree-sitter.json, but defaults to the directory containing the + // tree-sitter.json. + let language_path = + parser_path.join(grammar.path.unwrap_or(PathBuf::from("."))); - // Determine if a previous language configuration in this package.json file - // already uses the same language. - let mut language_id = None; - for (id, (path, _, _)) in - self.languages_by_id.iter().enumerate().skip(language_count) - { - if language_path == *path { - language_id = Some(id); + // Determine if a previous language configuration in this package.json file + // already uses the same language. + let mut language_id = None; + for (id, (path, _, _)) in + self.languages_by_id.iter().enumerate().skip(language_count) + { + if language_path == *path { + language_id = Some(id); + } } - } - // If not, add a new language path to the list. - let language_id = if let Some(language_id) = language_id { - language_id - } else { - self.languages_by_id.push(( + // If not, add a new language path to the list. + let language_id = if let Some(language_id) = language_id { + language_id + } else { + self.languages_by_id.push(( language_path, OnceCell::new(), - grammar.external_files.clone().into_vec().map(|files| { - files.into_iter() - .map(|path| { - let path = parser_path.join(path); - // prevent p being above/outside of parser_path - if path.starts_with(parser_path) { - Ok(path) - } else { - Err(anyhow!( - "External file path {} is outside of parser directory {}", path.display(), parser_path.display(), - )) - } - }) - .collect::>>() - }).transpose()?, + grammar + .external_files + .clone() + .into_vec() + .map(|files| { + files + .into_iter() + .map(|path| { + let path = parser_path.join(path); + // prevent p being above/outside of parser_path + if path.starts_with(parser_path) { + Ok(path) + } else { + Err(LoaderError::ExternalFile( + path.to_string_lossy().to_string(), + parser_path.to_string_lossy().to_string(), + )) + } + }) + .collect::>>() + }) + .transpose()?, )); - self.languages_by_id.len() - 1 - }; + self.languages_by_id.len() - 1 + }; - let configuration = LanguageConfiguration { - root_path: parser_path.to_path_buf(), - language_name: grammar.name, - scope: Some(grammar.scope), - language_id, - file_types: grammar.file_types.unwrap_or_default(), - content_regex: Self::regex(grammar.content_regex.as_deref()), - first_line_regex: Self::regex(grammar.first_line_regex.as_deref()), - injection_regex: Self::regex(grammar.injection_regex.as_deref()), - injections_filenames: grammar.injections.into_vec(), - locals_filenames: grammar.locals.into_vec(), - tags_filenames: grammar.tags.into_vec(), - highlights_filenames: grammar.highlights.into_vec(), - #[cfg(feature = "tree-sitter-highlight")] - highlight_config: OnceCell::new(), - #[cfg(feature = "tree-sitter-tags")] - tags_config: OnceCell::new(), - #[cfg(feature = "tree-sitter-highlight")] - highlight_names: &self.highlight_names, - #[cfg(feature = "tree-sitter-highlight")] - use_all_highlight_names: self.use_all_highlight_names, - _phantom: PhantomData, - }; + let configuration = LanguageConfiguration { + root_path: parser_path.to_path_buf(), + language_name: grammar.name, + scope: Some(grammar.scope), + language_id, + file_types: grammar.file_types.unwrap_or_default(), + content_regex: Self::regex(grammar.content_regex.as_deref()), + first_line_regex: Self::regex(grammar.first_line_regex.as_deref()), + injection_regex: Self::regex(grammar.injection_regex.as_deref()), + injections_filenames: grammar.injections.into_vec(), + locals_filenames: grammar.locals.into_vec(), + tags_filenames: grammar.tags.into_vec(), + highlights_filenames: grammar.highlights.into_vec(), + #[cfg(feature = "tree-sitter-highlight")] + highlight_config: OnceCell::new(), + #[cfg(feature = "tree-sitter-tags")] + tags_config: OnceCell::new(), + #[cfg(feature = "tree-sitter-highlight")] + highlight_names: &self.highlight_names, + #[cfg(feature = "tree-sitter-highlight")] + use_all_highlight_names: self.use_all_highlight_names, + _phantom: PhantomData, + }; - for file_type in &configuration.file_types { - self.language_configuration_ids_by_file_type - .entry(file_type.clone()) - .or_default() - .push(self.language_configurations.len()); - } - if let Some(first_line_regex) = &configuration.first_line_regex { - self.language_configuration_ids_by_first_line_regex - .entry(first_line_regex.to_string()) - .or_default() - .push(self.language_configurations.len()); - } + for file_type in &configuration.file_types { + self.language_configuration_ids_by_file_type + .entry(file_type.clone()) + .or_default() + .push(self.language_configurations.len()); + } + if let Some(first_line_regex) = &configuration.first_line_regex { + self.language_configuration_ids_by_first_line_regex + .entry(first_line_regex.to_string()) + .or_default() + .push(self.language_configurations.len()); + } - self.language_configurations.push(unsafe { - mem::transmute::, LanguageConfiguration<'static>>( - configuration, - ) - }); + self.language_configurations.push(unsafe { + mem::transmute::, LanguageConfiguration<'static>>( + configuration, + ) + }); - if set_current_path_config && self.language_configuration_in_current_path.is_none() - { - self.language_configuration_in_current_path = - Some(self.language_configurations.len() - 1); + if set_current_path_config + && self.language_configuration_in_current_path.is_none() + { + self.language_configuration_in_current_path = + Some(self.language_configurations.len() - 1); + } } } - } else if let Err(e) = ts_json { - match e.downcast_ref::() { - // This is noisy, and not really an issue. - Some(e) if e.kind() == std::io::ErrorKind::NotFound => {} - _ => { - warn!( - "Failed to parse {} -- {e}", - parser_path.join("tree-sitter.json").display() - ); - } + Err(LoaderError::Serialization(e)) => { + warn!( + "Failed to parse {} -- {e}", + parser_path.join("tree-sitter.json").display() + ); } + _ => {} } // If we didn't find any language configurations in the tree-sitter.json file, @@ -1432,32 +1660,21 @@ impl Loader { pattern.and_then(|r| RegexBuilder::new(r).multi_line(true).build().ok()) } - fn grammar_json_name(grammar_path: &Path) -> Result { - let file = fs::File::open(grammar_path).with_context(|| { - format!("Failed to open grammar.json at {}", grammar_path.display()) - })?; + fn grammar_json_name(grammar_path: &Path) -> LoaderResult { + let file = fs::File::open(grammar_path) + .map_err(|e| LoaderError::IO(IoError::new(e, Some(grammar_path))))?; let first_three_lines = BufReader::new(file) .lines() .take(3) - .collect::, _>>() - .with_context(|| { - format!( - "Failed to read the first three lines of grammar.json at {}", - grammar_path.display() - ) - })? + .collect::, std::io::Error>>() + .map_err(|_| LoaderError::GrammarJSON(grammar_path.to_string_lossy().to_string()))? .join("\n"); let name = GRAMMAR_NAME_REGEX .captures(&first_three_lines) .and_then(|c| c.get(1)) - .ok_or_else(|| { - anyhow!( - "Failed to parse the language name from grammar.json at {}", - grammar_path.display() - ) - })?; + .ok_or_else(|| LoaderError::GrammarJSON(grammar_path.to_string_lossy().to_string()))?; Ok(name.as_str().to_string()) } @@ -1469,34 +1686,34 @@ impl Loader { scope: Option<&str>, // path to dynamic library, name of language lib_info: Option<&(PathBuf, &str)>, - ) -> Result { + ) -> LoaderResult { if let Some((ref lib_path, language_name)) = lib_info { let language_fn_name = format!("tree_sitter_{}", language_name.replace('-', "_")); Self::load_language(lib_path, &language_fn_name) } else if let Some(scope) = scope { if let Some(config) = self .language_configuration_for_scope(scope) - .with_context(|| format!("Failed to load language for scope '{scope}'"))? + .map_err(|e| LoaderError::ScopeLoad(scope.to_string(), Box::new(e)))? { Ok(config.0) } else { - Err(anyhow!("Unknown scope '{scope}'")) + Err(LoaderError::UnknownScope(scope.to_string())) } - } else if let Some((lang, _)) = self - .language_configuration_for_file_name(path) - .with_context(|| { - format!( - "Failed to load language for file name {}", - path.file_name().unwrap().to_string_lossy() - ) - })? + } else if let Some((lang, _)) = + self.language_configuration_for_file_name(path) + .map_err(|e| { + LoaderError::FileNameLoad( + path.file_name().unwrap().to_string_lossy().to_string(), + Box::new(e), + ) + })? { Ok(lang) } else if let Some(id) = self.language_configuration_in_current_path { Ok(self.language_for_id(self.language_configurations[id].language_id)?) } else if let Some(lang) = self .languages_at_path(current_dir) - .with_context(|| "Failed to load language in current directory")? + .map_err(|e| LoaderError::CurrentDirectoryLoad(Box::new(e)))? .first() .cloned() { @@ -1504,7 +1721,7 @@ impl Loader { } else if let Some(lang) = self.language_configuration_for_first_line_regex(path)? { Ok(lang.0) } else { - Err(anyhow!("No language found")) + Err(LoaderError::NoLanguage) } } @@ -1539,7 +1756,7 @@ impl LanguageConfiguration<'_> { &self, language: Language, paths: Option<&[PathBuf]>, - ) -> Result> { + ) -> LoaderResult> { let (highlights_filenames, injections_filenames, locals_filenames) = match paths { Some(paths) => ( Some( @@ -1604,7 +1821,9 @@ impl LanguageConfiguration<'_> { &locals_query, ) .map_err(|error| match error.kind { - QueryErrorKind::Language => Error::from(error), + QueryErrorKind::Language => { + LoaderError::Query(LoaderQueryError { error, file: None }) + } _ => { if error.offset < injections_query.len() { Self::include_path_in_query_error( @@ -1647,7 +1866,7 @@ impl LanguageConfiguration<'_> { } #[cfg(feature = "tree-sitter-tags")] - pub fn tags_config(&self, language: Language) -> Result> { + pub fn tags_config(&self, language: Language) -> LoaderResult> { self.tags_config .get_or_try_init(|| { let (tags_query, tags_ranges) = @@ -1691,7 +1910,7 @@ impl LanguageConfiguration<'_> { ranges: &[(PathBuf, Range)], source: &str, start_offset: usize, - ) -> Error { + ) -> LoaderError { let offset_within_section = error.offset - start_offset; let (path, range) = ranges .iter() @@ -1701,7 +1920,10 @@ impl LanguageConfiguration<'_> { error.row = source[range.start..offset_within_section] .matches('\n') .count(); - Error::from(error).context(format!("Error in query file {}", path.display())) + LoaderError::Query(LoaderQueryError { + error, + file: Some(path.to_string_lossy().to_string()), + }) } #[allow(clippy::type_complexity)] @@ -1710,7 +1932,7 @@ impl LanguageConfiguration<'_> { &self, paths: Option<&[PathBuf]>, default_path: &str, - ) -> Result<(String, Vec<(PathBuf, Range)>)> { + ) -> LoaderResult<(String, Vec<(PathBuf, Range)>)> { let mut query = String::new(); let mut path_ranges = Vec::new(); if let Some(paths) = paths { @@ -1718,7 +1940,7 @@ impl LanguageConfiguration<'_> { let abs_path = self.root_path.join(path); let prev_query_len = query.len(); query += &fs::read_to_string(&abs_path) - .with_context(|| format!("Failed to read query file {}", path.display()))?; + .map_err(|e| LoaderError::IO(IoError::new(e, Some(abs_path.as_path()))))?; path_ranges.push((path.clone(), prev_query_len..query.len())); } } else { @@ -1738,7 +1960,7 @@ impl LanguageConfiguration<'_> { let path = queries_path.join(default_path); if path.exists() { query = fs::read_to_string(&path) - .with_context(|| format!("Failed to read query file {}", path.display()))?; + .map_err(|e| LoaderError::IO(IoError::new(e, Some(path.as_path()))))?; path_ranges.push((PathBuf::from(default_path), 0..query.len())); } } @@ -1747,20 +1969,22 @@ impl LanguageConfiguration<'_> { } } -fn needs_recompile(lib_path: &Path, paths_to_check: &[PathBuf]) -> Result { +fn needs_recompile(lib_path: &Path, paths_to_check: &[PathBuf]) -> LoaderResult { if !lib_path.exists() { return Ok(true); } - let lib_mtime = mtime(lib_path) - .with_context(|| format!("Failed to read mtime of {}", lib_path.display()))?; + let lib_mtime = mtime(lib_path).map_err(|e| LoaderError::ModifiedTime(Box::new(e)))?; for path in paths_to_check { - if mtime(path)? > lib_mtime { + if mtime(path).map_err(|e| LoaderError::ModifiedTime(Box::new(e)))? > lib_mtime { return Ok(true); } } Ok(false) } -fn mtime(path: &Path) -> Result { - Ok(fs::metadata(path)?.modified()?) +fn mtime(path: &Path) -> LoaderResult { + fs::metadata(path) + .map_err(|e| LoaderError::IO(IoError::new(e, Some(path))))? + .modified() + .map_err(|e| LoaderError::IO(IoError::new(e, Some(path)))) } From db2d221ae9d5521e1e6527f3426d8d15b091fd9d Mon Sep 17 00:00:00 2001 From: WillLillis Date: Sat, 4 Oct 2025 00:48:35 -0400 Subject: [PATCH 566/663] fix(generate): remove leftover imports of anyhow --- Cargo.lock | 1 - crates/generate/Cargo.toml | 1 - crates/generate/src/generate.rs | 1 - crates/generate/src/node_types.rs | 1 - crates/generate/src/parse_grammar.rs | 1 - crates/generate/src/prepare_grammar.rs | 1 - crates/generate/src/prepare_grammar/expand_tokens.rs | 1 - crates/generate/src/prepare_grammar/extract_tokens.rs | 1 - crates/generate/src/prepare_grammar/flatten_grammar.rs | 1 - crates/generate/src/prepare_grammar/intern_symbols.rs | 1 - crates/generate/src/prepare_grammar/process_inlines.rs | 1 - 11 files changed, 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 90c00db3..1297ecd3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2046,7 +2046,6 @@ dependencies = [ name = "tree-sitter-generate" version = "0.26.0" dependencies = [ - "anyhow", "bitflags 2.10.0", "dunce", "indexmap", diff --git a/crates/generate/Cargo.toml b/crates/generate/Cargo.toml index 09fc1850..5e93bf40 100644 --- a/crates/generate/Cargo.toml +++ b/crates/generate/Cargo.toml @@ -25,7 +25,6 @@ load = ["dep:semver"] qjs-rt = ["load", "rquickjs", "pathdiff"] [dependencies] -anyhow.workspace = true bitflags = "2.9.4" dunce = "1.0.5" indexmap.workspace = true diff --git a/crates/generate/src/generate.rs b/crates/generate/src/generate.rs index c4a1ec84..612a5fa8 100644 --- a/crates/generate/src/generate.rs +++ b/crates/generate/src/generate.rs @@ -7,7 +7,6 @@ use std::{ process::{Command, Stdio}, }; -use anyhow::Result; use bitflags::bitflags; use log::warn; use node_types::VariableInfo; diff --git a/crates/generate/src/node_types.rs b/crates/generate/src/node_types.rs index 0a964105..2dde0c49 100644 --- a/crates/generate/src/node_types.rs +++ b/crates/generate/src/node_types.rs @@ -1,6 +1,5 @@ use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; -use anyhow::Result; use serde::Serialize; use thiserror::Error; diff --git a/crates/generate/src/parse_grammar.rs b/crates/generate/src/parse_grammar.rs index c48477f0..de8f0a97 100644 --- a/crates/generate/src/parse_grammar.rs +++ b/crates/generate/src/parse_grammar.rs @@ -1,6 +1,5 @@ use std::collections::HashSet; -use anyhow::Result; use log::warn; use regex::Regex; use serde::{Deserialize, Serialize}; diff --git a/crates/generate/src/prepare_grammar.rs b/crates/generate/src/prepare_grammar.rs index 8c35c741..58e0869c 100644 --- a/crates/generate/src/prepare_grammar.rs +++ b/crates/generate/src/prepare_grammar.rs @@ -12,7 +12,6 @@ use std::{ mem, }; -use anyhow::Result; pub use expand_tokens::ExpandTokensError; pub use extract_tokens::ExtractTokensError; pub use flatten_grammar::FlattenGrammarError; diff --git a/crates/generate/src/prepare_grammar/expand_tokens.rs b/crates/generate/src/prepare_grammar/expand_tokens.rs index 4d8b4f11..acfb9ba3 100644 --- a/crates/generate/src/prepare_grammar/expand_tokens.rs +++ b/crates/generate/src/prepare_grammar/expand_tokens.rs @@ -1,4 +1,3 @@ -use anyhow::Result; use regex_syntax::{ hir::{Class, Hir, HirKind}, ParserBuilder, diff --git a/crates/generate/src/prepare_grammar/extract_tokens.rs b/crates/generate/src/prepare_grammar/extract_tokens.rs index a1fddbe6..a7b4f227 100644 --- a/crates/generate/src/prepare_grammar/extract_tokens.rs +++ b/crates/generate/src/prepare_grammar/extract_tokens.rs @@ -1,6 +1,5 @@ use std::collections::HashMap; -use anyhow::Result; use serde::Serialize; use thiserror::Error; diff --git a/crates/generate/src/prepare_grammar/flatten_grammar.rs b/crates/generate/src/prepare_grammar/flatten_grammar.rs index cb0f1dae..3bec17bf 100644 --- a/crates/generate/src/prepare_grammar/flatten_grammar.rs +++ b/crates/generate/src/prepare_grammar/flatten_grammar.rs @@ -1,6 +1,5 @@ use std::collections::HashMap; -use anyhow::Result; use serde::Serialize; use thiserror::Error; diff --git a/crates/generate/src/prepare_grammar/intern_symbols.rs b/crates/generate/src/prepare_grammar/intern_symbols.rs index 241e6e99..92f0f095 100644 --- a/crates/generate/src/prepare_grammar/intern_symbols.rs +++ b/crates/generate/src/prepare_grammar/intern_symbols.rs @@ -1,4 +1,3 @@ -use anyhow::Result; use log::warn; use serde::Serialize; use thiserror::Error; diff --git a/crates/generate/src/prepare_grammar/process_inlines.rs b/crates/generate/src/prepare_grammar/process_inlines.rs index f20e182d..d4b7dc18 100644 --- a/crates/generate/src/prepare_grammar/process_inlines.rs +++ b/crates/generate/src/prepare_grammar/process_inlines.rs @@ -1,6 +1,5 @@ use std::collections::HashMap; -use anyhow::Result; use serde::Serialize; use thiserror::Error; From 7eb23d9f3cae0876dec541f06da633b066f583e7 Mon Sep 17 00:00:00 2001 From: WillLillis Date: Sat, 4 Oct 2025 01:22:02 -0400 Subject: [PATCH 567/663] refactor(config)!: transition from anyhow to thiserror --- Cargo.lock | 2 +- crates/config/Cargo.toml | 2 +- crates/config/src/tree_sitter_config.rs | 79 ++++++++++++++++++++----- 3 files changed, 66 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1297ecd3..726289b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2035,11 +2035,11 @@ dependencies = [ name = "tree-sitter-config" version = "0.26.0" dependencies = [ - "anyhow", "etcetera", "log", "serde", "serde_json", + "thiserror 2.0.16", ] [[package]] diff --git a/crates/config/Cargo.toml b/crates/config/Cargo.toml index b9bc239e..641b434b 100644 --- a/crates/config/Cargo.toml +++ b/crates/config/Cargo.toml @@ -20,8 +20,8 @@ path = "src/tree_sitter_config.rs" workspace = true [dependencies] -anyhow.workspace = true etcetera.workspace = true log.workspace = true serde.workspace = true serde_json.workspace = true +thiserror.workspace = true diff --git a/crates/config/src/tree_sitter_config.rs b/crates/config/src/tree_sitter_config.rs index 85dc003d..17b1d384 100644 --- a/crates/config/src/tree_sitter_config.rs +++ b/crates/config/src/tree_sitter_config.rs @@ -1,12 +1,54 @@ #![cfg_attr(not(any(test, doctest)), doc = include_str!("../README.md"))] -use std::{env, fs, path::PathBuf}; +use std::{ + env, fs, + path::{Path, PathBuf}, +}; -use anyhow::{Context, Result}; use etcetera::BaseStrategy as _; use log::warn; use serde::{Deserialize, Serialize}; use serde_json::Value; +use thiserror::Error; + +pub type ConfigResult = Result; + +#[derive(Debug, Error)] +pub enum ConfigError { + #[error("Bad JSON config {0} -- {1}")] + ConfigRead(String, serde_json::Error), + #[error(transparent)] + HomeDir(#[from] etcetera::HomeDirError), + #[error(transparent)] + IO(IoError), + #[error(transparent)] + Serialization(#[from] serde_json::Error), +} + +#[derive(Debug, Error)] +pub struct IoError { + pub error: std::io::Error, + pub path: Option, +} + +impl IoError { + fn new(error: std::io::Error, path: Option<&Path>) -> Self { + Self { + error, + path: path.map(|p| p.to_string_lossy().to_string()), + } + } +} + +impl std::fmt::Display for IoError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.error)?; + if let Some(ref path) = self.path { + write!(f, " ({path})")?; + } + Ok(()) + } +} /// Holds the contents of tree-sitter's configuration file. /// @@ -23,7 +65,7 @@ pub struct Config { } impl Config { - pub fn find_config_file() -> Result> { + pub fn find_config_file() -> ConfigResult> { if let Ok(path) = env::var("TREE_SITTER_DIR") { let mut path = PathBuf::from(path); path.push("config.json"); @@ -46,8 +88,12 @@ impl Config { .join("tree-sitter") .join("config.json"); if legacy_apple_path.is_file() { - fs::create_dir_all(xdg_path.parent().unwrap())?; - fs::rename(&legacy_apple_path, &xdg_path)?; + let xdg_dir = xdg_path.parent().unwrap(); + fs::create_dir_all(xdg_dir) + .map_err(|e| ConfigError::IO(IoError::new(e, Some(xdg_dir))))?; + fs::rename(&legacy_apple_path, &xdg_path).map_err(|e| { + ConfigError::IO(IoError::new(e, Some(legacy_apple_path.as_path()))) + })?; warn!( "Your config.json file has been automatically migrated from \"{}\" to \"{}\"", legacy_apple_path.display(), @@ -67,7 +113,7 @@ impl Config { Ok(None) } - fn xdg_config_file() -> Result { + fn xdg_config_file() -> ConfigResult { let xdg_path = etcetera::choose_base_strategy()? .config_dir() .join("tree-sitter") @@ -84,7 +130,7 @@ impl Config { /// [`etcetera::choose_base_strategy`](https://docs.rs/etcetera/*/etcetera/#basestrategy) /// - `$HOME/.tree-sitter/config.json` as a fallback from where tree-sitter _used_ to store /// its configuration - pub fn load(path: Option) -> Result { + pub fn load(path: Option) -> ConfigResult { let location = if let Some(path) = path { path } else if let Some(path) = Self::find_config_file()? { @@ -94,9 +140,9 @@ impl Config { }; let content = fs::read_to_string(&location) - .with_context(|| format!("Failed to read {}", location.to_string_lossy()))?; + .map_err(|e| ConfigError::IO(IoError::new(e, Some(location.as_path()))))?; let config = serde_json::from_str(&content) - .with_context(|| format!("Bad JSON config {}", location.to_string_lossy()))?; + .map_err(|e| ConfigError::ConfigRead(location.to_string_lossy().to_string(), e))?; Ok(Self { location, config }) } @@ -106,7 +152,7 @@ impl Config { /// disk. /// /// (Note that this is typically only done by the `tree-sitter init-config` command.) - pub fn initial() -> Result { + pub fn initial() -> ConfigResult { let location = if let Ok(path) = env::var("TREE_SITTER_DIR") { let mut path = PathBuf::from(path); path.push("config.json"); @@ -119,17 +165,20 @@ impl Config { } /// Saves this configuration to the file that it was originally loaded from. - pub fn save(&self) -> Result<()> { + pub fn save(&self) -> ConfigResult<()> { let json = serde_json::to_string_pretty(&self.config)?; - fs::create_dir_all(self.location.parent().unwrap())?; - fs::write(&self.location, json)?; + let config_dir = self.location.parent().unwrap(); + fs::create_dir_all(config_dir) + .map_err(|e| ConfigError::IO(IoError::new(e, Some(config_dir))))?; + fs::write(&self.location, json) + .map_err(|e| ConfigError::IO(IoError::new(e, Some(self.location.as_path()))))?; Ok(()) } /// Parses a component-specific configuration from the configuration file. The type `C` must /// be [deserializable](https://docs.rs/serde/*/serde/trait.Deserialize.html) from a JSON /// object, and must only include the fields relevant to that component. - pub fn get(&self) -> Result + pub fn get(&self) -> ConfigResult where C: for<'de> Deserialize<'de>, { @@ -140,7 +189,7 @@ impl Config { /// Adds a component-specific configuration to the configuration file. The type `C` must be /// [serializable](https://docs.rs/serde/*/serde/trait.Serialize.html) into a JSON object, and /// must only include the fields relevant to that component. - pub fn add(&mut self, config: C) -> Result<()> + pub fn add(&mut self, config: C) -> ConfigResult<()> where C: Serialize, { From 61c21aa408710019fc81c14a9b213dd762d5c5bd Mon Sep 17 00:00:00 2001 From: WillLillis Date: Sat, 4 Oct 2025 03:21:20 -0400 Subject: [PATCH 568/663] refactor(generate)!: include path when available in IO errors --- crates/generate/src/generate.rs | 138 +++++++++++++++++++------------- crates/generate/src/quickjs.rs | 6 +- 2 files changed, 87 insertions(+), 57 deletions(-) diff --git a/crates/generate/src/generate.rs b/crates/generate/src/generate.rs index 612a5fa8..6a005637 100644 --- a/crates/generate/src/generate.rs +++ b/crates/generate/src/generate.rs @@ -80,8 +80,8 @@ pub type GenerateResult = Result; pub enum GenerateError { #[error("Error with specified path -- {0}")] GrammarPath(String), - #[error("{0}")] - IO(String), + #[error(transparent)] + IO(IoError), #[cfg(feature = "load")] #[error(transparent)] LoadGrammarFile(#[from] LoadGrammarError), @@ -100,9 +100,28 @@ pub enum GenerateError { SuperTypeCycle(#[from] SuperTypeCycleError), } -impl From for GenerateError { - fn from(value: std::io::Error) -> Self { - Self::IO(value.to_string()) +#[derive(Debug, Error, Serialize)] +pub struct IoError { + pub error: String, + pub path: Option, +} + +impl IoError { + fn new(error: &std::io::Error, path: Option<&Path>) -> Self { + Self { + error: error.to_string(), + path: path.map(|p| p.to_string_lossy().to_string()), + } + } +} + +impl std::fmt::Display for IoError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.error)?; + if let Some(ref path) = self.path { + write!(f, " ({path})")?; + } + Ok(()) } } @@ -117,18 +136,11 @@ pub enum LoadGrammarError { #[error("Failed to load grammar.js -- {0}")] LoadJSGrammarFile(#[from] JSError), #[error("Failed to load grammar.json -- {0}")] - IO(String), + IO(IoError), #[error("Unknown grammar file extension: {0:?}")] FileExtension(PathBuf), } -#[cfg(feature = "load")] -impl From for LoadGrammarError { - fn from(value: std::io::Error) -> Self { - Self::IO(value.to_string()) - } -} - #[cfg(feature = "load")] #[derive(Debug, Error, Serialize)] pub enum ParseVersionError { @@ -136,8 +148,8 @@ pub enum ParseVersionError { Version(String), #[error("{0}")] JSON(String), - #[error("{0}")] - IO(String), + #[error(transparent)] + IO(IoError), } #[cfg(feature = "load")] @@ -152,8 +164,21 @@ pub enum JSError { JSRuntimeUtf8 { runtime: String, error: String }, #[error("`{runtime}` process exited with status {code}")] JSRuntimeExit { runtime: String, code: i32 }, - #[error("{0}")] - IO(String), + #[error("Failed to open stdin for `{runtime}`")] + JSRuntimeStdin { runtime: String }, + #[error("Failed to write {item} to `{runtime}`'s stdin -- {error}")] + JSRuntimeWrite { + runtime: String, + item: String, + error: String, + }, + #[error("Failed to read output from `{runtime}` -- {error}")] + JSRuntimeRead { runtime: String, error: String }, + #[error(transparent)] + IO(IoError), + #[cfg(feature = "qjs-rt")] + #[error("Failed to get relative path")] + RelativePath, #[error("Could not parse this package's version as semver -- {0}")] Semver(String), #[error("Failed to serialze grammar JSON -- {0}")] @@ -163,13 +188,6 @@ pub enum JSError { QuickJS(String), } -#[cfg(feature = "load")] -impl From for JSError { - fn from(value: std::io::Error) -> Self { - Self::IO(value.to_string()) - } -} - #[cfg(feature = "load")] impl From for JSError { fn from(value: serde_json::Error) -> Self { @@ -230,7 +248,8 @@ where .try_exists() .map_err(|e| GenerateError::GrammarPath(e.to_string()))? { - fs::create_dir_all(&path_buf)?; + fs::create_dir_all(&path_buf) + .map_err(|e| GenerateError::IO(IoError::new(&e, Some(path_buf.as_path()))))?; repo_path = path_buf; repo_path.join("grammar.js") } else { @@ -247,15 +266,12 @@ where let header_path = src_path.join("tree_sitter"); // Ensure that the output directory exists - fs::create_dir_all(&src_path)?; + fs::create_dir_all(&src_path) + .map_err(|e| GenerateError::IO(IoError::new(&e, Some(src_path.as_path()))))?; if grammar_path.file_name().unwrap() != "grammar.json" { - fs::write(src_path.join("grammar.json"), &grammar_json).map_err(|e| { - GenerateError::IO(format!( - "Failed to write grammar.json to {} -- {e}", - src_path.display() - )) - })?; + fs::write(src_path.join("grammar.json"), &grammar_json) + .map_err(|e| GenerateError::IO(IoError::new(&e, Some(src_path.as_path()))))?; } // If our job is only to generate `grammar.json` and not `parser.c`, stop here. @@ -297,7 +313,8 @@ where write_file(&src_path.join("parser.c"), c_code)?; write_file(&src_path.join("node-types.json"), node_types_json)?; - fs::create_dir_all(&header_path)?; + fs::create_dir_all(&header_path) + .map_err(|e| GenerateError::IO(IoError::new(&e, Some(header_path.as_path()))))?; write_file(&header_path.join("alloc.h"), ALLOC_HEADER)?; write_file(&header_path.join("array.h"), ARRAY_HEADER)?; write_file(&header_path.join("parser.h"), PARSER_HEADER)?; @@ -413,9 +430,8 @@ fn read_grammar_version(repo_path: &Path) -> Result, ParseVersio let json = path .exists() .then(|| { - let contents = fs::read_to_string(path.as_path()).map_err(|e| { - ParseVersionError::IO(format!("Failed to read `{}` -- {e}", path.display())) - })?; + let contents = fs::read_to_string(path.as_path()) + .map_err(|e| ParseVersionError::IO(IoError::new(&e, Some(path.as_path()))))?; serde_json::from_str::(&contents).map_err(|e| { ParseVersionError::JSON(format!("Failed to parse `{}` -- {e}", path.display())) }) @@ -449,14 +465,16 @@ pub fn load_grammar_file( } match grammar_path.extension().and_then(|e| e.to_str()) { Some("js") => Ok(load_js_grammar_file(grammar_path, js_runtime)?), - Some("json") => Ok(fs::read_to_string(grammar_path)?), + Some("json") => Ok(fs::read_to_string(grammar_path) + .map_err(|e| LoadGrammarError::IO(IoError::new(&e, Some(grammar_path))))?), _ => Err(LoadGrammarError::FileExtension(grammar_path.to_owned()))?, } } #[cfg(feature = "load")] fn load_js_grammar_file(grammar_path: &Path, js_runtime: Option<&str>) -> JSResult { - let grammar_path = dunce::canonicalize(grammar_path)?; + let grammar_path = dunce::canonicalize(grammar_path) + .map_err(|e| JSError::IO(IoError::new(&e, Some(grammar_path))))?; #[cfg(feature = "qjs-rt")] if js_runtime == Some("native") { @@ -497,7 +515,9 @@ fn load_js_grammar_file(grammar_path: &Path, js_runtime: Option<&str>) -> JSResu let mut js_stdin = js_process .stdin .take() - .ok_or_else(|| JSError::IO(format!("Failed to open stdin for `{js_runtime}`")))?; + .ok_or_else(|| JSError::JSRuntimeStdin { + runtime: js_runtime.to_string(), + })?; let cli_version = Version::parse(env!("CARGO_PKG_VERSION"))?; write!( @@ -507,21 +527,26 @@ fn load_js_grammar_file(grammar_path: &Path, js_runtime: Option<&str>) -> JSResu globalThis.TREE_SITTER_CLI_VERSION_PATCH = {};", cli_version.major, cli_version.minor, cli_version.patch, ) - .map_err(|e| { - JSError::IO(format!( - "Failed to write tree-sitter version to `{js_runtime}`'s stdin -- {e}" - )) - })?; - js_stdin.write(include_bytes!("./dsl.js")).map_err(|e| { - JSError::IO(format!( - "Failed to write grammar dsl to `{js_runtime}`'s stdin -- {e}" - )) + .map_err(|e| JSError::JSRuntimeWrite { + runtime: js_runtime.to_string(), + item: "tree-sitter version".to_string(), + error: e.to_string(), })?; + js_stdin + .write(include_bytes!("./dsl.js")) + .map_err(|e| JSError::JSRuntimeWrite { + runtime: js_runtime.to_string(), + item: "grammar dsl".to_string(), + error: e.to_string(), + })?; drop(js_stdin); let output = js_process .wait_with_output() - .map_err(|e| JSError::IO(format!("Failed to read output from `{js_runtime}` -- {e}")))?; + .map_err(|e| JSError::JSRuntimeRead { + runtime: js_runtime.to_string(), + error: e.to_string(), + })?; match output.status.code() { Some(0) => { let stdout = String::from_utf8(output.stdout).map_err(|e| JSError::JSRuntimeUtf8 { @@ -537,9 +562,15 @@ fn load_js_grammar_file(grammar_path: &Path, js_runtime: Option<&str>) -> JSResu grammar_json = &stdout[pos + 1..]; let mut stdout = std::io::stdout().lock(); - stdout.write_all(node_output.as_bytes())?; - stdout.write_all(b"\n")?; - stdout.flush()?; + stdout + .write_all(node_output.as_bytes()) + .map_err(|e| JSError::IO(IoError::new(&e, None)))?; + stdout + .write_all(b"\n") + .map_err(|e| JSError::IO(IoError::new(&e, None)))?; + stdout + .flush() + .map_err(|e| JSError::IO(IoError::new(&e, None)))?; } Ok(serde_json::to_string_pretty(&serde_json::from_str::< @@ -559,8 +590,7 @@ fn load_js_grammar_file(grammar_path: &Path, js_runtime: Option<&str>) -> JSResu #[cfg(feature = "load")] pub fn write_file(path: &Path, body: impl AsRef<[u8]>) -> GenerateResult<()> { - fs::write(path, body) - .map_err(|e| GenerateError::IO(format!("Failed to write {:?} -- {e}", path.file_name()))) + fs::write(path, body).map_err(|e| GenerateError::IO(IoError::new(&e, Some(path)))) } #[cfg(test)] diff --git a/crates/generate/src/quickjs.rs b/crates/generate/src/quickjs.rs index 689615fc..848030e8 100644 --- a/crates/generate/src/quickjs.rs +++ b/crates/generate/src/quickjs.rs @@ -10,7 +10,7 @@ use rquickjs::{ Context, Ctx, Function, Module, Object, Runtime, Type, Value, }; -use super::{JSError, JSResult}; +use super::{IoError, JSError, JSResult}; const DSL: &[u8] = include_bytes!("dsl.js"); @@ -266,10 +266,10 @@ pub fn execute_native_runtime(grammar_path: &Path) -> JSResult { let loader = ScriptLoader::default().with_extension("mjs"); runtime.set_loader(resolver, loader); - let cwd = std::env::current_dir()?; + let cwd = std::env::current_dir().map_err(|e| JSError::IO(IoError::new(&e, None)))?; let relative_path = pathdiff::diff_paths(grammar_path, &cwd) .map(|p| p.to_string_lossy().to_string()) - .ok_or_else(|| JSError::IO("Failed to get relative path".to_string()))?; + .ok_or(JSError::RelativePath)?; context.with(|ctx| -> JSResult { let globals = ctx.globals(); From 0df2916920760371a73e7618c40c88221f0329f9 Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Fri, 31 Oct 2025 11:58:20 +0100 Subject: [PATCH 569/663] bulild(deps): cargo update --- Cargo.lock | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 726289b9..03146c9b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -67,22 +67,22 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.10" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -1401,9 +1401,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.41" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -1784,9 +1784,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.108" +version = "2.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" dependencies = [ "proc-macro2", "quote", @@ -2039,7 +2039,7 @@ dependencies = [ "log", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -2095,7 +2095,7 @@ dependencies = [ "serde", "serde_json", "tempfile", - "thiserror 2.0.16", + "thiserror 2.0.17", "tree-sitter", "tree-sitter-highlight", "tree-sitter-tags", @@ -2123,9 +2123,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-segmentation" From 57e3a7b2ca5837677c7198d47207d6e15eaa7a73 Mon Sep 17 00:00:00 2001 From: Valeriy Kosikhin Date: Mon, 17 Nov 2025 15:17:25 +0300 Subject: [PATCH 570/663] fix(loader): set correct runtime host for cc while cross-compiling Pass the BUILD_TARGET variable from the build environment as 'host' for the cc crate. Otherwise, when cross-compiled, cc will keep looking for a cross-compiler instead of the native one on the target system. Signed-off-by: Valeriy Kosikhin --- crates/loader/src/loader.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index 08d6af84..cf2c1a77 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -557,7 +557,6 @@ impl Config { } const BUILD_TARGET: &str = env!("BUILD_TARGET"); -const BUILD_HOST: &str = env!("BUILD_HOST"); pub struct LanguageConfiguration<'a> { pub scope: Option, @@ -1107,7 +1106,10 @@ impl Loader { .cargo_metadata(false) .cargo_warnings(false) .target(BUILD_TARGET) - .host(BUILD_HOST) + // BUILD_TARGET from the build environment becomes a runtime host for cc. + // Otherwise, when cross compiled, cc will keep looking for a cross-compiler + // on the target system instead of the native compiler. + .host(BUILD_TARGET) .debug(self.debug_build) .file(&config.parser_path) .includes(&config.header_paths) From 3072d35ed5f7dcd01a67c9ee04264e8bd9a730f7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Nov 2025 21:13:38 +0000 Subject: [PATCH 571/663] build(deps): bump the cargo group with 2 updates Bumps the cargo group with 2 updates: [cc](https://github.com/rust-lang/cc-rs) and [wasmparser](https://github.com/bytecodealliance/wasm-tools). Updates `cc` from 1.2.45 to 1.2.46 - [Release notes](https://github.com/rust-lang/cc-rs/releases) - [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md) - [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.45...cc-v1.2.46) Updates `wasmparser` from 0.240.0 to 0.241.2 - [Release notes](https://github.com/bytecodealliance/wasm-tools/releases) - [Commits](https://github.com/bytecodealliance/wasm-tools/commits) --- updated-dependencies: - dependency-name: cc dependency-version: 1.2.46 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: wasmparser dependency-version: 0.241.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 14 +++++++------- Cargo.toml | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 03146c9b..ce5d678b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -187,9 +187,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.45" +version = "1.2.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" +checksum = "b97463e1064cb1b1c1384ad0a0b9c8abd0988e2a91f52606c80ef14aadb63e36" dependencies = [ "find-msvc-tools", "shlex", @@ -664,9 +664,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" [[package]] name = "fnv" @@ -2026,7 +2026,7 @@ dependencies = [ "tree-sitter-tests-proc-macro", "unindent", "walkdir", - "wasmparser 0.240.0", + "wasmparser 0.241.2", "webbrowser", "widestring", ] @@ -2270,9 +2270,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.240.0" +version = "0.241.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b722dcf61e0ea47440b53ff83ccb5df8efec57a69d150e4f24882e4eba7e24a4" +checksum = "46d90019b1afd4b808c263e428de644f3003691f243387d30d673211ee0cb8e8" dependencies = [ "bitflags 2.10.0", "hashbrown 0.15.5", diff --git a/Cargo.toml b/Cargo.toml index 5afc53b5..cc3520fe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -106,7 +106,7 @@ ansi_colours = "1.2.3" anstyle = "1.0.13" anyhow = "1.0.100" bstr = "1.12.0" -cc = "1.2.45" +cc = "1.2.46" clap = { version = "4.5.51", features = [ "cargo", "derive", @@ -150,7 +150,7 @@ tiny_http = "0.12.0" topological-sort = "0.2.2" unindent = "0.2.4" walkdir = "2.5.0" -wasmparser = "0.240.0" +wasmparser = "0.241.2" webbrowser = "1.0.5" tree-sitter = { version = "0.26.0", path = "./lib" } From f3012a999d94c65254a6fd91e4da0928e1369c99 Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Mon, 13 Oct 2025 23:07:05 +0200 Subject: [PATCH 572/663] feat(bindings): expose the queries dynamically Available in the Rust, Python, and Node bindings Co-authored-by: ObserverOfTime --- crates/cli/src/init.rs | 223 +++++++++++++++++++++---- crates/cli/src/templates/.editorconfig | 2 +- crates/cli/src/templates/__init__.py | 33 ++-- crates/cli/src/templates/__init__.pyi | 18 +- crates/cli/src/templates/build.rs | 17 ++ crates/cli/src/templates/index.d.ts | 39 ++++- crates/cli/src/templates/index.js | 26 ++- crates/cli/src/templates/lib.rs | 19 ++- crates/loader/src/loader.rs | 34 ++-- 9 files changed, 335 insertions(+), 76 deletions(-) diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index 62923441..deb64292 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -14,7 +14,11 @@ use semver::Version; use serde::{Deserialize, Serialize}; use serde_json::{Map, Value}; use tree_sitter_generate::write_file; -use tree_sitter_loader::{Author, Bindings, Grammar, Links, Metadata, PathsJSON, TreeSitterJSON}; +use tree_sitter_loader::{ + Author, Bindings, Grammar, Links, Metadata, PathsJSON, TreeSitterJSON, + DEFAULT_HIGHLIGHTS_QUERY_FILE_NAME, DEFAULT_INJECTIONS_QUERY_FILE_NAME, + DEFAULT_LOCALS_QUERY_FILE_NAME, DEFAULT_TAGS_QUERY_FILE_NAME, +}; const CLI_VERSION: &str = env!("CARGO_PKG_VERSION"); const CLI_VERSION_PLACEHOLDER: &str = "CLI_VERSION"; @@ -60,6 +64,11 @@ const AUTHOR_EMAIL_PLACEHOLDER_GRAMMAR: &str = " PARSER_AUTHOR_EMAIL"; const FUNDING_URL_PLACEHOLDER: &str = "FUNDING_URL"; +const HIGHLIGHTS_QUERY_PATH_PLACEHOLDER: &str = "HIGHLIGHTS_QUERY_PATH"; +const INJECTIONS_QUERY_PATH_PLACEHOLDER: &str = "INJECTIONS_QUERY_PATH"; +const LOCALS_QUERY_PATH_PLACEHOLDER: &str = "LOCALS_QUERY_PATH"; +const TAGS_QUERY_PATH_PLACEHOLDER: &str = "TAGS_QUERY_PATH"; + const GRAMMAR_JS_TEMPLATE: &str = include_str!("./templates/grammar.js"); const PACKAGE_JSON_TEMPLATE: &str = include_str!("./templates/package.json"); const GITIGNORE_TEMPLATE: &str = include_str!("./templates/gitignore"); @@ -205,6 +214,10 @@ struct GenerateOpts<'a> { camel_parser_name: &'a str, title_parser_name: &'a str, class_name: &'a str, + highlights_query_path: &'a str, + injections_query_path: &'a str, + locals_query_path: &'a str, + tags_query_path: &'a str, } pub fn generate_grammar_files( @@ -255,6 +268,20 @@ pub fn generate_grammar_files( .clone() .unwrap_or_else(|| format!("TreeSitter{}", language_name.to_upper_camel_case())); + fn pathsjson_to_variable<'a>(paths_json: &'a PathsJSON, default: &'a PathBuf) -> &'a str { + match paths_json { + PathsJSON::Empty => Some(default), + PathsJSON::Single(path_buf) => Some(path_buf), + PathsJSON::Multiple(paths) => paths.first(), + } + .map_or("", |path| path.as_os_str().to_str().unwrap_or("")) + } + + let default_highlights_path = Path::new("queries").join(DEFAULT_HIGHLIGHTS_QUERY_FILE_NAME); + let default_injections_path = Path::new("queries").join(DEFAULT_INJECTIONS_QUERY_FILE_NAME); + let default_locals_path = Path::new("queries").join(DEFAULT_LOCALS_QUERY_FILE_NAME); + let default_tags_path = Path::new("queries").join(DEFAULT_TAGS_QUERY_FILE_NAME); + let generate_opts = GenerateOpts { author_name: authors .map(|a| a.first().map(|a| a.name.as_str())) @@ -281,6 +308,22 @@ pub fn generate_grammar_files( camel_parser_name: &camel_name, title_parser_name: &title_name, class_name: &class_name, + highlights_query_path: pathsjson_to_variable( + &tree_sitter_config.grammars[0].highlights, + &default_highlights_path, + ), + injections_query_path: pathsjson_to_variable( + &tree_sitter_config.grammars[0].injections, + &default_injections_path, + ), + locals_query_path: pathsjson_to_variable( + &tree_sitter_config.grammars[0].locals, + &default_locals_path, + ), + tags_query_path: pathsjson_to_variable( + &tree_sitter_config.grammars[0].tags, + &default_tags_path, + ), }; // Create package.json @@ -388,8 +431,47 @@ pub fn generate_grammar_files( // Generate Rust bindings if tree_sitter_config.bindings.rust { missing_path(bindings_dir.join("rust"), create_dir)?.apply(|path| { - missing_path(path.join("lib.rs"), |path| { + missing_path_else(path.join("lib.rs"), allow_update, |path| { generate_file(path, LIB_RS_TEMPLATE, language_name, &generate_opts) + }, |path| { + let mut contents = fs::read_to_string(path)?; + if !contents.contains("#[cfg(with_highlights_query)]") { + let replacement = indoc! {r#" + #[cfg(with_highlights_query)] + /// The syntax highlighting query for this grammar. + pub const HIGHLIGHTS_QUERY: &str = include_str!("../../HIGHLIGHTS_QUERY_PATH"); + + #[cfg(with_injections_query)] + /// The language injection query for this grammar. + pub const INJECTIONS_QUERY: &str = include_str!("../../INJECTIONS_QUERY_PATH"); + + #[cfg(with_locals_query)] + /// The local variable query for this grammar. + pub const LOCALS_QUERY: &str = include_str!("../../LOCALS_QUERY_PATH"); + + #[cfg(with_tags_query)] + /// The symbol tagging query for this grammar. + pub const TAGS_QUERY: &str = include_str!("../../TAGS_QUERY_PATH"); + "#} + .replace("HIGHLIGHTS_QUERY_PATH", generate_opts.highlights_query_path) + .replace("INJECTIONS_QUERY_PATH", generate_opts.injections_query_path) + .replace("LOCALS_QUERY_PATH", generate_opts.locals_query_path) + .replace("TAGS_QUERY_PATH", generate_opts.tags_query_path); + contents = contents + .replace( + indoc! {r#" + // NOTE: uncomment these to include any queries that this grammar contains: + + // pub const HIGHLIGHTS_QUERY: &str = include_str!("../../queries/highlights.scm"); + // pub const INJECTIONS_QUERY: &str = include_str!("../../queries/injections.scm"); + // pub const LOCALS_QUERY: &str = include_str!("../../queries/locals.scm"); + // pub const TAGS_QUERY: &str = include_str!("../../queries/tags.scm"); + "#}, + &replacement, + ); + } + write_file(path, contents)?; + Ok(()) })?; missing_path_else( @@ -397,27 +479,29 @@ pub fn generate_grammar_files( allow_update, |path| generate_file(path, BUILD_RS_TEMPLATE, language_name, &generate_opts), |path| { - let replacement = indoc!{r#" - c_config.flag("-utf-8"); + let mut contents = fs::read_to_string(path)?; + if !contents.contains("wasm32-unknown-unknown") { + let replacement = indoc!{r#" + c_config.flag("-utf-8"); - if std::env::var("TARGET").unwrap() == "wasm32-unknown-unknown" { - let Ok(wasm_headers) = std::env::var("DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS") else { - panic!("Environment variable DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS must be set by the language crate"); - }; - let Ok(wasm_src) = - std::env::var("DEP_TREE_SITTER_LANGUAGE_WASM_SRC").map(std::path::PathBuf::from) - else { - panic!("Environment variable DEP_TREE_SITTER_LANGUAGE_WASM_SRC must be set by the language crate"); - }; + if std::env::var("TARGET").unwrap() == "wasm32-unknown-unknown" { + let Ok(wasm_headers) = std::env::var("DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS") else { + panic!("Environment variable DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS must be set by the language crate"); + }; + let Ok(wasm_src) = + std::env::var("DEP_TREE_SITTER_LANGUAGE_WASM_SRC").map(std::path::PathBuf::from) + else { + panic!("Environment variable DEP_TREE_SITTER_LANGUAGE_WASM_SRC must be set by the language crate"); + }; - c_config.include(&wasm_headers); - c_config.files([ - wasm_src.join("stdio.c"), - wasm_src.join("stdlib.c"), - wasm_src.join("string.c"), - ]); - } - "#}; + c_config.include(&wasm_headers); + c_config.files([ + wasm_src.join("stdio.c"), + wasm_src.join("stdlib.c"), + wasm_src.join("string.c"), + ]); + } + "#}; let indented_replacement = replacement .lines() @@ -425,11 +509,48 @@ pub fn generate_grammar_files( .collect::>() .join("\n"); - let mut contents = fs::read_to_string(path)?; - if !contents.contains("wasm32-unknown-unknown") { contents = contents.replace(r#" c_config.flag("-utf-8");"#, &indented_replacement); } + // Introduce configuration variables for dynamic query inclusion + if !contents.contains("with_highlights_query") { + let replaced = indoc! {r#" + c_config.compile("tree-sitter-KEBAB_PARSER_NAME"); + }"#} + .replace("KEBAB_PARSER_NAME", &language_name.to_kebab_case()); + + let replacement = indoc! {r#" + c_config.compile("tree-sitter-KEBAB_PARSER_NAME"); + + println!("cargo:rustc-check-cfg=cfg(with_highlights_query)"); + if !"HIGHLIGHTS_QUERY_PATH".is_empty() && std::path::Path::new("HIGHLIGHTS_QUERY_PATH").exists() { + println!("cargo:rustc-cfg=with_highlights_query"); + } + println!("cargo:rustc-check-cfg=cfg(with_injections_query)"); + if !"INJECTIONS_QUERY_PATH".is_empty() && std::path::Path::new("INJECTIONS_QUERY_PATH").exists() { + println!("cargo:rustc-cfg=with_injections_query"); + } + println!("cargo:rustc-check-cfg=cfg(with_locals_query)"); + if !"LOCALS_QUERY_PATH".is_empty() && std::path::Path::new("LOCALS_QUERY_PATH").exists() { + println!("cargo:rustc-cfg=with_locals_query"); + } + println!("cargo:rustc-check-cfg=cfg(with_tags_query)"); + if !"TAGS_QUERY_PATH".is_empty() && std::path::Path::new("TAGS_QUERY_PATH").exists() { + println!("cargo:rustc-cfg=with_tags_query"); + } + }"#} + .replace("KEBAB_PARSER_NAME", &language_name.to_kebab_case()) + .replace("HIGHLIGHTS_QUERY_PATH", generate_opts.highlights_query_path) + .replace("INJECTIONS_QUERY_PATH", generate_opts.injections_query_path) + .replace("LOCALS_QUERY_PATH", generate_opts.locals_query_path) + .replace("TAGS_QUERY_PATH", generate_opts.tags_query_path); + + contents = contents.replace( + &replaced, + &replacement, + ); + } + write_file(path, contents)?; Ok(()) }, @@ -468,7 +589,7 @@ pub fn generate_grammar_files( |path| generate_file(path, INDEX_JS_TEMPLATE, language_name, &generate_opts), |path| { let contents = fs::read_to_string(path)?; - if !contents.contains("new URL") { + if !contents.contains("Object.defineProperty") { warn!("Replacing index.js"); generate_file(path, INDEX_JS_TEMPLATE, language_name, &generate_opts)?; } @@ -476,9 +597,19 @@ pub fn generate_grammar_files( }, )?; - missing_path(path.join("index.d.ts"), |path| { - generate_file(path, INDEX_D_TS_TEMPLATE, language_name, &generate_opts) - })?; + missing_path_else( + path.join("index.d.ts"), + allow_update, + |path| generate_file(path, INDEX_D_TS_TEMPLATE, language_name, &generate_opts), + |path| { + let contents = fs::read_to_string(path)?; + if !contents.contains("export default binding") { + warn!("Replacing index.d.ts"); + generate_file(path, INDEX_D_TS_TEMPLATE, language_name, &generate_opts)?; + } + Ok(()) + }, + )?; missing_path_else( path.join("binding_test.js"), @@ -717,9 +848,21 @@ pub fn generate_grammar_files( }, )?; - missing_path(lang_path.join("__init__.py"), |path| { - generate_file(path, INIT_PY_TEMPLATE, language_name, &generate_opts) - })?; + missing_path_else( + lang_path.join("__init__.py"), + allow_update, + |path| { + generate_file(path, INIT_PY_TEMPLATE, language_name, &generate_opts) + }, + |path| { + let contents = fs::read_to_string(path)?; + if !contents.contains("uncomment these to include any queries") { + warn!("Replacing __init__.py"); + generate_file(path, INIT_PY_TEMPLATE, language_name, &generate_opts)?; + } + Ok(()) + }, + )?; missing_path_else( lang_path.join("__init__.pyi"), @@ -727,7 +870,10 @@ pub fn generate_grammar_files( |path| generate_file(path, INIT_PYI_TEMPLATE, language_name, &generate_opts), |path| { let mut contents = fs::read_to_string(path)?; - if !contents.contains("CapsuleType") { + if contents.contains("uncomment these to include any queries") { + warn!("Replacing __init__.pyi"); + generate_file(path, INIT_PYI_TEMPLATE, language_name, &generate_opts)?; + } else if !contents.contains("CapsuleType") { contents = contents .replace( "from typing import Final", @@ -990,7 +1136,20 @@ fn generate_file( PARSER_VERSION_PLACEHOLDER, &generate_opts.version.to_string(), ) - .replace(PARSER_CLASS_NAME_PLACEHOLDER, generate_opts.class_name); + .replace(PARSER_CLASS_NAME_PLACEHOLDER, generate_opts.class_name) + .replace( + HIGHLIGHTS_QUERY_PATH_PLACEHOLDER, + generate_opts.highlights_query_path, + ) + .replace( + INJECTIONS_QUERY_PATH_PLACEHOLDER, + generate_opts.injections_query_path, + ) + .replace( + LOCALS_QUERY_PATH_PLACEHOLDER, + generate_opts.locals_query_path, + ) + .replace(TAGS_QUERY_PATH_PLACEHOLDER, generate_opts.tags_query_path); if let Some(name) = generate_opts.author_name { replacement = replacement.replace(AUTHOR_NAME_PLACEHOLDER, name); diff --git a/crates/cli/src/templates/.editorconfig b/crates/cli/src/templates/.editorconfig index 65330c40..c4650c59 100644 --- a/crates/cli/src/templates/.editorconfig +++ b/crates/cli/src/templates/.editorconfig @@ -7,7 +7,7 @@ charset = utf-8 indent_style = space indent_size = 2 -[*.js] +[*.{js,ts}] indent_style = space indent_size = 2 diff --git a/crates/cli/src/templates/__init__.py b/crates/cli/src/templates/__init__.py index fd137b0f..784887a7 100644 --- a/crates/cli/src/templates/__init__.py +++ b/crates/cli/src/templates/__init__.py @@ -6,32 +6,33 @@ from ._binding import language def _get_query(name, file): - query = _files(f"{__package__}.queries") / file - globals()[name] = query.read_text() + try: + query = _files(f"{__package__}") / file + globals()[name] = query.read_text() + except FileNotFoundError: + globals()[name] = None return globals()[name] def __getattr__(name): - # NOTE: uncomment these to include any queries that this grammar contains: - - # if name == "HIGHLIGHTS_QUERY": - # return _get_query("HIGHLIGHTS_QUERY", "highlights.scm") - # if name == "INJECTIONS_QUERY": - # return _get_query("INJECTIONS_QUERY", "injections.scm") - # if name == "LOCALS_QUERY": - # return _get_query("LOCALS_QUERY", "locals.scm") - # if name == "TAGS_QUERY": - # return _get_query("TAGS_QUERY", "tags.scm") + if name == "HIGHLIGHTS_QUERY": + return _get_query("HIGHLIGHTS_QUERY", "HIGHLIGHTS_QUERY_PATH") + if name == "INJECTIONS_QUERY": + return _get_query("INJECTIONS_QUERY", "INJECTIONS_QUERY_PATH") + if name == "LOCALS_QUERY": + return _get_query("LOCALS_QUERY", "LOCALS_QUERY_PATH") + if name == "TAGS_QUERY": + return _get_query("TAGS_QUERY", "TAGS_QUERY_PATH") raise AttributeError(f"module {__name__!r} has no attribute {name!r}") __all__ = [ "language", - # "HIGHLIGHTS_QUERY", - # "INJECTIONS_QUERY", - # "LOCALS_QUERY", - # "TAGS_QUERY", + "HIGHLIGHTS_QUERY", + "INJECTIONS_QUERY", + "LOCALS_QUERY", + "TAGS_QUERY", ] diff --git a/crates/cli/src/templates/__init__.pyi b/crates/cli/src/templates/__init__.pyi index 5c63215d..5c88ff6c 100644 --- a/crates/cli/src/templates/__init__.pyi +++ b/crates/cli/src/templates/__init__.pyi @@ -1,11 +1,17 @@ from typing import Final from typing_extensions import CapsuleType -# NOTE: uncomment these to include any queries that this grammar contains: +HIGHLIGHTS_QUERY: Final[str] | None +"""The syntax highlighting query for this grammar.""" -# HIGHLIGHTS_QUERY: Final[str] -# INJECTIONS_QUERY: Final[str] -# LOCALS_QUERY: Final[str] -# TAGS_QUERY: Final[str] +INJECTIONS_QUERY: Final[str] | None +"""The language injection query for this grammar.""" -def language() -> CapsuleType: ... +LOCALS_QUERY: Final[str] | None +"""The local variable query for this grammar.""" + +TAGS_QUERY: Final[str] | None +"""The symbol tagging query for this grammar.""" + +def language() -> CapsuleType: + """The tree-sitter language function for this grammar.""" diff --git a/crates/cli/src/templates/build.rs b/crates/cli/src/templates/build.rs index 272d8961..e3fffe4b 100644 --- a/crates/cli/src/templates/build.rs +++ b/crates/cli/src/templates/build.rs @@ -36,4 +36,21 @@ fn main() { } c_config.compile("tree-sitter-KEBAB_PARSER_NAME"); + + println!("cargo:rustc-check-cfg=cfg(with_highlights_query)"); + if !"HIGHLIGHTS_QUERY_PATH".is_empty() && std::path::Path::new("HIGHLIGHTS_QUERY_PATH").exists() { + println!("cargo:rustc-cfg=with_highlights_query"); + } + println!("cargo:rustc-check-cfg=cfg(with_injections_query)"); + if !"INJECTIONS_QUERY_PATH".is_empty() && std::path::Path::new("INJECTIONS_QUERY_PATH").exists() { + println!("cargo:rustc-cfg=with_injections_query"); + } + println!("cargo:rustc-check-cfg=cfg(with_locals_query)"); + if !"LOCALS_QUERY_PATH".is_empty() && std::path::Path::new("LOCALS_QUERY_PATH").exists() { + println!("cargo:rustc-cfg=with_locals_query"); + } + println!("cargo:rustc-check-cfg=cfg(with_tags_query)"); + if !"TAGS_QUERY_PATH".is_empty() && std::path::Path::new("TAGS_QUERY_PATH").exists() { + println!("cargo:rustc-cfg=with_tags_query"); + } } diff --git a/crates/cli/src/templates/index.d.ts b/crates/cli/src/templates/index.d.ts index 528e060f..24576d32 100644 --- a/crates/cli/src/templates/index.d.ts +++ b/crates/cli/src/templates/index.d.ts @@ -18,10 +18,43 @@ type NodeInfo = children: ChildNode[]; }); -type Language = { +/** + * The tree-sitter language object for this grammar. + * + * @see {@linkcode https://tree-sitter.github.io/node-tree-sitter/interfaces/Parser.Language.html Parser.Language} + * + * @example + * import Parser from "tree-sitter"; + * import CAMEL_PARSER_NAME from "tree-sitter-KEBAB_PARSER_NAME"; + * + * const parser = new Parser(); + * parser.setLanguage(CAMEL_PARSER_NAME); + */ +declare const binding: { + /** + * The inner language object. + * @private + */ language: unknown; + + /** + * The content of the `node-types.json` file for this grammar. + * + * @see {@linkplain https://tree-sitter.github.io/tree-sitter/using-parsers/6-static-node-types Static Node Types} + */ nodeTypeInfo: NodeInfo[]; + + /** The syntax highlighting query for this grammar. */ + HIGHLIGHTS_QUERY?: string; + + /** The language injection query for this grammar. */ + INJECTIONS_QUERY?: string; + + /** The local variable query for this grammar. */ + LOCALS_QUERY?: string; + + /** The symbol tagging query for this grammar. */ + TAGS_QUERY?: string; }; -declare const language: Language; -export = language; +export default binding; diff --git a/crates/cli/src/templates/index.js b/crates/cli/src/templates/index.js index 4b363040..b3edc2e3 100644 --- a/crates/cli/src/templates/index.js +++ b/crates/cli/src/templates/index.js @@ -1,3 +1,4 @@ +import { readFileSync } from "node:fs"; import { fileURLToPath } from "node:url"; const root = fileURLToPath(new URL("../..", import.meta.url)); @@ -8,8 +9,29 @@ const binding = typeof process.versions.bun === "string" : (await import("node-gyp-build")).default(root); try { - const nodeTypes = await import(`${root}/src/node-types.json`, {with: {type: "json"}}); + const nodeTypes = await import(`${root}/src/node-types.json`, { with: { type: "json" } }); binding.nodeTypeInfo = nodeTypes.default; -} catch (_) {} +} catch { } + +const queries = [ + ["HIGHLIGHTS_QUERY", `${root}/HIGHLIGHTS_QUERY_PATH`], + ["INJECTIONS_QUERY", `${root}/INJECTIONS_QUERY_PATH`], + ["LOCALS_QUERY", `${root}/LOCALS_QUERY_PATH`], + ["TAGS_QUERY", `${root}/TAGS_QUERY_PATH`], +]; + +for (const [prop, path] of queries) { + Object.defineProperty(binding, prop, { + configurable: true, + enumerable: true, + get() { + delete binding[prop]; + try { + binding[prop] = readFileSync(path, "utf8"); + } catch { } + return binding[prop]; + } + }); +} export default binding; diff --git a/crates/cli/src/templates/lib.rs b/crates/cli/src/templates/lib.rs index 8478f488..1e8c9ca3 100644 --- a/crates/cli/src/templates/lib.rs +++ b/crates/cli/src/templates/lib.rs @@ -32,12 +32,21 @@ pub const LANGUAGE: LanguageFn = unsafe { LanguageFn::from_raw(tree_sitter_PARSE /// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers/6-static-node-types pub const NODE_TYPES: &str = include_str!("../../src/node-types.json"); -// NOTE: uncomment these to include any queries that this grammar contains: +#[cfg(with_highlights_query)] +/// The syntax highlighting query for this grammar. +pub const HIGHLIGHTS_QUERY: &str = include_str!("../../HIGHLIGHTS_QUERY_PATH"); -// pub const HIGHLIGHTS_QUERY: &str = include_str!("../../queries/highlights.scm"); -// pub const INJECTIONS_QUERY: &str = include_str!("../../queries/injections.scm"); -// pub const LOCALS_QUERY: &str = include_str!("../../queries/locals.scm"); -// pub const TAGS_QUERY: &str = include_str!("../../queries/tags.scm"); +#[cfg(with_injections_query)] +/// The language injection query for this grammar. +pub const INJECTIONS_QUERY: &str = include_str!("../../INJECTIONS_QUERY_PATH"); + +#[cfg(with_locals_query)] +/// The local variable query for this grammar. +pub const LOCALS_QUERY: &str = include_str!("../../LOCALS_QUERY_PATH"); + +#[cfg(with_tags_query)] +/// The symbol tagging query for this grammar. +pub const TAGS_QUERY: &str = include_str!("../../TAGS_QUERY_PATH"); #[cfg(test)] mod tests { diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index cf2c1a77..7c2e5226 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -245,6 +245,14 @@ impl std::fmt::Display for WasiSDKClangError { } } +pub const DEFAULT_HIGHLIGHTS_QUERY_FILE_NAME: &str = "highlights.scm"; + +pub const DEFAULT_INJECTIONS_QUERY_FILE_NAME: &str = "injections.scm"; + +pub const DEFAULT_LOCALS_QUERY_FILE_NAME: &str = "locals.scm"; + +pub const DEFAULT_TAGS_QUERY_FILE_NAME: &str = "tags.scm"; + #[derive(Default, Deserialize, Serialize)] pub struct Config { #[serde(default)] @@ -1764,21 +1772,21 @@ impl LanguageConfiguration<'_> { Some( paths .iter() - .filter(|p| p.ends_with("highlights.scm")) + .filter(|p| p.ends_with(DEFAULT_HIGHLIGHTS_QUERY_FILE_NAME)) .cloned() .collect::>(), ), Some( paths .iter() - .filter(|p| p.ends_with("tags.scm")) + .filter(|p| p.ends_with(DEFAULT_TAGS_QUERY_FILE_NAME)) .cloned() .collect::>(), ), Some( paths .iter() - .filter(|p| p.ends_with("locals.scm")) + .filter(|p| p.ends_with(DEFAULT_LOCALS_QUERY_FILE_NAME)) .cloned() .collect::>(), ), @@ -1793,7 +1801,7 @@ impl LanguageConfiguration<'_> { } else { self.highlights_filenames.as_deref() }, - "highlights.scm", + DEFAULT_HIGHLIGHTS_QUERY_FILE_NAME, )?; let (injections_query, injection_ranges) = self.read_queries( if injections_filenames.is_some() { @@ -1801,7 +1809,7 @@ impl LanguageConfiguration<'_> { } else { self.injections_filenames.as_deref() }, - "injections.scm", + DEFAULT_INJECTIONS_QUERY_FILE_NAME, )?; let (locals_query, locals_ranges) = self.read_queries( if locals_filenames.is_some() { @@ -1809,7 +1817,7 @@ impl LanguageConfiguration<'_> { } else { self.locals_filenames.as_deref() }, - "locals.scm", + DEFAULT_LOCALS_QUERY_FILE_NAME, )?; if highlights_query.is_empty() { @@ -1871,10 +1879,12 @@ impl LanguageConfiguration<'_> { pub fn tags_config(&self, language: Language) -> LoaderResult> { self.tags_config .get_or_try_init(|| { - let (tags_query, tags_ranges) = - self.read_queries(self.tags_filenames.as_deref(), "tags.scm")?; - let (locals_query, locals_ranges) = - self.read_queries(self.locals_filenames.as_deref(), "locals.scm")?; + let (tags_query, tags_ranges) = self + .read_queries(self.tags_filenames.as_deref(), DEFAULT_TAGS_QUERY_FILE_NAME)?; + let (locals_query, locals_ranges) = self.read_queries( + self.locals_filenames.as_deref(), + DEFAULT_LOCALS_QUERY_FILE_NAME, + )?; if tags_query.is_empty() { Ok(None) } else { @@ -1947,7 +1957,9 @@ impl LanguageConfiguration<'_> { } } else { // highlights.scm is needed to test highlights, and tags.scm to test tags - if default_path == "highlights.scm" || default_path == "tags.scm" { + if default_path == DEFAULT_HIGHLIGHTS_QUERY_FILE_NAME + || default_path == DEFAULT_TAGS_QUERY_FILE_NAME + { warn!( concat!( "You should add a `{}` entry pointing to the {} path in the `tree-sitter` ", From 0e1f715ef1b2b5b69530284f64b1969c4cb625a8 Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Wed, 5 Nov 2025 15:16:33 +0100 Subject: [PATCH 573/663] Move PathsJSON method, reformat --- crates/cli/src/init.rs | 47 ++++++++++++++----------------------- crates/loader/src/loader.rs | 11 +++++++++ 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index deb64292..0164cc8f 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -268,15 +268,6 @@ pub fn generate_grammar_files( .clone() .unwrap_or_else(|| format!("TreeSitter{}", language_name.to_upper_camel_case())); - fn pathsjson_to_variable<'a>(paths_json: &'a PathsJSON, default: &'a PathBuf) -> &'a str { - match paths_json { - PathsJSON::Empty => Some(default), - PathsJSON::Single(path_buf) => Some(path_buf), - PathsJSON::Multiple(paths) => paths.first(), - } - .map_or("", |path| path.as_os_str().to_str().unwrap_or("")) - } - let default_highlights_path = Path::new("queries").join(DEFAULT_HIGHLIGHTS_QUERY_FILE_NAME); let default_injections_path = Path::new("queries").join(DEFAULT_INJECTIONS_QUERY_FILE_NAME); let default_locals_path = Path::new("queries").join(DEFAULT_LOCALS_QUERY_FILE_NAME); @@ -308,22 +299,18 @@ pub fn generate_grammar_files( camel_parser_name: &camel_name, title_parser_name: &title_name, class_name: &class_name, - highlights_query_path: pathsjson_to_variable( - &tree_sitter_config.grammars[0].highlights, - &default_highlights_path, - ), - injections_query_path: pathsjson_to_variable( - &tree_sitter_config.grammars[0].injections, - &default_injections_path, - ), - locals_query_path: pathsjson_to_variable( - &tree_sitter_config.grammars[0].locals, - &default_locals_path, - ), - tags_query_path: pathsjson_to_variable( - &tree_sitter_config.grammars[0].tags, - &default_tags_path, - ), + highlights_query_path: tree_sitter_config.grammars[0] + .highlights + .to_variable_value(&default_highlights_path), + injections_query_path: tree_sitter_config.grammars[0] + .injections + .to_variable_value(&default_injections_path), + locals_query_path: tree_sitter_config.grammars[0] + .locals + .to_variable_value(&default_locals_path), + tags_query_path: tree_sitter_config.grammars[0] + .tags + .to_variable_value(&default_tags_path), }; // Create package.json @@ -503,11 +490,11 @@ pub fn generate_grammar_files( } "#}; - let indented_replacement = replacement - .lines() - .map(|line| if line.is_empty() { line.to_string() } else { format!(" {line}") }) - .collect::>() - .join("\n"); + let indented_replacement = replacement + .lines() + .map(|line| if line.is_empty() { line.to_string() } else { format!(" {line}") }) + .collect::>() + .join("\n"); contents = contents.replace(r#" c_config.flag("-utf-8");"#, &indented_replacement); } diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index 7c2e5226..28618be6 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -284,6 +284,17 @@ impl PathsJSON { const fn is_empty(&self) -> bool { matches!(self, Self::Empty) } + + /// Represent this set of paths as a string that can be included in templates + #[must_use] + pub fn to_variable_value<'a>(&'a self, default: &'a PathBuf) -> &'a str { + match self { + Self::Empty => Some(default), + Self::Single(path_buf) => Some(path_buf), + Self::Multiple(paths) => paths.first(), + } + .map_or("", |path| path.as_os_str().to_str().unwrap_or("")) + } } #[derive(Serialize, Deserialize, Clone)] From 877782a8a41d830f9e7f0f22dfcb67b3c2e50418 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Sat, 1 Nov 2025 05:25:00 -0400 Subject: [PATCH 574/663] fix(docs): update cli docs to reflect changes to various subcommand arguments --- crates/cli/src/main.rs | 11 +++-------- docs/src/cli/fuzz.md | 12 ++++++++++++ docs/src/cli/generate.md | 6 +++++- docs/src/cli/highlight.md | 4 ++++ docs/src/cli/parse.md | 14 +++++++++++--- docs/src/cli/playground.md | 8 ++++---- docs/src/cli/query.md | 12 ++++++++++++ docs/src/cli/tags.md | 4 ++++ docs/src/cli/test.md | 12 ++++++++++++ docs/src/cli/version.md | 8 ++++++++ 10 files changed, 75 insertions(+), 16 deletions(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index d9f8c174..1c7fa957 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -261,15 +261,10 @@ struct Parse { #[arg(long)] pub open_log: bool, /// Deprecated: use --json-summary - #[arg( - long, - short = 'j', - conflicts_with = "json_summary", - conflicts_with = "stat" - )] + #[arg(long, conflicts_with = "json_summary", conflicts_with = "stat")] pub json: bool, /// Output parsing results in a JSON format - #[arg(long, conflicts_with = "json", conflicts_with = "stat")] + #[arg(long, short = 'j', conflicts_with = "json", conflicts_with = "stat")] pub json_summary: bool, /// The path to an alternative config.json file #[arg(long)] @@ -348,7 +343,7 @@ struct Test { /// Show only the pass-fail overview tree #[arg(long)] pub overview_only: bool, - /// Output the test summary in a JSON output + /// Output the test summary in a JSON format #[arg(long)] pub json_summary: bool, } diff --git a/docs/src/cli/fuzz.md b/docs/src/cli/fuzz.md index 1f79bc00..7f97f9ba 100644 --- a/docs/src/cli/fuzz.md +++ b/docs/src/cli/fuzz.md @@ -17,6 +17,18 @@ A list of test names to skip fuzzing. The directory containing the parser. This is primarily useful in multi-language repositories. +### `-p/--grammar-path` + +The path to the directory containing the grammar. + +### `--lib-path` + +The path to the parser's dynamic library. This is used instead of the cached or automatically generated dynamic library. + +### `--lang-name` + +If `--lib-path` is used, the name of the language used to extract the library's language function + ### `--edits ` The maximum number of edits to perform. The default is 3. diff --git a/docs/src/cli/generate.md b/docs/src/cli/generate.md index 32c8437a..c373b1e2 100644 --- a/docs/src/cli/generate.md +++ b/docs/src/cli/generate.md @@ -44,7 +44,7 @@ Print the overview of states from the given rule. This is useful for debugging a item sets for all given states in a given rule. To solely view state count numbers for rules, pass in `-` for the rule argument. To view the overview of states for every rule, pass in `*` for the rule argument. -### `--json` +### `--json-summary` Report conflicts in a JSON format. @@ -54,3 +54,7 @@ The path to the JavaScript runtime executable to use when generating the parser. Note that you can also set this with `TREE_SITTER_JS_RUNTIME`. Starting from version 0.26.0, you can also pass in `native` to use the native QuickJS runtime that comes bundled with the CLI. This avoids the dependency on a JavaScript runtime entirely. + +### `--disable-optimization` + +Disable optimizations when generating the parser. Currently, this only affects the merging of compatible parse states. diff --git a/docs/src/cli/highlight.md b/docs/src/cli/highlight.md index 1378e0f6..82c9e25c 100644 --- a/docs/src/cli/highlight.md +++ b/docs/src/cli/highlight.md @@ -57,3 +57,7 @@ The path to an alternative configuration (`config.json`) file. See [the init-con ### `-n/--test-number ` Highlight the contents of a specific test. + +### `-r/--rebuild` + +Force a rebuild of the parser before running the fuzzer. diff --git a/docs/src/cli/parse.md b/docs/src/cli/parse.md index 9f76b550..178d97b5 100644 --- a/docs/src/cli/parse.md +++ b/docs/src/cli/parse.md @@ -1,8 +1,8 @@ # `tree-sitter parse` The `parse` command parses source files using a Tree-sitter parser. You can pass any number of file paths and glob patterns -to `tree-sitter parse`, and it will parse all the given files. The command will exit with a non-zero status code if any -parse errors occurred. +to `tree-sitter parse`, and it will parse all the given files. If no paths are provided, input will be parsed from stdin. +The command will exit with a non-zero status code if any parse errors occurred. ```bash tree-sitter parse [OPTIONS] [PATHS]... # Aliases: p @@ -18,6 +18,14 @@ The path to a file that contains paths to source files to parse. The path to the directory containing the grammar. +### `-l/--lib-path` + +The path to the parser's dynamic library. This is used instead of the cached or automatically generated dynamic library. + +### `--lang-name` + +If `--lib-path` is used, the name of the language used to extract the library's language function + ### `--scope ` The language scope to use for parsing. This is useful when the language is ambiguous. @@ -81,7 +89,7 @@ in `UTF-16BE` or `UTF-16LE`. If no `BOM` is present, `UTF-8` is the default. One When using the `--debug-graph` option, open the log file in the default browser. -### `-j/--json` +### `-j/--json-summary` Output parsing results in a JSON format. diff --git a/docs/src/cli/playground.md b/docs/src/cli/playground.md index 0dbff469..7c2ef598 100644 --- a/docs/src/cli/playground.md +++ b/docs/src/cli/playground.md @@ -13,10 +13,6 @@ For this to work, you must have already built the parser as a Wasm module. This ## Options -### `-e/--export ` - -Export static playground files to the specified directory instead of serving them. - ### `-q/--quiet` Don't automatically open the playground in the default browser. @@ -24,3 +20,7 @@ Don't automatically open the playground in the default browser. ### `--grammar-path ` The path to the directory containing the grammar and wasm files. + +### `-e/--export ` + +Export static playground files to the specified directory instead of serving them. diff --git a/docs/src/cli/query.md b/docs/src/cli/query.md index ed96aa51..395ca486 100644 --- a/docs/src/cli/query.md +++ b/docs/src/cli/query.md @@ -12,6 +12,14 @@ tree-sitter query [OPTIONS] [PATHS]... # Aliases: q The path to the directory containing the grammar. +### `--lib-path` + +The path to the parser's dynamic library. This is used instead of the cached or automatically generated dynamic library. + +### `--lang-name` + +If `--lib-path` is used, the name of the language used to extract the library's language function + ### `-t/--time` Print the time taken to execute the query on the file. @@ -51,3 +59,7 @@ The path to an alternative configuration (`config.json`) file. See [the init-con ### `-n/--test-number ` Query the contents of a specific test. + +### `-r/--rebuild` + +Force a rebuild of the parser before executing the query. diff --git a/docs/src/cli/tags.md b/docs/src/cli/tags.md index 80ee1baa..a48fabb4 100644 --- a/docs/src/cli/tags.md +++ b/docs/src/cli/tags.md @@ -36,3 +36,7 @@ The path to an alternative configuration (`config.json`) file. See [the init-con ### `-n/--test-number ` Generate tags from the contents of a specific test. + +### `-r/--rebuild` + +Force a rebuild of the parser before running the tags. diff --git a/docs/src/cli/test.md b/docs/src/cli/test.md index c1724745..401bcd39 100644 --- a/docs/src/cli/test.md +++ b/docs/src/cli/test.md @@ -24,6 +24,14 @@ Only run tests from the given filename in the corpus. The path to the directory containing the grammar. +### `--lib-path` + +The path to the parser's dynamic library. This is used instead of the cached or automatically generated dynamic library. + +### `--lang-name` + +If `--lib-path` is used, the name of the language used to extract the library's language function + ### `-u/--update` Update the expected output of tests. @@ -78,3 +86,7 @@ Force a rebuild of the parser before running tests. ### `--overview-only` Only show the overview of the test results, and not the diff. + +### `--json-summary` + +Output the test summary in a JSON format. diff --git a/docs/src/cli/version.md b/docs/src/cli/version.md index e8f7a840..ab699d2a 100644 --- a/docs/src/cli/version.md +++ b/docs/src/cli/version.md @@ -42,3 +42,11 @@ tree-sitter version ### `-p/--grammar-path ` The path to the directory containing the grammar. + +### `--bump` + +Automatically bump the version. Possible values are: + +- `patch`: Bump the patch version. +- `minor`: Bump the minor version. +- `major`: Bump the major version. From 55b9a25c8449c58b28bfcc8e28b454529309ce7f Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Sun, 26 Oct 2025 16:51:08 +0100 Subject: [PATCH 575/663] docs: New page about ABI versions for parser users Closes #374. The statement about the intended backwards compatibility is purely speculative and provided as a "straw man" to help reviewers come up with a better description of the intended backwards compatibility. --- docs/src/SUMMARY.md | 1 + docs/src/using-parsers/7-abi-versions.md | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 docs/src/using-parsers/7-abi-versions.md diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index 6e6eed94..231085ae 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -15,6 +15,7 @@ - [Predicates and Directives](./using-parsers/queries/3-predicates-and-directives.md) - [API](./using-parsers/queries/4-api.md) - [Static Node Types](./using-parsers/6-static-node-types.md) + - [ABI versions](./using-parsers/7-abi-versions.md) - [Creating Parsers](./creating-parsers/index.md) - [Getting Started](./creating-parsers/1-getting-started.md) - [The Grammar DSL](./creating-parsers/2-the-grammar-dsl.md) diff --git a/docs/src/using-parsers/7-abi-versions.md b/docs/src/using-parsers/7-abi-versions.md new file mode 100644 index 00000000..6845a9c4 --- /dev/null +++ b/docs/src/using-parsers/7-abi-versions.md @@ -0,0 +1,19 @@ +# ABI versions + +Parsers generated with tree-sitter have an associated ABI version. This version specifies the shape of the C code that they contain, which they expose to applications. + +A given version of tree-sitter is only able to load parsers which have certain ABI versions: + +| tree-sitter version | Min parser ABI version | Max parser ABI version | +|---------------------|------------------------|------------------------| +| 0.14 | 9 | 9 | +| >=0.15.0, <=0.15.7 | 9 | 10 | +| >=0.15.8, <=0.16 | 9 | 11 | +| 0.17, 0.18 | 9 | 12 | +| >=0.19, <=0.20.2 | 13 | 13 | +| >=0.20.3, <=0.24 | 13 | 14 | +| >=0.25 | 13 | 15 | + +Tree-sitter developers aim to maintain compatibility with the previous ABI version at least. + +Parser authors are able to specify the ABI version they want to use by specifying it with the `--abi` option of the `tree-sitter generate` command. From 42e7e9c3e7bfe491f5cec80706dfa900bc86aeaa Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Wed, 5 Nov 2025 12:31:17 +0100 Subject: [PATCH 576/663] Integrate rewording suggestions --- docs/src/using-parsers/7-abi-versions.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/src/using-parsers/7-abi-versions.md b/docs/src/using-parsers/7-abi-versions.md index 6845a9c4..7badf713 100644 --- a/docs/src/using-parsers/7-abi-versions.md +++ b/docs/src/using-parsers/7-abi-versions.md @@ -1,6 +1,6 @@ # ABI versions -Parsers generated with tree-sitter have an associated ABI version. This version specifies the shape of the C code that they contain, which they expose to applications. +Parsers generated with tree-sitter have an associated ABI version. This version establishes hard compatibility boundaries between the generated parser and the tree-sitter library. A given version of tree-sitter is only able to load parsers which have certain ABI versions: @@ -14,6 +14,7 @@ A given version of tree-sitter is only able to load parsers which have certain A | >=0.20.3, <=0.24 | 13 | 14 | | >=0.25 | 13 | 15 | -Tree-sitter developers aim to maintain compatibility with the previous ABI version at least. - -Parser authors are able to specify the ABI version they want to use by specifying it with the `--abi` option of the `tree-sitter generate` command. +By default, parsers are generated using the latest available ABI. Grammar authors can specify an older ABI via the `--abi` option to the `generate` command: +``` +tree-sitter generate --abi= +``` From 02508d557043740b2c2a9b0eea82aa324e3032f6 Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Fri, 7 Nov 2025 08:01:01 +0100 Subject: [PATCH 577/663] Apply suggestions from code review Co-authored-by: Christian Clason --- docs/src/using-parsers/7-abi-versions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/using-parsers/7-abi-versions.md b/docs/src/using-parsers/7-abi-versions.md index 7badf713..d9df678a 100644 --- a/docs/src/using-parsers/7-abi-versions.md +++ b/docs/src/using-parsers/7-abi-versions.md @@ -2,7 +2,7 @@ Parsers generated with tree-sitter have an associated ABI version. This version establishes hard compatibility boundaries between the generated parser and the tree-sitter library. -A given version of tree-sitter is only able to load parsers which have certain ABI versions: +A given version of the tree-sitter library is only able to load parsers which have certain ABI versions: | tree-sitter version | Min parser ABI version | Max parser ABI version | |---------------------|------------------------|------------------------| @@ -14,7 +14,7 @@ A given version of tree-sitter is only able to load parsers which have certain A | >=0.20.3, <=0.24 | 13 | 14 | | >=0.25 | 13 | 15 | -By default, parsers are generated using the latest available ABI. Grammar authors can specify an older ABI via the `--abi` option to the `generate` command: +By default, the tree-sitter CLI will generate parser using the latest available ABI for that version. Grammar authors can specify an older ABI (within the constraints _of the CLI_, which may be stricter than the library!) via the `--abi` option to the `generate` command: ``` tree-sitter generate --abi= ``` From 120f74723e694be4dc2f0033e01b24350dd73f19 Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Thu, 20 Nov 2025 09:56:01 +0100 Subject: [PATCH 578/663] =?UTF-8?q?docs:=20fix=20typo=20in=20the=20page=20?= =?UTF-8?q?about=20ABI=C2=A0version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Of course I only catch that once they are already published… --- docs/src/using-parsers/7-abi-versions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/using-parsers/7-abi-versions.md b/docs/src/using-parsers/7-abi-versions.md index d9df678a..30b6dcdf 100644 --- a/docs/src/using-parsers/7-abi-versions.md +++ b/docs/src/using-parsers/7-abi-versions.md @@ -14,7 +14,7 @@ A given version of the tree-sitter library is only able to load parsers which ha | >=0.20.3, <=0.24 | 13 | 14 | | >=0.25 | 13 | 15 | -By default, the tree-sitter CLI will generate parser using the latest available ABI for that version. Grammar authors can specify an older ABI (within the constraints _of the CLI_, which may be stricter than the library!) via the `--abi` option to the `generate` command: +By default, the tree-sitter CLI will generate parsers using the latest available ABI for that version. Grammar authors can specify an older ABI (within the constraints _of the CLI_, which may be stricter than the library!) via the `--abi` option to the `generate` command: ``` tree-sitter generate --abi= ``` From 60635e07299e167b82dd38d5f324955a7157d604 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Fri, 31 Oct 2025 15:28:58 +0200 Subject: [PATCH 579/663] fix(generate): add node_modules to quickjs resolver --- crates/generate/src/quickjs.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/generate/src/quickjs.rs b/crates/generate/src/quickjs.rs index 848030e8..b7960db2 100644 --- a/crates/generate/src/quickjs.rs +++ b/crates/generate/src/quickjs.rs @@ -261,6 +261,7 @@ pub fn execute_native_runtime(grammar_path: &Path) -> JSResult { let context = Context::full(&runtime)?; let resolver = FileResolver::default() + .with_path("./node_modules") .with_path("./") .with_pattern("{}.mjs"); let loader = ScriptLoader::default().with_extension("mjs"); From 320c0865e90d8599ed9d2fb5113913f133fef5f3 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Tue, 11 Nov 2025 04:27:23 -0500 Subject: [PATCH 580/663] feat(cli): don't bail after first version update fails --- crates/cli/src/version.rs | 41 ++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/crates/cli/src/version.rs b/crates/cli/src/version.rs index 39cd5481..e7601186 100644 --- a/crates/cli/src/version.rs +++ b/crates/cli/src/version.rs @@ -2,7 +2,7 @@ use std::{fs, path::PathBuf, process::Command}; use anyhow::{anyhow, Context, Result}; use clap::ValueEnum; -use log::{info, warn}; +use log::{error, info, warn}; use regex::Regex; use semver::Version as SemverVersion; use std::cmp::Ordering; @@ -84,44 +84,57 @@ impl Version { let is_multigrammar = tree_sitter_json.grammars.len() > 1; - self.update_treesitter_json().with_context(|| { + let mut has_failure = false; + let mut record_failures = |result: anyhow::Result<()>| { + if let Err(e) = result { + has_failure = true; + error!("{e}"); + } + }; + + record_failures(self.update_treesitter_json().with_context(|| { format!( "Failed to update tree-sitter.json at {}", self.current_dir.display() ) - })?; - self.update_cargo_toml().with_context(|| { + })); + record_failures(self.update_cargo_toml().with_context(|| { format!( "Failed to update Cargo.toml at {}", self.current_dir.display() ) - })?; - self.update_package_json().with_context(|| { + })); + record_failures(self.update_package_json().with_context(|| { format!( "Failed to update package.json at {}", self.current_dir.display() ) - })?; - self.update_makefile(is_multigrammar).with_context(|| { + })); + record_failures(self.update_makefile(is_multigrammar).with_context(|| { format!( "Failed to update Makefile at {}", self.current_dir.display() ) - })?; - self.update_cmakelists_txt().with_context(|| { + })); + record_failures(self.update_cmakelists_txt().with_context(|| { format!( "Failed to update CMakeLists.txt at {}", self.current_dir.display() ) - })?; - self.update_pyproject_toml().with_context(|| { + })); + record_failures(self.update_pyproject_toml().with_context(|| { format!( "Failed to update pyproject.toml at {}", self.current_dir.display() ) - })?; + })); - Ok(()) + if has_failure { + // Return an empty error message to prevent double-reporting + Err(anyhow!("")) + } else { + Ok(()) + } } fn update_treesitter_json(&self) -> Result<()> { From d592b16ac0eb67d5e6cee060a3bfec451cf9b7ac Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Tue, 11 Nov 2025 04:32:37 -0500 Subject: [PATCH 581/663] fix(docs): list dependencies on external tooling for `version` command --- docs/src/cli/version.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/src/cli/version.md b/docs/src/cli/version.md index ab699d2a..c2d526a7 100644 --- a/docs/src/cli/version.md +++ b/docs/src/cli/version.md @@ -37,6 +37,11 @@ To print the current version without bumping it, use: tree-sitter version ``` +Note that some of the binding updates require access to external tooling: + +* Updating Cargo.toml and Cargo.lock bindings requires that `cargo` is installed. +* Updating package-lock.json requires that `npm` is installed. + ## Options ### `-p/--grammar-path ` From b095968dff0f606eed8b319db033b92e41109766 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Wed, 12 Nov 2025 01:26:10 -0500 Subject: [PATCH 582/663] refactor(cli): clean up version updating code This commit adds proper error types when updating the version across files --- Cargo.lock | 1 + crates/cli/Cargo.toml | 1 + crates/cli/src/main.rs | 2 +- crates/cli/src/version.rs | 364 ++++++++++++++++++++------------------ 4 files changed, 195 insertions(+), 173 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ce5d678b..5e95e3a6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2016,6 +2016,7 @@ dependencies = [ "similar", "streaming-iterator", "tempfile", + "thiserror 2.0.17", "tiny_http", "tree-sitter", "tree-sitter-config", diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 31626eb2..c10b4652 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -60,6 +60,7 @@ serde.workspace = true serde_json.workspace = true similar.workspace = true streaming-iterator.workspace = true +thiserror.workspace = true tiny_http.workspace = true walkdir.workspace = true wasmparser.workspace = true diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 1c7fa957..3f83bf5f 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -1394,7 +1394,7 @@ impl Test { impl Version { fn run(self, current_dir: PathBuf) -> Result<()> { - version::Version::new(self.version, current_dir, self.bump).run() + Ok(version::Version::new(self.version, current_dir, self.bump).run()?) } } diff --git a/crates/cli/src/version.rs b/crates/cli/src/version.rs index e7601186..9406b58c 100644 --- a/crates/cli/src/version.rs +++ b/crates/cli/src/version.rs @@ -1,8 +1,7 @@ use std::{fs, path::PathBuf, process::Command}; -use anyhow::{anyhow, Context, Result}; use clap::ValueEnum; -use log::{error, info, warn}; +use log::{info, warn}; use regex::Regex; use semver::Version as SemverVersion; use std::cmp::Ordering; @@ -22,6 +21,36 @@ pub struct Version { pub bump: Option, } +#[derive(thiserror::Error, Debug)] +pub enum VersionError { + #[error(transparent)] + Json(#[from] serde_json::Error), + #[error(transparent)] + Io(#[from] std::io::Error), + #[error("Failed to update one or more files:\n\n{0}")] + Update(UpdateErrors), +} + +#[derive(thiserror::Error, Debug)] +pub struct UpdateErrors(Vec); + +impl std::fmt::Display for UpdateErrors { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + for error in &self.0 { + writeln!(f, "{error}\n")?; + } + Ok(()) + } +} + +#[derive(thiserror::Error, Debug)] +pub enum UpdateError { + #[error("Failed to update {1}:\n{0}")] + Io(std::io::Error, PathBuf), + #[error("Failed to run `{0}`:\n{1}")] + Command(&'static str, String), +} + impl Version { #[must_use] pub const fn new( @@ -36,7 +65,7 @@ impl Version { } } - pub fn run(mut self) -> Result<()> { + pub fn run(mut self) -> Result<(), VersionError> { let tree_sitter_json = self.current_dir.join("tree-sitter.json"); let tree_sitter_json = @@ -84,111 +113,100 @@ impl Version { let is_multigrammar = tree_sitter_json.grammars.len() > 1; - let mut has_failure = false; - let mut record_failures = |result: anyhow::Result<()>| { + let mut errors = Vec::new(); + + // Helper to push errors into the errors vector, returns true if an error was pushed + let mut push_err = |result: Result<(), UpdateError>| -> bool { if let Err(e) = result { - has_failure = true; - error!("{e}"); + errors.push(e); + return true; } + false }; - record_failures(self.update_treesitter_json().with_context(|| { - format!( - "Failed to update tree-sitter.json at {}", - self.current_dir.display() - ) - })); - record_failures(self.update_cargo_toml().with_context(|| { - format!( - "Failed to update Cargo.toml at {}", - self.current_dir.display() - ) - })); - record_failures(self.update_package_json().with_context(|| { - format!( - "Failed to update package.json at {}", - self.current_dir.display() - ) - })); - record_failures(self.update_makefile(is_multigrammar).with_context(|| { - format!( - "Failed to update Makefile at {}", - self.current_dir.display() - ) - })); - record_failures(self.update_cmakelists_txt().with_context(|| { - format!( - "Failed to update CMakeLists.txt at {}", - self.current_dir.display() - ) - })); - record_failures(self.update_pyproject_toml().with_context(|| { - format!( - "Failed to update pyproject.toml at {}", - self.current_dir.display() - ) - })); + push_err(self.update_treesitter_json()); - if has_failure { - // Return an empty error message to prevent double-reporting - Err(anyhow!("")) - } else { + // Only update Cargo.lock if Cargo.toml was updated + push_err(self.update_cargo_toml()).then(|| push_err(self.update_cargo_lock())); + + // Only update package-lock.json if package.json was updated + push_err(self.update_package_json()).then(|| push_err(self.update_package_lock_json())); + + push_err(self.update_makefile(is_multigrammar)); + push_err(self.update_cmakelists_txt()); + push_err(self.update_pyproject_toml()); + + if errors.is_empty() { Ok(()) + } else { + Err(VersionError::Update(UpdateErrors(errors))) } } - fn update_treesitter_json(&self) -> Result<()> { - let tree_sitter_json = &fs::read_to_string(self.current_dir.join("tree-sitter.json"))?; + fn update_file_with(&self, path: &PathBuf, update_fn: F) -> Result<(), UpdateError> + where + F: Fn(&str) -> String, + { + let content = fs::read_to_string(path).map_err(|e| UpdateError::Io(e, path.clone()))?; + let updated_content = update_fn(&content); + fs::write(path, updated_content).map_err(|e| UpdateError::Io(e, path.clone())) + } - let tree_sitter_json = tree_sitter_json - .lines() - .map(|line| { - if line.contains("\"version\":") { - let prefix_index = line.find("\"version\":").unwrap() + "\"version\":".len(); - let start_quote = line[prefix_index..].find('"').unwrap() + prefix_index + 1; - let end_quote = line[start_quote + 1..].find('"').unwrap() + start_quote + 1; + fn update_treesitter_json(&self) -> Result<(), UpdateError> { + let json_path = self.current_dir.join("tree-sitter.json"); + self.update_file_with(&json_path, |content| { + content + .lines() + .map(|line| { + if line.contains("\"version\":") { + let prefix_index = + line.find("\"version\":").unwrap() + "\"version\":".len(); + let start_quote = + line[prefix_index..].find('"').unwrap() + prefix_index + 1; + let end_quote = + line[start_quote + 1..].find('"').unwrap() + start_quote + 1; - format!( - "{}{}{}", - &line[..start_quote], - self.version.as_ref().unwrap(), - &line[end_quote..] - ) - } else { - line.to_string() - } - }) - .collect::>() - .join("\n") - + "\n"; + format!( + "{}{}{}", + &line[..start_quote], + self.version.as_ref().unwrap(), + &line[end_quote..] + ) + } else { + line.to_string() + } + }) + .collect::>() + .join("\n") + + "\n" + }) + } - fs::write(self.current_dir.join("tree-sitter.json"), tree_sitter_json)?; + fn update_cargo_toml(&self) -> Result<(), UpdateError> { + let cargo_toml_path = self.current_dir.join("Cargo.toml"); + if !cargo_toml_path.exists() { + return Ok(()); + } + + self.update_file_with(&cargo_toml_path, |content| { + content + .lines() + .map(|line| { + if line.starts_with("version =") { + format!("version = \"{}\"", self.version.as_ref().unwrap()) + } else { + line.to_string() + } + }) + .collect::>() + .join("\n") + + "\n" + })?; Ok(()) } - fn update_cargo_toml(&self) -> Result<()> { - if !self.current_dir.join("Cargo.toml").exists() { - return Ok(()); - } - - let cargo_toml = fs::read_to_string(self.current_dir.join("Cargo.toml"))?; - - let cargo_toml = cargo_toml - .lines() - .map(|line| { - if line.starts_with("version =") { - format!("version = \"{}\"", self.version.as_ref().unwrap()) - } else { - line.to_string() - } - }) - .collect::>() - .join("\n") - + "\n"; - - fs::write(self.current_dir.join("Cargo.toml"), cargo_toml)?; - + fn update_cargo_lock(&self) -> Result<(), UpdateError> { if self.current_dir.join("Cargo.lock").exists() { let Ok(cmd) = Command::new("cargo") .arg("generate-lockfile") @@ -201,8 +219,9 @@ impl Version { if !cmd.status.success() { let stderr = String::from_utf8_lossy(&cmd.stderr); - return Err(anyhow!( - "Failed to run `cargo generate-lockfile`:\n{stderr}" + return Err(UpdateError::Command( + "cargo generate-lockfile", + stderr.to_string(), )); } } @@ -210,37 +229,43 @@ impl Version { Ok(()) } - fn update_package_json(&self) -> Result<()> { - if !self.current_dir.join("package.json").exists() { + fn update_package_json(&self) -> Result<(), UpdateError> { + let package_json_path = self.current_dir.join("package.json"); + if !package_json_path.exists() { return Ok(()); } - let package_json = &fs::read_to_string(self.current_dir.join("package.json"))?; + self.update_file_with(&package_json_path, |content| { + content + .lines() + .map(|line| { + if line.contains("\"version\":") { + let prefix_index = + line.find("\"version\":").unwrap() + "\"version\":".len(); + let start_quote = + line[prefix_index..].find('"').unwrap() + prefix_index + 1; + let end_quote = + line[start_quote + 1..].find('"').unwrap() + start_quote + 1; - let package_json = package_json - .lines() - .map(|line| { - if line.contains("\"version\":") { - let prefix_index = line.find("\"version\":").unwrap() + "\"version\":".len(); - let start_quote = line[prefix_index..].find('"').unwrap() + prefix_index + 1; - let end_quote = line[start_quote + 1..].find('"').unwrap() + start_quote + 1; + format!( + "{}{}{}", + &line[..start_quote], + self.version.as_ref().unwrap(), + &line[end_quote..] + ) + } else { + line.to_string() + } + }) + .collect::>() + .join("\n") + + "\n" + })?; - format!( - "{}{}{}", - &line[..start_quote], - self.version.as_ref().unwrap(), - &line[end_quote..] - ) - } else { - line.to_string() - } - }) - .collect::>() - .join("\n") - + "\n"; - - fs::write(self.current_dir.join("package.json"), package_json)?; + Ok(()) + } + fn update_package_lock_json(&self) -> Result<(), UpdateError> { if self.current_dir.join("package-lock.json").exists() { let Ok(cmd) = Command::new("npm") .arg("install") @@ -253,82 +278,77 @@ impl Version { if !cmd.status.success() { let stderr = String::from_utf8_lossy(&cmd.stderr); - return Err(anyhow!("Failed to run `npm install`:\n{stderr}")); + return Err(UpdateError::Command("npm install", stderr.to_string())); } } Ok(()) } - fn update_makefile(&self, is_multigrammar: bool) -> Result<()> { - let makefile = if is_multigrammar { - if !self.current_dir.join("common").join("common.mak").exists() { - return Ok(()); - } - - fs::read_to_string(self.current_dir.join("Makefile"))? + fn update_makefile(&self, is_multigrammar: bool) -> Result<(), UpdateError> { + let makefile_path = if is_multigrammar { + self.current_dir.join("common").join("common.mak") } else { - if !self.current_dir.join("Makefile").exists() { - return Ok(()); - } - - fs::read_to_string(self.current_dir.join("Makefile"))? + self.current_dir.join("Makefile") }; - let makefile = makefile - .lines() - .map(|line| { - if line.starts_with("VERSION") { - format!("VERSION := {}", self.version.as_ref().unwrap()) - } else { - line.to_string() - } - }) - .collect::>() - .join("\n") - + "\n"; - - fs::write(self.current_dir.join("Makefile"), makefile)?; + self.update_file_with(&makefile_path, |content| { + content + .lines() + .map(|line| { + if line.starts_with("VERSION") { + format!("VERSION := {}", self.version.as_ref().unwrap()) + } else { + line.to_string() + } + }) + .collect::>() + .join("\n") + + "\n" + })?; Ok(()) } - fn update_cmakelists_txt(&self) -> Result<()> { - if !self.current_dir.join("CMakeLists.txt").exists() { + fn update_cmakelists_txt(&self) -> Result<(), UpdateError> { + let cmake_lists_path = self.current_dir.join("CMakeLists.txt"); + if !cmake_lists_path.exists() { return Ok(()); } - let cmake = fs::read_to_string(self.current_dir.join("CMakeLists.txt"))?; - - let re = Regex::new(r#"(\s*VERSION\s+)"[0-9]+\.[0-9]+\.[0-9]+""#)?; - let cmake = re.replace(&cmake, format!(r#"$1"{}""#, self.version.as_ref().unwrap())); - - fs::write(self.current_dir.join("CMakeLists.txt"), cmake.as_bytes())?; + self.update_file_with(&cmake_lists_path, |content| { + let re = Regex::new(r#"(\s*VERSION\s+)"[0-9]+\.[0-9]+\.[0-9]+""#) + .expect("Failed to compile regex"); + re.replace( + content, + format!(r#"$1"{}""#, self.version.as_ref().unwrap()), + ) + .to_string() + })?; Ok(()) } - fn update_pyproject_toml(&self) -> Result<()> { - if !self.current_dir.join("pyproject.toml").exists() { + fn update_pyproject_toml(&self) -> Result<(), UpdateError> { + let pyproject_toml_path = self.current_dir.join("pyproject.toml"); + if !pyproject_toml_path.exists() { return Ok(()); } - let pyproject_toml = fs::read_to_string(self.current_dir.join("pyproject.toml"))?; - - let pyproject_toml = pyproject_toml - .lines() - .map(|line| { - if line.starts_with("version =") { - format!("version = \"{}\"", self.version.as_ref().unwrap()) - } else { - line.to_string() - } - }) - .collect::>() - .join("\n") - + "\n"; - - fs::write(self.current_dir.join("pyproject.toml"), pyproject_toml)?; + self.update_file_with(&pyproject_toml_path, |content| { + content + .lines() + .map(|line| { + if line.starts_with("version =") { + format!("version = \"{}\"", self.version.as_ref().unwrap()) + } else { + line.to_string() + } + }) + .collect::>() + .join("\n") + + "\n" + })?; Ok(()) } From 0d656de98b524a8a20b66e23c08841df4f7e119d Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Thu, 13 Nov 2025 00:09:44 -0500 Subject: [PATCH 583/663] feat(cli): update zig bindings with `version` command --- crates/cli/src/version.rs | 41 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/crates/cli/src/version.rs b/crates/cli/src/version.rs index 9406b58c..757306c7 100644 --- a/crates/cli/src/version.rs +++ b/crates/cli/src/version.rs @@ -135,6 +135,7 @@ impl Version { push_err(self.update_makefile(is_multigrammar)); push_err(self.update_cmakelists_txt()); push_err(self.update_pyproject_toml()); + push_err(self.update_zig_zon()); if errors.is_empty() { Ok(()) @@ -352,4 +353,44 @@ impl Version { Ok(()) } + + fn update_zig_zon(&self) -> Result<(), UpdateError> { + let zig_zon_path = self.current_dir.join("build.zig.zon"); + if !zig_zon_path.exists() { + return Ok(()); + } + + self.update_file_with(&zig_zon_path, |content| { + let zig_version_prefix = ".version ="; + content + .lines() + .map(|line| { + if line + .trim_start_matches(|c: char| c.is_ascii_whitespace()) + .starts_with(zig_version_prefix) + { + let prefix_index = + line.find(zig_version_prefix).unwrap() + zig_version_prefix.len(); + let start_quote = + line[prefix_index..].find('"').unwrap() + prefix_index + 1; + let end_quote = + line[start_quote + 1..].find('"').unwrap() + start_quote + 1; + + format!( + "{}{}{}", + &line[..start_quote], + self.version.as_ref().unwrap(), + &line[end_quote..] + ) + } else { + line.to_string() + } + }) + .collect::>() + .join("\n") + + "\n" + })?; + + Ok(()) + } } From e92a7803eb8835551d48467ba20a139185c61e09 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Thu, 20 Nov 2025 01:10:44 -0500 Subject: [PATCH 584/663] fix(docs): final updates before 0.26.1 - Indicate where xtask looks for wasi-sdk - Indicate where `build --wasm` looks for and downloads wasi-sdk binary to - Mark native runtime as experimental, describe limitations - Note ABI 13 support limitations - Mention that `test --wasm` and `parse --wasm` require `--features=wasm` build --- docs/src/6-contributing.md | 14 ++++++++++++++ docs/src/cli/build.md | 8 +++++++- docs/src/cli/generate.md | 5 +++-- docs/src/cli/parse.md | 2 +- docs/src/cli/test.md | 2 +- docs/src/using-parsers/7-abi-versions.md | 14 ++++++++------ 6 files changed, 34 insertions(+), 11 deletions(-) diff --git a/docs/src/6-contributing.md b/docs/src/6-contributing.md index 001d6337..a99ddc09 100644 --- a/docs/src/6-contributing.md +++ b/docs/src/6-contributing.md @@ -83,6 +83,18 @@ cargo xtask generate-fixtures --wasm cargo xtask test-wasm ``` +#### Wasm Stdlib + +The tree-sitter Wasm stdlib can be built via xtask: + +```sh +cargo xtask build-wasm-stdlib +``` + +This command looks for the [Wasi SDK][wasi_sdk] indicated by the `TREE_SITTER_WASI_SDK_PATH` +environment variable. If you don't have the binary, it can be downloaded from wasi-sdk's [releases][wasi-sdk-releases] +page. + ### Debugging The test script has a number of useful flags. You can list them all by running `cargo xtask test -h`. @@ -220,4 +232,6 @@ and the tree-sitter module is fetched from [here][js url]. This, along with the [pypi]: https://pypi.org [rust]: https://rustup.rs [ts repo]: https://github.com/tree-sitter/tree-sitter +[wasi_sdk]: https://github.com/WebAssembly/wasi-sdk +[wasi-sdk-releases]: https://github.com/WebAssembly/wasi-sdk/releases [web-ts]: https://www.npmjs.com/package/web-tree-sitter diff --git a/docs/src/cli/build.md b/docs/src/cli/build.md index 0ad4a922..6863f926 100644 --- a/docs/src/cli/build.md +++ b/docs/src/cli/build.md @@ -18,7 +18,9 @@ will attempt to build the parser in the current working directory. ### `-w/--wasm` -Compile the parser as a Wasm module. +Compile the parser as a Wasm module. This command looks for the [Wasi SDK][wasi_sdk] indicated by the `TREE_SITTER_WASI_SDK_PATH` +environment variable. If you don't have the binary, the CLI will attempt to download it for you to `/tree-sitter/wasi-sdk/`, where +`` is resolved according to the [XDG base directory][XDG] or Window's [Known_Folder_Locations][Known_Folder]. ### `-o/--output` @@ -36,3 +38,7 @@ in the external scanner does so using their allocator. ### `-0/--debug` Compile the parser with debug flags enabled. This is useful when debugging issues that require a debugger like `gdb` or `lldb`. + +[Known_Folder]: https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid +[wasi_sdk]: https://github.com/WebAssembly/wasi-sdk +[XDG]: https://specifications.freedesktop.org/basedir/latest/ diff --git a/docs/src/cli/generate.md b/docs/src/cli/generate.md index c373b1e2..6175381f 100644 --- a/docs/src/cli/generate.md +++ b/docs/src/cli/generate.md @@ -52,8 +52,9 @@ Report conflicts in a JSON format. The path to the JavaScript runtime executable to use when generating the parser. The default is `node`. Note that you can also set this with `TREE_SITTER_JS_RUNTIME`. Starting from version 0.26.0, you can -also pass in `native` to use the native QuickJS runtime that comes bundled with the CLI. This avoids -the dependency on a JavaScript runtime entirely. +also pass in `native` to use the experimental native QuickJS runtime that comes bundled with the CLI. +This avoids the dependency on a JavaScript runtime entirely. The native QuickJS runtime is compatible +with ESM as well as with CommonJS in strict mode. If your grammar depends on `npm` to install dependencies such as base grammars, the native runtime can be used *after* running `npm install`. ### `--disable-optimization` diff --git a/docs/src/cli/parse.md b/docs/src/cli/parse.md index 178d97b5..f18c2edb 100644 --- a/docs/src/cli/parse.md +++ b/docs/src/cli/parse.md @@ -45,7 +45,7 @@ The graphs are constructed with [graphviz dot][dot], and the output is written t ### `--wasm` -Compile and run the parser as a Wasm module. +Compile and run the parser as a Wasm module (only if the tree-sitter CLI was built with `--features=wasm`). ### `--dot` diff --git a/docs/src/cli/test.md b/docs/src/cli/test.md index 401bcd39..f8b8a02d 100644 --- a/docs/src/cli/test.md +++ b/docs/src/cli/test.md @@ -55,7 +55,7 @@ The graphs are constructed with [graphviz dot][dot], and the output is written t ### `--wasm` -Compile and run the parser as a Wasm module. +Compile and run the parser as a Wasm module (only if the tree-sitter CLI was built with `--features=wasm`). ### `--open-log` diff --git a/docs/src/using-parsers/7-abi-versions.md b/docs/src/using-parsers/7-abi-versions.md index 30b6dcdf..34347938 100644 --- a/docs/src/using-parsers/7-abi-versions.md +++ b/docs/src/using-parsers/7-abi-versions.md @@ -1,8 +1,9 @@ # ABI versions -Parsers generated with tree-sitter have an associated ABI version. This version establishes hard compatibility boundaries between the generated parser and the tree-sitter library. +Parsers generated with tree-sitter have an associated ABI version, which establishes hard compatibility boundaries +between the generated parser and the tree-sitter library. -A given version of the tree-sitter library is only able to load parsers which have certain ABI versions: +A given version of the tree-sitter library is only able to load parsers generated with supported ABI versions: | tree-sitter version | Min parser ABI version | Max parser ABI version | |---------------------|------------------------|------------------------| @@ -14,7 +15,8 @@ A given version of the tree-sitter library is only able to load parsers which ha | >=0.20.3, <=0.24 | 13 | 14 | | >=0.25 | 13 | 15 | -By default, the tree-sitter CLI will generate parsers using the latest available ABI for that version. Grammar authors can specify an older ABI (within the constraints _of the CLI_, which may be stricter than the library!) via the `--abi` option to the `generate` command: -``` -tree-sitter generate --abi= -``` +By default, the tree-sitter CLI will generate parsers using the latest available ABI for that version, but an older ABI (supported by the CLI) can be selected by passing the [`--abi` option][abi_option] to the `generate` command. + +Note that the ABI version range supported by the CLI can be smaller than for the library: When a new ABI version is released, older versions will be phased out over a deprecation period, which starts with no longer being able to generate parsers with the oldest ABI version. + +[abi_option]: ../cli/generate.md#--abi-version From 5880df47e26a500022b5bbe89832e039ab1d1049 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 21:19:08 +0000 Subject: [PATCH 585/663] ci: bump actions/checkout from 5 to 6 in the actions group Bumps the actions group with 1 update: [actions/checkout](https://github.com/actions/checkout). Updates `actions/checkout` from 5 to 6 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions ... Signed-off-by: dependabot[bot] --- .github/workflows/backport.yml | 2 +- .github/workflows/bindgen.yml | 2 +- .github/workflows/build.yml | 2 +- .github/workflows/ci.yml | 2 +- .github/workflows/docs.yml | 2 +- .github/workflows/nvim_ts.yml | 4 ++-- .github/workflows/release.yml | 6 +++--- .github/workflows/response.yml | 4 ++-- .github/workflows/reviewers_remove.yml | 2 +- .github/workflows/sanitize.yml | 2 +- .github/workflows/spam.yml | 2 +- .github/workflows/wasm_exports.yml | 2 +- 12 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml index 83992a3f..e747a012 100644 --- a/.github/workflows/backport.yml +++ b/.github/workflows/backport.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Create app token uses: actions/create-github-app-token@v2 diff --git a/.github/workflows/bindgen.yml b/.github/workflows/bindgen.yml index deee3757..1b0d20af 100644 --- a/.github/workflows/bindgen.yml +++ b/.github/workflows/bindgen.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Set up stable Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@v1 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 38fd72af..2a9dd910 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -68,7 +68,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Set up cross-compilation if: matrix.cross diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f10394b2..97a7e378 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Set up stable Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@v1 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index fb23b271..0e4baebf 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Set up Rust uses: actions-rust-lang/setup-rust-toolchain@v1 diff --git a/.github/workflows/nvim_ts.yml b/.github/workflows/nvim_ts.yml index 9dea5304..88e3371f 100644 --- a/.github/workflows/nvim_ts.yml +++ b/.github/workflows/nvim_ts.yml @@ -28,9 +28,9 @@ jobs: NVIM: ${{ matrix.os == 'windows-latest' && 'nvim-win64\\bin\\nvim.exe' || 'nvim' }} NVIM_TS_DIR: nvim-treesitter steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: repository: nvim-treesitter/nvim-treesitter path: ${{ env.NVIM_TS_DIR }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e89b0035..11b0d27b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,7 +20,7 @@ jobs: contents: write steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Download build artifacts uses: actions/download-artifact@v6 @@ -61,7 +61,7 @@ jobs: needs: release steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Set up Rust uses: actions-rust-lang/setup-rust-toolchain@v1 @@ -81,7 +81,7 @@ jobs: directory: [crates/cli/npm, lib/binding_web] steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Set up Node uses: actions/setup-node@v6 diff --git a/.github/workflows/response.yml b/.github/workflows/response.yml index 31e039c8..54dd2021 100644 --- a/.github/workflows/response.yml +++ b/.github/workflows/response.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout script - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: sparse-checkout: .github/scripts/close_unresponsive.js sparse-checkout-cone-mode: false @@ -35,7 +35,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout script - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: sparse-checkout: .github/scripts/remove_response_label.js sparse-checkout-cone-mode: false diff --git a/.github/workflows/reviewers_remove.yml b/.github/workflows/reviewers_remove.yml index 94e8c058..3a389ed4 100644 --- a/.github/workflows/reviewers_remove.yml +++ b/.github/workflows/reviewers_remove.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout script - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: sparse-checkout: .github/scripts/reviewers_remove.js sparse-checkout-cone-mode: false diff --git a/.github/workflows/sanitize.yml b/.github/workflows/sanitize.yml index 2239c673..2f8851dc 100644 --- a/.github/workflows/sanitize.yml +++ b/.github/workflows/sanitize.yml @@ -15,7 +15,7 @@ jobs: TREE_SITTER: ${{ github.workspace }}/target/release/tree-sitter steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Install UBSAN library run: sudo apt-get update -y && sudo apt-get install -y libubsan1 diff --git a/.github/workflows/spam.yml b/.github/workflows/spam.yml index ce3d5e1d..eb1d4a46 100644 --- a/.github/workflows/spam.yml +++ b/.github/workflows/spam.yml @@ -16,7 +16,7 @@ jobs: if: github.event.label.name == 'spam' steps: - name: Checkout script - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: sparse-checkout: .github/scripts/close_spam.js sparse-checkout-cone-mode: false diff --git a/.github/workflows/wasm_exports.yml b/.github/workflows/wasm_exports.yml index d04e1052..af48cf8a 100644 --- a/.github/workflows/wasm_exports.yml +++ b/.github/workflows/wasm_exports.yml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Set up stable Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@v1 From de92a9b4c92b2bf329293070a2ccc87b04f13bc3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 21:19:40 +0000 Subject: [PATCH 586/663] build(deps): bump the cargo group with 4 updates Bumps the cargo group with 4 updates: [cc](https://github.com/rust-lang/cc-rs), [clap](https://github.com/clap-rs/clap), [clap_complete](https://github.com/clap-rs/clap) and [indexmap](https://github.com/indexmap-rs/indexmap). Updates `cc` from 1.2.46 to 1.2.47 - [Release notes](https://github.com/rust-lang/cc-rs/releases) - [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md) - [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.46...cc-v1.2.47) Updates `clap` from 4.5.51 to 4.5.53 - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.51...clap_complete-v4.5.53) Updates `clap_complete` from 4.5.60 to 4.5.61 - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.60...clap_complete-v4.5.61) Updates `indexmap` from 2.12.0 to 2.12.1 - [Changelog](https://github.com/indexmap-rs/indexmap/blob/main/RELEASES.md) - [Commits](https://github.com/indexmap-rs/indexmap/compare/2.12.0...2.12.1) --- updated-dependencies: - dependency-name: cc dependency-version: 1.2.47 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: clap dependency-version: 4.5.53 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: clap_complete dependency-version: 4.5.61 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: indexmap dependency-version: 2.12.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 28 ++++++++++++++-------------- Cargo.toml | 8 ++++---- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5e95e3a6..cf5962b0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -187,9 +187,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.46" +version = "1.2.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97463e1064cb1b1c1384ad0a0b9c8abd0988e2a91f52606c80ef14aadb63e36" +checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07" dependencies = [ "find-msvc-tools", "shlex", @@ -241,9 +241,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.51" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" dependencies = [ "clap_builder", "clap_derive", @@ -251,9 +251,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.51" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" dependencies = [ "anstream", "anstyle", @@ -263,9 +263,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.60" +version = "4.5.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e602857739c5a4291dfa33b5a298aeac9006185229a700e5810a3ef7272d971" +checksum = "39615915e2ece2550c0149addac32fb5bd312c657f43845bb9088cb9c8a7c992" dependencies = [ "clap", ] @@ -775,9 +775,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ "allocator-api2", "equivalent", @@ -915,12 +915,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.16.1", "serde", "serde_core", ] @@ -1541,7 +1541,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bccb7121a123865c8ace4dea42e7ed84d78b90cbaf4ca32c59849d8d210c9672" dependencies = [ - "hashbrown 0.16.0", + "hashbrown 0.16.1", "phf", "relative-path", "rquickjs-sys", diff --git a/Cargo.toml b/Cargo.toml index cc3520fe..c5438b7a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -106,8 +106,8 @@ ansi_colours = "1.2.3" anstyle = "1.0.13" anyhow = "1.0.100" bstr = "1.12.0" -cc = "1.2.46" -clap = { version = "4.5.51", features = [ +cc = "1.2.47" +clap = { version = "4.5.53", features = [ "cargo", "derive", "env", @@ -115,7 +115,7 @@ clap = { version = "4.5.51", features = [ "string", "unstable-styles", ] } -clap_complete = "4.5.60" +clap_complete = "4.5.61" clap_complete_nushell = "4.5.10" crc32fast = "1.5.0" ctor = "0.2.9" @@ -126,7 +126,7 @@ fs4 = "0.12.0" glob = "0.3.3" heck = "0.5.0" html-escape = "0.2.13" -indexmap = "2.11.4" +indexmap = "2.12.1" indoc = "2.0.6" libloading = "0.9.0" log = { version = "0.4.28", features = ["std"] } From 882aa867ebe213f04d3c41e415648c56f912f250 Mon Sep 17 00:00:00 2001 From: skewb1k Date: Mon, 24 Nov 2025 22:41:04 +0300 Subject: [PATCH 587/663] docs: remove manual bindings update steps for scanner Since 66dab20462fcaf2b7ffe77a46af16419a1aded2a, bindings automatically detect external scanner, making the instructions for manual updating outdated. Avoids confusion about missing commented lines in Rust bindings. --- docs/src/creating-parsers/4-external-scanners.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docs/src/creating-parsers/4-external-scanners.md b/docs/src/creating-parsers/4-external-scanners.md index 7d63d04b..05268df7 100644 --- a/docs/src/creating-parsers/4-external-scanners.md +++ b/docs/src/creating-parsers/4-external-scanners.md @@ -23,10 +23,7 @@ grammar({ }); ``` -Then, add another C source file to your project. Its path must be src/scanner.c for the CLI to recognize it. Be sure to add -this file to the sources section of your `binding.gyp` file so that it will be included when your project is compiled by -Node.js and uncomment the appropriate block in your bindings/rust/build.rs file so that it will be included in your Rust -crate. +Then, add another C source file to your project. Its path must be src/scanner.c for the CLI to recognize it. In this new source file, define an [`enum`][enum] type containing the names of all of your external tokens. The ordering of this enum must match the order in your grammar's `externals` array; the actual names do not matter. From d64b863030ff4235181a81d727695562da2c412a Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Sat, 22 Nov 2025 12:02:46 +0100 Subject: [PATCH 588/663] build(deps): bump wasi-sdk to v29 --- crates/loader/src/loader.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index 28618be6..3234abee 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -1441,9 +1441,9 @@ impl Loader { return Err(LoaderError::WasiSDKPlatform); }; - let sdk_filename = format!("wasi-sdk-25.0-{arch_os}.tar.gz"); + let sdk_filename = format!("wasi-sdk-29.0-{arch_os}.tar.gz"); let sdk_url = format!( - "https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-25/{sdk_filename}", + "https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-29/{sdk_filename}", ); info!("Downloading wasi-sdk from {sdk_url}..."); From 829733a35e24577238a81851815db199d11f7ed1 Mon Sep 17 00:00:00 2001 From: Riley Bruins Date: Sat, 22 Nov 2025 17:36:37 -0800 Subject: [PATCH 589/663] fix(query): prevent infinite loop with `+` and `?` quantifiers **Problem:** A query with a `?` quantifier followed by a `+` quantifier would hang at 100% CPU usage while iterating through a tree, regardless of the source content. **Solution:** Collect all quantifiers in one step, and then add the required repeat/optional step logic *after* we have determined the composite quantifier we need to use for the current step. --- crates/cli/src/tests/query_test.rs | 20 ++++++++++ lib/src/query.c | 64 +++++++++++++++++------------- 2 files changed, 57 insertions(+), 27 deletions(-) diff --git a/crates/cli/src/tests/query_test.rs b/crates/cli/src/tests/query_test.rs index b59a1f42..4eb74f6c 100644 --- a/crates/cli/src/tests/query_test.rs +++ b/crates/cli/src/tests/query_test.rs @@ -5032,6 +5032,26 @@ fn test_query_quantified_captures() { ("comment.documentation", "// quuz"), ], }, + Row { + description: "multiple quantifiers should not hang query parsing", + language: get_language("c"), + code: indoc! {" + // foo + // bar + // baz + "}, + pattern: r" + ((comment) ?+ @comment) + ", + // This should be identical to the `*` quantifier. + captures: &[ + ("comment", "// foo"), + ("comment", "// foo"), + ("comment", "// foo"), + ("comment", "// bar"), + ("comment", "// baz"), + ], + }, ]; allocations::record(|| { diff --git a/lib/src/query.c b/lib/src/query.c index 56e32873..d1695549 100644 --- a/lib/src/query.c +++ b/lib/src/query.c @@ -2736,12 +2736,6 @@ static TSQueryError ts_query__parse_pattern( stream_advance(stream); stream_skip_whitespace(stream); - - QueryStep repeat_step = query_step__new(WILDCARD_SYMBOL, depth, false); - repeat_step.alternative_index = starting_step_index; - repeat_step.is_pass_through = true; - repeat_step.alternative_is_immediate = true; - array_push(&self->steps, repeat_step); } // Parse the zero-or-more repetition operator. @@ -2750,21 +2744,6 @@ static TSQueryError ts_query__parse_pattern( stream_advance(stream); stream_skip_whitespace(stream); - - QueryStep repeat_step = query_step__new(WILDCARD_SYMBOL, depth, false); - repeat_step.alternative_index = starting_step_index; - repeat_step.is_pass_through = true; - repeat_step.alternative_is_immediate = true; - array_push(&self->steps, repeat_step); - - // Stop when `step->alternative_index` is `NONE` or it points to - // `repeat_step` or beyond. Note that having just been pushed, - // `repeat_step` occupies slot `self->steps.size - 1`. - QueryStep *step = array_get(&self->steps, starting_step_index); - while (step->alternative_index != NONE && step->alternative_index < self->steps.size - 1) { - step = array_get(&self->steps, step->alternative_index); - } - step->alternative_index = self->steps.size; } // Parse the optional operator. @@ -2773,12 +2752,6 @@ static TSQueryError ts_query__parse_pattern( stream_advance(stream); stream_skip_whitespace(stream); - - QueryStep *step = array_get(&self->steps, starting_step_index); - while (step->alternative_index != NONE && step->alternative_index < self->steps.size) { - step = array_get(&self->steps, step->alternative_index); - } - step->alternative_index = self->steps.size; } // Parse an '@'-prefixed capture pattern @@ -2822,6 +2795,43 @@ static TSQueryError ts_query__parse_pattern( } } + QueryStep repeat_step; + QueryStep *step; + switch (quantifier) { + case TSQuantifierOneOrMore: + repeat_step = query_step__new(WILDCARD_SYMBOL, depth, false); + repeat_step.alternative_index = starting_step_index; + repeat_step.is_pass_through = true; + repeat_step.alternative_is_immediate = true; + array_push(&self->steps, repeat_step); + break; + case TSQuantifierZeroOrMore: + repeat_step = query_step__new(WILDCARD_SYMBOL, depth, false); + repeat_step.alternative_index = starting_step_index; + repeat_step.is_pass_through = true; + repeat_step.alternative_is_immediate = true; + array_push(&self->steps, repeat_step); + + // Stop when `step->alternative_index` is `NONE` or it points to + // `repeat_step` or beyond. Note that having just been pushed, + // `repeat_step` occupies slot `self->steps.size - 1`. + step = array_get(&self->steps, starting_step_index); + while (step->alternative_index != NONE && step->alternative_index < self->steps.size - 1) { + step = array_get(&self->steps, step->alternative_index); + } + step->alternative_index = self->steps.size; + break; + case TSQuantifierZeroOrOne: + step = array_get(&self->steps, starting_step_index); + while (step->alternative_index != NONE && step->alternative_index < self->steps.size) { + step = array_get(&self->steps, step->alternative_index); + } + step->alternative_index = self->steps.size; + break; + default: + break; + } + capture_quantifiers_mul(capture_quantifiers, quantifier); return 0; From f6d17fdb040636d84548e5da96f06c4c8d72eefd Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Sat, 22 Nov 2025 00:00:21 +0100 Subject: [PATCH 590/663] fix(node): bump tree-sitter dep to 0.25 in bindings Sets the dependency `tree-sitter` to version 0.25 in the NodeJS bindings generated by default, so that `npm run test` passes. --- crates/cli/src/init.rs | 2 +- crates/cli/src/templates/package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index 0164cc8f..6d821f04 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -337,7 +337,7 @@ pub fn generate_grammar_files( "tree-sitter-cli":"#}, indoc! {r#" "prebuildify": "^6.0.1", - "tree-sitter": "^0.22.4", + "tree-sitter": "^0.25.0", "tree-sitter-cli":"#}, ); if !contents.contains("module") { diff --git a/crates/cli/src/templates/package.json b/crates/cli/src/templates/package.json index 95f5b638..d9dbbd33 100644 --- a/crates/cli/src/templates/package.json +++ b/crates/cli/src/templates/package.json @@ -38,11 +38,11 @@ }, "devDependencies": { "prebuildify": "^6.0.1", - "tree-sitter": "^0.22.4", + "tree-sitter": "^0.25.0", "tree-sitter-cli": "^CLI_VERSION" }, "peerDependencies": { - "tree-sitter": "^0.22.4" + "tree-sitter": "^0.25.0" }, "peerDependenciesMeta": { "tree-sitter": { From c1a0f4878103b3db6dbb889e5f88864207c58b4e Mon Sep 17 00:00:00 2001 From: WillLillis Date: Sun, 23 Nov 2025 01:39:56 -0500 Subject: [PATCH 591/663] fix(cli): return error if `--wasm` flag is passed when the wasm feature is disabled This applies to the `parse` and `test` commands, but not `build` as it doesn't require the wasm feature. Also, hide the `--wasm` options if from the `--help` output if the feature is disabled. --- crates/cli/src/main.rs | 44 ++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 3f83bf5f..e97c9cce 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -223,7 +223,7 @@ struct Parse { #[arg(long, short = 'D')] pub debug_graph: bool, /// Compile parsers to Wasm instead of native dynamic libraries - #[arg(long)] + #[arg(long, hide = cfg!(not(feature = "wasm")))] pub wasm: bool, /// Output the parse data with graphviz dot #[arg(long = "dot")] @@ -323,7 +323,7 @@ struct Test { #[arg(long, short = 'D')] pub debug_graph: bool, /// Compile parsers to Wasm instead of native dynamic libraries - #[arg(long)] + #[arg(long, hide = cfg!(not(feature = "wasm")))] pub wasm: bool, /// Open `log.html` in the default browser, if `--debug-graph` is supplied #[arg(long)] @@ -589,6 +589,20 @@ pub enum Shell { Nushell, } +/// Complete `action` if the wasm feature is enabled, otherwise return an error +macro_rules! checked_wasm { + ($action:block) => { + #[cfg(feature = "wasm")] + { + $action + } + #[cfg(not(feature = "wasm"))] + { + Err(anyhow!("--wasm flag specified, but this build of tree-sitter-cli does not include the wasm feature"))?; + } + }; +} + impl InitConfig { fn run() -> Result<()> { if let Ok(Some(config_path)) = Config::find_config_file() { @@ -1005,13 +1019,14 @@ impl Parse { loader.debug_build(self.debug_build); loader.force_rebuild(self.rebuild || self.grammar_path.is_some()); - #[cfg(feature = "wasm")] if self.wasm { - let engine = tree_sitter::wasmtime::Engine::default(); - parser - .set_wasm_store(tree_sitter::WasmStore::new(&engine).unwrap()) - .unwrap(); - loader.use_wasm(&engine); + checked_wasm!({ + let engine = tree_sitter::wasmtime::Engine::default(); + parser + .set_wasm_store(tree_sitter::WasmStore::new(&engine).unwrap()) + .unwrap(); + loader.use_wasm(&engine); + }); } let timeout = self.timeout.unwrap_or_default(); @@ -1215,13 +1230,14 @@ impl Test { let mut parser = Parser::new(); - #[cfg(feature = "wasm")] if self.wasm { - let engine = tree_sitter::wasmtime::Engine::default(); - parser - .set_wasm_store(tree_sitter::WasmStore::new(&engine).unwrap()) - .unwrap(); - loader.use_wasm(&engine); + checked_wasm!({ + let engine = tree_sitter::wasmtime::Engine::default(); + parser + .set_wasm_store(tree_sitter::WasmStore::new(&engine).unwrap()) + .unwrap(); + loader.use_wasm(&engine); + }); } if self.lib_path.is_none() && self.lang_name.is_some() { From dcef0cc0eec9da28a5586b92b8e69bd07d1a2fac Mon Sep 17 00:00:00 2001 From: WillLillis Date: Sun, 23 Nov 2025 02:58:05 -0500 Subject: [PATCH 592/663] fix(cli): correct query match limit warning condition --- crates/cli/src/query.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/cli/src/query.rs b/crates/cli/src/query.rs index c58e5f34..fec85bd2 100644 --- a/crates/cli/src/query.rs +++ b/crates/cli/src/query.rs @@ -119,7 +119,7 @@ pub fn query_file_at_path( } } } - if !query_cursor.did_exceed_match_limit() { + if query_cursor.did_exceed_match_limit() { warn!("Query exceeded maximum number of in-progress captures!"); } if should_test { From 14b4708018ee7fe3236e1d965ba589530a3374b6 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Sun, 23 Nov 2025 01:23:16 +0200 Subject: [PATCH 593/663] fix(loader): write Wasm lib directly to lib dir Problem: `fs::rename` fails if the parser directory and the Tree-sitter library directory are on different file systems. Solution: Write the library file directly to the final directory. --- crates/loader/src/loader.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index 3234abee..ddfbc617 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -1306,11 +1306,10 @@ impl Loader { ) -> LoaderResult<()> { let clang_executable = self.ensure_wasi_sdk_exists()?; - let output_name = "output.wasm"; let mut command = Command::new(&clang_executable); command.current_dir(src_path).args([ "-o", - output_name, + output_path.to_str().unwrap(), "-fPIC", "-shared", if self.debug_build { "-g" } else { "-Os" }, @@ -1337,10 +1336,6 @@ impl Loader { )); } - let current_path = src_path.join(output_name); - fs::rename(¤t_path, output_path) - .map_err(|e| LoaderError::IO(IoError::new(e, Some(current_path.as_path()))))?; - Ok(()) } From df8b62fc509d45e2ebbfa1574a9818beca19eec5 Mon Sep 17 00:00:00 2001 From: WillLillis Date: Wed, 26 Nov 2025 02:40:19 -0500 Subject: [PATCH 594/663] feat(xtask): bring wasi-sdk treatment up to par with the loader The loader package's `ensure_wasi_sdk_exists` private method checks for the wasi-sdk, fetching it if it can't be found. This logic was re-implemented in xtask for `build-wasm-stdlib`, but without the fetching functionality. We can have nice things in xtask too! Rather than make this function a public member of `tree-sitter-loader`, we just re-implement and leave a nice comment asking people to keep the two in sync. --- Cargo.lock | 2 + crates/loader/src/loader.rs | 11 ++- crates/loader/wasi-sdk-version | 1 + crates/xtask/Cargo.toml | 2 + crates/xtask/src/build_wasm.rs | 147 +++++++++++++++++++++++++++++---- 5 files changed, 144 insertions(+), 19 deletions(-) create mode 100644 crates/loader/wasi-sdk-version diff --git a/Cargo.lock b/Cargo.lock index cf5962b0..111b9d46 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2812,6 +2812,7 @@ dependencies = [ "anyhow", "bindgen", "clap", + "etcetera", "indoc", "notify", "notify-debouncer-full", @@ -2820,6 +2821,7 @@ dependencies = [ "semver", "serde_json", "tree-sitter-cli", + "tree-sitter-loader", ] [[package]] diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index ddfbc617..00108506 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -41,6 +41,8 @@ use tree_sitter_tags::{Error as TagsError, TagsConfiguration}; static GRAMMAR_NAME_REGEX: LazyLock = LazyLock::new(|| Regex::new(r#""name":\s*"(.*?)""#).unwrap()); +const WASI_SDK_VERSION: &str = include_str!("../wasi-sdk-version").trim_ascii(); + pub type LoaderResult = Result; #[derive(Debug, Error)] @@ -223,7 +225,7 @@ impl std::fmt::Display for ScannerSymbolError { pub struct WasiSDKClangError { pub wasi_sdk_dir: String, pub possible_executables: Vec<&'static str>, - download: bool, + pub download: bool, } impl std::fmt::Display for WasiSDKClangError { @@ -1436,9 +1438,12 @@ impl Loader { return Err(LoaderError::WasiSDKPlatform); }; - let sdk_filename = format!("wasi-sdk-29.0-{arch_os}.tar.gz"); + let sdk_filename = format!("wasi-sdk-{WASI_SDK_VERSION}-{arch_os}.tar.gz"); + let wasi_sdk_major_version = WASI_SDK_VERSION + .trim_end_matches(char::is_numeric) // trim minor version... + .trim_end_matches('.'); // ...and '.' separator let sdk_url = format!( - "https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-29/{sdk_filename}", + "https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-{wasi_sdk_major_version}/{sdk_filename}", ); info!("Downloading wasi-sdk from {sdk_url}..."); diff --git a/crates/loader/wasi-sdk-version b/crates/loader/wasi-sdk-version new file mode 100644 index 00000000..231f5c77 --- /dev/null +++ b/crates/loader/wasi-sdk-version @@ -0,0 +1 @@ +29.0 diff --git a/crates/xtask/Cargo.toml b/crates/xtask/Cargo.toml index 90134d03..17972317 100644 --- a/crates/xtask/Cargo.toml +++ b/crates/xtask/Cargo.toml @@ -19,11 +19,13 @@ anstyle.workspace = true anyhow.workspace = true bindgen = { version = "0.72.0" } clap.workspace = true +etcetera.workspace = true indoc.workspace = true regex.workspace = true schemars.workspace = true semver.workspace = true serde_json.workspace = true tree-sitter-cli = { path = "../cli/" } +tree-sitter-loader = { path = "../loader/" } notify = "8.2.0" notify-debouncer-full = "0.6.0" diff --git a/crates/xtask/src/build_wasm.rs b/crates/xtask/src/build_wasm.rs index 8b1f78d5..183718a6 100644 --- a/crates/xtask/src/build_wasm.rs +++ b/crates/xtask/src/build_wasm.rs @@ -8,13 +8,15 @@ use std::{ time::Duration, }; -use anyhow::{anyhow, Error, Result}; +use anyhow::{anyhow, Result}; +use etcetera::BaseStrategy as _; use indoc::indoc; use notify::{ event::{AccessKind, AccessMode}, EventKind, RecursiveMode, }; use notify_debouncer_full::new_debouncer; +use tree_sitter_loader::{IoError, LoaderError, WasiSDKClangError}; use crate::{ bail_on_err, embed_sources::embed_sources_in_map, watch_wasm, BuildWasm, EMSCRIPTEN_TAG, @@ -50,6 +52,8 @@ const EXPORTED_RUNTIME_METHODS: [&str; 20] = [ "LE_HEAP_STORE_I64", ]; +const WASI_SDK_VERSION: &str = include_str!("../../loader/wasi-sdk-version").trim_ascii(); + pub fn run_wasm(args: &BuildWasm) -> Result<()> { let mut emscripten_flags = if args.debug { vec!["-O0", "--minify", "0"] @@ -309,9 +313,17 @@ fn build_wasm(cmd: &mut Command, edit_tsd: bool) -> Result<()> { Ok(()) } -/// This gets the path to the `clang` binary in the WASI SDK specified by the -/// `TREE_SITTER_WASI_SDK_PATH` environment variable. -fn get_wasi_binary() -> Result { +/// This ensures that the wasi-sdk is available, downloading and extracting it if necessary, +/// and returns the path to the `clang` executable. +/// +/// If `TREE_SITTER_WASI_SDK_PATH` is set, it will use that path to look for the clang executable. +/// +/// Note that this is just a minimially modified version of +/// `tree_sitter_loader::ensure_wasi_sdk_exists`. In the loader, this functionality is implemented +/// as a private method of `Loader`. Rather than add this to the public API, we just +/// re-implement it. Any fixes and/or modifications made to the loader's copy should be reflected +/// here. +pub fn ensure_wasi_sdk_exists() -> Result { let possible_executables = if cfg!(windows) { vec![ "clang.exe", @@ -332,19 +344,122 @@ fn get_wasi_binary() -> Result { } } - return Err(anyhow!( - "TREE_SITTER_WASI_SDK_PATH is set to '{}', but no clang executable found in 'bin/' directory. \ - Looked for: {}", - wasi_sdk_dir.display(), - possible_executables.join(", ") - )); + Err(LoaderError::WasiSDKClang(WasiSDKClangError { + wasi_sdk_dir: wasi_sdk_dir.to_string_lossy().to_string(), + possible_executables: possible_executables.clone(), + download: false, + }))?; } - Err(anyhow!( - "TREE_SITTER_WASI_SDK_PATH environment variable is not set. \ - Please install the WASI SDK from https://github.com/WebAssembly/wasi-sdk/releases \ - and set TREE_SITTER_WASI_SDK_PATH to the installation directory." - )) + let cache_dir = etcetera::choose_base_strategy()? + .cache_dir() + .join("tree-sitter"); + fs::create_dir_all(&cache_dir).map_err(|error| { + LoaderError::IO(IoError { + error, + path: Some(cache_dir.to_string_lossy().to_string()), + }) + })?; + + let wasi_sdk_dir = cache_dir.join("wasi-sdk"); + + for exe in &possible_executables { + let clang_exe = wasi_sdk_dir.join("bin").join(exe); + if clang_exe.exists() { + return Ok(clang_exe); + } + } + + fs::create_dir_all(&wasi_sdk_dir).map_err(|error| { + LoaderError::IO(IoError { + error, + path: Some(wasi_sdk_dir.to_string_lossy().to_string()), + }) + })?; + + let arch_os = if cfg!(target_os = "macos") { + if cfg!(target_arch = "aarch64") { + "arm64-macos" + } else { + "x86_64-macos" + } + } else if cfg!(target_os = "windows") { + if cfg!(target_arch = "aarch64") { + "arm64-windows" + } else { + "x86_64-windows" + } + } else if cfg!(target_os = "linux") { + if cfg!(target_arch = "aarch64") { + "arm64-linux" + } else { + "x86_64-linux" + } + } else { + Err(LoaderError::WasiSDKPlatform)? + }; + + let sdk_filename = format!("wasi-sdk-{WASI_SDK_VERSION}-{arch_os}.tar.gz"); + let wasi_sdk_major_version = WASI_SDK_VERSION + .trim_end_matches(char::is_numeric) // trim minor version... + .trim_end_matches('.'); // ...and '.' separator + let sdk_url = format!( + "https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-{wasi_sdk_major_version}/{sdk_filename}", + ); + + eprintln!("Downloading wasi-sdk from {sdk_url}..."); + let temp_tar_path = cache_dir.join(sdk_filename); + + let status = Command::new("curl") + .arg("-f") + .arg("-L") + .arg("-o") + .arg(&temp_tar_path) + .arg(&sdk_url) + .status() + .map_err(|e| LoaderError::Curl(sdk_url.clone(), e))?; + + if !status.success() { + Err(LoaderError::WasiSDKDownload(sdk_url))?; + } + + eprintln!("Extracting wasi-sdk to {}...", wasi_sdk_dir.display()); + extract_tar_gz_with_strip(&temp_tar_path, &wasi_sdk_dir)?; + + fs::remove_file(temp_tar_path).ok(); + for exe in &possible_executables { + let clang_exe = wasi_sdk_dir.join("bin").join(exe); + if clang_exe.exists() { + return Ok(clang_exe); + } + } + + Err(LoaderError::WasiSDKClang(WasiSDKClangError { + wasi_sdk_dir: wasi_sdk_dir.to_string_lossy().to_string(), + possible_executables, + download: true, + }))? +} + +/// Extracts a tar.gz archive with `tar`, stripping the first path component. +fn extract_tar_gz_with_strip(archive_path: &Path, destination: &Path) -> Result<()> { + let status = Command::new("tar") + .arg("-xzf") + .arg(archive_path) + .arg("--strip-components=1") + .arg("-C") + .arg(destination) + .status() + .map_err(|e| LoaderError::Tar(archive_path.to_string_lossy().to_string(), e))?; + + if !status.success() { + Err(LoaderError::Extraction( + archive_path.to_string_lossy().to_string(), + destination.to_string_lossy().to_string(), + ))?; + } + + Ok(()) } pub fn run_wasm_stdlib() -> Result<()> { @@ -353,7 +468,7 @@ pub fn run_wasm_stdlib() -> Result<()> { .map(|line| format!("-Wl,--export={}", &line[1..line.len() - 2])) .collect::>(); - let clang_exe = get_wasi_binary()?; + let clang_exe = ensure_wasi_sdk_exists()?; let output = Command::new(&clang_exe) .args([ From 3f85f65e3f3bbd47d10eb2e227294ccee7948719 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 00:00:10 +0000 Subject: [PATCH 595/663] build(deps): bump the cargo group with 2 updates Bumps the cargo group with 2 updates: [cc](https://github.com/rust-lang/cc-rs) and [wasmparser](https://github.com/bytecodealliance/wasm-tools). Updates `cc` from 1.2.47 to 1.2.48 - [Release notes](https://github.com/rust-lang/cc-rs/releases) - [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md) - [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.47...cc-v1.2.48) Updates `wasmparser` from 0.241.2 to 0.242.0 - [Release notes](https://github.com/bytecodealliance/wasm-tools/releases) - [Commits](https://github.com/bytecodealliance/wasm-tools/commits) --- updated-dependencies: - dependency-name: cc dependency-version: 1.2.48 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: wasmparser dependency-version: 0.242.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 10 +++++----- Cargo.toml | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 111b9d46..b7b45028 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -187,9 +187,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.47" +version = "1.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07" +checksum = "c481bdbf0ed3b892f6f806287d72acd515b352a4ec27a208489b8c1bc839633a" dependencies = [ "find-msvc-tools", "shlex", @@ -2027,7 +2027,7 @@ dependencies = [ "tree-sitter-tests-proc-macro", "unindent", "walkdir", - "wasmparser 0.241.2", + "wasmparser 0.242.0", "webbrowser", "widestring", ] @@ -2271,9 +2271,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.241.2" +version = "0.242.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46d90019b1afd4b808c263e428de644f3003691f243387d30d673211ee0cb8e8" +checksum = "ed3c6e611f4cd748d85c767815823b777dc56afca793fcda27beae4e85028849" dependencies = [ "bitflags 2.10.0", "hashbrown 0.15.5", diff --git a/Cargo.toml b/Cargo.toml index c5438b7a..71cf0253 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -106,7 +106,7 @@ ansi_colours = "1.2.3" anstyle = "1.0.13" anyhow = "1.0.100" bstr = "1.12.0" -cc = "1.2.47" +cc = "1.2.48" clap = { version = "4.5.53", features = [ "cargo", "derive", @@ -150,7 +150,7 @@ tiny_http = "0.12.0" topological-sort = "0.2.2" unindent = "0.2.4" walkdir = "2.5.0" -wasmparser = "0.241.2" +wasmparser = "0.242.0" webbrowser = "1.0.5" tree-sitter = { version = "0.26.0", path = "./lib" } From 7d3feeae9a7e1d543a94747b3de8f07ee1128daa Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Thu, 2 Oct 2025 17:21:50 +0200 Subject: [PATCH 596/663] cli: Do not validate UTF-8 boundaries when query results are not being tested Co-authored-by: Kirill Bulatov Co-authored-by: dino Co-authored-by: Max Brunsfeld Co-authored-by: John Tur --- crates/cli/src/query.rs | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/crates/cli/src/query.rs b/crates/cli/src/query.rs index fec85bd2..7343049f 100644 --- a/crates/cli/src/query.rs +++ b/crates/cli/src/query.rs @@ -80,11 +80,13 @@ pub fn query_file_at_path( capture.node.utf8_text(&source_code).unwrap_or("") )?; } - results.push(query_testing::CaptureInfo { - name: (*capture_name).to_string(), - start: to_utf8_point(capture.node.start_position(), source_code.as_slice()), - end: to_utf8_point(capture.node.end_position(), source_code.as_slice()), - }); + if should_test { + results.push(query_testing::CaptureInfo { + name: (*capture_name).to_string(), + start: to_utf8_point(capture.node.start_position(), source_code.as_slice()), + end: to_utf8_point(capture.node.end_position(), source_code.as_slice()), + }); + } } } else { let mut matches = query_cursor.matches(&query, tree.root_node(), source_code.as_slice()); @@ -111,11 +113,13 @@ pub fn query_file_at_path( )?; } } - results.push(query_testing::CaptureInfo { - name: (*capture_name).to_string(), - start: to_utf8_point(capture.node.start_position(), source_code.as_slice()), - end: to_utf8_point(capture.node.end_position(), source_code.as_slice()), - }); + if should_test { + results.push(query_testing::CaptureInfo { + name: (*capture_name).to_string(), + start: to_utf8_point(capture.node.start_position(), source_code.as_slice()), + end: to_utf8_point(capture.node.end_position(), source_code.as_slice()), + }); + } } } } From c0b1710f8a92b6cd7aded5301301979746da8bc7 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:02:05 +0200 Subject: [PATCH 597/663] Add containing range APIs to query cursor Co-authored-by: Kirill Bulatov Co-authored-by: Max Brunsfeld Co-authored-by: dino Co-authored-by: John Tur Co-authored-by: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Co-authored-by: dino Co-authored-by: Will Lillis --- crates/cli/src/main.rs | 26 ++++++ crates/cli/src/query.rs | 8 ++ crates/cli/src/tests/query_test.rs | 58 ++++++++++++ crates/xtask/src/check_wasm_exports.rs | 4 +- docs/src/cli/query.md | 10 +++ lib/binding_rust/bindings.rs | 16 ++++ lib/binding_rust/lib.rs | 38 ++++++++ lib/binding_web/lib/tree-sitter.c | 36 ++++++++ lib/binding_web/lib/web-tree-sitter.d.ts | 4 +- lib/binding_web/src/query.ts | 64 +++++++++++++ lib/binding_web/test/query.test.ts | 58 ++++++++++++ lib/include/tree_sitter/api.h | 22 +++++ lib/src/query.c | 110 ++++++++++++++++------- 13 files changed, 420 insertions(+), 34 deletions(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index e97c9cce..3ba22e45 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -448,6 +448,14 @@ struct Query { /// The range of rows in which the query will be executed #[arg(long)] pub row_range: Option, + /// The range of byte offsets in which the query will be executed. Only the matches that are fully contained within the provided + /// byte range will be returned. + #[arg(long)] + pub containing_byte_range: Option, + /// The range of rows in which the query will be executed. Only the matches that are fully contained within the provided row range + /// will be returned. + #[arg(long)] + pub containing_row_range: Option, /// Select a language by the scope instead of a file extension #[arg(long)] pub scope: Option, @@ -1486,6 +1494,18 @@ impl Query { let end = parts.next().unwrap().parse().ok()?; Some(Point::new(start, 0)..Point::new(end, 0)) }); + let containing_byte_range = self.containing_byte_range.as_ref().and_then(|range| { + let mut parts = range.split(':'); + let start = parts.next()?.parse().ok()?; + let end = parts.next().unwrap().parse().ok()?; + Some(start..end) + }); + let containing_point_range = self.containing_row_range.as_ref().and_then(|range| { + let mut parts = range.split(':'); + let start = parts.next()?.parse().ok()?; + let end = parts.next().unwrap().parse().ok()?; + Some(Point::new(start, 0)..Point::new(end, 0)) + }); let cancellation_flag = util::cancel_on_signal(); @@ -1514,6 +1534,8 @@ impl Query { ordered_captures: self.captures, byte_range, point_range, + containing_byte_range, + containing_point_range, quiet: self.quiet, print_time: self.time, stdin: false, @@ -1557,6 +1579,8 @@ impl Query { ordered_captures: self.captures, byte_range, point_range, + containing_byte_range, + containing_point_range, quiet: self.quiet, print_time: self.time, stdin: true, @@ -1575,6 +1599,8 @@ impl Query { ordered_captures: self.captures, byte_range, point_range, + containing_byte_range, + containing_point_range, quiet: self.quiet, print_time: self.time, stdin: true, diff --git a/crates/cli/src/query.rs b/crates/cli/src/query.rs index 7343049f..54674115 100644 --- a/crates/cli/src/query.rs +++ b/crates/cli/src/query.rs @@ -21,6 +21,8 @@ pub struct QueryFileOptions { pub ordered_captures: bool, pub byte_range: Option>, pub point_range: Option>, + pub containing_byte_range: Option>, + pub containing_point_range: Option>, pub quiet: bool, pub print_time: bool, pub stdin: bool, @@ -48,6 +50,12 @@ pub fn query_file_at_path( if let Some(ref range) = opts.point_range { query_cursor.set_point_range(range.clone()); } + if let Some(ref range) = opts.containing_byte_range { + query_cursor.set_containing_byte_range(range.clone()); + } + if let Some(ref range) = opts.containing_point_range { + query_cursor.set_containing_point_range(range.clone()); + } let mut parser = Parser::new(); parser.set_language(language)?; diff --git a/crates/cli/src/tests/query_test.rs b/crates/cli/src/tests/query_test.rs index 4eb74f6c..3f1467e5 100644 --- a/crates/cli/src/tests/query_test.rs +++ b/crates/cli/src/tests/query_test.rs @@ -2669,6 +2669,64 @@ fn test_query_matches_within_range_of_long_repetition() { }); } +#[test] +fn test_query_matches_contained_within_range() { + allocations::record(|| { + let language = get_language("json"); + let query = Query::new( + &language, + r#" + ("[" @l_bracket "]" @r_bracket) + ("{" @l_brace "}" @r_brace) + "#, + ) + .unwrap(); + + let source = r#" + [ + {"key1": "value1"}, + {"key2": "value2"}, + {"key3": "value3"}, + {"key4": "value4"}, + {"key5": "value5"}, + {"key6": "value6"}, + {"key7": "value7"}, + {"key8": "value8"}, + {"key9": "value9"}, + {"key10": "value10"}, + {"key11": "value11"}, + {"key12": "value12"}, + ] + "# + .unindent(); + + let mut parser = Parser::new(); + parser.set_language(&language).unwrap(); + let tree = parser.parse(&source, None).unwrap(); + + let expected_matches = [ + (1, vec![("l_brace", "{"), ("r_brace", "}")]), + (1, vec![("l_brace", "{"), ("r_brace", "}")]), + ]; + { + let mut cursor = QueryCursor::new(); + let matches = cursor + .set_containing_point_range(Point::new(5, 0)..Point::new(7, 0)) + .matches(&query, tree.root_node(), source.as_bytes()); + assert_eq!(collect_matches(matches, &query, &source), &expected_matches); + } + { + let mut cursor = QueryCursor::new(); + let matches = cursor.set_containing_byte_range(78..120).matches( + &query, + tree.root_node(), + source.as_bytes(), + ); + assert_eq!(collect_matches(matches, &query, &source), &expected_matches); + } + }); +} + #[test] fn test_query_matches_different_queries_same_cursor() { allocations::record(|| { diff --git a/crates/xtask/src/check_wasm_exports.rs b/crates/xtask/src/check_wasm_exports.rs index 124725b7..c93f7cd3 100644 --- a/crates/xtask/src/check_wasm_exports.rs +++ b/crates/xtask/src/check_wasm_exports.rs @@ -16,7 +16,7 @@ use notify_debouncer_full::new_debouncer; use crate::{bail_on_err, watch_wasm, CheckWasmExports}; -const EXCLUDES: [&str; 23] = [ +const EXCLUDES: [&str; 25] = [ // Unneeded because the JS side has its own way of implementing it "ts_node_child_by_field_name", "ts_node_edit", @@ -44,6 +44,8 @@ const EXCLUDES: [&str; 23] = [ "ts_query_cursor_delete", "ts_query_cursor_match_limit", "ts_query_cursor_remove_match", + "ts_query_cursor_set_point_range", + "ts_query_cursor_set_containing_byte_range", ]; pub fn run(args: &CheckWasmExports) -> Result<()> { diff --git a/docs/src/cli/query.md b/docs/src/cli/query.md index 395ca486..08ff2654 100644 --- a/docs/src/cli/query.md +++ b/docs/src/cli/query.md @@ -36,10 +36,20 @@ The path to a file that contains paths to source files in which the query will b The range of byte offsets in which the query will be executed. The format is `start_byte:end_byte`. +### `--containing-byte-range ` + +The range of byte offsets in which the query will be executed. Only the matches that are fully contained within the provided +byte range will be returned. + ### `--row-range ` The range of rows in which the query will be executed. The format is `start_row:end_row`. +### `--containing-row-range ` + +The range of rows in which the query will be executed. Only the matches that are fully contained within the provided row range +will be returned. + ### `--scope ` The language scope to use for parsing and querying. This is useful when the language is ambiguous. diff --git a/lib/binding_rust/bindings.rs b/lib/binding_rust/bindings.rs index 3feb8409..ec00a7c6 100644 --- a/lib/binding_rust/bindings.rs +++ b/lib/binding_rust/bindings.rs @@ -712,6 +712,22 @@ extern "C" { end_point: TSPoint, ) -> bool; } +extern "C" { + #[doc = " Set the byte range within which all matches must be fully contained.\n\n Set the range of bytes in which matches will be searched for. In contrast to\n `ts_query_cursor_set_byte_range`, this will restrict the query cursor to only return\n matches where _all_ nodes are _fully_ contained within the given range. Both functions\n can be used together, e.g. to search for any matches that intersect line 5000, as\n long as they are fully contained within lines 4500-5500"] + pub fn ts_query_cursor_set_containing_byte_range( + self_: *mut TSQueryCursor, + start_byte: u32, + end_byte: u32, + ) -> bool; +} +extern "C" { + #[doc = " Set the point range within which all matches must be fully contained.\n\n Set the range of bytes in which matches will be searched for. In contrast to\n `ts_query_cursor_set_point_range`, this will restrict the query cursor to only return\n matches where _all_ nodes are _fully_ contained within the given range. Both functions\n can be used together, e.g. to search for any matches that intersect line 5000, as\n long as they are fully contained within lines 4500-5500"] + pub fn ts_query_cursor_set_containing_point_range( + self_: *mut TSQueryCursor, + start_point: TSPoint, + end_point: TSPoint, + ) -> bool; +} extern "C" { #[doc = " Advance to the next match of the currently running query.\n\n If there is a match, write it to `*match` and return `true`.\n Otherwise, return `false`."] pub fn ts_query_cursor_next_match(self_: *mut TSQueryCursor, match_: *mut TSQueryMatch) diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs index a02fa173..bf86cf74 100644 --- a/lib/binding_rust/lib.rs +++ b/lib/binding_rust/lib.rs @@ -3181,6 +3181,44 @@ impl QueryCursor { self } + /// Set the byte range within which all matches must be fully contained. + /// + /// Set the range of bytes in which matches will be searched for. In contrast to + /// `ts_query_cursor_set_byte_range`, this will restrict the query cursor to only return + /// matches where _all_ nodes are _fully_ contained within the given range. Both functions + /// can be used together, e.g. to search for any matches that intersect line 5000, as + /// long as they are fully contained within lines 4500-5500 + #[doc(alias = "ts_query_cursor_set_containing_byte_range")] + pub fn set_containing_byte_range(&mut self, range: ops::Range) -> &mut Self { + unsafe { + ffi::ts_query_cursor_set_containing_byte_range( + self.ptr.as_ptr(), + range.start as u32, + range.end as u32, + ); + } + self + } + + /// Set the point range within which all matches must be fully contained. + /// + /// Set the range of bytes in which matches will be searched for. In contrast to + /// `ts_query_cursor_set_point_range`, this will restrict the query cursor to only return + /// matches where _all_ nodes are _fully_ contained within the given range. Both functions + /// can be used together, e.g. to search for any matches that intersect line 5000, as + /// long as they are fully contained within lines 4500-5500 + #[doc(alias = "ts_query_cursor_set_containing_point_range")] + pub fn set_containing_point_range(&mut self, range: ops::Range) -> &mut Self { + unsafe { + ffi::ts_query_cursor_set_containing_point_range( + self.ptr.as_ptr(), + range.start.into(), + range.end.into(), + ); + } + self + } + /// Set the maximum start depth for a query cursor. /// /// This prevents cursors from exploring children nodes at a certain depth. diff --git a/lib/binding_web/lib/tree-sitter.c b/lib/binding_web/lib/tree-sitter.c index db6c108b..828132ac 100644 --- a/lib/binding_web/lib/tree-sitter.c +++ b/lib/binding_web/lib/tree-sitter.c @@ -874,6 +874,12 @@ void ts_query_matches_wasm( uint32_t end_column, uint32_t start_index, uint32_t end_index, + uint32_t start_containing_row, + uint32_t start_containing_column, + uint32_t end_containing_row, + uint32_t end_containing_column, + uint32_t start_containing_index, + uint32_t end_containing_index, uint32_t match_limit, uint32_t max_start_depth ) { @@ -889,8 +895,20 @@ void ts_query_matches_wasm( TSNode node = unmarshal_node(tree); TSPoint start_point = {start_row, code_unit_to_byte(start_column)}; TSPoint end_point = {end_row, code_unit_to_byte(end_column)}; + TSPoint start_containing_point = {start_containing_row, code_unit_to_byte(start_containing_column)}; + TSPoint end_containing_point = {end_containing_row, code_unit_to_byte(end_containing_column)}; ts_query_cursor_set_point_range(scratch_query_cursor, start_point, end_point); ts_query_cursor_set_byte_range(scratch_query_cursor, start_index, end_index); + ts_query_cursor_set_containing_point_range( + scratch_query_cursor, + start_containing_point, + end_containing_point + ); + ts_query_cursor_set_containing_byte_range( + scratch_query_cursor, + start_containing_index, + end_containing_index + ); ts_query_cursor_set_match_limit(scratch_query_cursor, match_limit); ts_query_cursor_set_max_start_depth(scratch_query_cursor, max_start_depth); @@ -932,6 +950,12 @@ void ts_query_captures_wasm( uint32_t end_column, uint32_t start_index, uint32_t end_index, + uint32_t start_containing_row, + uint32_t start_containing_column, + uint32_t end_containing_row, + uint32_t end_containing_column, + uint32_t start_containing_index, + uint32_t end_containing_index, uint32_t match_limit, uint32_t max_start_depth ) { @@ -944,8 +968,20 @@ void ts_query_captures_wasm( TSNode node = unmarshal_node(tree); TSPoint start_point = {start_row, code_unit_to_byte(start_column)}; TSPoint end_point = {end_row, code_unit_to_byte(end_column)}; + TSPoint start_containing_point = {start_containing_row, code_unit_to_byte(start_containing_column)}; + TSPoint end_containing_point = {end_containing_row, code_unit_to_byte(end_containing_column)}; ts_query_cursor_set_point_range(scratch_query_cursor, start_point, end_point); ts_query_cursor_set_byte_range(scratch_query_cursor, start_index, end_index); + ts_query_cursor_set_containing_point_range( + scratch_query_cursor, + start_containing_point, + end_containing_point + ); + ts_query_cursor_set_containing_byte_range( + scratch_query_cursor, + start_containing_index, + end_containing_index + ); ts_query_cursor_set_match_limit(scratch_query_cursor, match_limit); ts_query_cursor_set_max_start_depth(scratch_query_cursor, max_start_depth); ts_query_cursor_exec(scratch_query_cursor, self, node); diff --git a/lib/binding_web/lib/web-tree-sitter.d.ts b/lib/binding_web/lib/web-tree-sitter.d.ts index c19d7bf4..c1e0e0dd 100644 --- a/lib/binding_web/lib/web-tree-sitter.d.ts +++ b/lib/binding_web/lib/web-tree-sitter.d.ts @@ -175,8 +175,8 @@ interface WasmModule { _ts_node_is_extra_wasm(_0: number): number; _ts_node_parse_state_wasm(_0: number): number; _ts_node_next_parse_state_wasm(_0: number): number; - _ts_query_matches_wasm(_0: number, _1: number, _2: number, _3: number, _4: number, _5: number, _6: number, _7: number, _8: number, _9: number): void; - _ts_query_captures_wasm(_0: number, _1: number, _2: number, _3: number, _4: number, _5: number, _6: number, _7: number, _8: number, _9: number): void; + _ts_query_matches_wasm(_0: number, _1: number, _2: number, _3: number, _4: number, _5: number, _6: number, _7: number, _8: number, _9: number, _10: number, _11: number, _12: number, _13: number, _14: number, _15: number): void; + _ts_query_captures_wasm(_0: number, _1: number, _2: number, _3: number, _4: number, _5: number, _6: number, _7: number, _8: number, _9: number, _10: number, _11: number, _12: number, _13: number, _14: number, _15: number): void; _memset(_0: number, _1: number, _2: number): number; _memcpy(_0: number, _1: number, _2: number): number; _memmove(_0: number, _1: number, _2: number): number; diff --git a/lib/binding_web/src/query.ts b/lib/binding_web/src/query.ts index 6f3064a8..b9cd1971 100644 --- a/lib/binding_web/src/query.ts +++ b/lib/binding_web/src/query.ts @@ -20,12 +20,32 @@ export interface QueryOptions { /** The end position of the range to query */ endPosition?: Point; + /** The start position of the range to query Only the matches that are fully + * contained within provided range will be returned. + **/ + startContainingPosition?: Point; + + /** The end position of the range to query Only the matches that are fully + * contained within provided range will be returned. + **/ + endContainingPosition?: Point; + /** The start index of the range to query */ startIndex?: number; /** The end index of the range to query */ endIndex?: number; + /** The start index of the range to query Only the matches that are fully + * contained within provided range will be returned. + **/ + startContainingIndex?: number; + + /** The end index of the range to query Only the matches that are fully + * contained within provided range will be returned. + **/ + endContainingIndex?: number; + /** * The maximum number of in-progress matches for this query. * The limit must be > 0 and <= 65536. @@ -695,6 +715,10 @@ export class Query { const endPosition = options.endPosition ?? ZERO_POINT; const startIndex = options.startIndex ?? 0; const endIndex = options.endIndex ?? 0; + const startContainingPosition = options.startContainingPosition ?? ZERO_POINT; + const endContainingPosition = options.endContainingPosition ?? ZERO_POINT; + const startContainingIndex = options.startContainingIndex ?? 0; + const endContainingIndex = options.endContainingIndex ?? 0; const matchLimit = options.matchLimit ?? 0xFFFFFFFF; const maxStartDepth = options.maxStartDepth ?? 0xFFFFFFFF; const progressCallback = options.progressCallback; @@ -715,6 +739,18 @@ export class Query { throw new Error('`startPosition` cannot be greater than `endPosition`'); } + if (endContainingIndex !== 0 && startContainingIndex > endContainingIndex) { + throw new Error('`startContainingIndex` cannot be greater than `endContainingIndex`'); + } + + if (endContainingPosition !== ZERO_POINT && ( + startContainingPosition.row > endContainingPosition.row || + (startContainingPosition.row === endContainingPosition.row && + startContainingPosition.column > endContainingPosition.column) + )) { + throw new Error('`startContainingPosition` cannot be greater than `endContainingPosition`'); + } + if (progressCallback) { C.currentQueryProgressCallback = progressCallback; } @@ -730,6 +766,12 @@ export class Query { endPosition.column, startIndex, endIndex, + startContainingPosition.row, + startContainingPosition.column, + endContainingPosition.row, + endContainingPosition.column, + startContainingIndex, + endContainingIndex, matchLimit, maxStartDepth, ); @@ -788,6 +830,10 @@ export class Query { const endPosition = options.endPosition ?? ZERO_POINT; const startIndex = options.startIndex ?? 0; const endIndex = options.endIndex ?? 0; + const startContainingPosition = options.startContainingPosition ?? ZERO_POINT; + const endContainingPosition = options.endContainingPosition ?? ZERO_POINT; + const startContainingIndex = options.startContainingIndex ?? 0; + const endContainingIndex = options.endContainingIndex ?? 0; const matchLimit = options.matchLimit ?? 0xFFFFFFFF; const maxStartDepth = options.maxStartDepth ?? 0xFFFFFFFF; const progressCallback = options.progressCallback; @@ -808,6 +854,18 @@ export class Query { throw new Error('`startPosition` cannot be greater than `endPosition`'); } + if (endContainingIndex !== 0 && startContainingIndex > endContainingIndex) { + throw new Error('`startContainingIndex` cannot be greater than `endContainingIndex`'); + } + + if (endContainingPosition !== ZERO_POINT && ( + startContainingPosition.row > endContainingPosition.row || + (startContainingPosition.row === endContainingPosition.row && + startContainingPosition.column > endContainingPosition.column) + )) { + throw new Error('`startContainingPosition` cannot be greater than `endContainingPosition`'); + } + if (progressCallback) { C.currentQueryProgressCallback = progressCallback; } @@ -823,6 +881,12 @@ export class Query { endPosition.column, startIndex, endIndex, + startContainingPosition.row, + startContainingPosition.column, + endContainingPosition.row, + endContainingPosition.column, + startContainingIndex, + endContainingIndex, matchLimit, maxStartDepth, ); diff --git a/lib/binding_web/test/query.test.ts b/lib/binding_web/test/query.test.ts index ad6a6660..f90e9464 100644 --- a/lib/binding_web/test/query.test.ts +++ b/lib/binding_web/test/query.test.ts @@ -96,6 +96,64 @@ describe('Query', () => { ]); }); + it('can search in contained within point ranges', () => { + tree = parser.parse(`[ + {"key1": "value1"}, + {"key2": "value2"}, + {"key3": "value3"}, + {"key4": "value4"}, + {"key5": "value5"}, + {"key6": "value6"}, + {"key7": "value7"}, + {"key8": "value8"}, + {"key9": "value9"}, + {"key10": "value10"}, + {"key11": "value11"}, + {"key12": "value12"}, +]`)!; + query = new Query(JavaScript, '("[" @l_bracket "]" @r_bracket) ("{" @l_brace "}" @r_brace)'); + const matches = query.matches( + tree.rootNode, + { + startContainingPosition: { row: 5, column: 0 }, + endContainingPosition: { row: 7, column: 0 }, + } + ); + expect(formatMatches(matches)).toEqual([ + { patternIndex: 1, captures: [{ patternIndex: 1, name: 'l_brace', text: '{' }, { patternIndex: 1, name: 'r_brace', text: '}' },] }, + { patternIndex: 1, captures: [{ patternIndex: 1, name: 'l_brace', text: '{' }, { patternIndex: 1, name: 'r_brace', text: '}' },] }, + ]); + }); + + it('can search in contained within byte ranges', () => { + tree = parser.parse(`[ + {"key1": "value1"}, + {"key2": "value2"}, + {"key3": "value3"}, + {"key4": "value4"}, + {"key5": "value5"}, + {"key6": "value6"}, + {"key7": "value7"}, + {"key8": "value8"}, + {"key9": "value9"}, + {"key10": "value10"}, + {"key11": "value11"}, + {"key12": "value12"}, +]`)!; + query = new Query(JavaScript, '("[" @l_bracket "]" @r_bracket) ("{" @l_brace "}" @r_brace)'); + const matches = query.matches( + tree.rootNode, + { + startContainingIndex: 290, + endContainingIndex: 432, + } + ); + expect(formatMatches(matches)).toEqual([ + { patternIndex: 1, captures: [{ patternIndex: 1, name: 'l_brace', text: '{' }, { patternIndex: 1, name: 'r_brace', text: '}' },] }, + { patternIndex: 1, captures: [{ patternIndex: 1, name: 'l_brace', text: '{' }, { patternIndex: 1, name: 'r_brace', text: '}' },] }, + ]); + }); + it('handles predicates that compare the text of capture to literal strings', () => { tree = parser.parse(` giraffe(1, 2, []); diff --git a/lib/include/tree_sitter/api.h b/lib/include/tree_sitter/api.h index 264d405d..22c85d48 100644 --- a/lib/include/tree_sitter/api.h +++ b/lib/include/tree_sitter/api.h @@ -1101,6 +1101,28 @@ bool ts_query_cursor_set_byte_range(TSQueryCursor *self, uint32_t start_byte, ui */ bool ts_query_cursor_set_point_range(TSQueryCursor *self, TSPoint start_point, TSPoint end_point); +/** + * Set the byte range within which all matches must be fully contained. + * + * Set the range of bytes in which matches will be searched for. In contrast to + * `ts_query_cursor_set_byte_range`, this will restrict the query cursor to only return + * matches where _all_ nodes are _fully_ contained within the given range. Both functions + * can be used together, e.g. to search for any matches that intersect line 5000, as + * long as they are fully contained within lines 4500-5500 + */ +bool ts_query_cursor_set_containing_byte_range(TSQueryCursor *self, uint32_t start_byte, uint32_t end_byte); + +/** + * Set the point range within which all matches must be fully contained. + * + * Set the range of bytes in which matches will be searched for. In contrast to + * `ts_query_cursor_set_point_range`, this will restrict the query cursor to only return + * matches where _all_ nodes are _fully_ contained within the given range. Both functions + * can be used together, e.g. to search for any matches that intersect line 5000, as + * long as they are fully contained within lines 4500-5500 + */ +bool ts_query_cursor_set_containing_point_range(TSQueryCursor *self, TSPoint start_point, TSPoint end_point); + /** * Advance to the next match of the currently running query. * diff --git a/lib/src/query.c b/lib/src/query.c index d1695549..7a8b855b 100644 --- a/lib/src/query.c +++ b/lib/src/query.c @@ -318,10 +318,8 @@ struct TSQueryCursor { CaptureListPool capture_list_pool; uint32_t depth; uint32_t max_start_depth; - uint32_t start_byte; - uint32_t end_byte; - TSPoint start_point; - TSPoint end_point; + TSRange included_range; + TSRange containing_range; uint32_t next_state_id; const TSQueryCursorOptions *query_options; TSQueryCursorState query_state; @@ -1336,7 +1334,7 @@ static void ts_query__perform_analysis( // of the query pattern. bool does_match = false; - // ERROR nodes can appear anywhere, so if the step is + // ERROR nodes can appear anywhere, so if the step is // looking for an ERROR node, consider it potentially matchable. if (step->symbol == ts_builtin_sym_error) { does_match = true; @@ -3155,10 +3153,18 @@ TSQueryCursor *ts_query_cursor_new(void) { .states = array_new(), .finished_states = array_new(), .capture_list_pool = capture_list_pool_new(), - .start_byte = 0, - .end_byte = UINT32_MAX, - .start_point = {0, 0}, - .end_point = POINT_MAX, + .included_range = { + .start_point = {0, 0}, + .end_point = POINT_MAX, + .start_byte = 0, + .end_byte = UINT32_MAX, + }, + .containing_range = { + .start_point = {0, 0}, + .end_point = POINT_MAX, + .start_byte = 0, + .end_byte = UINT32_MAX, + }, .max_start_depth = UINT32_MAX, .operation_count = 0, }; @@ -3266,8 +3272,8 @@ bool ts_query_cursor_set_byte_range( if (start_byte > end_byte) { return false; } - self->start_byte = start_byte; - self->end_byte = end_byte; + self->included_range.start_byte = start_byte; + self->included_range.end_byte = end_byte; return true; } @@ -3282,8 +3288,40 @@ bool ts_query_cursor_set_point_range( if (point_gt(start_point, end_point)) { return false; } - self->start_point = start_point; - self->end_point = end_point; + self->included_range.start_point = start_point; + self->included_range.end_point = end_point; + return true; +} + +bool ts_query_cursor_set_containing_byte_range( + TSQueryCursor *self, + uint32_t start_byte, + uint32_t end_byte +) { + if (end_byte == 0) { + end_byte = UINT32_MAX; + } + if (start_byte > end_byte) { + return false; + } + self->containing_range.start_byte = start_byte; + self->containing_range.end_byte = end_byte; + return true; +} + +bool ts_query_cursor_set_containing_point_range( + TSQueryCursor *self, + TSPoint start_point, + TSPoint end_point +) { + if (end_point.row == 0 && end_point.column == 0) { + end_point = POINT_MAX; + } + if (point_gt(start_point, end_point)) { + return false; + } + self->containing_range.start_point = start_point; + self->containing_range.end_point = end_point; return true; } @@ -3314,8 +3352,8 @@ static bool ts_query_cursor__first_in_progress_capture( TSNode node = array_get(captures, state->consumed_capture_count)->node; if ( - ts_node_end_byte(node) <= self->start_byte || - point_lte(ts_node_end_point(node), self->start_point) + ts_node_end_byte(node) <= self->included_range.start_byte || + point_lte(ts_node_end_point(node), self->included_range.start_point) ) { state->consumed_capture_count++; i--; @@ -3771,28 +3809,38 @@ static inline bool ts_query_cursor__advance( bool is_empty = start_byte == end_byte; bool parent_precedes_range = !ts_node_is_null(parent_node) && ( - ts_node_end_byte(parent_node) <= self->start_byte || - point_lte(ts_node_end_point(parent_node), self->start_point) + ts_node_end_byte(parent_node) <= self->included_range.start_byte || + point_lte(ts_node_end_point(parent_node), self->included_range.start_point) ); bool parent_follows_range = !ts_node_is_null(parent_node) && ( - ts_node_start_byte(parent_node) >= self->end_byte || - point_gte(ts_node_start_point(parent_node), self->end_point) + ts_node_start_byte(parent_node) >= self->included_range.end_byte || + point_gte(ts_node_start_point(parent_node), self->included_range.end_point) ); bool node_precedes_range = parent_precedes_range || - end_byte < self->start_byte || - point_lt(end_point, self->start_point) || - (!is_empty && end_byte == self->start_byte) || - (!is_empty && point_eq(end_point, self->start_point)); + end_byte < self->included_range.start_byte || + point_lt(end_point, self->included_range.start_point) || + (!is_empty && end_byte == self->included_range.start_byte) || + (!is_empty && point_eq(end_point, self->included_range.start_point)); bool node_follows_range = parent_follows_range || ( - start_byte >= self->end_byte || - point_gte(start_point, self->end_point) + start_byte >= self->included_range.end_byte || + point_gte(start_point, self->included_range.end_point) ); bool parent_intersects_range = !parent_precedes_range && !parent_follows_range; bool node_intersects_range = !node_precedes_range && !node_follows_range; + bool node_within_containing_range = + start_byte >= self->containing_range.start_byte && + point_gte(start_point, self->containing_range.start_point) && + end_byte <= self->containing_range.end_byte && + point_lte(end_point, self->containing_range.end_point); + bool node_intersects_containing_range = + end_byte > self->containing_range.start_byte && + point_gt(end_point, self->containing_range.start_point) && + start_byte < self->containing_range.end_byte && + point_lt(start_point, self->containing_range.end_point); - if (self->on_visible_node) { + if (node_within_containing_range && self->on_visible_node) { TSSymbol symbol = ts_node_symbol(node); bool is_named = ts_node_is_named(node); bool is_missing = ts_node_is_missing(node); @@ -4182,7 +4230,7 @@ static inline bool ts_query_cursor__advance( } } - if (ts_query_cursor__should_descend(self, node_intersects_range)) { + if (node_intersects_containing_range && ts_query_cursor__should_descend(self, node_intersects_range)) { switch (ts_tree_cursor_goto_first_child_internal(&self->cursor)) { case TreeCursorStepVisible: self->depth++; @@ -4304,12 +4352,12 @@ bool ts_query_cursor_next_capture( TSNode node = array_get(captures, state->consumed_capture_count)->node; bool node_precedes_range = ( - ts_node_end_byte(node) <= self->start_byte || - point_lte(ts_node_end_point(node), self->start_point) + ts_node_end_byte(node) <= self->included_range.start_byte || + point_lte(ts_node_end_point(node), self->included_range.start_point) ); bool node_follows_range = ( - ts_node_start_byte(node) >= self->end_byte || - point_gte(ts_node_start_point(node), self->end_point) + ts_node_start_byte(node) >= self->included_range.end_byte || + point_gte(ts_node_start_point(node), self->included_range.end_point) ); bool node_outside_of_range = node_precedes_range || node_follows_range; From be8fe690d8858df9f900ec8bb9506ade3425271f Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 6 Oct 2025 09:41:03 -0700 Subject: [PATCH 598/663] Clean up node range tracking in query_cursor__advance --- lib/src/query.c | 81 +++++++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 37 deletions(-) diff --git a/lib/src/query.c b/lib/src/query.c index 7a8b855b..e378910a 100644 --- a/lib/src/query.c +++ b/lib/src/query.c @@ -3678,6 +3678,31 @@ static inline bool ts_query_cursor__should_descend( return false; } +bool range_intersects(const TSRange *a, const TSRange *b) { + bool is_empty = a->start_byte == a->end_byte; + return ( + ( + a->end_byte > b->start_byte || + (is_empty && a->end_byte == b->start_byte) + ) && + ( + point_gt(a->end_point, b->start_point) || + (is_empty && point_eq(a->end_point, b->start_point)) + ) && + a->start_byte < b->end_byte && + point_lt(a->start_point, b->end_point) + ); +} + +bool range_within(const TSRange *a, const TSRange *b) { + return ( + a->start_byte >= b->start_byte && + point_gte(a->start_point, b->start_point) && + a->end_byte <= b->end_byte && + point_lte(a->end_point, b->end_point) + ); +} + // Walk the tree, processing patterns until at least one pattern finishes, // If one or more patterns finish, return `true` and store their states in the // `finished_states` array. Multiple patterns can finish on the same node. If @@ -3798,47 +3823,29 @@ static inline bool ts_query_cursor__advance( // Enter a new node. else { - // Get the properties of the current node. TSNode node = ts_tree_cursor_current_node(&self->cursor); TSNode parent_node = ts_tree_cursor_parent_node(&self->cursor); - uint32_t start_byte = ts_node_start_byte(node); - uint32_t end_byte = ts_node_end_byte(node); - TSPoint start_point = ts_node_start_point(node); - TSPoint end_point = ts_node_end_point(node); - bool is_empty = start_byte == end_byte; - - bool parent_precedes_range = !ts_node_is_null(parent_node) && ( - ts_node_end_byte(parent_node) <= self->included_range.start_byte || - point_lte(ts_node_end_point(parent_node), self->included_range.start_point) - ); - bool parent_follows_range = !ts_node_is_null(parent_node) && ( - ts_node_start_byte(parent_node) >= self->included_range.end_byte || - point_gte(ts_node_start_point(parent_node), self->included_range.end_point) - ); - bool node_precedes_range = - parent_precedes_range || - end_byte < self->included_range.start_byte || - point_lt(end_point, self->included_range.start_point) || - (!is_empty && end_byte == self->included_range.start_byte) || - (!is_empty && point_eq(end_point, self->included_range.start_point)); - - bool node_follows_range = parent_follows_range || ( - start_byte >= self->included_range.end_byte || - point_gte(start_point, self->included_range.end_point) - ); - bool parent_intersects_range = !parent_precedes_range && !parent_follows_range; - bool node_intersects_range = !node_precedes_range && !node_follows_range; - bool node_within_containing_range = - start_byte >= self->containing_range.start_byte && - point_gte(start_point, self->containing_range.start_point) && - end_byte <= self->containing_range.end_byte && - point_lte(end_point, self->containing_range.end_point); + bool parent_intersects_range = + ts_node_is_null(parent_node) || + range_intersects(&(TSRange) { + .start_point = ts_node_start_point(parent_node), + .end_point = ts_node_end_point(parent_node), + .start_byte = ts_node_start_byte(parent_node), + .end_byte = ts_node_end_byte(parent_node), + }, &self->included_range); + TSRange node_range = (TSRange) { + .start_point = ts_node_start_point(node), + .end_point = ts_node_end_point(node), + .start_byte = ts_node_start_byte(node), + .end_byte = ts_node_end_byte(node), + }; + bool node_intersects_range = + parent_intersects_range && range_intersects(&node_range, &self->included_range); bool node_intersects_containing_range = - end_byte > self->containing_range.start_byte && - point_gt(end_point, self->containing_range.start_point) && - start_byte < self->containing_range.end_byte && - point_lt(start_point, self->containing_range.end_point); + range_intersects(&node_range, &self->containing_range); + bool node_within_containing_range = + range_within(&node_range, &self->containing_range); if (node_within_containing_range && self->on_visible_node) { TSSymbol symbol = ts_node_symbol(node); From 888f57657d6dfdd6340052b29920e22a0aaabc2a Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Mon, 1 Dec 2025 21:12:35 -0500 Subject: [PATCH 599/663] fix(cli): improve error reporting for invalid range arguments to `query` command --- crates/cli/src/main.rs | 58 +++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 3ba22e45..20255d62 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -1482,30 +1482,11 @@ impl Query { loader.find_all_languages(&loader_config)?; let query_path = Path::new(&self.query_path); - let byte_range = self.byte_range.as_ref().and_then(|range| { - let mut parts = range.split(':'); - let start = parts.next()?.parse().ok()?; - let end = parts.next().unwrap().parse().ok()?; - Some(start..end) - }); - let point_range = self.row_range.as_ref().and_then(|range| { - let mut parts = range.split(':'); - let start = parts.next()?.parse().ok()?; - let end = parts.next().unwrap().parse().ok()?; - Some(Point::new(start, 0)..Point::new(end, 0)) - }); - let containing_byte_range = self.containing_byte_range.as_ref().and_then(|range| { - let mut parts = range.split(':'); - let start = parts.next()?.parse().ok()?; - let end = parts.next().unwrap().parse().ok()?; - Some(start..end) - }); - let containing_point_range = self.containing_row_range.as_ref().and_then(|range| { - let mut parts = range.split(':'); - let start = parts.next()?.parse().ok()?; - let end = parts.next().unwrap().parse().ok()?; - Some(Point::new(start, 0)..Point::new(end, 0)) - }); + let byte_range = parse_range(&self.byte_range, |x| x)?; + let point_range = parse_range(&self.row_range, |row| Point::new(row, 0))?; + let containing_byte_range = parse_range(&self.containing_byte_range, |x| x)?; + let containing_point_range = + parse_range(&self.containing_row_range, |row| Point::new(row, 0))?; let cancellation_flag = util::cancel_on_signal(); @@ -2106,3 +2087,32 @@ fn get_lib_info<'a>( None } } + +/// Parse a range string of the form "start:end" into an optional Range. +fn parse_range( + range_str: &Option, + make: impl Fn(usize) -> T, +) -> Result>> { + if let Some(range) = range_str.as_ref() { + let err_msg = format!("Invalid range '{range}', expected 'start:end'"); + let mut parts = range.split(':'); + + let Some(part) = parts.next() else { + Err(anyhow!(err_msg))? + }; + let Ok(start) = part.parse::() else { + Err(anyhow!(err_msg))? + }; + + let Some(part) = parts.next() else { + Err(anyhow!(err_msg))? + }; + let Ok(end) = part.parse::() else { + Err(anyhow!(err_msg))? + }; + + Ok(Some(make(start)..make(end))) + } else { + Ok(None) + } +} From 6b6040961cc8f7348a6b0d649770d11f1a719c19 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Nov 2025 21:38:17 +0000 Subject: [PATCH 600/663] build(deps): bump js-yaml from 4.1.0 to 4.1.1 in /lib/binding_web Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.1.0 to 4.1.1. - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/4.1.0...4.1.1) --- updated-dependencies: - dependency-name: js-yaml dependency-version: 4.1.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- lib/binding_web/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json index e5c20f7d..29f4595f 100644 --- a/lib/binding_web/package-lock.json +++ b/lib/binding_web/package-lock.json @@ -2611,9 +2611,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { From 3ff8edf9e81e804ab20068e22e989a3a25b29ad4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 15 Nov 2025 10:34:45 +0000 Subject: [PATCH 601/663] build(deps): bump js-yaml from 4.1.0 to 4.1.1 in /crates/cli/eslint Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.1.0 to 4.1.1. - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/4.1.0...4.1.1) --- updated-dependencies: - dependency-name: js-yaml dependency-version: 4.1.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- crates/cli/eslint/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/cli/eslint/package-lock.json b/crates/cli/eslint/package-lock.json index 585a4f99..60559b10 100644 --- a/crates/cli/eslint/package-lock.json +++ b/crates/cli/eslint/package-lock.json @@ -805,9 +805,9 @@ "peer": true }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "peer": true, "dependencies": { From f450ce4f6e104e1b43e44a2db770371747bf562c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Dec 2025 03:42:22 +0000 Subject: [PATCH 602/663] build(deps): bump vite from 7.1.5 to 7.1.11 in /lib/binding_web Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.5 to 7.1.11. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.1.11/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-version: 7.1.11 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- lib/binding_web/package-lock.json | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json index 29f4595f..bc34efaa 100644 --- a/lib/binding_web/package-lock.json +++ b/lib/binding_web/package-lock.json @@ -1211,6 +1211,7 @@ "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.12.0" } @@ -1261,6 +1262,7 @@ "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.44.1", "@typescript-eslint/types": "8.44.1", @@ -1628,6 +1630,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2010,6 +2013,7 @@ "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -3501,6 +3505,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -3570,6 +3575,7 @@ "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" @@ -3603,6 +3609,7 @@ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3653,11 +3660,12 @@ } }, "node_modules/vite": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.5.tgz", - "integrity": "sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==", + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.6.tgz", + "integrity": "sha512-tI2l/nFHC5rLh7+5+o7QjKjSR04ivXDF4jcgV0f/bTQ+OJiITy5S6gaynVsEM+7RqzufMnVbIon6Sr5x1SDYaQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -3774,6 +3782,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -3787,6 +3796,7 @@ "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", From a8f25fa4412db3d699ac1057200dccc5b0d0b0cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Nov 2025 01:32:43 +0000 Subject: [PATCH 603/663] build(deps): bump glob from 10.4.5 to 10.5.0 in /lib/binding_web Bumps [glob](https://github.com/isaacs/node-glob) from 10.4.5 to 10.5.0. - [Changelog](https://github.com/isaacs/node-glob/blob/main/changelog.md) - [Commits](https://github.com/isaacs/node-glob/compare/v10.4.5...v10.5.0) --- updated-dependencies: - dependency-name: glob dependency-version: 10.5.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- lib/binding_web/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json index bc34efaa..53c89f97 100644 --- a/lib/binding_web/package-lock.json +++ b/lib/binding_web/package-lock.json @@ -2354,9 +2354,9 @@ } }, "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { From 053b2645024cfdad40b0c6ccf7ab4e1b6df386fc Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Sat, 6 Dec 2025 12:07:30 +0100 Subject: [PATCH 604/663] build(deps): cargo update --- Cargo.lock | 76 +++++++++++++++++++++++++++--------------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b7b45028..db44d925 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -181,9 +181,9 @@ checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" [[package]] name = "bytes" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "cc" @@ -1008,9 +1008,9 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ "once_cell", "wasm-bindgen", @@ -1044,9 +1044,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.177" +version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" [[package]] name = "libloading" @@ -1094,9 +1094,9 @@ checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "log" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "mach2" @@ -1130,9 +1130,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "mio" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", "log", @@ -1784,9 +1784,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.110" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -1914,9 +1914,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.23.7" +version = "0.23.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +checksum = "5a9b7ac41d92f2d2803f233e297127bac397df7b337e0460a1cc39d6c006dee4" dependencies = [ "indexmap", "toml_datetime", @@ -1941,9 +1941,9 @@ checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -1952,9 +1952,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", @@ -1963,9 +1963,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" dependencies = [ "once_cell", ] @@ -2160,9 +2160,9 @@ dependencies = [ [[package]] name = "utf8-width" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" +checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091" [[package]] name = "utf8_iter" @@ -2203,9 +2203,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ "cfg-if", "once_cell", @@ -2216,9 +2216,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2226,9 +2226,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ "bumpalo", "proc-macro2", @@ -2239,9 +2239,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" dependencies = [ "unicode-ident", ] @@ -2488,9 +2488,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" dependencies = [ "js-sys", "wasm-bindgen", @@ -2785,9 +2785,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" dependencies = [ "memchr", ] @@ -2855,18 +2855,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.27" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.27" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" dependencies = [ "proc-macro2", "quote", From e6bfed33ee453fa0bdd95f9f210c4c04dbab0113 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Dec 2025 11:16:02 +0000 Subject: [PATCH 605/663] build(deps): bump the npm group across 1 directory with 7 updates Bumps the npm group with 7 updates in the /lib/binding_web directory: | Package | From | To | | --- | --- | --- | | [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) | `9.36.0` | `9.39.1` | | [@types/emscripten](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/emscripten) | `1.41.2` | `1.41.5` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `24.5.2` | `24.10.1` | | [esbuild](https://github.com/evanw/esbuild) | `0.25.10` | `0.27.0` | | [eslint](https://github.com/eslint/eslint) | `9.36.0` | `9.39.1` | | [tsx](https://github.com/privatenumber/tsx) | `4.20.5` | `4.21.0` | | [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.44.1` | `8.48.1` | Updates `@eslint/js` from 9.36.0 to 9.39.1 - [Release notes](https://github.com/eslint/eslint/releases) - [Commits](https://github.com/eslint/eslint/commits/v9.39.1/packages/js) Updates `@types/emscripten` from 1.41.2 to 1.41.5 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/emscripten) Updates `@types/node` from 24.5.2 to 24.10.1 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `esbuild` from 0.25.10 to 0.27.0 - [Release notes](https://github.com/evanw/esbuild/releases) - [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md) - [Commits](https://github.com/evanw/esbuild/compare/v0.25.10...v0.27.0) Updates `eslint` from 9.36.0 to 9.39.1 - [Release notes](https://github.com/eslint/eslint/releases) - [Commits](https://github.com/eslint/eslint/compare/v9.36.0...v9.39.1) Updates `tsx` from 4.20.5 to 4.21.0 - [Release notes](https://github.com/privatenumber/tsx/releases) - [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs) - [Commits](https://github.com/privatenumber/tsx/compare/v4.20.5...v4.21.0) Updates `typescript-eslint` from 8.44.1 to 8.48.1 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.48.1/packages/typescript-eslint) --- updated-dependencies: - dependency-name: "@eslint/js" dependency-version: 9.39.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: "@types/emscripten" dependency-version: 1.41.5 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm - dependency-name: "@types/node" dependency-version: 24.10.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: esbuild dependency-version: 0.27.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: eslint dependency-version: 9.39.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: tsx dependency-version: 4.21.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: typescript-eslint dependency-version: 8.48.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm ... Signed-off-by: dependabot[bot] --- lib/binding_web/package-lock.json | 1145 ++++++++++++++++++----------- lib/binding_web/package.json | 14 +- 2 files changed, 712 insertions(+), 447 deletions(-) diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json index 53c89f97..c4ab9e4f 100644 --- a/lib/binding_web/package-lock.json +++ b/lib/binding_web/package-lock.json @@ -9,17 +9,17 @@ "version": "0.26.0", "license": "MIT", "devDependencies": { - "@eslint/js": "^9.20.0", - "@types/emscripten": "^1.40.0", - "@types/node": "^24.3.0", + "@eslint/js": "^9.39.1", + "@types/emscripten": "^1.41.5", + "@types/node": "^24.10.1", "@vitest/coverage-v8": "^3.0.5", "dts-buddy": "^0.6.2", - "esbuild": "^0.25.0", - "eslint": "^9.20.0", + "esbuild": "^0.27.0", + "eslint": "^9.39.1", "source-map": "^0.7.4", - "tsx": "^4.19.2", + "tsx": "^4.21.0", "typescript": "^5.7.3", - "typescript-eslint": "^8.23.0", + "typescript-eslint": "^8.48.1", "vitest": "^3.0.5" } }, @@ -98,9 +98,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", - "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", + "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", "cpu": [ "ppc64" ], @@ -115,9 +115,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", - "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz", + "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", "cpu": [ "arm" ], @@ -132,9 +132,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", - "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz", + "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", "cpu": [ "arm64" ], @@ -149,9 +149,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", - "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz", + "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", "cpu": [ "x64" ], @@ -166,9 +166,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", - "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz", + "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==", "cpu": [ "arm64" ], @@ -183,9 +183,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", - "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz", + "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", "cpu": [ "x64" ], @@ -200,9 +200,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", - "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz", + "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", "cpu": [ "arm64" ], @@ -217,9 +217,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", - "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz", + "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", "cpu": [ "x64" ], @@ -234,9 +234,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", - "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz", + "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", "cpu": [ "arm" ], @@ -251,9 +251,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", - "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz", + "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", "cpu": [ "arm64" ], @@ -268,9 +268,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", - "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz", + "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", "cpu": [ "ia32" ], @@ -285,9 +285,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", - "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz", + "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", "cpu": [ "loong64" ], @@ -302,9 +302,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", - "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz", + "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", "cpu": [ "mips64el" ], @@ -319,9 +319,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", - "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz", + "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", "cpu": [ "ppc64" ], @@ -336,9 +336,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", - "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz", + "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", "cpu": [ "riscv64" ], @@ -353,9 +353,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", - "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz", + "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", "cpu": [ "s390x" ], @@ -370,9 +370,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", - "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz", + "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", "cpu": [ "x64" ], @@ -387,9 +387,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", - "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz", + "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==", "cpu": [ "arm64" ], @@ -404,9 +404,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", - "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz", + "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", "cpu": [ "x64" ], @@ -421,9 +421,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", - "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz", + "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==", "cpu": [ "arm64" ], @@ -438,9 +438,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", - "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz", + "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", "cpu": [ "x64" ], @@ -455,9 +455,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", - "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz", + "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==", "cpu": [ "arm64" ], @@ -472,9 +472,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", - "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz", + "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", "cpu": [ "x64" ], @@ -489,9 +489,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", - "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz", + "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", "cpu": [ "arm64" ], @@ -506,9 +506,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", - "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz", + "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", "cpu": [ "ia32" ], @@ -523,9 +523,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", - "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz", + "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", "cpu": [ "x64" ], @@ -582,13 +582,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -597,19 +597,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -644,9 +647,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", - "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", "dev": true, "license": "MIT", "engines": { @@ -657,9 +660,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -667,13 +670,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.2", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" }, "engines": { @@ -838,44 +841,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -1185,9 +1150,9 @@ "license": "MIT" }, "node_modules/@types/emscripten": { - "version": "1.41.2", - "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.41.2.tgz", - "integrity": "sha512-0EVXosRnffZuF+rsMM1ZVbfpwpvL2/hWycYQ/0GaH/VaoSJvcSmMl6fiPel9TZXHL3EhANxzqKOVFC6NFXyn8A==", + "version": "1.41.5", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.41.5.tgz", + "integrity": "sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q==", "dev": true, "license": "MIT" }, @@ -1206,28 +1171,28 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.5.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", - "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "undici-types": "~7.12.0" + "undici-types": "~7.16.0" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.1.tgz", - "integrity": "sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.48.1.tgz", + "integrity": "sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.44.1", - "@typescript-eslint/type-utils": "8.44.1", - "@typescript-eslint/utils": "8.44.1", - "@typescript-eslint/visitor-keys": "8.44.1", + "@typescript-eslint/scope-manager": "8.48.1", + "@typescript-eslint/type-utils": "8.48.1", + "@typescript-eslint/utils": "8.48.1", + "@typescript-eslint/visitor-keys": "8.48.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -1241,7 +1206,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.44.1", + "@typescript-eslint/parser": "^8.48.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -1257,17 +1222,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.1.tgz", - "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.48.1.tgz", + "integrity": "sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.44.1", - "@typescript-eslint/types": "8.44.1", - "@typescript-eslint/typescript-estree": "8.44.1", - "@typescript-eslint/visitor-keys": "8.44.1", + "@typescript-eslint/scope-manager": "8.48.1", + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/typescript-estree": "8.48.1", + "@typescript-eslint/visitor-keys": "8.48.1", "debug": "^4.3.4" }, "engines": { @@ -1283,14 +1248,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.1.tgz", - "integrity": "sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.48.1.tgz", + "integrity": "sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.44.1", - "@typescript-eslint/types": "^8.44.1", + "@typescript-eslint/tsconfig-utils": "^8.48.1", + "@typescript-eslint/types": "^8.48.1", "debug": "^4.3.4" }, "engines": { @@ -1305,14 +1270,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.1.tgz", - "integrity": "sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.48.1.tgz", + "integrity": "sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.1", - "@typescript-eslint/visitor-keys": "8.44.1" + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/visitor-keys": "8.48.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1323,9 +1288,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.1.tgz", - "integrity": "sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.48.1.tgz", + "integrity": "sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==", "dev": true, "license": "MIT", "engines": { @@ -1340,15 +1305,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.1.tgz", - "integrity": "sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.48.1.tgz", + "integrity": "sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.1", - "@typescript-eslint/typescript-estree": "8.44.1", - "@typescript-eslint/utils": "8.44.1", + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/typescript-estree": "8.48.1", + "@typescript-eslint/utils": "8.48.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -1365,9 +1330,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.1.tgz", - "integrity": "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.48.1.tgz", + "integrity": "sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==", "dev": true, "license": "MIT", "engines": { @@ -1379,21 +1344,20 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.1.tgz", - "integrity": "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.48.1.tgz", + "integrity": "sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.44.1", - "@typescript-eslint/tsconfig-utils": "8.44.1", - "@typescript-eslint/types": "8.44.1", - "@typescript-eslint/visitor-keys": "8.44.1", + "@typescript-eslint/project-service": "8.48.1", + "@typescript-eslint/tsconfig-utils": "8.48.1", + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/visitor-keys": "8.48.1", "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", + "tinyglobby": "^0.2.15", "ts-api-utils": "^2.1.0" }, "engines": { @@ -1434,16 +1398,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.1.tgz", - "integrity": "sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.48.1.tgz", + "integrity": "sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.44.1", - "@typescript-eslint/types": "8.44.1", - "@typescript-eslint/typescript-estree": "8.44.1" + "@typescript-eslint/scope-manager": "8.48.1", + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/typescript-estree": "8.48.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1458,13 +1422,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.1.tgz", - "integrity": "sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.48.1.tgz", + "integrity": "sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/types": "8.48.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -1741,19 +1705,6 @@ "concat-map": "0.0.1" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -1953,9 +1904,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", - "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz", + "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -1966,32 +1917,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.10", - "@esbuild/android-arm": "0.25.10", - "@esbuild/android-arm64": "0.25.10", - "@esbuild/android-x64": "0.25.10", - "@esbuild/darwin-arm64": "0.25.10", - "@esbuild/darwin-x64": "0.25.10", - "@esbuild/freebsd-arm64": "0.25.10", - "@esbuild/freebsd-x64": "0.25.10", - "@esbuild/linux-arm": "0.25.10", - "@esbuild/linux-arm64": "0.25.10", - "@esbuild/linux-ia32": "0.25.10", - "@esbuild/linux-loong64": "0.25.10", - "@esbuild/linux-mips64el": "0.25.10", - "@esbuild/linux-ppc64": "0.25.10", - "@esbuild/linux-riscv64": "0.25.10", - "@esbuild/linux-s390x": "0.25.10", - "@esbuild/linux-x64": "0.25.10", - "@esbuild/netbsd-arm64": "0.25.10", - "@esbuild/netbsd-x64": "0.25.10", - "@esbuild/openbsd-arm64": "0.25.10", - "@esbuild/openbsd-x64": "0.25.10", - "@esbuild/openharmony-arm64": "0.25.10", - "@esbuild/sunos-x64": "0.25.10", - "@esbuild/win32-arm64": "0.25.10", - "@esbuild/win32-ia32": "0.25.10", - "@esbuild/win32-x64": "0.25.10" + "@esbuild/aix-ppc64": "0.27.0", + "@esbuild/android-arm": "0.27.0", + "@esbuild/android-arm64": "0.27.0", + "@esbuild/android-x64": "0.27.0", + "@esbuild/darwin-arm64": "0.27.0", + "@esbuild/darwin-x64": "0.27.0", + "@esbuild/freebsd-arm64": "0.27.0", + "@esbuild/freebsd-x64": "0.27.0", + "@esbuild/linux-arm": "0.27.0", + "@esbuild/linux-arm64": "0.27.0", + "@esbuild/linux-ia32": "0.27.0", + "@esbuild/linux-loong64": "0.27.0", + "@esbuild/linux-mips64el": "0.27.0", + "@esbuild/linux-ppc64": "0.27.0", + "@esbuild/linux-riscv64": "0.27.0", + "@esbuild/linux-s390x": "0.27.0", + "@esbuild/linux-x64": "0.27.0", + "@esbuild/netbsd-arm64": "0.27.0", + "@esbuild/netbsd-x64": "0.27.0", + "@esbuild/openbsd-arm64": "0.27.0", + "@esbuild/openbsd-x64": "0.27.0", + "@esbuild/openharmony-arm64": "0.27.0", + "@esbuild/sunos-x64": "0.27.0", + "@esbuild/win32-arm64": "0.27.0", + "@esbuild/win32-ia32": "0.27.0", + "@esbuild/win32-x64": "0.27.0" } }, "node_modules/escape-string-regexp": { @@ -2008,26 +1959,25 @@ } }, "node_modules/eslint": { - "version": "9.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", - "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", + "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.36.0", - "@eslint/plugin-kit": "^0.3.5", + "@eslint/js": "9.39.1", + "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", @@ -2190,36 +2140,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -2234,16 +2154,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -2257,19 +2167,6 @@ "node": ">=16.0.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2520,16 +2417,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2764,30 +2651,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2985,19 +2848,6 @@ "dev": true, "license": "ISC" }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -3047,27 +2897,6 @@ "node": ">=6" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3088,17 +2917,6 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rollup": { "version": "4.49.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.49.0.tgz", @@ -3139,30 +2957,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/sade": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", @@ -3543,19 +3337,6 @@ "node": ">=14.0.0" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -3570,14 +3351,14 @@ } }, "node_modules/tsx": { - "version": "4.20.5", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", - "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "esbuild": "~0.25.0", + "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" }, "bin": { @@ -3619,16 +3400,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.44.1.tgz", - "integrity": "sha512-0ws8uWGrUVTjEeN2OM4K1pLKHK/4NiNP/vz6ns+LjT/6sqpaYzIVFajZb1fj/IDwpsrrHb3Jy0Qm5u9CPcKaeg==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.48.1.tgz", + "integrity": "sha512-FbOKN1fqNoXp1hIl5KYpObVrp0mCn+CLgn479nmu2IsRMrx2vyv74MmsBLVlhg8qVwNFGbXSp8fh1zp8pEoC2A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.44.1", - "@typescript-eslint/parser": "8.44.1", - "@typescript-eslint/typescript-estree": "8.44.1", - "@typescript-eslint/utils": "8.44.1" + "@typescript-eslint/eslint-plugin": "8.48.1", + "@typescript-eslint/parser": "8.48.1", + "@typescript-eslint/typescript-estree": "8.48.1", + "@typescript-eslint/utils": "8.48.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3643,9 +3424,9 @@ } }, "node_modules/undici-types": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", - "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, @@ -3758,6 +3539,490 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, "node_modules/vite/node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json index 8faf9ecb..04a19c5d 100644 --- a/lib/binding_web/package.json +++ b/lib/binding_web/package.json @@ -69,17 +69,17 @@ "web-tree-sitter.d.cts.map" ], "devDependencies": { - "@eslint/js": "^9.20.0", - "@types/emscripten": "^1.40.0", - "@types/node": "^24.3.0", + "@eslint/js": "^9.39.1", + "@types/emscripten": "^1.41.5", + "@types/node": "^24.10.1", "@vitest/coverage-v8": "^3.0.5", "dts-buddy": "^0.6.2", - "esbuild": "^0.25.0", - "eslint": "^9.20.0", + "esbuild": "^0.27.0", + "eslint": "^9.39.1", "source-map": "^0.7.4", - "tsx": "^4.19.2", + "tsx": "^4.21.0", "typescript": "^5.7.3", - "typescript-eslint": "^8.23.0", + "typescript-eslint": "^8.48.1", "vitest": "^3.0.5" }, "scripts": { From bec7c3272b7b05bc316e179f5eb0db1a3792ff59 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Sun, 7 Dec 2025 04:09:22 -0500 Subject: [PATCH 606/663] fix(loader)!: correct arguments passed to `select_language` --- crates/cli/src/main.rs | 27 ++++++++++++++++++--------- crates/loader/src/loader.rs | 14 ++++++++++---- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 20255d62..81a67991 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -1109,7 +1109,7 @@ impl Parse { let path = Path::new(&path); let language = loader .select_language( - path, + Some(path), current_dir, self.scope.as_deref(), lib_info.as_ref(), @@ -1140,7 +1140,12 @@ impl Parse { let language = if let Some(ref lib_path) = self.lib_path { &loader - .select_language(lib_path, current_dir, None, lib_info.as_ref()) + .select_language( + None, + current_dir, + self.scope.as_deref(), + lib_info.as_ref(), + ) .with_context(|| { anyhow!( "Failed to load language for path \"{}\"", @@ -1174,8 +1179,12 @@ impl Parse { let path = get_tmp_source_file(&contents)?; let name = "stdin"; - let language = - loader.select_language(&path, current_dir, None, lib_info.as_ref())?; + let language = loader.select_language( + None, + current_dir, + self.scope.as_deref(), + lib_info.as_ref(), + )?; parse::parse_file_at_path( &mut parser, @@ -1256,7 +1265,7 @@ impl Test { let lib_info = get_lib_info(self.lib_path.as_ref(), self.lang_name.as_ref(), current_dir); &loader - .select_language(lib_path, current_dir, None, lib_info.as_ref()) + .select_language(None, current_dir, None, lib_info.as_ref()) .with_context(|| { anyhow!( "Failed to load language for path \"{}\"", @@ -1437,7 +1446,7 @@ impl Fuzz { let lang_name = lib_info.1.to_string(); &( loader - .select_language(lib_path, current_dir, None, Some(&lib_info)) + .select_language(None, current_dir, None, Some(&lib_info)) .with_context(|| { anyhow!( "Failed to load language for path \"{}\"", @@ -1505,7 +1514,7 @@ impl Query { match input { CliInput::Paths(paths) => { let language = loader.select_language( - Path::new(&paths[0]), + Some(Path::new(&paths[0])), current_dir, self.scope.as_deref(), lib_info.as_ref(), @@ -1541,7 +1550,7 @@ impl Query { let languages = loader.languages_at_path(current_dir)?; let language = if let Some(ref lib_path) = self.lib_path { &loader - .select_language(lib_path, current_dir, None, lib_info.as_ref()) + .select_language(None, current_dir, None, lib_info.as_ref()) .with_context(|| { anyhow!( "Failed to load language for path \"{}\"", @@ -1575,7 +1584,7 @@ impl Query { let path = get_tmp_source_file(&contents)?; let language = - loader.select_language(&path, current_dir, None, lib_info.as_ref())?; + loader.select_language(None, current_dir, None, lib_info.as_ref())?; let opts = QueryFileOptions { ordered_captures: self.captures, byte_range, diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index 00108506..16819cc4 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -1702,7 +1702,7 @@ impl Loader { pub fn select_language( &mut self, - path: &Path, + path: Option<&Path>, current_dir: &Path, scope: Option<&str>, // path to dynamic library, name of language @@ -1720,7 +1720,7 @@ impl Loader { } else { Err(LoaderError::UnknownScope(scope.to_string())) } - } else if let Some((lang, _)) = + } else if let Some((lang, _)) = if let Some(path) = path { self.language_configuration_for_file_name(path) .map_err(|e| { LoaderError::FileNameLoad( @@ -1728,7 +1728,9 @@ impl Loader { Box::new(e), ) })? - { + } else { + None + } { Ok(lang) } else if let Some(id) = self.language_configuration_in_current_path { Ok(self.language_for_id(self.language_configurations[id].language_id)?) @@ -1739,7 +1741,11 @@ impl Loader { .cloned() { Ok(lang.0) - } else if let Some(lang) = self.language_configuration_for_first_line_regex(path)? { + } else if let Some(lang) = if let Some(path) = path { + self.language_configuration_for_first_line_regex(path)? + } else { + None + } { Ok(lang.0) } else { Err(LoaderError::NoLanguage) From 3182efeccc5de2f50d4611466607222a29a4b059 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Wed, 1 Oct 2025 11:39:37 +0300 Subject: [PATCH 607/663] feat(bindings): add byproducts to cmake --- crates/cli/src/init.rs | 7 +++++-- crates/cli/src/templates/cmakelists.cmake | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index 6d821f04..9eacdb25 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -743,13 +743,16 @@ pub fn generate_grammar_files( "#}, indoc! {r#" add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json" + "${CMAKE_CURRENT_SOURCE_DIR}/src/node-types.json" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/grammar.js" - COMMAND "${TREE_SITTER_CLI}" generate grammar.js - --no-parser + COMMAND "${TREE_SITTER_CLI}" generate grammar.js --no-parser WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMENT "Generating grammar.json") add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/parser.c" + BYPRODUCTS "${CMAKE_CURRENT_SOURCE_DIR}/src/tree_sitter/parser.h" + "${CMAKE_CURRENT_SOURCE_DIR}/src/tree_sitter/alloc.h" + "${CMAKE_CURRENT_SOURCE_DIR}/src/tree_sitter/array.h" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json" COMMAND "${TREE_SITTER_CLI}" generate src/grammar.json --abi=${TREE_SITTER_ABI_VERSION} diff --git a/crates/cli/src/templates/cmakelists.cmake b/crates/cli/src/templates/cmakelists.cmake index b0f4f790..06acbc8f 100644 --- a/crates/cli/src/templates/cmakelists.cmake +++ b/crates/cli/src/templates/cmakelists.cmake @@ -20,13 +20,16 @@ include(GNUInstallDirs) find_program(TREE_SITTER_CLI tree-sitter DOC "Tree-sitter CLI") add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json" + "${CMAKE_CURRENT_SOURCE_DIR}/src/node-types.json" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/grammar.js" - COMMAND "${TREE_SITTER_CLI}" generate grammar.js - --no-parser + COMMAND "${TREE_SITTER_CLI}" generate grammar.js --no-parser WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMENT "Generating grammar.json") add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/parser.c" + BYPRODUCTS "${CMAKE_CURRENT_SOURCE_DIR}/src/tree_sitter/parser.h" + "${CMAKE_CURRENT_SOURCE_DIR}/src/tree_sitter/alloc.h" + "${CMAKE_CURRENT_SOURCE_DIR}/src/tree_sitter/array.h" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json" COMMAND "${TREE_SITTER_CLI}" generate src/grammar.json --abi=${TREE_SITTER_ABI_VERSION} From 8ca17d1bb174633fca8cf662483b4ff145a2eba6 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Sun, 28 Sep 2025 10:44:05 +0300 Subject: [PATCH 608/663] ci(release): enable trusted publishing & attestations --- .github/workflows/release.yml | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 11b0d27b..2d692c02 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,6 +17,8 @@ jobs: runs-on: ubuntu-latest needs: build permissions: + id-token: write + attestations: write contents: write steps: - name: Checkout repository @@ -47,9 +49,16 @@ jobs: rm -rf artifacts ls -l target/ + - name: Generate attestations + uses: actions/attest-build-provenance@v3 + with: + subject-path: | + target/tree-sitter-*.gz + target/web-tree-sitter.tar.gz + - name: Create release run: |- - gh release create ${{ github.ref_name }} \ + gh release create $GITHUB_REF_NAME \ target/tree-sitter-*.gz \ target/web-tree-sitter.tar.gz env: @@ -58,6 +67,10 @@ jobs: crates_io: name: Publish packages to Crates.io runs-on: ubuntu-latest + environment: crates + permissions: + id-token: write + contents: read needs: release steps: - name: Checkout repository @@ -66,14 +79,22 @@ jobs: - name: Set up Rust uses: actions-rust-lang/setup-rust-toolchain@v1 + - name: Set up registry token + id: auth + uses: rust-lang/crates-io-auth-action@v1 + - name: Publish crates to Crates.io uses: katyo/publish-crates@v2 with: - registry-token: ${{ secrets.CARGO_REGISTRY_TOKEN }} + registry-token: ${{ steps.auth.outputs.token }} npm: name: Publish packages to npmjs.com runs-on: ubuntu-latest + environment: npm + permissions: + id-token: write + contents: read needs: release strategy: fail-fast: false @@ -106,5 +127,3 @@ jobs: - name: Publish to npmjs.com working-directory: ${{ matrix.directory }} run: npm publish - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} From b9c2d1dc8900e8ee9a5d9e04d3f135c8638d2b3f Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Tue, 5 Aug 2025 22:40:48 +0300 Subject: [PATCH 609/663] feat(bindings): add Java bindings --- crates/cli/src/init.rs | 128 +++++++++++++++++--- crates/cli/src/main.rs | 10 ++ crates/cli/src/templates/.editorconfig | 6 +- crates/cli/src/templates/binding.java | 65 +++++++++++ crates/cli/src/templates/gitattributes | 4 + crates/cli/src/templates/gitignore | 1 + crates/cli/src/templates/pom.xml | 154 +++++++++++++++++++++++++ crates/cli/src/templates/test.java | 12 ++ crates/loader/src/loader.rs | 11 +- 9 files changed, 369 insertions(+), 22 deletions(-) create mode 100644 crates/cli/src/templates/binding.java create mode 100644 crates/cli/src/templates/pom.xml create mode 100644 crates/cli/src/templates/test.java diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index 9eacdb25..b0cdb586 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -36,6 +36,8 @@ const PARSER_CLASS_NAME_PLACEHOLDER: &str = "PARSER_CLASS_NAME"; const PARSER_DESCRIPTION_PLACEHOLDER: &str = "PARSER_DESCRIPTION"; const PARSER_LICENSE_PLACEHOLDER: &str = "PARSER_LICENSE"; +const PARSER_NS_PLACEHOLDER: &str = "PARSER_NS"; +const PARSER_NS_CLEANED_PLACEHOLDER: &str = "PARSER_NS_CLEANED"; const PARSER_URL_PLACEHOLDER: &str = "PARSER_URL"; const PARSER_URL_STRIPPED_PLACEHOLDER: &str = "PARSER_URL_STRIPPED"; const PARSER_VERSION_PLACEHOLDER: &str = "PARSER_VERSION"; @@ -58,6 +60,11 @@ const AUTHOR_BLOCK_RS: &str = "\nauthors = ["; const AUTHOR_NAME_PLACEHOLDER_RS: &str = "PARSER_AUTHOR_NAME"; const AUTHOR_EMAIL_PLACEHOLDER_RS: &str = " PARSER_AUTHOR_EMAIL"; +const AUTHOR_BLOCK_JAVA: &str = "\n "; +const AUTHOR_NAME_PLACEHOLDER_JAVA: &str = "\n PARSER_AUTHOR_NAME"; +const AUTHOR_EMAIL_PLACEHOLDER_JAVA: &str = "\n PARSER_AUTHOR_EMAIL"; +const AUTHOR_URL_PLACEHOLDER_JAVA: &str = "\n PARSER_AUTHOR_URL"; + const AUTHOR_BLOCK_GRAMMAR: &str = "\n * @author "; const AUTHOR_NAME_PLACEHOLDER_GRAMMAR: &str = "PARSER_AUTHOR_NAME"; const AUTHOR_EMAIL_PLACEHOLDER_GRAMMAR: &str = " PARSER_AUTHOR_EMAIL"; @@ -107,6 +114,10 @@ const TEST_BINDING_PY_TEMPLATE: &str = include_str!("./templates/test_binding.py const PACKAGE_SWIFT_TEMPLATE: &str = include_str!("./templates/package.swift"); const TESTS_SWIFT_TEMPLATE: &str = include_str!("./templates/tests.swift"); +const POM_XML_TEMPLATE: &str = include_str!("./templates/pom.xml"); +const BINDING_JAVA_TEMPLATE: &str = include_str!("./templates/binding.java"); +const TEST_JAVA_TEMPLATE: &str = include_str!("./templates/test.java"); + const BUILD_ZIG_TEMPLATE: &str = include_str!("./templates/build.zig"); const BUILD_ZIG_ZON_TEMPLATE: &str = include_str!("./templates/build.zig.zon"); const ROOT_ZIG_TEMPLATE: &str = include_str!("./templates/root.zig"); @@ -134,6 +145,7 @@ pub struct JsonConfigOpts { pub email: Option, #[serde(skip_serializing_if = "Option::is_none")] pub url: Option, + pub namespace: Option, pub bindings: Bindings, } @@ -174,7 +186,7 @@ impl JsonConfigOpts { }), funding: self.funding, }), - namespace: None, + namespace: self.namespace, }, bindings: self.bindings, } @@ -197,6 +209,7 @@ impl Default for JsonConfigOpts { author: String::new(), email: None, url: None, + namespace: None, bindings: Bindings::default(), } } @@ -218,6 +231,7 @@ struct GenerateOpts<'a> { injections_query_path: &'a str, locals_query_path: &'a str, tags_query_path: &'a str, + namespace: Option<&'a str>, } pub fn generate_grammar_files( @@ -311,6 +325,7 @@ pub fn generate_grammar_files( tags_query_path: tree_sitter_config.grammars[0] .tags .to_variable_value(&default_tags_path), + namespace: tree_sitter_config.metadata.namespace.as_deref(), }; // Create package.json @@ -1048,6 +1063,45 @@ pub fn generate_grammar_files( })?; } + // Generate Java bindings + if tree_sitter_config.bindings.java { + missing_path(repo_path.join("pom.xml"), |path| { + generate_file(path, POM_XML_TEMPLATE, language_name, &generate_opts) + })?; + + missing_path(bindings_dir.join("java"), create_dir)?.apply(|path| { + missing_path(path.join("main"), create_dir)?.apply(|path| { + let package_path = generate_opts + .namespace + .unwrap_or("io.github.treesitter") + .replace(['-', '_'], "") + .split('.') + .fold(path.to_path_buf(), |path, dir| path.join(dir)) + .join("jtreesitter") + .join(language_name.to_lowercase().replace('_', "")); + missing_path(package_path, create_dir)?.apply(|path| { + missing_path(path.join(format!("{class_name}.java")), |path| { + generate_file(path, BINDING_JAVA_TEMPLATE, language_name, &generate_opts) + })?; + + Ok(()) + })?; + + Ok(()) + })?; + + missing_path(path.join("test"), create_dir)?.apply(|path| { + missing_path(path.join(format!("{class_name}Test.java")), |path| { + generate_file(path, TEST_JAVA_TEMPLATE, language_name, &generate_opts) + })?; + + Ok(()) + })?; + + Ok(()) + })?; + } + Ok(()) } @@ -1097,6 +1151,15 @@ fn generate_file( ) -> Result<()> { let filename = path.file_name().unwrap().to_str().unwrap(); + let lower_parser_name = if path + .extension() + .is_some_and(|e| e.eq_ignore_ascii_case("java")) + { + language_name.to_snake_case().replace('_', "") + } else { + language_name.to_snake_case() + }; + let mut replacement = template .replace( CAMEL_PARSER_NAME_PLACEHOLDER, @@ -1110,14 +1173,11 @@ fn generate_file( UPPER_PARSER_NAME_PLACEHOLDER, &language_name.to_shouty_snake_case(), ) - .replace( - LOWER_PARSER_NAME_PLACEHOLDER, - &language_name.to_snake_case(), - ) .replace( KEBAB_PARSER_NAME_PLACEHOLDER, &language_name.to_kebab_case(), ) + .replace(LOWER_PARSER_NAME_PLACEHOLDER, &lower_parser_name) .replace(PARSER_NAME_PLACEHOLDER, language_name) .replace(CLI_VERSION_PLACEHOLDER, CLI_VERSION) .replace(RUST_BINDING_VERSION_PLACEHOLDER, RUST_BINDING_VERSION) @@ -1157,6 +1217,9 @@ fn generate_file( "Cargo.toml" => { replacement = replacement.replace(AUTHOR_NAME_PLACEHOLDER_RS, ""); } + "pom.xml" => { + replacement = replacement.replace(AUTHOR_NAME_PLACEHOLDER_JAVA, ""); + } _ => {} } } @@ -1182,30 +1245,52 @@ fn generate_file( "Cargo.toml" => { replacement = replacement.replace(AUTHOR_EMAIL_PLACEHOLDER_RS, ""); } + "pom.xml" => { + replacement = replacement.replace(AUTHOR_EMAIL_PLACEHOLDER_JAVA, ""); + } _ => {} } } - if filename == "package.json" { - if let Some(url) = generate_opts.author_url { + match (generate_opts.author_url, filename) { + (Some(url), "package.json" | "pom.xml") => { replacement = replacement.replace(AUTHOR_URL_PLACEHOLDER, url); - } else { + } + (None, "package.json") => { replacement = replacement.replace(AUTHOR_URL_PLACEHOLDER_JS, ""); } + (None, "pom.xml") => { + replacement = replacement.replace(AUTHOR_URL_PLACEHOLDER_JAVA, ""); + } + _ => {} } if generate_opts.author_name.is_none() && generate_opts.author_email.is_none() && generate_opts.author_url.is_none() - && filename == "package.json" { - if let Some(start_idx) = replacement.find(AUTHOR_BLOCK_JS) { - if let Some(end_idx) = replacement[start_idx..] - .find("},") - .map(|i| i + start_idx + 2) - { - replacement.replace_range(start_idx..end_idx, ""); + match filename { + "package.json" => { + if let Some(start_idx) = replacement.find(AUTHOR_BLOCK_JS) { + if let Some(end_idx) = replacement[start_idx..] + .find("},") + .map(|i| i + start_idx + 2) + { + replacement.replace_range(start_idx..end_idx, ""); + } + } } + "pom.xml" => { + if let Some(start_idx) = replacement.find(AUTHOR_BLOCK_JAVA) { + if let Some(end_idx) = replacement[start_idx..] + .find("") + .map(|i| i + start_idx + 12) + { + replacement.replace_range(start_idx..end_idx, ""); + } + } + } + _ => {} } } else if generate_opts.author_name.is_none() && generate_opts.author_email.is_none() { match filename { @@ -1286,6 +1371,19 @@ fn generate_file( ); } + if let Some(namespace) = generate_opts.namespace { + replacement = replacement + .replace( + PARSER_NS_CLEANED_PLACEHOLDER, + &namespace.replace(['-', '_'], ""), + ) + .replace(PARSER_NS_PLACEHOLDER, namespace); + } else { + replacement = replacement + .replace(PARSER_NS_CLEANED_PLACEHOLDER, "io.github.treesitter") + .replace(PARSER_NS_PLACEHOLDER, "io.github.tree-sitter"); + } + if let Some(funding_url) = generate_opts.funding { match filename { "pyproject.toml" | "package.json" => { diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 81a67991..937e54b4 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -772,6 +772,14 @@ impl Init { .map(|e| Some(e.trim().to_string())) }; + let namespace = || { + Input::::with_theme(&ColorfulTheme::default()) + .with_prompt("Package namespace") + .default("io.github.tree-sitter".to_string()) + .allow_empty(true) + .interact() + }; + let bindings = || { let languages = Bindings::default().languages(); @@ -801,6 +809,7 @@ impl Init { "author", "email", "url", + "namespace", "bindings", "exit", ]; @@ -821,6 +830,7 @@ impl Init { "author" => opts.author = author()?, "email" => opts.email = email()?, "url" => opts.url = url()?, + "namespace" => opts.namespace = Some(namespace()?), "bindings" => opts.bindings = bindings()?, "exit" => break, _ => unreachable!(), diff --git a/crates/cli/src/templates/.editorconfig b/crates/cli/src/templates/.editorconfig index c4650c59..ff17b12f 100644 --- a/crates/cli/src/templates/.editorconfig +++ b/crates/cli/src/templates/.editorconfig @@ -3,7 +3,7 @@ root = true [*] charset = utf-8 -[*.{json,toml,yml,gyp}] +[*.{json,toml,yml,gyp,xml}] indent_style = space indent_size = 2 @@ -31,6 +31,10 @@ indent_size = 4 indent_style = space indent_size = 4 +[*.java] +indent_style = space +indent_size = 4 + [*.go] indent_style = tab indent_size = 8 diff --git a/crates/cli/src/templates/binding.java b/crates/cli/src/templates/binding.java new file mode 100644 index 00000000..704064a0 --- /dev/null +++ b/crates/cli/src/templates/binding.java @@ -0,0 +1,65 @@ +package PARSER_NS_CLEANED.jtreesitter.LOWER_PARSER_NAME; + +import java.lang.foreign.*; + +public final class PARSER_CLASS_NAME { + private static final ValueLayout VOID_PTR = + ValueLayout.ADDRESS.withTargetLayout(MemoryLayout.sequenceLayout(Long.MAX_VALUE, ValueLayout.JAVA_BYTE)); + private static final FunctionDescriptor FUNC_DESC = FunctionDescriptor.of(VOID_PTR); + private static final Linker LINKER = Linker.nativeLinker(); + private static final PARSER_CLASS_NAME INSTANCE = new PARSER_CLASS_NAME(); + + private final Arena arena = Arena.ofAuto(); + private volatile SymbolLookup lookup = null; + + private PARSER_CLASS_NAME() {} + + /** + * Get the tree-sitter language for this grammar. + */ + public static MemorySegment language() { + if (INSTANCE.lookup == null) + INSTANCE.lookup = INSTANCE.findLibrary(); + return language(INSTANCE.lookup); + } + + /** + * Get the tree-sitter language for this grammar. + * + * The {@linkplain Arena} used in the {@code lookup} + * must not be closed while the language is being used. + */ + public static MemorySegment language(SymbolLookup lookup) { + return call(lookup, "tree_sitter_PARSER_NAME"); + } + + private SymbolLookup findLibrary() { + try { + var library = System.mapLibraryName("tree-sitter-KEBAB_PARSER_NAME"); + return SymbolLookup.libraryLookup(library, arena); + } catch (IllegalArgumentException ex1) { + try { + System.loadLibrary("tree-sitter-KEBAB_PARSER_NAME"); + return SymbolLookup.loaderLookup(); + } catch (UnsatisfiedLinkError ex2) { + ex1.addSuppressed(ex2); + throw ex1; + } + } + } + + private static UnsatisfiedLinkError unresolved(String name) { + return new UnsatisfiedLinkError("Unresolved symbol: %s".formatted(name)); + } + + @SuppressWarnings("SameParameterValue") + private static MemorySegment call(SymbolLookup lookup, String name) throws UnsatisfiedLinkError { + var address = lookup.find(name).orElseThrow(() -> unresolved(name)); + try { + var function = LINKER.downcallHandle(address, FUNC_DESC); + return (MemorySegment) function.invokeExact(); + } catch (Throwable e) { + throw new RuntimeException("Call to %s failed".formatted(name), e); + } + } +} diff --git a/crates/cli/src/templates/gitattributes b/crates/cli/src/templates/gitattributes index 7772c942..027ac707 100644 --- a/crates/cli/src/templates/gitattributes +++ b/crates/cli/src/templates/gitattributes @@ -40,3 +40,7 @@ Package.resolved linguist-generated bindings/zig/* linguist-generated build.zig linguist-generated build.zig.zon linguist-generated + +# Java bindings +pom.xml linguist-generated +bindings/java/** linguist-generated diff --git a/crates/cli/src/templates/gitignore b/crates/cli/src/templates/gitignore index bc9e191a..7c0cb7f5 100644 --- a/crates/cli/src/templates/gitignore +++ b/crates/cli/src/templates/gitignore @@ -45,3 +45,4 @@ zig-out/ *.tar.gz *.tgz *.zip +*.jar diff --git a/crates/cli/src/templates/pom.xml b/crates/cli/src/templates/pom.xml new file mode 100644 index 00000000..661fe42b --- /dev/null +++ b/crates/cli/src/templates/pom.xml @@ -0,0 +1,154 @@ + + + 4.0.0 + PARSER_NS + jtreesitter-KEBAB_PARSER_NAME + JTreeSitter CAMEL_PARSER_NAME + PARSER_VERSION + PARSER_DESCRIPTION + PARSER_URL + + + PARSER_LICENSE + https://spdx.org/licenses/PARSER_LICENSE.html + + + + + PARSER_AUTHOR_NAME + PARSER_AUTHOR_EMAIL + PARSER_AUTHOR_URL + + + + PARSER_URL + scm:git:git://PARSER_URL_STRIPPED.git + scm:git:ssh://PARSER_URL_STRIPPED.git + + + 23 + UTF-8 + true + true + false + true + + + + io.github.tree-sitter + jtreesitter + 0.26.0 + true + + + org.junit.jupiter + junit-jupiter-api + 6.0.1 + test + + + + bindings/java/main + bindings/java/test + + + maven-surefire-plugin + 3.5.4 + + + ${project.build.directory}/reports/surefire + + --enable-native-access=ALL-UNNAMED + + + + maven-javadoc-plugin + 3.12.0 + + + + jar + + + + + public + true + true + all,-missing + + + + maven-source-plugin + 3.3.1 + + + + jar-no-fork + + + + + + maven-gpg-plugin + 3.2.8 + + + verify + + sign + + + true + + --no-tty + --pinentry-mode + loopback + + + + + + + io.github.mavenplugins + central-publishing-maven-plugin + 1.1.1 + + + deploy + + publish + + + validated + ${publish.auto} + ${publish.skip} + ${project.artifactId}-${project.version}.zip + ${project.artifactId}-${project.version}.zip + + + + true + + + + + + ci + + + env.CI + true + + + + false + true + false + + + + diff --git a/crates/cli/src/templates/test.java b/crates/cli/src/templates/test.java new file mode 100644 index 00000000..8bf81ea0 --- /dev/null +++ b/crates/cli/src/templates/test.java @@ -0,0 +1,12 @@ +import io.github.treesitter.jtreesitter.Language; +import PARSER_NS_CLEANED.jtreesitter.LOWER_PARSER_NAME.PARSER_CLASS_NAME; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +public class PARSER_CLASS_NAMETest { + @Test + public void testCanLoadLanguage() { + assertDoesNotThrow(() -> new Language(PARSER_CLASS_NAME.language())); + } +} diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index 16819cc4..d64b89de 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -450,7 +450,6 @@ pub struct Links { pub struct Bindings { pub c: bool, pub go: bool, - #[serde(skip)] pub java: bool, #[serde(skip)] pub kotlin: bool, @@ -464,12 +463,12 @@ pub struct Bindings { impl Bindings { /// return available languages and its default enabled state. #[must_use] - pub const fn languages(&self) -> [(&'static str, bool); 7] { + pub const fn languages(&self) -> [(&'static str, bool); 8] { [ ("c", true), ("go", true), - // Comment out Java and Kotlin until the bindings are actually available. - // ("java", false), + ("java", false), + // Comment out Kotlin until the bindings are actually available. // ("kotlin", false), ("node", true), ("python", true), @@ -500,8 +499,8 @@ impl Bindings { match v { "c" => out.c = true, "go" => out.go = true, - // Comment out Java and Kotlin until the bindings are actually available. - // "java" => out.java = true, + "java" => out.java = true, + // Comment out Kotlin until the bindings are actually available. // "kotlin" => out.kotlin = true, "node" => out.node = true, "python" => out.python = true, From d861e2bcd9f9ca087cbc1de74acfc54c31395e7b Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Mon, 8 Dec 2025 18:43:15 +0200 Subject: [PATCH 610/663] docs(cli): list Java & Zig binding files --- docs/src/cli/init.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/src/cli/init.md b/docs/src/cli/init.md index 2d7d6847..b3b802eb 100644 --- a/docs/src/cli/init.md +++ b/docs/src/cli/init.md @@ -115,11 +115,11 @@ Each key is a language name, and the value is a boolean. - `c` (default: `true`) - `go` (default: `true`) - `java` (default: `false`) -- `kotlin` (default: `false`) - `node` (default: `true`) - `python` (default: `true`) - `rust` (default: `true`) - `swift` (default: `false`) +- `zig` (default: `false`) ## Binding Files @@ -153,6 +153,12 @@ if you have one. - `bindings/node/index.d.ts` — This file provides type hints for your parser when used in TypeScript. - `bindings/node/binding_test.js` — This file contains a test for the Node.js package. +### Java + +- `pom.xml` - This file is the manifest of the Maven package. +- `bindings/java/main/namespace/language/TreeSitterLanguage.java` - This file wraps your language in a Java class. +- `bindings/java/test/namespace/language/TreeSitterLanguageTest.java` - This file contains a test for the Java package. + ### Python - `pyproject.toml` — This file is the manifest of the Python package. @@ -175,6 +181,13 @@ if you have one. - `bindings/swift/TreeSitterLanguage/language.h` — This file wraps your language in a Swift module when used in Swift. - `bindings/swift/TreeSitterLanguageTests/TreeSitterLanguageTests.swift` — This file contains a test for the Swift package. +### Zig + +- `build.zig` - This file tells Zig how to compile your language. +- `build.zig.zon` - This file is the manifest of the Zig package. +- `bindings/zig/root.zig` - This file wraps your language in a Zig module. +- `bindings/zig/test.zig` - This file contains a test for the Zig package. + ### Additional Files Additionally, there's a few other files that are generated when you run `tree-sitter init`, From 974be3bb30282fdf545c5724bf4367786519a1b6 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Mon, 8 Dec 2025 15:15:38 -0500 Subject: [PATCH 611/663] fix(rust): specify workspace dependency of `tree-sitter-language` crate as "0.1" If a rust project depends on both the tree-sitter lib bindings and the language crate, cargo needs to be able to resolve a common version of the tree-sitter-language crate. Specifying exactly "0.1.5" for the lib bindings is overly restrictive, and could lead to future headaches. By specifying "0.1", any "0.1.x" version should be available to resolve to. --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 71cf0253..9461cbf0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -160,4 +160,4 @@ tree-sitter-config = { version = "0.26.0", path = "./crates/config" } tree-sitter-highlight = { version = "0.26.0", path = "./crates/highlight" } tree-sitter-tags = { version = "0.26.0", path = "./crates/tags" } -tree-sitter-language = { version = "0.1.5", path = "./crates/language" } +tree-sitter-language = { version = "0.1", path = "./crates/language" } From b0afbf376224724ba97c68a54e36b63b71939695 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 21:07:59 +0000 Subject: [PATCH 612/663] build(deps): bump wasmparser from 0.242.0 to 0.243.0 in the cargo group Bumps the cargo group with 1 update: [wasmparser](https://github.com/bytecodealliance/wasm-tools). Updates `wasmparser` from 0.242.0 to 0.243.0 - [Release notes](https://github.com/bytecodealliance/wasm-tools/releases) - [Commits](https://github.com/bytecodealliance/wasm-tools/commits) --- updated-dependencies: - dependency-name: wasmparser dependency-version: 0.243.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 6 +++--- Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index db44d925..103fb39a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2027,7 +2027,7 @@ dependencies = [ "tree-sitter-tests-proc-macro", "unindent", "walkdir", - "wasmparser 0.242.0", + "wasmparser 0.243.0", "webbrowser", "widestring", ] @@ -2271,9 +2271,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.242.0" +version = "0.243.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3c6e611f4cd748d85c767815823b777dc56afca793fcda27beae4e85028849" +checksum = "f6d8db401b0528ec316dfbe579e6ab4152d61739cfe076706d2009127970159d" dependencies = [ "bitflags 2.10.0", "hashbrown 0.15.5", diff --git a/Cargo.toml b/Cargo.toml index 9461cbf0..9faa4041 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -150,7 +150,7 @@ tiny_http = "0.12.0" topological-sort = "0.2.2" unindent = "0.2.4" walkdir = "2.5.0" -wasmparser = "0.242.0" +wasmparser = "0.243.0" webbrowser = "1.0.5" tree-sitter = { version = "0.26.0", path = "./lib" } From 8a3dcc6155a9faae677544303b6bc0caf1aef296 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Mon, 8 Dec 2025 16:06:45 -0500 Subject: [PATCH 613/663] release 0.26.1 --- CMakeLists.txt | 2 +- Cargo.lock | 14 +++++++------- Cargo.toml | 14 +++++++------- Makefile | 2 +- build.zig.zon | 2 +- crates/cli/npm/package-lock.json | 4 ++-- crates/cli/npm/package.json | 2 +- docs/src/cli/generate.md | 2 +- flake.nix | 2 +- lib/binding_web/package-lock.json | 4 ++-- lib/binding_web/package.json | 2 +- 11 files changed, 25 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f0d1d813..dd5cff28 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.13) project(tree-sitter - VERSION "0.26.0" + VERSION "0.26.1" DESCRIPTION "An incremental parsing system for programming tools" HOMEPAGE_URL "https://tree-sitter.github.io/tree-sitter/" LANGUAGES C) diff --git a/Cargo.lock b/Cargo.lock index 103fb39a..3382fe2a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1972,7 +1972,7 @@ dependencies = [ [[package]] name = "tree-sitter" -version = "0.26.0" +version = "0.26.1" dependencies = [ "bindgen", "cc", @@ -1986,7 +1986,7 @@ dependencies = [ [[package]] name = "tree-sitter-cli" -version = "0.26.0" +version = "0.26.1" dependencies = [ "ansi_colours", "anstyle", @@ -2034,7 +2034,7 @@ dependencies = [ [[package]] name = "tree-sitter-config" -version = "0.26.0" +version = "0.26.1" dependencies = [ "etcetera", "log", @@ -2045,7 +2045,7 @@ dependencies = [ [[package]] name = "tree-sitter-generate" -version = "0.26.0" +version = "0.26.1" dependencies = [ "bitflags 2.10.0", "dunce", @@ -2068,7 +2068,7 @@ dependencies = [ [[package]] name = "tree-sitter-highlight" -version = "0.26.0" +version = "0.26.1" dependencies = [ "regex", "streaming-iterator", @@ -2082,7 +2082,7 @@ version = "0.1.5" [[package]] name = "tree-sitter-loader" -version = "0.26.0" +version = "0.26.1" dependencies = [ "cc", "etcetera", @@ -2104,7 +2104,7 @@ dependencies = [ [[package]] name = "tree-sitter-tags" -version = "0.26.0" +version = "0.26.1" dependencies = [ "memchr", "regex", diff --git a/Cargo.toml b/Cargo.toml index 9faa4041..9d16282f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ members = [ resolver = "2" [workspace.package] -version = "0.26.0" +version = "0.26.1" authors = [ "Max Brunsfeld ", "Amaan Qureshi ", @@ -153,11 +153,11 @@ walkdir = "2.5.0" wasmparser = "0.243.0" webbrowser = "1.0.5" -tree-sitter = { version = "0.26.0", path = "./lib" } -tree-sitter-generate = { version = "0.26.0", path = "./crates/generate" } -tree-sitter-loader = { version = "0.26.0", path = "./crates/loader" } -tree-sitter-config = { version = "0.26.0", path = "./crates/config" } -tree-sitter-highlight = { version = "0.26.0", path = "./crates/highlight" } -tree-sitter-tags = { version = "0.26.0", path = "./crates/tags" } +tree-sitter = { version = "0.26.1", path = "./lib" } +tree-sitter-generate = { version = "0.26.1", path = "./crates/generate" } +tree-sitter-loader = { version = "0.26.1", path = "./crates/loader" } +tree-sitter-config = { version = "0.26.1", path = "./crates/config" } +tree-sitter-highlight = { version = "0.26.1", path = "./crates/highlight" } +tree-sitter-tags = { version = "0.26.1", path = "./crates/tags" } tree-sitter-language = { version = "0.1", path = "./crates/language" } diff --git a/Makefile b/Makefile index f8106fa0..7d1f326f 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -VERSION := 0.26.0 +VERSION := 0.26.1 DESCRIPTION := An incremental parsing system for programming tools HOMEPAGE_URL := https://tree-sitter.github.io/tree-sitter/ diff --git a/build.zig.zon b/build.zig.zon index 48e52686..b68d7d53 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -1,7 +1,7 @@ .{ .name = .tree_sitter, .fingerprint = 0x841224b447ac0d4f, - .version = "0.26.0", + .version = "0.26.1", .minimum_zig_version = "0.14.1", .paths = .{ "build.zig", diff --git a/crates/cli/npm/package-lock.json b/crates/cli/npm/package-lock.json index ae8bddb6..083474f6 100644 --- a/crates/cli/npm/package-lock.json +++ b/crates/cli/npm/package-lock.json @@ -1,12 +1,12 @@ { "name": "tree-sitter-cli", - "version": "0.26.0", + "version": "0.26.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "tree-sitter-cli", - "version": "0.26.0", + "version": "0.26.1", "hasInstallScript": true, "license": "MIT", "bin": { diff --git a/crates/cli/npm/package.json b/crates/cli/npm/package.json index 23835503..6e3e6029 100644 --- a/crates/cli/npm/package.json +++ b/crates/cli/npm/package.json @@ -1,6 +1,6 @@ { "name": "tree-sitter-cli", - "version": "0.26.0", + "version": "0.26.1", "author": { "name": "Max Brunsfeld", "email": "maxbrunsfeld@gmail.com" diff --git a/docs/src/cli/generate.md b/docs/src/cli/generate.md index 6175381f..b56bb798 100644 --- a/docs/src/cli/generate.md +++ b/docs/src/cli/generate.md @@ -51,7 +51,7 @@ Report conflicts in a JSON format. ### `--js-runtime ` The path to the JavaScript runtime executable to use when generating the parser. The default is `node`. -Note that you can also set this with `TREE_SITTER_JS_RUNTIME`. Starting from version 0.26.0, you can +Note that you can also set this with `TREE_SITTER_JS_RUNTIME`. Starting from version 0.26.1, you can also pass in `native` to use the experimental native QuickJS runtime that comes bundled with the CLI. This avoids the dependency on a JavaScript runtime entirely. The native QuickJS runtime is compatible with ESM as well as with CommonJS in strict mode. If your grammar depends on `npm` to install dependencies such as base grammars, the native runtime can be used *after* running `npm install`. diff --git a/flake.nix b/flake.nix index be7d1bad..3333670c 100644 --- a/flake.nix +++ b/flake.nix @@ -17,7 +17,7 @@ eachSystem = lib.genAttrs systems; pkgsFor = inputs.nixpkgs.legacyPackages; - version = "0.26.0"; + version = "0.26.1"; fs = lib.fileset; src = fs.toSource { diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json index c4ab9e4f..02372d26 100644 --- a/lib/binding_web/package-lock.json +++ b/lib/binding_web/package-lock.json @@ -1,12 +1,12 @@ { "name": "web-tree-sitter", - "version": "0.26.0", + "version": "0.26.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "web-tree-sitter", - "version": "0.26.0", + "version": "0.26.1", "license": "MIT", "devDependencies": { "@eslint/js": "^9.39.1", diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json index 04a19c5d..772078ac 100644 --- a/lib/binding_web/package.json +++ b/lib/binding_web/package.json @@ -1,6 +1,6 @@ { "name": "web-tree-sitter", - "version": "0.26.0", + "version": "0.26.1", "description": "Tree-sitter bindings for the web", "repository": { "type": "git", From 744e556f7ea96087bd8cc2433a2d1ce951684204 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 21:13:08 +0000 Subject: [PATCH 614/663] build(deps): bump esbuild Bumps the npm group with 1 update in the /lib/binding_web directory: [esbuild](https://github.com/evanw/esbuild). Updates `esbuild` from 0.27.0 to 0.27.1 - [Release notes](https://github.com/evanw/esbuild/releases) - [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md) - [Commits](https://github.com/evanw/esbuild/compare/v0.27.0...v0.27.1) --- updated-dependencies: - dependency-name: esbuild dependency-version: 0.27.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm ... Signed-off-by: dependabot[bot] --- lib/binding_web/package-lock.json | 216 +++++++++++++++--------------- lib/binding_web/package.json | 2 +- 2 files changed, 109 insertions(+), 109 deletions(-) diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json index 02372d26..ae02badc 100644 --- a/lib/binding_web/package-lock.json +++ b/lib/binding_web/package-lock.json @@ -14,7 +14,7 @@ "@types/node": "^24.10.1", "@vitest/coverage-v8": "^3.0.5", "dts-buddy": "^0.6.2", - "esbuild": "^0.27.0", + "esbuild": "^0.27.1", "eslint": "^9.39.1", "source-map": "^0.7.4", "tsx": "^4.21.0", @@ -98,9 +98,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", - "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.1.tgz", + "integrity": "sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==", "cpu": [ "ppc64" ], @@ -115,9 +115,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz", - "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.1.tgz", + "integrity": "sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==", "cpu": [ "arm" ], @@ -132,9 +132,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz", - "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.1.tgz", + "integrity": "sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==", "cpu": [ "arm64" ], @@ -149,9 +149,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz", - "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.1.tgz", + "integrity": "sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==", "cpu": [ "x64" ], @@ -166,9 +166,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz", - "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.1.tgz", + "integrity": "sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==", "cpu": [ "arm64" ], @@ -183,9 +183,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz", - "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.1.tgz", + "integrity": "sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==", "cpu": [ "x64" ], @@ -200,9 +200,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz", - "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.1.tgz", + "integrity": "sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==", "cpu": [ "arm64" ], @@ -217,9 +217,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz", - "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.1.tgz", + "integrity": "sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==", "cpu": [ "x64" ], @@ -234,9 +234,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz", - "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.1.tgz", + "integrity": "sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==", "cpu": [ "arm" ], @@ -251,9 +251,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz", - "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.1.tgz", + "integrity": "sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==", "cpu": [ "arm64" ], @@ -268,9 +268,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz", - "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.1.tgz", + "integrity": "sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==", "cpu": [ "ia32" ], @@ -285,9 +285,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz", - "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.1.tgz", + "integrity": "sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==", "cpu": [ "loong64" ], @@ -302,9 +302,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz", - "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.1.tgz", + "integrity": "sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==", "cpu": [ "mips64el" ], @@ -319,9 +319,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz", - "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.1.tgz", + "integrity": "sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==", "cpu": [ "ppc64" ], @@ -336,9 +336,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz", - "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.1.tgz", + "integrity": "sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==", "cpu": [ "riscv64" ], @@ -353,9 +353,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz", - "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.1.tgz", + "integrity": "sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==", "cpu": [ "s390x" ], @@ -370,9 +370,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz", - "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.1.tgz", + "integrity": "sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==", "cpu": [ "x64" ], @@ -387,9 +387,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz", - "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.1.tgz", + "integrity": "sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==", "cpu": [ "arm64" ], @@ -404,9 +404,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz", - "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.1.tgz", + "integrity": "sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==", "cpu": [ "x64" ], @@ -421,9 +421,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz", - "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.1.tgz", + "integrity": "sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==", "cpu": [ "arm64" ], @@ -438,9 +438,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz", - "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.1.tgz", + "integrity": "sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==", "cpu": [ "x64" ], @@ -455,9 +455,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz", - "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.1.tgz", + "integrity": "sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==", "cpu": [ "arm64" ], @@ -472,9 +472,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz", - "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.1.tgz", + "integrity": "sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==", "cpu": [ "x64" ], @@ -489,9 +489,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz", - "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.1.tgz", + "integrity": "sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==", "cpu": [ "arm64" ], @@ -506,9 +506,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz", - "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.1.tgz", + "integrity": "sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==", "cpu": [ "ia32" ], @@ -523,9 +523,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz", - "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.1.tgz", + "integrity": "sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==", "cpu": [ "x64" ], @@ -1904,9 +1904,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz", - "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.1.tgz", + "integrity": "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -1917,32 +1917,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.0", - "@esbuild/android-arm": "0.27.0", - "@esbuild/android-arm64": "0.27.0", - "@esbuild/android-x64": "0.27.0", - "@esbuild/darwin-arm64": "0.27.0", - "@esbuild/darwin-x64": "0.27.0", - "@esbuild/freebsd-arm64": "0.27.0", - "@esbuild/freebsd-x64": "0.27.0", - "@esbuild/linux-arm": "0.27.0", - "@esbuild/linux-arm64": "0.27.0", - "@esbuild/linux-ia32": "0.27.0", - "@esbuild/linux-loong64": "0.27.0", - "@esbuild/linux-mips64el": "0.27.0", - "@esbuild/linux-ppc64": "0.27.0", - "@esbuild/linux-riscv64": "0.27.0", - "@esbuild/linux-s390x": "0.27.0", - "@esbuild/linux-x64": "0.27.0", - "@esbuild/netbsd-arm64": "0.27.0", - "@esbuild/netbsd-x64": "0.27.0", - "@esbuild/openbsd-arm64": "0.27.0", - "@esbuild/openbsd-x64": "0.27.0", - "@esbuild/openharmony-arm64": "0.27.0", - "@esbuild/sunos-x64": "0.27.0", - "@esbuild/win32-arm64": "0.27.0", - "@esbuild/win32-ia32": "0.27.0", - "@esbuild/win32-x64": "0.27.0" + "@esbuild/aix-ppc64": "0.27.1", + "@esbuild/android-arm": "0.27.1", + "@esbuild/android-arm64": "0.27.1", + "@esbuild/android-x64": "0.27.1", + "@esbuild/darwin-arm64": "0.27.1", + "@esbuild/darwin-x64": "0.27.1", + "@esbuild/freebsd-arm64": "0.27.1", + "@esbuild/freebsd-x64": "0.27.1", + "@esbuild/linux-arm": "0.27.1", + "@esbuild/linux-arm64": "0.27.1", + "@esbuild/linux-ia32": "0.27.1", + "@esbuild/linux-loong64": "0.27.1", + "@esbuild/linux-mips64el": "0.27.1", + "@esbuild/linux-ppc64": "0.27.1", + "@esbuild/linux-riscv64": "0.27.1", + "@esbuild/linux-s390x": "0.27.1", + "@esbuild/linux-x64": "0.27.1", + "@esbuild/netbsd-arm64": "0.27.1", + "@esbuild/netbsd-x64": "0.27.1", + "@esbuild/openbsd-arm64": "0.27.1", + "@esbuild/openbsd-x64": "0.27.1", + "@esbuild/openharmony-arm64": "0.27.1", + "@esbuild/sunos-x64": "0.27.1", + "@esbuild/win32-arm64": "0.27.1", + "@esbuild/win32-ia32": "0.27.1", + "@esbuild/win32-x64": "0.27.1" } }, "node_modules/escape-string-regexp": { diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json index 772078ac..afdcd599 100644 --- a/lib/binding_web/package.json +++ b/lib/binding_web/package.json @@ -74,7 +74,7 @@ "@types/node": "^24.10.1", "@vitest/coverage-v8": "^3.0.5", "dts-buddy": "^0.6.2", - "esbuild": "^0.27.0", + "esbuild": "^0.27.1", "eslint": "^9.39.1", "source-map": "^0.7.4", "tsx": "^4.21.0", From 8b8199775f96ca8642cf7860da46100875b38453 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Mon, 8 Dec 2025 17:38:17 -0500 Subject: [PATCH 615/663] 0.26.x Also bump the tree-sitter-language crate to 0.1.6 --- CMakeLists.txt | 2 +- Cargo.lock | 16 ++++++++-------- Cargo.toml | 14 +++++++------- Makefile | 2 +- build.zig.zon | 2 +- crates/cli/npm/package-lock.json | 4 ++-- crates/cli/npm/package.json | 2 +- crates/language/Cargo.toml | 2 +- docs/src/cli/generate.md | 2 +- flake.nix | 2 +- lib/binding_web/package-lock.json | 4 ++-- lib/binding_web/package.json | 2 +- 12 files changed, 27 insertions(+), 27 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dd5cff28..893a4d85 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.13) project(tree-sitter - VERSION "0.26.1" + VERSION "0.26.2" DESCRIPTION "An incremental parsing system for programming tools" HOMEPAGE_URL "https://tree-sitter.github.io/tree-sitter/" LANGUAGES C) diff --git a/Cargo.lock b/Cargo.lock index 3382fe2a..46245bae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1972,7 +1972,7 @@ dependencies = [ [[package]] name = "tree-sitter" -version = "0.26.1" +version = "0.26.2" dependencies = [ "bindgen", "cc", @@ -1986,7 +1986,7 @@ dependencies = [ [[package]] name = "tree-sitter-cli" -version = "0.26.1" +version = "0.26.2" dependencies = [ "ansi_colours", "anstyle", @@ -2034,7 +2034,7 @@ dependencies = [ [[package]] name = "tree-sitter-config" -version = "0.26.1" +version = "0.26.2" dependencies = [ "etcetera", "log", @@ -2045,7 +2045,7 @@ dependencies = [ [[package]] name = "tree-sitter-generate" -version = "0.26.1" +version = "0.26.2" dependencies = [ "bitflags 2.10.0", "dunce", @@ -2068,7 +2068,7 @@ dependencies = [ [[package]] name = "tree-sitter-highlight" -version = "0.26.1" +version = "0.26.2" dependencies = [ "regex", "streaming-iterator", @@ -2078,11 +2078,11 @@ dependencies = [ [[package]] name = "tree-sitter-language" -version = "0.1.5" +version = "0.1.6" [[package]] name = "tree-sitter-loader" -version = "0.26.1" +version = "0.26.2" dependencies = [ "cc", "etcetera", @@ -2104,7 +2104,7 @@ dependencies = [ [[package]] name = "tree-sitter-tags" -version = "0.26.1" +version = "0.26.2" dependencies = [ "memchr", "regex", diff --git a/Cargo.toml b/Cargo.toml index 9d16282f..0f42c350 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ members = [ resolver = "2" [workspace.package] -version = "0.26.1" +version = "0.26.2" authors = [ "Max Brunsfeld ", "Amaan Qureshi ", @@ -153,11 +153,11 @@ walkdir = "2.5.0" wasmparser = "0.243.0" webbrowser = "1.0.5" -tree-sitter = { version = "0.26.1", path = "./lib" } -tree-sitter-generate = { version = "0.26.1", path = "./crates/generate" } -tree-sitter-loader = { version = "0.26.1", path = "./crates/loader" } -tree-sitter-config = { version = "0.26.1", path = "./crates/config" } -tree-sitter-highlight = { version = "0.26.1", path = "./crates/highlight" } -tree-sitter-tags = { version = "0.26.1", path = "./crates/tags" } +tree-sitter = { version = "0.26.2", path = "./lib" } +tree-sitter-generate = { version = "0.26.2", path = "./crates/generate" } +tree-sitter-loader = { version = "0.26.2", path = "./crates/loader" } +tree-sitter-config = { version = "0.26.2", path = "./crates/config" } +tree-sitter-highlight = { version = "0.26.2", path = "./crates/highlight" } +tree-sitter-tags = { version = "0.26.2", path = "./crates/tags" } tree-sitter-language = { version = "0.1", path = "./crates/language" } diff --git a/Makefile b/Makefile index 7d1f326f..f4e1f20e 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -VERSION := 0.26.1 +VERSION := 0.26.2 DESCRIPTION := An incremental parsing system for programming tools HOMEPAGE_URL := https://tree-sitter.github.io/tree-sitter/ diff --git a/build.zig.zon b/build.zig.zon index b68d7d53..b78230e4 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -1,7 +1,7 @@ .{ .name = .tree_sitter, .fingerprint = 0x841224b447ac0d4f, - .version = "0.26.1", + .version = "0.26.2", .minimum_zig_version = "0.14.1", .paths = .{ "build.zig", diff --git a/crates/cli/npm/package-lock.json b/crates/cli/npm/package-lock.json index 083474f6..034fa7ac 100644 --- a/crates/cli/npm/package-lock.json +++ b/crates/cli/npm/package-lock.json @@ -1,12 +1,12 @@ { "name": "tree-sitter-cli", - "version": "0.26.1", + "version": "0.26.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "tree-sitter-cli", - "version": "0.26.1", + "version": "0.26.2", "hasInstallScript": true, "license": "MIT", "bin": { diff --git a/crates/cli/npm/package.json b/crates/cli/npm/package.json index 6e3e6029..091bdc2e 100644 --- a/crates/cli/npm/package.json +++ b/crates/cli/npm/package.json @@ -1,6 +1,6 @@ { "name": "tree-sitter-cli", - "version": "0.26.1", + "version": "0.26.2", "author": { "name": "Max Brunsfeld", "email": "maxbrunsfeld@gmail.com" diff --git a/crates/language/Cargo.toml b/crates/language/Cargo.toml index 4de0f339..c86b55b2 100644 --- a/crates/language/Cargo.toml +++ b/crates/language/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "tree-sitter-language" description = "The tree-sitter Language type, used by the library and by language implementations" -version = "0.1.5" +version = "0.1.6" authors.workspace = true edition.workspace = true rust-version = "1.77" diff --git a/docs/src/cli/generate.md b/docs/src/cli/generate.md index b56bb798..a01347cb 100644 --- a/docs/src/cli/generate.md +++ b/docs/src/cli/generate.md @@ -51,7 +51,7 @@ Report conflicts in a JSON format. ### `--js-runtime ` The path to the JavaScript runtime executable to use when generating the parser. The default is `node`. -Note that you can also set this with `TREE_SITTER_JS_RUNTIME`. Starting from version 0.26.1, you can +Note that you can also set this with `TREE_SITTER_JS_RUNTIME`. Starting from version 0.26.2, you can also pass in `native` to use the experimental native QuickJS runtime that comes bundled with the CLI. This avoids the dependency on a JavaScript runtime entirely. The native QuickJS runtime is compatible with ESM as well as with CommonJS in strict mode. If your grammar depends on `npm` to install dependencies such as base grammars, the native runtime can be used *after* running `npm install`. diff --git a/flake.nix b/flake.nix index 3333670c..f786bbdf 100644 --- a/flake.nix +++ b/flake.nix @@ -17,7 +17,7 @@ eachSystem = lib.genAttrs systems; pkgsFor = inputs.nixpkgs.legacyPackages; - version = "0.26.1"; + version = "0.26.2"; fs = lib.fileset; src = fs.toSource { diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json index ae02badc..2333bc68 100644 --- a/lib/binding_web/package-lock.json +++ b/lib/binding_web/package-lock.json @@ -1,12 +1,12 @@ { "name": "web-tree-sitter", - "version": "0.26.1", + "version": "0.26.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "web-tree-sitter", - "version": "0.26.1", + "version": "0.26.2", "license": "MIT", "devDependencies": { "@eslint/js": "^9.39.1", diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json index afdcd599..cee31219 100644 --- a/lib/binding_web/package.json +++ b/lib/binding_web/package.json @@ -1,6 +1,6 @@ { "name": "web-tree-sitter", - "version": "0.26.1", + "version": "0.26.2", "description": "Tree-sitter bindings for the web", "repository": { "type": "git", From 3bd44afcaa5770c9fb413cb9e168d3caa5da25d8 Mon Sep 17 00:00:00 2001 From: Marcono1234 Date: Tue, 9 Dec 2025 22:20:22 +0100 Subject: [PATCH 616/663] docs(cli): fix wrong file path for Java bindings test The test is currently generated in the default (= unnamed) package. --- docs/src/cli/init.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/cli/init.md b/docs/src/cli/init.md index b3b802eb..75d9a152 100644 --- a/docs/src/cli/init.md +++ b/docs/src/cli/init.md @@ -157,7 +157,7 @@ if you have one. - `pom.xml` - This file is the manifest of the Maven package. - `bindings/java/main/namespace/language/TreeSitterLanguage.java` - This file wraps your language in a Java class. -- `bindings/java/test/namespace/language/TreeSitterLanguageTest.java` - This file contains a test for the Java package. +- `bindings/java/test/TreeSitterLanguageTest.java` - This file contains a test for the Java package. ### Python From 1b654ae35d07818cfd188d28c9e0dec9fe24c3bb Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Wed, 10 Dec 2025 21:08:14 +0200 Subject: [PATCH 617/663] ci(release): use node 24 --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2d692c02..c3cf2d7a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -107,7 +107,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version: 20 + node-version: 24 registry-url: https://registry.npmjs.org - name: Set up Rust From 8caecbc13f62b7532b66ed8e367f537a280285b6 Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Sat, 13 Dec 2025 12:35:58 +0100 Subject: [PATCH 618/663] build(deps): cargo update --- Cargo.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 46245bae..6e87f8ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -187,9 +187,9 @@ checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "cc" -version = "1.2.48" +version = "1.2.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c481bdbf0ed3b892f6f806287d72acd515b352a4ec27a208489b8c1bc839633a" +checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" dependencies = [ "find-msvc-tools", "shlex", @@ -853,9 +853,9 @@ checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" dependencies = [ "icu_collections", "icu_locale_core", @@ -867,9 +867,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] name = "icu_provider" @@ -1721,9 +1721,9 @@ dependencies = [ [[package]] name = "shell-words" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" +checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" [[package]] name = "shlex" @@ -1914,9 +1914,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.23.8" +version = "0.23.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9b7ac41d92f2d2803f233e297127bac397df7b337e0460a1cc39d6c006dee4" +checksum = "5d7cbc3b4b49633d57a0509303158ca50de80ae32c265093b24c414705807832" dependencies = [ "indexmap", "toml_datetime", From cd4b6e2ef996d4baca12caadb78dffc8b55bc869 Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Sat, 13 Dec 2025 13:01:32 +0100 Subject: [PATCH 619/663] 0.26.3 --- CMakeLists.txt | 2 +- Cargo.lock | 14 +++++++------- Cargo.toml | 14 +++++++------- Makefile | 2 +- build.zig.zon | 2 +- crates/cli/npm/package-lock.json | 4 ++-- crates/cli/npm/package.json | 2 +- docs/src/cli/generate.md | 2 +- flake.nix | 2 +- lib/binding_web/package-lock.json | 4 ++-- lib/binding_web/package.json | 2 +- 11 files changed, 25 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 893a4d85..ab0ceb74 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.13) project(tree-sitter - VERSION "0.26.2" + VERSION "0.26.3" DESCRIPTION "An incremental parsing system for programming tools" HOMEPAGE_URL "https://tree-sitter.github.io/tree-sitter/" LANGUAGES C) diff --git a/Cargo.lock b/Cargo.lock index 6e87f8ea..37bd9595 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1972,7 +1972,7 @@ dependencies = [ [[package]] name = "tree-sitter" -version = "0.26.2" +version = "0.26.3" dependencies = [ "bindgen", "cc", @@ -1986,7 +1986,7 @@ dependencies = [ [[package]] name = "tree-sitter-cli" -version = "0.26.2" +version = "0.26.3" dependencies = [ "ansi_colours", "anstyle", @@ -2034,7 +2034,7 @@ dependencies = [ [[package]] name = "tree-sitter-config" -version = "0.26.2" +version = "0.26.3" dependencies = [ "etcetera", "log", @@ -2045,7 +2045,7 @@ dependencies = [ [[package]] name = "tree-sitter-generate" -version = "0.26.2" +version = "0.26.3" dependencies = [ "bitflags 2.10.0", "dunce", @@ -2068,7 +2068,7 @@ dependencies = [ [[package]] name = "tree-sitter-highlight" -version = "0.26.2" +version = "0.26.3" dependencies = [ "regex", "streaming-iterator", @@ -2082,7 +2082,7 @@ version = "0.1.6" [[package]] name = "tree-sitter-loader" -version = "0.26.2" +version = "0.26.3" dependencies = [ "cc", "etcetera", @@ -2104,7 +2104,7 @@ dependencies = [ [[package]] name = "tree-sitter-tags" -version = "0.26.2" +version = "0.26.3" dependencies = [ "memchr", "regex", diff --git a/Cargo.toml b/Cargo.toml index 0f42c350..e88e4edd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ members = [ resolver = "2" [workspace.package] -version = "0.26.2" +version = "0.26.3" authors = [ "Max Brunsfeld ", "Amaan Qureshi ", @@ -153,11 +153,11 @@ walkdir = "2.5.0" wasmparser = "0.243.0" webbrowser = "1.0.5" -tree-sitter = { version = "0.26.2", path = "./lib" } -tree-sitter-generate = { version = "0.26.2", path = "./crates/generate" } -tree-sitter-loader = { version = "0.26.2", path = "./crates/loader" } -tree-sitter-config = { version = "0.26.2", path = "./crates/config" } -tree-sitter-highlight = { version = "0.26.2", path = "./crates/highlight" } -tree-sitter-tags = { version = "0.26.2", path = "./crates/tags" } +tree-sitter = { version = "0.26.3", path = "./lib" } +tree-sitter-generate = { version = "0.26.3", path = "./crates/generate" } +tree-sitter-loader = { version = "0.26.3", path = "./crates/loader" } +tree-sitter-config = { version = "0.26.3", path = "./crates/config" } +tree-sitter-highlight = { version = "0.26.3", path = "./crates/highlight" } +tree-sitter-tags = { version = "0.26.3", path = "./crates/tags" } tree-sitter-language = { version = "0.1", path = "./crates/language" } diff --git a/Makefile b/Makefile index f4e1f20e..831933c0 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -VERSION := 0.26.2 +VERSION := 0.26.3 DESCRIPTION := An incremental parsing system for programming tools HOMEPAGE_URL := https://tree-sitter.github.io/tree-sitter/ diff --git a/build.zig.zon b/build.zig.zon index b78230e4..aecd6fb8 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -1,7 +1,7 @@ .{ .name = .tree_sitter, .fingerprint = 0x841224b447ac0d4f, - .version = "0.26.2", + .version = "0.26.3", .minimum_zig_version = "0.14.1", .paths = .{ "build.zig", diff --git a/crates/cli/npm/package-lock.json b/crates/cli/npm/package-lock.json index 034fa7ac..a85aa44a 100644 --- a/crates/cli/npm/package-lock.json +++ b/crates/cli/npm/package-lock.json @@ -1,12 +1,12 @@ { "name": "tree-sitter-cli", - "version": "0.26.2", + "version": "0.26.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "tree-sitter-cli", - "version": "0.26.2", + "version": "0.26.3", "hasInstallScript": true, "license": "MIT", "bin": { diff --git a/crates/cli/npm/package.json b/crates/cli/npm/package.json index 091bdc2e..d4ecb194 100644 --- a/crates/cli/npm/package.json +++ b/crates/cli/npm/package.json @@ -1,6 +1,6 @@ { "name": "tree-sitter-cli", - "version": "0.26.2", + "version": "0.26.3", "author": { "name": "Max Brunsfeld", "email": "maxbrunsfeld@gmail.com" diff --git a/docs/src/cli/generate.md b/docs/src/cli/generate.md index a01347cb..1362b0c4 100644 --- a/docs/src/cli/generate.md +++ b/docs/src/cli/generate.md @@ -51,7 +51,7 @@ Report conflicts in a JSON format. ### `--js-runtime ` The path to the JavaScript runtime executable to use when generating the parser. The default is `node`. -Note that you can also set this with `TREE_SITTER_JS_RUNTIME`. Starting from version 0.26.2, you can +Note that you can also set this with `TREE_SITTER_JS_RUNTIME`. Starting from version 0.26, you can also pass in `native` to use the experimental native QuickJS runtime that comes bundled with the CLI. This avoids the dependency on a JavaScript runtime entirely. The native QuickJS runtime is compatible with ESM as well as with CommonJS in strict mode. If your grammar depends on `npm` to install dependencies such as base grammars, the native runtime can be used *after* running `npm install`. diff --git a/flake.nix b/flake.nix index f786bbdf..abdd3d01 100644 --- a/flake.nix +++ b/flake.nix @@ -17,7 +17,7 @@ eachSystem = lib.genAttrs systems; pkgsFor = inputs.nixpkgs.legacyPackages; - version = "0.26.2"; + version = "0.26.3"; fs = lib.fileset; src = fs.toSource { diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json index 2333bc68..cdb08980 100644 --- a/lib/binding_web/package-lock.json +++ b/lib/binding_web/package-lock.json @@ -1,12 +1,12 @@ { "name": "web-tree-sitter", - "version": "0.26.2", + "version": "0.26.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "web-tree-sitter", - "version": "0.26.2", + "version": "0.26.3", "license": "MIT", "devDependencies": { "@eslint/js": "^9.39.1", diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json index cee31219..57956509 100644 --- a/lib/binding_web/package.json +++ b/lib/binding_web/package.json @@ -1,6 +1,6 @@ { "name": "web-tree-sitter", - "version": "0.26.2", + "version": "0.26.3", "description": "Tree-sitter bindings for the web", "repository": { "type": "git", From 98de2bc1a87bd2e7ef7f299fbd8843400978efe4 Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Sat, 13 Dec 2025 13:46:48 +0100 Subject: [PATCH 620/663] feat: start working on v0.27 * bump tree-sitter crates to 0.27.0 * bump tree-sitter-language to 0.1.7 --- CMakeLists.txt | 2 +- Cargo.lock | 16 ++++++++-------- Cargo.toml | 14 +++++++------- Makefile | 2 +- build.zig.zon | 2 +- crates/cli/npm/package-lock.json | 4 ++-- crates/cli/npm/package.json | 2 +- crates/language/Cargo.toml | 2 +- flake.nix | 2 +- lib/binding_web/package-lock.json | 4 ++-- lib/binding_web/package.json | 2 +- 11 files changed, 26 insertions(+), 26 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ab0ceb74..b40ac55a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.13) project(tree-sitter - VERSION "0.26.3" + VERSION "0.27.0" DESCRIPTION "An incremental parsing system for programming tools" HOMEPAGE_URL "https://tree-sitter.github.io/tree-sitter/" LANGUAGES C) diff --git a/Cargo.lock b/Cargo.lock index 37bd9595..eb0d8b4d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1972,7 +1972,7 @@ dependencies = [ [[package]] name = "tree-sitter" -version = "0.26.3" +version = "0.27.0" dependencies = [ "bindgen", "cc", @@ -1986,7 +1986,7 @@ dependencies = [ [[package]] name = "tree-sitter-cli" -version = "0.26.3" +version = "0.27.0" dependencies = [ "ansi_colours", "anstyle", @@ -2034,7 +2034,7 @@ dependencies = [ [[package]] name = "tree-sitter-config" -version = "0.26.3" +version = "0.27.0" dependencies = [ "etcetera", "log", @@ -2045,7 +2045,7 @@ dependencies = [ [[package]] name = "tree-sitter-generate" -version = "0.26.3" +version = "0.27.0" dependencies = [ "bitflags 2.10.0", "dunce", @@ -2068,7 +2068,7 @@ dependencies = [ [[package]] name = "tree-sitter-highlight" -version = "0.26.3" +version = "0.27.0" dependencies = [ "regex", "streaming-iterator", @@ -2078,11 +2078,11 @@ dependencies = [ [[package]] name = "tree-sitter-language" -version = "0.1.6" +version = "0.1.7" [[package]] name = "tree-sitter-loader" -version = "0.26.3" +version = "0.27.0" dependencies = [ "cc", "etcetera", @@ -2104,7 +2104,7 @@ dependencies = [ [[package]] name = "tree-sitter-tags" -version = "0.26.3" +version = "0.27.0" dependencies = [ "memchr", "regex", diff --git a/Cargo.toml b/Cargo.toml index e88e4edd..daf79bf5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ members = [ resolver = "2" [workspace.package] -version = "0.26.3" +version = "0.27.0" authors = [ "Max Brunsfeld ", "Amaan Qureshi ", @@ -153,11 +153,11 @@ walkdir = "2.5.0" wasmparser = "0.243.0" webbrowser = "1.0.5" -tree-sitter = { version = "0.26.3", path = "./lib" } -tree-sitter-generate = { version = "0.26.3", path = "./crates/generate" } -tree-sitter-loader = { version = "0.26.3", path = "./crates/loader" } -tree-sitter-config = { version = "0.26.3", path = "./crates/config" } -tree-sitter-highlight = { version = "0.26.3", path = "./crates/highlight" } -tree-sitter-tags = { version = "0.26.3", path = "./crates/tags" } +tree-sitter = { version = "0.27.0", path = "./lib" } +tree-sitter-generate = { version = "0.27.0", path = "./crates/generate" } +tree-sitter-loader = { version = "0.27.0", path = "./crates/loader" } +tree-sitter-config = { version = "0.27.0", path = "./crates/config" } +tree-sitter-highlight = { version = "0.27.0", path = "./crates/highlight" } +tree-sitter-tags = { version = "0.27.0", path = "./crates/tags" } tree-sitter-language = { version = "0.1", path = "./crates/language" } diff --git a/Makefile b/Makefile index 831933c0..d0b402f0 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -VERSION := 0.26.3 +VERSION := 0.27.0 DESCRIPTION := An incremental parsing system for programming tools HOMEPAGE_URL := https://tree-sitter.github.io/tree-sitter/ diff --git a/build.zig.zon b/build.zig.zon index aecd6fb8..4ef5de16 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -1,7 +1,7 @@ .{ .name = .tree_sitter, .fingerprint = 0x841224b447ac0d4f, - .version = "0.26.3", + .version = "0.27.0", .minimum_zig_version = "0.14.1", .paths = .{ "build.zig", diff --git a/crates/cli/npm/package-lock.json b/crates/cli/npm/package-lock.json index a85aa44a..739e69f1 100644 --- a/crates/cli/npm/package-lock.json +++ b/crates/cli/npm/package-lock.json @@ -1,12 +1,12 @@ { "name": "tree-sitter-cli", - "version": "0.26.3", + "version": "0.27.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "tree-sitter-cli", - "version": "0.26.3", + "version": "0.27.0", "hasInstallScript": true, "license": "MIT", "bin": { diff --git a/crates/cli/npm/package.json b/crates/cli/npm/package.json index d4ecb194..d49abd46 100644 --- a/crates/cli/npm/package.json +++ b/crates/cli/npm/package.json @@ -1,6 +1,6 @@ { "name": "tree-sitter-cli", - "version": "0.26.3", + "version": "0.27.0", "author": { "name": "Max Brunsfeld", "email": "maxbrunsfeld@gmail.com" diff --git a/crates/language/Cargo.toml b/crates/language/Cargo.toml index c86b55b2..b6f5cdf8 100644 --- a/crates/language/Cargo.toml +++ b/crates/language/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "tree-sitter-language" description = "The tree-sitter Language type, used by the library and by language implementations" -version = "0.1.6" +version = "0.1.7" authors.workspace = true edition.workspace = true rust-version = "1.77" diff --git a/flake.nix b/flake.nix index abdd3d01..4cea3f87 100644 --- a/flake.nix +++ b/flake.nix @@ -17,7 +17,7 @@ eachSystem = lib.genAttrs systems; pkgsFor = inputs.nixpkgs.legacyPackages; - version = "0.26.3"; + version = "0.27.0"; fs = lib.fileset; src = fs.toSource { diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json index cdb08980..4ec07f7b 100644 --- a/lib/binding_web/package-lock.json +++ b/lib/binding_web/package-lock.json @@ -1,12 +1,12 @@ { "name": "web-tree-sitter", - "version": "0.26.3", + "version": "0.27.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "web-tree-sitter", - "version": "0.26.3", + "version": "0.27.0", "license": "MIT", "devDependencies": { "@eslint/js": "^9.39.1", diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json index 57956509..1bc53aad 100644 --- a/lib/binding_web/package.json +++ b/lib/binding_web/package.json @@ -1,6 +1,6 @@ { "name": "web-tree-sitter", - "version": "0.26.3", + "version": "0.27.0", "description": "Tree-sitter bindings for the web", "repository": { "type": "git", From 0574fcf2566b1a5f8e3624dd8faa7ff902cd898f Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Sun, 14 Dec 2025 12:19:19 +0100 Subject: [PATCH 621/663] docs(cli): include information on generated files --- docs/src/cli/generate.md | 26 ++++++++++++++++---------- docs/src/cli/init.md | 5 ----- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/docs/src/cli/generate.md b/docs/src/cli/generate.md index 1362b0c4..10941564 100644 --- a/docs/src/cli/generate.md +++ b/docs/src/cli/generate.md @@ -1,29 +1,35 @@ # `tree-sitter generate` -The most important command you'll use is `tree-sitter generate`. This command reads the `grammar.js` file in your current -working directory and creates a file called `src/parser.c`, which implements the parser. After making changes to your grammar, -just run `tree-sitter generate` again. +The most important command for grammar development is `tree-sitter generate`, which reads the grammar in structured form and outputs C files that can be compiled into a shared or static library (e.g., using the [`build`](./build,md) command). ```bash tree-sitter generate [OPTIONS] [GRAMMAR_PATH] # Aliases: gen, g ``` -The grammar path argument allows you to specify a path to a `grammar.js` JavaScript file, or `grammar.json` JSON file. -In case your `grammar.js` file is in a non-standard path, you can specify it yourself. But, if you are using a parser -where `grammar.json` was already generated, or it was hand-written, you can tell the CLI to generate the parser *based* -on this JSON file. This avoids relying on a JavaScript file and avoids the dependency on a JavaScript runtime. +The optional `GRAMMAR_PATH` argument should point to the structured grammar, in one of two forms: +- `grammar.js` a (ESM or CJS) JavaScript file; if the argument is omitted, it defaults to `./grammar.js`. +- `grammar.json` a structured representation of the grammar that is created as a byproduct of `generate`; this can be used to regenerate a missing `parser.c` without requiring a JavaScript runtime (useful when distributing parsers to consumers). If there is an ambiguity or *local ambiguity* in your grammar, Tree-sitter will detect it during parser generation, and -it will exit with a `Unresolved conflict` error message. To learn more about conflicts and how to handle them, check out +it will exit with a `Unresolved conflict` error message. To learn more about conflicts and how to handle them, see the section on [`Structuring Rules Well`](../creating-parsers/3-writing-the-grammar.md#structuring-rules-well) in the user guide. +## Generated files + +- `src/parser.c` implements the parser logic specified in the grammar. +- `src/tree_sitter/parser.h` provides basic C definitions that are used in the generated `parser.c` file. +- `src/tree_sitter/alloc.h` provides memory allocation macros that can be used in an external scanner. +- `src/tree_sitter/array.h` provides array macros that can be used in an external scanner. +- `src/grammar.json` contains a structured representation of the grammar; can be used to regenerate the parser without having to re-evaluate the `grammar.js`. +- `src/node-types.json` provides type information about individual syntax nodes; see the section on [`Static Node Types`](../using-parsers/6-static-node-types.md). + + ## Options ### `-l/--log` -Print the log of the parser generation process. This is really only useful if you know what you're doing, or are investigating -a bug in the CLI itself. It logs info such as what tokens are included in the error recovery state, +Print the log of the parser generation process. This includes information such as what tokens are included in the error recovery state, what keywords were extracted, what states were split and why, and the entry point state. ### `--abi ` diff --git a/docs/src/cli/init.md b/docs/src/cli/init.md index 75d9a152..5137e6e7 100644 --- a/docs/src/cli/init.md +++ b/docs/src/cli/init.md @@ -132,11 +132,6 @@ to be used from different language. Here is a list of these bindings files that - `CMakeLists.txt` — This file tells [`cmake`][cmake] how to compile your language. - `bindings/c/tree_sitter/tree-sitter-language.h` — This file provides the C interface of your language. - `bindings/c/tree-sitter-language.pc` — This file provides [pkg-config][pkg-config] metadata about your language's C library. -- `src/tree_sitter/parser.h` — This file provides some basic C definitions that are used in your generated `parser.c` file. -- `src/tree_sitter/alloc.h` — This file provides some memory allocation macros that are to be used in your external scanner, -if you have one. -- `src/tree_sitter/array.h` — This file provides some array macros that are to be used in your external scanner, -if you have one. ### Go From 642b56d9afe8e0e02c796ff11194dfe2bd0484ea Mon Sep 17 00:00:00 2001 From: skewb1k Date: Sun, 14 Dec 2025 21:55:18 +0300 Subject: [PATCH 622/663] fix(docs): remove conflicting --release cargo flag in contributing.md The argument '--release' cannot be used with '--profile ' --- docs/src/6-contributing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/6-contributing.md b/docs/src/6-contributing.md index a99ddc09..5fb8271f 100644 --- a/docs/src/6-contributing.md +++ b/docs/src/6-contributing.md @@ -51,7 +51,7 @@ cargo install --path crates/cli If you're going to be in a fast iteration cycle and would like the CLI to build faster, you can use the `release-dev` profile: ```sh -cargo build --release --profile release-dev +cargo build --profile release-dev # or cargo install --path crates/cli --profile release-dev ``` From 4ac2d5d2761552d322bd51e011ecb6bfbd7a9253 Mon Sep 17 00:00:00 2001 From: skewb1k Date: Mon, 15 Dec 2025 01:20:19 +0300 Subject: [PATCH 623/663] fix(cli): trailing whitespace after multiline text nodes in CST Problem: The CST printer emits trailing whitespace after multiline text nodes. With 1704c604bf663801876572fe08b746e787cd7fdb and `:cst` corpus tests this causes trailing spaces to appear on `test --update`. These spaces cannot be removed afterward, as the test runner expects an exact character-for-character match for CST tests. Solution: Print whitespace only if node is not multiline. --- crates/cli/src/parse.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/crates/cli/src/parse.rs b/crates/cli/src/parse.rs index 1023b0fc..292b3614 100644 --- a/crates/cli/src/parse.rs +++ b/crates/cli/src/parse.rs @@ -887,7 +887,7 @@ fn write_node_text( write!( out, "{}{}{}{}{}{}", - if multiline { "\n" } else { "" }, + if multiline { "\n" } else { " " }, if multiline { render_node_range(opts, cursor, is_named, true, total_width, node_range) } else { @@ -1011,10 +1011,9 @@ fn cst_render_node( } else { opts.parse_theme.node_kind }; - write!(out, "{}", paint(kind_color, node.kind()),)?; + write!(out, "{}", paint(kind_color, node.kind()))?; if node.child_count() == 0 { - write!(out, " ")?; // Node text from a pattern or external scanner write_node_text( opts, From 69676405719dc20eb6c57e8dd177d3cc3c267c69 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 21:09:49 +0000 Subject: [PATCH 624/663] ci: bump the actions group with 2 updates Bumps the actions group with 2 updates: [actions/upload-artifact](https://github.com/actions/upload-artifact) and [actions/download-artifact](https://github.com/actions/download-artifact). Updates `actions/upload-artifact` from 5 to 6 - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v5...v6) Updates `actions/download-artifact` from 6 to 7 - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions - dependency-name: actions/download-artifact dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 4 ++-- .github/workflows/release.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2a9dd910..5cde3db9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -278,7 +278,7 @@ jobs: - name: Upload CLI artifact if: "!matrix.no-run" - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: tree-sitter.${{ matrix.platform }} path: target/${{ matrix.target }}/release/tree-sitter${{ contains(matrix.target, 'windows') && '.exe' || '' }} @@ -287,7 +287,7 @@ jobs: - name: Upload Wasm artifacts if: matrix.platform == 'linux-x64' - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: tree-sitter.wasm path: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c3cf2d7a..4f6f9d47 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,7 +25,7 @@ jobs: uses: actions/checkout@v6 - name: Download build artifacts - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: path: artifacts From eacb95c85da15005f091729f3225609d0db67963 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Sun, 14 Dec 2025 21:38:05 -0500 Subject: [PATCH 625/663] fix(cli): correct discrepancy with cst for `--no-ranges` --- crates/cli/src/parse.rs | 47 ++++++++++++++++------------------------- 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/crates/cli/src/parse.rs b/crates/cli/src/parse.rs index 292b3614..b7936f0d 100644 --- a/crates/cli/src/parse.rs +++ b/crates/cli/src/parse.rs @@ -883,35 +883,24 @@ fn write_node_text( 0 }; let formatted_line = render_line_feed(line, opts); - if !opts.no_ranges { - write!( - out, - "{}{}{}{}{}{}", - if multiline { "\n" } else { " " }, - if multiline { - render_node_range(opts, cursor, is_named, true, total_width, node_range) - } else { - String::new() - }, - if multiline { - " ".repeat(indent_level + 1) - } else { - String::new() - }, - paint(quote_color, &String::from(quote)), - &paint(color, &render_node_text(&formatted_line)), - paint(quote_color, &String::from(quote)), - )?; - } else { - write!( - out, - "\n{}{}{}{}", - " ".repeat(indent_level + 1), - paint(quote_color, &String::from(quote)), - &paint(color, &render_node_text(&formatted_line)), - paint(quote_color, &String::from(quote)), - )?; - } + write!( + out, + "{}{}{}{}{}{}", + if multiline { "\n" } else { " " }, + if multiline && !opts.no_ranges { + render_node_range(opts, cursor, is_named, true, total_width, node_range) + } else { + String::new() + }, + if multiline { + " ".repeat(indent_level + 1) + } else { + String::new() + }, + paint(quote_color, &String::from(quote)), + paint(color, &render_node_text(&formatted_line)), + paint(quote_color, &String::from(quote)), + )?; } } From 6aa63a7213fd715266b30ed5055d376b90741c18 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 21:09:51 +0000 Subject: [PATCH 626/663] ci: bump korthout/backport-action from 3 to 4 in the actions group Bumps the actions group with 1 update: [korthout/backport-action](https://github.com/korthout/backport-action). Updates `korthout/backport-action` from 3 to 4 - [Release notes](https://github.com/korthout/backport-action/releases) - [Commits](https://github.com/korthout/backport-action/compare/v3...v4) --- updated-dependencies: - dependency-name: korthout/backport-action dependency-version: '4' dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions ... Signed-off-by: dependabot[bot] --- .github/workflows/backport.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml index e747a012..7caffa14 100644 --- a/.github/workflows/backport.yml +++ b/.github/workflows/backport.yml @@ -24,7 +24,7 @@ jobs: private-key: ${{ secrets.BACKPORT_KEY }} - name: Create backport PR - uses: korthout/backport-action@v3 + uses: korthout/backport-action@v4 with: pull_title: "${pull_title}" label_pattern: "^ci:backport ([^ ]+)$" From 24007727d42b4caceda3095ac685c463fae1ba1a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 21:09:40 +0000 Subject: [PATCH 627/663] build(deps): bump the cargo group with 2 updates Bumps the cargo group with 2 updates: [cc](https://github.com/rust-lang/cc-rs) and [clap_complete](https://github.com/clap-rs/clap). Updates `cc` from 1.2.49 to 1.2.50 - [Release notes](https://github.com/rust-lang/cc-rs/releases) - [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md) - [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.49...cc-v1.2.50) Updates `clap_complete` from 4.5.61 to 4.5.62 - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.61...clap_complete-v4.5.62) --- updated-dependencies: - dependency-name: cc dependency-version: 1.2.50 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: clap_complete dependency-version: 4.5.62 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- Cargo.toml | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eb0d8b4d..45298feb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -187,9 +187,9 @@ checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "cc" -version = "1.2.49" +version = "1.2.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" +checksum = "9f50d563227a1c37cc0a263f64eca3334388c01c5e4c4861a9def205c614383c" dependencies = [ "find-msvc-tools", "shlex", @@ -263,9 +263,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.61" +version = "4.5.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39615915e2ece2550c0149addac32fb5bd312c657f43845bb9088cb9c8a7c992" +checksum = "004eef6b14ce34759aa7de4aea3217e368f463f46a3ed3764ca4b5a4404003b4" dependencies = [ "clap", ] diff --git a/Cargo.toml b/Cargo.toml index daf79bf5..7c090ca6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -106,7 +106,7 @@ ansi_colours = "1.2.3" anstyle = "1.0.13" anyhow = "1.0.100" bstr = "1.12.0" -cc = "1.2.48" +cc = "1.2.50" clap = { version = "4.5.53", features = [ "cargo", "derive", @@ -115,7 +115,7 @@ clap = { version = "4.5.53", features = [ "string", "unstable-styles", ] } -clap_complete = "4.5.61" +clap_complete = "4.5.62" clap_complete_nushell = "4.5.10" crc32fast = "1.5.0" ctor = "0.2.9" From a7d8c0cbb2dee01df314d70d856e10f3d96d66d6 Mon Sep 17 00:00:00 2001 From: kevin-hua-kraken Date: Tue, 23 Dec 2025 17:36:40 +0900 Subject: [PATCH 628/663] fix(playground): update query API --- docs/src/assets/js/playground.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/src/assets/js/playground.js b/docs/src/assets/js/playground.js index 2b4b5708..ef65c371 100644 --- a/docs/src/assets/js/playground.js +++ b/docs/src/assets/js/playground.js @@ -61,7 +61,7 @@ function initializeCustomSelect({ initialValue = null, addListeners = false }) { } window.initializePlayground = async (opts) => { - const { Parser, Language } = window.TreeSitter; + const { Parser, Language, Query } = window.TreeSitter; const { local } = opts; if (local) { @@ -357,11 +357,10 @@ window.initializePlayground = async (opts) => { marks.forEach((m) => m.clear()); if (tree && query) { - const captures = query.captures( - tree.rootNode, - { row: startRow, column: 0 }, - { row: endRow, column: 0 }, - ); + const captures = query.captures(tree.rootNode, { + startPosition: { row: startRow, column: 0 }, + endPosition: { row: endRow, column: 0 }, + }); let lastNodeId; for (const { name, node } of captures) { if (node.id === lastNodeId) continue; @@ -410,7 +409,7 @@ window.initializePlayground = async (opts) => { const queryText = queryEditor.getValue(); try { - query = parser.language.query(queryText); + query = new Query(parser.language, queryText); let match; let row = 0; From d5b82fbbab8a3ee11727445d8ed31d579755fe5a Mon Sep 17 00:00:00 2001 From: skewb1k Date: Tue, 23 Dec 2025 14:03:12 +0300 Subject: [PATCH 629/663] fix(cli): remove extra indentation with `--cst --no-ranges` --- crates/cli/src/parse.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/cli/src/parse.rs b/crates/cli/src/parse.rs index b7936f0d..71bee902 100644 --- a/crates/cli/src/parse.rs +++ b/crates/cli/src/parse.rs @@ -785,7 +785,7 @@ pub fn render_cst<'a, 'b: 'a>( .map(|(row, col)| (row as f64).log10() as usize + (col.len() as f64).log10() as usize + 1) .max() .unwrap_or(1); - let mut indent_level = 1; + let mut indent_level = usize::from(!opts.no_ranges); let mut did_visit_children = false; let mut in_error = false; loop { From f96d518ebfc37bbb829e1da22c0297aac803dd61 Mon Sep 17 00:00:00 2001 From: skewb1k Date: Tue, 23 Dec 2025 14:05:52 +0300 Subject: [PATCH 630/663] fix(cli): remove extra newline with `--cst` Makes CST output consistent with other formats. --- crates/cli/src/parse.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/cli/src/parse.rs b/crates/cli/src/parse.rs index 71bee902..1a1d9723 100644 --- a/crates/cli/src/parse.rs +++ b/crates/cli/src/parse.rs @@ -515,7 +515,6 @@ pub fn parse_file_at_path( if opts.output == ParseOutput::Cst { render_cst(&source_code, &tree, &mut cursor, opts, &mut stdout)?; - println!(); } if opts.output == ParseOutput::Xml { From ba7350c7eeb439473a7fc6e7cbeabd381f7fc8b3 Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Mon, 22 Dec 2025 14:13:05 +0100 Subject: [PATCH 631/663] docs(cli): better description of files generated by `init` --- docs/src/cli/generate.md | 2 +- docs/src/cli/index.md | 7 +- docs/src/cli/init.md | 169 ++++++++++++++++++++------------------- 3 files changed, 92 insertions(+), 86 deletions(-) diff --git a/docs/src/cli/generate.md b/docs/src/cli/generate.md index 10941564..5ec02ad7 100644 --- a/docs/src/cli/generate.md +++ b/docs/src/cli/generate.md @@ -1,6 +1,6 @@ # `tree-sitter generate` -The most important command for grammar development is `tree-sitter generate`, which reads the grammar in structured form and outputs C files that can be compiled into a shared or static library (e.g., using the [`build`](./build,md) command). +The most important command for grammar development is `tree-sitter generate`, which reads the grammar in structured form and outputs C files that can be compiled into a shared or static library (e.g., using the [`build`](./build.md) command). ```bash tree-sitter generate [OPTIONS] [GRAMMAR_PATH] # Aliases: gen, g diff --git a/docs/src/cli/index.md b/docs/src/cli/index.md index 7c982b40..8b7659f0 100644 --- a/docs/src/cli/index.md +++ b/docs/src/cli/index.md @@ -1,4 +1,7 @@ # CLI Overview -Let's go over all of the functionality of the `tree-sitter` command line interface. -Once you feel that you have enough of a grasp on the CLI, you can move onto the grammar authoring section to learn more about writing your own parser. +The `tree-sitter` command-line interface is used to create, manage, test, and build tree-sitter parsers. It is controlled by + +- a personal `tree-sitter/config.json` config file generated by [`tree-sitter init-config`](./init-config.md) +- a parser `tree-sitter.json` config file generated by [`tree-sitter init`](./init.md). + diff --git a/docs/src/cli/init.md b/docs/src/cli/init.md index 5137e6e7..d45c8e09 100644 --- a/docs/src/cli/init.md +++ b/docs/src/cli/init.md @@ -8,30 +8,91 @@ we recommend using git for version control of your grammar. tree-sitter init [OPTIONS] # Aliases: i ``` -## Options +## Generated files -### `--update` +### Required files -Update outdated generated files, if needed. +The following required files are always created if missing: -### `-p/--grammar-path ` +- `tree-sitter.json` - The main configuration file that determines how `tree-sitter` interacts with the grammar. If missing, the `init` command will prompt the user for the required fields. See [below](./init.md#structure-of-tree-sitterjson) for the full documentation of the structure of this file. +- `package.json` - The `npm` manifest for the parser. This file is required for some `tree-sitter` subcommands, and if the grammar has dependencies (e.g., another published base grammar that this grammar extends). +- `grammar.js` - An empty template for the main grammar file; see [the section on creating parsers](../2-creating-parser). -The path to the directory containing the grammar. +### Language bindings + +Language bindings are files that allow your parser to be directly used by projects written in the respective language. +The following bindings are created if enabled in `tree-sitter.json`: + +#### C/C++ + +- `Makefile` — This file tells [`make`][make] how to compile your language. +- `CMakeLists.txt` — This file tells [`cmake`][cmake] how to compile your language. +- `bindings/c/tree_sitter/tree-sitter-language.h` — This file provides the C interface of your language. +- `bindings/c/tree-sitter-language.pc` — This file provides [pkg-config][pkg-config] metadata about your language's C library. + +#### Go + +- `go.mod` — This file is the manifest of the Go module. +- `bindings/go/binding.go` — This file wraps your language in a Go module. +- `bindings/go/binding_test.go` — This file contains a test for the Go package. + +#### Node + +- `binding.gyp` — This file tells Node.js how to compile your language. +- `bindings/node/binding.cc` — This file wraps your language in a JavaScript module for Node.js. +- `bindings/node/index.js` — This is the file that Node.js initially loads when using your language. +- `bindings/node/index.d.ts` — This file provides type hints for your parser when used in TypeScript. +- `bindings/node/binding_test.js` — This file contains a test for the Node.js package. + +#### Java + +- `pom.xml` - This file is the manifest of the Maven package. +- `bindings/java/main/namespace/language/TreeSitterLanguage.java` - This file wraps your language in a Java class. +- `bindings/java/test/TreeSitterLanguageTest.java` - This file contains a test for the Java package. + +#### Python + +- `pyproject.toml` — This file is the manifest of the Python package. +- `setup.py` — This file tells Python how to compile your language. +- `bindings/python/tree_sitter_language/binding.c` — This file wraps your language in a Python module. +- `bindings/python/tree_sitter_language/__init__.py` — This file tells Python how to load your language. +- `bindings/python/tree_sitter_language/__init__.pyi` — This file provides type hints for your parser when used in Python. +- `bindings/python/tree_sitter_language/py.typed` — This file provides type hints for your parser when used in Python. +- `bindings/python/tests/test_binding.py` — This file contains a test for the Python package. + +#### Rust + +- `Cargo.toml` — This file is the manifest of the Rust package. +- `bindings/rust/build.rs` — This file tells Rust how to compile your language. +- `bindings/rust/lib.rs` — This file wraps your language in a Rust crate when used in Rust. + +#### Swift + +- `Package.swift` — This file tells Swift how to compile your language. +- `bindings/swift/TreeSitterLanguage/language.h` — This file wraps your language in a Swift module when used in Swift. +- `bindings/swift/TreeSitterLanguageTests/TreeSitterLanguageTests.swift` — This file contains a test for the Swift package. + +#### Zig + +- `build.zig` - This file tells Zig how to compile your language. +- `build.zig.zon` - This file is the manifest of the Zig package. +- `bindings/zig/root.zig` - This file wraps your language in a Zig module. +- `bindings/zig/test.zig` - This file contains a test for the Zig package. + +### Additional files + +In addition, the following files are created that aim to improve the development experience: + +- `.editorconfig` — This file tells your editor how to format your code. More information about this file can be found [here][editorconfig]. +- `.gitattributes` — This file tells Git how to handle line endings and tells GitHub which files are generated. +- `.gitignore` — This file tells Git which files to ignore when committing changes. ## Structure of `tree-sitter.json` -The main file of interest for users to configure is `tree-sitter.json`, which tells the CLI information about your grammar, -such as the location of queries. - ### The `grammars` field This field is an array of objects, though you typically only need one object in this array unless your repo has -multiple grammars (for example, `Typescript` and `TSX`). - -### Example - -Typically, the objects in the `"tree-sitter"` array only needs to specify a few keys: - +multiple grammars (for example, `Typescript` and `TSX`), e.g., ```json { "tree-sitter": [ @@ -49,7 +110,7 @@ Typically, the objects in the `"tree-sitter"` array only needs to specify a few } ``` -#### Basic Fields +#### Basic fields These keys specify basic information about the parser: @@ -65,11 +126,11 @@ parser to files that should be checked for modifications during recompilation. This is useful during development to have changes to other files besides scanner.c be picked up by the cli. -#### Language Detection +#### Language detection These keys help to decide whether the language applies to a given file: -- `file-types` — An array of filename suffix strings. The grammar will be used for files whose names end with one of +- `file-types` — An array of filename suffix strings (not including the dot). The grammar will be used for files whose names end with one of these suffixes. Note that the suffix may match an *entire* filename. - `first-line-regex` — A regex pattern that will be tested against the first line of a file @@ -85,14 +146,14 @@ no `content-regex` will be preferred over this one. should be used for a potential *language injection* site. Language injection is described in more detail in [the relevant section](../3-syntax-highlighting.md#language-injection). -#### Query Paths +#### Query paths These keys specify relative paths from the directory containing `tree-sitter.json` to the files that control syntax highlighting: - `highlights` — Path to a *highlight query*. Default: `queries/highlights.scm` - `locals` — Path to a *local variable query*. Default: `queries/locals.scm`. - `injections` — Path to an *injection query*. Default: `queries/injections.scm`. -- `tags` — Path to an *tag query*. Default: `queries/tags.scm`. +- `tags` — Path to a *tag query*. Default: `queries/tags.scm`. ### The `metadata` field @@ -121,76 +182,18 @@ Each key is a language name, and the value is a boolean. - `swift` (default: `false`) - `zig` (default: `false`) -## Binding Files +## Options -When you run `tree-sitter init`, the CLI will also generate a number of files in your repository that allow for your parser -to be used from different language. Here is a list of these bindings files that are generated, and what their purpose is: +### `-u/--update` -### C/C++ +Update outdated generated files, if possible. -- `Makefile` — This file tells [`make`][make] how to compile your language. -- `CMakeLists.txt` — This file tells [`cmake`][cmake] how to compile your language. -- `bindings/c/tree_sitter/tree-sitter-language.h` — This file provides the C interface of your language. -- `bindings/c/tree-sitter-language.pc` — This file provides [pkg-config][pkg-config] metadata about your language's C library. +**Note:** Existing files that may have been edited manually are _not_ updated in general. To force an update to such files, remove them and call `tree-sitter init -u` again. -### Go +### `-p/--grammar-path ` -- `go.mod` — This file is the manifest of the Go module. -- `bindings/go/binding.go` — This file wraps your language in a Go module. -- `bindings/go/binding_test.go` — This file contains a test for the Go package. +The path to the directory containing the grammar. -### Node - -- `binding.gyp` — This file tells Node.js how to compile your language. -- `package.json` — This file is the manifest of the Node.js package. -- `bindings/node/binding.cc` — This file wraps your language in a JavaScript module for Node.js. -- `bindings/node/index.js` — This is the file that Node.js initially loads when using your language. -- `bindings/node/index.d.ts` — This file provides type hints for your parser when used in TypeScript. -- `bindings/node/binding_test.js` — This file contains a test for the Node.js package. - -### Java - -- `pom.xml` - This file is the manifest of the Maven package. -- `bindings/java/main/namespace/language/TreeSitterLanguage.java` - This file wraps your language in a Java class. -- `bindings/java/test/TreeSitterLanguageTest.java` - This file contains a test for the Java package. - -### Python - -- `pyproject.toml` — This file is the manifest of the Python package. -- `setup.py` — This file tells Python how to compile your language. -- `bindings/python/tree_sitter_language/binding.c` — This file wraps your language in a Python module. -- `bindings/python/tree_sitter_language/__init__.py` — This file tells Python how to load your language. - `bindings/python/tree_sitter_language/__init__.pyi` — This file provides type hints for your parser when used in Python. -- `bindings/python/tree_sitter_language/py.typed` — This file provides type hints for your parser when used in Python. -- `bindings/python/tests/test_binding.py` — This file contains a test for the Python package. - -### Rust - -- `Cargo.toml` — This file is the manifest of the Rust package. -- `bindings/rust/lib.rs` — This file wraps your language in a Rust crate when used in Rust. -- `bindings/rust/build.rs` — This file wraps the building process for the Rust crate. - -### Swift - -- `Package.swift` — This file tells Swift how to compile your language. -- `bindings/swift/TreeSitterLanguage/language.h` — This file wraps your language in a Swift module when used in Swift. -- `bindings/swift/TreeSitterLanguageTests/TreeSitterLanguageTests.swift` — This file contains a test for the Swift package. - -### Zig - -- `build.zig` - This file tells Zig how to compile your language. -- `build.zig.zon` - This file is the manifest of the Zig package. -- `bindings/zig/root.zig` - This file wraps your language in a Zig module. -- `bindings/zig/test.zig` - This file contains a test for the Zig package. - -### Additional Files - -Additionally, there's a few other files that are generated when you run `tree-sitter init`, -that aim to improve the development experience: - -- `.editorconfig` — This file tells your editor how to format your code. More information about this file can be found [here][editorconfig] -- `.gitattributes` — This file tells Git how to handle line endings, and tells GitHub what files are generated. -- `.gitignore` — This file tells Git what files to ignore when committing changes. [cmake]: https://cmake.org/cmake/help/latest [editorconfig]: https://editorconfig.org From 5208299bbb42661d306c2340cbdc829bf155856a Mon Sep 17 00:00:00 2001 From: WillLillis Date: Sat, 27 Dec 2025 00:43:33 -0500 Subject: [PATCH 632/663] fix(cli): set language in cwd for all usages of `highlight` command --- crates/cli/src/main.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 937e54b4..782f122e 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -1622,6 +1622,7 @@ impl Highlight { let loader_config = config.get()?; loader.find_all_languages(&loader_config)?; loader.force_rebuild(self.rebuild || self.grammar_path.is_some()); + let languages = loader.languages_at_path(current_dir)?; let cancellation_flag = util::cancel_on_signal(); @@ -1702,7 +1703,6 @@ impl Highlight { } => { let path = get_tmp_source_file(&contents)?; - let languages = loader.languages_at_path(current_dir)?; let language = languages .iter() .find(|(_, n)| language_names.contains(&Box::from(n.as_str()))) @@ -1733,7 +1733,6 @@ impl Highlight { if let (Some(l), Some(lc)) = (language.clone(), language_configuration) { (l, lc) } else { - let languages = loader.languages_at_path(current_dir)?; let language = languages .first() .map(|(l, _)| l.clone()) From 8e4f21aba0691f84df9fa23b20be1216b90ca802 Mon Sep 17 00:00:00 2001 From: WillLillis Date: Sat, 27 Dec 2025 02:51:22 -0500 Subject: [PATCH 633/663] fix(rust): address nightly clippy lint --- .../generate/src/prepare_grammar/process_inlines.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/crates/generate/src/prepare_grammar/process_inlines.rs b/crates/generate/src/prepare_grammar/process_inlines.rs index d4b7dc18..460d2359 100644 --- a/crates/generate/src/prepare_grammar/process_inlines.rs +++ b/crates/generate/src/prepare_grammar/process_inlines.rs @@ -70,12 +70,13 @@ impl InlinedProductionMapBuilder { let production_map = production_indices_by_step_id .into_iter() .map(|(step_id, production_indices)| { - let production = step_id.variable_index.map_or_else( - || &productions[step_id.production_index], - |variable_index| { - &grammar.variables[variable_index].productions[step_id.production_index] - }, - ) as *const Production; + let production = + core::ptr::from_ref::(step_id.variable_index.map_or_else( + || &productions[step_id.production_index], + |variable_index| { + &grammar.variables[variable_index].productions[step_id.production_index] + }, + )); ((production, step_id.step_index as u32), production_indices) }) .collect(); From 62effdf1287a371fed30d25fcce9ac306e925b8c Mon Sep 17 00:00:00 2001 From: Firas al-Khalil Date: Fri, 26 Dec 2025 12:31:08 +0100 Subject: [PATCH 634/663] fix(cli): report context on compile fail --- crates/cli/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 782f122e..af4f13a7 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -984,7 +984,7 @@ impl Build { loader .compile_parser_at_path(&grammar_path, output_path, flags) - .unwrap(); + .context("Failed to compile parser")?; } Ok(()) } From 5293dd683ed69899c5cf0a215e09a86d0d814adf Mon Sep 17 00:00:00 2001 From: Firas al-Khalil Date: Fri, 26 Dec 2025 12:32:43 +0100 Subject: [PATCH 635/663] fix(cli): report library load failure Instead of panicking somehere else. This happens on concurrent builds of the the same grammar. --- crates/loader/src/loader.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index d64b89de..310fe319 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -1089,6 +1089,26 @@ impl Loader { } } + // Ensure the dynamic library exists before trying to load it. This can + // happen in race conditions where we couldn't acquire the lock because + // another process was compiling but it still haven't finished by the + // time we reach this point, so the output file still doesn't exist. + // + // Instead of complaining about library load failure in `load_language`, + // inform the user about the precise issue. + if !output_path.exists() { + let msg = format!( + "Dynamic library `{}` not found after build attempt. \ + Are you running multiple processes building to the same output location?", + output_path.display() + ); + + return Err(LoaderError::IO(IoError::new( + std::io::Error::new(std::io::ErrorKind::NotFound, msg), + Some(output_path.as_path()), + ))); + } + Self::load_language(&output_path, &language_fn_name) } From 5d9605a91e74f4ba6fcaa7c0533c82919fd52d0c Mon Sep 17 00:00:00 2001 From: Firas al-Khalil Date: Fri, 26 Dec 2025 12:33:08 +0100 Subject: [PATCH 636/663] feat(cli): concurrent build of same grammar on different paths --- crates/loader/src/loader.rs | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index 310fe319..a6f10d54 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -8,6 +8,7 @@ use std::sync::Mutex; use std::{ collections::HashMap, env, fs, + hash::{Hash as _, Hasher as _}, io::{BufRead, BufReader}, marker::PhantomData, mem, @@ -1025,20 +1026,26 @@ impl Loader { return Ok(wasm_store.load_language(&config.name, &wasm_bytes)?); } + // Create a unique lock path based on the output path hash to prevent + // interference when multiple processes build the same grammar (by name) + // to different output locations + let lock_hash = { + let mut hasher = std::hash::DefaultHasher::new(); + output_path.hash(&mut hasher); + format!("{:x}", hasher.finish()) + }; + let lock_path = if env::var("CROSS_RUNNER").is_ok() { tempfile::tempdir() - .unwrap() + .expect("create a temp dir") .path() - .join("tree-sitter") - .join("lock") - .join(format!("{}.lock", config.name)) + .to_path_buf() } else { - etcetera::choose_base_strategy()? - .cache_dir() - .join("tree-sitter") - .join("lock") - .join(format!("{}.lock", config.name)) - }; + etcetera::choose_base_strategy()?.cache_dir() + } + .join("tree-sitter") + .join("lock") + .join(format!("{}-{lock_hash}.lock", config.name)); if let Ok(lock_file) = fs::OpenOptions::new().write(true).open(&lock_path) { recompile = false; From 82486d4b0af2a34fe98d50fb8a2425e1c479deee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Dec 2025 21:07:45 +0000 Subject: [PATCH 637/663] build(deps): bump the cargo group with 2 updates Bumps the cargo group with 2 updates: [cc](https://github.com/rust-lang/cc-rs) and [serde_json](https://github.com/serde-rs/json). Updates `cc` from 1.2.50 to 1.2.51 - [Release notes](https://github.com/rust-lang/cc-rs/releases) - [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md) - [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.50...cc-v1.2.51) Updates `serde_json` from 1.0.145 to 1.0.147 - [Release notes](https://github.com/serde-rs/json/releases) - [Commits](https://github.com/serde-rs/json/compare/v1.0.145...v1.0.147) --- updated-dependencies: - dependency-name: cc dependency-version: 1.2.51 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: serde_json dependency-version: 1.0.147 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 26 +++++++++++++------------- Cargo.toml | 4 ++-- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 45298feb..9e220df0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -187,9 +187,9 @@ checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "cc" -version = "1.2.50" +version = "1.2.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f50d563227a1c37cc0a263f64eca3334388c01c5e4c4861a9def205c614383c" +checksum = "7a0aeaff4ff1a90589618835a598e545176939b97874f7abc7851caa0618f203" dependencies = [ "find-msvc-tools", "shlex", @@ -664,9 +664,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" +checksum = "645cbb3a84e60b7531617d5ae4e57f7e27308f6445f5abf653209ea76dec8dff" [[package]] name = "fnv" @@ -1614,12 +1614,6 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - [[package]] name = "same-file" version = "1.0.6" @@ -1707,16 +1701,16 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.148" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "3084b546a1dd6289475996f182a22aba973866ea8e8b02c51d9f46b1336a22da" dependencies = [ "indexmap", "itoa", "memchr", - "ryu", "serde", "serde_core", + "zmij", ] [[package]] @@ -2932,3 +2926,9 @@ dependencies = [ "quote", "syn", ] + +[[package]] +name = "zmij" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f4a4e8e9dc5c62d159f04fcdbe07f4c3fb710415aab4754bf11505501e3251d" diff --git a/Cargo.toml b/Cargo.toml index 7c090ca6..09b0830c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -106,7 +106,7 @@ ansi_colours = "1.2.3" anstyle = "1.0.13" anyhow = "1.0.100" bstr = "1.12.0" -cc = "1.2.50" +cc = "1.2.51" clap = { version = "4.5.53", features = [ "cargo", "derive", @@ -140,7 +140,7 @@ rustc-hash = "2.1.1" schemars = "1.0.5" semver = { version = "1.0.27", features = ["serde"] } serde = { version = "1.0.219", features = ["derive"] } -serde_json = { version = "1.0.145", features = ["preserve_order"] } +serde_json = { version = "1.0.147", features = ["preserve_order"] } similar = "2.7.0" smallbitvec = "2.6.0" streaming-iterator = "0.1.9" From 93d793d24920db614b560c251b7ddff822597f21 Mon Sep 17 00:00:00 2001 From: WillLillis Date: Sun, 28 Dec 2025 01:51:35 -0500 Subject: [PATCH 638/663] fix(cli): canonicalize build `--output` path This fixes a potential issue with the new lock file hashing mechanism, in which two different path literals pointing to the same location would hash to separate lock files, allowing a race condition. --- crates/cli/src/main.rs | 14 ++++++++++++-- crates/loader/src/loader.rs | 10 +++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index af4f13a7..35d8fcb7 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -955,11 +955,21 @@ impl Build { } else { let output_path = if let Some(ref path) = self.output { let path = Path::new(path); - if path.is_absolute() { + let full_path = if path.is_absolute() { path.to_path_buf() } else { current_dir.join(path) - } + }; + let parent_path = full_path + .parent() + .context("Output path must have a parent")?; + let name = full_path + .file_name() + .context("Ouput path must have a filename")?; + fs::create_dir_all(parent_path).context("Failed to create output path")?; + let mut canon_path = parent_path.canonicalize().context("Invalid output path")?; + canon_path.push(name); + canon_path } else { let file_name = grammar_path .file_stem() diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index a6f10d54..11c8b673 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -1098,11 +1098,11 @@ impl Loader { // Ensure the dynamic library exists before trying to load it. This can // happen in race conditions where we couldn't acquire the lock because - // another process was compiling but it still haven't finished by the + // another process was compiling but it still hasn't finished by the // time we reach this point, so the output file still doesn't exist. // - // Instead of complaining about library load failure in `load_language`, - // inform the user about the precise issue. + // Instead of allowing the `load_language` call below to fail, return a + // clearer error to the user here. if !output_path.exists() { let msg = format!( "Dynamic library `{}` not found after build attempt. \ @@ -1110,10 +1110,10 @@ impl Loader { output_path.display() ); - return Err(LoaderError::IO(IoError::new( + Err(LoaderError::IO(IoError::new( std::io::Error::new(std::io::ErrorKind::NotFound, msg), Some(output_path.as_path()), - ))); + )))?; } Self::load_language(&output_path, &language_fn_name) From 0d4d8548091ccf0a38e9d1a747df3fe5dd44d465 Mon Sep 17 00:00:00 2001 From: skewb1k Date: Sat, 27 Dec 2025 08:33:18 +0300 Subject: [PATCH 639/663] feat(cli): make `test --update` rewrite all corpus files --- crates/cli/src/test.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/cli/src/test.rs b/crates/cli/src/test.rs index 3753dcea..a78629ab 100644 --- a/crates/cli/src/test.rs +++ b/crates/cli/src/test.rs @@ -1066,7 +1066,6 @@ fn run_tests( return Ok(true); } - let failure_count = test_summary.parse_failures.len(); let mut ran_test_in_group = false; let matches_filter = |name: &str, file_name: &Option, opts: &TestOptions| { @@ -1130,7 +1129,7 @@ fn run_tests( test_summary.parse_results.pop_traversal(); if let Some(file_path) = file_path { - if opts.update && test_summary.parse_failures.len() - failure_count > 0 { + if opts.update { write_tests(&file_path, corrected_entries)?; } corrected_entries.clear(); From 999e041d49e8f923ec4e63d7e4f4ad392294e82e Mon Sep 17 00:00:00 2001 From: skewb1k Date: Sat, 27 Dec 2025 08:34:18 +0300 Subject: [PATCH 640/663] docs: add tip about using `test --update` flag --- docs/src/creating-parsers/5-writing-tests.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/src/creating-parsers/5-writing-tests.md b/docs/src/creating-parsers/5-writing-tests.md index 0d0aeb60..438dc02a 100644 --- a/docs/src/creating-parsers/5-writing-tests.md +++ b/docs/src/creating-parsers/5-writing-tests.md @@ -87,6 +87,11 @@ The recommendation is to be comprehensive in adding tests. If it's a visible nod directory. It's typically a good idea to test all the permutations of each language construct. This increases test coverage, but doubly acquaints readers with a way to examine expected outputs and understand the "edges" of a language. +```admonish tip +After modifying the grammar, you can run `tree-sitter test -u` +to update all syntax trees in corpus files with current parser output. +``` + ## Attributes Tests can be annotated with a few `attributes`. Attributes must be put in the header, below the test name, and start with From a1893b44201d1bf3ce04a7ebd7aa57d3422cea9c Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Tue, 30 Dec 2025 17:11:16 +0100 Subject: [PATCH 641/663] build(deps): update rquickjs to 0.11.0 --- Cargo.lock | 92 +++++++++++++++++----------------- Cargo.toml | 2 +- crates/generate/Cargo.toml | 2 +- crates/generate/src/quickjs.rs | 1 + 4 files changed, 49 insertions(+), 48 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9e220df0..9cb3dd33 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -166,9 +166,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" dependencies = [ "allocator-api2", ] @@ -263,9 +263,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.62" +version = "4.5.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "004eef6b14ce34759aa7de4aea3217e368f463f46a3ed3764ca4b5a4404003b4" +checksum = "4c0da80818b2d95eca9aa614a30783e42f62bf5fdfee24e68cfb960b071ba8d1" dependencies = [ "clap", ] @@ -338,9 +338,9 @@ dependencies = [ [[package]] name = "convert_case" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" dependencies = [ "unicode-segmentation", ] @@ -980,9 +980,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "jni" @@ -1119,7 +1119,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" dependencies = [ - "rustix 1.1.2", + "rustix 1.1.3", ] [[package]] @@ -1371,9 +1371,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "9695f8df41bb4f3d222c95a67532365f569318332d03d5f3f67f37b20e6ebdf0" dependencies = [ "unicode-ident", ] @@ -1527,9 +1527,9 @@ dependencies = [ [[package]] name = "rquickjs" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a135375fbac5ba723bb6a48f432a72f81539cedde422f0121a86c7c4e96d8e0d" +checksum = "c50dc6d6c587c339edb4769cf705867497a2baf0eca8b4645fa6ecd22f02c77a" dependencies = [ "rquickjs-core", "rquickjs-macro", @@ -1537,9 +1537,9 @@ dependencies = [ [[package]] name = "rquickjs-core" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bccb7121a123865c8ace4dea42e7ed84d78b90cbaf4ca32c59849d8d210c9672" +checksum = "b8bf7840285c321c3ab20e752a9afb95548c75cd7f4632a0627cea3507e310c1" dependencies = [ "hashbrown 0.16.1", "phf", @@ -1549,9 +1549,9 @@ dependencies = [ [[package]] name = "rquickjs-macro" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89f93602cc3112c7f30bf5f29e722784232138692c7df4c52ebbac7e035d900d" +checksum = "7106215ff41a5677b104906a13e1a440b880f4b6362b5dc4f3978c267fad2b80" dependencies = [ "convert_case", "fnv", @@ -1568,9 +1568,9 @@ dependencies = [ [[package]] name = "rquickjs-sys" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b1b6528590d4d65dc86b5159eae2d0219709546644c66408b2441696d1d725" +checksum = "27344601ef27460e82d6a4e1ecb9e7e99f518122095f3c51296da8e9be2b9d83" dependencies = [ "bindgen", "cc", @@ -1597,9 +1597,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" dependencies = [ "bitflags 2.10.0", "errno", @@ -1625,9 +1625,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" +checksum = "54e910108742c57a770f492731f99be216a52fadd361b06c8fb59d74ccc267d2" dependencies = [ "dyn-clone", "ref-cast", @@ -1638,9 +1638,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301858a4023d78debd2353c7426dc486001bddc91ae31a76fb1f55132f7e2633" +checksum = "4908ad288c5035a8eb12cfdf0d49270def0a268ee162b75eeee0f85d155a7c45" dependencies = [ "proc-macro2", "quote", @@ -1778,9 +1778,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.111" +version = "2.0.112" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +checksum = "21f182278bf2d2bcb3c88b1b08a37df029d71ce3d3ae26168e3c653b213b99d4" dependencies = [ "proc-macro2", "quote", @@ -1800,20 +1800,20 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" +checksum = "b1dd07eb858a2067e2f3c7155d54e929265c264e6f37efe3ee7a8d1b5a1dd0ba" [[package]] name = "tempfile" -version = "3.23.0" +version = "3.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" dependencies = [ "fastrand", "getrandom 0.3.4", "once_cell", - "rustix 1.1.2", + "rustix 1.1.3", "windows-sys 0.61.2", ] @@ -1899,18 +1899,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.3" +version = "0.7.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.23.9" +version = "0.23.10+spec-1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d7cbc3b4b49633d57a0509303158ca50de80ae32c265093b24c414705807832" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" dependencies = [ "indexmap", "toml_datetime", @@ -1920,9 +1920,9 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.4" +version = "1.0.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" dependencies = [ "winnow", ] @@ -1935,9 +1935,9 @@ checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d" [[package]] name = "tracing" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -1957,9 +1957,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.35" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", ] @@ -2310,7 +2310,7 @@ dependencies = [ "postcard", "psm", "pulley-interpreter", - "rustix 1.1.2", + "rustix 1.1.3", "serde", "serde_derive", "smallvec", @@ -2419,7 +2419,7 @@ dependencies = [ "anyhow", "cc", "cfg-if", - "rustix 1.1.2", + "rustix 1.1.3", "wasmtime-asm-macros", "wasmtime-versioned-export-macros", "windows-sys 0.59.0", @@ -2929,6 +2929,6 @@ dependencies = [ [[package]] name = "zmij" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4a4e8e9dc5c62d159f04fcdbe07f4c3fb710415aab4754bf11505501e3251d" +checksum = "e9747e91771f56fd7893e1164abd78febd14a670ceec257caad15e051de35f06" diff --git a/Cargo.toml b/Cargo.toml index 09b0830c..9201c5fa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,7 @@ authors = [ "Amaan Qureshi ", ] edition = "2021" -rust-version = "1.84" +rust-version = "1.85" homepage = "https://tree-sitter.github.io/tree-sitter" repository = "https://github.com/tree-sitter/tree-sitter" license = "MIT" diff --git a/crates/generate/Cargo.toml b/crates/generate/Cargo.toml index 5e93bf40..e55be890 100644 --- a/crates/generate/Cargo.toml +++ b/crates/generate/Cargo.toml @@ -33,7 +33,7 @@ log.workspace = true pathdiff = { version = "0.2.3", optional = true } regex.workspace = true regex-syntax.workspace = true -rquickjs = { version = "0.10.0", optional = true, features = [ +rquickjs = { version = "0.11.0", optional = true, features = [ "bindgen", "loader", "macro", diff --git a/crates/generate/src/quickjs.rs b/crates/generate/src/quickjs.rs index b7960db2..d02781f9 100644 --- a/crates/generate/src/quickjs.rs +++ b/crates/generate/src/quickjs.rs @@ -97,6 +97,7 @@ impl Console { Type::Unknown => "unknown".to_string(), Type::Symbol | Type::Object + | Type::Proxy | Type::Array | Type::Function | Type::Constructor From 47ae0609661e2b9e531c76471f9bf6060870b207 Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Wed, 31 Dec 2025 12:27:09 +0100 Subject: [PATCH 642/663] feat(quickjs): add console support for `Array` --- crates/generate/src/quickjs.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/crates/generate/src/quickjs.rs b/crates/generate/src/quickjs.rs index d02781f9..99e77397 100644 --- a/crates/generate/src/quickjs.rs +++ b/crates/generate/src/quickjs.rs @@ -95,10 +95,27 @@ impl Console { Type::Module => "module".to_string(), Type::BigInt => v.get::().unwrap_or_else(|_| "BigInt".to_string()), Type::Unknown => "unknown".to_string(), + Type::Array => { + let js_vals = v + .as_array() + .unwrap() + .iter::>() + .filter_map(|x| x.ok()) + .map(|x| { + if x.is_string() { + format!("'{}'", Self::format_args(&[x])) + } else { + Self::format_args(&[x]) + } + }) + .collect::>() + .join(", "); + + format!("[ {js_vals} ]") + } Type::Symbol | Type::Object | Type::Proxy - | Type::Array | Type::Function | Type::Constructor | Type::Promise From f1288ea5c9d0dfc683a91e85d7e8c9177d32738b Mon Sep 17 00:00:00 2001 From: WillLillis Date: Fri, 26 Dec 2025 19:33:32 -0500 Subject: [PATCH 643/663] fix(cli): increase verbosity of `tree-sitter init -u` updates Also, use `info` logs rather than `warn` --- crates/cli/src/init.rs | 177 ++++++++++++++++++++++++----------------- 1 file changed, 105 insertions(+), 72 deletions(-) diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index b0cdb586..2d37f8dd 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -8,7 +8,7 @@ use anyhow::{anyhow, Context, Result}; use crc32fast::hash as crc32; use heck::{ToKebabCase, ToShoutySnakeCase, ToSnakeCase, ToUpperCamelCase}; use indoc::{formatdoc, indoc}; -use log::warn; +use log::info; use rand::{thread_rng, Rng}; use semver::Version; use serde::{Deserialize, Serialize}; @@ -356,7 +356,7 @@ pub fn generate_grammar_files( "tree-sitter-cli":"#}, ); if !contents.contains("module") { - warn!("Updating package.json"); + info!("Migrating package.json to ESM"); contents = contents.replace( r#""repository":"#, indoc! {r#" @@ -378,6 +378,7 @@ pub fn generate_grammar_files( |path| { let mut contents = fs::read_to_string(path)?; if contents.contains("module.exports") { + info!("Migrating grammars.js to ESM"); contents = contents.replace("module.exports =", "export default"); write_file(path, contents)?; } @@ -393,10 +394,16 @@ pub fn generate_grammar_files( allow_update, |path| generate_file(path, GITIGNORE_TEMPLATE, language_name, &generate_opts), |path| { - let contents = fs::read_to_string(path)?; + let mut contents = fs::read_to_string(path)?; if !contents.contains("Zig artifacts") { - warn!("Replacing .gitignore"); - generate_file(path, GITIGNORE_TEMPLATE, language_name, &generate_opts)?; + info!("Adding zig entries to .gitignore"); + contents.push('\n'); + contents.push_str(indoc! {" + # Zig artifacts + .zig-cache/ + zig-cache/ + zig-out/ + "}); } Ok(()) }, @@ -409,8 +416,13 @@ pub fn generate_grammar_files( |path| generate_file(path, GITATTRIBUTES_TEMPLATE, language_name, &generate_opts), |path| { let mut contents = fs::read_to_string(path)?; - contents = contents.replace("bindings/c/* ", "bindings/c/** "); + let c_bindings_entry = "bindings/c/* "; + if contents.contains(c_bindings_entry) { + info!("Updating c bindings entry in .gitattributes"); + contents = contents.replace(c_bindings_entry, "bindings/c/** "); + } if !contents.contains("Zig bindings") { + info!("Adding zig entries to .gitattributes"); contents.push('\n'); contents.push_str(indoc! {" # Zig bindings @@ -438,39 +450,40 @@ pub fn generate_grammar_files( }, |path| { let mut contents = fs::read_to_string(path)?; if !contents.contains("#[cfg(with_highlights_query)]") { - let replacement = indoc! {r#" - #[cfg(with_highlights_query)] - /// The syntax highlighting query for this grammar. - pub const HIGHLIGHTS_QUERY: &str = include_str!("../../HIGHLIGHTS_QUERY_PATH"); + info!("Updating query constants in bindings/rust/lib.rs"); + let replacement = indoc! {r#" + #[cfg(with_highlights_query)] + /// The syntax highlighting query for this grammar. + pub const HIGHLIGHTS_QUERY: &str = include_str!("../../HIGHLIGHTS_QUERY_PATH"); - #[cfg(with_injections_query)] - /// The language injection query for this grammar. - pub const INJECTIONS_QUERY: &str = include_str!("../../INJECTIONS_QUERY_PATH"); + #[cfg(with_injections_query)] + /// The language injection query for this grammar. + pub const INJECTIONS_QUERY: &str = include_str!("../../INJECTIONS_QUERY_PATH"); - #[cfg(with_locals_query)] - /// The local variable query for this grammar. - pub const LOCALS_QUERY: &str = include_str!("../../LOCALS_QUERY_PATH"); + #[cfg(with_locals_query)] + /// The local variable query for this grammar. + pub const LOCALS_QUERY: &str = include_str!("../../LOCALS_QUERY_PATH"); - #[cfg(with_tags_query)] - /// The symbol tagging query for this grammar. - pub const TAGS_QUERY: &str = include_str!("../../TAGS_QUERY_PATH"); - "#} - .replace("HIGHLIGHTS_QUERY_PATH", generate_opts.highlights_query_path) - .replace("INJECTIONS_QUERY_PATH", generate_opts.injections_query_path) - .replace("LOCALS_QUERY_PATH", generate_opts.locals_query_path) - .replace("TAGS_QUERY_PATH", generate_opts.tags_query_path); - contents = contents - .replace( - indoc! {r#" - // NOTE: uncomment these to include any queries that this grammar contains: + #[cfg(with_tags_query)] + /// The symbol tagging query for this grammar. + pub const TAGS_QUERY: &str = include_str!("../../TAGS_QUERY_PATH"); + "#} + .replace("HIGHLIGHTS_QUERY_PATH", generate_opts.highlights_query_path) + .replace("INJECTIONS_QUERY_PATH", generate_opts.injections_query_path) + .replace("LOCALS_QUERY_PATH", generate_opts.locals_query_path) + .replace("TAGS_QUERY_PATH", generate_opts.tags_query_path); + contents = contents + .replace( + indoc! {r#" + // NOTE: uncomment these to include any queries that this grammar contains: - // pub const HIGHLIGHTS_QUERY: &str = include_str!("../../queries/highlights.scm"); - // pub const INJECTIONS_QUERY: &str = include_str!("../../queries/injections.scm"); - // pub const LOCALS_QUERY: &str = include_str!("../../queries/locals.scm"); - // pub const TAGS_QUERY: &str = include_str!("../../queries/tags.scm"); - "#}, - &replacement, - ); + // pub const HIGHLIGHTS_QUERY: &str = include_str!("../../queries/highlights.scm"); + // pub const INJECTIONS_QUERY: &str = include_str!("../../queries/injections.scm"); + // pub const LOCALS_QUERY: &str = include_str!("../../queries/locals.scm"); + // pub const TAGS_QUERY: &str = include_str!("../../queries/tags.scm"); + "#}, + &replacement, + ); } write_file(path, contents)?; Ok(()) @@ -483,6 +496,7 @@ pub fn generate_grammar_files( |path| { let mut contents = fs::read_to_string(path)?; if !contents.contains("wasm32-unknown-unknown") { + info!("Adding wasm32-unknown-unknown target to bindings/rust/build.rs"); let replacement = indoc!{r#" c_config.flag("-utf-8"); @@ -503,19 +517,18 @@ pub fn generate_grammar_files( wasm_src.join("string.c"), ]); } - "#}; - - let indented_replacement = replacement + "#} .lines() .map(|line| if line.is_empty() { line.to_string() } else { format!(" {line}") }) .collect::>() .join("\n"); - contents = contents.replace(r#" c_config.flag("-utf-8");"#, &indented_replacement); + contents = contents.replace(r#" c_config.flag("-utf-8");"#, &replacement); } // Introduce configuration variables for dynamic query inclusion if !contents.contains("with_highlights_query") { + info!("Adding support for dynamic query inclusion to bindings/rust/build.rs"); let replaced = indoc! {r#" c_config.compile("tree-sitter-KEBAB_PARSER_NAME"); }"#} @@ -572,6 +585,7 @@ pub fn generate_grammar_files( |path| { let contents = fs::read_to_string(path)?; if contents.contains("\"LICENSE\"") { + info!("Adding LICENSE entry to bindings/rust/Cargo.toml"); write_file(path, contents.replace("\"LICENSE\"", "\"/LICENSE\""))?; } Ok(()) @@ -592,7 +606,7 @@ pub fn generate_grammar_files( |path| { let contents = fs::read_to_string(path)?; if !contents.contains("Object.defineProperty") { - warn!("Replacing index.js"); + info!("Replacing index.js"); generate_file(path, INDEX_JS_TEMPLATE, language_name, &generate_opts)?; } Ok(()) @@ -606,7 +620,7 @@ pub fn generate_grammar_files( |path| { let contents = fs::read_to_string(path)?; if !contents.contains("export default binding") { - warn!("Replacing index.d.ts"); + info!("Replacing index.d.ts"); generate_file(path, INDEX_D_TS_TEMPLATE, language_name, &generate_opts)?; } Ok(()) @@ -627,7 +641,7 @@ pub fn generate_grammar_files( |path| { let contents = fs::read_to_string(path)?; if !contents.contains("import") { - warn!("Replacing binding_test.js"); + info!("Replacing binding_test.js"); generate_file( path, BINDING_TEST_JS_TEMPLATE, @@ -650,6 +664,7 @@ pub fn generate_grammar_files( |path| { let contents = fs::read_to_string(path)?; if contents.contains("fs.exists(") { + info!("Replacing `fs.exists` calls in binding.gyp"); write_file(path, contents.replace("fs.exists(", "fs.existsSync("))?; } Ok(()) @@ -662,14 +677,17 @@ pub fn generate_grammar_files( // Generate C bindings if tree_sitter_config.bindings.c { + let kebab_case_name = language_name.to_kebab_case(); missing_path(bindings_dir.join("c"), create_dir)?.apply(|path| { - let old_file = &path.join(format!("tree-sitter-{}.h", language_name.to_kebab_case())); + let header_name = format!("tree-sitter-{kebab_case_name}.h"); + let old_file = &path.join(&header_name); if allow_update && fs::exists(old_file).unwrap_or(false) { + info!("Removing bindings/c/{header_name}"); fs::remove_file(old_file)?; } missing_path(path.join("tree_sitter"), create_dir)?.apply(|include_path| { missing_path( - include_path.join(format!("tree-sitter-{}.h", language_name.to_kebab_case())), + include_path.join(&header_name), |path| { generate_file(path, PARSER_NAME_H_TEMPLATE, language_name, &generate_opts) }, @@ -678,7 +696,7 @@ pub fn generate_grammar_files( })?; missing_path( - path.join(format!("tree-sitter-{}.pc.in", language_name.to_kebab_case())), + path.join(format!("tree-sitter-{kebab_case_name}.pc.in")), |path| { generate_file( path, @@ -698,23 +716,27 @@ pub fn generate_grammar_files( |path| { let mut contents = fs::read_to_string(path)?; if !contents.contains("cd '$(DESTDIR)$(LIBDIR)' && ln -sf") { - warn!("Replacing Makefile"); + info!("Replacing Makefile"); generate_file(path, MAKEFILE_TEMPLATE, language_name, &generate_opts)?; } else { - contents = contents - .replace( - indoc! {r" - $(PARSER): $(SRC_DIR)/grammar.json - $(TS) generate $^ - "}, - indoc! {r" - $(SRC_DIR)/grammar.json: grammar.js - $(TS) generate --no-parser $^ + let replaced = indoc! {r" + $(PARSER): $(SRC_DIR)/grammar.json + $(TS) generate $^ + "}; + if contents.contains(replaced) { + info!("Adding --no-parser target to Makefile"); + contents = contents + .replace( + replaced, + indoc! {r" + $(SRC_DIR)/grammar.json: grammar.js + $(TS) generate --no-parser $^ - $(PARSER): $(SRC_DIR)/grammar.json - $(TS) generate $^ - "} - ); + $(PARSER): $(SRC_DIR)/grammar.json + $(TS) generate $^ + "} + ); + } write_file(path, contents)?; } Ok(()) @@ -726,8 +748,8 @@ pub fn generate_grammar_files( allow_update, |path| generate_file(path, CMAKELISTS_TXT_TEMPLATE, language_name, &generate_opts), |path| { - let mut contents = fs::read_to_string(path)?; - contents = contents + let contents = fs::read_to_string(path)?; + let replaced_contents = contents .replace("add_custom_target(test", "add_custom_target(ts-test") .replace( &formatdoc! {r#" @@ -775,7 +797,10 @@ pub fn generate_grammar_files( COMMENT "Generating parser.c") "#} ); - write_file(path, contents)?; + if !replaced_contents.eq(&contents) { + info!("Updating CMakeLists.txt"); + write_file(path, replaced_contents)?; + } Ok(()) }, )?; @@ -811,7 +836,8 @@ pub fn generate_grammar_files( // Generate Python bindings if tree_sitter_config.bindings.python { missing_path(bindings_dir.join("python"), create_dir)?.apply(|path| { - let lang_path = path.join(format!("tree_sitter_{}", language_name.to_snake_case())); + let snake_case_grammar_name = format!("tree_sitter_{}", language_name.to_snake_case()); + let lang_path = path.join(&snake_case_grammar_name); missing_path(&lang_path, create_dir)?; missing_path_else( @@ -821,6 +847,7 @@ pub fn generate_grammar_files( |path| { let mut contents = fs::read_to_string(path)?; if !contents.contains("PyModuleDef_Init") { + info!("Updating bindings/python/{snake_case_grammar_name}/binding.c"); contents = contents .replace("PyModule_Create", "PyModuleDef_Init") .replace( @@ -862,7 +889,7 @@ pub fn generate_grammar_files( |path| { let contents = fs::read_to_string(path)?; if !contents.contains("uncomment these to include any queries") { - warn!("Replacing __init__.py"); + info!("Replacing __init__.py"); generate_file(path, INIT_PY_TEMPLATE, language_name, &generate_opts)?; } Ok(()) @@ -876,9 +903,10 @@ pub fn generate_grammar_files( |path| { let mut contents = fs::read_to_string(path)?; if contents.contains("uncomment these to include any queries") { - warn!("Replacing __init__.pyi"); + info!("Replacing __init__.pyi"); generate_file(path, INIT_PYI_TEMPLATE, language_name, &generate_opts)?; } else if !contents.contains("CapsuleType") { + info!("Updating __init__.pyi"); contents = contents .replace( "from typing import Final", @@ -910,6 +938,7 @@ pub fn generate_grammar_files( |path| { let mut contents = fs::read_to_string(path)?; if !contents.contains("Parser(Language(") { + info!("Updating Language function in bindings/python/tests/test_binding.py"); contents = contents .replace("tree_sitter.Language(", "Parser(Language(") .replace(".language())\n", ".language()))\n") @@ -932,7 +961,7 @@ pub fn generate_grammar_files( |path| { let contents = fs::read_to_string(path)?; if !contents.contains("build_ext") { - warn!("Replacing setup.py"); + info!("Replacing setup.py"); generate_file(path, SETUP_PY_TEMPLATE, language_name, &generate_opts)?; } Ok(()) @@ -953,6 +982,7 @@ pub fn generate_grammar_files( |path| { let mut contents = fs::read_to_string(path)?; if !contents.contains("cp310-*") { + info!("Updating dependencies in pyproject.toml"); contents = contents .replace(r#"build = "cp39-*""#, r#"build = "cp310-*""#) .replace(r#"python = ">=3.9""#, r#"python = ">=3.10""#) @@ -990,15 +1020,18 @@ pub fn generate_grammar_files( allow_update, |path| generate_file(path, PACKAGE_SWIFT_TEMPLATE, language_name, &generate_opts), |path| { - let mut contents = fs::read_to_string(path)?; - contents = contents + let contents = fs::read_to_string(path)?; + let replaced_contents = contents .replace( "https://github.com/ChimeHQ/SwiftTreeSitter", "https://github.com/tree-sitter/swift-tree-sitter", ) .replace("version: \"0.8.0\")", "version: \"0.9.0\")") .replace("(url:", "(name: \"SwiftTreeSitter\", url:"); - write_file(path, contents)?; + if !replaced_contents.eq(&contents) { + info!("Updating tree-sitter dependency in Package.swift"); + write_file(path, contents)?; + } Ok(()) }, )?; @@ -1016,7 +1049,7 @@ pub fn generate_grammar_files( |path| { let contents = fs::read_to_string(path)?; if !contents.contains("b.pkg_hash.len") { - warn!("Replacing build.zig"); + info!("Replacing build.zig"); generate_file(path, BUILD_ZIG_TEMPLATE, language_name, &generate_opts) } else { Ok(()) @@ -1031,7 +1064,7 @@ pub fn generate_grammar_files( |path| { let contents = fs::read_to_string(path)?; if !contents.contains(".name = .tree_sitter_") { - warn!("Replacing build.zig.zon"); + info!("Replacing build.zig.zon"); generate_file(path, BUILD_ZIG_ZON_TEMPLATE, language_name, &generate_opts) } else { Ok(()) @@ -1047,7 +1080,7 @@ pub fn generate_grammar_files( |path| { let contents = fs::read_to_string(path)?; if contents.contains("ts.Language") { - warn!("Replacing root.zig"); + info!("Replacing root.zig"); generate_file(path, ROOT_ZIG_TEMPLATE, language_name, &generate_opts) } else { Ok(()) From dd60d5cff079dbae8db798ce7272879dbd2ac9e8 Mon Sep 17 00:00:00 2001 From: WillLillis Date: Mon, 29 Dec 2025 14:12:25 -0500 Subject: [PATCH 644/663] feat(cli): fill in missing fields to tree-sitter.json when running `tree-sitter init -u` --- crates/cli/src/init.rs | 2 +- crates/cli/src/main.rs | 26 +++++++++++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index 2d37f8dd..00b7657b 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -123,7 +123,7 @@ const BUILD_ZIG_ZON_TEMPLATE: &str = include_str!("./templates/build.zig.zon"); const ROOT_ZIG_TEMPLATE: &str = include_str!("./templates/root.zig"); const TEST_ZIG_TEMPLATE: &str = include_str!("./templates/test.zig"); -const TREE_SITTER_JSON_SCHEMA: &str = +pub const TREE_SITTER_JSON_SCHEMA: &str = "https://tree-sitter.github.io/tree-sitter/assets/schemas/config.schema.json"; #[derive(Serialize, Deserialize, Clone)] diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 35d8fcb7..fbf75b8e 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -20,7 +20,7 @@ use tree_sitter_cli::{ LOG_GRAPH_ENABLED, START_SEED, }, highlight::{self, HighlightOptions}, - init::{generate_grammar_files, JsonConfigOpts}, + init::{generate_grammar_files, JsonConfigOpts, TREE_SITTER_JSON_SCHEMA}, input::{get_input, get_tmp_source_file, CliInput}, logger, parse::{self, ParseDebugType, ParseFileOptions, ParseOutput, ParseTheme}, @@ -867,10 +867,26 @@ impl Init { (opts.name.clone(), Some(opts)) } else { - let mut json = serde_json::from_str::( - &fs::read_to_string(current_dir.join("tree-sitter.json")) - .with_context(|| "Failed to read tree-sitter.json")?, - )?; + let old_config = fs::read_to_string(current_dir.join("tree-sitter.json")) + .with_context(|| "Failed to read tree-sitter.json")?; + + let mut json = serde_json::from_str::(&old_config)?; + if json.schema.is_none() { + json.schema = Some(TREE_SITTER_JSON_SCHEMA.to_string()); + } + + let new_config = format!("{}\n", serde_json::to_string_pretty(&json)?); + // Write the re-serialized config back, as newly added optional boolean fields + // will be included with explicit `false`s rather than implict `null`s + if self.update && !old_config.trim().eq(new_config.trim()) { + info!("Updating tree-sitter.json"); + fs::write( + current_dir.join("tree-sitter.json"), + serde_json::to_string_pretty(&json)?, + ) + .with_context(|| "Failed to write tree-sitter.json")?; + } + (json.grammars.swap_remove(0).name, None) }; From 17e3c7a5c56527a179fa6e37ce7ee934493e5047 Mon Sep 17 00:00:00 2001 From: skewb1k Date: Sun, 4 Jan 2026 09:03:09 +0300 Subject: [PATCH 645/663] fix(cli): restore test summary output for `tree-sitter test` Problem: After commit f02d7e7e335dc4d9355d4d2ca61729368bc4e959 the `tree-sitter test` command no longer printed the final test summary, leaving empty line. The `Stats` struct was embedded into `TestSummary`, and the explicit call to print it was removed. Solution: Print `parse_stats` from `TestSummary.fmt()` implementation. --- crates/cli/src/test.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/cli/src/test.rs b/crates/cli/src/test.rs index a78629ab..b568e4a3 100644 --- a/crates/cli/src/test.rs +++ b/crates/cli/src/test.rs @@ -595,6 +595,8 @@ impl std::fmt::Display for TestSummary { render_assertion_results("queries", &self.query_results)?; } + write!(f, "{}", self.parse_stats)?; + Ok(()) } } From f4ca3d95ca45f71116820a499ea3c199dfe981ea Mon Sep 17 00:00:00 2001 From: Trim21 Date: Tue, 6 Jan 2026 19:01:37 +0800 Subject: [PATCH 646/663] fix(wasm) add common definitions to stdlib (#5199) Also expose `strlen` through `string.h` instead of `stdio.h`. --- crates/language/wasm/include/stdint.h | 8 +++++++- crates/language/wasm/include/string.h | 2 ++ crates/language/wasm/src/stdio.c | 7 +------ crates/language/wasm/src/string.c | 6 ++++++ 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/crates/language/wasm/include/stdint.h b/crates/language/wasm/include/stdint.h index 5f7cb264..10cc35dc 100644 --- a/crates/language/wasm/include/stdint.h +++ b/crates/language/wasm/include/stdint.h @@ -23,9 +23,15 @@ typedef long unsigned int size_t; typedef long unsigned int uintptr_t; -#define UINT16_MAX 65535 +#define INT8_MAX 127 +#define INT16_MAX 32767 +#define INT32_MAX 2147483647L +#define INT64_MAX 9223372036854775807LL +#define UINT8_MAX 255 +#define UINT16_MAX 65535 #define UINT32_MAX 4294967295U +#define UINT64_MAX 18446744073709551615ULL #if defined(__wasm32__) diff --git a/crates/language/wasm/include/string.h b/crates/language/wasm/include/string.h index 2d576f08..10f11958 100644 --- a/crates/language/wasm/include/string.h +++ b/crates/language/wasm/include/string.h @@ -13,4 +13,6 @@ void *memset(void *dst, int value, size_t count); int strncmp(const char *left, const char *right, size_t n); +size_t strlen(const char *str); + #endif // TREE_SITTER_WASM_STRING_H_ diff --git a/crates/language/wasm/src/stdio.c b/crates/language/wasm/src/stdio.c index 3432699a..470c1ecc 100644 --- a/crates/language/wasm/src/stdio.c +++ b/crates/language/wasm/src/stdio.c @@ -1,4 +1,5 @@ #include +#include typedef struct { bool left_justify; // - @@ -105,12 +106,6 @@ static int ptr_to_str(void *ptr, char *buffer) { return 2 + len; } -size_t strlen(const char *str) { - const char *s = str; - while (*s) s++; - return s - str; -} - char *strncpy(char *dest, const char *src, size_t n) { char *d = dest; const char *s = src; diff --git a/crates/language/wasm/src/string.c b/crates/language/wasm/src/string.c index 0fcf4b85..2d0d9096 100644 --- a/crates/language/wasm/src/string.c +++ b/crates/language/wasm/src/string.c @@ -58,3 +58,9 @@ int strncmp(const char *left, const char *right, size_t n) { } return 0; } + +size_t strlen(const char *str) { + const char *s = str; + while (*s) s++; + return s - str; +} From cd6672701b413a38300af312c529ab78dbf23239 Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Tue, 6 Jan 2026 12:36:03 +0100 Subject: [PATCH 647/663] fix(wasm): update wasm-stdlib.h --- lib/src/wasm/wasm-stdlib.h | 2297 +++++++++++++++++++----------------- 1 file changed, 1227 insertions(+), 1070 deletions(-) diff --git a/lib/src/wasm/wasm-stdlib.h b/lib/src/wasm/wasm-stdlib.h index 753a7abf..a8f55df8 100644 --- a/lib/src/wasm/wasm-stdlib.h +++ b/lib/src/wasm/wasm-stdlib.h @@ -1,920 +1,1013 @@ unsigned char STDLIB_WASM[] = { - 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1a, 0x05, 0x60, - 0x01, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, + 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1e, 0x06, 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x00, 0x00, - 0x02, 0x7c, 0x04, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, - 0x77, 0x31, 0x08, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x00, - 0x02, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, - 0x0e, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, - 0x67, 0x65, 0x74, 0x00, 0x02, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x31, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, - 0x69, 0x74, 0x00, 0x03, 0x03, 0x65, 0x6e, 0x76, 0x06, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x02, 0x00, 0x02, 0x03, 0x1f, 0x1e, 0x04, 0x04, 0x04, - 0x03, 0x00, 0x03, 0x02, 0x02, 0x03, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x06, 0x08, 0x01, 0x7f, 0x01, 0x41, 0x80, 0x80, 0x04, - 0x0b, 0x07, 0xad, 0x02, 0x1c, 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, - 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x00, - 0x03, 0x0f, 0x5f, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x03, 0x00, 0x06, 0x5f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x00, 0x05, 0x0a, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x68, - 0x65, 0x61, 0x70, 0x00, 0x06, 0x06, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, - 0x00, 0x07, 0x04, 0x66, 0x72, 0x65, 0x65, 0x00, 0x08, 0x06, 0x63, 0x61, - 0x6c, 0x6c, 0x6f, 0x63, 0x00, 0x09, 0x06, 0x6d, 0x65, 0x6d, 0x73, 0x65, - 0x74, 0x00, 0x0d, 0x07, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x00, - 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x70, 0x79, 0x00, 0x0c, 0x06, 0x73, - 0x74, 0x72, 0x6c, 0x65, 0x6e, 0x00, 0x0e, 0x08, 0x69, 0x73, 0x77, 0x61, - 0x6c, 0x6e, 0x75, 0x6d, 0x00, 0x20, 0x08, 0x69, 0x73, 0x77, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x00, 0x0f, 0x08, 0x69, 0x73, 0x77, 0x62, 0x6c, 0x61, - 0x6e, 0x6b, 0x00, 0x1a, 0x08, 0x69, 0x73, 0x77, 0x64, 0x69, 0x67, 0x69, - 0x74, 0x00, 0x1b, 0x08, 0x69, 0x73, 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, - 0x00, 0x19, 0x08, 0x69, 0x73, 0x77, 0x73, 0x70, 0x61, 0x63, 0x65, 0x00, - 0x1f, 0x08, 0x69, 0x73, 0x77, 0x75, 0x70, 0x70, 0x65, 0x72, 0x00, 0x17, - 0x09, 0x69, 0x73, 0x77, 0x78, 0x64, 0x69, 0x67, 0x69, 0x74, 0x00, 0x1e, - 0x08, 0x74, 0x6f, 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x00, 0x13, 0x08, - 0x74, 0x6f, 0x77, 0x75, 0x70, 0x70, 0x65, 0x72, 0x00, 0x15, 0x06, 0x6d, - 0x65, 0x6d, 0x63, 0x68, 0x72, 0x00, 0x11, 0x06, 0x6d, 0x65, 0x6d, 0x63, - 0x6d, 0x70, 0x00, 0x10, 0x07, 0x6d, 0x65, 0x6d, 0x6d, 0x6f, 0x76, 0x65, - 0x00, 0x18, 0x06, 0x73, 0x74, 0x72, 0x63, 0x6d, 0x70, 0x00, 0x12, 0x07, - 0x73, 0x74, 0x72, 0x6e, 0x63, 0x61, 0x74, 0x00, 0x1c, 0x07, 0x73, 0x74, - 0x72, 0x6e, 0x63, 0x6d, 0x70, 0x00, 0x16, 0x07, 0x73, 0x74, 0x72, 0x6e, - 0x63, 0x70, 0x79, 0x00, 0x1d, 0x08, 0x01, 0x04, 0x0c, 0x01, 0x01, 0x0a, - 0x8b, 0x28, 0x1e, 0x02, 0x00, 0x0b, 0x0d, 0x00, 0x41, 0xe8, 0xc2, 0x04, - 0x41, 0x00, 0x41, 0x14, 0xfc, 0x0b, 0x00, 0x0b, 0xa4, 0x01, 0x01, 0x03, - 0x7f, 0x41, 0xe8, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x45, 0x04, 0x40, 0x41, - 0xe8, 0xc2, 0x04, 0x41, 0x01, 0x36, 0x02, 0x00, 0x23, 0x00, 0x41, 0x10, - 0x6b, 0x22, 0x00, 0x24, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, - 0x40, 0x20, 0x00, 0x41, 0x08, 0x6a, 0x20, 0x00, 0x41, 0x0c, 0x6a, 0x10, - 0x01, 0x41, 0xff, 0xff, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x00, 0x28, - 0x02, 0x08, 0x41, 0x01, 0x6a, 0x22, 0x01, 0x45, 0x0d, 0x01, 0x20, 0x00, - 0x28, 0x02, 0x0c, 0x10, 0x07, 0x22, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x01, - 0x41, 0x04, 0x10, 0x09, 0x22, 0x01, 0x45, 0x0d, 0x03, 0x20, 0x01, 0x20, - 0x02, 0x10, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0d, 0x04, 0x20, 0x00, - 0x28, 0x02, 0x08, 0x00, 0x0b, 0x41, 0xc7, 0x00, 0x10, 0x0b, 0x00, 0x0b, - 0x41, 0xc6, 0x00, 0x10, 0x0b, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x0b, - 0x00, 0x0b, 0x20, 0x02, 0x10, 0x08, 0x41, 0xc6, 0x00, 0x10, 0x0b, 0x00, - 0x0b, 0x20, 0x02, 0x10, 0x08, 0x20, 0x01, 0x10, 0x08, 0x41, 0xc7, 0x00, - 0x10, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x35, 0x01, 0x01, 0x7f, 0x41, 0xf0, - 0xc2, 0x04, 0x20, 0x00, 0x36, 0x02, 0x00, 0x41, 0xec, 0xc2, 0x04, 0x20, - 0x00, 0x36, 0x02, 0x00, 0x3f, 0x00, 0x21, 0x00, 0x20, 0x01, 0x41, 0xf8, - 0xc2, 0x04, 0x6a, 0x41, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0xf4, - 0xc2, 0x04, 0x6a, 0x20, 0x00, 0x41, 0x10, 0x74, 0x36, 0x02, 0x00, 0x0b, - 0xd7, 0x01, 0x01, 0x04, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, 0x00, - 0x02, 0x40, 0x41, 0xf8, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x22, 0x01, 0x45, - 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x20, 0x01, 0x28, 0x02, 0x00, 0x4d, - 0x04, 0x40, 0x20, 0x01, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x03, 0x40, 0x20, - 0x01, 0x28, 0x02, 0x04, 0x22, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x01, 0x21, - 0x03, 0x20, 0x02, 0x22, 0x01, 0x28, 0x02, 0x00, 0x20, 0x00, 0x49, 0x0d, - 0x00, 0x0b, 0x0b, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x41, 0xf8, 0xc2, 0x04, - 0x20, 0x03, 0x1b, 0x20, 0x02, 0x28, 0x02, 0x04, 0x36, 0x02, 0x00, 0x20, - 0x02, 0x41, 0x08, 0x6a, 0x0f, 0x0b, 0x41, 0xf0, 0xc2, 0x04, 0x28, 0x02, - 0x00, 0x22, 0x01, 0x20, 0x00, 0x6a, 0x41, 0x0b, 0x6a, 0x41, 0x7c, 0x71, - 0x22, 0x02, 0x41, 0xf4, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x4b, 0x04, 0x40, - 0x20, 0x02, 0x41, 0xec, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x6b, 0x41, 0x80, - 0x80, 0x80, 0x02, 0x4a, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6b, 0x41, - 0x10, 0x76, 0x41, 0x01, 0x6a, 0x40, 0x00, 0x41, 0x7f, 0x46, 0x0d, 0x01, - 0x41, 0xf4, 0xc2, 0x04, 0x3f, 0x00, 0x41, 0x10, 0x74, 0x36, 0x02, 0x00, - 0x41, 0xf0, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x21, 0x01, 0x0b, 0x20, 0x01, - 0x20, 0x00, 0x36, 0x02, 0x00, 0x41, 0xf0, 0xc2, 0x04, 0x20, 0x02, 0x36, - 0x02, 0x00, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0b, 0x20, 0x04, - 0x0b, 0x41, 0x01, 0x02, 0x7f, 0x20, 0x00, 0x04, 0x40, 0x41, 0xf0, 0xc2, - 0x04, 0x22, 0x01, 0x28, 0x02, 0x00, 0x20, 0x00, 0x41, 0x08, 0x6b, 0x22, - 0x02, 0x28, 0x02, 0x00, 0x20, 0x00, 0x6a, 0x41, 0x03, 0x6a, 0x41, 0x7c, - 0x71, 0x47, 0x04, 0x40, 0x20, 0x00, 0x41, 0x04, 0x6b, 0x41, 0xf8, 0xc2, - 0x04, 0x22, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x0b, 0x20, 0x01, - 0x20, 0x02, 0x36, 0x02, 0x00, 0x0b, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, - 0x01, 0x6c, 0x22, 0x00, 0x10, 0x07, 0x41, 0x00, 0x20, 0x00, 0x10, 0x0d, - 0x0b, 0x47, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, 0x00, - 0x41, 0xf0, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x20, 0x00, 0x41, 0x08, 0x6b, - 0x22, 0x02, 0x28, 0x02, 0x00, 0x20, 0x00, 0x6a, 0x41, 0x03, 0x6a, 0x41, - 0x7c, 0x71, 0x46, 0x04, 0x40, 0x41, 0xf0, 0xc2, 0x04, 0x20, 0x02, 0x36, - 0x02, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x01, 0x10, 0x07, 0x20, 0x00, 0x20, - 0x02, 0x28, 0x02, 0x00, 0x10, 0x0c, 0x0f, 0x0b, 0x20, 0x01, 0x10, 0x07, - 0x0b, 0x07, 0x00, 0x20, 0x00, 0x10, 0x02, 0x00, 0x0b, 0xbe, 0x07, 0x01, - 0x04, 0x7f, 0x02, 0x40, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x02, 0x41, 0x20, - 0x4d, 0x04, 0x40, 0x20, 0x01, 0x41, 0x03, 0x71, 0x45, 0x20, 0x02, 0x45, - 0x72, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, - 0x00, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x22, - 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x22, 0x05, - 0x45, 0x72, 0x0d, 0x02, 0x1a, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x01, - 0x3a, 0x00, 0x01, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x20, 0x01, 0x41, 0x02, - 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x02, 0x41, 0x02, 0x6b, - 0x22, 0x05, 0x45, 0x72, 0x0d, 0x02, 0x1a, 0x20, 0x00, 0x20, 0x01, 0x2d, - 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x20, 0x01, - 0x41, 0x03, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x02, 0x41, - 0x03, 0x6b, 0x22, 0x05, 0x45, 0x72, 0x0d, 0x02, 0x1a, 0x20, 0x00, 0x20, - 0x01, 0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x02, 0x41, 0x04, 0x6b, - 0x21, 0x05, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, - 0x04, 0x6a, 0x0c, 0x02, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, - 0x0a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x21, 0x05, 0x20, - 0x01, 0x21, 0x03, 0x20, 0x00, 0x0b, 0x22, 0x04, 0x41, 0x03, 0x71, 0x22, - 0x02, 0x45, 0x04, 0x40, 0x02, 0x40, 0x20, 0x05, 0x41, 0x10, 0x49, 0x04, - 0x40, 0x20, 0x05, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x10, - 0x6b, 0x22, 0x02, 0x41, 0x10, 0x71, 0x45, 0x04, 0x40, 0x20, 0x04, 0x20, - 0x03, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x20, 0x03, 0x29, - 0x02, 0x08, 0x37, 0x02, 0x08, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, 0x04, - 0x20, 0x03, 0x41, 0x10, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x21, 0x05, 0x0b, - 0x20, 0x02, 0x41, 0x10, 0x49, 0x0d, 0x00, 0x20, 0x05, 0x21, 0x02, 0x03, - 0x40, 0x20, 0x04, 0x20, 0x03, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, - 0x04, 0x20, 0x03, 0x29, 0x02, 0x08, 0x37, 0x02, 0x08, 0x20, 0x04, 0x20, - 0x03, 0x29, 0x02, 0x10, 0x37, 0x02, 0x10, 0x20, 0x04, 0x20, 0x03, 0x29, - 0x02, 0x18, 0x37, 0x02, 0x18, 0x20, 0x04, 0x41, 0x20, 0x6a, 0x21, 0x04, - 0x20, 0x03, 0x41, 0x20, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x20, 0x6b, - 0x22, 0x02, 0x41, 0x0f, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x41, - 0x08, 0x4f, 0x04, 0x40, 0x20, 0x04, 0x20, 0x03, 0x29, 0x02, 0x00, 0x37, - 0x02, 0x00, 0x20, 0x04, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x41, - 0x08, 0x6a, 0x21, 0x03, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x71, 0x04, 0x40, - 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x04, - 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, - 0x0b, 0x20, 0x02, 0x41, 0x02, 0x71, 0x04, 0x40, 0x20, 0x04, 0x20, 0x03, - 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x04, 0x41, 0x02, 0x6a, 0x21, - 0x04, 0x20, 0x03, 0x41, 0x02, 0x6a, 0x21, 0x03, 0x0b, 0x20, 0x02, 0x41, - 0x01, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x20, 0x03, 0x2d, 0x00, 0x00, - 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, - 0x7f, 0x02, 0x40, 0x20, 0x05, 0x41, 0x20, 0x4f, 0x04, 0x40, 0x20, 0x04, - 0x20, 0x03, 0x28, 0x02, 0x00, 0x22, 0x01, 0x3a, 0x00, 0x00, 0x02, 0x40, - 0x02, 0x40, 0x20, 0x02, 0x41, 0x02, 0x6b, 0x0e, 0x02, 0x00, 0x01, 0x03, - 0x0b, 0x20, 0x04, 0x20, 0x01, 0x41, 0x08, 0x76, 0x3a, 0x00, 0x01, 0x20, - 0x04, 0x20, 0x03, 0x41, 0x06, 0x6a, 0x29, 0x01, 0x00, 0x37, 0x02, 0x06, - 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x04, 0x41, 0x10, 0x74, 0x20, 0x01, - 0x41, 0x10, 0x76, 0x72, 0x36, 0x02, 0x02, 0x20, 0x03, 0x41, 0x12, 0x6a, - 0x21, 0x01, 0x41, 0x0e, 0x21, 0x06, 0x20, 0x03, 0x41, 0x0e, 0x6a, 0x28, - 0x01, 0x00, 0x21, 0x03, 0x41, 0x0e, 0x21, 0x05, 0x20, 0x04, 0x41, 0x12, - 0x6a, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x03, 0x41, 0x05, 0x6a, 0x29, - 0x00, 0x00, 0x37, 0x02, 0x05, 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x04, - 0x41, 0x18, 0x74, 0x20, 0x01, 0x41, 0x08, 0x76, 0x72, 0x36, 0x02, 0x01, - 0x20, 0x03, 0x41, 0x11, 0x6a, 0x21, 0x01, 0x41, 0x0d, 0x21, 0x06, 0x20, - 0x03, 0x41, 0x0d, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x03, 0x41, 0x0f, 0x21, - 0x05, 0x20, 0x04, 0x41, 0x11, 0x6a, 0x0c, 0x02, 0x0b, 0x02, 0x7f, 0x20, - 0x05, 0x41, 0x10, 0x49, 0x04, 0x40, 0x20, 0x04, 0x21, 0x02, 0x20, 0x03, - 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x3a, 0x00, - 0x00, 0x20, 0x04, 0x20, 0x03, 0x28, 0x00, 0x01, 0x36, 0x00, 0x01, 0x20, - 0x04, 0x20, 0x03, 0x29, 0x00, 0x05, 0x37, 0x00, 0x05, 0x20, 0x04, 0x20, - 0x03, 0x2f, 0x00, 0x0d, 0x3b, 0x00, 0x0d, 0x20, 0x04, 0x20, 0x03, 0x2d, - 0x00, 0x0f, 0x3a, 0x00, 0x0f, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, 0x02, - 0x20, 0x03, 0x41, 0x10, 0x6a, 0x0b, 0x21, 0x01, 0x20, 0x05, 0x41, 0x08, - 0x71, 0x0d, 0x02, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x01, 0x41, 0x10, - 0x76, 0x3a, 0x00, 0x02, 0x20, 0x04, 0x20, 0x01, 0x41, 0x08, 0x76, 0x3a, - 0x00, 0x01, 0x20, 0x04, 0x20, 0x03, 0x41, 0x07, 0x6a, 0x29, 0x00, 0x00, - 0x37, 0x02, 0x07, 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x04, 0x41, 0x08, - 0x74, 0x20, 0x01, 0x41, 0x18, 0x76, 0x72, 0x36, 0x02, 0x03, 0x20, 0x03, - 0x41, 0x13, 0x6a, 0x21, 0x01, 0x41, 0x0f, 0x21, 0x06, 0x20, 0x03, 0x41, - 0x0f, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x03, 0x41, 0x0d, 0x21, 0x05, 0x20, - 0x04, 0x41, 0x13, 0x6a, 0x0b, 0x21, 0x02, 0x20, 0x04, 0x20, 0x06, 0x6a, - 0x20, 0x03, 0x36, 0x02, 0x00, 0x0b, 0x20, 0x02, 0x20, 0x01, 0x29, 0x00, - 0x00, 0x37, 0x00, 0x00, 0x20, 0x02, 0x41, 0x08, 0x6a, 0x21, 0x02, 0x20, - 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x04, 0x71, - 0x04, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x00, 0x00, 0x36, 0x00, 0x00, - 0x20, 0x02, 0x41, 0x04, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x04, 0x6a, - 0x21, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x02, 0x71, 0x04, 0x40, 0x20, 0x02, - 0x20, 0x01, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x02, 0x41, 0x02, - 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x21, 0x01, 0x0b, 0x20, - 0x05, 0x41, 0x01, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, 0x2d, - 0x00, 0x00, 0x3a, 0x00, 0x00, 0x0b, 0x20, 0x00, 0x0b, 0x86, 0x03, 0x02, - 0x03, 0x7f, 0x01, 0x7e, 0x20, 0x02, 0x41, 0x21, 0x4f, 0x04, 0x40, 0x20, - 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0b, 0x00, 0x20, 0x00, 0x0f, 0x0b, - 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, - 0x00, 0x00, 0x20, 0x00, 0x20, 0x02, 0x6a, 0x22, 0x03, 0x41, 0x01, 0x6b, + 0x60, 0x01, 0x7f, 0x01, 0x7f, 0x60, 0x00, 0x01, 0x7f, 0x60, 0x03, 0x7f, + 0x7f, 0x7f, 0x01, 0x7f, 0x02, 0x9e, 0x01, 0x05, 0x03, 0x65, 0x6e, 0x76, + 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x02, 0x03, 0x65, + 0x6e, 0x76, 0x19, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x01, 0x70, 0x00, 0x01, 0x16, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x08, 0x61, 0x72, 0x67, 0x73, + 0x5f, 0x67, 0x65, 0x74, 0x00, 0x00, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x31, 0x0e, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x00, 0x00, 0x16, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x09, 0x70, 0x72, + 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x00, 0x01, 0x03, 0x2b, 0x2a, + 0x02, 0x00, 0x02, 0x02, 0x01, 0x03, 0x01, 0x00, 0x00, 0x01, 0x04, 0x00, + 0x00, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x05, 0x05, 0x00, 0x03, 0x00, + 0x03, 0x05, 0x03, 0x05, 0x05, 0x03, 0x05, 0x03, 0x03, 0x03, 0x05, 0x05, + 0x05, 0x03, 0x03, 0x00, 0x03, 0x03, 0x06, 0x0d, 0x02, 0x7f, 0x01, 0x41, + 0x80, 0x80, 0x04, 0x0b, 0x7f, 0x00, 0x41, 0x00, 0x0b, 0x07, 0xad, 0x02, + 0x1c, 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, + 0x6c, 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x00, 0x03, 0x0f, 0x5f, 0x5f, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x03, 0x00, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x06, + 0x0a, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x00, + 0x07, 0x06, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x00, 0x08, 0x04, 0x66, + 0x72, 0x65, 0x65, 0x00, 0x09, 0x06, 0x63, 0x61, 0x6c, 0x6c, 0x6f, 0x63, + 0x00, 0x0a, 0x07, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x00, 0x0b, + 0x06, 0x73, 0x74, 0x72, 0x6c, 0x65, 0x6e, 0x00, 0x14, 0x08, 0x69, 0x73, + 0x77, 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x00, 0x2c, 0x08, 0x69, 0x73, 0x77, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x00, 0x15, 0x08, 0x69, 0x73, 0x77, 0x62, + 0x6c, 0x61, 0x6e, 0x6b, 0x00, 0x23, 0x08, 0x69, 0x73, 0x77, 0x64, 0x69, + 0x67, 0x69, 0x74, 0x00, 0x24, 0x08, 0x69, 0x73, 0x77, 0x6c, 0x6f, 0x77, + 0x65, 0x72, 0x00, 0x20, 0x08, 0x69, 0x73, 0x77, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x00, 0x2b, 0x08, 0x69, 0x73, 0x77, 0x75, 0x70, 0x70, 0x65, 0x72, + 0x00, 0x1d, 0x09, 0x69, 0x73, 0x77, 0x78, 0x64, 0x69, 0x67, 0x69, 0x74, + 0x00, 0x28, 0x08, 0x74, 0x6f, 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x00, + 0x19, 0x08, 0x74, 0x6f, 0x77, 0x75, 0x70, 0x70, 0x65, 0x72, 0x00, 0x1b, + 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x68, 0x72, 0x00, 0x17, 0x06, 0x6d, 0x65, + 0x6d, 0x63, 0x6d, 0x70, 0x00, 0x16, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x70, + 0x79, 0x00, 0x21, 0x07, 0x6d, 0x65, 0x6d, 0x6d, 0x6f, 0x76, 0x65, 0x00, + 0x1e, 0x06, 0x6d, 0x65, 0x6d, 0x73, 0x65, 0x74, 0x00, 0x1f, 0x06, 0x73, + 0x74, 0x72, 0x63, 0x6d, 0x70, 0x00, 0x18, 0x07, 0x73, 0x74, 0x72, 0x6e, + 0x63, 0x61, 0x74, 0x00, 0x25, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x6d, + 0x70, 0x00, 0x1c, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x70, 0x79, 0x00, + 0x27, 0x08, 0x01, 0x05, 0x0a, 0xb0, 0x30, 0x2a, 0x02, 0x00, 0x0b, 0x03, + 0x00, 0x00, 0x0b, 0x0e, 0x00, 0x41, 0xec, 0xc2, 0x04, 0x41, 0x00, 0x41, + 0x84, 0x01, 0xfc, 0x0b, 0x00, 0x0b, 0x57, 0x01, 0x01, 0x7f, 0x02, 0x40, + 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xec, 0xc2, 0x84, + 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x0d, 0x00, 0x23, 0x81, 0x80, 0x80, + 0x80, 0x00, 0x41, 0xec, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x41, 0x01, 0x36, + 0x02, 0x00, 0x10, 0x91, 0x80, 0x80, 0x80, 0x00, 0x10, 0x83, 0x80, 0x80, + 0x80, 0x00, 0x10, 0x8d, 0x80, 0x80, 0x80, 0x00, 0x21, 0x00, 0x10, 0x93, + 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x0d, 0x01, 0x0f, 0x0b, 0x00, 0x0b, + 0x20, 0x00, 0x10, 0x90, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x49, 0x01, + 0x01, 0x7f, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x41, 0xf4, + 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, + 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x00, 0x36, 0x02, 0x00, + 0x3f, 0x00, 0x21, 0x00, 0x20, 0x01, 0x41, 0xfc, 0xc2, 0x84, 0x80, 0x00, + 0x6a, 0x41, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0xf8, 0xc2, 0x84, + 0x80, 0x00, 0x6a, 0x20, 0x00, 0x41, 0x10, 0x74, 0x36, 0x02, 0x00, 0x0b, + 0xae, 0x02, 0x01, 0x04, 0x7f, 0x41, 0x00, 0x21, 0x01, 0x02, 0x40, 0x20, + 0x00, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, + 0x41, 0xfc, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x02, + 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x02, 0x28, 0x02, 0x00, 0x20, 0x00, 0x49, 0x0d, 0x00, 0x20, 0x02, 0x21, + 0x04, 0x0c, 0x01, 0x0b, 0x03, 0x40, 0x20, 0x02, 0x28, 0x02, 0x04, 0x22, + 0x04, 0x45, 0x0d, 0x02, 0x20, 0x02, 0x21, 0x03, 0x20, 0x04, 0x21, 0x02, + 0x20, 0x04, 0x28, 0x02, 0x00, 0x20, 0x00, 0x49, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x04, 0x28, 0x02, 0x04, 0x21, 0x02, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x03, 0x0d, 0x00, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xfc, 0xc2, + 0x84, 0x80, 0x00, 0x6a, 0x20, 0x02, 0x36, 0x02, 0x00, 0x0c, 0x01, 0x0b, + 0x20, 0x03, 0x20, 0x02, 0x36, 0x02, 0x04, 0x0b, 0x20, 0x04, 0x41, 0x08, + 0x6a, 0x0f, 0x0b, 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x22, + 0x02, 0x41, 0xf8, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x20, + 0x02, 0x41, 0xf4, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x22, + 0x04, 0x41, 0x08, 0x6a, 0x22, 0x03, 0x20, 0x00, 0x6a, 0x41, 0x03, 0x6a, + 0x41, 0x7c, 0x71, 0x22, 0x02, 0x4f, 0x0d, 0x00, 0x20, 0x02, 0x23, 0x81, + 0x80, 0x80, 0x80, 0x00, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, + 0x02, 0x00, 0x6b, 0x41, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x0d, 0x01, 0x20, + 0x00, 0x41, 0x7f, 0x6a, 0x41, 0x10, 0x76, 0x41, 0x01, 0x6a, 0x40, 0x00, + 0x41, 0x7f, 0x46, 0x0d, 0x01, 0x3f, 0x00, 0x21, 0x01, 0x23, 0x81, 0x80, + 0x80, 0x80, 0x00, 0x41, 0xf8, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x01, + 0x41, 0x10, 0x74, 0x36, 0x02, 0x00, 0x0b, 0x20, 0x04, 0x20, 0x00, 0x36, + 0x02, 0x00, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf4, 0xc2, 0x84, + 0x80, 0x00, 0x6a, 0x20, 0x02, 0x36, 0x02, 0x00, 0x20, 0x03, 0x21, 0x01, + 0x0b, 0x20, 0x01, 0x0b, 0x5c, 0x01, 0x03, 0x7f, 0x02, 0x40, 0x20, 0x00, + 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x78, 0x6a, 0x22, 0x01, 0x28, 0x02, + 0x00, 0x21, 0x02, 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, + 0xf4, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x22, 0x03, 0x28, 0x02, 0x00, 0x20, + 0x00, 0x20, 0x02, 0x6a, 0x41, 0x03, 0x6a, 0x41, 0x7c, 0x71, 0x46, 0x0d, + 0x00, 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, + 0x41, 0xfc, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x22, 0x03, 0x28, 0x02, 0x00, + 0x36, 0x02, 0x00, 0x0b, 0x20, 0x03, 0x20, 0x01, 0x36, 0x02, 0x00, 0x0b, + 0x0b, 0x24, 0x00, 0x20, 0x01, 0x20, 0x00, 0x6c, 0x22, 0x00, 0x10, 0x88, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x01, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, + 0x00, 0x20, 0x01, 0x41, 0x00, 0x20, 0x00, 0xfc, 0x0b, 0x00, 0x0b, 0x20, + 0x01, 0x0b, 0x79, 0x01, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, + 0x00, 0x20, 0x00, 0x41, 0x78, 0x6a, 0x22, 0x02, 0x28, 0x02, 0x00, 0x21, + 0x03, 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf4, 0xc2, + 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x20, 0x00, 0x20, 0x03, 0x6a, + 0x41, 0x03, 0x6a, 0x41, 0x7c, 0x71, 0x47, 0x0d, 0x00, 0x23, 0x81, 0x80, + 0x80, 0x80, 0x00, 0x41, 0xf4, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x02, + 0x36, 0x02, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x01, 0x10, 0x88, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x01, 0x02, 0x40, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, + 0x02, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x20, 0x00, 0x20, 0x02, 0xfc, 0x0a, + 0x00, 0x00, 0x0b, 0x20, 0x01, 0x0f, 0x0b, 0x20, 0x01, 0x10, 0x88, 0x80, + 0x80, 0x80, 0x00, 0x0b, 0x0b, 0x00, 0x20, 0x00, 0x10, 0x90, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x0b, 0xd5, 0x01, 0x01, 0x03, 0x7f, 0x23, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x00, 0x24, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x00, 0x41, 0x08, 0x6a, 0x20, 0x00, 0x41, 0x0c, 0x6a, 0x10, 0x8f, + 0x80, 0x80, 0x80, 0x00, 0x0d, 0x00, 0x20, 0x00, 0x28, 0x02, 0x08, 0x41, + 0x01, 0x6a, 0x22, 0x01, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x28, 0x02, 0x0c, + 0x10, 0x88, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x45, 0x0d, 0x02, 0x20, + 0x01, 0x41, 0x04, 0x10, 0x8a, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x45, + 0x0d, 0x03, 0x20, 0x01, 0x20, 0x02, 0x10, 0x8e, 0x80, 0x80, 0x80, 0x00, + 0x0d, 0x04, 0x20, 0x00, 0x28, 0x02, 0x08, 0x20, 0x01, 0x10, 0x84, 0x80, + 0x80, 0x80, 0x00, 0x21, 0x01, 0x20, 0x00, 0x41, 0x10, 0x6a, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x0f, 0x0b, 0x41, 0xc7, 0x00, 0x10, + 0x8c, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x8c, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x8c, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x0b, 0x20, 0x02, 0x10, 0x89, 0x80, 0x80, 0x80, + 0x00, 0x41, 0xc6, 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, + 0x20, 0x02, 0x10, 0x89, 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x10, 0x89, + 0x80, 0x80, 0x80, 0x00, 0x41, 0xc7, 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x11, 0x00, 0x20, + 0x00, 0x20, 0x01, 0x10, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, + 0x03, 0x71, 0x0b, 0x0b, 0x00, 0x20, 0x00, 0x10, 0x82, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x0b, 0xdf, 0x01, 0x01, 0x02, 0x7f, 0x41, 0x00, 0x41, 0x84, + 0xc3, 0x84, 0x80, 0x00, 0x36, 0x02, 0x84, 0xc3, 0x84, 0x80, 0x00, 0x41, + 0x80, 0x80, 0x84, 0x80, 0x00, 0x21, 0x00, 0x02, 0x40, 0x02, 0x40, 0x41, + 0x80, 0x80, 0x84, 0x80, 0x00, 0x45, 0x0d, 0x00, 0x41, 0x80, 0x80, 0x84, + 0x80, 0x00, 0x41, 0x80, 0x80, 0x80, 0x80, 0x00, 0x6b, 0x21, 0x01, 0x0c, + 0x01, 0x0b, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, 0x01, 0x41, 0xf0, + 0xc3, 0x84, 0x80, 0x00, 0x41, 0xf0, 0xc3, 0x84, 0x80, 0x00, 0x6b, 0x41, + 0x80, 0x80, 0x84, 0x80, 0x00, 0x20, 0x01, 0x41, 0x80, 0x80, 0x84, 0x80, + 0x00, 0x4b, 0x22, 0x00, 0x1b, 0x21, 0x01, 0x41, 0xf0, 0xc3, 0x84, 0x80, + 0x00, 0x41, 0x80, 0x80, 0x84, 0x80, 0x00, 0x20, 0x00, 0x1b, 0x21, 0x00, + 0x0b, 0x41, 0x38, 0x41, 0x00, 0x36, 0x02, 0x84, 0xc3, 0x84, 0x80, 0x00, + 0x41, 0x34, 0x20, 0x01, 0x36, 0x02, 0x84, 0xc3, 0x84, 0x80, 0x00, 0x41, + 0x30, 0x20, 0x00, 0x36, 0x02, 0x84, 0xc3, 0x84, 0x80, 0x00, 0x41, 0x08, + 0x41, 0x84, 0xc3, 0x84, 0x80, 0x00, 0x36, 0x02, 0x84, 0xc3, 0x84, 0x80, + 0x00, 0x41, 0x04, 0x41, 0x84, 0xc3, 0x84, 0x80, 0x00, 0x36, 0x02, 0x84, + 0xc3, 0x84, 0x80, 0x00, 0x41, 0x0c, 0x41, 0x00, 0x28, 0x02, 0x80, 0xc3, + 0x84, 0x80, 0x00, 0x36, 0x02, 0x84, 0xc3, 0x84, 0x80, 0x00, 0x41, 0x00, + 0x20, 0x01, 0x41, 0x80, 0x80, 0x80, 0x04, 0x20, 0x01, 0x41, 0x80, 0x80, + 0x80, 0x04, 0x49, 0x1b, 0x36, 0x02, 0xe8, 0xc2, 0x84, 0x80, 0x00, 0x0b, + 0x02, 0x00, 0x0b, 0x0e, 0x00, 0x10, 0x92, 0x80, 0x80, 0x80, 0x00, 0x10, + 0x92, 0x80, 0x80, 0x80, 0x00, 0x0b, 0xcf, 0x01, 0x01, 0x03, 0x7f, 0x20, + 0x00, 0x21, 0x01, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x71, + 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x0d, 0x00, + 0x20, 0x00, 0x20, 0x00, 0x6b, 0x0f, 0x0b, 0x20, 0x00, 0x41, 0x01, 0x6a, + 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, + 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x01, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, + 0x01, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, + 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, + 0x41, 0x04, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x0d, 0x01, 0x0b, 0x20, + 0x01, 0x41, 0x7c, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x7b, 0x6a, 0x21, + 0x01, 0x03, 0x40, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x41, 0x80, + 0x82, 0x84, 0x08, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x22, 0x02, 0x28, 0x02, + 0x00, 0x22, 0x03, 0x6b, 0x20, 0x03, 0x72, 0x41, 0x80, 0x81, 0x82, 0x84, + 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x46, 0x0d, 0x00, 0x0b, + 0x03, 0x40, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x2d, + 0x00, 0x00, 0x21, 0x03, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x21, 0x02, 0x20, + 0x03, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x01, 0x20, 0x00, 0x6b, 0x0b, 0x3e, + 0x00, 0x02, 0x40, 0x20, 0x00, 0x41, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, + 0x20, 0x00, 0x41, 0x08, 0x76, 0x2d, 0x00, 0x80, 0x80, 0x84, 0x80, 0x00, + 0x41, 0x05, 0x74, 0x20, 0x00, 0x41, 0x03, 0x76, 0x41, 0x1f, 0x71, 0x72, + 0x2d, 0x00, 0x80, 0x80, 0x84, 0x80, 0x00, 0x20, 0x00, 0x41, 0x07, 0x71, + 0x76, 0x41, 0x01, 0x71, 0x0f, 0x0b, 0x20, 0x00, 0x41, 0xfe, 0xff, 0x0b, + 0x49, 0x0b, 0x49, 0x01, 0x03, 0x7f, 0x41, 0x00, 0x21, 0x03, 0x02, 0x40, + 0x20, 0x02, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x03, 0x40, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x22, 0x04, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x05, 0x47, + 0x0d, 0x01, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x00, 0x41, + 0x01, 0x6a, 0x21, 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, + 0x00, 0x0c, 0x02, 0x0b, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x6b, 0x21, 0x03, + 0x0b, 0x20, 0x03, 0x0b, 0xf6, 0x02, 0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, + 0x00, 0x47, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x00, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, + 0x00, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, + 0x01, 0x71, 0x47, 0x0d, 0x00, 0x20, 0x00, 0x21, 0x04, 0x20, 0x02, 0x21, + 0x05, 0x0c, 0x03, 0x0b, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x05, 0x41, + 0x00, 0x47, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x04, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, + 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, + 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, + 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, + 0x01, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, + 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, 0x02, 0x41, 0x7d, + 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x20, 0x00, 0x41, 0x03, + 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, + 0x0d, 0x01, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, + 0x71, 0x46, 0x0d, 0x02, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, + 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x0c, + 0x01, 0x0b, 0x20, 0x02, 0x21, 0x05, 0x20, 0x00, 0x21, 0x04, 0x0b, 0x20, + 0x03, 0x45, 0x0d, 0x01, 0x02, 0x40, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, + 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x00, 0x20, 0x05, 0x41, 0x04, + 0x49, 0x0d, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x41, 0x81, 0x82, + 0x84, 0x08, 0x6c, 0x21, 0x00, 0x03, 0x40, 0x41, 0x80, 0x82, 0x84, 0x08, + 0x20, 0x04, 0x28, 0x02, 0x00, 0x20, 0x00, 0x73, 0x22, 0x02, 0x6b, 0x20, + 0x02, 0x72, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, + 0x82, 0x84, 0x78, 0x47, 0x0d, 0x02, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, + 0x04, 0x20, 0x05, 0x41, 0x7c, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x4b, 0x0d, + 0x00, 0x0b, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x01, 0x41, + 0xff, 0x01, 0x71, 0x21, 0x02, 0x03, 0x40, 0x02, 0x40, 0x20, 0x04, 0x2d, + 0x00, 0x00, 0x20, 0x02, 0x47, 0x0d, 0x00, 0x20, 0x04, 0x0f, 0x0b, 0x20, + 0x04, 0x41, 0x01, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x7f, 0x6a, 0x22, + 0x05, 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, 0x0b, 0x67, 0x01, 0x02, 0x7f, + 0x20, 0x01, 0x2d, 0x00, 0x00, 0x21, 0x02, 0x02, 0x40, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x22, 0x03, 0x45, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x02, 0x41, + 0xff, 0x01, 0x71, 0x47, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, + 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, + 0x2d, 0x00, 0x00, 0x21, 0x02, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x03, + 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x01, + 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x03, 0x20, 0x02, 0x41, 0xff, 0x01, + 0x71, 0x46, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x03, 0x20, 0x02, 0x41, 0xff, + 0x01, 0x71, 0x6b, 0x0b, 0x0c, 0x00, 0x20, 0x00, 0x41, 0x00, 0x10, 0x9a, + 0x80, 0x80, 0x80, 0x00, 0x0b, 0xa6, 0x02, 0x01, 0x07, 0x7f, 0x02, 0x40, + 0x20, 0x00, 0x41, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, + 0x00, 0x41, 0xff, 0x01, 0x71, 0x22, 0x02, 0x41, 0x03, 0x6e, 0x22, 0x03, + 0x41, 0x03, 0x6c, 0x6b, 0x41, 0xff, 0x01, 0x71, 0x41, 0x02, 0x74, 0x28, + 0x02, 0xc0, 0x9e, 0x84, 0x80, 0x00, 0x20, 0x00, 0x41, 0x08, 0x76, 0x22, + 0x04, 0x2d, 0x00, 0xa0, 0xa9, 0x84, 0x80, 0x00, 0x41, 0xd6, 0x00, 0x6c, + 0x20, 0x03, 0x6a, 0x2d, 0x00, 0xa0, 0xa9, 0x84, 0x80, 0x00, 0x6c, 0x41, + 0x0b, 0x76, 0x41, 0x06, 0x70, 0x20, 0x04, 0x2d, 0x00, 0x90, 0xbe, 0x84, + 0x80, 0x00, 0x6a, 0x41, 0x02, 0x74, 0x28, 0x02, 0xd0, 0x9e, 0x84, 0x80, + 0x00, 0x22, 0x03, 0x41, 0x08, 0x75, 0x21, 0x04, 0x02, 0x40, 0x20, 0x03, + 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, 0x41, 0x01, 0x4b, 0x0d, 0x00, 0x20, + 0x04, 0x41, 0x00, 0x20, 0x03, 0x20, 0x01, 0x73, 0x6b, 0x71, 0x20, 0x00, + 0x6a, 0x0f, 0x0b, 0x20, 0x04, 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, 0x45, + 0x0d, 0x00, 0x20, 0x04, 0x41, 0x08, 0x76, 0x21, 0x04, 0x03, 0x40, 0x02, + 0x40, 0x20, 0x02, 0x20, 0x03, 0x41, 0x01, 0x76, 0x22, 0x05, 0x20, 0x04, + 0x6a, 0x22, 0x06, 0x41, 0x01, 0x74, 0x22, 0x07, 0x2d, 0x00, 0x90, 0xa6, + 0x84, 0x80, 0x00, 0x22, 0x08, 0x47, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x07, + 0x41, 0x90, 0xa6, 0x84, 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x01, 0x41, 0x02, + 0x74, 0x28, 0x02, 0xd0, 0x9e, 0x84, 0x80, 0x00, 0x22, 0x03, 0x41, 0xff, + 0x01, 0x71, 0x22, 0x04, 0x41, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x03, 0x41, + 0x08, 0x75, 0x41, 0x00, 0x20, 0x04, 0x20, 0x01, 0x73, 0x6b, 0x71, 0x20, + 0x00, 0x6a, 0x0f, 0x0b, 0x41, 0x7f, 0x41, 0x01, 0x20, 0x01, 0x1b, 0x20, + 0x00, 0x6a, 0x0f, 0x0b, 0x20, 0x04, 0x20, 0x06, 0x20, 0x02, 0x20, 0x08, + 0x49, 0x22, 0x08, 0x1b, 0x21, 0x04, 0x20, 0x05, 0x20, 0x03, 0x20, 0x05, + 0x6b, 0x20, 0x08, 0x1b, 0x22, 0x03, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, + 0x0b, 0x0c, 0x00, 0x20, 0x00, 0x41, 0x01, 0x10, 0x9a, 0x80, 0x80, 0x80, + 0x00, 0x0b, 0x87, 0x01, 0x01, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x02, 0x0d, + 0x00, 0x41, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x22, 0x03, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x03, 0x0c, 0x01, + 0x0b, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x02, 0x41, 0x7f, + 0x6a, 0x21, 0x02, 0x02, 0x40, 0x03, 0x40, 0x20, 0x03, 0x41, 0xff, 0x01, + 0x71, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x47, 0x0d, 0x01, 0x20, + 0x04, 0x45, 0x0d, 0x01, 0x20, 0x02, 0x41, 0x00, 0x46, 0x0d, 0x01, 0x20, + 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, + 0x01, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, + 0x6a, 0x21, 0x00, 0x20, 0x03, 0x0d, 0x00, 0x0b, 0x41, 0x00, 0x21, 0x03, + 0x0b, 0x20, 0x03, 0x41, 0xff, 0x01, 0x71, 0x21, 0x03, 0x0b, 0x20, 0x03, + 0x20, 0x01, 0x2d, 0x00, 0x00, 0x6b, 0x0b, 0x0d, 0x00, 0x20, 0x00, 0x10, + 0x99, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x47, 0x0b, 0xb7, 0x0a, 0x01, + 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x21, 0x49, 0x0d, + 0x00, 0x20, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, + 0xfc, 0x0a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x20, 0x00, 0x20, 0x01, + 0x46, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x01, 0x20, 0x02, 0x20, 0x00, 0x6a, + 0x22, 0x03, 0x6b, 0x41, 0x00, 0x20, 0x02, 0x41, 0x01, 0x74, 0x6b, 0x4b, + 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x01, 0x20, + 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x20, 0x01, 0x20, + 0x00, 0x73, 0x41, 0x03, 0x71, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x00, 0x20, 0x01, 0x4f, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x04, + 0x45, 0x0d, 0x00, 0x20, 0x02, 0x21, 0x05, 0x20, 0x00, 0x21, 0x03, 0x0c, + 0x03, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, + 0x02, 0x21, 0x05, 0x20, 0x00, 0x21, 0x03, 0x0c, 0x02, 0x0b, 0x20, 0x02, + 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, + 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x05, 0x02, 0x40, 0x20, 0x00, + 0x41, 0x01, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x01, + 0x41, 0x01, 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x45, 0x0d, + 0x03, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, + 0x02, 0x41, 0x7e, 0x6a, 0x21, 0x05, 0x02, 0x40, 0x20, 0x00, 0x41, 0x02, + 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x01, 0x41, 0x02, + 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x03, 0x20, + 0x00, 0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x02, 0x41, + 0x7d, 0x6a, 0x21, 0x05, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, + 0x03, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x21, + 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, + 0x01, 0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x00, 0x41, 0x04, 0x6a, + 0x21, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, + 0x7c, 0x6a, 0x21, 0x05, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x04, 0x0d, + 0x00, 0x02, 0x40, 0x20, 0x03, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, + 0x02, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, + 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, 0x03, 0x6a, 0x2d, 0x00, 0x00, + 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x0d, 0x00, + 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x45, 0x0d, 0x04, + 0x20, 0x00, 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x22, 0x03, 0x6a, 0x22, 0x04, + 0x20, 0x01, 0x20, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x02, + 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, + 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, + 0x41, 0x7d, 0x6a, 0x22, 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, 0x03, + 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x04, 0x41, + 0x03, 0x71, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, + 0x03, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x22, + 0x02, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, + 0x00, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x02, 0x40, 0x20, + 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x06, 0x41, 0x0c, 0x71, 0x41, 0x0c, 0x46, + 0x0d, 0x00, 0x20, 0x06, 0x41, 0x02, 0x76, 0x41, 0x01, 0x6a, 0x41, 0x03, + 0x71, 0x21, 0x03, 0x20, 0x01, 0x41, 0x7c, 0x6a, 0x21, 0x04, 0x20, 0x00, + 0x41, 0x7c, 0x6a, 0x21, 0x05, 0x03, 0x40, 0x20, 0x05, 0x20, 0x02, 0x6a, + 0x20, 0x04, 0x20, 0x02, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, + 0x02, 0x41, 0x7c, 0x6a, 0x21, 0x02, 0x20, 0x03, 0x41, 0x7f, 0x6a, 0x22, + 0x03, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x06, 0x41, 0x0c, 0x49, 0x0d, 0x00, + 0x20, 0x01, 0x41, 0x70, 0x6a, 0x21, 0x05, 0x20, 0x00, 0x41, 0x70, 0x6a, + 0x21, 0x06, 0x03, 0x40, 0x20, 0x06, 0x20, 0x02, 0x6a, 0x22, 0x03, 0x41, + 0x0c, 0x6a, 0x20, 0x05, 0x20, 0x02, 0x6a, 0x22, 0x04, 0x41, 0x0c, 0x6a, + 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x20, + 0x04, 0x41, 0x08, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, + 0x41, 0x04, 0x6a, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x28, 0x02, 0x00, 0x36, + 0x02, 0x00, 0x20, 0x03, 0x20, 0x04, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, + 0x20, 0x02, 0x41, 0x70, 0x6a, 0x22, 0x02, 0x41, 0x03, 0x4b, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x02, 0x21, 0x03, 0x02, + 0x40, 0x20, 0x02, 0x41, 0x03, 0x71, 0x22, 0x04, 0x45, 0x0d, 0x00, 0x20, + 0x01, 0x41, 0x7f, 0x6a, 0x21, 0x05, 0x20, 0x00, 0x41, 0x7f, 0x6a, 0x21, + 0x06, 0x20, 0x02, 0x21, 0x03, 0x03, 0x40, 0x20, 0x06, 0x20, 0x03, 0x6a, + 0x20, 0x05, 0x20, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, + 0x03, 0x41, 0x7f, 0x6a, 0x21, 0x03, 0x20, 0x04, 0x41, 0x7f, 0x6a, 0x22, + 0x04, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, 0x0d, 0x02, + 0x20, 0x01, 0x41, 0x7c, 0x6a, 0x21, 0x04, 0x20, 0x00, 0x41, 0x7c, 0x6a, + 0x21, 0x05, 0x03, 0x40, 0x20, 0x05, 0x20, 0x03, 0x6a, 0x22, 0x01, 0x41, + 0x03, 0x6a, 0x20, 0x04, 0x20, 0x03, 0x6a, 0x22, 0x02, 0x41, 0x03, 0x6a, + 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x20, + 0x02, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, + 0x41, 0x01, 0x6a, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x2d, 0x00, 0x00, 0x3a, + 0x00, 0x00, 0x20, 0x01, 0x20, 0x02, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, + 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x22, 0x03, 0x0d, 0x00, 0x0c, 0x03, 0x0b, + 0x0b, 0x20, 0x05, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x05, + 0x41, 0x7c, 0x6a, 0x22, 0x04, 0x41, 0x1c, 0x71, 0x41, 0x1c, 0x46, 0x0d, + 0x00, 0x20, 0x05, 0x20, 0x04, 0x41, 0x02, 0x76, 0x41, 0x01, 0x6a, 0x41, + 0x07, 0x71, 0x22, 0x02, 0x41, 0x02, 0x74, 0x6b, 0x21, 0x05, 0x03, 0x40, + 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, + 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, + 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x04, 0x41, 0x1c, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, + 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x20, + 0x01, 0x41, 0x04, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, + 0x41, 0x08, 0x6a, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x28, 0x02, 0x00, 0x36, + 0x02, 0x00, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x20, 0x01, 0x41, 0x0c, 0x6a, + 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x20, + 0x01, 0x41, 0x10, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, + 0x41, 0x14, 0x6a, 0x20, 0x01, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x36, + 0x02, 0x00, 0x20, 0x03, 0x41, 0x18, 0x6a, 0x20, 0x01, 0x41, 0x18, 0x6a, + 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x1c, 0x6a, 0x20, + 0x01, 0x41, 0x1c, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, + 0x41, 0x20, 0x6a, 0x21, 0x01, 0x20, 0x03, 0x41, 0x20, 0x6a, 0x21, 0x03, + 0x20, 0x05, 0x41, 0x60, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x4b, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x05, 0x41, 0x07, 0x71, 0x22, 0x02, 0x0d, 0x00, 0x20, 0x05, 0x21, 0x04, + 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x78, 0x71, 0x21, 0x04, 0x03, 0x40, + 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, + 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, + 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x05, 0x41, 0x08, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, + 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x20, + 0x01, 0x41, 0x01, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, + 0x41, 0x02, 0x6a, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, + 0x00, 0x00, 0x20, 0x03, 0x41, 0x03, 0x6a, 0x20, 0x01, 0x41, 0x03, 0x6a, + 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x20, + 0x01, 0x41, 0x04, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, + 0x41, 0x05, 0x6a, 0x20, 0x01, 0x41, 0x05, 0x6a, 0x2d, 0x00, 0x00, 0x3a, + 0x00, 0x00, 0x20, 0x03, 0x41, 0x06, 0x6a, 0x20, 0x01, 0x41, 0x06, 0x6a, + 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x07, 0x6a, 0x20, + 0x01, 0x41, 0x07, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, + 0x41, 0x08, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, + 0x20, 0x04, 0x41, 0x78, 0x6a, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x00, 0x0b, 0x96, 0x03, 0x02, 0x03, 0x7f, 0x01, 0x7e, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x02, 0x41, 0x21, 0x49, 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, + 0x01, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0b, 0x00, 0x20, 0x00, + 0x0f, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, + 0x00, 0x00, 0x20, 0x00, 0x20, 0x02, 0x6a, 0x22, 0x03, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x03, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x02, 0x20, 0x00, 0x20, 0x01, 0x3a, - 0x00, 0x01, 0x20, 0x03, 0x41, 0x03, 0x6b, 0x20, 0x01, 0x3a, 0x00, 0x00, - 0x20, 0x03, 0x41, 0x02, 0x6b, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, + 0x00, 0x01, 0x20, 0x03, 0x41, 0x7d, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, + 0x20, 0x03, 0x41, 0x7e, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x07, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x03, - 0x20, 0x03, 0x41, 0x04, 0x6b, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, + 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x20, 0x00, 0x6b, - 0x41, 0x03, 0x71, 0x22, 0x05, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x41, 0xff, + 0x41, 0x03, 0x71, 0x22, 0x04, 0x6a, 0x22, 0x05, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x41, 0x81, 0x82, 0x84, 0x08, 0x6c, 0x22, 0x03, 0x36, 0x02, - 0x00, 0x20, 0x04, 0x20, 0x02, 0x20, 0x05, 0x6b, 0x41, 0x3c, 0x71, 0x22, - 0x02, 0x6a, 0x22, 0x01, 0x41, 0x04, 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, - 0x20, 0x02, 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x03, 0x36, - 0x02, 0x08, 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, 0x04, 0x20, 0x01, 0x41, - 0x08, 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x0c, 0x6b, - 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x19, 0x49, 0x0d, 0x00, - 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, 0x18, 0x20, 0x04, 0x20, 0x03, 0x36, - 0x02, 0x14, 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, 0x10, 0x20, 0x04, 0x20, - 0x03, 0x36, 0x02, 0x0c, 0x20, 0x01, 0x41, 0x10, 0x6b, 0x20, 0x03, 0x36, - 0x02, 0x00, 0x20, 0x01, 0x41, 0x14, 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, - 0x20, 0x01, 0x41, 0x18, 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, - 0x41, 0x1c, 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x20, 0x04, + 0x00, 0x20, 0x05, 0x20, 0x02, 0x20, 0x04, 0x6b, 0x41, 0x3c, 0x71, 0x22, + 0x01, 0x6a, 0x22, 0x02, 0x41, 0x7c, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, + 0x20, 0x01, 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x03, 0x36, + 0x02, 0x08, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x04, 0x20, 0x02, 0x41, + 0x78, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x74, 0x6a, + 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x19, 0x49, 0x0d, 0x00, + 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x18, 0x20, 0x05, 0x20, 0x03, 0x36, + 0x02, 0x14, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x10, 0x20, 0x05, 0x20, + 0x03, 0x36, 0x02, 0x0c, 0x20, 0x02, 0x41, 0x70, 0x6a, 0x20, 0x03, 0x36, + 0x02, 0x00, 0x20, 0x02, 0x41, 0x6c, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, + 0x20, 0x02, 0x41, 0x68, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, + 0x41, 0x64, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x05, 0x41, 0x04, 0x71, 0x41, 0x18, 0x72, 0x22, 0x02, 0x6b, 0x22, 0x01, 0x41, 0x20, 0x49, 0x0d, 0x00, 0x20, 0x03, 0xad, 0x42, 0x81, 0x80, 0x80, 0x80, - 0x10, 0x7e, 0x21, 0x06, 0x20, 0x02, 0x20, 0x04, 0x6a, 0x21, 0x02, 0x03, - 0x40, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, 0x18, 0x20, 0x02, 0x20, 0x06, - 0x37, 0x03, 0x10, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, 0x08, 0x20, 0x02, - 0x20, 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x20, 0x6a, 0x21, 0x02, - 0x20, 0x01, 0x41, 0x20, 0x6b, 0x22, 0x01, 0x41, 0x1f, 0x4b, 0x0d, 0x00, - 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0xc5, 0x01, 0x01, 0x03, 0x7f, 0x02, 0x40, - 0x02, 0x40, 0x20, 0x00, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, - 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x04, 0x40, 0x41, 0x00, 0x0f, 0x0b, - 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, - 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, - 0x02, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, - 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, - 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, - 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x22, 0x01, 0x41, 0x03, - 0x71, 0x0d, 0x01, 0x0b, 0x20, 0x01, 0x41, 0x04, 0x6b, 0x21, 0x02, 0x20, - 0x01, 0x41, 0x05, 0x6b, 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, 0x41, 0x04, - 0x6a, 0x21, 0x01, 0x41, 0x80, 0x82, 0x84, 0x08, 0x20, 0x02, 0x41, 0x04, - 0x6a, 0x22, 0x02, 0x28, 0x02, 0x00, 0x22, 0x03, 0x6b, 0x20, 0x03, 0x72, - 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, - 0x78, 0x46, 0x0d, 0x00, 0x0b, 0x03, 0x40, 0x20, 0x01, 0x41, 0x01, 0x6a, - 0x21, 0x01, 0x20, 0x02, 0x2d, 0x00, 0x00, 0x20, 0x02, 0x41, 0x01, 0x6a, - 0x21, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x01, 0x20, 0x00, 0x6b, 0x0b, - 0x3e, 0x00, 0x20, 0x00, 0x41, 0xff, 0xff, 0x07, 0x4d, 0x04, 0x40, 0x20, - 0x00, 0x41, 0x03, 0x76, 0x41, 0x1f, 0x71, 0x20, 0x00, 0x41, 0x08, 0x76, - 0x41, 0x80, 0x80, 0x04, 0x6a, 0x2d, 0x00, 0x00, 0x41, 0x05, 0x74, 0x72, - 0x41, 0x80, 0x80, 0x04, 0x6a, 0x2d, 0x00, 0x00, 0x20, 0x00, 0x41, 0x07, - 0x71, 0x76, 0x41, 0x01, 0x71, 0x0f, 0x0b, 0x20, 0x00, 0x41, 0xfe, 0xff, - 0x0b, 0x49, 0x0b, 0x43, 0x01, 0x03, 0x7f, 0x02, 0x40, 0x20, 0x02, 0x45, - 0x0d, 0x00, 0x03, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x20, - 0x01, 0x2d, 0x00, 0x00, 0x22, 0x05, 0x46, 0x04, 0x40, 0x20, 0x01, 0x41, - 0x01, 0x6a, 0x21, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, - 0x02, 0x41, 0x01, 0x6b, 0x22, 0x02, 0x0d, 0x01, 0x0c, 0x02, 0x0b, 0x0b, - 0x20, 0x04, 0x20, 0x05, 0x6b, 0x21, 0x03, 0x0b, 0x20, 0x03, 0x0b, 0xe9, - 0x02, 0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, 0x00, 0x47, 0x21, 0x05, 0x02, - 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x71, 0x45, 0x20, - 0x02, 0x45, 0x72, 0x45, 0x04, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x20, - 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x04, 0x40, 0x20, 0x00, 0x21, 0x03, - 0x20, 0x02, 0x21, 0x04, 0x0c, 0x03, 0x0b, 0x20, 0x02, 0x41, 0x01, 0x6b, - 0x22, 0x04, 0x41, 0x00, 0x47, 0x21, 0x05, 0x20, 0x00, 0x41, 0x01, 0x6a, - 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x04, 0x45, 0x72, 0x0d, 0x01, - 0x20, 0x03, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, - 0x0d, 0x02, 0x20, 0x02, 0x41, 0x02, 0x6b, 0x22, 0x04, 0x41, 0x00, 0x47, - 0x21, 0x05, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, - 0x45, 0x20, 0x04, 0x45, 0x72, 0x0d, 0x01, 0x20, 0x03, 0x2d, 0x00, 0x00, - 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, 0x02, 0x41, - 0x03, 0x6b, 0x22, 0x04, 0x41, 0x00, 0x47, 0x21, 0x05, 0x20, 0x00, 0x41, - 0x03, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x04, 0x45, 0x72, - 0x0d, 0x01, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, - 0x71, 0x46, 0x0d, 0x02, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, - 0x02, 0x41, 0x04, 0x6b, 0x22, 0x04, 0x41, 0x00, 0x47, 0x21, 0x05, 0x0c, - 0x01, 0x0b, 0x20, 0x02, 0x21, 0x04, 0x20, 0x00, 0x21, 0x03, 0x0b, 0x20, - 0x05, 0x45, 0x0d, 0x01, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x22, 0x00, - 0x20, 0x03, 0x2d, 0x00, 0x00, 0x46, 0x20, 0x04, 0x41, 0x04, 0x49, 0x72, - 0x45, 0x04, 0x40, 0x20, 0x00, 0x41, 0x81, 0x82, 0x84, 0x08, 0x6c, 0x21, - 0x00, 0x03, 0x40, 0x41, 0x80, 0x82, 0x84, 0x08, 0x20, 0x03, 0x28, 0x02, - 0x00, 0x20, 0x00, 0x73, 0x22, 0x02, 0x6b, 0x20, 0x02, 0x72, 0x41, 0x80, - 0x81, 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x47, - 0x0d, 0x02, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x04, 0x41, - 0x04, 0x6b, 0x22, 0x04, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, - 0x04, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x21, - 0x00, 0x03, 0x40, 0x20, 0x00, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x46, 0x04, - 0x40, 0x20, 0x03, 0x0f, 0x0b, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x21, 0x03, - 0x20, 0x04, 0x41, 0x01, 0x6b, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x0b, 0x41, - 0x00, 0x0b, 0x58, 0x01, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, - 0x00, 0x22, 0x02, 0x45, 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, - 0x03, 0x47, 0x72, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, - 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, 0x2d, - 0x00, 0x00, 0x21, 0x03, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x02, 0x45, - 0x0d, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x01, 0x41, - 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x20, 0x03, 0x46, 0x0d, 0x00, 0x0b, - 0x0b, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x0b, 0x08, 0x00, 0x20, 0x00, 0x41, - 0x00, 0x10, 0x14, 0x0b, 0xa0, 0x02, 0x01, 0x07, 0x7f, 0x02, 0x40, 0x20, - 0x00, 0x41, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x00, - 0x41, 0xff, 0x01, 0x71, 0x22, 0x05, 0x41, 0x03, 0x6e, 0x22, 0x02, 0x41, - 0x03, 0x6c, 0x6b, 0x41, 0xff, 0x01, 0x71, 0x41, 0x02, 0x74, 0x41, 0xc0, - 0x9e, 0x04, 0x6a, 0x28, 0x02, 0x00, 0x20, 0x02, 0x20, 0x00, 0x41, 0x08, - 0x76, 0x22, 0x02, 0x41, 0xa0, 0xa9, 0x04, 0x6a, 0x2d, 0x00, 0x00, 0x41, - 0xd6, 0x00, 0x6c, 0x6a, 0x41, 0xa0, 0xa9, 0x04, 0x6a, 0x2d, 0x00, 0x00, - 0x6c, 0x41, 0x0b, 0x76, 0x41, 0x06, 0x70, 0x20, 0x02, 0x41, 0x90, 0xbe, - 0x04, 0x6a, 0x2d, 0x00, 0x00, 0x6a, 0x41, 0x02, 0x74, 0x41, 0xd0, 0x9e, - 0x04, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x03, 0x41, 0x08, 0x75, 0x21, 0x02, - 0x20, 0x03, 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, 0x41, 0x01, 0x4d, 0x04, - 0x40, 0x20, 0x02, 0x41, 0x00, 0x20, 0x01, 0x20, 0x03, 0x73, 0x6b, 0x71, - 0x20, 0x00, 0x6a, 0x0f, 0x0b, 0x20, 0x02, 0x41, 0xff, 0x01, 0x71, 0x22, - 0x03, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x41, 0x08, 0x76, 0x21, 0x02, 0x03, - 0x40, 0x20, 0x03, 0x41, 0x01, 0x76, 0x22, 0x06, 0x20, 0x02, 0x6a, 0x22, - 0x04, 0x41, 0x01, 0x74, 0x41, 0x90, 0xa6, 0x04, 0x6a, 0x22, 0x07, 0x2d, - 0x00, 0x00, 0x22, 0x08, 0x20, 0x05, 0x46, 0x04, 0x40, 0x20, 0x07, 0x2d, - 0x00, 0x01, 0x41, 0x02, 0x74, 0x41, 0xd0, 0x9e, 0x04, 0x6a, 0x28, 0x02, - 0x00, 0x22, 0x02, 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, 0x41, 0x01, 0x4d, - 0x04, 0x40, 0x41, 0x00, 0x20, 0x01, 0x20, 0x03, 0x73, 0x6b, 0x20, 0x02, - 0x41, 0x08, 0x75, 0x71, 0x20, 0x00, 0x6a, 0x0f, 0x0b, 0x41, 0x7f, 0x41, - 0x01, 0x20, 0x01, 0x1b, 0x20, 0x00, 0x6a, 0x0f, 0x0b, 0x20, 0x02, 0x20, - 0x04, 0x20, 0x05, 0x20, 0x08, 0x49, 0x22, 0x04, 0x1b, 0x21, 0x02, 0x20, - 0x06, 0x20, 0x03, 0x20, 0x06, 0x6b, 0x20, 0x04, 0x1b, 0x22, 0x03, 0x0d, - 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0x08, 0x00, 0x20, 0x00, 0x41, 0x01, - 0x10, 0x14, 0x0b, 0x75, 0x01, 0x02, 0x7f, 0x20, 0x02, 0x45, 0x04, 0x40, - 0x41, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, - 0x03, 0x45, 0x04, 0x40, 0x41, 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, - 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x21, - 0x02, 0x02, 0x40, 0x03, 0x40, 0x20, 0x02, 0x45, 0x20, 0x03, 0x20, 0x01, - 0x2d, 0x00, 0x00, 0x22, 0x04, 0x47, 0x20, 0x04, 0x45, 0x72, 0x72, 0x0d, - 0x01, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x21, 0x02, 0x20, 0x01, 0x41, 0x01, - 0x6a, 0x21, 0x01, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x21, 0x03, 0x20, 0x00, - 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x03, 0x0d, 0x00, 0x0b, 0x41, 0x00, - 0x21, 0x03, 0x0b, 0x0b, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x6b, - 0x0b, 0x09, 0x00, 0x20, 0x00, 0x10, 0x13, 0x20, 0x00, 0x47, 0x0b, 0xa1, - 0x09, 0x01, 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x21, - 0x49, 0x04, 0x40, 0x20, 0x00, 0x20, 0x01, 0x46, 0x0d, 0x02, 0x20, 0x01, - 0x20, 0x00, 0x20, 0x02, 0x6a, 0x22, 0x04, 0x6b, 0x41, 0x00, 0x20, 0x02, - 0x41, 0x01, 0x74, 0x6b, 0x4b, 0x0d, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, - 0x20, 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, - 0x01, 0x73, 0x41, 0x03, 0x71, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x20, - 0x00, 0x20, 0x01, 0x49, 0x04, 0x40, 0x20, 0x03, 0x04, 0x40, 0x20, 0x02, - 0x21, 0x04, 0x20, 0x00, 0x21, 0x03, 0x0c, 0x03, 0x0b, 0x20, 0x00, 0x41, - 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x02, 0x21, 0x04, 0x20, 0x00, 0x21, - 0x03, 0x0c, 0x02, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, - 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x01, 0x6b, - 0x21, 0x04, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, - 0x45, 0x04, 0x40, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x0c, 0x02, - 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, - 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02, 0x41, 0x02, 0x6b, 0x21, 0x04, 0x20, - 0x00, 0x41, 0x02, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, - 0x20, 0x01, 0x41, 0x02, 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x04, - 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, - 0x02, 0x20, 0x02, 0x41, 0x03, 0x6b, 0x21, 0x04, 0x20, 0x00, 0x41, 0x03, - 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x01, 0x41, - 0x03, 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x03, - 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x00, + 0x10, 0x7e, 0x21, 0x06, 0x20, 0x05, 0x20, 0x02, 0x6a, 0x21, 0x02, 0x03, + 0x40, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x18, + 0x6a, 0x20, 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x10, 0x6a, 0x20, + 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x08, 0x6a, 0x20, 0x06, 0x37, + 0x03, 0x00, 0x20, 0x02, 0x41, 0x20, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, + 0x60, 0x6a, 0x22, 0x01, 0x41, 0x1f, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x00, 0x0b, 0x0d, 0x00, 0x20, 0x00, 0x10, 0x9b, 0x80, 0x80, 0x80, 0x00, + 0x20, 0x00, 0x47, 0x0b, 0x85, 0x08, 0x01, 0x04, 0x7f, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x20, 0x4b, 0x0d, 0x00, + 0x20, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x02, 0x45, 0x0d, + 0x01, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, + 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, + 0x04, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, + 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x20, 0x01, 0x2d, + 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x21, 0x03, + 0x20, 0x00, 0x41, 0x02, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x41, 0x02, 0x6a, + 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, + 0x02, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, + 0x02, 0x41, 0x7d, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x21, + 0x04, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, + 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x20, 0x01, 0x2d, + 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x21, 0x03, + 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x41, 0x04, 0x6a, + 0x21, 0x05, 0x0c, 0x02, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x00, + 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, + 0x20, 0x02, 0x21, 0x03, 0x20, 0x00, 0x21, 0x04, 0x20, 0x01, 0x21, 0x05, + 0x0b, 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x22, 0x02, 0x0d, 0x00, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x10, 0x4f, 0x0d, 0x00, 0x20, + 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x70, + 0x6a, 0x22, 0x02, 0x41, 0x10, 0x71, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, + 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, + 0x08, 0x37, 0x02, 0x08, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, 0x04, 0x20, + 0x05, 0x41, 0x10, 0x6a, 0x21, 0x05, 0x20, 0x02, 0x21, 0x03, 0x0b, 0x20, + 0x02, 0x41, 0x10, 0x49, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x03, 0x40, + 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, + 0x41, 0x08, 0x6a, 0x20, 0x05, 0x41, 0x08, 0x6a, 0x29, 0x02, 0x00, 0x37, + 0x02, 0x00, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x20, 0x05, 0x41, 0x10, 0x6a, + 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, 0x18, 0x6a, 0x20, + 0x05, 0x41, 0x18, 0x6a, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, + 0x41, 0x20, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x20, 0x6a, 0x21, 0x05, + 0x20, 0x02, 0x41, 0x60, 0x6a, 0x22, 0x02, 0x41, 0x0f, 0x4b, 0x0d, 0x00, + 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0x08, 0x49, 0x0d, 0x00, 0x20, + 0x04, 0x20, 0x05, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x05, 0x41, + 0x08, 0x6a, 0x21, 0x05, 0x20, 0x04, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0b, + 0x02, 0x40, 0x20, 0x02, 0x41, 0x04, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x04, + 0x20, 0x05, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x05, 0x41, 0x04, + 0x6a, 0x21, 0x05, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x0b, 0x02, + 0x40, 0x20, 0x02, 0x41, 0x02, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x04, 0x20, + 0x05, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x04, 0x41, 0x02, 0x6a, + 0x21, 0x04, 0x20, 0x05, 0x41, 0x02, 0x6a, 0x21, 0x05, 0x0b, 0x20, 0x02, + 0x41, 0x01, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, + 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x20, 0x49, 0x0d, + 0x00, 0x20, 0x04, 0x20, 0x05, 0x28, 0x02, 0x00, 0x22, 0x03, 0x3a, 0x00, + 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x0e, 0x03, + 0x03, 0x00, 0x01, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x03, 0x41, 0x08, 0x76, + 0x3a, 0x00, 0x01, 0x20, 0x04, 0x20, 0x05, 0x41, 0x06, 0x6a, 0x29, 0x01, + 0x00, 0x37, 0x02, 0x06, 0x20, 0x04, 0x20, 0x05, 0x28, 0x02, 0x04, 0x41, + 0x10, 0x74, 0x20, 0x03, 0x41, 0x10, 0x76, 0x72, 0x36, 0x02, 0x02, 0x20, + 0x04, 0x41, 0x12, 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, 0x12, 0x6a, 0x21, + 0x01, 0x41, 0x0e, 0x21, 0x06, 0x20, 0x05, 0x41, 0x0e, 0x6a, 0x28, 0x01, + 0x00, 0x21, 0x05, 0x41, 0x0e, 0x21, 0x03, 0x0c, 0x03, 0x0b, 0x20, 0x04, + 0x20, 0x05, 0x41, 0x05, 0x6a, 0x29, 0x00, 0x00, 0x37, 0x02, 0x05, 0x20, + 0x04, 0x20, 0x05, 0x28, 0x02, 0x04, 0x41, 0x18, 0x74, 0x20, 0x03, 0x41, + 0x08, 0x76, 0x72, 0x36, 0x02, 0x01, 0x20, 0x04, 0x41, 0x11, 0x6a, 0x21, + 0x02, 0x20, 0x05, 0x41, 0x11, 0x6a, 0x21, 0x01, 0x41, 0x0d, 0x21, 0x06, + 0x20, 0x05, 0x41, 0x0d, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x05, 0x41, 0x0f, + 0x21, 0x03, 0x0c, 0x02, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, + 0x10, 0x4f, 0x0d, 0x00, 0x20, 0x04, 0x21, 0x02, 0x20, 0x05, 0x21, 0x01, + 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x00, 0x3a, 0x00, + 0x00, 0x20, 0x04, 0x20, 0x05, 0x28, 0x00, 0x01, 0x36, 0x00, 0x01, 0x20, + 0x04, 0x20, 0x05, 0x29, 0x00, 0x05, 0x37, 0x00, 0x05, 0x20, 0x04, 0x20, + 0x05, 0x2f, 0x00, 0x0d, 0x3b, 0x00, 0x0d, 0x20, 0x04, 0x20, 0x05, 0x2d, + 0x00, 0x0f, 0x3a, 0x00, 0x0f, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, 0x02, + 0x20, 0x05, 0x41, 0x10, 0x6a, 0x21, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x08, + 0x71, 0x0d, 0x02, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x03, 0x41, 0x10, + 0x76, 0x3a, 0x00, 0x02, 0x20, 0x04, 0x20, 0x03, 0x41, 0x08, 0x76, 0x3a, + 0x00, 0x01, 0x20, 0x04, 0x20, 0x05, 0x41, 0x07, 0x6a, 0x29, 0x00, 0x00, + 0x37, 0x02, 0x07, 0x20, 0x04, 0x20, 0x05, 0x28, 0x02, 0x04, 0x41, 0x08, + 0x74, 0x20, 0x03, 0x41, 0x18, 0x76, 0x72, 0x36, 0x02, 0x03, 0x20, 0x04, + 0x41, 0x13, 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, 0x13, 0x6a, 0x21, 0x01, + 0x41, 0x0f, 0x21, 0x06, 0x20, 0x05, 0x41, 0x0f, 0x6a, 0x28, 0x00, 0x00, + 0x21, 0x05, 0x41, 0x0d, 0x21, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x06, 0x6a, + 0x20, 0x05, 0x36, 0x02, 0x00, 0x0b, 0x20, 0x02, 0x20, 0x01, 0x29, 0x00, + 0x00, 0x37, 0x00, 0x00, 0x20, 0x02, 0x41, 0x08, 0x6a, 0x21, 0x02, 0x20, + 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, + 0x04, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, 0x28, 0x00, 0x00, + 0x36, 0x00, 0x00, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x21, 0x02, 0x20, 0x01, + 0x41, 0x04, 0x6a, 0x21, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x02, + 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, 0x2f, 0x00, 0x00, 0x3b, + 0x00, 0x00, 0x20, 0x02, 0x41, 0x02, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, + 0x02, 0x6a, 0x21, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x01, 0x71, 0x45, 0x0d, + 0x00, 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x0b, + 0x20, 0x00, 0x0b, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x20, 0x46, 0x20, 0x00, + 0x41, 0x09, 0x46, 0x72, 0x0b, 0x0a, 0x00, 0x20, 0x00, 0x10, 0xa2, 0x80, + 0x80, 0x80, 0x00, 0x0b, 0x0a, 0x00, 0x20, 0x00, 0x41, 0x50, 0x6a, 0x41, + 0x0a, 0x49, 0x0b, 0x4d, 0x01, 0x02, 0x7f, 0x20, 0x00, 0x20, 0x00, 0x10, + 0x94, 0x80, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x03, 0x02, 0x40, 0x20, 0x02, + 0x45, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x04, + 0x45, 0x0d, 0x01, 0x20, 0x03, 0x20, 0x04, 0x3a, 0x00, 0x00, 0x20, 0x03, + 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, + 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x03, 0x41, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0b, 0xfa, 0x03, 0x01, + 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x01, 0x20, 0x00, 0x73, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, + 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x41, 0x00, 0x47, 0x21, + 0x04, 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, 0x41, 0x03, 0x71, 0x0d, 0x00, + 0x20, 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x0d, + 0x00, 0x20, 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, + 0x2d, 0x00, 0x00, 0x22, 0x03, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x03, + 0x0d, 0x00, 0x20, 0x00, 0x21, 0x03, 0x20, 0x02, 0x21, 0x05, 0x0c, 0x05, + 0x0b, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x7f, + 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x04, 0x02, 0x40, 0x20, 0x01, + 0x41, 0x01, 0x6a, 0x22, 0x06, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, + 0x05, 0x45, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x06, 0x2d, 0x00, 0x00, 0x22, + 0x04, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x45, 0x0d, 0x05, 0x20, 0x00, 0x41, + 0x02, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x22, 0x05, 0x41, + 0x00, 0x47, 0x21, 0x04, 0x02, 0x40, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x22, + 0x06, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x05, 0x45, 0x0d, 0x00, + 0x20, 0x03, 0x20, 0x06, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x3a, 0x00, 0x00, + 0x20, 0x04, 0x45, 0x0d, 0x06, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x21, 0x03, + 0x20, 0x02, 0x41, 0x7d, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x04, + 0x02, 0x40, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x22, 0x06, 0x41, 0x03, 0x71, + 0x45, 0x0d, 0x00, 0x20, 0x05, 0x45, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x06, + 0x2d, 0x00, 0x00, 0x22, 0x04, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x45, 0x0d, + 0x07, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x04, + 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x02, 0x41, 0x00, + 0x47, 0x21, 0x04, 0x0c, 0x03, 0x0b, 0x20, 0x06, 0x21, 0x01, 0x20, 0x05, + 0x21, 0x02, 0x0c, 0x02, 0x0b, 0x20, 0x06, 0x21, 0x01, 0x20, 0x05, 0x21, + 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x06, 0x21, 0x01, 0x20, 0x05, 0x21, 0x02, + 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x02, 0x02, 0x40, 0x20, 0x01, 0x2d, 0x00, + 0x00, 0x0d, 0x00, 0x20, 0x02, 0x21, 0x05, 0x0c, 0x04, 0x0b, 0x20, 0x02, + 0x41, 0x04, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x41, 0x80, 0x82, 0x84, 0x08, + 0x20, 0x01, 0x28, 0x02, 0x00, 0x22, 0x00, 0x6b, 0x20, 0x00, 0x72, 0x41, + 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, + 0x47, 0x0d, 0x02, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, - 0x20, 0x02, 0x41, 0x04, 0x6b, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x02, 0x40, - 0x20, 0x03, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x45, - 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, - 0x01, 0x6b, 0x22, 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, 0x03, 0x6a, - 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x41, 0x03, 0x71, 0x45, - 0x04, 0x40, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x45, - 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x02, 0x6b, 0x22, 0x03, 0x6a, - 0x22, 0x04, 0x20, 0x01, 0x20, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, - 0x00, 0x20, 0x04, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x03, 0x21, - 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, - 0x02, 0x41, 0x03, 0x6b, 0x22, 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, - 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x41, 0x03, - 0x71, 0x45, 0x04, 0x40, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, - 0x03, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x04, 0x6b, 0x22, - 0x02, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, - 0x00, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x20, 0x02, 0x41, - 0x04, 0x6b, 0x22, 0x04, 0x41, 0x02, 0x76, 0x41, 0x01, 0x6a, 0x41, 0x03, - 0x71, 0x22, 0x03, 0x04, 0x40, 0x20, 0x01, 0x41, 0x04, 0x6b, 0x21, 0x05, - 0x20, 0x00, 0x41, 0x04, 0x6b, 0x21, 0x06, 0x03, 0x40, 0x20, 0x02, 0x20, - 0x06, 0x6a, 0x20, 0x02, 0x20, 0x05, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, - 0x00, 0x20, 0x02, 0x41, 0x04, 0x6b, 0x21, 0x02, 0x20, 0x03, 0x41, 0x01, - 0x6b, 0x22, 0x03, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x04, 0x41, 0x0c, 0x49, - 0x0d, 0x00, 0x20, 0x01, 0x41, 0x10, 0x6b, 0x21, 0x05, 0x20, 0x00, 0x41, - 0x10, 0x6b, 0x21, 0x06, 0x03, 0x40, 0x20, 0x02, 0x20, 0x06, 0x6a, 0x22, - 0x03, 0x41, 0x0c, 0x6a, 0x20, 0x02, 0x20, 0x05, 0x6a, 0x22, 0x04, 0x41, - 0x0c, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x08, - 0x6a, 0x20, 0x04, 0x41, 0x08, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, - 0x20, 0x03, 0x41, 0x04, 0x6a, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x28, 0x02, - 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x04, 0x28, 0x02, 0x00, 0x36, - 0x02, 0x00, 0x20, 0x02, 0x41, 0x10, 0x6b, 0x22, 0x02, 0x41, 0x03, 0x4b, - 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x02, 0x22, - 0x03, 0x41, 0x03, 0x71, 0x22, 0x05, 0x04, 0x40, 0x20, 0x01, 0x41, 0x01, - 0x6b, 0x21, 0x04, 0x20, 0x00, 0x41, 0x01, 0x6b, 0x21, 0x06, 0x03, 0x40, - 0x20, 0x03, 0x20, 0x06, 0x6a, 0x20, 0x03, 0x20, 0x04, 0x6a, 0x2d, 0x00, - 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x01, 0x6b, 0x21, 0x03, 0x20, - 0x05, 0x41, 0x01, 0x6b, 0x22, 0x05, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, - 0x41, 0x04, 0x49, 0x0d, 0x02, 0x20, 0x01, 0x41, 0x04, 0x6b, 0x21, 0x04, - 0x20, 0x00, 0x41, 0x04, 0x6b, 0x21, 0x05, 0x03, 0x40, 0x20, 0x03, 0x20, - 0x05, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x6a, 0x20, 0x03, 0x20, 0x04, 0x6a, - 0x22, 0x02, 0x41, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, - 0x01, 0x41, 0x02, 0x6a, 0x20, 0x02, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, - 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x20, 0x02, 0x41, 0x01, - 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x20, 0x02, 0x2d, - 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x04, 0x6b, 0x22, 0x03, - 0x0d, 0x00, 0x0b, 0x0c, 0x02, 0x0b, 0x20, 0x04, 0x41, 0x04, 0x49, 0x0d, - 0x00, 0x20, 0x04, 0x41, 0x04, 0x6b, 0x22, 0x05, 0x41, 0x02, 0x76, 0x41, - 0x01, 0x6a, 0x41, 0x07, 0x71, 0x22, 0x02, 0x04, 0x40, 0x20, 0x04, 0x20, - 0x02, 0x41, 0x02, 0x74, 0x6b, 0x21, 0x04, 0x03, 0x40, 0x20, 0x03, 0x20, - 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x04, 0x6a, - 0x21, 0x01, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, - 0x01, 0x6b, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x05, 0x41, 0x1c, - 0x49, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x00, - 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x04, 0x36, 0x02, - 0x04, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x08, 0x36, 0x02, 0x08, 0x20, - 0x03, 0x20, 0x01, 0x28, 0x02, 0x0c, 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, - 0x01, 0x28, 0x02, 0x10, 0x36, 0x02, 0x10, 0x20, 0x03, 0x20, 0x01, 0x28, - 0x02, 0x14, 0x36, 0x02, 0x14, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x18, - 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x1c, 0x36, 0x02, - 0x1c, 0x20, 0x01, 0x41, 0x20, 0x6a, 0x21, 0x01, 0x20, 0x03, 0x41, 0x20, - 0x6a, 0x21, 0x03, 0x20, 0x04, 0x41, 0x20, 0x6b, 0x22, 0x04, 0x41, 0x03, - 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x00, 0x02, 0x40, - 0x20, 0x04, 0x41, 0x07, 0x71, 0x22, 0x02, 0x45, 0x04, 0x40, 0x20, 0x04, - 0x21, 0x05, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x41, 0x78, 0x71, 0x21, 0x05, - 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, - 0x20, 0x03, 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, - 0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x22, 0x02, 0x0d, 0x00, 0x0b, - 0x0b, 0x20, 0x04, 0x41, 0x08, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x03, - 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x20, 0x01, - 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, - 0x02, 0x3a, 0x00, 0x02, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x03, 0x3a, - 0x00, 0x03, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x04, 0x3a, 0x00, 0x04, - 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x05, 0x3a, 0x00, 0x05, 0x20, 0x03, - 0x20, 0x01, 0x2d, 0x00, 0x06, 0x3a, 0x00, 0x06, 0x20, 0x03, 0x20, 0x01, - 0x2d, 0x00, 0x07, 0x3a, 0x00, 0x07, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x21, - 0x03, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, 0x20, 0x05, 0x41, 0x08, - 0x6b, 0x22, 0x05, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0x09, 0x00, - 0x20, 0x00, 0x10, 0x15, 0x20, 0x00, 0x47, 0x0b, 0x0d, 0x00, 0x20, 0x00, - 0x41, 0x20, 0x46, 0x20, 0x00, 0x41, 0x09, 0x46, 0x72, 0x0b, 0x0a, 0x00, - 0x20, 0x00, 0x41, 0x30, 0x6b, 0x41, 0x0a, 0x49, 0x0b, 0x49, 0x01, 0x02, - 0x7f, 0x20, 0x00, 0x10, 0x0e, 0x20, 0x00, 0x6a, 0x21, 0x03, 0x02, 0x40, - 0x20, 0x02, 0x45, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x00, - 0x22, 0x04, 0x45, 0x0d, 0x01, 0x20, 0x03, 0x20, 0x04, 0x3a, 0x00, 0x00, - 0x20, 0x03, 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, - 0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x22, 0x02, 0x0d, 0x00, 0x0b, - 0x0b, 0x20, 0x03, 0x41, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0b, 0xe6, - 0x03, 0x01, 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, - 0x20, 0x00, 0x20, 0x01, 0x22, 0x03, 0x73, 0x41, 0x03, 0x71, 0x04, 0x40, - 0x20, 0x00, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x41, 0x00, 0x47, - 0x21, 0x06, 0x02, 0x40, 0x20, 0x03, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, - 0x20, 0x00, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x45, 0x04, 0x40, - 0x20, 0x00, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x03, 0x2d, - 0x00, 0x00, 0x22, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x45, 0x04, 0x40, - 0x20, 0x00, 0x21, 0x04, 0x20, 0x02, 0x21, 0x01, 0x0c, 0x05, 0x0b, 0x20, - 0x00, 0x41, 0x01, 0x6a, 0x21, 0x04, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x22, - 0x01, 0x41, 0x00, 0x47, 0x21, 0x06, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x22, - 0x05, 0x41, 0x03, 0x71, 0x45, 0x20, 0x01, 0x45, 0x72, 0x45, 0x04, 0x40, - 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x00, 0x22, 0x05, 0x3a, 0x00, 0x00, - 0x20, 0x05, 0x45, 0x0d, 0x05, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x21, 0x04, - 0x20, 0x02, 0x41, 0x02, 0x6b, 0x22, 0x01, 0x41, 0x00, 0x47, 0x21, 0x06, - 0x20, 0x03, 0x41, 0x02, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, 0x20, - 0x01, 0x45, 0x72, 0x45, 0x04, 0x40, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, - 0x00, 0x22, 0x05, 0x3a, 0x00, 0x00, 0x20, 0x05, 0x45, 0x0d, 0x06, 0x20, - 0x00, 0x41, 0x03, 0x6a, 0x21, 0x04, 0x20, 0x02, 0x41, 0x03, 0x6b, 0x22, - 0x01, 0x41, 0x00, 0x47, 0x21, 0x06, 0x20, 0x03, 0x41, 0x03, 0x6a, 0x22, - 0x05, 0x41, 0x03, 0x71, 0x45, 0x20, 0x01, 0x45, 0x72, 0x45, 0x04, 0x40, - 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x00, 0x22, 0x05, 0x3a, 0x00, 0x00, - 0x20, 0x05, 0x45, 0x0d, 0x07, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x04, - 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x04, 0x6b, - 0x22, 0x02, 0x41, 0x00, 0x47, 0x21, 0x06, 0x0c, 0x03, 0x0b, 0x20, 0x05, - 0x21, 0x03, 0x20, 0x01, 0x21, 0x02, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x21, - 0x03, 0x20, 0x01, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x21, 0x03, - 0x20, 0x01, 0x21, 0x02, 0x0b, 0x20, 0x06, 0x45, 0x0d, 0x02, 0x20, 0x03, - 0x2d, 0x00, 0x00, 0x45, 0x04, 0x40, 0x20, 0x02, 0x21, 0x01, 0x0c, 0x04, - 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x41, 0x80, - 0x82, 0x84, 0x08, 0x20, 0x03, 0x28, 0x02, 0x00, 0x22, 0x01, 0x6b, 0x20, - 0x01, 0x72, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, - 0x82, 0x84, 0x78, 0x47, 0x0d, 0x02, 0x20, 0x04, 0x20, 0x01, 0x36, 0x02, - 0x00, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x41, 0x04, - 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x04, 0x6b, 0x22, 0x02, 0x41, 0x03, - 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x01, 0x0b, 0x03, - 0x40, 0x20, 0x04, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x22, 0x01, 0x3a, 0x00, - 0x00, 0x20, 0x01, 0x45, 0x04, 0x40, 0x20, 0x02, 0x21, 0x01, 0x0c, 0x03, - 0x0b, 0x20, 0x04, 0x41, 0x01, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x41, 0x01, - 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x22, 0x02, 0x0d, 0x00, - 0x0b, 0x0b, 0x41, 0x00, 0x21, 0x01, 0x0b, 0x20, 0x04, 0x41, 0x00, 0x20, - 0x01, 0x10, 0x0d, 0x1a, 0x20, 0x00, 0x0b, 0x17, 0x00, 0x20, 0x00, 0x41, - 0x30, 0x6b, 0x41, 0x0a, 0x49, 0x20, 0x00, 0x41, 0x20, 0x72, 0x41, 0xe1, - 0x00, 0x6b, 0x41, 0x06, 0x49, 0x72, 0x0b, 0x67, 0x01, 0x02, 0x7f, 0x20, - 0x00, 0x45, 0x04, 0x40, 0x41, 0x00, 0x0f, 0x0b, 0x02, 0x7f, 0x20, 0x00, - 0x04, 0x40, 0x41, 0x8c, 0xc2, 0x04, 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, - 0x41, 0x04, 0x6a, 0x22, 0x01, 0x28, 0x02, 0x00, 0x22, 0x02, 0x41, 0x00, - 0x20, 0x00, 0x20, 0x02, 0x47, 0x1b, 0x0d, 0x00, 0x0b, 0x20, 0x01, 0x41, - 0x00, 0x20, 0x02, 0x1b, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, 0x00, 0x03, - 0x40, 0x20, 0x00, 0x41, 0x90, 0xc2, 0x04, 0x6a, 0x20, 0x00, 0x41, 0x04, - 0x6a, 0x21, 0x00, 0x28, 0x02, 0x00, 0x0d, 0x00, 0x0b, 0x20, 0x00, 0x41, - 0x04, 0x6b, 0x41, 0x7c, 0x71, 0x41, 0x90, 0xc2, 0x04, 0x6a, 0x0b, 0x41, - 0x00, 0x47, 0x0b, 0x1d, 0x01, 0x01, 0x7f, 0x41, 0x01, 0x21, 0x01, 0x20, - 0x00, 0x41, 0x30, 0x6b, 0x41, 0x0a, 0x4f, 0x04, 0x7f, 0x20, 0x00, 0x10, - 0x0f, 0x41, 0x00, 0x47, 0x05, 0x20, 0x01, 0x0b, 0x0b, 0x0b, 0xf1, 0x42, - 0x01, 0x00, 0x41, 0x80, 0x80, 0x04, 0x0b, 0xe8, 0x42, 0x12, 0x11, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, - 0x20, 0x21, 0x11, 0x22, 0x23, 0x24, 0x11, 0x25, 0x26, 0x27, 0x28, 0x29, - 0x2a, 0x2b, 0x2c, 0x11, 0x2d, 0x2e, 0x2f, 0x10, 0x10, 0x30, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x31, 0x32, 0x33, 0x10, 0x34, 0x35, 0x10, - 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x02, 0x41, 0x03, 0x4b, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x01, 0x0b, 0x03, 0x40, 0x20, 0x03, + 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x00, 0x3a, 0x00, 0x00, 0x02, 0x40, + 0x20, 0x00, 0x0d, 0x00, 0x20, 0x02, 0x21, 0x05, 0x0c, 0x03, 0x0b, 0x20, + 0x03, 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, + 0x01, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, + 0x41, 0x00, 0x21, 0x05, 0x0b, 0x02, 0x40, 0x20, 0x05, 0x45, 0x0d, 0x00, + 0x20, 0x03, 0x41, 0x00, 0x20, 0x05, 0xfc, 0x0b, 0x00, 0x0b, 0x20, 0x03, + 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x10, 0xa6, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x20, 0x00, 0x0b, 0x17, 0x00, 0x20, 0x00, 0x41, + 0x50, 0x6a, 0x41, 0x0a, 0x49, 0x20, 0x00, 0x41, 0x20, 0x72, 0x41, 0x9f, + 0x7f, 0x6a, 0x41, 0x06, 0x49, 0x72, 0x0b, 0x2a, 0x01, 0x03, 0x7f, 0x41, + 0x00, 0x21, 0x01, 0x03, 0x40, 0x20, 0x00, 0x20, 0x01, 0x6a, 0x21, 0x02, + 0x20, 0x01, 0x41, 0x04, 0x6a, 0x22, 0x03, 0x21, 0x01, 0x20, 0x02, 0x28, + 0x02, 0x00, 0x0d, 0x00, 0x0b, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x41, 0x02, + 0x75, 0x0b, 0x45, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x20, 0x01, 0x45, 0x0d, + 0x00, 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x21, 0x00, 0x02, 0x40, 0x03, 0x40, + 0x20, 0x00, 0x41, 0x04, 0x6a, 0x22, 0x00, 0x28, 0x02, 0x00, 0x22, 0x02, + 0x45, 0x0d, 0x01, 0x20, 0x02, 0x20, 0x01, 0x47, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x00, 0x41, 0x00, 0x20, 0x02, 0x1b, 0x0f, 0x0b, 0x20, 0x00, 0x20, + 0x00, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x41, 0x02, 0x74, 0x6a, 0x0b, + 0x1d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, 0x00, 0x0f, 0x0b, + 0x41, 0x90, 0xc2, 0x84, 0x80, 0x00, 0x20, 0x00, 0x10, 0xaa, 0x80, 0x80, + 0x80, 0x00, 0x41, 0x00, 0x47, 0x0b, 0x24, 0x01, 0x01, 0x7f, 0x41, 0x01, + 0x21, 0x01, 0x02, 0x40, 0x20, 0x00, 0x41, 0x50, 0x6a, 0x41, 0x0a, 0x49, + 0x0d, 0x00, 0x20, 0x00, 0x10, 0x95, 0x80, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x47, 0x21, 0x01, 0x0b, 0x20, 0x01, 0x0b, 0x0b, 0xfc, 0x42, 0x02, 0x00, + 0x41, 0x80, 0x80, 0x04, 0x0b, 0xe8, 0x42, 0x12, 0x11, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, + 0x11, 0x22, 0x23, 0x24, 0x11, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, + 0x2c, 0x11, 0x2d, 0x2e, 0x2f, 0x10, 0x10, 0x30, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x31, 0x32, 0x33, 0x10, 0x34, 0x35, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x36, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x36, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x37, 0x11, 0x11, 0x11, 0x11, 0x38, 0x11, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, - 0x3e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x37, 0x11, + 0x11, 0x11, 0x11, 0x38, 0x11, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x3f, 0x10, 0x10, 0x10, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x3f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x40, 0x41, 0x11, 0x42, 0x43, - 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x11, 0x4b, 0x4c, 0x4d, 0x4e, - 0x4f, 0x50, 0x51, 0x10, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, - 0x5a, 0x5b, 0x5c, 0x5d, 0x10, 0x5e, 0x5f, 0x60, 0x10, 0x11, 0x11, 0x11, - 0x61, 0x62, 0x63, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x11, 0x11, 0x11, 0x11, 0x64, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x65, + 0x10, 0x10, 0x10, 0x10, 0x11, 0x40, 0x41, 0x11, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x11, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x51, 0x10, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, + 0x5c, 0x5d, 0x10, 0x5e, 0x5f, 0x60, 0x10, 0x11, 0x11, 0x11, 0x61, 0x62, + 0x63, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, + 0x11, 0x11, 0x11, 0x64, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x65, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x66, - 0x67, 0x10, 0x10, 0x68, 0x69, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x66, 0x67, 0x10, + 0x10, 0x68, 0x69, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x6a, 0x11, 0x11, 0x6b, 0x10, 0x10, 0x10, 0x10, + 0x11, 0x11, 0x6a, 0x11, 0x11, 0x6b, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x6c, 0x6d, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x6e, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x6c, 0x6d, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x6e, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x6f, 0x70, 0x71, - 0x72, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x73, 0x74, 0x75, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x76, 0x77, 0x10, 0x10, 0x10, 0x10, 0x78, - 0x10, 0x10, 0x79, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x6f, 0x70, 0x71, 0x72, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x73, 0x74, 0x75, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x76, 0x77, 0x10, 0x10, 0x10, 0x10, 0x78, 0x10, 0x10, + 0x79, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x04, 0xff, 0xff, 0x7f, - 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0x03, 0x00, 0x1f, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xdf, 0xbc, 0x40, 0xd7, 0xff, 0xff, 0xfb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x04, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x03, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0x7f, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xbf, 0xb6, 0x00, 0xff, 0xff, 0xff, 0x87, 0x07, - 0x00, 0x00, 0x00, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xef, 0x1f, 0xfe, 0xe1, 0xff, 0x9f, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x07, 0x30, 0x04, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x1f, 0x00, - 0x00, 0xff, 0xff, 0xff, 0x01, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xdf, 0x3f, 0x00, 0x00, 0xf0, 0xff, 0xf8, 0x03, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xdf, 0xe1, - 0xff, 0xcf, 0xff, 0xfe, 0xff, 0xef, 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xc5, - 0xe3, 0x9f, 0x59, 0x80, 0xb0, 0xcf, 0xff, 0x03, 0x10, 0xee, 0x87, 0xf9, - 0xff, 0xff, 0xfd, 0x6d, 0xc3, 0x87, 0x19, 0x02, 0x5e, 0xc0, 0xff, 0x3f, - 0x00, 0xee, 0xbf, 0xfb, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0xbf, 0x1b, 0x01, - 0x00, 0xcf, 0xff, 0x00, 0x1e, 0xee, 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xed, - 0xe3, 0x9f, 0x19, 0xc0, 0xb0, 0xcf, 0xff, 0x02, 0x00, 0xec, 0xc7, 0x3d, - 0xd6, 0x18, 0xc7, 0xff, 0xc3, 0xc7, 0x1d, 0x81, 0x00, 0xc0, 0xff, 0x00, - 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, 0xfd, 0xff, 0xe3, 0xdf, 0x1d, 0x60, - 0x07, 0xcf, 0xff, 0x00, 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, 0xfd, 0xef, - 0xe3, 0xdf, 0x1d, 0x60, 0x40, 0xcf, 0xff, 0x06, 0x00, 0xef, 0xdf, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xe7, 0xdf, 0x5d, 0xf0, 0x80, 0xcf, 0xff, 0x00, - 0xfc, 0xec, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xfb, 0x2f, 0x7f, 0x80, 0x5f, - 0xff, 0xc0, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, - 0x07, 0x3f, 0x20, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xf7, 0xff, - 0xff, 0xaf, 0xff, 0xff, 0x3b, 0x5f, 0x20, 0xff, 0xf3, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0xfe, 0xff, - 0xff, 0xff, 0x1f, 0xfe, 0xff, 0x03, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x7f, 0xf9, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x20, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x3d, 0x7f, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, - 0xff, 0xff, 0xff, 0x3d, 0x7f, 0x3d, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x07, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3f, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc3, 0xff, 0x03, 0x00, 0x1f, 0x50, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xdf, 0xbc, 0x40, 0xd7, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0x7f, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xbf, 0xb6, 0x00, 0xff, 0xff, 0xff, 0x87, 0x07, 0x00, 0x00, + 0x00, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0x1f, 0xfe, 0xe1, 0xff, 0x9f, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x07, 0x30, 0x04, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0xff, 0xff, 0x01, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xdf, 0x3f, 0x00, 0x00, 0xf0, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xdf, 0xe1, 0xff, 0xcf, + 0xff, 0xfe, 0xff, 0xef, 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xc5, 0xe3, 0x9f, + 0x59, 0x80, 0xb0, 0xcf, 0xff, 0x03, 0x10, 0xee, 0x87, 0xf9, 0xff, 0xff, + 0xfd, 0x6d, 0xc3, 0x87, 0x19, 0x02, 0x5e, 0xc0, 0xff, 0x3f, 0x00, 0xee, + 0xbf, 0xfb, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0xbf, 0x1b, 0x01, 0x00, 0xcf, + 0xff, 0x00, 0x1e, 0xee, 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0x9f, + 0x19, 0xc0, 0xb0, 0xcf, 0xff, 0x02, 0x00, 0xec, 0xc7, 0x3d, 0xd6, 0x18, + 0xc7, 0xff, 0xc3, 0xc7, 0x1d, 0x81, 0x00, 0xc0, 0xff, 0x00, 0x00, 0xef, + 0xdf, 0xfd, 0xff, 0xff, 0xfd, 0xff, 0xe3, 0xdf, 0x1d, 0x60, 0x07, 0xcf, + 0xff, 0x00, 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, 0xfd, 0xef, 0xe3, 0xdf, + 0x1d, 0x60, 0x40, 0xcf, 0xff, 0x06, 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0xdf, 0x5d, 0xf0, 0x80, 0xcf, 0xff, 0x00, 0xfc, 0xec, + 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xfb, 0x2f, 0x7f, 0x80, 0x5f, 0xff, 0xc0, + 0xff, 0x0c, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x07, 0x3f, + 0x20, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xf7, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0x3b, 0x5f, 0x20, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0x1f, 0xfe, 0xff, 0x03, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xf9, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x20, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3d, 0x7f, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0x3d, 0x7f, 0x3d, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, - 0x01, 0xff, 0xdf, 0x0f, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x0f, - 0x00, 0xff, 0xdf, 0x0d, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, - 0xff, 0xff, 0x01, 0x80, 0x10, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, - 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x0f, 0xff, - 0x01, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x1f, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x03, 0xff, 0x03, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7f, 0xfe, 0xff, 0x1f, 0x00, 0xff, 0x03, 0xff, 0x03, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xef, 0xff, 0xef, 0x0f, 0xff, 0x03, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xbf, 0xff, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, - 0x00, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x01, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x6f, - 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x1f, 0x00, 0xff, 0xff, 0x3f, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3f, 0xff, 0xaa, 0xff, 0xff, 0xff, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x5f, 0xdc, 0x1f, 0xcf, - 0x0f, 0xff, 0x1f, 0xdc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0xff, - 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x84, 0xfc, 0x2f, 0x3e, 0x50, 0xbd, 0xff, 0xf3, 0xe0, 0x43, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x78, 0x0c, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xfe, 0x03, 0x3e, - 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, - 0xe0, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x07, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0x01, 0xff, + 0xdf, 0x0f, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xff, + 0xdf, 0x0d, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0x01, 0x80, 0x10, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0x00, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x0f, 0xff, 0x01, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x1f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0f, 0xff, 0xff, 0xff, 0x03, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, + 0xff, 0x1f, 0x00, 0xff, 0x03, 0xff, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xef, 0x0f, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0xff, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xff, + 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x01, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x6f, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x1f, 0xff, - 0xff, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x2f, 0x00, 0xff, 0x03, 0x00, 0x00, 0xfc, 0xe8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x80, 0xff, - 0x03, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, - 0x00, 0xff, 0x3f, 0xff, 0x03, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x7f, 0x05, 0x00, 0x00, 0x38, 0xff, 0xff, 0x3c, - 0x00, 0x7e, 0x7e, 0x7e, 0x00, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0x03, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x7f, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x7f, 0x00, 0xf8, 0xe0, 0xff, 0xfd, 0x7f, 0x5f, 0xdb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, - 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x1f, 0x00, 0x00, 0xff, 0x03, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, - 0x07, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7f, 0xfc, 0xfc, 0xfc, 0x1c, 0x00, 0x00, 0x00, 0x00, 0xff, 0xef, 0xff, - 0xff, 0x7f, 0xff, 0xff, 0xb7, 0xff, 0x3f, 0xff, 0x3f, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0xff, 0x1f, 0x00, 0xff, 0xff, 0x3f, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x3f, 0xff, 0xaa, 0xff, 0xff, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x5f, 0xdc, 0x1f, 0xcf, 0x0f, 0xff, + 0x1f, 0xdc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0xff, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, + 0xfc, 0x2f, 0x3e, 0x50, 0xbd, 0xff, 0xf3, 0xe0, 0x43, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x07, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0x3e, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x3f, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, - 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xbf, - 0x91, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, - 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x37, - 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xf0, 0xef, - 0xfe, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0x1f, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0xff, - 0xff, 0x1f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, - 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x00, 0xff, - 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7f, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, - 0x00, 0xc0, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xff, 0x03, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc7, 0xff, 0x70, 0x00, 0xff, 0xff, 0xff, 0xff, 0x47, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0x00, 0xff, - 0x17, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x9f, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xbd, 0xff, - 0xbf, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, - 0x03, 0xef, 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0x9f, 0x19, 0x81, - 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0x07, 0xff, 0x83, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, 0xff, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x11, 0x00, 0xff, - 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, - 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xe7, 0xff, 0x07, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x78, 0x0c, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xbf, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1a, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe7, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0x7f, - 0x7f, 0x01, 0x00, 0xff, 0x03, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xb4, 0xcb, 0x00, 0xff, - 0x03, 0xbf, 0xfd, 0xff, 0xff, 0xff, 0x7f, 0x7b, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xfe, 0x03, 0x3e, 0x1f, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xe0, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x1f, 0xff, 0xff, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, + 0x00, 0xff, 0x03, 0x00, 0x00, 0xfc, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x07, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x80, 0xff, 0x03, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xff, + 0x3f, 0xff, 0x03, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0x05, 0x00, 0x00, 0x38, 0xff, 0xff, 0x3c, 0x00, 0x7e, + 0x7e, 0x7e, 0x00, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x00, 0x0f, 0x00, 0xff, 0x03, 0xf8, 0xff, 0xff, 0xe0, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, - 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xf0, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x07, 0xff, 0x1f, 0xff, 0x01, 0xff, 0x43, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0x64, 0xde, 0xff, 0xeb, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xe7, 0xdf, 0xdf, 0xff, 0xff, 0xff, - 0x7b, 0x5f, 0xfc, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, - 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xdf, - 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, - 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf9, 0xdb, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x3f, 0xff, 0x43, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0f, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x7f, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x7f, + 0x00, 0xf8, 0xe0, 0xff, 0xfd, 0x7f, 0x5f, 0xdb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, + 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, + 0x00, 0xff, 0x03, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfc, + 0xfc, 0xfc, 0x1c, 0x00, 0x00, 0x00, 0x00, 0xff, 0xef, 0xff, 0xff, 0x7f, + 0xff, 0xff, 0xb7, 0xff, 0x3f, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x08, 0xff, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, - 0xff, 0x96, 0xfe, 0xf7, 0x0a, 0x84, 0xea, 0x96, 0xaa, 0x96, 0xf7, 0xf7, - 0x5e, 0xff, 0xfb, 0xff, 0x0f, 0xee, 0xfb, 0xff, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, + 0xe0, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, + 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0x3e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, + 0x03, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x91, 0xff, + 0xff, 0x3f, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, 0x7f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x37, 0x00, 0xff, + 0xff, 0x3f, 0x00, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xf0, 0xef, 0xfe, 0xff, + 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0xff, 0xff, 0x1f, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xff, + 0xff, 0x3f, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x03, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x39, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, - 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0xbf, 0x1d, 0x00, 0x00, 0xe7, 0x02, - 0x00, 0x00, 0x79, 0x00, 0x00, 0x02, 0x24, 0x00, 0x00, 0x01, 0x01, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, - 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x39, 0xff, 0xff, 0x00, 0x18, 0xff, - 0xff, 0x01, 0x87, 0xff, 0xff, 0x00, 0xd4, 0xfe, 0xff, 0x00, 0xc3, 0x00, - 0x00, 0x01, 0xd2, 0x00, 0x00, 0x01, 0xce, 0x00, 0x00, 0x01, 0xcd, 0x00, - 0x00, 0x01, 0x4f, 0x00, 0x00, 0x01, 0xca, 0x00, 0x00, 0x01, 0xcb, 0x00, - 0x00, 0x01, 0xcf, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x01, 0xd3, 0x00, - 0x00, 0x01, 0xd1, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x01, 0xd5, 0x00, - 0x00, 0x00, 0x82, 0x00, 0x00, 0x01, 0xd6, 0x00, 0x00, 0x01, 0xda, 0x00, - 0x00, 0x01, 0xd9, 0x00, 0x00, 0x01, 0xdb, 0x00, 0x00, 0x00, 0x38, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xb1, 0xff, 0xff, 0x01, 0x9f, 0xff, - 0xff, 0x01, 0xc8, 0xff, 0xff, 0x02, 0x28, 0x24, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x33, 0xff, - 0xff, 0x00, 0x26, 0xff, 0xff, 0x01, 0x7e, 0xff, 0xff, 0x01, 0x2b, 0x2a, - 0x00, 0x01, 0x5d, 0xff, 0xff, 0x01, 0x28, 0x2a, 0x00, 0x00, 0x3f, 0x2a, - 0x00, 0x01, 0x3d, 0xff, 0xff, 0x01, 0x45, 0x00, 0x00, 0x01, 0x47, 0x00, - 0x00, 0x00, 0x1f, 0x2a, 0x00, 0x00, 0x1c, 0x2a, 0x00, 0x00, 0x1e, 0x2a, - 0x00, 0x00, 0x2e, 0xff, 0xff, 0x00, 0x32, 0xff, 0xff, 0x00, 0x36, 0xff, - 0xff, 0x00, 0x35, 0xff, 0xff, 0x00, 0x4f, 0xa5, 0x00, 0x00, 0x4b, 0xa5, - 0x00, 0x00, 0x31, 0xff, 0xff, 0x00, 0x28, 0xa5, 0x00, 0x00, 0x44, 0xa5, - 0x00, 0x00, 0x2f, 0xff, 0xff, 0x00, 0x2d, 0xff, 0xff, 0x00, 0xf7, 0x29, - 0x00, 0x00, 0x41, 0xa5, 0x00, 0x00, 0xfd, 0x29, 0x00, 0x00, 0x2b, 0xff, - 0xff, 0x00, 0x2a, 0xff, 0xff, 0x00, 0xe7, 0x29, 0x00, 0x00, 0x43, 0xa5, - 0x00, 0x00, 0x2a, 0xa5, 0x00, 0x00, 0xbb, 0xff, 0xff, 0x00, 0x27, 0xff, - 0xff, 0x00, 0xb9, 0xff, 0xff, 0x00, 0x25, 0xff, 0xff, 0x00, 0x15, 0xa5, - 0x00, 0x00, 0x12, 0xa5, 0x00, 0x02, 0x24, 0x4c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x01, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x54, 0x00, 0x00, 0x01, 0x74, 0x00, - 0x00, 0x01, 0x26, 0x00, 0x00, 0x01, 0x25, 0x00, 0x00, 0x01, 0x40, 0x00, - 0x00, 0x01, 0x3f, 0x00, 0x00, 0x00, 0xda, 0xff, 0xff, 0x00, 0xdb, 0xff, - 0xff, 0x00, 0xe1, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xc1, 0xff, - 0xff, 0x01, 0x08, 0x00, 0x00, 0x00, 0xc2, 0xff, 0xff, 0x00, 0xc7, 0xff, - 0xff, 0x00, 0xd1, 0xff, 0xff, 0x00, 0xca, 0xff, 0xff, 0x00, 0xf8, 0xff, - 0xff, 0x00, 0xaa, 0xff, 0xff, 0x00, 0xb0, 0xff, 0xff, 0x00, 0x07, 0x00, - 0x00, 0x00, 0x8c, 0xff, 0xff, 0x01, 0xc4, 0xff, 0xff, 0x00, 0xa0, 0xff, - 0xff, 0x01, 0xf9, 0xff, 0xff, 0x02, 0x1a, 0x70, 0x00, 0x01, 0x01, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, - 0xff, 0x01, 0x50, 0x00, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x00, 0xf1, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x00, 0xd0, 0xff, - 0xff, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x0b, 0x00, 0x01, 0x60, 0x1c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xd0, 0x97, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0xf8, 0xff, - 0xff, 0x02, 0x05, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xf4, - 0xff, 0x00, 0x9e, 0xe7, 0xff, 0x00, 0xc2, 0x89, 0x00, 0x00, 0xdb, 0xe7, - 0xff, 0x00, 0x92, 0xe7, 0xff, 0x00, 0x93, 0xe7, 0xff, 0x00, 0x9c, 0xe7, - 0xff, 0x00, 0x9d, 0xe7, 0xff, 0x00, 0xa4, 0xe7, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x8a, 0x00, 0x00, 0x04, 0x8a, 0x00, 0x00, 0xe6, 0x0e, - 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc5, 0xff, 0xff, 0x01, 0x41, 0xe2, 0xff, 0x02, 0x1d, 0x8f, - 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x56, 0x00, 0x00, 0x01, 0xaa, 0xff, 0xff, 0x00, 0x4a, 0x00, - 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x01, 0xb6, 0xff, - 0xff, 0x01, 0xf7, 0xff, 0xff, 0x00, 0xdb, 0xe3, 0xff, 0x01, 0x9c, 0xff, - 0xff, 0x01, 0x90, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff, 0x01, 0x82, 0xff, - 0xff, 0x02, 0x05, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, - 0x00, 0x00, 0xf0, 0xff, 0xff, 0x01, 0x1c, 0x00, 0x00, 0x01, 0x01, 0x00, - 0x00, 0x01, 0xa3, 0xe2, 0xff, 0x01, 0x41, 0xdf, 0xff, 0x01, 0xba, 0xdf, - 0xff, 0x00, 0xe4, 0xff, 0xff, 0x02, 0x0b, 0xb1, 0x00, 0x01, 0x01, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0x30, 0x00, 0x00, 0x00, 0xd0, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x09, 0xd6, 0xff, 0x01, 0x1a, 0xf1, - 0xff, 0x01, 0x19, 0xd6, 0xff, 0x00, 0xd5, 0xd5, 0xff, 0x00, 0xd8, 0xd5, - 0xff, 0x01, 0xe4, 0xd5, 0xff, 0x01, 0x03, 0xd6, 0xff, 0x01, 0xe1, 0xd5, - 0xff, 0x01, 0xe2, 0xd5, 0xff, 0x01, 0xc1, 0xd5, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0xe3, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x02, 0x0c, 0xbc, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xbc, 0x5a, - 0xff, 0x01, 0xa0, 0x03, 0x00, 0x01, 0xfc, 0x75, 0xff, 0x01, 0xd8, 0x5a, - 0xff, 0x00, 0x30, 0x00, 0x00, 0x01, 0xb1, 0x5a, 0xff, 0x01, 0xb5, 0x5a, - 0xff, 0x01, 0xbf, 0x5a, 0xff, 0x01, 0xee, 0x5a, 0xff, 0x01, 0xd6, 0x5a, - 0xff, 0x01, 0xeb, 0x5a, 0xff, 0x01, 0xd0, 0xff, 0xff, 0x01, 0xbd, 0x5a, - 0xff, 0x01, 0xc8, 0x75, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x68, - 0xff, 0x00, 0x60, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, - 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, 0x00, - 0x00, 0x00, 0xd8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, - 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, - 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, - 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x22, 0x00, - 0x00, 0x00, 0xde, 0xff, 0xff, 0x30, 0x0c, 0x31, 0x0d, 0x78, 0x0e, 0x7f, - 0x0f, 0x80, 0x10, 0x81, 0x11, 0x86, 0x12, 0x89, 0x13, 0x8a, 0x13, 0x8e, - 0x14, 0x8f, 0x15, 0x90, 0x16, 0x93, 0x13, 0x94, 0x17, 0x95, 0x18, 0x96, - 0x19, 0x97, 0x1a, 0x9a, 0x1b, 0x9c, 0x19, 0x9d, 0x1c, 0x9e, 0x1d, 0x9f, - 0x1e, 0xa6, 0x1f, 0xa9, 0x1f, 0xae, 0x1f, 0xb1, 0x20, 0xb2, 0x20, 0xb7, - 0x21, 0xbf, 0x22, 0xc5, 0x23, 0xc8, 0x23, 0xcb, 0x23, 0xdd, 0x24, 0xf2, - 0x23, 0xf6, 0x25, 0xf7, 0x26, 0x20, 0x2d, 0x3a, 0x2e, 0x3d, 0x2f, 0x3e, - 0x30, 0x3f, 0x31, 0x40, 0x31, 0x43, 0x32, 0x44, 0x33, 0x45, 0x34, 0x50, - 0x35, 0x51, 0x36, 0x52, 0x37, 0x53, 0x38, 0x54, 0x39, 0x59, 0x3a, 0x5b, - 0x3b, 0x5c, 0x3c, 0x61, 0x3d, 0x63, 0x3e, 0x65, 0x3f, 0x66, 0x40, 0x68, - 0x41, 0x69, 0x42, 0x6a, 0x40, 0x6b, 0x43, 0x6c, 0x44, 0x6f, 0x42, 0x71, - 0x45, 0x72, 0x46, 0x75, 0x47, 0x7d, 0x48, 0x82, 0x49, 0x87, 0x4a, 0x89, - 0x4b, 0x8a, 0x4c, 0x8b, 0x4c, 0x8c, 0x4d, 0x92, 0x4e, 0x9d, 0x4f, 0x9e, - 0x50, 0x45, 0x57, 0x7b, 0x1d, 0x7c, 0x1d, 0x7d, 0x1d, 0x7f, 0x58, 0x86, - 0x59, 0x88, 0x5a, 0x89, 0x5a, 0x8a, 0x5a, 0x8c, 0x5b, 0x8e, 0x5c, 0x8f, - 0x5c, 0xac, 0x5d, 0xad, 0x5e, 0xae, 0x5e, 0xaf, 0x5e, 0xc2, 0x5f, 0xcc, - 0x60, 0xcd, 0x61, 0xce, 0x61, 0xcf, 0x62, 0xd0, 0x63, 0xd1, 0x64, 0xd5, - 0x65, 0xd6, 0x66, 0xd7, 0x67, 0xf0, 0x68, 0xf1, 0x69, 0xf2, 0x6a, 0xf3, - 0x6b, 0xf4, 0x6c, 0xf5, 0x6d, 0xf9, 0x6e, 0xfd, 0x2d, 0xfe, 0x2d, 0xff, - 0x2d, 0x50, 0x69, 0x51, 0x69, 0x52, 0x69, 0x53, 0x69, 0x54, 0x69, 0x55, - 0x69, 0x56, 0x69, 0x57, 0x69, 0x58, 0x69, 0x59, 0x69, 0x5a, 0x69, 0x5b, - 0x69, 0x5c, 0x69, 0x5d, 0x69, 0x5e, 0x69, 0x5f, 0x69, 0x82, 0x00, 0x83, - 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, - 0x00, 0xc0, 0x75, 0xcf, 0x76, 0x80, 0x89, 0x81, 0x8a, 0x82, 0x8b, 0x85, - 0x8c, 0x86, 0x8d, 0x70, 0x9d, 0x71, 0x9d, 0x76, 0x9e, 0x77, 0x9e, 0x78, - 0x9f, 0x79, 0x9f, 0x7a, 0xa0, 0x7b, 0xa0, 0x7c, 0xa1, 0x7d, 0xa1, 0xb3, - 0xa2, 0xba, 0xa3, 0xbb, 0xa3, 0xbc, 0xa4, 0xbe, 0xa5, 0xc3, 0xa2, 0xcc, - 0xa4, 0xda, 0xa6, 0xdb, 0xa6, 0xe5, 0x6a, 0xea, 0xa7, 0xeb, 0xa7, 0xec, - 0x6e, 0xf3, 0xa2, 0xf8, 0xa8, 0xf9, 0xa8, 0xfa, 0xa9, 0xfb, 0xa9, 0xfc, - 0xa4, 0x26, 0xb0, 0x2a, 0xb1, 0x2b, 0xb2, 0x4e, 0xb3, 0x84, 0x08, 0x62, - 0xba, 0x63, 0xbb, 0x64, 0xbc, 0x65, 0xbd, 0x66, 0xbe, 0x6d, 0xbf, 0x6e, - 0xc0, 0x6f, 0xc1, 0x70, 0xc2, 0x7e, 0xc3, 0x7f, 0xc3, 0x7d, 0xcf, 0x8d, - 0xd0, 0x94, 0xd1, 0xab, 0xd2, 0xac, 0xd3, 0xad, 0xd4, 0xb0, 0xd5, 0xb1, - 0xd6, 0xb2, 0xd7, 0xc4, 0xd8, 0xc5, 0xd9, 0xc6, 0xda, 0x07, 0x08, 0x09, - 0x0a, 0x0b, 0x0c, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x0d, 0x06, 0x06, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x0f, 0x10, 0x11, 0x12, 0x06, 0x13, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x14, 0x15, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x00, 0xff, 0xff, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xc0, + 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x01, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc7, 0xff, 0x70, 0x00, 0xff, 0xff, 0xff, 0xff, 0x47, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0x00, 0xff, 0x17, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x9f, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xbd, 0xff, 0xbf, 0xff, + 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0x03, 0xef, + 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0x9f, 0x19, 0x81, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbb, 0x07, 0xff, 0x83, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x11, 0x00, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x01, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe7, 0xff, + 0x07, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x1a, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x01, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x01, + 0x00, 0xff, 0x03, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xb4, 0xcb, 0x00, 0xff, 0x03, 0xbf, + 0xfd, 0xff, 0xff, 0xff, 0x7f, 0x7b, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, + 0x00, 0xff, 0x03, 0xf8, 0xff, 0xff, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, 0x7f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xf0, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x07, 0xff, 0x1f, 0xff, 0x01, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0x64, 0xde, 0xff, 0xeb, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbf, 0xe7, 0xdf, 0xdf, 0xff, 0xff, 0xff, 0x7b, 0x5f, + 0xfc, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xdf, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf9, 0xdb, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x3f, 0xff, 0x43, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0f, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x08, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xff, 0x96, + 0xfe, 0xf7, 0x0a, 0x84, 0xea, 0x96, 0xaa, 0x96, 0xf7, 0xf7, 0x5e, 0xff, + 0xfb, 0xff, 0x0f, 0xee, 0xfb, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x03, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0x00, 0xbf, 0x1d, 0x00, 0x00, 0xe7, 0x02, 0x00, 0x00, + 0x79, 0x00, 0x00, 0x02, 0x24, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, + 0xfe, 0xff, 0xff, 0x01, 0x39, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x01, + 0x87, 0xff, 0xff, 0x00, 0xd4, 0xfe, 0xff, 0x00, 0xc3, 0x00, 0x00, 0x01, + 0xd2, 0x00, 0x00, 0x01, 0xce, 0x00, 0x00, 0x01, 0xcd, 0x00, 0x00, 0x01, + 0x4f, 0x00, 0x00, 0x01, 0xca, 0x00, 0x00, 0x01, 0xcb, 0x00, 0x00, 0x01, + 0xcf, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x01, 0xd3, 0x00, 0x00, 0x01, + 0xd1, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x01, 0xd5, 0x00, 0x00, 0x00, + 0x82, 0x00, 0x00, 0x01, 0xd6, 0x00, 0x00, 0x01, 0xda, 0x00, 0x00, 0x01, + 0xd9, 0x00, 0x00, 0x01, 0xdb, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, 0xb1, 0xff, 0xff, 0x01, 0x9f, 0xff, 0xff, 0x01, + 0xc8, 0xff, 0xff, 0x02, 0x28, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x33, 0xff, 0xff, 0x00, + 0x26, 0xff, 0xff, 0x01, 0x7e, 0xff, 0xff, 0x01, 0x2b, 0x2a, 0x00, 0x01, + 0x5d, 0xff, 0xff, 0x01, 0x28, 0x2a, 0x00, 0x00, 0x3f, 0x2a, 0x00, 0x01, + 0x3d, 0xff, 0xff, 0x01, 0x45, 0x00, 0x00, 0x01, 0x47, 0x00, 0x00, 0x00, + 0x1f, 0x2a, 0x00, 0x00, 0x1c, 0x2a, 0x00, 0x00, 0x1e, 0x2a, 0x00, 0x00, + 0x2e, 0xff, 0xff, 0x00, 0x32, 0xff, 0xff, 0x00, 0x36, 0xff, 0xff, 0x00, + 0x35, 0xff, 0xff, 0x00, 0x4f, 0xa5, 0x00, 0x00, 0x4b, 0xa5, 0x00, 0x00, + 0x31, 0xff, 0xff, 0x00, 0x28, 0xa5, 0x00, 0x00, 0x44, 0xa5, 0x00, 0x00, + 0x2f, 0xff, 0xff, 0x00, 0x2d, 0xff, 0xff, 0x00, 0xf7, 0x29, 0x00, 0x00, + 0x41, 0xa5, 0x00, 0x00, 0xfd, 0x29, 0x00, 0x00, 0x2b, 0xff, 0xff, 0x00, + 0x2a, 0xff, 0xff, 0x00, 0xe7, 0x29, 0x00, 0x00, 0x43, 0xa5, 0x00, 0x00, + 0x2a, 0xa5, 0x00, 0x00, 0xbb, 0xff, 0xff, 0x00, 0x27, 0xff, 0xff, 0x00, + 0xb9, 0xff, 0xff, 0x00, 0x25, 0xff, 0xff, 0x00, 0x15, 0xa5, 0x00, 0x00, + 0x12, 0xa5, 0x00, 0x02, 0x24, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x01, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x00, 0x54, 0x00, 0x00, 0x01, 0x74, 0x00, 0x00, 0x01, + 0x26, 0x00, 0x00, 0x01, 0x25, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, + 0x3f, 0x00, 0x00, 0x00, 0xda, 0xff, 0xff, 0x00, 0xdb, 0xff, 0xff, 0x00, + 0xe1, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xc1, 0xff, 0xff, 0x01, + 0x08, 0x00, 0x00, 0x00, 0xc2, 0xff, 0xff, 0x00, 0xc7, 0xff, 0xff, 0x00, + 0xd1, 0xff, 0xff, 0x00, 0xca, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, 0x00, + 0xaa, 0xff, 0xff, 0x00, 0xb0, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x8c, 0xff, 0xff, 0x01, 0xc4, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xff, 0x01, + 0xf9, 0xff, 0xff, 0x02, 0x1a, 0x70, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, + 0x50, 0x00, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x00, 0xf1, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x00, 0xd0, 0xff, 0xff, 0x01, + 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x0b, 0x00, 0x01, 0x60, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xd0, 0x97, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x02, + 0x05, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xf4, 0xff, 0x00, + 0x9e, 0xe7, 0xff, 0x00, 0xc2, 0x89, 0x00, 0x00, 0xdb, 0xe7, 0xff, 0x00, + 0x92, 0xe7, 0xff, 0x00, 0x93, 0xe7, 0xff, 0x00, 0x9c, 0xe7, 0xff, 0x00, + 0x9d, 0xe7, 0xff, 0x00, 0xa4, 0xe7, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x8a, 0x00, 0x00, 0x04, 0x8a, 0x00, 0x00, 0xe6, 0x0e, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc5, 0xff, 0xff, 0x01, 0x41, 0xe2, 0xff, 0x02, 0x1d, 0x8f, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x01, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x56, 0x00, 0x00, 0x01, 0xaa, 0xff, 0xff, 0x00, 0x4a, 0x00, 0x00, 0x00, + 0x64, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x01, 0xb6, 0xff, 0xff, 0x01, + 0xf7, 0xff, 0xff, 0x00, 0xdb, 0xe3, 0xff, 0x01, 0x9c, 0xff, 0xff, 0x01, + 0x90, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff, 0x01, 0x82, 0xff, 0xff, 0x02, + 0x05, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, + 0xf0, 0xff, 0xff, 0x01, 0x1c, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0xa3, 0xe2, 0xff, 0x01, 0x41, 0xdf, 0xff, 0x01, 0xba, 0xdf, 0xff, 0x00, + 0xe4, 0xff, 0xff, 0x02, 0x0b, 0xb1, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x01, 0x30, 0x00, 0x00, 0x00, 0xd0, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x09, 0xd6, 0xff, 0x01, 0x1a, 0xf1, 0xff, 0x01, + 0x19, 0xd6, 0xff, 0x00, 0xd5, 0xd5, 0xff, 0x00, 0xd8, 0xd5, 0xff, 0x01, + 0xe4, 0xd5, 0xff, 0x01, 0x03, 0xd6, 0xff, 0x01, 0xe1, 0xd5, 0xff, 0x01, + 0xe2, 0xd5, 0xff, 0x01, 0xc1, 0xd5, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xe3, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x02, 0x0c, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xbc, 0x5a, 0xff, 0x01, + 0xa0, 0x03, 0x00, 0x01, 0xfc, 0x75, 0xff, 0x01, 0xd8, 0x5a, 0xff, 0x00, + 0x30, 0x00, 0x00, 0x01, 0xb1, 0x5a, 0xff, 0x01, 0xb5, 0x5a, 0xff, 0x01, + 0xbf, 0x5a, 0xff, 0x01, 0xee, 0x5a, 0xff, 0x01, 0xd6, 0x5a, 0xff, 0x01, + 0xeb, 0x5a, 0xff, 0x01, 0xd0, 0xff, 0xff, 0x01, 0xbd, 0x5a, 0xff, 0x01, + 0xc8, 0x75, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x68, 0xff, 0x00, + 0x60, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, 0x00, 0x00, 0x00, + 0xd8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, + 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, + 0xde, 0xff, 0xff, 0x30, 0x0c, 0x31, 0x0d, 0x78, 0x0e, 0x7f, 0x0f, 0x80, + 0x10, 0x81, 0x11, 0x86, 0x12, 0x89, 0x13, 0x8a, 0x13, 0x8e, 0x14, 0x8f, + 0x15, 0x90, 0x16, 0x93, 0x13, 0x94, 0x17, 0x95, 0x18, 0x96, 0x19, 0x97, + 0x1a, 0x9a, 0x1b, 0x9c, 0x19, 0x9d, 0x1c, 0x9e, 0x1d, 0x9f, 0x1e, 0xa6, + 0x1f, 0xa9, 0x1f, 0xae, 0x1f, 0xb1, 0x20, 0xb2, 0x20, 0xb7, 0x21, 0xbf, + 0x22, 0xc5, 0x23, 0xc8, 0x23, 0xcb, 0x23, 0xdd, 0x24, 0xf2, 0x23, 0xf6, + 0x25, 0xf7, 0x26, 0x20, 0x2d, 0x3a, 0x2e, 0x3d, 0x2f, 0x3e, 0x30, 0x3f, + 0x31, 0x40, 0x31, 0x43, 0x32, 0x44, 0x33, 0x45, 0x34, 0x50, 0x35, 0x51, + 0x36, 0x52, 0x37, 0x53, 0x38, 0x54, 0x39, 0x59, 0x3a, 0x5b, 0x3b, 0x5c, + 0x3c, 0x61, 0x3d, 0x63, 0x3e, 0x65, 0x3f, 0x66, 0x40, 0x68, 0x41, 0x69, + 0x42, 0x6a, 0x40, 0x6b, 0x43, 0x6c, 0x44, 0x6f, 0x42, 0x71, 0x45, 0x72, + 0x46, 0x75, 0x47, 0x7d, 0x48, 0x82, 0x49, 0x87, 0x4a, 0x89, 0x4b, 0x8a, + 0x4c, 0x8b, 0x4c, 0x8c, 0x4d, 0x92, 0x4e, 0x9d, 0x4f, 0x9e, 0x50, 0x45, + 0x57, 0x7b, 0x1d, 0x7c, 0x1d, 0x7d, 0x1d, 0x7f, 0x58, 0x86, 0x59, 0x88, + 0x5a, 0x89, 0x5a, 0x8a, 0x5a, 0x8c, 0x5b, 0x8e, 0x5c, 0x8f, 0x5c, 0xac, + 0x5d, 0xad, 0x5e, 0xae, 0x5e, 0xaf, 0x5e, 0xc2, 0x5f, 0xcc, 0x60, 0xcd, + 0x61, 0xce, 0x61, 0xcf, 0x62, 0xd0, 0x63, 0xd1, 0x64, 0xd5, 0x65, 0xd6, + 0x66, 0xd7, 0x67, 0xf0, 0x68, 0xf1, 0x69, 0xf2, 0x6a, 0xf3, 0x6b, 0xf4, + 0x6c, 0xf5, 0x6d, 0xf9, 0x6e, 0xfd, 0x2d, 0xfe, 0x2d, 0xff, 0x2d, 0x50, + 0x69, 0x51, 0x69, 0x52, 0x69, 0x53, 0x69, 0x54, 0x69, 0x55, 0x69, 0x56, + 0x69, 0x57, 0x69, 0x58, 0x69, 0x59, 0x69, 0x5a, 0x69, 0x5b, 0x69, 0x5c, + 0x69, 0x5d, 0x69, 0x5e, 0x69, 0x5f, 0x69, 0x82, 0x00, 0x83, 0x00, 0x84, + 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, 0x00, 0xc0, + 0x75, 0xcf, 0x76, 0x80, 0x89, 0x81, 0x8a, 0x82, 0x8b, 0x85, 0x8c, 0x86, + 0x8d, 0x70, 0x9d, 0x71, 0x9d, 0x76, 0x9e, 0x77, 0x9e, 0x78, 0x9f, 0x79, + 0x9f, 0x7a, 0xa0, 0x7b, 0xa0, 0x7c, 0xa1, 0x7d, 0xa1, 0xb3, 0xa2, 0xba, + 0xa3, 0xbb, 0xa3, 0xbc, 0xa4, 0xbe, 0xa5, 0xc3, 0xa2, 0xcc, 0xa4, 0xda, + 0xa6, 0xdb, 0xa6, 0xe5, 0x6a, 0xea, 0xa7, 0xeb, 0xa7, 0xec, 0x6e, 0xf3, + 0xa2, 0xf8, 0xa8, 0xf9, 0xa8, 0xfa, 0xa9, 0xfb, 0xa9, 0xfc, 0xa4, 0x26, + 0xb0, 0x2a, 0xb1, 0x2b, 0xb2, 0x4e, 0xb3, 0x84, 0x08, 0x62, 0xba, 0x63, + 0xbb, 0x64, 0xbc, 0x65, 0xbd, 0x66, 0xbe, 0x6d, 0xbf, 0x6e, 0xc0, 0x6f, + 0xc1, 0x70, 0xc2, 0x7e, 0xc3, 0x7f, 0xc3, 0x7d, 0xcf, 0x8d, 0xd0, 0x94, + 0xd1, 0xab, 0xd2, 0xac, 0xd3, 0xad, 0xd4, 0xb0, 0xd5, 0xb1, 0xd6, 0xb2, + 0xd7, 0xc4, 0xd8, 0xc5, 0xd9, 0xc6, 0xda, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0d, + 0x06, 0x06, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0f, + 0x10, 0x11, 0x12, 0x06, 0x13, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x14, 0x15, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, @@ -924,24 +1017,24 @@ unsigned char STDLIB_WASM[] = { 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x16, 0x17, 0x06, 0x06, 0x06, - 0x18, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x16, 0x17, 0x06, 0x06, 0x06, 0x18, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x19, 0x06, 0x06, 0x06, 0x06, 0x1a, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x1b, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x1c, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x19, 0x06, + 0x06, 0x06, 0x06, 0x1a, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1b, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1c, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x1d, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x1d, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, @@ -951,9 +1044,9 @@ unsigned char STDLIB_WASM[] = { 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1e, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x1e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -962,45 +1055,45 @@ unsigned char STDLIB_WASM[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x2b, 0x2b, 0x5b, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x4a, 0x56, 0x56, 0x05, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x24, 0x50, 0x79, 0x31, 0x50, 0x31, 0x50, 0x31, 0x38, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x4e, 0x31, 0x02, 0x4e, 0x0d, 0x0d, 0x4e, 0x03, 0x4e, + 0x00, 0x24, 0x6e, 0x00, 0x4e, 0x31, 0x26, 0x6e, 0x51, 0x4e, 0x24, 0x50, + 0x4e, 0x39, 0x14, 0x81, 0x1b, 0x1d, 0x1d, 0x53, 0x31, 0x50, 0x31, 0x50, + 0x0d, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x1b, 0x53, 0x24, 0x50, 0x31, + 0x02, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x14, + 0x79, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x2d, 0x2b, 0x49, 0x03, 0x48, 0x03, + 0x78, 0x5c, 0x7b, 0x14, 0x00, 0x96, 0x0a, 0x01, 0x2b, 0x28, 0x06, 0x06, + 0x00, 0x2a, 0x06, 0x2a, 0x2a, 0x2b, 0x07, 0xbb, 0xb5, 0x2b, 0x1e, 0x00, + 0x2b, 0x07, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0xcd, 0x46, 0xcd, 0x2b, 0x00, 0x25, 0x2b, 0x07, + 0x01, 0x06, 0x01, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x55, 0x56, 0x56, + 0x02, 0x24, 0x81, 0x81, 0x81, 0x81, 0x81, 0x15, 0x81, 0x81, 0x81, 0x00, + 0x00, 0x2b, 0x00, 0xb2, 0xd1, 0xb2, 0xd1, 0xb2, 0xd1, 0xb2, 0xd1, 0x00, + 0x00, 0xcd, 0xcc, 0x01, 0x00, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0x83, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x02, 0x00, 0x00, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x4e, 0x31, 0x50, + 0x31, 0x50, 0x4e, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x02, 0x87, 0xa6, 0x87, 0xa6, 0x87, + 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x2a, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x00, 0x00, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, - 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x2b, - 0x2b, 0x5b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x4a, 0x56, 0x56, - 0x05, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x24, 0x50, 0x79, 0x31, 0x50, 0x31, 0x50, - 0x31, 0x38, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x4e, 0x31, 0x02, 0x4e, 0x0d, 0x0d, 0x4e, - 0x03, 0x4e, 0x00, 0x24, 0x6e, 0x00, 0x4e, 0x31, 0x26, 0x6e, 0x51, 0x4e, - 0x24, 0x50, 0x4e, 0x39, 0x14, 0x81, 0x1b, 0x1d, 0x1d, 0x53, 0x31, 0x50, - 0x31, 0x50, 0x0d, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x1b, 0x53, 0x24, - 0x50, 0x31, 0x02, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, - 0x7b, 0x14, 0x79, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x2d, 0x2b, 0x49, 0x03, - 0x48, 0x03, 0x78, 0x5c, 0x7b, 0x14, 0x00, 0x96, 0x0a, 0x01, 0x2b, 0x28, - 0x06, 0x06, 0x00, 0x2a, 0x06, 0x2a, 0x2a, 0x2b, 0x07, 0xbb, 0xb5, 0x2b, - 0x1e, 0x00, 0x2b, 0x07, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0xcd, 0x46, 0xcd, 0x2b, 0x00, 0x25, - 0x2b, 0x07, 0x01, 0x06, 0x01, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x55, - 0x56, 0x56, 0x02, 0x24, 0x81, 0x81, 0x81, 0x81, 0x81, 0x15, 0x81, 0x81, - 0x81, 0x00, 0x00, 0x2b, 0x00, 0xb2, 0xd1, 0xb2, 0xd1, 0xb2, 0xd1, 0xb2, - 0xd1, 0x00, 0x00, 0xcd, 0xcc, 0x01, 0x00, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, - 0x83, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xac, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0x1c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x02, 0x00, 0x00, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x4e, - 0x31, 0x50, 0x31, 0x50, 0x4e, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x02, 0x87, 0xa6, 0x87, - 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, - 0xa6, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x00, 0x00, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1008,136 +1101,136 @@ unsigned char STDLIB_WASM[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x0c, 0x00, 0x0c, 0x2a, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x2a, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x0c, 0x00, 0x0c, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x2a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x6c, - 0x81, 0x15, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x6c, 0x03, - 0x41, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x2c, 0x56, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x6c, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x56, 0x7a, 0x9e, - 0x26, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x01, 0x2b, 0x2b, 0x4f, - 0x56, 0x56, 0x2c, 0x2b, 0x7f, 0x56, 0x56, 0x39, 0x2b, 0x2b, 0x55, 0x56, - 0x56, 0x2b, 0x2b, 0x4f, 0x56, 0x56, 0x2c, 0x2b, 0x7f, 0x56, 0x56, 0x81, - 0x37, 0x75, 0x5b, 0x7b, 0x5c, 0x2b, 0x2b, 0x4f, 0x56, 0x56, 0x02, 0xac, - 0x04, 0x00, 0x00, 0x39, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x2b, 0x2b, 0x4f, - 0x56, 0x56, 0x2c, 0x2b, 0x2b, 0x56, 0x56, 0x32, 0x13, 0x81, 0x57, 0x00, - 0x6f, 0x81, 0x7e, 0xc9, 0xd7, 0x7e, 0x2d, 0x81, 0x81, 0x0e, 0x7e, 0x39, - 0x7f, 0x6f, 0x57, 0x00, 0x81, 0x81, 0x7e, 0x15, 0x00, 0x7e, 0x03, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, - 0x2b, 0x24, 0x2b, 0x97, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x80, 0x81, 0x81, 0x81, 0x81, 0x39, 0xbb, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x01, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0xc9, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xd0, 0x0d, 0x00, 0x4e, - 0x31, 0x02, 0xb4, 0xc1, 0xc1, 0xd7, 0xd7, 0x24, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0xd7, 0xd7, 0x53, 0xc1, 0x47, 0xd4, 0xd7, - 0xd7, 0xd7, 0x05, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x07, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x4e, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x79, 0x5c, 0x7b, 0x5c, 0x7b, 0x4f, - 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, - 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x2d, 0x2b, 0x2b, 0x79, - 0x14, 0x5c, 0x7b, 0x5c, 0x2d, 0x79, 0x2a, 0x5c, 0x27, 0x5c, 0x7b, 0x5c, - 0x7b, 0x5c, 0x7b, 0xa4, 0x00, 0x0a, 0xb4, 0x5c, 0x7b, 0x5c, 0x7b, 0x4f, - 0x03, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x00, 0x48, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, - 0x00, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x07, 0x00, 0x00, 0x00, 0x00, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x6c, 0x81, 0x15, + 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x6c, 0x03, 0x41, 0x2b, + 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x2c, 0x56, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x6c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x56, 0x7a, 0x9e, 0x26, 0x06, + 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x01, 0x2b, 0x2b, 0x4f, 0x56, 0x56, + 0x2c, 0x2b, 0x7f, 0x56, 0x56, 0x39, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x2b, + 0x2b, 0x4f, 0x56, 0x56, 0x2c, 0x2b, 0x7f, 0x56, 0x56, 0x81, 0x37, 0x75, + 0x5b, 0x7b, 0x5c, 0x2b, 0x2b, 0x4f, 0x56, 0x56, 0x02, 0xac, 0x04, 0x00, + 0x00, 0x39, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x2b, 0x2b, 0x4f, 0x56, 0x56, + 0x2c, 0x2b, 0x2b, 0x56, 0x56, 0x32, 0x13, 0x81, 0x57, 0x00, 0x6f, 0x81, + 0x7e, 0xc9, 0xd7, 0x7e, 0x2d, 0x81, 0x81, 0x0e, 0x7e, 0x39, 0x7f, 0x6f, + 0x57, 0x00, 0x81, 0x81, 0x7e, 0x15, 0x00, 0x7e, 0x03, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x2b, 0x24, + 0x2b, 0x97, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2a, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x80, 0x81, + 0x81, 0x81, 0x81, 0x39, 0xbb, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0xc9, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xd0, 0x0d, 0x00, 0x4e, 0x31, 0x02, + 0xb4, 0xc1, 0xc1, 0xd7, 0xd7, 0x24, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0xd7, 0xd7, 0x53, 0xc1, 0x47, 0xd4, 0xd7, 0xd7, 0xd7, + 0x05, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x07, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x79, 0x5c, 0x7b, 0x5c, 0x7b, 0x4f, 0x7b, 0x5c, + 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, + 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x2d, 0x2b, 0x2b, 0x79, 0x14, 0x5c, + 0x7b, 0x5c, 0x2d, 0x79, 0x2a, 0x5c, 0x27, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, + 0x7b, 0xa4, 0x00, 0x0a, 0xb4, 0x5c, 0x7b, 0x5c, 0x7b, 0x4f, 0x03, 0x2a, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x00, 0x48, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x00, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x27, 0x51, 0x6f, 0x77, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, - 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x8e, 0x92, - 0x97, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xb4, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x27, 0x51, 0x6f, 0x77, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x7f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x8e, 0x92, 0x97, 0x00, + 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, + 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1147,23 +1240,23 @@ unsigned char STDLIB_WASM[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc6, 0xc9, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, + 0x00, 0xc6, 0xc9, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, - 0x00, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0x00, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1174,36 +1267,100 @@ unsigned char STDLIB_WASM[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x20, 0x00, - 0x00, 0x02, 0x20, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x04, 0x20, 0x00, - 0x00, 0x05, 0x20, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, - 0x00, 0x09, 0x20, 0x00, 0x00, 0x0a, 0x20, 0x00, 0x00, 0x28, 0x20, 0x00, - 0x00, 0x29, 0x20, 0x00, 0x00, 0x5f, 0x20, 0x00, 0x00, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x01, 0x09, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x65, 0x72, 0x73, 0x02, 0x08, 0x6c, 0x61, 0x6e, 0x67, - 0x75, 0x61, 0x67, 0x65, 0x01, 0x03, 0x43, 0x31, 0x31, 0x00, 0x0c, 0x70, - 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x2d, 0x62, 0x79, 0x01, - 0x05, 0x63, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x31, 0x39, 0x2e, 0x31, 0x2e, - 0x35, 0x2d, 0x77, 0x61, 0x73, 0x69, 0x2d, 0x73, 0x64, 0x6b, 0x20, 0x28, - 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x6c, 0x76, 0x6d, 0x2f, - 0x6c, 0x6c, 0x76, 0x6d, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x20, 0x61, 0x62, 0x34, 0x62, 0x35, 0x61, 0x32, 0x64, 0x62, 0x35, 0x38, - 0x32, 0x39, 0x35, 0x38, 0x61, 0x66, 0x31, 0x65, 0x65, 0x33, 0x30, 0x38, - 0x61, 0x37, 0x39, 0x30, 0x63, 0x66, 0x64, 0x62, 0x34, 0x32, 0x62, 0x64, - 0x32, 0x34, 0x37, 0x32, 0x30, 0x29, 0x00, 0x67, 0x0f, 0x74, 0x61, 0x72, + 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x85, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x02, + 0x20, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x05, + 0x20, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x09, + 0x20, 0x00, 0x00, 0x0a, 0x20, 0x00, 0x00, 0x28, 0x20, 0x00, 0x00, 0x29, + 0x20, 0x00, 0x00, 0x5f, 0x20, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0xe8, 0xc2, 0x04, 0x0b, 0x04, 0x00, 0x00, + 0x02, 0x00, 0x00, 0xb7, 0x05, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x00, 0x0c, + 0x0b, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x2e, 0x77, 0x61, 0x73, 0x6d, + 0x01, 0xd9, 0x04, 0x2d, 0x00, 0x2a, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x31, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x67, 0x65, 0x74, + 0x01, 0x30, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, + 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x67, + 0x65, 0x74, 0x02, 0x2b, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x31, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x03, + 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c, + 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x04, 0x13, 0x75, 0x6e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x77, 0x65, 0x61, 0x6b, 0x3a, 0x6d, + 0x61, 0x69, 0x6e, 0x05, 0x12, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, + 0x69, 0x6e, 0x69, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x06, + 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x07, 0x0a, 0x72, 0x65, 0x73, + 0x65, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x08, 0x06, 0x6d, 0x61, 0x6c, + 0x6c, 0x6f, 0x63, 0x09, 0x04, 0x66, 0x72, 0x65, 0x65, 0x0a, 0x06, 0x63, + 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x0b, 0x07, 0x72, 0x65, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x0c, 0x05, 0x5f, 0x45, 0x78, 0x69, 0x74, 0x0d, 0x0b, 0x5f, + 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x76, 0x6f, 0x69, 0x64, 0x0e, 0x0f, + 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, + 0x67, 0x65, 0x74, 0x0f, 0x15, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x67, + 0x65, 0x74, 0x10, 0x10, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x70, + 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x11, 0x0e, 0x5f, 0x5f, + 0x77, 0x61, 0x73, 0x69, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x5f, 0x74, 0x70, + 0x12, 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x13, 0x11, 0x5f, 0x5f, 0x77, + 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x74, 0x6f, + 0x72, 0x73, 0x14, 0x06, 0x73, 0x74, 0x72, 0x6c, 0x65, 0x6e, 0x15, 0x08, + 0x69, 0x73, 0x77, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x16, 0x06, 0x6d, 0x65, + 0x6d, 0x63, 0x6d, 0x70, 0x17, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x68, 0x72, + 0x18, 0x06, 0x73, 0x74, 0x72, 0x63, 0x6d, 0x70, 0x19, 0x08, 0x74, 0x6f, + 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x1a, 0x07, 0x63, 0x61, 0x73, 0x65, + 0x6d, 0x61, 0x70, 0x1b, 0x08, 0x74, 0x6f, 0x77, 0x75, 0x70, 0x70, 0x65, + 0x72, 0x1c, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x6d, 0x70, 0x1d, 0x08, + 0x69, 0x73, 0x77, 0x75, 0x70, 0x70, 0x65, 0x72, 0x1e, 0x07, 0x6d, 0x65, + 0x6d, 0x6d, 0x6f, 0x76, 0x65, 0x1f, 0x06, 0x6d, 0x65, 0x6d, 0x73, 0x65, + 0x74, 0x20, 0x08, 0x69, 0x73, 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x21, + 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x70, 0x79, 0x22, 0x07, 0x69, 0x73, 0x62, + 0x6c, 0x61, 0x6e, 0x6b, 0x23, 0x08, 0x69, 0x73, 0x77, 0x62, 0x6c, 0x61, + 0x6e, 0x6b, 0x24, 0x08, 0x69, 0x73, 0x77, 0x64, 0x69, 0x67, 0x69, 0x74, + 0x25, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x61, 0x74, 0x26, 0x09, 0x5f, + 0x5f, 0x73, 0x74, 0x70, 0x6e, 0x63, 0x70, 0x79, 0x27, 0x07, 0x73, 0x74, + 0x72, 0x6e, 0x63, 0x70, 0x79, 0x28, 0x09, 0x69, 0x73, 0x77, 0x78, 0x64, + 0x69, 0x67, 0x69, 0x74, 0x29, 0x06, 0x77, 0x63, 0x73, 0x6c, 0x65, 0x6e, + 0x2a, 0x06, 0x77, 0x63, 0x73, 0x63, 0x68, 0x72, 0x2b, 0x08, 0x69, 0x73, + 0x77, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x08, 0x69, 0x73, 0x77, 0x61, + 0x6c, 0x6e, 0x75, 0x6d, 0x07, 0x33, 0x02, 0x00, 0x0f, 0x5f, 0x5f, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x01, 0x1f, 0x47, 0x4f, 0x54, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x5f, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x09, 0x11, 0x02, + 0x00, 0x07, 0x2e, 0x72, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x01, 0x05, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x00, 0x8e, 0x01, 0x09, 0x70, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x65, 0x72, 0x73, 0x02, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, + 0x61, 0x67, 0x65, 0x01, 0x03, 0x43, 0x31, 0x31, 0x00, 0x0c, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x2d, 0x62, 0x79, 0x01, 0x05, + 0x63, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x32, 0x31, 0x2e, 0x31, 0x2e, 0x34, + 0x2d, 0x77, 0x61, 0x73, 0x69, 0x2d, 0x73, 0x64, 0x6b, 0x20, 0x28, 0x68, + 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x6c, 0x76, 0x6d, 0x2f, 0x6c, + 0x6c, 0x76, 0x6d, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x32, 0x32, 0x32, 0x66, 0x63, 0x31, 0x31, 0x66, 0x32, 0x62, 0x38, 0x66, + 0x32, 0x35, 0x66, 0x36, 0x61, 0x30, 0x66, 0x34, 0x39, 0x37, 0x36, 0x32, + 0x37, 0x32, 0x65, 0x66, 0x31, 0x62, 0x62, 0x37, 0x62, 0x66, 0x34, 0x39, + 0x35, 0x32, 0x31, 0x64, 0x29, 0x00, 0xa4, 0x01, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x06, 0x2b, 0x0f, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x2b, 0x0b, 0x62, 0x75, 0x6c, 0x6b, - 0x2d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2b, 0x08, 0x73, 0x69, 0x67, - 0x6e, 0x2d, 0x65, 0x78, 0x74, 0x2b, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2b, 0x0a, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2b, 0x0f, - 0x62, 0x75, 0x6c, 0x6b, 0x2d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2d, - 0x6f, 0x70, 0x74 + 0x09, 0x2b, 0x0b, 0x62, 0x75, 0x6c, 0x6b, 0x2d, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x2b, 0x0f, 0x62, 0x75, 0x6c, 0x6b, 0x2d, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x2d, 0x6f, 0x70, 0x74, 0x2b, 0x16, 0x63, 0x61, 0x6c, + 0x6c, 0x2d, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x2d, 0x6f, + 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x6e, 0x67, 0x2b, 0x0e, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x64, 0x65, 0x64, 0x2d, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x2b, + 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2b, + 0x0f, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x73, 0x2b, 0x13, 0x6e, 0x6f, 0x6e, 0x74, 0x72, 0x61, + 0x70, 0x70, 0x69, 0x6e, 0x67, 0x2d, 0x66, 0x70, 0x74, 0x6f, 0x69, 0x6e, + 0x74, 0x2b, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2b, 0x08, 0x73, 0x69, 0x67, 0x6e, + 0x2d, 0x65, 0x78, 0x74 }; -unsigned int STDLIB_WASM_LEN = 14463; +unsigned int STDLIB_WASM_LEN = 16348; From eea85f4eff58d2e5a63ce6b197689bde2c1a5ac6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Jan 2026 16:19:58 +0000 Subject: [PATCH 648/663] build(deps): bump clap from 4.5.53 to 4.5.54 in the cargo group Bumps the cargo group with 1 update: [clap](https://github.com/clap-rs/clap). Updates `clap` from 4.5.53 to 4.5.54 - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.53...clap_complete-v4.5.54) --- updated-dependencies: - dependency-name: clap dependency-version: 4.5.54 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9cb3dd33..6973626b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -241,9 +241,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.53" +version = "4.5.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" +checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" dependencies = [ "clap_builder", "clap_derive", @@ -251,9 +251,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.53" +version = "4.5.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" +checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" dependencies = [ "anstream", "anstyle", diff --git a/Cargo.toml b/Cargo.toml index 9201c5fa..84dccaac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -107,7 +107,7 @@ anstyle = "1.0.13" anyhow = "1.0.100" bstr = "1.12.0" cc = "1.2.51" -clap = { version = "4.5.53", features = [ +clap = { version = "4.5.54", features = [ "cargo", "derive", "env", From 630fa52717f2c575a53e21b1d324ade8e528b0bd Mon Sep 17 00:00:00 2001 From: Kevin Wang Date: Wed, 7 Jan 2026 23:27:37 +0000 Subject: [PATCH 649/663] fix(templates): fix python free-threading compatibility --- crates/cli/src/init.rs | 10 +++++++++- crates/cli/src/templates/setup.py | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index 00b7657b..70ca25af 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -959,11 +959,19 @@ pub fn generate_grammar_files( allow_update, |path| generate_file(path, SETUP_PY_TEMPLATE, language_name, &generate_opts), |path| { - let contents = fs::read_to_string(path)?; + let mut contents = fs::read_to_string(path)?; if !contents.contains("build_ext") { info!("Replacing setup.py"); generate_file(path, SETUP_PY_TEMPLATE, language_name, &generate_opts)?; } + if !contents.contains(" and not get_config_var") { + info!("Updating Python free-threading support in setup.py"); + contents = contents.replace( + r#"startswith("cp"):"#, + r#"startswith("cp") and not get_config_var("Py_GIL_DISABLED"):"# + ); + write_file(path, contents)?; + } Ok(()) }, )?; diff --git a/crates/cli/src/templates/setup.py b/crates/cli/src/templates/setup.py index 7f92eaee..bcf184b7 100644 --- a/crates/cli/src/templates/setup.py +++ b/crates/cli/src/templates/setup.py @@ -32,7 +32,7 @@ class BuildExt(build_ext): class BdistWheel(bdist_wheel): def get_tag(self): python, abi, platform = super().get_tag() - if python.startswith("cp"): + if python.startswith("cp") and not get_config_var("Py_GIL_DISABLED"): python, abi = "cp310", "abi3" return python, abi, platform From aefae11c0ddab2e47d2a00aee00a257f93b8ef30 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Sat, 10 Jan 2026 04:20:16 -0500 Subject: [PATCH 650/663] fix(build): define `_BSD_SOURCE` System endian conversion macros are gated behind this feature flag for older versions of GLIBC. `_BSD_SOURCE` and `_SVID_SOURCE` were deprecated and replaced with `_DEFAULT_SOURCE` starting with GLIBC 2.19. --- CMakeLists.txt | 2 +- Makefile | 2 +- Package.swift | 1 + build.zig | 1 + crates/xtask/src/build_wasm.rs | 1 + lib/binding_rust/build.rs | 1 + 6 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b40ac55a..f11895c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,7 +81,7 @@ set_target_properties(tree-sitter SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}" DEFINE_SYMBOL "") -target_compile_definitions(tree-sitter PRIVATE _POSIX_C_SOURCE=200112L _DEFAULT_SOURCE _DARWIN_C_SOURCE) +target_compile_definitions(tree-sitter PRIVATE _POSIX_C_SOURCE=200112L _DEFAULT_SOURCE _BSD_SOURCE _DARWIN_C_SOURCE) include(GNUInstallDirs) diff --git a/Makefile b/Makefile index d0b402f0..2098d275 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ OBJ := $(SRC:.c=.o) ARFLAGS := rcs CFLAGS ?= -O3 -Wall -Wextra -Wshadow -Wpedantic -Werror=incompatible-pointer-types override CFLAGS += -std=c11 -fPIC -fvisibility=hidden -override CFLAGS += -D_POSIX_C_SOURCE=200112L -D_DEFAULT_SOURCE -D_DARWIN_C_SOURCE +override CFLAGS += -D_POSIX_C_SOURCE=200112L -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_DARWIN_C_SOURCE override CFLAGS += -Ilib/src -Ilib/src/wasm -Ilib/include # ABI versioning diff --git a/Package.swift b/Package.swift index a92d3d14..fb6c6e95 100644 --- a/Package.swift +++ b/Package.swift @@ -27,6 +27,7 @@ let package = Package( .headerSearchPath("src"), .define("_POSIX_C_SOURCE", to: "200112L"), .define("_DEFAULT_SOURCE"), + .define("_BSD_SOURCE"), .define("_DARWIN_C_SOURCE"), ]), ], diff --git a/build.zig b/build.zig index bd7a0721..9bb1e818 100644 --- a/build.zig +++ b/build.zig @@ -40,6 +40,7 @@ pub fn build(b: *std.Build) !void { lib.root_module.addCMacro("_POSIX_C_SOURCE", "200112L"); lib.root_module.addCMacro("_DEFAULT_SOURCE", ""); + lib.root_module.addCMacro("_BSD_SOURCE", ""); lib.root_module.addCMacro("_DARWIN_C_SOURCE", ""); if (wasm) { diff --git a/crates/xtask/src/build_wasm.rs b/crates/xtask/src/build_wasm.rs index 183718a6..fbb231ce 100644 --- a/crates/xtask/src/build_wasm.rs +++ b/crates/xtask/src/build_wasm.rs @@ -199,6 +199,7 @@ pub fn run_wasm(args: &BuildWasm) -> Result<()> { "-D", "NDEBUG=", "-D", "_POSIX_C_SOURCE=200112L", "-D", "_DEFAULT_SOURCE=", + "-D", "_BSD_SOURCE=", "-D", "_DARWIN_C_SOURCE=", "-I", "lib/src", "-I", "lib/include", diff --git a/lib/binding_rust/build.rs b/lib/binding_rust/build.rs index 624001bc..57c5bc94 100644 --- a/lib/binding_rust/build.rs +++ b/lib/binding_rust/build.rs @@ -49,6 +49,7 @@ fn main() { .include(&include_path) .define("_POSIX_C_SOURCE", "200112L") .define("_DEFAULT_SOURCE", None) + .define("_BSD_SOURCE", None) .define("_DARWIN_C_SOURCE", None) .warnings(false) .file(src_path.join("lib.c")) From 6c05cdfb0c56db9c6bf6417352b7a12e1e26633a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Jan 2026 02:06:21 +0000 Subject: [PATCH 651/663] build(deps): bump the cargo group with 3 updates Bumps the cargo group with 3 updates: [cc](https://github.com/rust-lang/cc-rs), [clap_complete](https://github.com/clap-rs/clap) and [serde_json](https://github.com/serde-rs/json). Updates `cc` from 1.2.51 to 1.2.52 - [Release notes](https://github.com/rust-lang/cc-rs/releases) - [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md) - [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.51...cc-v1.2.52) Updates `clap_complete` from 4.5.64 to 4.5.65 - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.64...clap_complete-v4.5.65) Updates `serde_json` from 1.0.148 to 1.0.149 - [Release notes](https://github.com/serde-rs/json/releases) - [Commits](https://github.com/serde-rs/json/compare/v1.0.148...v1.0.149) --- updated-dependencies: - dependency-name: cc dependency-version: 1.2.52 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: clap_complete dependency-version: 4.5.65 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: serde_json dependency-version: 1.0.149 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 16 ++++++++-------- Cargo.toml | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6973626b..4bb4214f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -187,9 +187,9 @@ checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "cc" -version = "1.2.51" +version = "1.2.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a0aeaff4ff1a90589618835a598e545176939b97874f7abc7851caa0618f203" +checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3" dependencies = [ "find-msvc-tools", "shlex", @@ -263,9 +263,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.64" +version = "4.5.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c0da80818b2d95eca9aa614a30783e42f62bf5fdfee24e68cfb960b071ba8d1" +checksum = "430b4dc2b5e3861848de79627b2bedc9f3342c7da5173a14eaa5d0f8dc18ae5d" dependencies = [ "clap", ] @@ -664,9 +664,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645cbb3a84e60b7531617d5ae4e57f7e27308f6445f5abf653209ea76dec8dff" +checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41" [[package]] name = "fnv" @@ -1701,9 +1701,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.148" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3084b546a1dd6289475996f182a22aba973866ea8e8b02c51d9f46b1336a22da" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "indexmap", "itoa", diff --git a/Cargo.toml b/Cargo.toml index 84dccaac..5730ddf2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -106,7 +106,7 @@ ansi_colours = "1.2.3" anstyle = "1.0.13" anyhow = "1.0.100" bstr = "1.12.0" -cc = "1.2.51" +cc = "1.2.52" clap = { version = "4.5.54", features = [ "cargo", "derive", @@ -115,7 +115,7 @@ clap = { version = "4.5.54", features = [ "string", "unstable-styles", ] } -clap_complete = "4.5.62" +clap_complete = "4.5.65" clap_complete_nushell = "4.5.10" crc32fast = "1.5.0" ctor = "0.2.9" @@ -140,7 +140,7 @@ rustc-hash = "2.1.1" schemars = "1.0.5" semver = { version = "1.0.27", features = ["serde"] } serde = { version = "1.0.219", features = ["derive"] } -serde_json = { version = "1.0.147", features = ["preserve_order"] } +serde_json = { version = "1.0.149", features = ["preserve_order"] } similar = "2.7.0" smallbitvec = "2.6.0" streaming-iterator = "0.1.9" From 1a88b26a10f81e4623a82a8309bf1c48b1706954 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Mon, 12 Jan 2026 21:20:26 -0500 Subject: [PATCH 652/663] docs: note requirement to rebuild wasm stdlib --- docs/src/6-contributing.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/src/6-contributing.md b/docs/src/6-contributing.md index 5fb8271f..0fad6581 100644 --- a/docs/src/6-contributing.md +++ b/docs/src/6-contributing.md @@ -93,7 +93,8 @@ cargo xtask build-wasm-stdlib This command looks for the [Wasi SDK][wasi_sdk] indicated by the `TREE_SITTER_WASI_SDK_PATH` environment variable. If you don't have the binary, it can be downloaded from wasi-sdk's [releases][wasi-sdk-releases] -page. +page. Note that any changes to `crates/language/wasm/**` requires rebuilding the tree-sitter Wasm stdlib via +`cargo xtask build-wasm-stdlib`. ### Debugging From e64e74d5eda150043b0027a712b04d54d49d4cdd Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Mon, 12 Jan 2026 22:10:09 -0500 Subject: [PATCH 653/663] docs: adhere to 120 new word column limit for docs --- crates/cli/README.md | 9 ++++-- docs/src/3-syntax-highlighting.md | 5 ++- docs/src/4-code-navigation.md | 9 +++--- docs/src/cli/build.md | 7 +++-- docs/src/cli/dump-languages.md | 7 +++-- docs/src/cli/generate.md | 16 ++++++---- docs/src/cli/highlight.md | 3 +- docs/src/cli/index.md | 3 +- docs/src/cli/init.md | 14 ++++++--- docs/src/cli/parse.md | 6 ++-- docs/src/cli/playground.md | 4 +-- docs/src/cli/query.md | 7 +++-- docs/src/cli/tags.md | 3 +- docs/src/cli/test.md | 3 +- docs/src/cli/version.md | 8 ++--- .../src/creating-parsers/2-the-grammar-dsl.md | 24 +++++++------- .../creating-parsers/3-writing-the-grammar.md | 31 ++++++++++--------- .../creating-parsers/4-external-scanners.md | 24 +++++++------- docs/src/creating-parsers/5-writing-tests.md | 8 ++--- docs/src/creating-parsers/index.md | 4 +-- docs/src/index.md | 3 +- docs/src/using-parsers/2-basic-parsing.md | 11 ++++--- docs/src/using-parsers/3-advanced-parsing.md | 4 +-- docs/src/using-parsers/6-static-node-types.md | 6 ++-- docs/src/using-parsers/7-abi-versions.md | 7 +++-- docs/src/using-parsers/index.md | 4 +-- docs/src/using-parsers/queries/1-syntax.md | 16 +++++----- .../queries/3-predicates-and-directives.md | 12 +++---- 28 files changed, 143 insertions(+), 115 deletions(-) diff --git a/crates/cli/README.md b/crates/cli/README.md index 5a399f08..54d0ce07 100644 --- a/crates/cli/README.md +++ b/crates/cli/README.md @@ -7,7 +7,8 @@ [npmjs.com]: https://www.npmjs.org/package/tree-sitter-cli [npmjs.com badge]: https://img.shields.io/npm/v/tree-sitter-cli.svg?color=%23BF4A4A -The Tree-sitter CLI allows you to develop, test, and use Tree-sitter grammars from the command line. It works on `MacOS`, `Linux`, and `Windows`. +The Tree-sitter CLI allows you to develop, test, and use Tree-sitter grammars from the command line. It works on `MacOS`, +`Linux`, and `Windows`. ### Installation @@ -34,9 +35,11 @@ The `tree-sitter` binary itself has no dependencies, but specific commands have ### Commands -* `generate` - The `tree-sitter generate` command will generate a Tree-sitter parser based on the grammar in the current working directory. See [the documentation] for more information. +* `generate` - The `tree-sitter generate` command will generate a Tree-sitter parser based on the grammar in the current +working directory. See [the documentation] for more information. -* `test` - The `tree-sitter test` command will run the unit tests for the Tree-sitter parser in the current working directory. See [the documentation] for more information. +* `test` - The `tree-sitter test` command will run the unit tests for the Tree-sitter parser in the current working directory. +See [the documentation] for more information. * `parse` - The `tree-sitter parse` command will parse a file (or list of files) using Tree-sitter parsers. diff --git a/docs/src/3-syntax-highlighting.md b/docs/src/3-syntax-highlighting.md index de5308a0..c6356fbb 100644 --- a/docs/src/3-syntax-highlighting.md +++ b/docs/src/3-syntax-highlighting.md @@ -73,9 +73,8 @@ The behaviors of these three files are described in the next section. ## Queries -Tree-sitter's syntax highlighting system is based on *tree queries*, which are a general system for pattern-matching on Tree-sitter's -syntax trees. See [this section][pattern matching] of the documentation for more information -about tree queries. +Tree-sitter's syntax highlighting system is based on *tree queries*, which are a general system for pattern-matching on +Tree-sitter's syntax trees. See [this section][pattern matching] of the documentation for more information about tree queries. Syntax highlighting is controlled by *three* different types of query files that are usually included in the `queries` folder. The default names for the query files use the `.scm` file. We chose this extension because it commonly used for files written diff --git a/docs/src/4-code-navigation.md b/docs/src/4-code-navigation.md index 46d60307..02a9fa4d 100644 --- a/docs/src/4-code-navigation.md +++ b/docs/src/4-code-navigation.md @@ -3,7 +3,8 @@ Tree-sitter can be used in conjunction with its [query language][query language] as a part of code navigation systems. An example of such a system can be seen in the `tree-sitter tags` command, which emits a textual dump of the interesting syntactic nodes in its file argument. A notable application of this is GitHub's support for [search-based code navigation][gh search]. -This document exists to describe how to integrate with such systems, and how to extend this functionality to any language with a Tree-sitter grammar. +This document exists to describe how to integrate with such systems, and how to extend this functionality to any language +with a Tree-sitter grammar. ## Tagging and captures @@ -12,9 +13,9 @@ entities. Having found them, you use a syntax capture to label the entity and it The essence of a given tag lies in two pieces of data: the _role_ of the entity that is matched (i.e. whether it is a definition or a reference) and the _kind_ of that entity, which describes how the entity is used -(i.e. whether it's a class definition, function call, variable reference, and so on). Our convention is to use a syntax capture -following the `@role.kind` capture name format, and another inner capture, always called `@name`, that pulls out the name -of a given identifier. +(i.e. whether it's a class definition, function call, variable reference, and so on). Our convention is to use a syntax +capture following the `@role.kind` capture name format, and another inner capture, always called `@name`, that pulls out +the name of a given identifier. You may optionally include a capture named `@doc` to bind a docstring. For convenience purposes, the tagging system provides two built-in functions, `#select-adjacent!` and `#strip!` that are convenient for removing comment syntax from a docstring. diff --git a/docs/src/cli/build.md b/docs/src/cli/build.md index 6863f926..44ee8271 100644 --- a/docs/src/cli/build.md +++ b/docs/src/cli/build.md @@ -19,8 +19,8 @@ will attempt to build the parser in the current working directory. ### `-w/--wasm` Compile the parser as a Wasm module. This command looks for the [Wasi SDK][wasi_sdk] indicated by the `TREE_SITTER_WASI_SDK_PATH` -environment variable. If you don't have the binary, the CLI will attempt to download it for you to `/tree-sitter/wasi-sdk/`, where -`` is resolved according to the [XDG base directory][XDG] or Window's [Known_Folder_Locations][Known_Folder]. +environment variable. If you don't have the binary, the CLI will attempt to download it for you to `/tree-sitter/wasi-sdk/`, +where `` is resolved according to the [XDG base directory][XDG] or Window's [Known_Folder_Locations][Known_Folder]. ### `-o/--output` @@ -37,7 +37,8 @@ in the external scanner does so using their allocator. ### `-0/--debug` -Compile the parser with debug flags enabled. This is useful when debugging issues that require a debugger like `gdb` or `lldb`. +Compile the parser with debug flags enabled. This is useful when debugging issues that require a debugger like `gdb` or +`lldb`. [Known_Folder]: https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid [wasi_sdk]: https://github.com/WebAssembly/wasi-sdk diff --git a/docs/src/cli/dump-languages.md b/docs/src/cli/dump-languages.md index 1d1a6aaa..f29daa57 100644 --- a/docs/src/cli/dump-languages.md +++ b/docs/src/cli/dump-languages.md @@ -1,6 +1,8 @@ # `tree-sitter dump-languages` -The `dump-languages` command prints out a list of all the languages that the CLI knows about. This can be useful for debugging purposes, or for scripting. The paths to search comes from the config file's [`parser-directories`][parser-directories] object. +The `dump-languages` command prints out a list of all the languages that the CLI knows about. This can be useful for debugging +purposes, or for scripting. The paths to search comes from the config file's [`parser-directories`][parser-directories] +object. ```bash tree-sitter dump-languages [OPTIONS] # Aliases: langs @@ -10,6 +12,7 @@ tree-sitter dump-languages [OPTIONS] # Aliases: langs ### `--config-path` -The path to the configuration file. Ordinarily, the CLI will use the default location as explained in the [init-config](./init-config.md) command. This flag allows you to explicitly override that default, and use a config defined elsewhere. +The path to the configuration file. Ordinarily, the CLI will use the default location as explained in the [init-config](./init-config.md) +command. This flag allows you to explicitly override that default, and use a config defined elsewhere. [parser-directories]: ./init-config.md#parser-directories diff --git a/docs/src/cli/generate.md b/docs/src/cli/generate.md index 5ec02ad7..df9111f0 100644 --- a/docs/src/cli/generate.md +++ b/docs/src/cli/generate.md @@ -1,6 +1,7 @@ # `tree-sitter generate` -The most important command for grammar development is `tree-sitter generate`, which reads the grammar in structured form and outputs C files that can be compiled into a shared or static library (e.g., using the [`build`](./build.md) command). +The most important command for grammar development is `tree-sitter generate`, which reads the grammar in structured form +and outputs C files that can be compiled into a shared or static library (e.g., using the [`build`](./build.md) command). ```bash tree-sitter generate [OPTIONS] [GRAMMAR_PATH] # Aliases: gen, g @@ -8,7 +9,8 @@ tree-sitter generate [OPTIONS] [GRAMMAR_PATH] # Aliases: gen, g The optional `GRAMMAR_PATH` argument should point to the structured grammar, in one of two forms: - `grammar.js` a (ESM or CJS) JavaScript file; if the argument is omitted, it defaults to `./grammar.js`. -- `grammar.json` a structured representation of the grammar that is created as a byproduct of `generate`; this can be used to regenerate a missing `parser.c` without requiring a JavaScript runtime (useful when distributing parsers to consumers). +- `grammar.json` a structured representation of the grammar that is created as a byproduct of `generate`; this can be used +to regenerate a missing `parser.c` without requiring a JavaScript runtime (useful when distributing parsers to consumers). If there is an ambiguity or *local ambiguity* in your grammar, Tree-sitter will detect it during parser generation, and it will exit with a `Unresolved conflict` error message. To learn more about conflicts and how to handle them, see @@ -21,7 +23,8 @@ in the user guide. - `src/tree_sitter/parser.h` provides basic C definitions that are used in the generated `parser.c` file. - `src/tree_sitter/alloc.h` provides memory allocation macros that can be used in an external scanner. - `src/tree_sitter/array.h` provides array macros that can be used in an external scanner. -- `src/grammar.json` contains a structured representation of the grammar; can be used to regenerate the parser without having to re-evaluate the `grammar.js`. +- `src/grammar.json` contains a structured representation of the grammar; can be used to regenerate the parser without having +to re-evaluate the `grammar.js`. - `src/node-types.json` provides type information about individual syntax nodes; see the section on [`Static Node Types`](../using-parsers/6-static-node-types.md). @@ -29,8 +32,8 @@ in the user guide. ### `-l/--log` -Print the log of the parser generation process. This includes information such as what tokens are included in the error recovery state, -what keywords were extracted, what states were split and why, and the entry point state. +Print the log of the parser generation process. This includes information such as what tokens are included in the error +recovery state, what keywords were extracted, what states were split and why, and the entry point state. ### `--abi ` @@ -60,7 +63,8 @@ The path to the JavaScript runtime executable to use when generating the parser. Note that you can also set this with `TREE_SITTER_JS_RUNTIME`. Starting from version 0.26, you can also pass in `native` to use the experimental native QuickJS runtime that comes bundled with the CLI. This avoids the dependency on a JavaScript runtime entirely. The native QuickJS runtime is compatible -with ESM as well as with CommonJS in strict mode. If your grammar depends on `npm` to install dependencies such as base grammars, the native runtime can be used *after* running `npm install`. +with ESM as well as with CommonJS in strict mode. If your grammar depends on `npm` to install dependencies such as base +grammars, the native runtime can be used *after* running `npm install`. ### `--disable-optimization` diff --git a/docs/src/cli/highlight.md b/docs/src/cli/highlight.md index 82c9e25c..1a4ed1f6 100644 --- a/docs/src/cli/highlight.md +++ b/docs/src/cli/highlight.md @@ -52,7 +52,8 @@ The path to the directory containing the grammar. ### `--config-path ` -The path to an alternative configuration (`config.json`) file. See [the init-config command](./init-config.md) for more information. +The path to an alternative configuration (`config.json`) file. See [the init-config command](./init-config.md) for more +information. ### `-n/--test-number ` diff --git a/docs/src/cli/index.md b/docs/src/cli/index.md index 8b7659f0..042c0196 100644 --- a/docs/src/cli/index.md +++ b/docs/src/cli/index.md @@ -1,6 +1,7 @@ # CLI Overview -The `tree-sitter` command-line interface is used to create, manage, test, and build tree-sitter parsers. It is controlled by +The `tree-sitter` command-line interface is used to create, manage, test, and build tree-sitter parsers. It is controlled +by - a personal `tree-sitter/config.json` config file generated by [`tree-sitter init-config`](./init-config.md) - a parser `tree-sitter.json` config file generated by [`tree-sitter init`](./init.md). diff --git a/docs/src/cli/init.md b/docs/src/cli/init.md index d45c8e09..568bc98f 100644 --- a/docs/src/cli/init.md +++ b/docs/src/cli/init.md @@ -14,8 +14,11 @@ tree-sitter init [OPTIONS] # Aliases: i The following required files are always created if missing: -- `tree-sitter.json` - The main configuration file that determines how `tree-sitter` interacts with the grammar. If missing, the `init` command will prompt the user for the required fields. See [below](./init.md#structure-of-tree-sitterjson) for the full documentation of the structure of this file. -- `package.json` - The `npm` manifest for the parser. This file is required for some `tree-sitter` subcommands, and if the grammar has dependencies (e.g., another published base grammar that this grammar extends). +- `tree-sitter.json` - The main configuration file that determines how `tree-sitter` interacts with the grammar. If missing, +the `init` command will prompt the user for the required fields. See [below](./init.md#structure-of-tree-sitterjson) for +the full documentation of the structure of this file. +- `package.json` - The `npm` manifest for the parser. This file is required for some `tree-sitter` subcommands, and if the +grammar has dependencies (e.g., another published base grammar that this grammar extends). - `grammar.js` - An empty template for the main grammar file; see [the section on creating parsers](../2-creating-parser). ### Language bindings @@ -130,8 +133,8 @@ be picked up by the cli. These keys help to decide whether the language applies to a given file: -- `file-types` — An array of filename suffix strings (not including the dot). The grammar will be used for files whose names end with one of -these suffixes. Note that the suffix may match an *entire* filename. +- `file-types` — An array of filename suffix strings (not including the dot). The grammar will be used for files whose names +end with one of these suffixes. Note that the suffix may match an *entire* filename. - `first-line-regex` — A regex pattern that will be tested against the first line of a file to determine whether this language applies to the file. If present, this regex will be used for any file whose @@ -188,7 +191,8 @@ Each key is a language name, and the value is a boolean. Update outdated generated files, if possible. -**Note:** Existing files that may have been edited manually are _not_ updated in general. To force an update to such files, remove them and call `tree-sitter init -u` again. +**Note:** Existing files that may have been edited manually are _not_ updated in general. To force an update to such files, +remove them and call `tree-sitter init -u` again. ### `-p/--grammar-path ` diff --git a/docs/src/cli/parse.md b/docs/src/cli/parse.md index f18c2edb..2e9bc835 100644 --- a/docs/src/cli/parse.md +++ b/docs/src/cli/parse.md @@ -78,7 +78,8 @@ Suppress main output. ### `--edits ...` -Apply edits after parsing the file. Edits are in the form of `row,col|position delcount insert_text` where row and col, or position are 0-indexed. +Apply edits after parsing the file. Edits are in the form of `row,col|position delcount insert_text` where row and col, +or position are 0-indexed. ### `--encoding ` @@ -95,7 +96,8 @@ Output parsing results in a JSON format. ### `--config-path ` -The path to an alternative configuration (`config.json`) file. See [the init-config command](./init-config.md) for more information. +The path to an alternative configuration (`config.json`) file. See [the init-config command](./init-config.md) for more +information. ### `-n/--test-number ` diff --git a/docs/src/cli/playground.md b/docs/src/cli/playground.md index 7c2ef598..c0bfb495 100644 --- a/docs/src/cli/playground.md +++ b/docs/src/cli/playground.md @@ -7,8 +7,8 @@ tree-sitter playground [OPTIONS] # Aliases: play, pg, web-ui ``` ```admonish note -For this to work, you must have already built the parser as a Wasm module. This can be done with the [`build`](./build.md) subcommand -(`tree-sitter build --wasm`). +For this to work, you must have already built the parser as a Wasm module. This can be done with the [`build`](./build.md) +subcommand (`tree-sitter build --wasm`). ``` ## Options diff --git a/docs/src/cli/query.md b/docs/src/cli/query.md index 08ff2654..fbd6dafd 100644 --- a/docs/src/cli/query.md +++ b/docs/src/cli/query.md @@ -47,8 +47,8 @@ The range of rows in which the query will be executed. The format is `start_row: ### `--containing-row-range ` -The range of rows in which the query will be executed. Only the matches that are fully contained within the provided row range -will be returned. +The range of rows in which the query will be executed. Only the matches that are fully contained within the provided row +range will be returned. ### `--scope ` @@ -64,7 +64,8 @@ Whether to run query tests or not. ### `--config-path ` -The path to an alternative configuration (`config.json`) file. See [the init-config command](./init-config.md) for more information. +The path to an alternative configuration (`config.json`) file. See [the init-config command](./init-config.md) for more +information. ### `-n/--test-number ` diff --git a/docs/src/cli/tags.md b/docs/src/cli/tags.md index a48fabb4..8275237e 100644 --- a/docs/src/cli/tags.md +++ b/docs/src/cli/tags.md @@ -31,7 +31,8 @@ The path to the directory containing the grammar. ### `--config-path ` -The path to an alternative configuration (`config.json`) file. See [the init-config command](./init-config.md) for more information. +The path to an alternative configuration (`config.json`) file. See [the init-config command](./init-config.md) for more +information. ### `-n/--test-number ` diff --git a/docs/src/cli/test.md b/docs/src/cli/test.md index f8b8a02d..7e662f60 100644 --- a/docs/src/cli/test.md +++ b/docs/src/cli/test.md @@ -63,7 +63,8 @@ When using the `--debug-graph` option, open the log file in the default browser. ### `--config-path ` -The path to an alternative configuration (`config.json`) file. See [the init-config command](./init-config.md) for more information. +The path to an alternative configuration (`config.json`) file. See [the init-config command](./init-config.md) for more +information. ### `--show-fields` diff --git a/docs/src/cli/version.md b/docs/src/cli/version.md index c2d526a7..39cda84a 100644 --- a/docs/src/cli/version.md +++ b/docs/src/cli/version.md @@ -25,11 +25,9 @@ tree-sitter version --bump minor # minor bump tree-sitter version --bump major # major bump ``` -As a grammar author, you should keep the version of your grammar in sync across -different bindings. However, doing so manually is error-prone and tedious, so -this command takes care of the burden. If you are using a version control system, -it is recommended to commit the changes made by this command, and to tag the -commit with the new version. +As a grammar author, you should keep the version of your grammar in sync across different bindings. However, doing so manually +is error-prone and tedious, so this command takes care of the burden. If you are using a version control system, it is recommended +to commit the changes made by this command, and to tag the commit with the new version. To print the current version without bumping it, use: diff --git a/docs/src/creating-parsers/2-the-grammar-dsl.md b/docs/src/creating-parsers/2-the-grammar-dsl.md index d210619b..0592c6bd 100644 --- a/docs/src/creating-parsers/2-the-grammar-dsl.md +++ b/docs/src/creating-parsers/2-the-grammar-dsl.md @@ -17,8 +17,8 @@ DSL through the `RustRegex` class. Simply pass your regex pattern as a string: ``` Unlike JavaScript's builtin `RegExp` class, which takes a pattern and flags as separate arguments, `RustRegex` only - accepts a single pattern string. While it doesn't support separate flags, you can use inline flags within the pattern itself. - For more details about Rust's regex syntax and capabilities, check out the [Rust regex documentation][rust regex]. + accepts a single pattern string. While it doesn't support separate flags, you can use inline flags within the pattern + itself. For more details about Rust's regex syntax and capabilities, check out the [Rust regex documentation][rust regex]. ```admonish note Only a subset of the Regex engine is actually supported. This is due to certain features like lookahead and lookaround @@ -50,10 +50,10 @@ The previous `repeat` rule is implemented in `repeat1` but is included because i - **Options : `optional(rule)`** — This function creates a rule that matches *zero or one* occurrence of a given rule. It is analogous to the `[x]` (square bracket) syntax in EBNF notation. -- **Precedence : `prec(number, rule)`** — This function marks the given rule with a numerical precedence, which will be used -to resolve [*LR(1) Conflicts*][lr-conflict] at parser-generation time. When two rules overlap in a way that represents either -a true ambiguity or a *local* ambiguity given one token of lookahead, Tree-sitter will try to resolve the conflict by matching -the rule with the higher precedence. The default precedence of all rules is zero. This works similarly to the +- **Precedence : `prec(number, rule)`** — This function marks the given rule with a numerical precedence, which will be +used to resolve [*LR(1) Conflicts*][lr-conflict] at parser-generation time. When two rules overlap in a way that represents +either a true ambiguity or a *local* ambiguity given one token of lookahead, Tree-sitter will try to resolve the conflict +by matching the rule with the higher precedence. The default precedence of all rules is zero. This works similarly to the [precedence directives][yacc-prec] in Yacc grammars. This function can also be used to assign lexical precedence to a given @@ -115,8 +115,8 @@ want to create syntax tree nodes at runtime. - **`conflicts`** — an array of arrays of rule names. Each inner array represents a set of rules that's involved in an *LR(1) conflict* that is *intended to exist* in the grammar. When these conflicts occur at runtime, Tree-sitter will use -the GLR algorithm to explore all the possible interpretations. If *multiple* parses end up succeeding, Tree-sitter will pick -the subtree whose corresponding rule has the highest total *dynamic precedence*. +the GLR algorithm to explore all the possible interpretations. If *multiple* parses end up succeeding, Tree-sitter will +pick the subtree whose corresponding rule has the highest total *dynamic precedence*. - **`externals`** — an array of token names which can be returned by an [*external scanner*][external-scanners]. External scanners allow you to write custom C code which runs during the lexing @@ -139,10 +139,10 @@ for more details. array of reserved rules. The reserved rule in the array must be a terminal token meaning it must be a string, regex, token, or terminal rule. The reserved rule must also exist and be used in the grammar, specifying arbitrary tokens will not work. The *first* reserved word set in the object is the global word set, meaning it applies to every rule in every parse state. -However, certain keywords are contextual, depending on the rule. For example, in JavaScript, keywords are typically not allowed -as ordinary variables, however, they *can* be used as a property name. In this situation, the `reserved` function would be used, -and the word set to pass in would be the name of the word set that is declared in the `reserved` object that corresponds to an -empty array, signifying *no* keywords are reserved. +However, certain keywords are contextual, depending on the rule. For example, in JavaScript, keywords are typically not +allowed as ordinary variables, however, they *can* be used as a property name. In this situation, the `reserved` function +would be used, and the word set to pass in would be the name of the word set that is declared in the `reserved` object that +corresponds to an empty array, signifying *no* keywords are reserved. [bison-dprec]: https://www.gnu.org/software/bison/manual/html_node/Generalized-LR-Parsing.html [ebnf]: https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form diff --git a/docs/src/creating-parsers/3-writing-the-grammar.md b/docs/src/creating-parsers/3-writing-the-grammar.md index ebd2f5a4..5048ff5b 100644 --- a/docs/src/creating-parsers/3-writing-the-grammar.md +++ b/docs/src/creating-parsers/3-writing-the-grammar.md @@ -1,7 +1,7 @@ # Writing the Grammar -Writing a grammar requires creativity. There are an infinite number of CFGs (context-free grammars) that can be used to describe -any given language. To produce a good Tree-sitter parser, you need to create a grammar with two important properties: +Writing a grammar requires creativity. There are an infinite number of CFGs (context-free grammars) that can be used to +describe any given language. To produce a good Tree-sitter parser, you need to create a grammar with two important properties: 1. **An intuitive structure** — Tree-sitter's output is a [concrete syntax tree][cst]; each node in the tree corresponds directly to a [terminal or non-terminal symbol][non-terminal] in the grammar. So to produce an easy-to-analyze tree, there @@ -139,8 +139,8 @@ instead. It's often useful to check your progress by trying to parse some real c ## Structuring Rules Well Imagine that you were just starting work on the [Tree-sitter JavaScript parser][tree-sitter-javascript]. Naively, you might -try to directly mirror the structure of the [ECMAScript Language Spec][ecmascript-spec]. To illustrate the problem with this -approach, consider the following line of code: +try to directly mirror the structure of the [ECMAScript Language Spec][ecmascript-spec]. To illustrate the problem with +this approach, consider the following line of code: ```js return x + y; @@ -181,16 +181,17 @@ which are unrelated to the actual code. ## Standard Rule Names -Tree-sitter places no restrictions on how to name the rules of your grammar. It can be helpful, however, to follow certain conventions -used by many other established grammars in the ecosystem. Some of these well-established patterns are listed below: +Tree-sitter places no restrictions on how to name the rules of your grammar. It can be helpful, however, to follow certain +conventions used by many other established grammars in the ecosystem. Some of these well-established patterns are listed +below: - `source_file`: Represents an entire source file, this rule is commonly used as the root node for a grammar, -- `expression`/`statement`: Used to represent statements and expressions for a given language. Commonly defined as a choice between several -more specific sub-expression/sub-statement rules. +- `expression`/`statement`: Used to represent statements and expressions for a given language. Commonly defined as a choice +between several more specific sub-expression/sub-statement rules. - `block`: Used as the parent node for block scopes, with its children representing the block's contents. - `type`: Represents the types of a language such as `int`, `char`, and `void`. -- `identifier`: Used for constructs like variable names, function arguments, and object fields; this rule is commonly used as the `word` -token in grammars. +- `identifier`: Used for constructs like variable names, function arguments, and object fields; this rule is commonly used +as the `word` token in grammars. - `string`: Used to represent `"string literals"`. - `comment`: Used to represent comments, this rule is commonly used as an `extra`. @@ -308,9 +309,9 @@ This is where `prec.left` and `prec.right` come into use. We want to select the ## Using Conflicts -Sometimes, conflicts are actually desirable. In our JavaScript grammar, expressions and patterns can create intentional ambiguity. -A construct like `[x, y]` could be legitimately parsed as both an array literal (like in `let a = [x, y]`) or as a destructuring -pattern (like in `let [x, y] = arr`). +Sometimes, conflicts are actually desirable. In our JavaScript grammar, expressions and patterns can create intentional +ambiguity. A construct like `[x, y]` could be legitimately parsed as both an array literal (like in `let a = [x, y]`) or +as a destructuring pattern (like in `let [x, y] = arr`). ```js export default grammar({ @@ -564,8 +565,8 @@ as mentioned in the previous page, is `token(prec(N, ...))`. ## Keywords Many languages have a set of _keyword_ tokens (e.g. `if`, `for`, `return`), as well as a more general token (e.g. `identifier`) -that matches any word, including many of the keyword strings. For example, JavaScript has a keyword `instanceof`, which is -used as a binary operator, like this: +that matches any word, including many of the keyword strings. For example, JavaScript has a keyword `instanceof`, which +is used as a binary operator, like this: ```js if (a instanceof Something) b(); diff --git a/docs/src/creating-parsers/4-external-scanners.md b/docs/src/creating-parsers/4-external-scanners.md index 05268df7..6c89e221 100644 --- a/docs/src/creating-parsers/4-external-scanners.md +++ b/docs/src/creating-parsers/4-external-scanners.md @@ -143,10 +143,10 @@ the second argument, the current character will be treated as whitespace; whites associated with tokens emitted by the external scanner. - **`void (*mark_end)(TSLexer *)`** — A function for marking the end of the recognized token. This allows matching tokens -that require multiple characters of lookahead. By default, (if you don't call `mark_end`), any character that you moved past -using the `advance` function will be included in the size of the token. But once you call `mark_end`, then any later calls -to `advance` will _not_ increase the size of the returned token. You can call `mark_end` multiple times to increase the size -of the token. +that require multiple characters of lookahead. By default, (if you don't call `mark_end`), any character that you moved +past using the `advance` function will be included in the size of the token. But once you call `mark_end`, then any later +calls to `advance` will _not_ increase the size of the returned token. You can call `mark_end` multiple times to increase +the size of the token. - **`uint32_t (*get_column)(TSLexer *)`** — A function for querying the current column position of the lexer. It returns the number of codepoints since the start of the current line. The codepoint position is recalculated on every call to this @@ -185,9 +185,9 @@ if (valid_symbols[INDENT] || valid_symbols[DEDENT]) { ### Allocator -Instead of using libc's `malloc`, `calloc`, `realloc`, and `free`, you should use the versions prefixed with `ts_` from `tree_sitter/alloc.h`. -These macros can allow a potential consumer to override the default allocator with their own implementation, but by default -will use the libc functions. +Instead of using libc's `malloc`, `calloc`, `realloc`, and `free`, you should use the versions prefixed with `ts_` from +`tree_sitter/alloc.h`. These macros can allow a potential consumer to override the default allocator with their own implementation, +but by default will use the libc functions. As a consumer of the tree-sitter core library as well as any parser libraries that might use allocations, you can enable overriding the default allocator and have it use the same one as the library allocator, of which you can set with `ts_set_allocator`. @@ -195,7 +195,8 @@ To enable this overriding in scanners, you must compile them with the `TREE_SITT the library must be linked into your final app dynamically, since it needs to resolve the internal functions at runtime. If you are compiling an executable binary that uses the core library, but want to load parsers dynamically at runtime, then you will have to use a special linker flag on Unix. For non-Darwin systems, that would be `--dynamic-list` and for Darwin -systems, that would be `-exported_symbols_list`. The CLI does exactly this, so you can use it as a reference (check out `cli/build.rs`). +systems, that would be `-exported_symbols_list`. The CLI does exactly this, so you can use it as a reference (check out +`cli/build.rs`). For example, assuming you wanted to allocate 100 bytes for your scanner, you'd do so like the following example: @@ -293,9 +294,10 @@ bool tree_sitter_my_language_external_scanner_scan( ## Other External Scanner Details -External scanners have priority over Tree-sitter's normal lexing process. When a token listed in the externals array is valid -at a given position, the external scanner is called first. This makes external scanners a powerful way to override Tree-sitter's -default lexing behavior, especially for cases that can't be handled with regular lexical rules, parsing, or dynamic precedence. +External scanners have priority over Tree-sitter's normal lexing process. When a token listed in the externals array is +valid at a given position, the external scanner is called first. This makes external scanners a powerful way to override +Tree-sitter's default lexing behavior, especially for cases that can't be handled with regular lexical rules, parsing, or +dynamic precedence. During error recovery, Tree-sitter's first step is to call the external scanner's scan function with all tokens marked as valid. Your scanner should detect and handle this case appropriately. One simple approach is to add an unused "sentinel" diff --git a/docs/src/creating-parsers/5-writing-tests.md b/docs/src/creating-parsers/5-writing-tests.md index 438dc02a..33155cca 100644 --- a/docs/src/creating-parsers/5-writing-tests.md +++ b/docs/src/creating-parsers/5-writing-tests.md @@ -39,8 +39,8 @@ It only shows the *named* nodes, as described in [this section][named-vs-anonymo ``` The expected output section can also *optionally* show the [*field names*][node-field-names] associated with each child - node. To include field names in your tests, you write a node's field name followed by a colon, before the node itself in - the S-expression: + node. To include field names in your tests, you write a node's field name followed by a colon, before the node itself + in the S-expression: ```query (source_file @@ -104,8 +104,8 @@ you can repeat the attribute on a new line. The following attributes are available: -* `:cst` - This attribute specifies that the expected output should be in the form of a CST instead of the normal S-expression. This -CST matches the format given by `parse --cst`. +* `:cst` - This attribute specifies that the expected output should be in the form of a CST instead of the normal S-expression. +This CST matches the format given by `parse --cst`. * `:error` — This attribute will assert that the parse tree contains an error. It's useful to just validate that a certain input is invalid without displaying the whole parse tree, as such you should omit the parse tree below the `---` line. * `:fail-fast` — This attribute will stop the testing of additional cases if the test marked with this attribute fails. diff --git a/docs/src/creating-parsers/index.md b/docs/src/creating-parsers/index.md index 478cbeeb..4fb2c112 100644 --- a/docs/src/creating-parsers/index.md +++ b/docs/src/creating-parsers/index.md @@ -1,4 +1,4 @@ # Creating parsers -Developing Tree-sitter grammars can have a difficult learning curve, but once you get the hang of it, it can be fun and even -zen-like. This document will help you to get started and to develop a useful mental model. +Developing Tree-sitter grammars can have a difficult learning curve, but once you get the hang of it, it can be fun and +even zen-like. This document will help you to get started and to develop a useful mental model. diff --git a/docs/src/index.md b/docs/src/index.md index 5f9140a7..ee92966a 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -10,7 +10,8 @@ file and efficiently update the syntax tree as the source file is edited. Tree-s - **General** enough to parse any programming language - **Fast** enough to parse on every keystroke in a text editor - **Robust** enough to provide useful results even in the presence of syntax errors -- **Dependency-free** so that the runtime library (which is written in pure [C11](https://github.com/tree-sitter/tree-sitter/tree/master/lib)) can be embedded in any application +- **Dependency-free** so that the runtime library (which is written in pure [C11](https://github.com/tree-sitter/tree-sitter/tree/master/lib)) +can be embedded in any application ## Language Bindings diff --git a/docs/src/using-parsers/2-basic-parsing.md b/docs/src/using-parsers/2-basic-parsing.md index 77f6fb7a..8c425d6b 100644 --- a/docs/src/using-parsers/2-basic-parsing.md +++ b/docs/src/using-parsers/2-basic-parsing.md @@ -2,7 +2,8 @@ ## Providing the Code -In the example on the previous page, we parsed source code stored in a simple string using the `ts_parser_parse_string` function: +In the example on the previous page, we parsed source code stored in a simple string using the `ts_parser_parse_string` +function: ```c TSTree *ts_parser_parse_string( @@ -135,10 +136,10 @@ Consider a grammar rule like this: if_statement: $ => seq("if", "(", $._expression, ")", $._statement); ``` -A syntax node representing an `if_statement` in this language would have 5 children: the condition expression, the body statement, -as well as the `if`, `(`, and `)` tokens. The expression and the statement would be marked as _named_ nodes, because they -have been given explicit names in the grammar. But the `if`, `(`, and `)` nodes would _not_ be named nodes, because they -are represented in the grammar as simple strings. +A syntax node representing an `if_statement` in this language would have 5 children: the condition expression, the body +statement, as well as the `if`, `(`, and `)` tokens. The expression and the statement would be marked as _named_ nodes, +because they have been given explicit names in the grammar. But the `if`, `(`, and `)` nodes would _not_ be named nodes, +because they are represented in the grammar as simple strings. You can check whether any given node is named: diff --git a/docs/src/using-parsers/3-advanced-parsing.md b/docs/src/using-parsers/3-advanced-parsing.md index bffd35ea..c1c92e24 100644 --- a/docs/src/using-parsers/3-advanced-parsing.md +++ b/docs/src/using-parsers/3-advanced-parsing.md @@ -19,8 +19,8 @@ typedef struct { void ts_tree_edit(TSTree *, const TSInputEdit *); ``` -Then, you can call `ts_parser_parse` again, passing in the old tree. This will create a new tree that internally shares structure -with the old tree. +Then, you can call `ts_parser_parse` again, passing in the old tree. This will create a new tree that internally shares +structure with the old tree. When you edit a syntax tree, the positions of its nodes will change. If you have stored any `TSNode` instances outside of the `TSTree`, you must update their positions separately, using the same `TSInputEdit` value, in order to update their diff --git a/docs/src/using-parsers/6-static-node-types.md b/docs/src/using-parsers/6-static-node-types.md index 5976d0bc..171f4314 100644 --- a/docs/src/using-parsers/6-static-node-types.md +++ b/docs/src/using-parsers/6-static-node-types.md @@ -108,9 +108,9 @@ In Tree-sitter grammars, there are usually certain rules that represent abstract "type", "declaration"). In the `grammar.js` file, these are often written as [hidden rules][hidden rules] whose definition is a simple [`choice`][grammar dsl] where each member is just a single symbol. -Normally, hidden rules are not mentioned in the node types file, since they don't appear in the syntax tree. But if you add -a hidden rule to the grammar's [`supertypes` list][grammar dsl], then it _will_ show up in the node -types file, with the following special entry: +Normally, hidden rules are not mentioned in the node types file, since they don't appear in the syntax tree. But if you +add a hidden rule to the grammar's [`supertypes` list][grammar dsl], then it _will_ show up in the node types file, with +the following special entry: - `"subtypes"` — An array of objects that specify the _types_ of nodes that this 'supertype' node can wrap. diff --git a/docs/src/using-parsers/7-abi-versions.md b/docs/src/using-parsers/7-abi-versions.md index 34347938..1db42a5d 100644 --- a/docs/src/using-parsers/7-abi-versions.md +++ b/docs/src/using-parsers/7-abi-versions.md @@ -15,8 +15,11 @@ A given version of the tree-sitter library is only able to load parsers generate | >=0.20.3, <=0.24 | 13 | 14 | | >=0.25 | 13 | 15 | -By default, the tree-sitter CLI will generate parsers using the latest available ABI for that version, but an older ABI (supported by the CLI) can be selected by passing the [`--abi` option][abi_option] to the `generate` command. +By default, the tree-sitter CLI will generate parsers using the latest available ABI for that version, but an older ABI +(supported by the CLI) can be selected by passing the [`--abi` option][abi_option] to the `generate` command. -Note that the ABI version range supported by the CLI can be smaller than for the library: When a new ABI version is released, older versions will be phased out over a deprecation period, which starts with no longer being able to generate parsers with the oldest ABI version. +Note that the ABI version range supported by the CLI can be smaller than for the library: When a new ABI version is released, +older versions will be phased out over a deprecation period, which starts with no longer being able to generate parsers +with the oldest ABI version. [abi_option]: ../cli/generate.md#--abi-version diff --git a/docs/src/using-parsers/index.md b/docs/src/using-parsers/index.md index 48d61599..5b2c146d 100644 --- a/docs/src/using-parsers/index.md +++ b/docs/src/using-parsers/index.md @@ -6,8 +6,8 @@ the core concepts remain the same. Tree-sitter's parsing functionality is implemented through its C API, with all functions documented in the [tree_sitter/api.h][api.h] header file, but if you're working in another language, you can use one of the following bindings found [here](../index.md#language-bindings), -each providing idiomatic access to Tree-sitter's functionality. Of these bindings, the official ones have their own API docs -hosted online at the following pages: +each providing idiomatic access to Tree-sitter's functionality. Of these bindings, the official ones have their own API +doc hosted online at the following pages: - [Go][go] - [Java] diff --git a/docs/src/using-parsers/queries/1-syntax.md b/docs/src/using-parsers/queries/1-syntax.md index 0f02be61..2e0a8853 100644 --- a/docs/src/using-parsers/queries/1-syntax.md +++ b/docs/src/using-parsers/queries/1-syntax.md @@ -1,9 +1,9 @@ # Query Syntax -A _query_ consists of one or more _patterns_, where each pattern is an [S-expression][s-exp] that matches a certain set of -nodes in a syntax tree. The expression to match a given node consists of a pair of parentheses containing two things: the -node's type, and optionally, a series of other S-expressions that match the node's children. For example, this pattern would -match any `binary_expression` node whose children are both `number_literal` nodes: +A _query_ consists of one or more _patterns_, where each pattern is an [S-expression][s-exp] that matches a certain set +of nodes in a syntax tree. The expression to match a given node consists of a pair of parentheses containing two things: +the node's type, and optionally, a series of other S-expressions that match the node's children. For example, this pattern +would match any `binary_expression` node whose children are both `number_literal` nodes: ```query (binary_expression (number_literal) (number_literal)) @@ -99,10 +99,10 @@ by `(ERROR)` queries. Specific missing node types can also be queried: ### Supertype Nodes Some node types are marked as _supertypes_ in a grammar. A supertype is a node type that contains multiple -subtypes. For example, in the [JavaScript grammar example][grammar], `expression` is a supertype that can represent any kind -of expression, such as a `binary_expression`, `call_expression`, or `identifier`. You can use supertypes in queries to match -any of their subtypes, rather than having to list out each subtype individually. For example, this pattern would match any -kind of expression, even though it's not a visible node in the syntax tree: +subtypes. For example, in the [JavaScript grammar example][grammar], `expression` is a supertype that can represent any +kind of expression, such as a `binary_expression`, `call_expression`, or `identifier`. You can use supertypes in queries +to match any of their subtypes, rather than having to list out each subtype individually. For example, this pattern would +match any kind of expression, even though it's not a visible node in the syntax tree: ```query (expression) @any-expression diff --git a/docs/src/using-parsers/queries/3-predicates-and-directives.md b/docs/src/using-parsers/queries/3-predicates-and-directives.md index 88e01e01..1f9aeada 100644 --- a/docs/src/using-parsers/queries/3-predicates-and-directives.md +++ b/docs/src/using-parsers/queries/3-predicates-and-directives.md @@ -128,15 +128,15 @@ This pattern would match any builtin variable that is not a local variable, beca # Directives -Similar to predicates, directives are a way to associate arbitrary metadata with a pattern. The only difference between predicates -and directives is that directives end in a `!` character instead of `?` character. +Similar to predicates, directives are a way to associate arbitrary metadata with a pattern. The only difference between +predicates and directives is that directives end in a `!` character instead of `?` character. Tree-sitter's CLI supports the following directives by default: ## The `set!` directive -This directive allows you to associate key-value pairs with a pattern. The key and value can be any arbitrary text that you -see fit. +This directive allows you to associate key-value pairs with a pattern. The key and value can be any arbitrary text that +you see fit. ```query ((comment) @injection.content @@ -156,8 +156,8 @@ another capture are preserved. It takes two arguments, both of which are capture ### The `#strip!` directive The `#strip!` directive allows you to remove text from a capture. It takes two arguments: the first is the capture to strip -text from, and the second is a regular expression to match against the text. Any text matched by the regular expression will -be removed from the text associated with the capture. +text from, and the second is a regular expression to match against the text. Any text matched by the regular expression +will be removed from the text associated with the capture. For an example on the `#select-adjacent!` and `#strip!` directives, view the [code navigation](../../4-code-navigation.md#examples) documentation. From 5808350bfee9891583394c642e8f257ce3c73539 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Thu, 15 Jan 2026 04:30:55 -0500 Subject: [PATCH 654/663] fix(docs): appease clippy regarding spacing in README --- crates/cli/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/cli/README.md b/crates/cli/README.md index 54d0ce07..e3ef899e 100644 --- a/crates/cli/README.md +++ b/crates/cli/README.md @@ -36,10 +36,10 @@ The `tree-sitter` binary itself has no dependencies, but specific commands have ### Commands * `generate` - The `tree-sitter generate` command will generate a Tree-sitter parser based on the grammar in the current -working directory. See [the documentation] for more information. + working directory. See [the documentation] for more information. * `test` - The `tree-sitter test` command will run the unit tests for the Tree-sitter parser in the current working directory. -See [the documentation] for more information. + See [the documentation] for more information. * `parse` - The `tree-sitter parse` command will parse a file (or list of files) using Tree-sitter parsers. From 5d290a2a75fc05bb9c7e6758d9f125cadf3834c2 Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Thu, 15 Jan 2026 10:35:32 +0100 Subject: [PATCH 655/663] fix(wasm): regenerate stdlib with wasm-opt Problem: Output of `cargo xtask build-wasm-stdlib` depends on whether `wasm-opt` is installed (since `clang` will use it by default if it finds it). Solution: Install it and rerun the xtask. --- lib/src/wasm/wasm-stdlib.h | 2282 +++++++++++++++++------------------- 1 file changed, 1076 insertions(+), 1206 deletions(-) diff --git a/lib/src/wasm/wasm-stdlib.h b/lib/src/wasm/wasm-stdlib.h index a8f55df8..082ef4c2 100644 --- a/lib/src/wasm/wasm-stdlib.h +++ b/lib/src/wasm/wasm-stdlib.h @@ -1,1013 +1,942 @@ unsigned char STDLIB_WASM[] = { - 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1e, 0x06, 0x60, + 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1a, 0x05, 0x60, + 0x01, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x01, 0x7f, 0x01, 0x7f, 0x60, 0x00, 0x01, 0x7f, 0x60, 0x03, 0x7f, - 0x7f, 0x7f, 0x01, 0x7f, 0x02, 0x9e, 0x01, 0x05, 0x03, 0x65, 0x6e, 0x76, - 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x02, 0x03, 0x65, - 0x6e, 0x76, 0x19, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x01, 0x70, 0x00, 0x01, 0x16, 0x77, 0x61, 0x73, - 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, - 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x08, 0x61, 0x72, 0x67, 0x73, - 0x5f, 0x67, 0x65, 0x74, 0x00, 0x00, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, - 0x76, 0x69, 0x65, 0x77, 0x31, 0x0e, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x00, 0x00, 0x16, 0x77, - 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x09, 0x70, 0x72, - 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x00, 0x01, 0x03, 0x2b, 0x2a, - 0x02, 0x00, 0x02, 0x02, 0x01, 0x03, 0x01, 0x00, 0x00, 0x01, 0x04, 0x00, - 0x00, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x05, 0x05, 0x00, 0x03, 0x00, - 0x03, 0x05, 0x03, 0x05, 0x05, 0x03, 0x05, 0x03, 0x03, 0x03, 0x05, 0x05, - 0x05, 0x03, 0x03, 0x00, 0x03, 0x03, 0x06, 0x0d, 0x02, 0x7f, 0x01, 0x41, - 0x80, 0x80, 0x04, 0x0b, 0x7f, 0x00, 0x41, 0x00, 0x0b, 0x07, 0xad, 0x02, - 0x1c, 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, - 0x6c, 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x00, 0x03, 0x0f, 0x5f, 0x5f, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x03, 0x00, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x06, - 0x0a, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x00, - 0x07, 0x06, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x00, 0x08, 0x04, 0x66, - 0x72, 0x65, 0x65, 0x00, 0x09, 0x06, 0x63, 0x61, 0x6c, 0x6c, 0x6f, 0x63, - 0x00, 0x0a, 0x07, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x00, 0x0b, - 0x06, 0x73, 0x74, 0x72, 0x6c, 0x65, 0x6e, 0x00, 0x14, 0x08, 0x69, 0x73, - 0x77, 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x00, 0x2c, 0x08, 0x69, 0x73, 0x77, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x00, 0x15, 0x08, 0x69, 0x73, 0x77, 0x62, - 0x6c, 0x61, 0x6e, 0x6b, 0x00, 0x23, 0x08, 0x69, 0x73, 0x77, 0x64, 0x69, - 0x67, 0x69, 0x74, 0x00, 0x24, 0x08, 0x69, 0x73, 0x77, 0x6c, 0x6f, 0x77, - 0x65, 0x72, 0x00, 0x20, 0x08, 0x69, 0x73, 0x77, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x00, 0x2b, 0x08, 0x69, 0x73, 0x77, 0x75, 0x70, 0x70, 0x65, 0x72, - 0x00, 0x1d, 0x09, 0x69, 0x73, 0x77, 0x78, 0x64, 0x69, 0x67, 0x69, 0x74, - 0x00, 0x28, 0x08, 0x74, 0x6f, 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x00, - 0x19, 0x08, 0x74, 0x6f, 0x77, 0x75, 0x70, 0x70, 0x65, 0x72, 0x00, 0x1b, - 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x68, 0x72, 0x00, 0x17, 0x06, 0x6d, 0x65, - 0x6d, 0x63, 0x6d, 0x70, 0x00, 0x16, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x70, - 0x79, 0x00, 0x21, 0x07, 0x6d, 0x65, 0x6d, 0x6d, 0x6f, 0x76, 0x65, 0x00, - 0x1e, 0x06, 0x6d, 0x65, 0x6d, 0x73, 0x65, 0x74, 0x00, 0x1f, 0x06, 0x73, - 0x74, 0x72, 0x63, 0x6d, 0x70, 0x00, 0x18, 0x07, 0x73, 0x74, 0x72, 0x6e, - 0x63, 0x61, 0x74, 0x00, 0x25, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x6d, - 0x70, 0x00, 0x1c, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x70, 0x79, 0x00, - 0x27, 0x08, 0x01, 0x05, 0x0a, 0xb0, 0x30, 0x2a, 0x02, 0x00, 0x0b, 0x03, - 0x00, 0x00, 0x0b, 0x0e, 0x00, 0x41, 0xec, 0xc2, 0x04, 0x41, 0x00, 0x41, - 0x84, 0x01, 0xfc, 0x0b, 0x00, 0x0b, 0x57, 0x01, 0x01, 0x7f, 0x02, 0x40, - 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xec, 0xc2, 0x84, - 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x0d, 0x00, 0x23, 0x81, 0x80, 0x80, - 0x80, 0x00, 0x41, 0xec, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x41, 0x01, 0x36, - 0x02, 0x00, 0x10, 0x91, 0x80, 0x80, 0x80, 0x00, 0x10, 0x83, 0x80, 0x80, - 0x80, 0x00, 0x10, 0x8d, 0x80, 0x80, 0x80, 0x00, 0x21, 0x00, 0x10, 0x93, - 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x0d, 0x01, 0x0f, 0x0b, 0x00, 0x0b, - 0x20, 0x00, 0x10, 0x90, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x49, 0x01, - 0x01, 0x7f, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x41, 0xf4, - 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, - 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x00, 0x36, 0x02, 0x00, - 0x3f, 0x00, 0x21, 0x00, 0x20, 0x01, 0x41, 0xfc, 0xc2, 0x84, 0x80, 0x00, - 0x6a, 0x41, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0xf8, 0xc2, 0x84, - 0x80, 0x00, 0x6a, 0x20, 0x00, 0x41, 0x10, 0x74, 0x36, 0x02, 0x00, 0x0b, - 0xae, 0x02, 0x01, 0x04, 0x7f, 0x41, 0x00, 0x21, 0x01, 0x02, 0x40, 0x20, - 0x00, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, - 0x41, 0xfc, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x02, - 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x20, - 0x02, 0x28, 0x02, 0x00, 0x20, 0x00, 0x49, 0x0d, 0x00, 0x20, 0x02, 0x21, - 0x04, 0x0c, 0x01, 0x0b, 0x03, 0x40, 0x20, 0x02, 0x28, 0x02, 0x04, 0x22, - 0x04, 0x45, 0x0d, 0x02, 0x20, 0x02, 0x21, 0x03, 0x20, 0x04, 0x21, 0x02, - 0x20, 0x04, 0x28, 0x02, 0x00, 0x20, 0x00, 0x49, 0x0d, 0x00, 0x0b, 0x0b, - 0x20, 0x04, 0x28, 0x02, 0x04, 0x21, 0x02, 0x02, 0x40, 0x02, 0x40, 0x20, - 0x03, 0x0d, 0x00, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xfc, 0xc2, - 0x84, 0x80, 0x00, 0x6a, 0x20, 0x02, 0x36, 0x02, 0x00, 0x0c, 0x01, 0x0b, - 0x20, 0x03, 0x20, 0x02, 0x36, 0x02, 0x04, 0x0b, 0x20, 0x04, 0x41, 0x08, - 0x6a, 0x0f, 0x0b, 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x22, - 0x02, 0x41, 0xf8, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x20, - 0x02, 0x41, 0xf4, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x22, - 0x04, 0x41, 0x08, 0x6a, 0x22, 0x03, 0x20, 0x00, 0x6a, 0x41, 0x03, 0x6a, - 0x41, 0x7c, 0x71, 0x22, 0x02, 0x4f, 0x0d, 0x00, 0x20, 0x02, 0x23, 0x81, - 0x80, 0x80, 0x80, 0x00, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, - 0x02, 0x00, 0x6b, 0x41, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x0d, 0x01, 0x20, - 0x00, 0x41, 0x7f, 0x6a, 0x41, 0x10, 0x76, 0x41, 0x01, 0x6a, 0x40, 0x00, - 0x41, 0x7f, 0x46, 0x0d, 0x01, 0x3f, 0x00, 0x21, 0x01, 0x23, 0x81, 0x80, - 0x80, 0x80, 0x00, 0x41, 0xf8, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x01, - 0x41, 0x10, 0x74, 0x36, 0x02, 0x00, 0x0b, 0x20, 0x04, 0x20, 0x00, 0x36, - 0x02, 0x00, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf4, 0xc2, 0x84, - 0x80, 0x00, 0x6a, 0x20, 0x02, 0x36, 0x02, 0x00, 0x20, 0x03, 0x21, 0x01, - 0x0b, 0x20, 0x01, 0x0b, 0x5c, 0x01, 0x03, 0x7f, 0x02, 0x40, 0x20, 0x00, - 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x78, 0x6a, 0x22, 0x01, 0x28, 0x02, - 0x00, 0x21, 0x02, 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, - 0xf4, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x22, 0x03, 0x28, 0x02, 0x00, 0x20, - 0x00, 0x20, 0x02, 0x6a, 0x41, 0x03, 0x6a, 0x41, 0x7c, 0x71, 0x46, 0x0d, - 0x00, 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, - 0x41, 0xfc, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x22, 0x03, 0x28, 0x02, 0x00, - 0x36, 0x02, 0x00, 0x0b, 0x20, 0x03, 0x20, 0x01, 0x36, 0x02, 0x00, 0x0b, - 0x0b, 0x24, 0x00, 0x20, 0x01, 0x20, 0x00, 0x6c, 0x22, 0x00, 0x10, 0x88, - 0x80, 0x80, 0x80, 0x00, 0x21, 0x01, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, - 0x00, 0x20, 0x01, 0x41, 0x00, 0x20, 0x00, 0xfc, 0x0b, 0x00, 0x0b, 0x20, - 0x01, 0x0b, 0x79, 0x01, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, - 0x00, 0x20, 0x00, 0x41, 0x78, 0x6a, 0x22, 0x02, 0x28, 0x02, 0x00, 0x21, - 0x03, 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf4, 0xc2, - 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x20, 0x00, 0x20, 0x03, 0x6a, - 0x41, 0x03, 0x6a, 0x41, 0x7c, 0x71, 0x47, 0x0d, 0x00, 0x23, 0x81, 0x80, - 0x80, 0x80, 0x00, 0x41, 0xf4, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x02, - 0x36, 0x02, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x01, 0x10, 0x88, 0x80, 0x80, - 0x80, 0x00, 0x21, 0x01, 0x02, 0x40, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, - 0x02, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x20, 0x00, 0x20, 0x02, 0xfc, 0x0a, - 0x00, 0x00, 0x0b, 0x20, 0x01, 0x0f, 0x0b, 0x20, 0x01, 0x10, 0x88, 0x80, - 0x80, 0x80, 0x00, 0x0b, 0x0b, 0x00, 0x20, 0x00, 0x10, 0x90, 0x80, 0x80, - 0x80, 0x00, 0x00, 0x0b, 0xd5, 0x01, 0x01, 0x03, 0x7f, 0x23, 0x80, 0x80, - 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x00, 0x24, 0x80, 0x80, 0x80, - 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, - 0x20, 0x00, 0x41, 0x08, 0x6a, 0x20, 0x00, 0x41, 0x0c, 0x6a, 0x10, 0x8f, - 0x80, 0x80, 0x80, 0x00, 0x0d, 0x00, 0x20, 0x00, 0x28, 0x02, 0x08, 0x41, - 0x01, 0x6a, 0x22, 0x01, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x28, 0x02, 0x0c, - 0x10, 0x88, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x45, 0x0d, 0x02, 0x20, - 0x01, 0x41, 0x04, 0x10, 0x8a, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x45, - 0x0d, 0x03, 0x20, 0x01, 0x20, 0x02, 0x10, 0x8e, 0x80, 0x80, 0x80, 0x00, - 0x0d, 0x04, 0x20, 0x00, 0x28, 0x02, 0x08, 0x20, 0x01, 0x10, 0x84, 0x80, - 0x80, 0x80, 0x00, 0x21, 0x01, 0x20, 0x00, 0x41, 0x10, 0x6a, 0x24, 0x80, - 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x0f, 0x0b, 0x41, 0xc7, 0x00, 0x10, - 0x8c, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x8c, - 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x8c, 0x80, - 0x80, 0x80, 0x00, 0x00, 0x0b, 0x20, 0x02, 0x10, 0x89, 0x80, 0x80, 0x80, - 0x00, 0x41, 0xc6, 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, - 0x20, 0x02, 0x10, 0x89, 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x10, 0x89, - 0x80, 0x80, 0x80, 0x00, 0x41, 0xc7, 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, - 0x00, 0x00, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x80, 0x80, - 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x11, 0x00, 0x20, - 0x00, 0x20, 0x01, 0x10, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, - 0x03, 0x71, 0x0b, 0x0b, 0x00, 0x20, 0x00, 0x10, 0x82, 0x80, 0x80, 0x80, - 0x00, 0x00, 0x0b, 0xdf, 0x01, 0x01, 0x02, 0x7f, 0x41, 0x00, 0x41, 0x84, - 0xc3, 0x84, 0x80, 0x00, 0x36, 0x02, 0x84, 0xc3, 0x84, 0x80, 0x00, 0x41, - 0x80, 0x80, 0x84, 0x80, 0x00, 0x21, 0x00, 0x02, 0x40, 0x02, 0x40, 0x41, - 0x80, 0x80, 0x84, 0x80, 0x00, 0x45, 0x0d, 0x00, 0x41, 0x80, 0x80, 0x84, - 0x80, 0x00, 0x41, 0x80, 0x80, 0x80, 0x80, 0x00, 0x6b, 0x21, 0x01, 0x0c, - 0x01, 0x0b, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, 0x01, 0x41, 0xf0, - 0xc3, 0x84, 0x80, 0x00, 0x41, 0xf0, 0xc3, 0x84, 0x80, 0x00, 0x6b, 0x41, - 0x80, 0x80, 0x84, 0x80, 0x00, 0x20, 0x01, 0x41, 0x80, 0x80, 0x84, 0x80, - 0x00, 0x4b, 0x22, 0x00, 0x1b, 0x21, 0x01, 0x41, 0xf0, 0xc3, 0x84, 0x80, - 0x00, 0x41, 0x80, 0x80, 0x84, 0x80, 0x00, 0x20, 0x00, 0x1b, 0x21, 0x00, - 0x0b, 0x41, 0x38, 0x41, 0x00, 0x36, 0x02, 0x84, 0xc3, 0x84, 0x80, 0x00, - 0x41, 0x34, 0x20, 0x01, 0x36, 0x02, 0x84, 0xc3, 0x84, 0x80, 0x00, 0x41, - 0x30, 0x20, 0x00, 0x36, 0x02, 0x84, 0xc3, 0x84, 0x80, 0x00, 0x41, 0x08, - 0x41, 0x84, 0xc3, 0x84, 0x80, 0x00, 0x36, 0x02, 0x84, 0xc3, 0x84, 0x80, - 0x00, 0x41, 0x04, 0x41, 0x84, 0xc3, 0x84, 0x80, 0x00, 0x36, 0x02, 0x84, - 0xc3, 0x84, 0x80, 0x00, 0x41, 0x0c, 0x41, 0x00, 0x28, 0x02, 0x80, 0xc3, - 0x84, 0x80, 0x00, 0x36, 0x02, 0x84, 0xc3, 0x84, 0x80, 0x00, 0x41, 0x00, - 0x20, 0x01, 0x41, 0x80, 0x80, 0x80, 0x04, 0x20, 0x01, 0x41, 0x80, 0x80, - 0x80, 0x04, 0x49, 0x1b, 0x36, 0x02, 0xe8, 0xc2, 0x84, 0x80, 0x00, 0x0b, - 0x02, 0x00, 0x0b, 0x0e, 0x00, 0x10, 0x92, 0x80, 0x80, 0x80, 0x00, 0x10, - 0x92, 0x80, 0x80, 0x80, 0x00, 0x0b, 0xcf, 0x01, 0x01, 0x03, 0x7f, 0x20, - 0x00, 0x21, 0x01, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x71, - 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x0d, 0x00, - 0x20, 0x00, 0x20, 0x00, 0x6b, 0x0f, 0x0b, 0x20, 0x00, 0x41, 0x01, 0x6a, + 0x02, 0x7c, 0x04, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x31, 0x08, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x00, + 0x02, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, + 0x0e, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, + 0x67, 0x65, 0x74, 0x00, 0x02, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x31, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, + 0x69, 0x74, 0x00, 0x03, 0x03, 0x65, 0x6e, 0x76, 0x06, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x02, 0x00, 0x02, 0x03, 0x1f, 0x1e, 0x04, 0x04, 0x04, + 0x03, 0x00, 0x03, 0x02, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, + 0x02, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x06, 0x08, 0x01, 0x7f, 0x01, 0x41, 0x80, 0x80, 0x04, + 0x0b, 0x07, 0xad, 0x02, 0x1c, 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, + 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x00, + 0x03, 0x0f, 0x5f, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x03, 0x00, 0x06, 0x5f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x00, 0x05, 0x0a, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x68, + 0x65, 0x61, 0x70, 0x00, 0x06, 0x06, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, + 0x00, 0x07, 0x04, 0x66, 0x72, 0x65, 0x65, 0x00, 0x08, 0x06, 0x63, 0x61, + 0x6c, 0x6c, 0x6f, 0x63, 0x00, 0x09, 0x07, 0x72, 0x65, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x00, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x6c, 0x65, 0x6e, 0x00, + 0x0c, 0x08, 0x69, 0x73, 0x77, 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x00, 0x20, + 0x08, 0x69, 0x73, 0x77, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x00, 0x0d, 0x08, + 0x69, 0x73, 0x77, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x00, 0x1a, 0x08, 0x69, + 0x73, 0x77, 0x64, 0x69, 0x67, 0x69, 0x74, 0x00, 0x1b, 0x08, 0x69, 0x73, + 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x00, 0x18, 0x08, 0x69, 0x73, 0x77, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x00, 0x1f, 0x08, 0x69, 0x73, 0x77, 0x75, + 0x70, 0x70, 0x65, 0x72, 0x00, 0x15, 0x09, 0x69, 0x73, 0x77, 0x78, 0x64, + 0x69, 0x67, 0x69, 0x74, 0x00, 0x1e, 0x08, 0x74, 0x6f, 0x77, 0x6c, 0x6f, + 0x77, 0x65, 0x72, 0x00, 0x11, 0x08, 0x74, 0x6f, 0x77, 0x75, 0x70, 0x70, + 0x65, 0x72, 0x00, 0x13, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x68, 0x72, 0x00, + 0x0f, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x6d, 0x70, 0x00, 0x0e, 0x06, 0x6d, + 0x65, 0x6d, 0x63, 0x70, 0x79, 0x00, 0x19, 0x07, 0x6d, 0x65, 0x6d, 0x6d, + 0x6f, 0x76, 0x65, 0x00, 0x16, 0x06, 0x6d, 0x65, 0x6d, 0x73, 0x65, 0x74, + 0x00, 0x17, 0x06, 0x73, 0x74, 0x72, 0x63, 0x6d, 0x70, 0x00, 0x10, 0x07, + 0x73, 0x74, 0x72, 0x6e, 0x63, 0x61, 0x74, 0x00, 0x1c, 0x07, 0x73, 0x74, + 0x72, 0x6e, 0x63, 0x6d, 0x70, 0x00, 0x14, 0x07, 0x73, 0x74, 0x72, 0x6e, + 0x63, 0x70, 0x79, 0x00, 0x1d, 0x08, 0x01, 0x04, 0x0c, 0x01, 0x02, 0x0a, + 0x8d, 0x2a, 0x1e, 0x02, 0x00, 0x0b, 0x0e, 0x00, 0x41, 0xec, 0xc2, 0x04, + 0x41, 0x00, 0x41, 0x84, 0x01, 0xfc, 0x0b, 0x00, 0x0b, 0xfd, 0x01, 0x01, + 0x03, 0x7f, 0x41, 0xec, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x45, 0x04, 0x40, + 0x41, 0xec, 0xc2, 0x04, 0x41, 0x01, 0x36, 0x02, 0x00, 0x41, 0x84, 0xc3, + 0x04, 0x41, 0x84, 0xc3, 0x04, 0x36, 0x02, 0x00, 0x41, 0xbc, 0xc3, 0x04, + 0x41, 0x00, 0x36, 0x02, 0x00, 0x41, 0xb8, 0xc3, 0x04, 0x41, 0x80, 0x80, + 0x04, 0x36, 0x02, 0x00, 0x41, 0xb4, 0xc3, 0x04, 0x41, 0x80, 0x80, 0x04, + 0x36, 0x02, 0x00, 0x41, 0x8c, 0xc3, 0x04, 0x41, 0x84, 0xc3, 0x04, 0x36, + 0x02, 0x00, 0x41, 0x88, 0xc3, 0x04, 0x41, 0x84, 0xc3, 0x04, 0x36, 0x02, + 0x00, 0x41, 0x90, 0xc3, 0x04, 0x41, 0x80, 0xc3, 0x04, 0x28, 0x02, 0x00, + 0x36, 0x02, 0x00, 0x41, 0xe8, 0xc2, 0x04, 0x41, 0x80, 0x80, 0x04, 0x36, + 0x02, 0x00, 0x23, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x00, 0x24, 0x00, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0x08, 0x6a, + 0x20, 0x00, 0x41, 0x0c, 0x6a, 0x10, 0x01, 0x41, 0xff, 0xff, 0x03, 0x71, + 0x45, 0x04, 0x40, 0x20, 0x00, 0x28, 0x02, 0x08, 0x41, 0x01, 0x6a, 0x22, + 0x01, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x28, 0x02, 0x0c, 0x10, 0x07, 0x22, + 0x02, 0x45, 0x0d, 0x02, 0x20, 0x01, 0x41, 0x04, 0x10, 0x09, 0x22, 0x01, + 0x45, 0x0d, 0x03, 0x20, 0x01, 0x20, 0x02, 0x10, 0x00, 0x41, 0xff, 0xff, + 0x03, 0x71, 0x0d, 0x04, 0x20, 0x00, 0x28, 0x02, 0x08, 0x00, 0x0b, 0x41, + 0xc7, 0x00, 0x10, 0x0b, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x0b, 0x00, + 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x0b, 0x00, 0x0b, 0x20, 0x02, 0x10, 0x08, + 0x41, 0xc6, 0x00, 0x10, 0x0b, 0x00, 0x0b, 0x20, 0x02, 0x10, 0x08, 0x20, + 0x01, 0x10, 0x08, 0x41, 0xc7, 0x00, 0x10, 0x0b, 0x00, 0x0b, 0x00, 0x0b, + 0x35, 0x01, 0x01, 0x7f, 0x41, 0xf4, 0xc2, 0x04, 0x20, 0x00, 0x36, 0x02, + 0x00, 0x41, 0xf0, 0xc2, 0x04, 0x20, 0x00, 0x36, 0x02, 0x00, 0x3f, 0x00, + 0x21, 0x00, 0x20, 0x01, 0x41, 0xfc, 0xc2, 0x04, 0x6a, 0x41, 0x00, 0x36, + 0x02, 0x00, 0x20, 0x01, 0x41, 0xf8, 0xc2, 0x04, 0x6a, 0x20, 0x00, 0x41, + 0x10, 0x74, 0x36, 0x02, 0x00, 0x0b, 0xde, 0x01, 0x01, 0x04, 0x7f, 0x02, + 0x40, 0x20, 0x00, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x41, 0xfc, 0xc2, 0x04, + 0x28, 0x02, 0x00, 0x22, 0x01, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, + 0x20, 0x01, 0x28, 0x02, 0x00, 0x4d, 0x04, 0x40, 0x20, 0x01, 0x21, 0x02, + 0x0c, 0x01, 0x0b, 0x03, 0x40, 0x20, 0x01, 0x28, 0x02, 0x04, 0x22, 0x02, + 0x45, 0x0d, 0x02, 0x20, 0x01, 0x21, 0x03, 0x20, 0x02, 0x22, 0x01, 0x28, + 0x02, 0x00, 0x20, 0x00, 0x49, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x28, + 0x02, 0x04, 0x21, 0x00, 0x02, 0x40, 0x20, 0x03, 0x45, 0x04, 0x40, 0x41, + 0xfc, 0xc2, 0x04, 0x20, 0x00, 0x36, 0x02, 0x00, 0x0c, 0x01, 0x0b, 0x20, + 0x03, 0x20, 0x00, 0x36, 0x02, 0x04, 0x0b, 0x20, 0x02, 0x41, 0x08, 0x6a, + 0x0f, 0x0b, 0x41, 0xf4, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x22, 0x03, 0x41, + 0x08, 0x6a, 0x22, 0x01, 0x20, 0x00, 0x6a, 0x41, 0x03, 0x6a, 0x41, 0x7c, + 0x71, 0x22, 0x02, 0x41, 0xf8, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x4b, 0x04, + 0x40, 0x20, 0x02, 0x41, 0xf0, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x6b, 0x41, + 0x80, 0x80, 0x80, 0x02, 0x4a, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6b, + 0x41, 0x10, 0x76, 0x41, 0x01, 0x6a, 0x40, 0x00, 0x41, 0x7f, 0x46, 0x0d, + 0x01, 0x41, 0xf8, 0xc2, 0x04, 0x3f, 0x00, 0x41, 0x10, 0x74, 0x36, 0x02, + 0x00, 0x0b, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x00, 0x41, 0xf4, 0xc2, + 0x04, 0x20, 0x02, 0x36, 0x02, 0x00, 0x20, 0x01, 0x21, 0x04, 0x0b, 0x20, + 0x04, 0x0b, 0x41, 0x01, 0x02, 0x7f, 0x20, 0x00, 0x04, 0x40, 0x41, 0xf4, + 0xc2, 0x04, 0x22, 0x01, 0x28, 0x02, 0x00, 0x20, 0x00, 0x41, 0x08, 0x6b, + 0x22, 0x02, 0x28, 0x02, 0x00, 0x20, 0x00, 0x6a, 0x41, 0x03, 0x6a, 0x41, + 0x7c, 0x71, 0x47, 0x04, 0x40, 0x20, 0x00, 0x41, 0x04, 0x6b, 0x41, 0xfc, + 0xc2, 0x04, 0x22, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x0b, 0x20, + 0x01, 0x20, 0x02, 0x36, 0x02, 0x00, 0x0b, 0x0b, 0x1d, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x6c, 0x22, 0x00, 0x10, 0x07, 0x21, 0x01, 0x20, 0x00, 0x04, + 0x40, 0x20, 0x01, 0x41, 0x00, 0x20, 0x00, 0xfc, 0x0b, 0x00, 0x0b, 0x20, + 0x01, 0x0b, 0x56, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, + 0x00, 0x41, 0xf4, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x20, 0x00, 0x41, 0x08, + 0x6b, 0x22, 0x02, 0x28, 0x02, 0x00, 0x20, 0x00, 0x6a, 0x41, 0x03, 0x6a, + 0x41, 0x7c, 0x71, 0x46, 0x04, 0x40, 0x41, 0xf4, 0xc2, 0x04, 0x20, 0x02, + 0x36, 0x02, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x01, 0x10, 0x07, 0x21, 0x01, + 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x02, 0x04, 0x40, 0x20, 0x01, 0x20, + 0x00, 0x20, 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x0b, 0x20, 0x01, 0x0f, 0x0b, + 0x20, 0x01, 0x10, 0x07, 0x0b, 0x07, 0x00, 0x20, 0x00, 0x10, 0x02, 0x00, + 0x0b, 0xc5, 0x01, 0x01, 0x03, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, - 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x01, 0x41, - 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, - 0x01, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, - 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, - 0x41, 0x04, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x0d, 0x01, 0x0b, 0x20, - 0x01, 0x41, 0x7c, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x7b, 0x6a, 0x21, - 0x01, 0x03, 0x40, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x41, 0x80, - 0x82, 0x84, 0x08, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x22, 0x02, 0x28, 0x02, - 0x00, 0x22, 0x03, 0x6b, 0x20, 0x03, 0x72, 0x41, 0x80, 0x81, 0x82, 0x84, - 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x46, 0x0d, 0x00, 0x0b, - 0x03, 0x40, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x2d, - 0x00, 0x00, 0x21, 0x03, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x21, 0x02, 0x20, - 0x03, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x01, 0x20, 0x00, 0x6b, 0x0b, 0x3e, - 0x00, 0x02, 0x40, 0x20, 0x00, 0x41, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, - 0x20, 0x00, 0x41, 0x08, 0x76, 0x2d, 0x00, 0x80, 0x80, 0x84, 0x80, 0x00, - 0x41, 0x05, 0x74, 0x20, 0x00, 0x41, 0x03, 0x76, 0x41, 0x1f, 0x71, 0x72, - 0x2d, 0x00, 0x80, 0x80, 0x84, 0x80, 0x00, 0x20, 0x00, 0x41, 0x07, 0x71, - 0x76, 0x41, 0x01, 0x71, 0x0f, 0x0b, 0x20, 0x00, 0x41, 0xfe, 0xff, 0x0b, - 0x49, 0x0b, 0x49, 0x01, 0x03, 0x7f, 0x41, 0x00, 0x21, 0x03, 0x02, 0x40, - 0x20, 0x02, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x03, 0x40, 0x20, 0x00, 0x2d, - 0x00, 0x00, 0x22, 0x04, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x05, 0x47, - 0x0d, 0x01, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x00, 0x41, - 0x01, 0x6a, 0x21, 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, - 0x00, 0x0c, 0x02, 0x0b, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x6b, 0x21, 0x03, - 0x0b, 0x20, 0x03, 0x0b, 0xf6, 0x02, 0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, - 0x00, 0x47, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, - 0x20, 0x00, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, - 0x00, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, - 0x01, 0x71, 0x47, 0x0d, 0x00, 0x20, 0x00, 0x21, 0x04, 0x20, 0x02, 0x21, - 0x05, 0x0c, 0x03, 0x0b, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x05, 0x41, - 0x00, 0x47, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x04, 0x41, - 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, - 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, - 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, - 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, - 0x01, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, - 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, 0x02, 0x41, 0x7d, - 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x20, 0x00, 0x41, 0x03, - 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, - 0x0d, 0x01, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, - 0x71, 0x46, 0x0d, 0x02, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, - 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x0c, - 0x01, 0x0b, 0x20, 0x02, 0x21, 0x05, 0x20, 0x00, 0x21, 0x04, 0x0b, 0x20, - 0x03, 0x45, 0x0d, 0x01, 0x02, 0x40, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, - 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x00, 0x20, 0x05, 0x41, 0x04, - 0x49, 0x0d, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x41, 0x81, 0x82, - 0x84, 0x08, 0x6c, 0x21, 0x00, 0x03, 0x40, 0x41, 0x80, 0x82, 0x84, 0x08, - 0x20, 0x04, 0x28, 0x02, 0x00, 0x20, 0x00, 0x73, 0x22, 0x02, 0x6b, 0x20, - 0x02, 0x72, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, - 0x82, 0x84, 0x78, 0x47, 0x0d, 0x02, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, - 0x04, 0x20, 0x05, 0x41, 0x7c, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x4b, 0x0d, - 0x00, 0x0b, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x01, 0x41, - 0xff, 0x01, 0x71, 0x21, 0x02, 0x03, 0x40, 0x02, 0x40, 0x20, 0x04, 0x2d, - 0x00, 0x00, 0x20, 0x02, 0x47, 0x0d, 0x00, 0x20, 0x04, 0x0f, 0x0b, 0x20, - 0x04, 0x41, 0x01, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x7f, 0x6a, 0x22, - 0x05, 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, 0x0b, 0x67, 0x01, 0x02, 0x7f, - 0x20, 0x01, 0x2d, 0x00, 0x00, 0x21, 0x02, 0x02, 0x40, 0x20, 0x00, 0x2d, - 0x00, 0x00, 0x22, 0x03, 0x45, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x02, 0x41, - 0xff, 0x01, 0x71, 0x47, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, - 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, - 0x2d, 0x00, 0x00, 0x21, 0x02, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x03, - 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x01, - 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x03, 0x20, 0x02, 0x41, 0xff, 0x01, - 0x71, 0x46, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x03, 0x20, 0x02, 0x41, 0xff, - 0x01, 0x71, 0x6b, 0x0b, 0x0c, 0x00, 0x20, 0x00, 0x41, 0x00, 0x10, 0x9a, - 0x80, 0x80, 0x80, 0x00, 0x0b, 0xa6, 0x02, 0x01, 0x07, 0x7f, 0x02, 0x40, - 0x20, 0x00, 0x41, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, - 0x00, 0x41, 0xff, 0x01, 0x71, 0x22, 0x02, 0x41, 0x03, 0x6e, 0x22, 0x03, - 0x41, 0x03, 0x6c, 0x6b, 0x41, 0xff, 0x01, 0x71, 0x41, 0x02, 0x74, 0x28, - 0x02, 0xc0, 0x9e, 0x84, 0x80, 0x00, 0x20, 0x00, 0x41, 0x08, 0x76, 0x22, - 0x04, 0x2d, 0x00, 0xa0, 0xa9, 0x84, 0x80, 0x00, 0x41, 0xd6, 0x00, 0x6c, - 0x20, 0x03, 0x6a, 0x2d, 0x00, 0xa0, 0xa9, 0x84, 0x80, 0x00, 0x6c, 0x41, - 0x0b, 0x76, 0x41, 0x06, 0x70, 0x20, 0x04, 0x2d, 0x00, 0x90, 0xbe, 0x84, - 0x80, 0x00, 0x6a, 0x41, 0x02, 0x74, 0x28, 0x02, 0xd0, 0x9e, 0x84, 0x80, - 0x00, 0x22, 0x03, 0x41, 0x08, 0x75, 0x21, 0x04, 0x02, 0x40, 0x20, 0x03, - 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, 0x41, 0x01, 0x4b, 0x0d, 0x00, 0x20, - 0x04, 0x41, 0x00, 0x20, 0x03, 0x20, 0x01, 0x73, 0x6b, 0x71, 0x20, 0x00, - 0x6a, 0x0f, 0x0b, 0x20, 0x04, 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, 0x45, - 0x0d, 0x00, 0x20, 0x04, 0x41, 0x08, 0x76, 0x21, 0x04, 0x03, 0x40, 0x02, - 0x40, 0x20, 0x02, 0x20, 0x03, 0x41, 0x01, 0x76, 0x22, 0x05, 0x20, 0x04, - 0x6a, 0x22, 0x06, 0x41, 0x01, 0x74, 0x22, 0x07, 0x2d, 0x00, 0x90, 0xa6, - 0x84, 0x80, 0x00, 0x22, 0x08, 0x47, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x07, - 0x41, 0x90, 0xa6, 0x84, 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x01, 0x41, 0x02, - 0x74, 0x28, 0x02, 0xd0, 0x9e, 0x84, 0x80, 0x00, 0x22, 0x03, 0x41, 0xff, - 0x01, 0x71, 0x22, 0x04, 0x41, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x03, 0x41, - 0x08, 0x75, 0x41, 0x00, 0x20, 0x04, 0x20, 0x01, 0x73, 0x6b, 0x71, 0x20, - 0x00, 0x6a, 0x0f, 0x0b, 0x41, 0x7f, 0x41, 0x01, 0x20, 0x01, 0x1b, 0x20, - 0x00, 0x6a, 0x0f, 0x0b, 0x20, 0x04, 0x20, 0x06, 0x20, 0x02, 0x20, 0x08, - 0x49, 0x22, 0x08, 0x1b, 0x21, 0x04, 0x20, 0x05, 0x20, 0x03, 0x20, 0x05, - 0x6b, 0x20, 0x08, 0x1b, 0x22, 0x03, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, - 0x0b, 0x0c, 0x00, 0x20, 0x00, 0x41, 0x01, 0x10, 0x9a, 0x80, 0x80, 0x80, - 0x00, 0x0b, 0x87, 0x01, 0x01, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x02, 0x0d, - 0x00, 0x41, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, - 0x00, 0x00, 0x22, 0x03, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x03, 0x0c, 0x01, - 0x0b, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x02, 0x41, 0x7f, - 0x6a, 0x21, 0x02, 0x02, 0x40, 0x03, 0x40, 0x20, 0x03, 0x41, 0xff, 0x01, - 0x71, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x47, 0x0d, 0x01, 0x20, - 0x04, 0x45, 0x0d, 0x01, 0x20, 0x02, 0x41, 0x00, 0x46, 0x0d, 0x01, 0x20, - 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, + 0x00, 0x45, 0x04, 0x40, 0x41, 0x00, 0x0f, 0x0b, 0x20, 0x00, 0x41, 0x01, + 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, + 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x01, + 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, + 0x0d, 0x01, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, + 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, + 0x00, 0x41, 0x04, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x0d, 0x01, 0x0b, + 0x20, 0x01, 0x41, 0x04, 0x6b, 0x21, 0x02, 0x20, 0x01, 0x41, 0x05, 0x6b, + 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x41, + 0x80, 0x82, 0x84, 0x08, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x22, 0x02, 0x28, + 0x02, 0x00, 0x22, 0x03, 0x6b, 0x20, 0x03, 0x72, 0x41, 0x80, 0x81, 0x82, + 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x46, 0x0d, 0x00, + 0x0b, 0x03, 0x40, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, + 0x2d, 0x00, 0x00, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x21, 0x02, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x01, 0x20, 0x00, 0x6b, 0x0b, 0x38, 0x00, 0x20, 0x00, + 0x41, 0xff, 0xff, 0x07, 0x4d, 0x04, 0x40, 0x20, 0x00, 0x41, 0x03, 0x76, + 0x41, 0x1f, 0x71, 0x20, 0x00, 0x41, 0x08, 0x76, 0x2d, 0x00, 0x80, 0x80, + 0x04, 0x41, 0x05, 0x74, 0x72, 0x2d, 0x00, 0x80, 0x80, 0x04, 0x20, 0x00, + 0x41, 0x07, 0x71, 0x76, 0x41, 0x01, 0x71, 0x0f, 0x0b, 0x20, 0x00, 0x41, + 0xfe, 0xff, 0x0b, 0x49, 0x0b, 0x43, 0x01, 0x03, 0x7f, 0x02, 0x40, 0x20, + 0x02, 0x45, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, + 0x04, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x05, 0x46, 0x04, 0x40, 0x20, + 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, + 0x00, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x22, 0x02, 0x0d, 0x01, 0x0c, 0x02, + 0x0b, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x6b, 0x21, 0x03, 0x0b, 0x20, 0x03, + 0x0b, 0xe9, 0x02, 0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, 0x00, 0x47, 0x21, + 0x05, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x71, + 0x45, 0x20, 0x02, 0x45, 0x72, 0x45, 0x04, 0x40, 0x20, 0x00, 0x2d, 0x00, + 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x04, 0x40, 0x20, 0x00, + 0x21, 0x03, 0x20, 0x02, 0x21, 0x04, 0x0c, 0x03, 0x0b, 0x20, 0x02, 0x41, + 0x01, 0x6b, 0x22, 0x04, 0x41, 0x00, 0x47, 0x21, 0x05, 0x20, 0x00, 0x41, + 0x01, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x04, 0x45, 0x72, + 0x0d, 0x01, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, + 0x71, 0x46, 0x0d, 0x02, 0x20, 0x02, 0x41, 0x02, 0x6b, 0x22, 0x04, 0x41, + 0x00, 0x47, 0x21, 0x05, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x03, 0x41, + 0x03, 0x71, 0x45, 0x20, 0x04, 0x45, 0x72, 0x0d, 0x01, 0x20, 0x03, 0x2d, + 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, + 0x02, 0x41, 0x03, 0x6b, 0x22, 0x04, 0x41, 0x00, 0x47, 0x21, 0x05, 0x20, + 0x00, 0x41, 0x03, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x04, + 0x45, 0x72, 0x0d, 0x01, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, + 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, + 0x03, 0x20, 0x02, 0x41, 0x04, 0x6b, 0x22, 0x04, 0x41, 0x00, 0x47, 0x21, + 0x05, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x21, 0x04, 0x20, 0x00, 0x21, 0x03, + 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, + 0x22, 0x00, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x46, 0x20, 0x04, 0x41, 0x04, + 0x49, 0x72, 0x45, 0x04, 0x40, 0x20, 0x00, 0x41, 0x81, 0x82, 0x84, 0x08, + 0x6c, 0x21, 0x00, 0x03, 0x40, 0x41, 0x80, 0x82, 0x84, 0x08, 0x20, 0x03, + 0x28, 0x02, 0x00, 0x20, 0x00, 0x73, 0x22, 0x02, 0x6b, 0x20, 0x02, 0x72, + 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, + 0x78, 0x47, 0x0d, 0x02, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, + 0x04, 0x41, 0x04, 0x6b, 0x22, 0x04, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x01, 0x41, 0xff, 0x01, + 0x71, 0x21, 0x00, 0x03, 0x40, 0x20, 0x00, 0x20, 0x03, 0x2d, 0x00, 0x00, + 0x46, 0x04, 0x40, 0x20, 0x03, 0x0f, 0x0b, 0x20, 0x03, 0x41, 0x01, 0x6a, + 0x21, 0x03, 0x20, 0x04, 0x41, 0x01, 0x6b, 0x22, 0x04, 0x0d, 0x00, 0x0b, + 0x0b, 0x41, 0x00, 0x0b, 0x58, 0x01, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x22, 0x02, 0x45, 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, + 0x00, 0x22, 0x03, 0x47, 0x72, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x01, 0x6a, + 0x21, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x03, 0x40, 0x20, + 0x01, 0x2d, 0x00, 0x00, 0x21, 0x03, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, + 0x02, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, + 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x20, 0x03, 0x46, 0x0d, + 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x0b, 0x08, 0x00, 0x20, + 0x00, 0x41, 0x00, 0x10, 0x12, 0x0b, 0x90, 0x02, 0x01, 0x07, 0x7f, 0x02, + 0x40, 0x20, 0x00, 0x41, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x00, + 0x20, 0x00, 0x41, 0xff, 0x01, 0x71, 0x22, 0x05, 0x41, 0x03, 0x6e, 0x22, + 0x02, 0x41, 0x03, 0x6c, 0x6b, 0x41, 0xff, 0x01, 0x71, 0x41, 0x02, 0x74, + 0x28, 0x02, 0xc0, 0x9e, 0x04, 0x20, 0x02, 0x20, 0x00, 0x41, 0x08, 0x76, + 0x22, 0x02, 0x2d, 0x00, 0xa0, 0xa9, 0x04, 0x41, 0xd6, 0x00, 0x6c, 0x6a, + 0x2d, 0x00, 0xa0, 0xa9, 0x04, 0x6c, 0x41, 0x0b, 0x76, 0x41, 0x06, 0x70, + 0x20, 0x02, 0x2d, 0x00, 0x90, 0xbe, 0x04, 0x6a, 0x41, 0x02, 0x74, 0x28, + 0x02, 0xd0, 0x9e, 0x04, 0x22, 0x03, 0x41, 0x08, 0x75, 0x21, 0x02, 0x20, + 0x03, 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, 0x41, 0x01, 0x4d, 0x04, 0x40, + 0x20, 0x02, 0x41, 0x00, 0x20, 0x01, 0x20, 0x03, 0x73, 0x6b, 0x71, 0x20, + 0x00, 0x6a, 0x0f, 0x0b, 0x20, 0x02, 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, + 0x45, 0x0d, 0x00, 0x20, 0x02, 0x41, 0x08, 0x76, 0x21, 0x02, 0x03, 0x40, + 0x20, 0x03, 0x41, 0x01, 0x76, 0x22, 0x06, 0x20, 0x02, 0x6a, 0x22, 0x04, + 0x41, 0x01, 0x74, 0x22, 0x07, 0x2d, 0x00, 0x90, 0xa6, 0x04, 0x22, 0x08, + 0x20, 0x05, 0x46, 0x04, 0x40, 0x20, 0x07, 0x41, 0x90, 0xa6, 0x04, 0x6a, + 0x2d, 0x00, 0x01, 0x41, 0x02, 0x74, 0x28, 0x02, 0xd0, 0x9e, 0x04, 0x22, + 0x02, 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, 0x41, 0x01, 0x4d, 0x04, 0x40, + 0x41, 0x00, 0x20, 0x01, 0x20, 0x03, 0x73, 0x6b, 0x20, 0x02, 0x41, 0x08, + 0x75, 0x71, 0x20, 0x00, 0x6a, 0x0f, 0x0b, 0x41, 0x7f, 0x41, 0x01, 0x20, + 0x01, 0x1b, 0x20, 0x00, 0x6a, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x04, 0x20, + 0x05, 0x20, 0x08, 0x49, 0x22, 0x04, 0x1b, 0x21, 0x02, 0x20, 0x06, 0x20, + 0x03, 0x20, 0x06, 0x6b, 0x20, 0x04, 0x1b, 0x22, 0x03, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x00, 0x0b, 0x08, 0x00, 0x20, 0x00, 0x41, 0x01, 0x10, 0x12, + 0x0b, 0x75, 0x01, 0x02, 0x7f, 0x20, 0x02, 0x45, 0x04, 0x40, 0x41, 0x00, + 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x03, 0x45, + 0x04, 0x40, 0x41, 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x41, + 0x01, 0x6a, 0x21, 0x00, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x21, 0x02, 0x02, + 0x40, 0x03, 0x40, 0x20, 0x02, 0x45, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, + 0x00, 0x22, 0x04, 0x47, 0x20, 0x04, 0x45, 0x72, 0x72, 0x0d, 0x01, 0x20, + 0x02, 0x41, 0x01, 0x6b, 0x21, 0x02, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x03, 0x0d, 0x00, 0x0b, 0x41, 0x00, 0x21, 0x03, - 0x0b, 0x20, 0x03, 0x41, 0xff, 0x01, 0x71, 0x21, 0x03, 0x0b, 0x20, 0x03, - 0x20, 0x01, 0x2d, 0x00, 0x00, 0x6b, 0x0b, 0x0d, 0x00, 0x20, 0x00, 0x10, - 0x99, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x47, 0x0b, 0xb7, 0x0a, 0x01, - 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x21, 0x49, 0x0d, - 0x00, 0x20, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, - 0xfc, 0x0a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x20, 0x00, 0x20, 0x01, - 0x46, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x01, 0x20, 0x02, 0x20, 0x00, 0x6a, - 0x22, 0x03, 0x6b, 0x41, 0x00, 0x20, 0x02, 0x41, 0x01, 0x74, 0x6b, 0x4b, - 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x01, 0x20, - 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x20, 0x01, 0x20, - 0x00, 0x73, 0x41, 0x03, 0x71, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x02, - 0x40, 0x20, 0x00, 0x20, 0x01, 0x4f, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x04, - 0x45, 0x0d, 0x00, 0x20, 0x02, 0x21, 0x05, 0x20, 0x00, 0x21, 0x03, 0x0c, - 0x03, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, - 0x02, 0x21, 0x05, 0x20, 0x00, 0x21, 0x03, 0x0c, 0x02, 0x0b, 0x20, 0x02, - 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, - 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x05, 0x02, 0x40, 0x20, 0x00, - 0x41, 0x01, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x01, - 0x41, 0x01, 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x45, 0x0d, - 0x03, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, - 0x02, 0x41, 0x7e, 0x6a, 0x21, 0x05, 0x02, 0x40, 0x20, 0x00, 0x41, 0x02, - 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x01, 0x41, 0x02, - 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x03, 0x20, - 0x00, 0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x02, 0x41, - 0x7d, 0x6a, 0x21, 0x05, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, - 0x03, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x21, - 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, - 0x01, 0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x00, 0x41, 0x04, 0x6a, - 0x21, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, - 0x7c, 0x6a, 0x21, 0x05, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x04, 0x0d, - 0x00, 0x02, 0x40, 0x20, 0x03, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, - 0x02, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, - 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, 0x03, 0x6a, 0x2d, 0x00, 0x00, - 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x0d, 0x00, - 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x45, 0x0d, 0x04, - 0x20, 0x00, 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x22, 0x03, 0x6a, 0x22, 0x04, - 0x20, 0x01, 0x20, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x02, - 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, - 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, - 0x41, 0x7d, 0x6a, 0x22, 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, 0x03, - 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x04, 0x41, - 0x03, 0x71, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, - 0x03, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x22, - 0x02, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, - 0x00, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x02, 0x40, 0x20, - 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x06, 0x41, 0x0c, 0x71, 0x41, 0x0c, 0x46, - 0x0d, 0x00, 0x20, 0x06, 0x41, 0x02, 0x76, 0x41, 0x01, 0x6a, 0x41, 0x03, - 0x71, 0x21, 0x03, 0x20, 0x01, 0x41, 0x7c, 0x6a, 0x21, 0x04, 0x20, 0x00, - 0x41, 0x7c, 0x6a, 0x21, 0x05, 0x03, 0x40, 0x20, 0x05, 0x20, 0x02, 0x6a, - 0x20, 0x04, 0x20, 0x02, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, - 0x02, 0x41, 0x7c, 0x6a, 0x21, 0x02, 0x20, 0x03, 0x41, 0x7f, 0x6a, 0x22, - 0x03, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x06, 0x41, 0x0c, 0x49, 0x0d, 0x00, - 0x20, 0x01, 0x41, 0x70, 0x6a, 0x21, 0x05, 0x20, 0x00, 0x41, 0x70, 0x6a, - 0x21, 0x06, 0x03, 0x40, 0x20, 0x06, 0x20, 0x02, 0x6a, 0x22, 0x03, 0x41, - 0x0c, 0x6a, 0x20, 0x05, 0x20, 0x02, 0x6a, 0x22, 0x04, 0x41, 0x0c, 0x6a, - 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x20, - 0x04, 0x41, 0x08, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, - 0x41, 0x04, 0x6a, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x28, 0x02, 0x00, 0x36, - 0x02, 0x00, 0x20, 0x03, 0x20, 0x04, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, - 0x20, 0x02, 0x41, 0x70, 0x6a, 0x22, 0x02, 0x41, 0x03, 0x4b, 0x0d, 0x00, - 0x0b, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x02, 0x21, 0x03, 0x02, - 0x40, 0x20, 0x02, 0x41, 0x03, 0x71, 0x22, 0x04, 0x45, 0x0d, 0x00, 0x20, - 0x01, 0x41, 0x7f, 0x6a, 0x21, 0x05, 0x20, 0x00, 0x41, 0x7f, 0x6a, 0x21, - 0x06, 0x20, 0x02, 0x21, 0x03, 0x03, 0x40, 0x20, 0x06, 0x20, 0x03, 0x6a, - 0x20, 0x05, 0x20, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, - 0x03, 0x41, 0x7f, 0x6a, 0x21, 0x03, 0x20, 0x04, 0x41, 0x7f, 0x6a, 0x22, - 0x04, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, 0x0d, 0x02, - 0x20, 0x01, 0x41, 0x7c, 0x6a, 0x21, 0x04, 0x20, 0x00, 0x41, 0x7c, 0x6a, - 0x21, 0x05, 0x03, 0x40, 0x20, 0x05, 0x20, 0x03, 0x6a, 0x22, 0x01, 0x41, - 0x03, 0x6a, 0x20, 0x04, 0x20, 0x03, 0x6a, 0x22, 0x02, 0x41, 0x03, 0x6a, - 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x20, - 0x02, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, - 0x41, 0x01, 0x6a, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x2d, 0x00, 0x00, 0x3a, - 0x00, 0x00, 0x20, 0x01, 0x20, 0x02, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, - 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x22, 0x03, 0x0d, 0x00, 0x0c, 0x03, 0x0b, - 0x0b, 0x20, 0x05, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x05, - 0x41, 0x7c, 0x6a, 0x22, 0x04, 0x41, 0x1c, 0x71, 0x41, 0x1c, 0x46, 0x0d, - 0x00, 0x20, 0x05, 0x20, 0x04, 0x41, 0x02, 0x76, 0x41, 0x01, 0x6a, 0x41, - 0x07, 0x71, 0x22, 0x02, 0x41, 0x02, 0x74, 0x6b, 0x21, 0x05, 0x03, 0x40, - 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, - 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, - 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, - 0x04, 0x41, 0x1c, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, - 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x20, - 0x01, 0x41, 0x04, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, - 0x41, 0x08, 0x6a, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x28, 0x02, 0x00, 0x36, - 0x02, 0x00, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x20, 0x01, 0x41, 0x0c, 0x6a, - 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x20, - 0x01, 0x41, 0x10, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, - 0x41, 0x14, 0x6a, 0x20, 0x01, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x36, - 0x02, 0x00, 0x20, 0x03, 0x41, 0x18, 0x6a, 0x20, 0x01, 0x41, 0x18, 0x6a, - 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x1c, 0x6a, 0x20, - 0x01, 0x41, 0x1c, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, - 0x41, 0x20, 0x6a, 0x21, 0x01, 0x20, 0x03, 0x41, 0x20, 0x6a, 0x21, 0x03, - 0x20, 0x05, 0x41, 0x60, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x4b, 0x0d, 0x00, - 0x0b, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, - 0x05, 0x41, 0x07, 0x71, 0x22, 0x02, 0x0d, 0x00, 0x20, 0x05, 0x21, 0x04, - 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x78, 0x71, 0x21, 0x04, 0x03, 0x40, - 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, - 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, - 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, - 0x05, 0x41, 0x08, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, - 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x20, - 0x01, 0x41, 0x01, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, - 0x41, 0x02, 0x6a, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, - 0x00, 0x00, 0x20, 0x03, 0x41, 0x03, 0x6a, 0x20, 0x01, 0x41, 0x03, 0x6a, - 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x20, - 0x01, 0x41, 0x04, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, - 0x41, 0x05, 0x6a, 0x20, 0x01, 0x41, 0x05, 0x6a, 0x2d, 0x00, 0x00, 0x3a, - 0x00, 0x00, 0x20, 0x03, 0x41, 0x06, 0x6a, 0x20, 0x01, 0x41, 0x06, 0x6a, - 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x07, 0x6a, 0x20, - 0x01, 0x41, 0x07, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, - 0x41, 0x08, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, - 0x20, 0x04, 0x41, 0x78, 0x6a, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x0b, 0x20, - 0x00, 0x0b, 0x96, 0x03, 0x02, 0x03, 0x7f, 0x01, 0x7e, 0x02, 0x40, 0x02, - 0x40, 0x20, 0x02, 0x41, 0x21, 0x49, 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, - 0x01, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0b, 0x00, 0x20, 0x00, - 0x0f, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, - 0x00, 0x00, 0x20, 0x00, 0x20, 0x02, 0x6a, 0x22, 0x03, 0x41, 0x7f, 0x6a, - 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x03, 0x49, 0x0d, 0x00, - 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x02, 0x20, 0x00, 0x20, 0x01, 0x3a, - 0x00, 0x01, 0x20, 0x03, 0x41, 0x7d, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, - 0x20, 0x03, 0x41, 0x7e, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, - 0x41, 0x07, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x03, - 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, - 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x20, 0x00, 0x6b, - 0x41, 0x03, 0x71, 0x22, 0x04, 0x6a, 0x22, 0x05, 0x20, 0x01, 0x41, 0xff, - 0x01, 0x71, 0x41, 0x81, 0x82, 0x84, 0x08, 0x6c, 0x22, 0x03, 0x36, 0x02, - 0x00, 0x20, 0x05, 0x20, 0x02, 0x20, 0x04, 0x6b, 0x41, 0x3c, 0x71, 0x22, - 0x01, 0x6a, 0x22, 0x02, 0x41, 0x7c, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, - 0x20, 0x01, 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x03, 0x36, - 0x02, 0x08, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x04, 0x20, 0x02, 0x41, - 0x78, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x74, 0x6a, - 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x19, 0x49, 0x0d, 0x00, - 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x18, 0x20, 0x05, 0x20, 0x03, 0x36, - 0x02, 0x14, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x10, 0x20, 0x05, 0x20, - 0x03, 0x36, 0x02, 0x0c, 0x20, 0x02, 0x41, 0x70, 0x6a, 0x20, 0x03, 0x36, - 0x02, 0x00, 0x20, 0x02, 0x41, 0x6c, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, - 0x20, 0x02, 0x41, 0x68, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, - 0x41, 0x64, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x05, - 0x41, 0x04, 0x71, 0x41, 0x18, 0x72, 0x22, 0x02, 0x6b, 0x22, 0x01, 0x41, - 0x20, 0x49, 0x0d, 0x00, 0x20, 0x03, 0xad, 0x42, 0x81, 0x80, 0x80, 0x80, - 0x10, 0x7e, 0x21, 0x06, 0x20, 0x05, 0x20, 0x02, 0x6a, 0x21, 0x02, 0x03, - 0x40, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x18, - 0x6a, 0x20, 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x10, 0x6a, 0x20, - 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x08, 0x6a, 0x20, 0x06, 0x37, - 0x03, 0x00, 0x20, 0x02, 0x41, 0x20, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, - 0x60, 0x6a, 0x22, 0x01, 0x41, 0x1f, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, - 0x00, 0x0b, 0x0d, 0x00, 0x20, 0x00, 0x10, 0x9b, 0x80, 0x80, 0x80, 0x00, - 0x20, 0x00, 0x47, 0x0b, 0x85, 0x08, 0x01, 0x04, 0x7f, 0x02, 0x40, 0x02, - 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x20, 0x4b, 0x0d, 0x00, - 0x20, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x02, 0x45, 0x0d, - 0x01, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, - 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, - 0x04, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, - 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x20, 0x01, 0x2d, - 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x21, 0x03, - 0x20, 0x00, 0x41, 0x02, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x41, 0x02, 0x6a, - 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, - 0x02, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, - 0x02, 0x41, 0x7d, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x21, - 0x04, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, - 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x20, 0x01, 0x2d, - 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x21, 0x03, - 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x41, 0x04, 0x6a, - 0x21, 0x05, 0x0c, 0x02, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x00, - 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, - 0x20, 0x02, 0x21, 0x03, 0x20, 0x00, 0x21, 0x04, 0x20, 0x01, 0x21, 0x05, - 0x0b, 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x22, 0x02, 0x0d, 0x00, - 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x10, 0x4f, 0x0d, 0x00, 0x20, - 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x70, - 0x6a, 0x22, 0x02, 0x41, 0x10, 0x71, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, - 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, - 0x08, 0x37, 0x02, 0x08, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, 0x04, 0x20, - 0x05, 0x41, 0x10, 0x6a, 0x21, 0x05, 0x20, 0x02, 0x21, 0x03, 0x0b, 0x20, - 0x02, 0x41, 0x10, 0x49, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x03, 0x40, - 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, - 0x41, 0x08, 0x6a, 0x20, 0x05, 0x41, 0x08, 0x6a, 0x29, 0x02, 0x00, 0x37, - 0x02, 0x00, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x20, 0x05, 0x41, 0x10, 0x6a, - 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, 0x18, 0x6a, 0x20, - 0x05, 0x41, 0x18, 0x6a, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, - 0x41, 0x20, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x20, 0x6a, 0x21, 0x05, - 0x20, 0x02, 0x41, 0x60, 0x6a, 0x22, 0x02, 0x41, 0x0f, 0x4b, 0x0d, 0x00, - 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0x08, 0x49, 0x0d, 0x00, 0x20, - 0x04, 0x20, 0x05, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x05, 0x41, - 0x08, 0x6a, 0x21, 0x05, 0x20, 0x04, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0b, - 0x02, 0x40, 0x20, 0x02, 0x41, 0x04, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x04, - 0x20, 0x05, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x05, 0x41, 0x04, - 0x6a, 0x21, 0x05, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x0b, 0x02, - 0x40, 0x20, 0x02, 0x41, 0x02, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x04, 0x20, - 0x05, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x04, 0x41, 0x02, 0x6a, - 0x21, 0x04, 0x20, 0x05, 0x41, 0x02, 0x6a, 0x21, 0x05, 0x0b, 0x20, 0x02, - 0x41, 0x01, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, - 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, - 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x20, 0x49, 0x0d, - 0x00, 0x20, 0x04, 0x20, 0x05, 0x28, 0x02, 0x00, 0x22, 0x03, 0x3a, 0x00, - 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x0e, 0x03, - 0x03, 0x00, 0x01, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x03, 0x41, 0x08, 0x76, - 0x3a, 0x00, 0x01, 0x20, 0x04, 0x20, 0x05, 0x41, 0x06, 0x6a, 0x29, 0x01, - 0x00, 0x37, 0x02, 0x06, 0x20, 0x04, 0x20, 0x05, 0x28, 0x02, 0x04, 0x41, - 0x10, 0x74, 0x20, 0x03, 0x41, 0x10, 0x76, 0x72, 0x36, 0x02, 0x02, 0x20, - 0x04, 0x41, 0x12, 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, 0x12, 0x6a, 0x21, - 0x01, 0x41, 0x0e, 0x21, 0x06, 0x20, 0x05, 0x41, 0x0e, 0x6a, 0x28, 0x01, - 0x00, 0x21, 0x05, 0x41, 0x0e, 0x21, 0x03, 0x0c, 0x03, 0x0b, 0x20, 0x04, - 0x20, 0x05, 0x41, 0x05, 0x6a, 0x29, 0x00, 0x00, 0x37, 0x02, 0x05, 0x20, - 0x04, 0x20, 0x05, 0x28, 0x02, 0x04, 0x41, 0x18, 0x74, 0x20, 0x03, 0x41, - 0x08, 0x76, 0x72, 0x36, 0x02, 0x01, 0x20, 0x04, 0x41, 0x11, 0x6a, 0x21, - 0x02, 0x20, 0x05, 0x41, 0x11, 0x6a, 0x21, 0x01, 0x41, 0x0d, 0x21, 0x06, - 0x20, 0x05, 0x41, 0x0d, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x05, 0x41, 0x0f, - 0x21, 0x03, 0x0c, 0x02, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, - 0x10, 0x4f, 0x0d, 0x00, 0x20, 0x04, 0x21, 0x02, 0x20, 0x05, 0x21, 0x01, - 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x00, 0x3a, 0x00, - 0x00, 0x20, 0x04, 0x20, 0x05, 0x28, 0x00, 0x01, 0x36, 0x00, 0x01, 0x20, - 0x04, 0x20, 0x05, 0x29, 0x00, 0x05, 0x37, 0x00, 0x05, 0x20, 0x04, 0x20, - 0x05, 0x2f, 0x00, 0x0d, 0x3b, 0x00, 0x0d, 0x20, 0x04, 0x20, 0x05, 0x2d, - 0x00, 0x0f, 0x3a, 0x00, 0x0f, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, 0x02, - 0x20, 0x05, 0x41, 0x10, 0x6a, 0x21, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x08, - 0x71, 0x0d, 0x02, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x03, 0x41, 0x10, - 0x76, 0x3a, 0x00, 0x02, 0x20, 0x04, 0x20, 0x03, 0x41, 0x08, 0x76, 0x3a, - 0x00, 0x01, 0x20, 0x04, 0x20, 0x05, 0x41, 0x07, 0x6a, 0x29, 0x00, 0x00, - 0x37, 0x02, 0x07, 0x20, 0x04, 0x20, 0x05, 0x28, 0x02, 0x04, 0x41, 0x08, - 0x74, 0x20, 0x03, 0x41, 0x18, 0x76, 0x72, 0x36, 0x02, 0x03, 0x20, 0x04, - 0x41, 0x13, 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, 0x13, 0x6a, 0x21, 0x01, - 0x41, 0x0f, 0x21, 0x06, 0x20, 0x05, 0x41, 0x0f, 0x6a, 0x28, 0x00, 0x00, - 0x21, 0x05, 0x41, 0x0d, 0x21, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x06, 0x6a, - 0x20, 0x05, 0x36, 0x02, 0x00, 0x0b, 0x20, 0x02, 0x20, 0x01, 0x29, 0x00, - 0x00, 0x37, 0x00, 0x00, 0x20, 0x02, 0x41, 0x08, 0x6a, 0x21, 0x02, 0x20, - 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, - 0x04, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, 0x28, 0x00, 0x00, - 0x36, 0x00, 0x00, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x21, 0x02, 0x20, 0x01, - 0x41, 0x04, 0x6a, 0x21, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x02, - 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, 0x2f, 0x00, 0x00, 0x3b, - 0x00, 0x00, 0x20, 0x02, 0x41, 0x02, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, - 0x02, 0x6a, 0x21, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x01, 0x71, 0x45, 0x0d, - 0x00, 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x0b, - 0x20, 0x00, 0x0b, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x20, 0x46, 0x20, 0x00, - 0x41, 0x09, 0x46, 0x72, 0x0b, 0x0a, 0x00, 0x20, 0x00, 0x10, 0xa2, 0x80, - 0x80, 0x80, 0x00, 0x0b, 0x0a, 0x00, 0x20, 0x00, 0x41, 0x50, 0x6a, 0x41, - 0x0a, 0x49, 0x0b, 0x4d, 0x01, 0x02, 0x7f, 0x20, 0x00, 0x20, 0x00, 0x10, - 0x94, 0x80, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x03, 0x02, 0x40, 0x20, 0x02, - 0x45, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x04, - 0x45, 0x0d, 0x01, 0x20, 0x03, 0x20, 0x04, 0x3a, 0x00, 0x00, 0x20, 0x03, - 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, - 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, - 0x03, 0x41, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0b, 0xfa, 0x03, 0x01, - 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, - 0x20, 0x01, 0x20, 0x00, 0x73, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, - 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x41, 0x00, 0x47, 0x21, - 0x04, 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, 0x41, 0x03, 0x71, 0x0d, 0x00, - 0x20, 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x0d, - 0x00, 0x20, 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, - 0x2d, 0x00, 0x00, 0x22, 0x03, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x03, - 0x0d, 0x00, 0x20, 0x00, 0x21, 0x03, 0x20, 0x02, 0x21, 0x05, 0x0c, 0x05, - 0x0b, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x7f, - 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x04, 0x02, 0x40, 0x20, 0x01, - 0x41, 0x01, 0x6a, 0x22, 0x06, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, - 0x05, 0x45, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x06, 0x2d, 0x00, 0x00, 0x22, - 0x04, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x45, 0x0d, 0x05, 0x20, 0x00, 0x41, - 0x02, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x22, 0x05, 0x41, - 0x00, 0x47, 0x21, 0x04, 0x02, 0x40, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x22, - 0x06, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x05, 0x45, 0x0d, 0x00, - 0x20, 0x03, 0x20, 0x06, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x3a, 0x00, 0x00, - 0x20, 0x04, 0x45, 0x0d, 0x06, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x21, 0x03, - 0x20, 0x02, 0x41, 0x7d, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x04, - 0x02, 0x40, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x22, 0x06, 0x41, 0x03, 0x71, - 0x45, 0x0d, 0x00, 0x20, 0x05, 0x45, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x06, - 0x2d, 0x00, 0x00, 0x22, 0x04, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x45, 0x0d, - 0x07, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x04, - 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x02, 0x41, 0x00, - 0x47, 0x21, 0x04, 0x0c, 0x03, 0x0b, 0x20, 0x06, 0x21, 0x01, 0x20, 0x05, - 0x21, 0x02, 0x0c, 0x02, 0x0b, 0x20, 0x06, 0x21, 0x01, 0x20, 0x05, 0x21, - 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x06, 0x21, 0x01, 0x20, 0x05, 0x21, 0x02, - 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x02, 0x02, 0x40, 0x20, 0x01, 0x2d, 0x00, - 0x00, 0x0d, 0x00, 0x20, 0x02, 0x21, 0x05, 0x0c, 0x04, 0x0b, 0x20, 0x02, - 0x41, 0x04, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x41, 0x80, 0x82, 0x84, 0x08, - 0x20, 0x01, 0x28, 0x02, 0x00, 0x22, 0x00, 0x6b, 0x20, 0x00, 0x72, 0x41, - 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, - 0x47, 0x0d, 0x02, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, + 0x0b, 0x0b, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x6b, 0x0b, 0x09, + 0x00, 0x20, 0x00, 0x10, 0x11, 0x20, 0x00, 0x47, 0x0b, 0x93, 0x0a, 0x01, + 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x21, 0x4f, 0x04, + 0x40, 0x20, 0x02, 0x45, 0x0d, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x00, 0x20, + 0x01, 0x46, 0x0d, 0x00, 0x20, 0x01, 0x20, 0x00, 0x20, 0x02, 0x6a, 0x22, + 0x04, 0x6b, 0x41, 0x00, 0x20, 0x02, 0x41, 0x01, 0x74, 0x6b, 0x4d, 0x04, + 0x40, 0x20, 0x02, 0x45, 0x0d, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x00, 0x20, + 0x01, 0x73, 0x41, 0x03, 0x71, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x00, 0x20, 0x01, 0x49, 0x04, 0x40, 0x20, 0x03, 0x04, 0x40, 0x20, 0x02, + 0x21, 0x04, 0x20, 0x00, 0x21, 0x03, 0x0c, 0x03, 0x0b, 0x20, 0x00, 0x41, + 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x02, 0x21, 0x04, 0x20, 0x00, 0x21, + 0x03, 0x0c, 0x02, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, + 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x01, 0x6b, + 0x21, 0x04, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, + 0x45, 0x04, 0x40, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x0c, 0x02, + 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, + 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02, 0x41, 0x02, 0x6b, 0x21, 0x04, 0x20, + 0x00, 0x41, 0x02, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, + 0x20, 0x01, 0x41, 0x02, 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x04, + 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, + 0x02, 0x20, 0x02, 0x41, 0x03, 0x6b, 0x21, 0x04, 0x20, 0x00, 0x41, 0x03, + 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x01, 0x41, + 0x03, 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x03, + 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, - 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x02, 0x41, 0x03, 0x4b, 0x0d, 0x00, - 0x0b, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x01, 0x0b, 0x03, 0x40, 0x20, 0x03, - 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x00, 0x3a, 0x00, 0x00, 0x02, 0x40, - 0x20, 0x00, 0x0d, 0x00, 0x20, 0x02, 0x21, 0x05, 0x0c, 0x03, 0x0b, 0x20, - 0x03, 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, - 0x01, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, - 0x41, 0x00, 0x21, 0x05, 0x0b, 0x02, 0x40, 0x20, 0x05, 0x45, 0x0d, 0x00, - 0x20, 0x03, 0x41, 0x00, 0x20, 0x05, 0xfc, 0x0b, 0x00, 0x0b, 0x20, 0x03, - 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x10, 0xa6, 0x80, - 0x80, 0x80, 0x00, 0x1a, 0x20, 0x00, 0x0b, 0x17, 0x00, 0x20, 0x00, 0x41, - 0x50, 0x6a, 0x41, 0x0a, 0x49, 0x20, 0x00, 0x41, 0x20, 0x72, 0x41, 0x9f, - 0x7f, 0x6a, 0x41, 0x06, 0x49, 0x72, 0x0b, 0x2a, 0x01, 0x03, 0x7f, 0x41, - 0x00, 0x21, 0x01, 0x03, 0x40, 0x20, 0x00, 0x20, 0x01, 0x6a, 0x21, 0x02, - 0x20, 0x01, 0x41, 0x04, 0x6a, 0x22, 0x03, 0x21, 0x01, 0x20, 0x02, 0x28, - 0x02, 0x00, 0x0d, 0x00, 0x0b, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x41, 0x02, - 0x75, 0x0b, 0x45, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x20, 0x01, 0x45, 0x0d, - 0x00, 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x21, 0x00, 0x02, 0x40, 0x03, 0x40, - 0x20, 0x00, 0x41, 0x04, 0x6a, 0x22, 0x00, 0x28, 0x02, 0x00, 0x22, 0x02, - 0x45, 0x0d, 0x01, 0x20, 0x02, 0x20, 0x01, 0x47, 0x0d, 0x00, 0x0b, 0x0b, - 0x20, 0x00, 0x41, 0x00, 0x20, 0x02, 0x1b, 0x0f, 0x0b, 0x20, 0x00, 0x20, - 0x00, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x41, 0x02, 0x74, 0x6a, 0x0b, - 0x1d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, 0x00, 0x0f, 0x0b, - 0x41, 0x90, 0xc2, 0x84, 0x80, 0x00, 0x20, 0x00, 0x10, 0xaa, 0x80, 0x80, - 0x80, 0x00, 0x41, 0x00, 0x47, 0x0b, 0x24, 0x01, 0x01, 0x7f, 0x41, 0x01, - 0x21, 0x01, 0x02, 0x40, 0x20, 0x00, 0x41, 0x50, 0x6a, 0x41, 0x0a, 0x49, - 0x0d, 0x00, 0x20, 0x00, 0x10, 0x95, 0x80, 0x80, 0x80, 0x00, 0x41, 0x00, - 0x47, 0x21, 0x01, 0x0b, 0x20, 0x01, 0x0b, 0x0b, 0xfc, 0x42, 0x02, 0x00, - 0x41, 0x80, 0x80, 0x04, 0x0b, 0xe8, 0x42, 0x12, 0x11, 0x13, 0x14, 0x15, - 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, - 0x11, 0x22, 0x23, 0x24, 0x11, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, - 0x2c, 0x11, 0x2d, 0x2e, 0x2f, 0x10, 0x10, 0x30, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x31, 0x32, 0x33, 0x10, 0x34, 0x35, 0x10, 0x10, 0x11, + 0x20, 0x02, 0x41, 0x04, 0x6b, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x02, 0x40, + 0x20, 0x03, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x45, + 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, + 0x01, 0x6b, 0x22, 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, 0x03, 0x6a, + 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x41, 0x03, 0x71, 0x45, + 0x04, 0x40, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x45, + 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x02, 0x6b, 0x22, 0x03, 0x6a, + 0x22, 0x04, 0x20, 0x01, 0x20, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, + 0x00, 0x20, 0x04, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x03, 0x21, + 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, + 0x02, 0x41, 0x03, 0x6b, 0x22, 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, + 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x41, 0x03, + 0x71, 0x45, 0x04, 0x40, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, + 0x03, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x04, 0x6b, 0x22, + 0x02, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, + 0x00, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x20, 0x02, 0x41, + 0x04, 0x6b, 0x22, 0x04, 0x41, 0x0c, 0x71, 0x41, 0x0c, 0x47, 0x04, 0x40, + 0x20, 0x04, 0x41, 0x02, 0x76, 0x41, 0x01, 0x6a, 0x41, 0x03, 0x71, 0x21, + 0x03, 0x20, 0x01, 0x41, 0x04, 0x6b, 0x21, 0x05, 0x20, 0x00, 0x41, 0x04, + 0x6b, 0x21, 0x06, 0x03, 0x40, 0x20, 0x02, 0x20, 0x06, 0x6a, 0x20, 0x02, + 0x20, 0x05, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, + 0x04, 0x6b, 0x21, 0x02, 0x20, 0x03, 0x41, 0x01, 0x6b, 0x22, 0x03, 0x0d, + 0x00, 0x0b, 0x0b, 0x20, 0x04, 0x41, 0x0c, 0x49, 0x0d, 0x00, 0x20, 0x01, + 0x41, 0x10, 0x6b, 0x21, 0x05, 0x20, 0x00, 0x41, 0x10, 0x6b, 0x21, 0x06, + 0x03, 0x40, 0x20, 0x02, 0x20, 0x06, 0x6a, 0x22, 0x03, 0x41, 0x0c, 0x6a, + 0x20, 0x02, 0x20, 0x05, 0x6a, 0x22, 0x04, 0x41, 0x0c, 0x6a, 0x28, 0x02, + 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x20, 0x04, 0x41, + 0x08, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x04, + 0x6a, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, + 0x20, 0x03, 0x20, 0x04, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x02, + 0x41, 0x10, 0x6b, 0x22, 0x02, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x02, 0x22, 0x03, 0x41, 0x03, 0x71, + 0x22, 0x05, 0x04, 0x40, 0x20, 0x01, 0x41, 0x01, 0x6b, 0x21, 0x04, 0x20, + 0x00, 0x41, 0x01, 0x6b, 0x21, 0x06, 0x03, 0x40, 0x20, 0x03, 0x20, 0x06, + 0x6a, 0x20, 0x03, 0x20, 0x04, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, + 0x20, 0x03, 0x41, 0x01, 0x6b, 0x21, 0x03, 0x20, 0x05, 0x41, 0x01, 0x6b, + 0x22, 0x05, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, 0x0d, + 0x02, 0x20, 0x01, 0x41, 0x04, 0x6b, 0x21, 0x04, 0x20, 0x00, 0x41, 0x04, + 0x6b, 0x21, 0x05, 0x03, 0x40, 0x20, 0x03, 0x20, 0x05, 0x6a, 0x22, 0x01, + 0x41, 0x03, 0x6a, 0x20, 0x03, 0x20, 0x04, 0x6a, 0x22, 0x02, 0x41, 0x03, + 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x02, 0x6a, + 0x20, 0x02, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, + 0x01, 0x41, 0x01, 0x6a, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x2d, 0x00, 0x00, + 0x3a, 0x00, 0x00, 0x20, 0x01, 0x20, 0x02, 0x2d, 0x00, 0x00, 0x3a, 0x00, + 0x00, 0x20, 0x03, 0x41, 0x04, 0x6b, 0x22, 0x03, 0x0d, 0x00, 0x0b, 0x0c, + 0x02, 0x0b, 0x20, 0x04, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x20, 0x04, 0x41, + 0x04, 0x6b, 0x22, 0x05, 0x41, 0x1c, 0x71, 0x41, 0x1c, 0x47, 0x04, 0x40, + 0x20, 0x04, 0x20, 0x05, 0x41, 0x02, 0x76, 0x41, 0x01, 0x6a, 0x41, 0x07, + 0x71, 0x22, 0x02, 0x41, 0x02, 0x74, 0x6b, 0x21, 0x04, 0x03, 0x40, 0x20, + 0x03, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, + 0x04, 0x6a, 0x21, 0x01, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, + 0x02, 0x41, 0x01, 0x6b, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x05, + 0x41, 0x1c, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, 0x28, + 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x20, 0x01, + 0x41, 0x04, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, + 0x08, 0x6a, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, + 0x00, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x20, 0x01, 0x41, 0x0c, 0x6a, 0x28, + 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x20, 0x01, + 0x41, 0x10, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, + 0x14, 0x6a, 0x20, 0x01, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, + 0x00, 0x20, 0x03, 0x41, 0x18, 0x6a, 0x20, 0x01, 0x41, 0x18, 0x6a, 0x28, + 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x1c, 0x6a, 0x20, 0x01, + 0x41, 0x1c, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, + 0x20, 0x6a, 0x21, 0x01, 0x20, 0x03, 0x41, 0x20, 0x6a, 0x21, 0x03, 0x20, + 0x04, 0x41, 0x20, 0x6b, 0x22, 0x04, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x04, 0x41, 0x07, + 0x71, 0x22, 0x02, 0x45, 0x04, 0x40, 0x20, 0x04, 0x21, 0x05, 0x0c, 0x01, + 0x0b, 0x20, 0x04, 0x41, 0x78, 0x71, 0x21, 0x05, 0x03, 0x40, 0x20, 0x03, + 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x01, + 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, + 0x41, 0x01, 0x6b, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x04, 0x41, + 0x08, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, + 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x20, 0x01, 0x41, + 0x01, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x02, + 0x6a, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, + 0x20, 0x03, 0x41, 0x03, 0x6a, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x2d, 0x00, + 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x20, 0x01, 0x41, + 0x04, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x05, + 0x6a, 0x20, 0x01, 0x41, 0x05, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, + 0x20, 0x03, 0x41, 0x06, 0x6a, 0x20, 0x01, 0x41, 0x06, 0x6a, 0x2d, 0x00, + 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x07, 0x6a, 0x20, 0x01, 0x41, + 0x07, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x08, + 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, 0x20, 0x05, + 0x41, 0x08, 0x6b, 0x22, 0x05, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0f, + 0x0b, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x20, + 0x00, 0x0b, 0x94, 0x03, 0x02, 0x03, 0x7f, 0x01, 0x7e, 0x02, 0x40, 0x20, + 0x02, 0x41, 0x21, 0x4f, 0x04, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x01, 0x20, + 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0b, 0x00, 0x20, 0x00, 0x0f, 0x0b, + 0x20, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x00, + 0x20, 0x00, 0x20, 0x02, 0x6a, 0x22, 0x03, 0x41, 0x01, 0x6b, 0x20, 0x01, + 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x03, 0x49, 0x0d, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x3a, 0x00, 0x02, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x01, + 0x20, 0x03, 0x41, 0x03, 0x6b, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x03, + 0x41, 0x02, 0x6b, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x07, + 0x49, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x03, 0x20, 0x03, + 0x41, 0x04, 0x6b, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x09, + 0x49, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x20, 0x00, 0x6b, 0x41, 0x03, + 0x71, 0x22, 0x05, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, + 0x41, 0x81, 0x82, 0x84, 0x08, 0x6c, 0x22, 0x03, 0x36, 0x02, 0x00, 0x20, + 0x04, 0x20, 0x02, 0x20, 0x05, 0x6b, 0x41, 0x3c, 0x71, 0x22, 0x02, 0x6a, + 0x22, 0x01, 0x41, 0x04, 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, + 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, 0x08, + 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, 0x04, 0x20, 0x01, 0x41, 0x08, 0x6b, + 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x0c, 0x6b, 0x20, 0x03, + 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x19, 0x49, 0x0d, 0x00, 0x20, 0x04, + 0x20, 0x03, 0x36, 0x02, 0x18, 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, 0x14, + 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, 0x10, 0x20, 0x04, 0x20, 0x03, 0x36, + 0x02, 0x0c, 0x20, 0x01, 0x41, 0x10, 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, + 0x20, 0x01, 0x41, 0x14, 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, + 0x41, 0x18, 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x1c, + 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x20, 0x04, 0x41, 0x04, + 0x71, 0x41, 0x18, 0x72, 0x22, 0x02, 0x6b, 0x22, 0x01, 0x41, 0x20, 0x49, + 0x0d, 0x00, 0x20, 0x03, 0xad, 0x42, 0x81, 0x80, 0x80, 0x80, 0x10, 0x7e, + 0x21, 0x06, 0x20, 0x02, 0x20, 0x04, 0x6a, 0x21, 0x02, 0x03, 0x40, 0x20, + 0x02, 0x20, 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x18, 0x6a, 0x20, + 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x10, 0x6a, 0x20, 0x06, 0x37, + 0x03, 0x00, 0x20, 0x02, 0x41, 0x08, 0x6a, 0x20, 0x06, 0x37, 0x03, 0x00, + 0x20, 0x02, 0x41, 0x20, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x20, 0x6b, + 0x22, 0x01, 0x41, 0x1f, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, + 0x09, 0x00, 0x20, 0x00, 0x10, 0x13, 0x20, 0x00, 0x47, 0x0b, 0xd5, 0x07, + 0x01, 0x04, 0x7f, 0x02, 0x40, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x02, 0x41, + 0x20, 0x4d, 0x04, 0x40, 0x20, 0x01, 0x41, 0x03, 0x71, 0x45, 0x20, 0x02, + 0x45, 0x72, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, + 0x00, 0x00, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x20, 0x01, 0x41, 0x01, 0x6a, + 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x22, + 0x05, 0x45, 0x72, 0x0d, 0x02, 0x1a, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, + 0x01, 0x3a, 0x00, 0x01, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x20, 0x01, 0x41, + 0x02, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x02, 0x41, 0x02, + 0x6b, 0x22, 0x05, 0x45, 0x72, 0x0d, 0x02, 0x1a, 0x20, 0x00, 0x20, 0x01, + 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x20, + 0x01, 0x41, 0x03, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x02, + 0x41, 0x03, 0x6b, 0x22, 0x05, 0x45, 0x72, 0x0d, 0x02, 0x1a, 0x20, 0x00, + 0x20, 0x01, 0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x02, 0x41, 0x04, + 0x6b, 0x21, 0x05, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x00, + 0x41, 0x04, 0x6a, 0x0c, 0x02, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x02, 0x20, + 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x20, 0x00, 0x0f, + 0x0b, 0x20, 0x02, 0x21, 0x05, 0x20, 0x01, 0x21, 0x03, 0x20, 0x00, 0x0b, + 0x22, 0x04, 0x41, 0x03, 0x71, 0x22, 0x02, 0x45, 0x04, 0x40, 0x02, 0x40, + 0x20, 0x05, 0x41, 0x10, 0x49, 0x04, 0x40, 0x20, 0x05, 0x21, 0x02, 0x0c, + 0x01, 0x0b, 0x20, 0x05, 0x41, 0x10, 0x6b, 0x22, 0x02, 0x41, 0x10, 0x71, + 0x45, 0x04, 0x40, 0x20, 0x04, 0x20, 0x03, 0x29, 0x02, 0x00, 0x37, 0x02, + 0x00, 0x20, 0x04, 0x20, 0x03, 0x29, 0x02, 0x08, 0x37, 0x02, 0x08, 0x20, + 0x04, 0x41, 0x10, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x21, + 0x03, 0x20, 0x02, 0x21, 0x05, 0x0b, 0x20, 0x02, 0x41, 0x10, 0x49, 0x0d, + 0x00, 0x20, 0x05, 0x21, 0x02, 0x03, 0x40, 0x20, 0x04, 0x20, 0x03, 0x29, + 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, 0x08, 0x6a, 0x20, 0x03, + 0x41, 0x08, 0x6a, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, + 0x10, 0x6a, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x29, 0x02, 0x00, 0x37, 0x02, + 0x00, 0x20, 0x04, 0x41, 0x18, 0x6a, 0x20, 0x03, 0x41, 0x18, 0x6a, 0x29, + 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, 0x20, 0x6a, 0x21, 0x04, + 0x20, 0x03, 0x41, 0x20, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x20, 0x6b, + 0x22, 0x02, 0x41, 0x0f, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x41, + 0x08, 0x4f, 0x04, 0x40, 0x20, 0x04, 0x20, 0x03, 0x29, 0x02, 0x00, 0x37, + 0x02, 0x00, 0x20, 0x04, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x41, + 0x08, 0x6a, 0x21, 0x03, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x71, 0x04, 0x40, + 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x04, + 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, + 0x0b, 0x20, 0x02, 0x41, 0x02, 0x71, 0x04, 0x40, 0x20, 0x04, 0x20, 0x03, + 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x04, 0x41, 0x02, 0x6a, 0x21, + 0x04, 0x20, 0x03, 0x41, 0x02, 0x6a, 0x21, 0x03, 0x0b, 0x20, 0x02, 0x41, + 0x01, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x20, 0x03, 0x2d, 0x00, 0x00, + 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x7f, 0x02, 0x40, 0x20, 0x05, 0x41, 0x20, 0x4f, 0x04, 0x40, 0x20, 0x04, + 0x20, 0x03, 0x28, 0x02, 0x00, 0x22, 0x01, 0x3a, 0x00, 0x00, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x02, 0x41, 0x02, 0x6b, 0x0e, 0x02, 0x00, 0x01, 0x03, + 0x0b, 0x20, 0x04, 0x20, 0x01, 0x41, 0x08, 0x76, 0x3a, 0x00, 0x01, 0x20, + 0x04, 0x20, 0x03, 0x41, 0x06, 0x6a, 0x29, 0x01, 0x00, 0x37, 0x02, 0x06, + 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x04, 0x41, 0x10, 0x74, 0x20, 0x01, + 0x41, 0x10, 0x76, 0x72, 0x36, 0x02, 0x02, 0x20, 0x03, 0x41, 0x12, 0x6a, + 0x21, 0x01, 0x41, 0x0e, 0x21, 0x06, 0x20, 0x03, 0x41, 0x0e, 0x6a, 0x28, + 0x01, 0x00, 0x21, 0x03, 0x41, 0x0e, 0x21, 0x05, 0x20, 0x04, 0x41, 0x12, + 0x6a, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x03, 0x41, 0x05, 0x6a, 0x29, + 0x00, 0x00, 0x37, 0x02, 0x05, 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x04, + 0x41, 0x18, 0x74, 0x20, 0x01, 0x41, 0x08, 0x76, 0x72, 0x36, 0x02, 0x01, + 0x20, 0x03, 0x41, 0x11, 0x6a, 0x21, 0x01, 0x41, 0x0d, 0x21, 0x06, 0x20, + 0x03, 0x41, 0x0d, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x03, 0x41, 0x0f, 0x21, + 0x05, 0x20, 0x04, 0x41, 0x11, 0x6a, 0x0c, 0x02, 0x0b, 0x02, 0x7f, 0x20, + 0x05, 0x41, 0x10, 0x49, 0x04, 0x40, 0x20, 0x04, 0x21, 0x02, 0x20, 0x03, + 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x3a, 0x00, + 0x00, 0x20, 0x04, 0x20, 0x03, 0x28, 0x00, 0x01, 0x36, 0x00, 0x01, 0x20, + 0x04, 0x20, 0x03, 0x29, 0x00, 0x05, 0x37, 0x00, 0x05, 0x20, 0x04, 0x20, + 0x03, 0x2f, 0x00, 0x0d, 0x3b, 0x00, 0x0d, 0x20, 0x04, 0x20, 0x03, 0x2d, + 0x00, 0x0f, 0x3a, 0x00, 0x0f, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, 0x02, + 0x20, 0x03, 0x41, 0x10, 0x6a, 0x0b, 0x21, 0x01, 0x20, 0x05, 0x41, 0x08, + 0x71, 0x0d, 0x02, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x01, 0x41, 0x10, + 0x76, 0x3a, 0x00, 0x02, 0x20, 0x04, 0x20, 0x01, 0x41, 0x08, 0x76, 0x3a, + 0x00, 0x01, 0x20, 0x04, 0x20, 0x03, 0x41, 0x07, 0x6a, 0x29, 0x00, 0x00, + 0x37, 0x02, 0x07, 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x04, 0x41, 0x08, + 0x74, 0x20, 0x01, 0x41, 0x18, 0x76, 0x72, 0x36, 0x02, 0x03, 0x20, 0x03, + 0x41, 0x13, 0x6a, 0x21, 0x01, 0x41, 0x0f, 0x21, 0x06, 0x20, 0x03, 0x41, + 0x0f, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x03, 0x41, 0x0d, 0x21, 0x05, 0x20, + 0x04, 0x41, 0x13, 0x6a, 0x0b, 0x21, 0x02, 0x20, 0x04, 0x20, 0x06, 0x6a, + 0x20, 0x03, 0x36, 0x02, 0x00, 0x0b, 0x20, 0x02, 0x20, 0x01, 0x29, 0x00, + 0x00, 0x37, 0x00, 0x00, 0x20, 0x02, 0x41, 0x08, 0x6a, 0x21, 0x02, 0x20, + 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x04, 0x71, + 0x04, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x00, 0x00, 0x36, 0x00, 0x00, + 0x20, 0x02, 0x41, 0x04, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x04, 0x6a, + 0x21, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x02, 0x71, 0x04, 0x40, 0x20, 0x02, + 0x20, 0x01, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x02, 0x41, 0x02, + 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x21, 0x01, 0x0b, 0x20, + 0x05, 0x41, 0x01, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, 0x2d, + 0x00, 0x00, 0x3a, 0x00, 0x00, 0x0b, 0x20, 0x00, 0x0b, 0x0d, 0x00, 0x20, + 0x00, 0x41, 0x20, 0x46, 0x20, 0x00, 0x41, 0x09, 0x46, 0x72, 0x0b, 0x0a, + 0x00, 0x20, 0x00, 0x41, 0x30, 0x6b, 0x41, 0x0a, 0x49, 0x0b, 0x49, 0x01, + 0x02, 0x7f, 0x20, 0x00, 0x10, 0x0c, 0x20, 0x00, 0x6a, 0x21, 0x03, 0x02, + 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, + 0x00, 0x22, 0x04, 0x45, 0x0d, 0x01, 0x20, 0x03, 0x20, 0x04, 0x3a, 0x00, + 0x00, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, + 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x22, 0x02, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x03, 0x41, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0b, + 0xeb, 0x03, 0x01, 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x00, 0x20, 0x01, 0x22, 0x03, 0x73, 0x41, 0x03, 0x71, 0x04, + 0x40, 0x20, 0x00, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x41, 0x00, + 0x47, 0x21, 0x06, 0x02, 0x40, 0x20, 0x03, 0x41, 0x03, 0x71, 0x45, 0x04, + 0x40, 0x20, 0x00, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x45, 0x04, + 0x40, 0x20, 0x00, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x03, + 0x2d, 0x00, 0x00, 0x22, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x45, 0x04, + 0x40, 0x20, 0x00, 0x21, 0x04, 0x20, 0x02, 0x21, 0x01, 0x0c, 0x05, 0x0b, + 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x04, 0x20, 0x02, 0x41, 0x01, 0x6b, + 0x22, 0x01, 0x41, 0x00, 0x47, 0x21, 0x06, 0x20, 0x03, 0x41, 0x01, 0x6a, + 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, 0x20, 0x01, 0x45, 0x72, 0x45, 0x04, + 0x40, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x00, 0x22, 0x05, 0x3a, 0x00, + 0x00, 0x20, 0x05, 0x45, 0x0d, 0x05, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x21, + 0x04, 0x20, 0x02, 0x41, 0x02, 0x6b, 0x22, 0x01, 0x41, 0x00, 0x47, 0x21, + 0x06, 0x20, 0x03, 0x41, 0x02, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, + 0x20, 0x01, 0x45, 0x72, 0x45, 0x04, 0x40, 0x20, 0x04, 0x20, 0x05, 0x2d, + 0x00, 0x00, 0x22, 0x05, 0x3a, 0x00, 0x00, 0x20, 0x05, 0x45, 0x0d, 0x06, + 0x20, 0x00, 0x41, 0x03, 0x6a, 0x21, 0x04, 0x20, 0x02, 0x41, 0x03, 0x6b, + 0x22, 0x01, 0x41, 0x00, 0x47, 0x21, 0x06, 0x20, 0x03, 0x41, 0x03, 0x6a, + 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, 0x20, 0x01, 0x45, 0x72, 0x45, 0x04, + 0x40, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x00, 0x22, 0x05, 0x3a, 0x00, + 0x00, 0x20, 0x05, 0x45, 0x0d, 0x07, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, + 0x04, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x04, + 0x6b, 0x22, 0x02, 0x41, 0x00, 0x47, 0x21, 0x06, 0x0c, 0x03, 0x0b, 0x20, + 0x05, 0x21, 0x03, 0x20, 0x01, 0x21, 0x02, 0x0c, 0x02, 0x0b, 0x20, 0x05, + 0x21, 0x03, 0x20, 0x01, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x21, + 0x03, 0x20, 0x01, 0x21, 0x02, 0x0b, 0x20, 0x06, 0x45, 0x0d, 0x02, 0x20, + 0x03, 0x2d, 0x00, 0x00, 0x45, 0x04, 0x40, 0x20, 0x02, 0x21, 0x01, 0x0c, + 0x04, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x41, + 0x80, 0x82, 0x84, 0x08, 0x20, 0x03, 0x28, 0x02, 0x00, 0x22, 0x01, 0x6b, + 0x20, 0x01, 0x72, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, + 0x81, 0x82, 0x84, 0x78, 0x47, 0x0d, 0x02, 0x20, 0x04, 0x20, 0x01, 0x36, + 0x02, 0x00, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x41, + 0x04, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x04, 0x6b, 0x22, 0x02, 0x41, + 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x01, 0x0b, + 0x03, 0x40, 0x20, 0x04, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x22, 0x01, 0x3a, + 0x00, 0x00, 0x20, 0x01, 0x45, 0x04, 0x40, 0x20, 0x02, 0x21, 0x01, 0x0c, + 0x03, 0x0b, 0x20, 0x04, 0x41, 0x01, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x41, + 0x01, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x22, 0x02, 0x0d, + 0x00, 0x0b, 0x0b, 0x41, 0x00, 0x21, 0x01, 0x0b, 0x20, 0x01, 0x04, 0x40, + 0x20, 0x04, 0x41, 0x00, 0x20, 0x01, 0xfc, 0x0b, 0x00, 0x0b, 0x20, 0x00, + 0x0b, 0x17, 0x00, 0x20, 0x00, 0x41, 0x30, 0x6b, 0x41, 0x0a, 0x49, 0x20, + 0x00, 0x41, 0x20, 0x72, 0x41, 0xe1, 0x00, 0x6b, 0x41, 0x06, 0x49, 0x72, + 0x0b, 0x67, 0x01, 0x02, 0x7f, 0x20, 0x00, 0x45, 0x04, 0x40, 0x41, 0x00, + 0x0f, 0x0b, 0x02, 0x7f, 0x20, 0x00, 0x04, 0x40, 0x41, 0x8c, 0xc2, 0x04, + 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x22, 0x01, 0x28, + 0x02, 0x00, 0x22, 0x02, 0x41, 0x00, 0x20, 0x00, 0x20, 0x02, 0x47, 0x1b, + 0x0d, 0x00, 0x0b, 0x20, 0x01, 0x41, 0x00, 0x20, 0x02, 0x1b, 0x0c, 0x01, + 0x0b, 0x41, 0x00, 0x21, 0x00, 0x03, 0x40, 0x20, 0x00, 0x41, 0x90, 0xc2, + 0x04, 0x6a, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x00, 0x28, 0x02, 0x00, + 0x0d, 0x00, 0x0b, 0x20, 0x00, 0x41, 0x04, 0x6b, 0x41, 0x7c, 0x71, 0x41, + 0x90, 0xc2, 0x04, 0x6a, 0x0b, 0x41, 0x00, 0x47, 0x0b, 0x1d, 0x01, 0x01, + 0x7f, 0x41, 0x01, 0x21, 0x01, 0x20, 0x00, 0x41, 0x30, 0x6b, 0x41, 0x0a, + 0x4f, 0x04, 0x7f, 0x20, 0x00, 0x10, 0x0d, 0x41, 0x00, 0x47, 0x05, 0x20, + 0x01, 0x0b, 0x0b, 0x0b, 0xfc, 0x42, 0x02, 0x00, 0x41, 0x80, 0x80, 0x04, + 0x0b, 0xe8, 0x42, 0x12, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x11, 0x22, 0x23, 0x24, + 0x11, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x11, 0x2d, 0x2e, + 0x2f, 0x10, 0x10, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x31, + 0x32, 0x33, 0x10, 0x34, 0x35, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x36, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x36, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x37, 0x11, - 0x11, 0x11, 0x11, 0x38, 0x11, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x37, 0x11, 0x11, 0x11, 0x11, 0x38, + 0x11, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x3f, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x11, 0x11, 0x3f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x11, 0x40, 0x41, 0x11, 0x42, 0x43, 0x44, 0x45, - 0x46, 0x47, 0x48, 0x49, 0x4a, 0x11, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, - 0x51, 0x10, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, - 0x5c, 0x5d, 0x10, 0x5e, 0x5f, 0x60, 0x10, 0x11, 0x11, 0x11, 0x61, 0x62, - 0x63, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, - 0x11, 0x11, 0x11, 0x64, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x65, 0x10, 0x10, + 0x11, 0x40, 0x41, 0x11, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x11, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x10, 0x52, 0x53, + 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x10, 0x5e, + 0x5f, 0x60, 0x10, 0x11, 0x11, 0x11, 0x61, 0x62, 0x63, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x64, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x11, 0x11, 0x65, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x66, 0x67, 0x10, - 0x10, 0x68, 0x69, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x10, 0x10, 0x10, 0x11, 0x11, 0x66, 0x67, 0x10, 0x10, 0x68, 0x69, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x6a, 0x11, 0x11, 0x6b, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x6a, 0x11, + 0x11, 0x6b, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x6c, 0x6d, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x6e, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x11, 0x6c, 0x6d, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x6e, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x6f, 0x70, 0x71, 0x72, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x73, 0x74, 0x75, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x76, 0x77, 0x10, 0x10, 0x10, 0x10, 0x78, 0x10, 0x10, - 0x79, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x10, 0x10, 0x6f, 0x70, 0x71, 0x72, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x73, 0x74, 0x75, 0x10, 0x10, 0x10, 0x10, 0x10, 0x76, + 0x77, 0x10, 0x10, 0x10, 0x10, 0x78, 0x10, 0x10, 0x79, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x04, 0xff, 0xff, 0x7f, 0xff, 0xff, - 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc3, 0xff, 0x03, 0x00, 0x1f, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xdf, 0xbc, 0x40, 0xd7, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0x7f, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xbf, 0xb6, 0x00, 0xff, 0xff, 0xff, 0x87, 0x07, 0x00, 0x00, - 0x00, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, - 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xef, 0x1f, 0xfe, 0xe1, 0xff, 0x9f, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x07, 0x30, 0x04, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x1f, 0x00, 0x00, 0xff, - 0xff, 0xff, 0x01, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xdf, 0x3f, 0x00, 0x00, 0xf0, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xdf, 0xe1, 0xff, 0xcf, - 0xff, 0xfe, 0xff, 0xef, 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xc5, 0xe3, 0x9f, - 0x59, 0x80, 0xb0, 0xcf, 0xff, 0x03, 0x10, 0xee, 0x87, 0xf9, 0xff, 0xff, - 0xfd, 0x6d, 0xc3, 0x87, 0x19, 0x02, 0x5e, 0xc0, 0xff, 0x3f, 0x00, 0xee, - 0xbf, 0xfb, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0xbf, 0x1b, 0x01, 0x00, 0xcf, - 0xff, 0x00, 0x1e, 0xee, 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0x9f, - 0x19, 0xc0, 0xb0, 0xcf, 0xff, 0x02, 0x00, 0xec, 0xc7, 0x3d, 0xd6, 0x18, - 0xc7, 0xff, 0xc3, 0xc7, 0x1d, 0x81, 0x00, 0xc0, 0xff, 0x00, 0x00, 0xef, - 0xdf, 0xfd, 0xff, 0xff, 0xfd, 0xff, 0xe3, 0xdf, 0x1d, 0x60, 0x07, 0xcf, - 0xff, 0x00, 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, 0xfd, 0xef, 0xe3, 0xdf, - 0x1d, 0x60, 0x40, 0xcf, 0xff, 0x06, 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, - 0xff, 0xff, 0xe7, 0xdf, 0x5d, 0xf0, 0x80, 0xcf, 0xff, 0x00, 0xfc, 0xec, - 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xfb, 0x2f, 0x7f, 0x80, 0x5f, 0xff, 0xc0, - 0xff, 0x0c, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x07, 0x3f, - 0x20, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xf7, 0xff, 0xff, 0xaf, - 0xff, 0xff, 0x3b, 0x5f, 0x20, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0x1f, 0xfe, 0xff, 0x03, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x7f, 0xf9, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x20, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x3d, 0x7f, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, - 0xff, 0x3d, 0x7f, 0x3d, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, + 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x20, 0x04, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, + 0xff, 0x03, 0x00, 0x1f, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xbc, 0x40, + 0xd7, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x02, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xbf, 0xb6, + 0x00, 0xff, 0xff, 0xff, 0x87, 0x07, 0x00, 0x00, 0x00, 0xff, 0x07, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xc3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x1f, 0xfe, + 0xe1, 0xff, 0x9f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x30, 0x04, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xff, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdf, 0x3f, 0x00, + 0x00, 0xf0, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xdf, 0xe1, 0xff, 0xcf, 0xff, 0xfe, 0xff, 0xef, + 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xc5, 0xe3, 0x9f, 0x59, 0x80, 0xb0, 0xcf, + 0xff, 0x03, 0x10, 0xee, 0x87, 0xf9, 0xff, 0xff, 0xfd, 0x6d, 0xc3, 0x87, + 0x19, 0x02, 0x5e, 0xc0, 0xff, 0x3f, 0x00, 0xee, 0xbf, 0xfb, 0xff, 0xff, + 0xfd, 0xed, 0xe3, 0xbf, 0x1b, 0x01, 0x00, 0xcf, 0xff, 0x00, 0x1e, 0xee, + 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0x9f, 0x19, 0xc0, 0xb0, 0xcf, + 0xff, 0x02, 0x00, 0xec, 0xc7, 0x3d, 0xd6, 0x18, 0xc7, 0xff, 0xc3, 0xc7, + 0x1d, 0x81, 0x00, 0xc0, 0xff, 0x00, 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, + 0xfd, 0xff, 0xe3, 0xdf, 0x1d, 0x60, 0x07, 0xcf, 0xff, 0x00, 0x00, 0xef, + 0xdf, 0xfd, 0xff, 0xff, 0xfd, 0xef, 0xe3, 0xdf, 0x1d, 0x60, 0x40, 0xcf, + 0xff, 0x06, 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xdf, + 0x5d, 0xf0, 0x80, 0xcf, 0xff, 0x00, 0xfc, 0xec, 0xff, 0x7f, 0xfc, 0xff, + 0xff, 0xfb, 0x2f, 0x7f, 0x80, 0x5f, 0xff, 0xc0, 0xff, 0x0c, 0x00, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x07, 0x3f, 0x20, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x00, 0xd6, 0xf7, 0xff, 0xff, 0xaf, 0xff, 0xff, 0x3b, 0x5f, + 0x20, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0x03, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf9, 0xff, + 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xbf, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0x7f, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0x3d, 0x7f, 0x3d, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x07, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0x01, 0xff, - 0xdf, 0x0f, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xff, - 0xdf, 0x0d, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0x01, 0x80, 0x10, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x3f, 0x00, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x0f, 0xff, 0x01, 0xc0, - 0xff, 0xff, 0xff, 0xff, 0x3f, 0x1f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0f, 0xff, 0xff, 0xff, 0x03, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, - 0xff, 0x1f, 0x00, 0xff, 0x03, 0xff, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xef, 0xff, 0xef, 0x0f, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, - 0xff, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xff, - 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x01, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x6f, 0x04, 0xff, + 0x9f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0x01, 0xff, 0xdf, 0x0f, 0x00, 0xff, + 0xff, 0x0f, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xdf, 0x0d, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0x01, 0x80, 0x10, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0x0f, 0xff, 0x01, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x1f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, + 0x03, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0x1f, 0x00, 0xff, + 0x03, 0xff, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xef, + 0x0f, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x03, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xe3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xde, 0x6f, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x80, 0xff, 0x1f, 0x00, 0xff, 0xff, 0x3f, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0x3f, 0x3f, 0xff, 0xaa, 0xff, 0xff, 0xff, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x5f, 0xdc, 0x1f, 0xcf, 0x0f, 0xff, - 0x1f, 0xdc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0xff, 0x1f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, - 0xfc, 0x2f, 0x3e, 0x50, 0xbd, 0xff, 0xf3, 0xe0, 0x43, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xff, 0x1f, 0x00, 0xff, 0xff, 0x3f, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x3f, 0xff, 0xaa, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xdf, 0x5f, 0xdc, 0x1f, 0xcf, 0x0f, 0xff, 0x1f, 0xdc, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x80, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0xfc, 0x2f, 0x3e, 0x50, + 0xbd, 0xff, 0xf3, 0xe0, 0x43, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x78, 0x0c, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xbf, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0x78, 0x0c, 0x00, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, + 0xff, 0x7f, 0x00, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xfe, 0x03, 0x3e, 0x1f, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xe0, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xe0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x1f, 0xff, 0xff, 0xff, - 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, - 0x00, 0xff, 0x03, 0x00, 0x00, 0xfc, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x07, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x80, 0xff, 0x03, 0xff, - 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xff, - 0x3f, 0xff, 0x03, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x7f, 0x05, 0x00, 0x00, 0x38, 0xff, 0xff, 0x3c, 0x00, 0x7e, - 0x7e, 0x7e, 0x00, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0x00, 0x00, 0x00, 0xfe, 0x03, 0x3e, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xe0, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xe0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x7f, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x7f, - 0x00, 0xf8, 0xe0, 0xff, 0xfd, 0x7f, 0x5f, 0xdb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, - 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, - 0x00, 0xff, 0x03, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, 0xc0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfc, - 0xfc, 0xfc, 0x1c, 0x00, 0x00, 0x00, 0x00, 0xff, 0xef, 0xff, 0xff, 0x7f, - 0xff, 0xff, 0xb7, 0xff, 0x3f, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, - 0xe0, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, - 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0x3e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, - 0x03, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0xff, 0x1f, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0x00, 0xff, 0x03, 0x00, + 0x00, 0xfc, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, + 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0x00, 0x80, 0xff, 0x03, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xff, 0x3f, 0xff, 0x03, 0xff, + 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x05, + 0x00, 0x00, 0x38, 0xff, 0xff, 0x3c, 0x00, 0x7e, 0x7e, 0x7e, 0x00, 0x7f, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x07, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x00, 0xff, 0xff, 0x7f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0xf8, 0xe0, 0xff, + 0xfd, 0x7f, 0x5f, 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x03, 0xfe, + 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfc, 0xfc, 0xfc, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xef, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xb7, 0xff, + 0x3f, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x7f, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x3f, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x91, 0xff, - 0xff, 0x3f, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, 0x7f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x37, 0x00, 0xff, - 0xff, 0x3f, 0x00, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xf0, 0xef, 0xfe, 0xff, - 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0xff, - 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0xff, 0xff, 0x1f, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xff, - 0xff, 0x3f, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, + 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xff, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x03, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xff, + 0xff, 0x3f, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x91, 0xff, 0xff, 0x3f, 0x00, 0xff, + 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x37, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, + 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x6f, 0xf0, 0xef, 0xfe, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xfe, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, + 0xff, 0x07, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0x1f, 0x80, 0x00, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x00, 0x00, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x01, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0x70, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x47, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1e, 0x00, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0x9f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0xbd, 0xff, 0xbf, 0xff, 0x01, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0x03, 0xef, 0x9f, 0xf9, 0xff, 0xff, + 0xfd, 0xed, 0xe3, 0x9f, 0x19, 0x81, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, + 0x07, 0xff, 0x83, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x00, + 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0x11, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe7, 0xff, 0x07, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1a, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x7f, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x01, 0x00, 0xff, 0x03, 0x00, + 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfe, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xb4, 0xcb, 0x00, 0xff, 0x03, 0xbf, 0xfd, 0xff, 0xff, 0xff, + 0x7f, 0x7b, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x00, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xc0, - 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, - 0x00, 0xff, 0xff, 0xff, 0x01, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc7, 0xff, 0x70, 0x00, 0xff, 0xff, 0xff, 0xff, 0x47, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0x00, 0xff, 0x17, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x9f, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xbd, 0xff, 0xbf, 0xff, - 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0x03, 0xef, - 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0x9f, 0x19, 0x81, 0xe0, 0x0f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xbb, 0x07, 0xff, 0x83, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, 0xff, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x3f, 0x7f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x11, 0x00, 0xff, 0x03, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x01, 0xff, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe7, 0xff, - 0x07, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x1a, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe7, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x01, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x01, - 0x00, 0xff, 0x03, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, - 0xfb, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xb4, 0xcb, 0x00, 0xff, 0x03, 0xbf, - 0xfd, 0xff, 0xff, 0xff, 0x7f, 0x7b, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, - 0x00, 0xff, 0x03, 0xf8, 0xff, 0xff, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0x00, 0xff, 0x03, 0xf8, + 0xff, 0xff, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, + 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, 0x7f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xf0, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xf0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x07, 0xff, 0x1f, 0xff, 0x01, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xdf, 0x64, 0xde, 0xff, 0xeb, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xbf, 0xe7, 0xdf, 0xdf, 0xff, 0xff, 0xff, 0x7b, 0x5f, - 0xfc, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0x1f, 0xff, + 0x01, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x64, + 0xde, 0xff, 0xeb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0xe7, 0xdf, 0xdf, 0xff, 0xff, 0xff, 0x7b, 0x5f, 0xfc, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, - 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf9, 0xdb, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x3f, 0xff, 0x43, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0xff, 0xf7, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xf7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0xff, 0xff, 0xf9, 0xdb, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0f, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0x80, 0x3f, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x08, 0xff, 0x03, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0x08, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xff, 0x96, - 0xfe, 0xf7, 0x0a, 0x84, 0xea, 0x96, 0xaa, 0x96, 0xf7, 0xf7, 0x5e, 0xff, - 0xfb, 0xff, 0x0f, 0xee, 0xfb, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0x03, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, - 0xe0, 0xff, 0xff, 0x00, 0xbf, 0x1d, 0x00, 0x00, 0xe7, 0x02, 0x00, 0x00, - 0x79, 0x00, 0x00, 0x02, 0x24, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, - 0xfe, 0xff, 0xff, 0x01, 0x39, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x01, - 0x87, 0xff, 0xff, 0x00, 0xd4, 0xfe, 0xff, 0x00, 0xc3, 0x00, 0x00, 0x01, - 0xd2, 0x00, 0x00, 0x01, 0xce, 0x00, 0x00, 0x01, 0xcd, 0x00, 0x00, 0x01, - 0x4f, 0x00, 0x00, 0x01, 0xca, 0x00, 0x00, 0x01, 0xcb, 0x00, 0x00, 0x01, - 0xcf, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x01, 0xd3, 0x00, 0x00, 0x01, - 0xd1, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x01, 0xd5, 0x00, 0x00, 0x00, - 0x82, 0x00, 0x00, 0x01, 0xd6, 0x00, 0x00, 0x01, 0xda, 0x00, 0x00, 0x01, - 0xd9, 0x00, 0x00, 0x01, 0xdb, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x00, 0xb1, 0xff, 0xff, 0x01, 0x9f, 0xff, 0xff, 0x01, - 0xc8, 0xff, 0xff, 0x02, 0x28, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x33, 0xff, 0xff, 0x00, - 0x26, 0xff, 0xff, 0x01, 0x7e, 0xff, 0xff, 0x01, 0x2b, 0x2a, 0x00, 0x01, - 0x5d, 0xff, 0xff, 0x01, 0x28, 0x2a, 0x00, 0x00, 0x3f, 0x2a, 0x00, 0x01, - 0x3d, 0xff, 0xff, 0x01, 0x45, 0x00, 0x00, 0x01, 0x47, 0x00, 0x00, 0x00, - 0x1f, 0x2a, 0x00, 0x00, 0x1c, 0x2a, 0x00, 0x00, 0x1e, 0x2a, 0x00, 0x00, - 0x2e, 0xff, 0xff, 0x00, 0x32, 0xff, 0xff, 0x00, 0x36, 0xff, 0xff, 0x00, - 0x35, 0xff, 0xff, 0x00, 0x4f, 0xa5, 0x00, 0x00, 0x4b, 0xa5, 0x00, 0x00, - 0x31, 0xff, 0xff, 0x00, 0x28, 0xa5, 0x00, 0x00, 0x44, 0xa5, 0x00, 0x00, - 0x2f, 0xff, 0xff, 0x00, 0x2d, 0xff, 0xff, 0x00, 0xf7, 0x29, 0x00, 0x00, - 0x41, 0xa5, 0x00, 0x00, 0xfd, 0x29, 0x00, 0x00, 0x2b, 0xff, 0xff, 0x00, - 0x2a, 0xff, 0xff, 0x00, 0xe7, 0x29, 0x00, 0x00, 0x43, 0xa5, 0x00, 0x00, - 0x2a, 0xa5, 0x00, 0x00, 0xbb, 0xff, 0xff, 0x00, 0x27, 0xff, 0xff, 0x00, - 0xb9, 0xff, 0xff, 0x00, 0x25, 0xff, 0xff, 0x00, 0x15, 0xa5, 0x00, 0x00, - 0x12, 0xa5, 0x00, 0x02, 0x24, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x01, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x00, 0x54, 0x00, 0x00, 0x01, 0x74, 0x00, 0x00, 0x01, - 0x26, 0x00, 0x00, 0x01, 0x25, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, - 0x3f, 0x00, 0x00, 0x00, 0xda, 0xff, 0xff, 0x00, 0xdb, 0xff, 0xff, 0x00, - 0xe1, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xc1, 0xff, 0xff, 0x01, - 0x08, 0x00, 0x00, 0x00, 0xc2, 0xff, 0xff, 0x00, 0xc7, 0xff, 0xff, 0x00, - 0xd1, 0xff, 0xff, 0x00, 0xca, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, 0x00, - 0xaa, 0xff, 0xff, 0x00, 0xb0, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x8c, 0xff, 0xff, 0x01, 0xc4, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xff, 0x01, - 0xf9, 0xff, 0xff, 0x02, 0x1a, 0x70, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, - 0x50, 0x00, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x00, 0xf1, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x00, 0xd0, 0xff, 0xff, 0x01, - 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0x0b, 0x00, 0x01, 0x60, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0xd0, 0x97, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x02, - 0x05, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xf4, 0xff, 0x00, - 0x9e, 0xe7, 0xff, 0x00, 0xc2, 0x89, 0x00, 0x00, 0xdb, 0xe7, 0xff, 0x00, - 0x92, 0xe7, 0xff, 0x00, 0x93, 0xe7, 0xff, 0x00, 0x9c, 0xe7, 0xff, 0x00, - 0x9d, 0xe7, 0xff, 0x00, 0xa4, 0xe7, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x38, 0x8a, 0x00, 0x00, 0x04, 0x8a, 0x00, 0x00, 0xe6, 0x0e, 0x00, 0x01, - 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc5, 0xff, 0xff, 0x01, 0x41, 0xe2, 0xff, 0x02, 0x1d, 0x8f, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x01, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x56, 0x00, 0x00, 0x01, 0xaa, 0xff, 0xff, 0x00, 0x4a, 0x00, 0x00, 0x00, - 0x64, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x7e, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x01, 0xb6, 0xff, 0xff, 0x01, - 0xf7, 0xff, 0xff, 0x00, 0xdb, 0xe3, 0xff, 0x01, 0x9c, 0xff, 0xff, 0x01, - 0x90, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff, 0x01, 0x82, 0xff, 0xff, 0x02, - 0x05, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, - 0xf0, 0xff, 0xff, 0x01, 0x1c, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, - 0xa3, 0xe2, 0xff, 0x01, 0x41, 0xdf, 0xff, 0x01, 0xba, 0xdf, 0xff, 0x00, - 0xe4, 0xff, 0xff, 0x02, 0x0b, 0xb1, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x01, 0x30, 0x00, 0x00, 0x00, 0xd0, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x09, 0xd6, 0xff, 0x01, 0x1a, 0xf1, 0xff, 0x01, - 0x19, 0xd6, 0xff, 0x00, 0xd5, 0xd5, 0xff, 0x00, 0xd8, 0xd5, 0xff, 0x01, - 0xe4, 0xd5, 0xff, 0x01, 0x03, 0xd6, 0xff, 0x01, 0xe1, 0xd5, 0xff, 0x01, - 0xe2, 0xd5, 0xff, 0x01, 0xc1, 0xd5, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xe3, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x02, 0x0c, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xbc, 0x5a, 0xff, 0x01, - 0xa0, 0x03, 0x00, 0x01, 0xfc, 0x75, 0xff, 0x01, 0xd8, 0x5a, 0xff, 0x00, - 0x30, 0x00, 0x00, 0x01, 0xb1, 0x5a, 0xff, 0x01, 0xb5, 0x5a, 0xff, 0x01, - 0xbf, 0x5a, 0xff, 0x01, 0xee, 0x5a, 0xff, 0x01, 0xd6, 0x5a, 0xff, 0x01, - 0xeb, 0x5a, 0xff, 0x01, 0xd0, 0xff, 0xff, 0x01, 0xbd, 0x5a, 0xff, 0x01, - 0xc8, 0x75, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x68, 0xff, 0x00, - 0x60, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, - 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, 0x00, 0x00, 0x00, - 0xd8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, - 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, - 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, - 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, - 0xde, 0xff, 0xff, 0x30, 0x0c, 0x31, 0x0d, 0x78, 0x0e, 0x7f, 0x0f, 0x80, - 0x10, 0x81, 0x11, 0x86, 0x12, 0x89, 0x13, 0x8a, 0x13, 0x8e, 0x14, 0x8f, - 0x15, 0x90, 0x16, 0x93, 0x13, 0x94, 0x17, 0x95, 0x18, 0x96, 0x19, 0x97, - 0x1a, 0x9a, 0x1b, 0x9c, 0x19, 0x9d, 0x1c, 0x9e, 0x1d, 0x9f, 0x1e, 0xa6, - 0x1f, 0xa9, 0x1f, 0xae, 0x1f, 0xb1, 0x20, 0xb2, 0x20, 0xb7, 0x21, 0xbf, - 0x22, 0xc5, 0x23, 0xc8, 0x23, 0xcb, 0x23, 0xdd, 0x24, 0xf2, 0x23, 0xf6, - 0x25, 0xf7, 0x26, 0x20, 0x2d, 0x3a, 0x2e, 0x3d, 0x2f, 0x3e, 0x30, 0x3f, - 0x31, 0x40, 0x31, 0x43, 0x32, 0x44, 0x33, 0x45, 0x34, 0x50, 0x35, 0x51, - 0x36, 0x52, 0x37, 0x53, 0x38, 0x54, 0x39, 0x59, 0x3a, 0x5b, 0x3b, 0x5c, - 0x3c, 0x61, 0x3d, 0x63, 0x3e, 0x65, 0x3f, 0x66, 0x40, 0x68, 0x41, 0x69, - 0x42, 0x6a, 0x40, 0x6b, 0x43, 0x6c, 0x44, 0x6f, 0x42, 0x71, 0x45, 0x72, - 0x46, 0x75, 0x47, 0x7d, 0x48, 0x82, 0x49, 0x87, 0x4a, 0x89, 0x4b, 0x8a, - 0x4c, 0x8b, 0x4c, 0x8c, 0x4d, 0x92, 0x4e, 0x9d, 0x4f, 0x9e, 0x50, 0x45, - 0x57, 0x7b, 0x1d, 0x7c, 0x1d, 0x7d, 0x1d, 0x7f, 0x58, 0x86, 0x59, 0x88, - 0x5a, 0x89, 0x5a, 0x8a, 0x5a, 0x8c, 0x5b, 0x8e, 0x5c, 0x8f, 0x5c, 0xac, - 0x5d, 0xad, 0x5e, 0xae, 0x5e, 0xaf, 0x5e, 0xc2, 0x5f, 0xcc, 0x60, 0xcd, - 0x61, 0xce, 0x61, 0xcf, 0x62, 0xd0, 0x63, 0xd1, 0x64, 0xd5, 0x65, 0xd6, - 0x66, 0xd7, 0x67, 0xf0, 0x68, 0xf1, 0x69, 0xf2, 0x6a, 0xf3, 0x6b, 0xf4, - 0x6c, 0xf5, 0x6d, 0xf9, 0x6e, 0xfd, 0x2d, 0xfe, 0x2d, 0xff, 0x2d, 0x50, - 0x69, 0x51, 0x69, 0x52, 0x69, 0x53, 0x69, 0x54, 0x69, 0x55, 0x69, 0x56, - 0x69, 0x57, 0x69, 0x58, 0x69, 0x59, 0x69, 0x5a, 0x69, 0x5b, 0x69, 0x5c, - 0x69, 0x5d, 0x69, 0x5e, 0x69, 0x5f, 0x69, 0x82, 0x00, 0x83, 0x00, 0x84, - 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, 0x00, 0xc0, - 0x75, 0xcf, 0x76, 0x80, 0x89, 0x81, 0x8a, 0x82, 0x8b, 0x85, 0x8c, 0x86, - 0x8d, 0x70, 0x9d, 0x71, 0x9d, 0x76, 0x9e, 0x77, 0x9e, 0x78, 0x9f, 0x79, - 0x9f, 0x7a, 0xa0, 0x7b, 0xa0, 0x7c, 0xa1, 0x7d, 0xa1, 0xb3, 0xa2, 0xba, - 0xa3, 0xbb, 0xa3, 0xbc, 0xa4, 0xbe, 0xa5, 0xc3, 0xa2, 0xcc, 0xa4, 0xda, - 0xa6, 0xdb, 0xa6, 0xe5, 0x6a, 0xea, 0xa7, 0xeb, 0xa7, 0xec, 0x6e, 0xf3, - 0xa2, 0xf8, 0xa8, 0xf9, 0xa8, 0xfa, 0xa9, 0xfb, 0xa9, 0xfc, 0xa4, 0x26, - 0xb0, 0x2a, 0xb1, 0x2b, 0xb2, 0x4e, 0xb3, 0x84, 0x08, 0x62, 0xba, 0x63, - 0xbb, 0x64, 0xbc, 0x65, 0xbd, 0x66, 0xbe, 0x6d, 0xbf, 0x6e, 0xc0, 0x6f, - 0xc1, 0x70, 0xc2, 0x7e, 0xc3, 0x7f, 0xc3, 0x7d, 0xcf, 0x8d, 0xd0, 0x94, - 0xd1, 0xab, 0xd2, 0xac, 0xd3, 0xad, 0xd4, 0xb0, 0xd5, 0xb1, 0xd6, 0xb2, - 0xd7, 0xc4, 0xd8, 0xc5, 0xd9, 0xc6, 0xda, 0x07, 0x08, 0x09, 0x0a, 0x0b, - 0x0c, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0d, - 0x06, 0x06, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0f, - 0x10, 0x11, 0x12, 0x06, 0x13, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x14, 0x15, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xff, 0x96, 0xfe, 0xf7, 0x0a, 0x84, + 0xea, 0x96, 0xaa, 0x96, 0xf7, 0xf7, 0x5e, 0xff, 0xfb, 0xff, 0x0f, 0xee, + 0xfb, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, + 0x03, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x56, + 0x01, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, + 0xbf, 0x1d, 0x00, 0x00, 0xe7, 0x02, 0x00, 0x00, 0x79, 0x00, 0x00, 0x02, + 0x24, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, + 0x39, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x01, 0x87, 0xff, 0xff, 0x00, + 0xd4, 0xfe, 0xff, 0x00, 0xc3, 0x00, 0x00, 0x01, 0xd2, 0x00, 0x00, 0x01, + 0xce, 0x00, 0x00, 0x01, 0xcd, 0x00, 0x00, 0x01, 0x4f, 0x00, 0x00, 0x01, + 0xca, 0x00, 0x00, 0x01, 0xcb, 0x00, 0x00, 0x01, 0xcf, 0x00, 0x00, 0x00, + 0x61, 0x00, 0x00, 0x01, 0xd3, 0x00, 0x00, 0x01, 0xd1, 0x00, 0x00, 0x00, + 0xa3, 0x00, 0x00, 0x01, 0xd5, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x01, + 0xd6, 0x00, 0x00, 0x01, 0xda, 0x00, 0x00, 0x01, 0xd9, 0x00, 0x00, 0x01, + 0xdb, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, + 0xb1, 0xff, 0xff, 0x01, 0x9f, 0xff, 0xff, 0x01, 0xc8, 0xff, 0xff, 0x02, + 0x28, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x00, 0x33, 0xff, 0xff, 0x00, 0x26, 0xff, 0xff, 0x01, + 0x7e, 0xff, 0xff, 0x01, 0x2b, 0x2a, 0x00, 0x01, 0x5d, 0xff, 0xff, 0x01, + 0x28, 0x2a, 0x00, 0x00, 0x3f, 0x2a, 0x00, 0x01, 0x3d, 0xff, 0xff, 0x01, + 0x45, 0x00, 0x00, 0x01, 0x47, 0x00, 0x00, 0x00, 0x1f, 0x2a, 0x00, 0x00, + 0x1c, 0x2a, 0x00, 0x00, 0x1e, 0x2a, 0x00, 0x00, 0x2e, 0xff, 0xff, 0x00, + 0x32, 0xff, 0xff, 0x00, 0x36, 0xff, 0xff, 0x00, 0x35, 0xff, 0xff, 0x00, + 0x4f, 0xa5, 0x00, 0x00, 0x4b, 0xa5, 0x00, 0x00, 0x31, 0xff, 0xff, 0x00, + 0x28, 0xa5, 0x00, 0x00, 0x44, 0xa5, 0x00, 0x00, 0x2f, 0xff, 0xff, 0x00, + 0x2d, 0xff, 0xff, 0x00, 0xf7, 0x29, 0x00, 0x00, 0x41, 0xa5, 0x00, 0x00, + 0xfd, 0x29, 0x00, 0x00, 0x2b, 0xff, 0xff, 0x00, 0x2a, 0xff, 0xff, 0x00, + 0xe7, 0x29, 0x00, 0x00, 0x43, 0xa5, 0x00, 0x00, 0x2a, 0xa5, 0x00, 0x00, + 0xbb, 0xff, 0xff, 0x00, 0x27, 0xff, 0xff, 0x00, 0xb9, 0xff, 0xff, 0x00, + 0x25, 0xff, 0xff, 0x00, 0x15, 0xa5, 0x00, 0x00, 0x12, 0xa5, 0x00, 0x02, + 0x24, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x54, 0x00, 0x00, 0x01, 0x74, 0x00, 0x00, 0x01, 0x26, 0x00, 0x00, 0x01, + 0x25, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x3f, 0x00, 0x00, 0x00, + 0xda, 0xff, 0xff, 0x00, 0xdb, 0xff, 0xff, 0x00, 0xe1, 0xff, 0xff, 0x00, + 0xc0, 0xff, 0xff, 0x00, 0xc1, 0xff, 0xff, 0x01, 0x08, 0x00, 0x00, 0x00, + 0xc2, 0xff, 0xff, 0x00, 0xc7, 0xff, 0xff, 0x00, 0xd1, 0xff, 0xff, 0x00, + 0xca, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, 0x00, 0xaa, 0xff, 0xff, 0x00, + 0xb0, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x00, 0x8c, 0xff, 0xff, 0x01, + 0xc4, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xff, 0x01, 0xf9, 0xff, 0xff, 0x02, + 0x1a, 0x70, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, + 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x50, 0x00, 0x00, 0x01, + 0x0f, 0x00, 0x00, 0x00, 0xf1, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x30, 0x00, 0x00, 0x00, 0xd0, 0xff, 0xff, 0x01, 0x01, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0b, 0x00, 0x01, + 0x60, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xd0, 0x97, 0x00, 0x01, + 0x08, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x02, 0x05, 0x8a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x40, 0xf4, 0xff, 0x00, 0x9e, 0xe7, 0xff, 0x00, + 0xc2, 0x89, 0x00, 0x00, 0xdb, 0xe7, 0xff, 0x00, 0x92, 0xe7, 0xff, 0x00, + 0x93, 0xe7, 0xff, 0x00, 0x9c, 0xe7, 0xff, 0x00, 0x9d, 0xe7, 0xff, 0x00, + 0xa4, 0xe7, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x8a, 0x00, 0x00, + 0x04, 0x8a, 0x00, 0x00, 0xe6, 0x0e, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0xff, 0xff, 0x01, + 0x41, 0xe2, 0xff, 0x02, 0x1d, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, + 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x01, + 0xaa, 0xff, 0xff, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x01, 0xb6, 0xff, 0xff, 0x01, 0xf7, 0xff, 0xff, 0x00, + 0xdb, 0xe3, 0xff, 0x01, 0x9c, 0xff, 0xff, 0x01, 0x90, 0xff, 0xff, 0x01, + 0x80, 0xff, 0xff, 0x01, 0x82, 0xff, 0xff, 0x02, 0x05, 0xac, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x01, + 0x1c, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0xa3, 0xe2, 0xff, 0x01, + 0x41, 0xdf, 0xff, 0x01, 0xba, 0xdf, 0xff, 0x00, 0xe4, 0xff, 0xff, 0x02, + 0x0b, 0xb1, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, + 0x30, 0x00, 0x00, 0x00, 0xd0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x09, 0xd6, 0xff, 0x01, 0x1a, 0xf1, 0xff, 0x01, 0x19, 0xd6, 0xff, 0x00, + 0xd5, 0xd5, 0xff, 0x00, 0xd8, 0xd5, 0xff, 0x01, 0xe4, 0xd5, 0xff, 0x01, + 0x03, 0xd6, 0xff, 0x01, 0xe1, 0xd5, 0xff, 0x01, 0xe2, 0xd5, 0xff, 0x01, + 0xc1, 0xd5, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xe3, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x02, + 0x0c, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x01, 0xbc, 0x5a, 0xff, 0x01, 0xa0, 0x03, 0x00, 0x01, + 0xfc, 0x75, 0xff, 0x01, 0xd8, 0x5a, 0xff, 0x00, 0x30, 0x00, 0x00, 0x01, + 0xb1, 0x5a, 0xff, 0x01, 0xb5, 0x5a, 0xff, 0x01, 0xbf, 0x5a, 0xff, 0x01, + 0xee, 0x5a, 0xff, 0x01, 0xd6, 0x5a, 0xff, 0x01, 0xeb, 0x5a, 0xff, 0x01, + 0xd0, 0xff, 0xff, 0x01, 0xbd, 0x5a, 0xff, 0x01, 0xc8, 0x75, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x68, 0xff, 0x00, 0x60, 0xfc, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x28, 0x00, 0x00, 0x00, 0xd8, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0xde, 0xff, 0xff, 0x30, + 0x0c, 0x31, 0x0d, 0x78, 0x0e, 0x7f, 0x0f, 0x80, 0x10, 0x81, 0x11, 0x86, + 0x12, 0x89, 0x13, 0x8a, 0x13, 0x8e, 0x14, 0x8f, 0x15, 0x90, 0x16, 0x93, + 0x13, 0x94, 0x17, 0x95, 0x18, 0x96, 0x19, 0x97, 0x1a, 0x9a, 0x1b, 0x9c, + 0x19, 0x9d, 0x1c, 0x9e, 0x1d, 0x9f, 0x1e, 0xa6, 0x1f, 0xa9, 0x1f, 0xae, + 0x1f, 0xb1, 0x20, 0xb2, 0x20, 0xb7, 0x21, 0xbf, 0x22, 0xc5, 0x23, 0xc8, + 0x23, 0xcb, 0x23, 0xdd, 0x24, 0xf2, 0x23, 0xf6, 0x25, 0xf7, 0x26, 0x20, + 0x2d, 0x3a, 0x2e, 0x3d, 0x2f, 0x3e, 0x30, 0x3f, 0x31, 0x40, 0x31, 0x43, + 0x32, 0x44, 0x33, 0x45, 0x34, 0x50, 0x35, 0x51, 0x36, 0x52, 0x37, 0x53, + 0x38, 0x54, 0x39, 0x59, 0x3a, 0x5b, 0x3b, 0x5c, 0x3c, 0x61, 0x3d, 0x63, + 0x3e, 0x65, 0x3f, 0x66, 0x40, 0x68, 0x41, 0x69, 0x42, 0x6a, 0x40, 0x6b, + 0x43, 0x6c, 0x44, 0x6f, 0x42, 0x71, 0x45, 0x72, 0x46, 0x75, 0x47, 0x7d, + 0x48, 0x82, 0x49, 0x87, 0x4a, 0x89, 0x4b, 0x8a, 0x4c, 0x8b, 0x4c, 0x8c, + 0x4d, 0x92, 0x4e, 0x9d, 0x4f, 0x9e, 0x50, 0x45, 0x57, 0x7b, 0x1d, 0x7c, + 0x1d, 0x7d, 0x1d, 0x7f, 0x58, 0x86, 0x59, 0x88, 0x5a, 0x89, 0x5a, 0x8a, + 0x5a, 0x8c, 0x5b, 0x8e, 0x5c, 0x8f, 0x5c, 0xac, 0x5d, 0xad, 0x5e, 0xae, + 0x5e, 0xaf, 0x5e, 0xc2, 0x5f, 0xcc, 0x60, 0xcd, 0x61, 0xce, 0x61, 0xcf, + 0x62, 0xd0, 0x63, 0xd1, 0x64, 0xd5, 0x65, 0xd6, 0x66, 0xd7, 0x67, 0xf0, + 0x68, 0xf1, 0x69, 0xf2, 0x6a, 0xf3, 0x6b, 0xf4, 0x6c, 0xf5, 0x6d, 0xf9, + 0x6e, 0xfd, 0x2d, 0xfe, 0x2d, 0xff, 0x2d, 0x50, 0x69, 0x51, 0x69, 0x52, + 0x69, 0x53, 0x69, 0x54, 0x69, 0x55, 0x69, 0x56, 0x69, 0x57, 0x69, 0x58, + 0x69, 0x59, 0x69, 0x5a, 0x69, 0x5b, 0x69, 0x5c, 0x69, 0x5d, 0x69, 0x5e, + 0x69, 0x5f, 0x69, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, + 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, 0x00, 0xc0, 0x75, 0xcf, 0x76, 0x80, + 0x89, 0x81, 0x8a, 0x82, 0x8b, 0x85, 0x8c, 0x86, 0x8d, 0x70, 0x9d, 0x71, + 0x9d, 0x76, 0x9e, 0x77, 0x9e, 0x78, 0x9f, 0x79, 0x9f, 0x7a, 0xa0, 0x7b, + 0xa0, 0x7c, 0xa1, 0x7d, 0xa1, 0xb3, 0xa2, 0xba, 0xa3, 0xbb, 0xa3, 0xbc, + 0xa4, 0xbe, 0xa5, 0xc3, 0xa2, 0xcc, 0xa4, 0xda, 0xa6, 0xdb, 0xa6, 0xe5, + 0x6a, 0xea, 0xa7, 0xeb, 0xa7, 0xec, 0x6e, 0xf3, 0xa2, 0xf8, 0xa8, 0xf9, + 0xa8, 0xfa, 0xa9, 0xfb, 0xa9, 0xfc, 0xa4, 0x26, 0xb0, 0x2a, 0xb1, 0x2b, + 0xb2, 0x4e, 0xb3, 0x84, 0x08, 0x62, 0xba, 0x63, 0xbb, 0x64, 0xbc, 0x65, + 0xbd, 0x66, 0xbe, 0x6d, 0xbf, 0x6e, 0xc0, 0x6f, 0xc1, 0x70, 0xc2, 0x7e, + 0xc3, 0x7f, 0xc3, 0x7d, 0xcf, 0x8d, 0xd0, 0x94, 0xd1, 0xab, 0xd2, 0xac, + 0xd3, 0xad, 0xd4, 0xb0, 0xd5, 0xb1, 0xd6, 0xb2, 0xd7, 0xc4, 0xd8, 0xc5, + 0xd9, 0xc6, 0xda, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0d, 0x06, 0x06, 0x0e, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0f, 0x10, 0x11, 0x12, 0x06, + 0x13, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x14, + 0x15, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, @@ -1017,24 +946,23 @@ unsigned char STDLIB_WASM[] = { 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x16, 0x17, 0x06, 0x06, 0x06, 0x18, 0x06, + 0x06, 0x16, 0x17, 0x06, 0x06, 0x06, 0x18, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x19, 0x06, - 0x06, 0x06, 0x06, 0x1a, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1b, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1c, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x19, 0x06, 0x06, 0x06, 0x06, 0x1a, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1b, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1c, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x1d, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1d, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, @@ -1044,9 +972,9 @@ unsigned char STDLIB_WASM[] = { 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x1e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1055,182 +983,182 @@ unsigned char STDLIB_WASM[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x2b, 0x2b, 0x5b, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x4a, 0x56, 0x56, 0x05, 0x31, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x24, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, + 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x2b, 0x2b, 0x5b, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x4a, 0x56, 0x56, 0x05, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x24, + 0x50, 0x79, 0x31, 0x50, 0x31, 0x50, 0x31, 0x38, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x4e, + 0x31, 0x02, 0x4e, 0x0d, 0x0d, 0x4e, 0x03, 0x4e, 0x00, 0x24, 0x6e, 0x00, + 0x4e, 0x31, 0x26, 0x6e, 0x51, 0x4e, 0x24, 0x50, 0x4e, 0x39, 0x14, 0x81, + 0x1b, 0x1d, 0x1d, 0x53, 0x31, 0x50, 0x31, 0x50, 0x0d, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x1b, 0x53, 0x24, 0x50, 0x31, 0x02, 0x5c, 0x7b, 0x5c, + 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x14, 0x79, 0x5c, 0x7b, 0x5c, + 0x7b, 0x5c, 0x2d, 0x2b, 0x49, 0x03, 0x48, 0x03, 0x78, 0x5c, 0x7b, 0x14, + 0x00, 0x96, 0x0a, 0x01, 0x2b, 0x28, 0x06, 0x06, 0x00, 0x2a, 0x06, 0x2a, + 0x2a, 0x2b, 0x07, 0xbb, 0xb5, 0x2b, 0x1e, 0x00, 0x2b, 0x07, 0x2b, 0x2b, + 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2a, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0xcd, 0x46, 0xcd, 0x2b, 0x00, 0x25, 0x2b, 0x07, 0x01, 0x06, 0x01, 0x55, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x55, 0x56, 0x56, 0x02, 0x24, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x15, 0x81, 0x81, 0x81, 0x00, 0x00, 0x2b, 0x00, 0xb2, + 0xd1, 0xb2, 0xd1, 0xb2, 0xd1, 0xb2, 0xd1, 0x00, 0x00, 0xcd, 0xcc, 0x01, + 0x00, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0x83, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x02, 0x00, 0x00, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x24, 0x50, 0x79, 0x31, 0x50, 0x31, 0x50, 0x31, 0x38, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x4e, 0x31, 0x50, 0x31, 0x50, 0x4e, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x4e, 0x31, 0x02, 0x4e, 0x0d, 0x0d, 0x4e, 0x03, 0x4e, - 0x00, 0x24, 0x6e, 0x00, 0x4e, 0x31, 0x26, 0x6e, 0x51, 0x4e, 0x24, 0x50, - 0x4e, 0x39, 0x14, 0x81, 0x1b, 0x1d, 0x1d, 0x53, 0x31, 0x50, 0x31, 0x50, - 0x0d, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x1b, 0x53, 0x24, 0x50, 0x31, - 0x02, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x14, - 0x79, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x2d, 0x2b, 0x49, 0x03, 0x48, 0x03, - 0x78, 0x5c, 0x7b, 0x14, 0x00, 0x96, 0x0a, 0x01, 0x2b, 0x28, 0x06, 0x06, - 0x00, 0x2a, 0x06, 0x2a, 0x2a, 0x2b, 0x07, 0xbb, 0xb5, 0x2b, 0x1e, 0x00, - 0x2b, 0x07, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x50, 0x31, 0x02, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, + 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x00, 0x00, 0x00, 0x54, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0c, + 0x00, 0x0c, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x2a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x6c, 0x81, 0x15, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0xcd, 0x46, 0xcd, 0x2b, 0x00, 0x25, 0x2b, 0x07, - 0x01, 0x06, 0x01, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x55, 0x56, 0x56, - 0x02, 0x24, 0x81, 0x81, 0x81, 0x81, 0x81, 0x15, 0x81, 0x81, 0x81, 0x00, - 0x00, 0x2b, 0x00, 0xb2, 0xd1, 0xb2, 0xd1, 0xb2, 0xd1, 0xb2, 0xd1, 0x00, - 0x00, 0xcd, 0xcc, 0x01, 0x00, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0x83, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xac, 0xac, 0xac, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0x1c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x02, 0x00, 0x00, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x4e, 0x31, 0x50, - 0x31, 0x50, 0x4e, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x02, 0x87, 0xa6, 0x87, 0xa6, 0x87, - 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x2a, + 0x2b, 0x2b, 0x2b, 0x07, 0x6c, 0x03, 0x41, 0x2b, 0x2b, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x2c, + 0x56, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x25, 0x56, 0x7a, 0x9e, 0x26, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, + 0x25, 0x06, 0x01, 0x2b, 0x2b, 0x4f, 0x56, 0x56, 0x2c, 0x2b, 0x7f, 0x56, + 0x56, 0x39, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x2b, 0x2b, 0x4f, 0x56, 0x56, + 0x2c, 0x2b, 0x7f, 0x56, 0x56, 0x81, 0x37, 0x75, 0x5b, 0x7b, 0x5c, 0x2b, + 0x2b, 0x4f, 0x56, 0x56, 0x02, 0xac, 0x04, 0x00, 0x00, 0x39, 0x2b, 0x2b, + 0x55, 0x56, 0x56, 0x2b, 0x2b, 0x4f, 0x56, 0x56, 0x2c, 0x2b, 0x2b, 0x56, + 0x56, 0x32, 0x13, 0x81, 0x57, 0x00, 0x6f, 0x81, 0x7e, 0xc9, 0xd7, 0x7e, + 0x2d, 0x81, 0x81, 0x0e, 0x7e, 0x39, 0x7f, 0x6f, 0x57, 0x00, 0x81, 0x81, + 0x7e, 0x15, 0x00, 0x7e, 0x03, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x2b, 0x24, 0x2b, 0x97, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x80, 0x81, 0x81, 0x81, 0x81, 0x39, + 0xbb, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x00, 0x00, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xc9, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xd0, 0x0d, 0x00, 0x4e, 0x31, 0x02, 0xb4, 0xc1, 0xc1, 0xd7, + 0xd7, 0x24, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0xd7, + 0xd7, 0x53, 0xc1, 0x47, 0xd4, 0xd7, 0xd7, 0xd7, 0x05, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x0c, 0x00, 0x0c, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x2a, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x79, 0x5c, 0x7b, 0x5c, 0x7b, 0x4f, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, + 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, + 0x7b, 0x5c, 0x2d, 0x2b, 0x2b, 0x79, 0x14, 0x5c, 0x7b, 0x5c, 0x2d, 0x79, + 0x2a, 0x5c, 0x27, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0xa4, 0x00, 0x0a, + 0xb4, 0x5c, 0x7b, 0x5c, 0x7b, 0x4f, 0x03, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x07, 0x00, 0x48, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x00, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x24, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x6c, 0x81, 0x15, - 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x6c, 0x03, 0x41, 0x2b, - 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x2c, 0x56, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x6c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x56, 0x7a, 0x9e, 0x26, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x01, 0x2b, 0x2b, 0x4f, 0x56, 0x56, - 0x2c, 0x2b, 0x7f, 0x56, 0x56, 0x39, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x2b, - 0x2b, 0x4f, 0x56, 0x56, 0x2c, 0x2b, 0x7f, 0x56, 0x56, 0x81, 0x37, 0x75, - 0x5b, 0x7b, 0x5c, 0x2b, 0x2b, 0x4f, 0x56, 0x56, 0x02, 0xac, 0x04, 0x00, - 0x00, 0x39, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x2b, 0x2b, 0x4f, 0x56, 0x56, - 0x2c, 0x2b, 0x2b, 0x56, 0x56, 0x32, 0x13, 0x81, 0x57, 0x00, 0x6f, 0x81, - 0x7e, 0xc9, 0xd7, 0x7e, 0x2d, 0x81, 0x81, 0x0e, 0x7e, 0x39, 0x7f, 0x6f, - 0x57, 0x00, 0x81, 0x81, 0x7e, 0x15, 0x00, 0x7e, 0x03, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x2b, 0x24, - 0x2b, 0x97, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2a, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x80, 0x81, - 0x81, 0x81, 0x81, 0x39, 0xbb, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0xc9, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xd0, 0x0d, 0x00, 0x4e, 0x31, 0x02, - 0xb4, 0xc1, 0xc1, 0xd7, 0xd7, 0x24, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0xd7, 0xd7, 0x53, 0xc1, 0x47, 0xd4, 0xd7, 0xd7, 0xd7, - 0x05, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x07, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4e, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x79, 0x5c, 0x7b, 0x5c, 0x7b, 0x4f, 0x7b, 0x5c, - 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, - 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x2d, 0x2b, 0x2b, 0x79, 0x14, 0x5c, - 0x7b, 0x5c, 0x2d, 0x79, 0x2a, 0x5c, 0x27, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, - 0x7b, 0xa4, 0x00, 0x0a, 0xb4, 0x5c, 0x7b, 0x5c, 0x7b, 0x4f, 0x03, 0x2a, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x00, 0x48, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x00, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x27, 0x51, 0x6f, 0x77, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x7f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x8e, 0x92, 0x97, 0x00, - 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, - 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x27, 0x51, 0x6f, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x83, 0x8e, 0x92, 0x97, 0x00, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1240,23 +1168,24 @@ unsigned char STDLIB_WASM[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xc6, 0xc9, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc9, 0x00, + 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0x00, 0xe1, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1266,101 +1195,42 @@ unsigned char STDLIB_WASM[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x85, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x02, - 0x20, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x05, - 0x20, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x09, - 0x20, 0x00, 0x00, 0x0a, 0x20, 0x00, 0x00, 0x28, 0x20, 0x00, 0x00, 0x29, - 0x20, 0x00, 0x00, 0x5f, 0x20, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x41, 0xe8, 0xc2, 0x04, 0x0b, 0x04, 0x00, 0x00, - 0x02, 0x00, 0x00, 0xb7, 0x05, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x00, 0x0c, - 0x0b, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x2e, 0x77, 0x61, 0x73, 0x6d, - 0x01, 0xd9, 0x04, 0x2d, 0x00, 0x2a, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, - 0x65, 0x77, 0x31, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x67, 0x65, 0x74, - 0x01, 0x30, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, - 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, - 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x67, - 0x65, 0x74, 0x02, 0x2b, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, - 0x31, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x03, - 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c, - 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x04, 0x13, 0x75, 0x6e, 0x64, 0x65, - 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x77, 0x65, 0x61, 0x6b, 0x3a, 0x6d, - 0x61, 0x69, 0x6e, 0x05, 0x12, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, - 0x69, 0x6e, 0x69, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x06, - 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x07, 0x0a, 0x72, 0x65, 0x73, - 0x65, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x08, 0x06, 0x6d, 0x61, 0x6c, - 0x6c, 0x6f, 0x63, 0x09, 0x04, 0x66, 0x72, 0x65, 0x65, 0x0a, 0x06, 0x63, - 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x0b, 0x07, 0x72, 0x65, 0x61, 0x6c, 0x6c, - 0x6f, 0x63, 0x0c, 0x05, 0x5f, 0x45, 0x78, 0x69, 0x74, 0x0d, 0x0b, 0x5f, - 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x76, 0x6f, 0x69, 0x64, 0x0e, 0x0f, - 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, - 0x67, 0x65, 0x74, 0x0f, 0x15, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, - 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x67, - 0x65, 0x74, 0x10, 0x10, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x70, - 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x11, 0x0e, 0x5f, 0x5f, - 0x77, 0x61, 0x73, 0x69, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x5f, 0x74, 0x70, - 0x12, 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x13, 0x11, 0x5f, 0x5f, 0x77, - 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x74, 0x6f, - 0x72, 0x73, 0x14, 0x06, 0x73, 0x74, 0x72, 0x6c, 0x65, 0x6e, 0x15, 0x08, - 0x69, 0x73, 0x77, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x16, 0x06, 0x6d, 0x65, - 0x6d, 0x63, 0x6d, 0x70, 0x17, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x68, 0x72, - 0x18, 0x06, 0x73, 0x74, 0x72, 0x63, 0x6d, 0x70, 0x19, 0x08, 0x74, 0x6f, - 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x1a, 0x07, 0x63, 0x61, 0x73, 0x65, - 0x6d, 0x61, 0x70, 0x1b, 0x08, 0x74, 0x6f, 0x77, 0x75, 0x70, 0x70, 0x65, - 0x72, 0x1c, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x6d, 0x70, 0x1d, 0x08, - 0x69, 0x73, 0x77, 0x75, 0x70, 0x70, 0x65, 0x72, 0x1e, 0x07, 0x6d, 0x65, - 0x6d, 0x6d, 0x6f, 0x76, 0x65, 0x1f, 0x06, 0x6d, 0x65, 0x6d, 0x73, 0x65, - 0x74, 0x20, 0x08, 0x69, 0x73, 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x21, - 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x70, 0x79, 0x22, 0x07, 0x69, 0x73, 0x62, - 0x6c, 0x61, 0x6e, 0x6b, 0x23, 0x08, 0x69, 0x73, 0x77, 0x62, 0x6c, 0x61, - 0x6e, 0x6b, 0x24, 0x08, 0x69, 0x73, 0x77, 0x64, 0x69, 0x67, 0x69, 0x74, - 0x25, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x61, 0x74, 0x26, 0x09, 0x5f, - 0x5f, 0x73, 0x74, 0x70, 0x6e, 0x63, 0x70, 0x79, 0x27, 0x07, 0x73, 0x74, - 0x72, 0x6e, 0x63, 0x70, 0x79, 0x28, 0x09, 0x69, 0x73, 0x77, 0x78, 0x64, - 0x69, 0x67, 0x69, 0x74, 0x29, 0x06, 0x77, 0x63, 0x73, 0x6c, 0x65, 0x6e, - 0x2a, 0x06, 0x77, 0x63, 0x73, 0x63, 0x68, 0x72, 0x2b, 0x08, 0x69, 0x73, - 0x77, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x08, 0x69, 0x73, 0x77, 0x61, - 0x6c, 0x6e, 0x75, 0x6d, 0x07, 0x33, 0x02, 0x00, 0x0f, 0x5f, 0x5f, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x01, 0x1f, 0x47, 0x4f, 0x54, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x5f, 0x5f, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x09, 0x11, 0x02, - 0x00, 0x07, 0x2e, 0x72, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x01, 0x05, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x00, 0x8e, 0x01, 0x09, 0x70, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x65, 0x72, 0x73, 0x02, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, - 0x61, 0x67, 0x65, 0x01, 0x03, 0x43, 0x31, 0x31, 0x00, 0x0c, 0x70, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x2d, 0x62, 0x79, 0x01, 0x05, - 0x63, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x32, 0x31, 0x2e, 0x31, 0x2e, 0x34, - 0x2d, 0x77, 0x61, 0x73, 0x69, 0x2d, 0x73, 0x64, 0x6b, 0x20, 0x28, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x6c, 0x76, 0x6d, 0x2f, 0x6c, - 0x6c, 0x76, 0x6d, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x20, - 0x32, 0x32, 0x32, 0x66, 0x63, 0x31, 0x31, 0x66, 0x32, 0x62, 0x38, 0x66, - 0x32, 0x35, 0x66, 0x36, 0x61, 0x30, 0x66, 0x34, 0x39, 0x37, 0x36, 0x32, - 0x37, 0x32, 0x65, 0x66, 0x31, 0x62, 0x62, 0x37, 0x62, 0x66, 0x34, 0x39, - 0x35, 0x32, 0x31, 0x64, 0x29, 0x00, 0xa4, 0x01, 0x0f, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x09, 0x2b, 0x0b, 0x62, 0x75, 0x6c, 0x6b, 0x2d, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x2b, 0x0f, 0x62, 0x75, 0x6c, 0x6b, 0x2d, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x2d, 0x6f, 0x70, 0x74, 0x2b, 0x16, 0x63, 0x61, 0x6c, - 0x6c, 0x2d, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x2d, 0x6f, - 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x6e, 0x67, 0x2b, 0x0e, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x64, 0x65, 0x64, 0x2d, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x2b, - 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2b, - 0x0f, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x73, 0x2b, 0x13, 0x6e, 0x6f, 0x6e, 0x74, 0x72, 0x61, - 0x70, 0x70, 0x69, 0x6e, 0x67, 0x2d, 0x66, 0x70, 0x74, 0x6f, 0x69, 0x6e, - 0x74, 0x2b, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2b, 0x08, 0x73, 0x69, 0x67, 0x6e, - 0x2d, 0x65, 0x78, 0x74 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, + 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0b, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x03, + 0x20, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x06, + 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x09, 0x20, 0x00, 0x00, 0x0a, + 0x20, 0x00, 0x00, 0x28, 0x20, 0x00, 0x00, 0x29, 0x20, 0x00, 0x00, 0x5f, + 0x20, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x41, 0xe8, 0xc2, 0x04, 0x0b, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x8e, + 0x01, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x73, 0x02, + 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x01, 0x03, 0x43, + 0x31, 0x31, 0x00, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x2d, 0x62, 0x79, 0x01, 0x05, 0x63, 0x6c, 0x61, 0x6e, 0x67, 0x5f, + 0x32, 0x31, 0x2e, 0x31, 0x2e, 0x34, 0x2d, 0x77, 0x61, 0x73, 0x69, 0x2d, + 0x73, 0x64, 0x6b, 0x20, 0x28, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, + 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x6c, 0x6c, 0x76, 0x6d, 0x2f, 0x6c, 0x6c, 0x76, 0x6d, 0x2d, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x32, 0x32, 0x32, 0x66, 0x63, 0x31, + 0x31, 0x66, 0x32, 0x62, 0x38, 0x66, 0x32, 0x35, 0x66, 0x36, 0x61, 0x30, + 0x66, 0x34, 0x39, 0x37, 0x36, 0x32, 0x37, 0x32, 0x65, 0x66, 0x31, 0x62, + 0x62, 0x37, 0x62, 0x66, 0x34, 0x39, 0x35, 0x32, 0x31, 0x64, 0x29, 0x00, + 0xa4, 0x01, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x09, 0x2b, 0x0f, 0x6d, 0x75, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, + 0x2b, 0x13, 0x6e, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x2d, 0x66, 0x70, 0x74, 0x6f, 0x69, 0x6e, 0x74, 0x2b, 0x0b, 0x62, + 0x75, 0x6c, 0x6b, 0x2d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2b, 0x08, + 0x73, 0x69, 0x67, 0x6e, 0x2d, 0x65, 0x78, 0x74, 0x2b, 0x0f, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2d, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2b, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2b, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x2d, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x2b, 0x0f, 0x62, 0x75, 0x6c, 0x6b, 0x2d, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2d, 0x6f, 0x70, 0x74, 0x2b, 0x16, + 0x63, 0x61, 0x6c, 0x6c, 0x2d, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x2d, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x6e, 0x67 }; -unsigned int STDLIB_WASM_LEN = 16348; +unsigned int STDLIB_WASM_LEN = 14794; From 9f9a0bc410c98c3ffaaf296242d896cd9acac1dd Mon Sep 17 00:00:00 2001 From: DanikVitek Date: Sat, 10 Jan 2026 23:01:55 +0200 Subject: [PATCH 656/663] fix: Renamed `TreeCursor<'cursor>` into `TreeCursor<'tree>`, to be consistant with the usages and reduse confusion --- lib/binding_rust/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs index bf86cf74..583ff1b0 100644 --- a/lib/binding_rust/lib.rs +++ b/lib/binding_rust/lib.rs @@ -317,7 +317,7 @@ pub trait Decode { /// A stateful object for walking a syntax [`Tree`] efficiently. #[doc(alias = "TSTreeCursor")] -pub struct TreeCursor<'cursor>(ffi::TSTreeCursor, PhantomData<&'cursor ()>); +pub struct TreeCursor<'tree>(ffi::TSTreeCursor, PhantomData<&'tree ()>); /// A set of patterns that match nodes in a syntax tree. #[doc(alias = "TSQuery")] @@ -2082,11 +2082,11 @@ impl fmt::Display for Node<'_> { } } -impl<'cursor> TreeCursor<'cursor> { +impl<'tree> TreeCursor<'tree> { /// Get the tree cursor's current [`Node`]. #[doc(alias = "ts_tree_cursor_current_node")] #[must_use] - pub fn node(&self) -> Node<'cursor> { + pub fn node(&self) -> Node<'tree> { Node( unsafe { ffi::ts_tree_cursor_current_node(&self.0) }, PhantomData, @@ -2227,7 +2227,7 @@ impl<'cursor> TreeCursor<'cursor> { /// Re-initialize this tree cursor to start at the original node that the /// cursor was constructed with. #[doc(alias = "ts_tree_cursor_reset")] - pub fn reset(&mut self, node: Node<'cursor>) { + pub fn reset(&mut self, node: Node<'tree>) { unsafe { ffi::ts_tree_cursor_reset(&mut self.0, node.0) }; } From b12009a7466c31bb3342a10f1f460603456f0967 Mon Sep 17 00:00:00 2001 From: DanikVitek Date: Sat, 10 Jan 2026 23:01:55 +0200 Subject: [PATCH 657/663] fix: Clarify/fix lifetimes - One has to think about lifetimes if a type has one: - `<&'a Node<'tree>>::language` now returns `LanguageRef<'tree>` instead of `LanguageRef<'a>`, as it should; - Remove explicit "outlives" requirements from `QueryMatches`, `QueryCaptures`, and their impl blocks, because they're inferred - Removed unnecessary `&mut` from `cst_render_node`'s `cursor` parameter --- crates/cli/src/parse.rs | 2 +- crates/cli/src/tests/helpers/query_helpers.rs | 2 +- crates/generate/src/quickjs.rs | 20 ++++++++--------- crates/highlight/src/highlight.rs | 5 +++-- crates/loader/src/loader.rs | 16 ++++++++------ crates/tags/src/tags.rs | 1 + lib/binding_rust/lib.rs | 22 ++++++++----------- 7 files changed, 34 insertions(+), 34 deletions(-) diff --git a/crates/cli/src/parse.rs b/crates/cli/src/parse.rs index 1a1d9723..3551f556 100644 --- a/crates/cli/src/parse.rs +++ b/crates/cli/src/parse.rs @@ -953,7 +953,7 @@ fn render_node_range( fn cst_render_node( opts: &ParseFileOptions, - cursor: &mut TreeCursor, + cursor: &TreeCursor, source_code: &[u8], out: &mut impl Write, total_width: usize, diff --git a/crates/cli/src/tests/helpers/query_helpers.rs b/crates/cli/src/tests/helpers/query_helpers.rs index e648ac8e..e2c68f17 100644 --- a/crates/cli/src/tests/helpers/query_helpers.rs +++ b/crates/cli/src/tests/helpers/query_helpers.rs @@ -225,7 +225,7 @@ impl Pattern { } // Find every matching combination of child patterns and child nodes. - let mut finished_matches = Vec::::new(); + let mut finished_matches = Vec::>::new(); if cursor.goto_first_child() { let mut match_states = vec![(0, mat)]; loop { diff --git a/crates/generate/src/quickjs.rs b/crates/generate/src/quickjs.rs index 99e77397..d8c71cfe 100644 --- a/crates/generate/src/quickjs.rs +++ b/crates/generate/src/quickjs.rs @@ -215,11 +215,11 @@ fn try_resolve_path(path: &Path) -> rquickjs::Result { } #[allow(clippy::needless_pass_by_value)] -fn require_from_module<'a>( - ctx: Ctx<'a>, +fn require_from_module<'js>( + ctx: Ctx<'js>, module_path: String, from_module: &str, -) -> rquickjs::Result> { +) -> rquickjs::Result> { let current_module = PathBuf::from(from_module); let current_dir = if current_module.is_file() { current_module.parent().unwrap_or(Path::new(".")) @@ -234,13 +234,13 @@ fn require_from_module<'a>( load_module_from_content(&ctx, &resolved_path, &contents) } -fn load_module_from_content<'a>( - ctx: &Ctx<'a>, +fn load_module_from_content<'js>( + ctx: &Ctx<'js>, path: &Path, contents: &str, -) -> rquickjs::Result> { +) -> rquickjs::Result> { if path.extension().is_some_and(|ext| ext == "json") { - return ctx.eval::(format!("JSON.parse({contents:?})")); + return ctx.eval::, _>(format!("JSON.parse({contents:?})")); } let exports = Object::new(ctx.clone())?; @@ -256,7 +256,7 @@ fn load_module_from_content<'a>( let module_path = filename.clone(); let require = Function::new( ctx.clone(), - move |ctx_inner: Ctx<'a>, target_path: String| -> rquickjs::Result> { + move |ctx_inner: Ctx<'js>, target_path: String| -> rquickjs::Result> { require_from_module(ctx_inner, target_path, &module_path) }, )?; @@ -264,8 +264,8 @@ fn load_module_from_content<'a>( let wrapper = format!("(function(exports, require, module, __filename, __dirname) {{ {contents} }})"); - let module_func = ctx.eval::(wrapper)?; - module_func.call::<_, Value>((exports, require, module_obj.clone(), filename, dirname))?; + let module_func = ctx.eval::, _>(wrapper)?; + module_func.call::<_, Value<'js>>((exports, require, module_obj.clone(), filename, dirname))?; module_obj.get("exports") } diff --git a/crates/highlight/src/highlight.rs b/crates/highlight/src/highlight.rs index 9a78d1ac..d38351f6 100644 --- a/crates/highlight/src/highlight.rs +++ b/crates/highlight/src/highlight.rs @@ -189,7 +189,7 @@ struct HighlightIterLayer<'a> { depth: usize, } -pub struct _QueryCaptures<'query, 'tree: 'query, T: TextProvider, I: AsRef<[u8]>> { +pub struct _QueryCaptures<'query, 'tree, T: TextProvider, I: AsRef<[u8]>> { ptr: *mut ffi::TSQueryCursor, query: &'query Query, text_provider: T, @@ -225,7 +225,7 @@ impl<'tree> _QueryMatch<'_, 'tree> { } } -impl<'query, 'tree: 'query, T: TextProvider, I: AsRef<[u8]>> Iterator +impl<'query, 'tree, T: TextProvider, I: AsRef<[u8]>> Iterator for _QueryCaptures<'query, 'tree, T, I> { type Item = (QueryMatch<'query, 'tree>, usize); @@ -594,6 +594,7 @@ impl<'a> HighlightIterLayer<'a> { } } + // SAFETY: // The `captures` iterator borrows the `Tree` and the `QueryCursor`, which // prevents them from being moved. But both of these values are really just // pointers, so it's actually ok to move them. diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index 11c8b673..451c6b82 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -765,7 +765,7 @@ impl Loader { } #[must_use] - pub fn get_all_language_configurations(&self) -> Vec<(&LanguageConfiguration, &Path)> { + pub fn get_all_language_configurations(&self) -> Vec<(&LanguageConfiguration<'static>, &Path)> { self.language_configurations .iter() .map(|c| (c, self.languages_by_id[c.language_id].0.as_ref())) @@ -775,7 +775,7 @@ impl Loader { pub fn language_configuration_for_scope( &self, scope: &str, - ) -> LoaderResult> { + ) -> LoaderResult)>> { for configuration in &self.language_configurations { if configuration.scope.as_ref().is_some_and(|s| s == scope) { let language = self.language_for_id(configuration.language_id)?; @@ -788,7 +788,7 @@ impl Loader { pub fn language_configuration_for_first_line_regex( &self, path: &Path, - ) -> LoaderResult> { + ) -> LoaderResult)>> { self.language_configuration_ids_by_first_line_regex .iter() .try_fold(None, |_, (regex, ids)| { @@ -817,7 +817,7 @@ impl Loader { pub fn language_configuration_for_file_name( &self, path: &Path, - ) -> LoaderResult> { + ) -> LoaderResult)>> { // Find all the language configurations that match this file name // or a suffix of the file name. let configuration_ids = path @@ -889,7 +889,7 @@ impl Loader { pub fn language_configuration_for_injection_string( &self, string: &str, - ) -> LoaderResult> { + ) -> LoaderResult)>> { let mut best_match_length = 0; let mut best_match_position = None; for (i, configuration) in self.language_configurations.iter().enumerate() { @@ -1534,7 +1534,9 @@ impl Loader { } #[must_use] - pub fn get_language_configuration_in_current_path(&self) -> Option<&LanguageConfiguration> { + pub fn get_language_configuration_in_current_path( + &self, + ) -> Option<&LanguageConfiguration<'static>> { self.language_configuration_in_current_path .map(|i| &self.language_configurations[i]) } @@ -1543,7 +1545,7 @@ impl Loader { &mut self, parser_path: &Path, set_current_path_config: bool, - ) -> LoaderResult<&[LanguageConfiguration]> { + ) -> LoaderResult<&[LanguageConfiguration<'static>]> { let initial_language_configuration_count = self.language_configurations.len(); match TreeSitterJSON::from_file(parser_path) { diff --git a/crates/tags/src/tags.rs b/crates/tags/src/tags.rs index 16270b0a..c6654876 100644 --- a/crates/tags/src/tags.rs +++ b/crates/tags/src/tags.rs @@ -313,6 +313,7 @@ impl TagsContext { ) .ok_or(Error::Cancelled)?; + // SAFETY: // The `matches` iterator borrows the `Tree`, which prevents it from being // moved. But the tree is really just a pointer, so it's actually ok to // move it. diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs index 583ff1b0..51fd7f25 100644 --- a/lib/binding_rust/lib.rs +++ b/lib/binding_rust/lib.rs @@ -392,7 +392,7 @@ pub struct QueryMatch<'cursor, 'tree> { } /// A sequence of [`QueryMatch`]es associated with a given [`QueryCursor`]. -pub struct QueryMatches<'query, 'tree: 'query, T: TextProvider, I: AsRef<[u8]>> { +pub struct QueryMatches<'query, 'tree, T: TextProvider, I: AsRef<[u8]>> { ptr: *mut ffi::TSQueryCursor, query: &'query Query, text_provider: T, @@ -407,7 +407,7 @@ pub struct QueryMatches<'query, 'tree: 'query, T: TextProvider, I: AsRef<[u8] /// /// During iteration, each element contains a [`QueryMatch`] and index. The index can /// be used to access the new capture inside of the [`QueryMatch::captures`]'s [`captures`]. -pub struct QueryCaptures<'query, 'tree: 'query, T: TextProvider, I: AsRef<[u8]>> { +pub struct QueryCaptures<'query, 'tree, T: TextProvider, I: AsRef<[u8]>> { ptr: *mut ffi::TSQueryCursor, query: &'query Query, text_provider: T, @@ -1581,7 +1581,7 @@ impl<'tree> Node<'tree> { /// Get the [`Language`] that was used to parse this node's syntax tree. #[doc(alias = "ts_node_language")] #[must_use] - pub fn language(&self) -> LanguageRef { + pub fn language(&self) -> LanguageRef<'tree> { LanguageRef(unsafe { ffi::ts_node_language(self.0) }, PhantomData) } @@ -3404,7 +3404,7 @@ impl QueryProperty { /// Provide a `StreamingIterator` instead of the traditional `Iterator`, as the /// underlying object in the C library gets updated on each iteration. Copies would /// have their internal state overwritten, leading to Undefined Behavior -impl<'query, 'tree: 'query, T: TextProvider, I: AsRef<[u8]>> StreamingIterator +impl<'query, 'tree, T: TextProvider, I: AsRef<[u8]>> StreamingIterator for QueryMatches<'query, 'tree, T, I> { type Item = QueryMatch<'query, 'tree>; @@ -3435,15 +3435,13 @@ impl<'query, 'tree: 'query, T: TextProvider, I: AsRef<[u8]>> StreamingIterato } } -impl<'query, 'tree: 'query, T: TextProvider, I: AsRef<[u8]>> StreamingIteratorMut - for QueryMatches<'query, 'tree, T, I> -{ +impl, I: AsRef<[u8]>> StreamingIteratorMut for QueryMatches<'_, '_, T, I> { fn get_mut(&mut self) -> Option<&mut Self::Item> { self.current_match.as_mut() } } -impl<'query, 'tree: 'query, T: TextProvider, I: AsRef<[u8]>> StreamingIterator +impl<'query, 'tree, T: TextProvider, I: AsRef<[u8]>> StreamingIterator for QueryCaptures<'query, 'tree, T, I> { type Item = (QueryMatch<'query, 'tree>, usize); @@ -3480,9 +3478,7 @@ impl<'query, 'tree: 'query, T: TextProvider, I: AsRef<[u8]>> StreamingIterato } } -impl<'query, 'tree: 'query, T: TextProvider, I: AsRef<[u8]>> StreamingIteratorMut - for QueryCaptures<'query, 'tree, T, I> -{ +impl, I: AsRef<[u8]>> StreamingIteratorMut for QueryCaptures<'_, '_, T, I> { fn get_mut(&mut self) -> Option<&mut Self::Item> { self.current_match.as_mut() } @@ -3622,8 +3618,8 @@ impl From for Range { } } -impl From<&'_ InputEdit> for ffi::TSInputEdit { - fn from(val: &'_ InputEdit) -> Self { +impl From<&InputEdit> for ffi::TSInputEdit { + fn from(val: &InputEdit) -> Self { Self { start_byte: val.start_byte as u32, old_end_byte: val.old_end_byte as u32, From cd603fa98178cb011f111c0472323d6dbcc1682c Mon Sep 17 00:00:00 2001 From: theanarkh <2923878201@qq.com> Date: Mon, 19 Jan 2026 06:39:52 +0800 Subject: [PATCH 658/663] feat: free memory automatically (#5225) --- lib/binding_web/src/finalization_registry.ts | 8 ++ lib/binding_web/src/lookahead_iterator.ts | 7 ++ lib/binding_web/src/parser.ts | 8 ++ lib/binding_web/src/query.ts | 7 ++ lib/binding_web/src/tree.ts | 7 ++ lib/binding_web/src/tree_cursor.ts | 7 ++ lib/binding_web/test/memory.test.ts | 74 +++++++++++++++++++ lib/binding_web/test/memory.ts | 20 +++++ .../test/memory_unsupported.test.ts | 25 +++++++ 9 files changed, 163 insertions(+) create mode 100644 lib/binding_web/src/finalization_registry.ts create mode 100644 lib/binding_web/test/memory.test.ts create mode 100644 lib/binding_web/test/memory.ts create mode 100644 lib/binding_web/test/memory_unsupported.test.ts diff --git a/lib/binding_web/src/finalization_registry.ts b/lib/binding_web/src/finalization_registry.ts new file mode 100644 index 00000000..5f9c45cc --- /dev/null +++ b/lib/binding_web/src/finalization_registry.ts @@ -0,0 +1,8 @@ +export function newFinalizer(handler: (value: T) => void): FinalizationRegistry | undefined { + try { + return new FinalizationRegistry(handler); + } catch(e) { + console.error('Unsupported FinalizationRegistry:', e); + return; + } +} diff --git a/lib/binding_web/src/lookahead_iterator.ts b/lib/binding_web/src/lookahead_iterator.ts index 92b4d28f..4dd6b296 100644 --- a/lib/binding_web/src/lookahead_iterator.ts +++ b/lib/binding_web/src/lookahead_iterator.ts @@ -1,5 +1,10 @@ import { C, Internal, assertInternal } from './constants'; import { Language } from './language'; +import { newFinalizer } from './finalization_registry'; + +const finalizer = newFinalizer((address: number) => { + C._ts_lookahead_iterator_delete(address); +}); export class LookaheadIterator implements Iterable { /** @internal */ @@ -13,6 +18,7 @@ export class LookaheadIterator implements Iterable { assertInternal(internal); this[0] = address; this.language = language; + finalizer?.register(this, address, this); } /** Get the current symbol of the lookahead iterator. */ @@ -27,6 +33,7 @@ export class LookaheadIterator implements Iterable { /** Delete the lookahead iterator, freeing its resources. */ delete(): void { + finalizer?.unregister(this); C._ts_lookahead_iterator_delete(this[0]); this[0] = 0; } diff --git a/lib/binding_web/src/parser.ts b/lib/binding_web/src/parser.ts index efcadf05..7e3c3b4a 100644 --- a/lib/binding_web/src/parser.ts +++ b/lib/binding_web/src/parser.ts @@ -3,6 +3,7 @@ import { Language } from './language'; import { marshalRange, unmarshalRange } from './marshal'; import { checkModule, initializeBinding } from './bindings'; import { Tree } from './tree'; +import { newFinalizer } from './finalization_registry'; /** * Options for parsing @@ -82,6 +83,11 @@ export let LANGUAGE_VERSION: number; */ export let MIN_COMPATIBLE_VERSION: number; +const finalizer = newFinalizer((addresses: number[]) => { + C._ts_parser_delete(addresses[0]); + C._free(addresses[1]); +}); + /** * A stateful object that is used to produce a {@link Tree} based on some * source code. @@ -117,6 +123,7 @@ export class Parser { */ constructor() { this.initialize(); + finalizer?.register(this, [this[0], this[1]], this); } /** @internal */ @@ -131,6 +138,7 @@ export class Parser { /** Delete the parser, freeing its resources. */ delete() { + finalizer?.unregister(this); C._ts_parser_delete(this[0]); C._free(this[1]); this[0] = 0; diff --git a/lib/binding_web/src/query.ts b/lib/binding_web/src/query.ts index b9cd1971..e2994b14 100644 --- a/lib/binding_web/src/query.ts +++ b/lib/binding_web/src/query.ts @@ -3,6 +3,7 @@ import { Node } from './node'; import { marshalNode, unmarshalCaptures } from './marshal'; import { TRANSFER_BUFFER } from './parser'; import { Language } from './language'; +import { newFinalizer } from './finalization_registry'; const PREDICATE_STEP_TYPE_CAPTURE = 1; @@ -506,6 +507,10 @@ function parsePattern( } } +const finalizer = newFinalizer((address: number) => { + C._ts_query_delete(address); +}); + export class Query { /** @internal */ private [0] = 0; // Internal handle for Wasm @@ -687,10 +692,12 @@ export class Query { this.assertedProperties = assertedProperties; this.refutedProperties = refutedProperties; this.exceededMatchLimit = false; + finalizer?.register(this, address, this); } /** Delete the query, freeing its resources. */ delete(): void { + finalizer?.unregister(this); C._ts_query_delete(this[0]); this[0] = 0; } diff --git a/lib/binding_web/src/tree.ts b/lib/binding_web/src/tree.ts index 7a251440..f6a7aaf3 100644 --- a/lib/binding_web/src/tree.ts +++ b/lib/binding_web/src/tree.ts @@ -5,6 +5,7 @@ import { TreeCursor } from './tree_cursor'; import { marshalEdit, marshalPoint, unmarshalNode, unmarshalRange } from './marshal'; import { TRANSFER_BUFFER } from './parser'; import { Edit } from './edit'; +import { newFinalizer } from './finalization_registry'; /** @internal */ export function getText(tree: Tree, startIndex: number, endIndex: number, startPosition: Point): string { @@ -28,6 +29,10 @@ export function getText(tree: Tree, startIndex: number, endIndex: number, startP return result ?? ''; } +const finalizer = newFinalizer((address: number) => { + C._ts_tree_delete(address); +}); + /** A tree that represents the syntactic structure of a source code file. */ export class Tree { /** @internal */ @@ -45,6 +50,7 @@ export class Tree { this[0] = address; this.language = language; this.textCallback = textCallback; + finalizer?.register(this, address, this); } /** Create a shallow copy of the syntax tree. This is very fast. */ @@ -55,6 +61,7 @@ export class Tree { /** Delete the syntax tree, freeing its resources. */ delete(): void { + finalizer?.unregister(this); C._ts_tree_delete(this[0]); this[0] = 0; } diff --git a/lib/binding_web/src/tree_cursor.ts b/lib/binding_web/src/tree_cursor.ts index 7562bb7f..978a86dc 100644 --- a/lib/binding_web/src/tree_cursor.ts +++ b/lib/binding_web/src/tree_cursor.ts @@ -3,6 +3,11 @@ import { marshalNode, marshalPoint, marshalTreeCursor, unmarshalNode, unmarshalP import { Node } from './node'; import { TRANSFER_BUFFER } from './parser'; import { getText, Tree } from './tree'; +import { newFinalizer } from './finalization_registry'; + +const finalizer = newFinalizer((address: number) => { + C._ts_tree_cursor_delete_wasm(address); +}); /** A stateful object for walking a syntax {@link Tree} efficiently. */ export class TreeCursor { @@ -30,6 +35,7 @@ export class TreeCursor { assertInternal(internal); this.tree = tree; unmarshalTreeCursor(this); + finalizer?.register(this, this.tree[0], this); } /** Creates a deep copy of the tree cursor. This allocates new memory. */ @@ -42,6 +48,7 @@ export class TreeCursor { /** Delete the tree cursor, freeing its resources. */ delete(): void { + finalizer?.unregister(this); marshalTreeCursor(this); C._ts_tree_cursor_delete_wasm(this.tree[0]); this[0] = this[1] = this[2] = 0; diff --git a/lib/binding_web/test/memory.test.ts b/lib/binding_web/test/memory.test.ts new file mode 100644 index 00000000..46238934 --- /dev/null +++ b/lib/binding_web/test/memory.test.ts @@ -0,0 +1,74 @@ +import { describe, expect, it } from 'vitest'; +import { gc, event, Finalizer } from './memory'; + +// hijack finalization registry before import web-tree-sitter +globalThis.FinalizationRegistry = Finalizer; + +describe('Memory Management', () => { + describe('call .delete()', () => { + it('test free memory manually', async () => { + const timer = setInterval(() => { + gc(); + }, 100); + let done = 0; + event.on('gc', () => { + done++; + }); + await (async () => { + const { JavaScript } = await (await import('./helper')).default; + const { Parser, Query } = await import('../src'); + const parser = new Parser(); + parser.setLanguage(JavaScript); + const tree = parser.parse('1+1')!; + const copyTree = tree.copy(); + const cursor = tree.walk(); + const copyCursor = cursor.copy(); + const lookaheadIterator = JavaScript.lookaheadIterator(cursor.currentNode.nextParseState)!; + const query = new Query(JavaScript, '(identifier) @element'); + parser.delete(); + tree.delete(); + copyTree.delete(); + cursor.delete(); + copyCursor.delete(); + lookaheadIterator.delete(); + query.delete(); + })(); + // wait for gc + await new Promise((resolve) => setTimeout(resolve, 1000)); + clearInterval(timer); + // expect no gc event fired + expect(done).toBe(0); + }); + }); + + describe('do not call .delete()', () => { + it('test free memory automatically', async () => { + const timer = setInterval(() => { + gc(); + }, 100); + let done = 0; + const promise = new Promise((resolve) => { + event.on('gc', () => { + if (++done === 7) { + resolve(undefined); + clearInterval(timer); + } + console.log('free memory times: ', done); + }); + }); + await (async () => { + const { JavaScript } = await (await import('./helper')).default; + const { Parser, Query } = await import('../src'); + const parser = new Parser(); // 1 + parser.setLanguage(JavaScript); + const tree = parser.parse('1+1')!; // 2 + tree.copy(); // 3 + const cursor = tree.walk(); // 4 + cursor.copy(); // 5 + JavaScript.lookaheadIterator(cursor.currentNode.nextParseState)!; // 6 + new Query(JavaScript, '(identifier) @element'); // 7 + })(); + await promise; + }); + }); +}); diff --git a/lib/binding_web/test/memory.ts b/lib/binding_web/test/memory.ts new file mode 100644 index 00000000..62cb8b7d --- /dev/null +++ b/lib/binding_web/test/memory.ts @@ -0,0 +1,20 @@ +import { EventEmitter } from 'events'; +import { Session } from 'inspector'; + +const session = new Session(); +session.connect(); + +export function gc() { + session.post('HeapProfiler.collectGarbage'); +} + +export const event = new EventEmitter(); + +export class Finalizer extends FinalizationRegistry { + constructor(handler: (value: T) => void) { + super((value) => { + handler(value); + event.emit('gc'); + }); + } +} diff --git a/lib/binding_web/test/memory_unsupported.test.ts b/lib/binding_web/test/memory_unsupported.test.ts new file mode 100644 index 00000000..cc1f69bf --- /dev/null +++ b/lib/binding_web/test/memory_unsupported.test.ts @@ -0,0 +1,25 @@ +import { describe, it } from 'vitest'; + +describe('FinalizationRegistry is unsupported', () => { + it('test FinalizationRegistry is unsupported', async () => { + // @ts-expect-error: test FinalizationRegistry is not supported + globalThis.FinalizationRegistry = undefined; + const { JavaScript } = await (await import('./helper')).default; + const { Parser, Query } = await import('../src'); + const parser = new Parser(); + parser.setLanguage(JavaScript); + const tree = parser.parse('1+1')!; + const copyTree = tree.copy(); + const cursor = tree.walk(); + const copyCursor = cursor.copy(); + const lookaheadIterator = JavaScript.lookaheadIterator(cursor.currentNode.nextParseState)!; + const query = new Query(JavaScript, '(identifier) @element'); + parser.delete(); + tree.delete(); + copyTree.delete(); + cursor.delete(); + copyCursor.delete(); + lookaheadIterator.delete(); + query.delete(); + }); +}); From 0cdb6bef7b6fc912e3db0a928ddb5c2993bbe6a6 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Sun, 18 Jan 2026 02:25:25 -0500 Subject: [PATCH 659/663] fix(cli): warn user when `nm` can't be run to verify the symbols inside the parser being built --- crates/loader/src/loader.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs index 451c6b82..e7584378 100644 --- a/crates/loader/src/loader.rs +++ b/crates/loader/src/loader.rs @@ -1305,6 +1305,11 @@ impl Loader { })); } } + } else { + warn!( + "Failed to run `nm` to verify symbols in {}", + library_path.display() + ); } Ok(()) From 470ecf89966cfe7450e30b473f2bec0c370e2e20 Mon Sep 17 00:00:00 2001 From: Will Lillis Date: Tue, 13 Jan 2026 00:47:46 -0500 Subject: [PATCH 660/663] feat(ci): ensure `wasm-stdlib.h` is regenerated when wasm stdlib source files are modified. --- .github/scripts/wasm_stdlib.js | 25 +++++++++++++++++++++++++ .github/workflows/ci.yml | 3 +++ .github/workflows/wasm_stdlib.yml | 19 +++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 .github/scripts/wasm_stdlib.js create mode 100644 .github/workflows/wasm_stdlib.yml diff --git a/.github/scripts/wasm_stdlib.js b/.github/scripts/wasm_stdlib.js new file mode 100644 index 00000000..e1350094 --- /dev/null +++ b/.github/scripts/wasm_stdlib.js @@ -0,0 +1,25 @@ +module.exports = async ({ github, context, core }) => { + if (context.eventName !== 'pull_request') return; + + const prNumber = context.payload.pull_request.number; + const owner = context.repo.owner; + const repo = context.repo.repo; + + const { data: files } = await github.rest.pulls.listFiles({ + owner, + repo, + pull_number: prNumber + }); + + const changedFiles = files.map(file => file.filename); + + const wasmStdLibSrc = 'crates/language/wasm/'; + const dirChanged = changedFiles.some(file => file.startsWith(wasmStdLibSrc)); + + if (!dirChanged) return; + + const wasmStdLibHeader = 'lib/src/wasm/wasm-stdlib.h'; + const requiredChanged = changedFiles.includes(wasmStdLibHeader); + + if (!requiredChanged) core.setFailed(`Changes detected in ${wasmStdLibSrc} but ${wasmStdLibHeader} was not modified.`); +}; diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 97a7e378..a60c93f4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,3 +44,6 @@ jobs: build: uses: ./.github/workflows/build.yml + + check-wasm-stdlib: + uses: ./.github/workflows/wasm_stdlib.yml diff --git a/.github/workflows/wasm_stdlib.yml b/.github/workflows/wasm_stdlib.yml new file mode 100644 index 00000000..3e7ee0cc --- /dev/null +++ b/.github/workflows/wasm_stdlib.yml @@ -0,0 +1,19 @@ +name: Check Wasm Stdlib build + +on: + workflow_call: + +jobs: + check: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Check directory changes + uses: actions/github-script@v7 + with: + script: | + const scriptPath = `${process.env.GITHUB_WORKSPACE}/.github/scripts/wasm_stdlib.js`; + const script = require(scriptPath); + return script({ github, context, core }); From ae8184b8b925afa97c0216541a12bd443e1285e1 Mon Sep 17 00:00:00 2001 From: Tam1SH Date: Tue, 6 Jan 2026 05:18:06 +0300 Subject: [PATCH 661/663] docs(playground): highlight full row for highlighted nodes --- crates/cli/src/playground.html | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/crates/cli/src/playground.html b/crates/cli/src/playground.html index 6f90e030..147516ac 100644 --- a/crates/cli/src/playground.html +++ b/crates/cli/src/playground.html @@ -19,7 +19,8 @@ --light-scrollbar-track: #f1f1f1; --light-scrollbar-thumb: #c1c1c1; --light-scrollbar-thumb-hover: #a8a8a8; - + --light-tree-row-bg: #e3f2fd; + --dark-bg: #1d1f21; --dark-border: #2d2d2d; --dark-text: #c5c8c6; @@ -28,6 +29,7 @@ --dark-scrollbar-track: #25282c; --dark-scrollbar-thumb: #4a4d51; --dark-scrollbar-thumb-hover: #5a5d61; + --dark-tree-row-bg: #373737; --primary-color: #0550ae; --primary-color-alpha: rgba(5, 80, 174, 0.1); @@ -42,6 +44,7 @@ --text-color: var(--dark-text); --panel-bg: var(--dark-panel-bg); --code-bg: var(--dark-code-bg); + --tree-row-bg: var(--dark-tree-row-bg); } [data-theme="light"] { @@ -50,6 +53,7 @@ --text-color: var(--light-text); --panel-bg: white; --code-bg: white; + --tree-row-bg: var(--light-tree-row-bg); } /* Base Styles */ @@ -275,7 +279,7 @@ } #output-container a.highlighted { - background-color: #d9d9d9; + background-color: #cae2ff; color: red; border-radius: 3px; text-decoration: underline; @@ -346,7 +350,7 @@ } & #output-container a.highlighted { - background-color: #373b41; + background-color: #656669; color: red; } @@ -373,6 +377,9 @@ color: var(--dark-text); } } + .tree-row:has(.highlighted) { + background-color: var(--tree-row-bg); + } From d251226a3cd0074fbadb2b6afe62061fb35bffed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Jan 2026 22:34:23 +0000 Subject: [PATCH 662/663] ci: bump actions/github-script from 7 to 8 in the actions group Bumps the actions group with 1 update: [actions/github-script](https://github.com/actions/github-script). Updates `actions/github-script` from 7 to 8 - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v8) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '8' dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions ... Signed-off-by: dependabot[bot] --- .github/workflows/wasm_stdlib.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wasm_stdlib.yml b/.github/workflows/wasm_stdlib.yml index 3e7ee0cc..adec8411 100644 --- a/.github/workflows/wasm_stdlib.yml +++ b/.github/workflows/wasm_stdlib.yml @@ -11,7 +11,7 @@ jobs: uses: actions/checkout@v6 - name: Check directory changes - uses: actions/github-script@v7 + uses: actions/github-script@v8 with: script: | const scriptPath = `${process.env.GITHUB_WORKSPACE}/.github/scripts/wasm_stdlib.js`; From 6739742fb61b7234122472b3da26ca5990809c1d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Jan 2026 22:33:52 +0000 Subject: [PATCH 663/663] build(deps): bump cc from 1.2.52 to 1.2.53 in the cargo group Bumps the cargo group with 1 update: [cc](https://github.com/rust-lang/cc-rs). Updates `cc` from 1.2.52 to 1.2.53 - [Release notes](https://github.com/rust-lang/cc-rs/releases) - [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md) - [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.52...cc-v1.2.53) --- updated-dependencies: - dependency-name: cc dependency-version: 1.2.53 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4bb4214f..ae7803c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -187,9 +187,9 @@ checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "cc" -version = "1.2.52" +version = "1.2.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3" +checksum = "755d2fce177175ffca841e9a06afdb2c4ab0f593d53b4dee48147dfaade85932" dependencies = [ "find-msvc-tools", "shlex", @@ -664,9 +664,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41" +checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db" [[package]] name = "fnv" diff --git a/Cargo.toml b/Cargo.toml index 5730ddf2..ca0d644a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -106,7 +106,7 @@ ansi_colours = "1.2.3" anstyle = "1.0.13" anyhow = "1.0.100" bstr = "1.12.0" -cc = "1.2.52" +cc = "1.2.53" clap = { version = "4.5.54", features = [ "cargo", "derive",