From 648059fdf92656a218be041154ba7b008f68fd4b Mon Sep 17 00:00:00 2001 From: Michael Aebli Date: Sun, 26 Jul 2026 22:36:04 +0200 Subject: [PATCH 1/2] Harmonize output APIs and wireless XML --- CHANGELOG.md | 34 + Cargo.toml | 13 +- README.md | 121 +- cli/Cargo.toml | 5 +- cli/README.md | 105 +- cli/src/main.rs | 138 +- crates/m-bus-application-layer/Cargo.toml | 4 +- crates/m-bus-core/Cargo.toml | 2 +- crates/wired-mbus-link-layer/Cargo.toml | 4 +- crates/wireless-mbus-link-layer/Cargo.toml | 4 +- crates/wireless-mbus-link-layer/src/lib.rs | 34 +- docs/m_bus_parser_wasm_pack.js | 428 +++- docs/m_bus_parser_wasm_pack_bg.wasm | Bin 407850 -> 411407 bytes docs/package.json | 4 +- python/Cargo.toml | 4 +- python/README_python.md | 12 +- python/pymbusparser.pyi | 12 +- python/src/lib.rs | 214 +- python/tests/test_bindings.py | 20 +- src/lib.rs | 7 + src/mbus_data.rs | 207 +- src/output.rs | 2496 ++++++++++++++++++++ src/rscada_xml.rs | 284 ++- tests/output_contract.rs | 90 + tests/rscada_xml.rs | 75 + wasm/Cargo.toml | 6 +- wasm/README.md | 21 +- wasm/src/lib.rs | 137 +- wasm/tests/web.rs | 47 +- 29 files changed, 3934 insertions(+), 594 deletions(-) create mode 100644 src/output.rs create mode 100644 tests/output_contract.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index ace6554..2811cce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,40 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.4.0] + +### Added + +- A versioned canonical output schema shared by Rust, CLI, Python, and WASM, + with exact decimal values, source provenance, partial-decode diagnostics, + stable error codes, and optional manufacturer enrichment. +- Typed `decode_*` and `render_*` Rust APIs, a native-object WASM decoder, a + custom Python exception, strict hexadecimal input, and explicit render + options. +- Responsive Unicode-aware tables that adapt between wide, compact, and + vertical layouts without exceeding the requested terminal or container + width. +- Self-hosted Shiki syntax highlighting for JSON, YAML, CSV, and XML in the + WASM documentation, with light/dark high-contrast themes, line numbers, + keyboard scrolling, forced-colors support, and automated WCAG AA checks. + +### Changed + +- JSON, YAML, CSV, table, Mermaid, annotated, XML, and binding outputs now use + one product-owned contract. Retained legacy serializers are available under + explicit legacy format names through this compatibility release. +- Wireless link frames preserve the raw C-field and expose the decoded + function only when the value is known. + +### Fixed + +- XML rendering now supports clear, encrypted, short/long transport, and ELL + wireless M-Bus frames while retaining byte-for-byte wired libmbus parity. +- Tables no longer wrap or mangle inside narrow terminals and browser output + cards. +- Syntax tokens and line-number gutters meet the WCAG 2.2 AA 4.5:1 text + contrast threshold in both supported themes. + ## [0.3.0] ### Added diff --git a/Cargo.toml b/Cargo.toml index 52721ff..05a8740 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "m-bus-parser" -version = "0.3.0" +version = "0.4.0" edition = "2021" description = "A library for parsing M-Bus frames" license = "MIT" @@ -25,7 +25,7 @@ bindgen = "0.72.0" [features] default = [] -std = ["prettytable-rs", "serde_json", "serde_yaml", "serde", "wired-mbus-link-layer/std", "wireless-mbus-link-layer/std", "m-bus-core/std", "m-bus-application-layer/std"] +std = ["prettytable-rs", "serde_json", "serde_yaml", "serde", "unicode-width", "wired-mbus-link-layer/std", "wireless-mbus-link-layer/std", "m-bus-core/std", "m-bus-application-layer/std"] plaintext-before-extension = ["m-bus-application-layer/plaintext-before-extension"] serde = ["dep:serde", "arrayvec/serde", "bitflags/serde", "wired-mbus-link-layer/serde", "wireless-mbus-link-layer/serde", "m-bus-core/serde", "m-bus-application-layer/serde"] defmt = ["dep:defmt", "wired-mbus-link-layer/defmt", "wireless-mbus-link-layer/defmt", "m-bus-core/defmt", "m-bus-application-layer/defmt"] @@ -44,13 +44,14 @@ prettytable-rs = { version = "^0.10", optional = true } serde_json = { version = "1.0.138", optional = true } serde_yaml = { version = "0.9", optional = true } serde = { version = "1.0", features = ["derive"], optional = true } +unicode-width = { version = "0.2", optional = true } bitflags = "2.8.0" arrayvec = { version = "0.7.4", default-features = false } defmt = { version = "1.0.1", optional = true } -wired-mbus-link-layer = { version = "0.3.0", path = "crates/wired-mbus-link-layer" } -wireless-mbus-link-layer = { version = "0.3.0", path = "crates/wireless-mbus-link-layer" } -m-bus-core = { version = "0.3.0", path = "crates/m-bus-core" } -m-bus-application-layer = { version = "0.3.0", path = "crates/m-bus-application-layer" } +wired-mbus-link-layer = { version = "0.4.0", path = "crates/wired-mbus-link-layer" } +wireless-mbus-link-layer = { version = "0.4.0", path = "crates/wireless-mbus-link-layer" } +m-bus-core = { version = "0.4.0", path = "crates/m-bus-core" } +m-bus-application-layer = { version = "0.4.0", path = "crates/m-bus-application-layer" } aes = { version = "0.9", optional = true, default-features = false } cbc = { version = "0.2", optional = true, default-features = false } cipher = { version = "0.5", optional = true, default-features = false, features = ["block-padding"] } diff --git a/README.md b/README.md index 8030e82..3c9c02e 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,11 @@ An open-source parser (decoder/deserializer) for the **wired** and **wireless** ## Features - Parses **wired M-Bus** (EN 13757-2/-3) and **wireless M-Bus** (wMBus) frames -- **Six output formats**: `table`, `json`, `yaml`, `csv`, `mermaid`, `xml` +- **Eight harmonized output formats**: `table`, `json`, `yaml`, `csv`, + `mermaid`, `xml`, `annotated`, and `annotated-text` +- A versioned canonical schema with exact decimal values, provenance, + partial-decode diagnostics, and stable error codes +- Responsive, Unicode-aware tables for narrow terminals and browser cards - **AES-128 decryption** for encrypted wMBus frames (mode 5 / mode 7) - **`no_std` compatible** — runs on embedded targets (manufacturer lookup and output formats require `std`) - Available as a **Rust library**, **CLI**, **WebAssembly (npm)** and **Python bindings** @@ -69,65 +73,26 @@ m-bus-parser-cli parse [OPTIONS] Options: -d, --data Raw M-Bus frame as a hex string -f, --file File containing a hex frame - -t, --format Output format: table (default), json, yaml, csv, mermaid, xml + -t, --format table, json, yaml, csv, mermaid, xml, annotated, annotated-text -k, --key AES-128 decryption key (32 hex characters) + --width Table width (auto-detected on an interactive terminal) + --no-enrichment Omit manufacturer enrichment ``` -Input hex can be in any of these forms: +Input hex is strict: use compact hexadecimal or complete byte tokens separated +by whitespace, colons, or hyphens. + ``` 68 3D 3D 68 ... (space-separated) 683D3D68... (plain hex) -0x68,0x3D,0x3D,... (0x-prefixed, comma-separated) +0x68:0x3D:0x3D:0x68 (prefixed byte tokens) ``` ### Table output (default) -```bash -m-bus-parser-cli parse -d "68 3D 3D 68 08 01 72 00 51 20 02 82 4D 02 04 00 88 00 00 \ - 04 07 00 00 00 00 0C 15 03 00 00 00 0B 2E 00 00 00 0B 3B 00 00 00 0A 5A 88 12 \ - 0A 5E 16 05 0B 61 23 77 00 02 6C 8C 11 02 27 37 0D 0F 60 00 67 16" -``` - -``` -Long Frame -┌────────────────────────────────┬─────────────┐ -│ Function │ Address │ -├────────────────────────────────┼─────────────┤ -│ RspUd (ACD: false, DFC: false) │ Primary (1) │ -└────────────────────────────────┴─────────────┘ -┌───────────────────────┬──────────────────────────────────────────┐ -│ Field │ Value │ -├───────────────────────┼──────────────────────────────────────────┤ -│ Identification Number │ 02205100 │ -├───────────────────────┼──────────────────────────────────────────┤ -│ Manufacturer │ SLB │ -├───────────────────────┼──────────────────────────────────────────┤ -│ Manufacturer Name │ Schlumberger Industries │ -├───────────────────────┼──────────────────────────────────────────┤ -│ Website │ slb.com │ -├───────────────────────┼──────────────────────────────────────────┤ -│ Description │ Energy and water metering │ -├───────────────────────┼──────────────────────────────────────────┤ -│ Access Number │ 0 │ -├───────────────────────┼──────────────────────────────────────────┤ -│ Status │ Permanent error, Manufacturer specific 3 │ -├───────────────────────┼──────────────────────────────────────────┤ -│ Security Mode │ No encryption used │ -├───────────────────────┼──────────────────────────────────────────┤ -│ Version │ 2 │ -├───────────────────────┼──────────────────────────────────────────┤ -│ DeviceType │ Heat Meter (Return) │ -└───────────────────────┴──────────────────────────────────────────┘ -┌─────────────────────────────────────────┬───────────────────────┬────────────┬─────────────┐ -│ Value │ Data Information │ Header Hex │ Data Hex │ -├─────────────────────────────────────────┼───────────────────────┼────────────┼─────────────┤ -│ (0)e4[Wh] │ 0,Inst,32-bit Integer │ 04 07 │ 00 00 00 00 │ -├─────────────────────────────────────────┼───────────────────────┼────────────┼─────────────┤ -│ (3)e-1[m³](Volume) │ 0,Inst,BCD 8-digit │ 0C 15 │ 03 00 00 00 │ -├─────────────────────────────────────────┼───────────────────────┼────────────┼─────────────┤ -│ (1288)e-1[°C] │ 0,Inst,BCD 4-digit │ 0A 5A │ 88 12 │ -└─────────────────────────────────────────┴───────────────────────┴────────────┴─────────────┘ -``` +The table automatically selects a wide, compact, or vertical-card layout and +never exceeds the detected terminal width. Use `--width 44` to request an exact +maximum explicitly. ### Other formats @@ -144,9 +109,13 @@ m-bus-parser-cli parse -d "..." -t csv # Mermaid diagram source (renders in the web app) m-bus-parser-cli parse -d "..." -t mermaid -# Legacy libmbus normalized XML (drop-in for rSCADA/libmbus consumers) +# Wired-compatible and wireless XML m-bus-parser-cli parse -d "..." -t xml +# Byte annotations as JSON or human-readable text +m-bus-parser-cli parse -d "..." -t annotated +m-bus-parser-cli parse -d "..." -t annotated-text + # With AES-128 decryption key m-bus-parser-cli parse -d "..." -k "000102030405060708090A0B0C0D0E0F" ``` @@ -159,7 +128,7 @@ Add to `Cargo.toml`: ```toml [dependencies] -m-bus-parser = "0.1" +m-bus-parser = { version = "0.4", features = ["std", "serde"] } ``` ### Parse a wired frame @@ -202,32 +171,38 @@ for record in parse_data_records(&data) { } ``` -### Serialize to any format +### Decode and render with typed APIs ```rust -use m_bus_parser::serialize_mbus_data; +use m_bus_parser::{ + DecodeOptions, OutputFormat, RenderOptions, decode_hex, render_hex, +}; let hex = "68 3D 3D 68 08 01 72 ..."; - -let table = serialize_mbus_data(hex, "table", None); -let json = serialize_mbus_data(hex, "json", None); -let yaml = serialize_mbus_data(hex, "yaml", None); -let csv = serialize_mbus_data(hex, "csv", None); -let mermaid = serialize_mbus_data(hex, "mermaid", None); -let xml = serialize_mbus_data(hex, "xml", None); - -// With decryption key -let key: [u8; 16] = [0x00, 0x01, ..., 0x0F]; -let decrypted = serialize_mbus_data(hex, "table", Some(&key)); +let decoded = decode_hex(hex, &DecodeOptions::default())?; +println!("schema v{}: {}", decoded.schema_version, decoded.protocol); + +let table = render_hex( + hex, + OutputFormat::Table, + &RenderOptions { + table_width: Some(72), + ..RenderOptions::default() + }, +)?; ``` +`serialize_mbus_data` remains as a string compatibility wrapper. New code +should use the typed APIs so invalid input and unsupported options remain +machine-readable `OutputError` values. + ### `no_std` usage The core parsing types are `no_std` compatible. Disable default features: ```toml [dependencies] -m-bus-parser = { version = "0.1", default-features = false } +m-bus-parser = { version = "0.4", default-features = false } ``` An embedded example (Cortex-M) is in [`examples/cortex-m/`](./examples/cortex-m). @@ -238,12 +213,14 @@ An embedded example (Cortex-M) is in [`examples/cortex-m/`](./examples/cortex-m) | Format | Flag | Description | |-----------|---------|--------------------------------------------------| -| `table` | default | Human-readable ASCII table | -| `json` | `-t json` | JSON | -| `yaml` | `-t yaml` | YAML | -| `csv` | `-t csv` | Comma-separated values | -| `mermaid` | `-t mermaid` | Mermaid flowchart source (renders in web app)| -| `xml` | `-t xml` | Legacy libmbus normalized XML (rSCADA-compatible)| +| `table` | default | Width-aware human-readable table | +| `json` | `-t json` | Canonical schema as JSON | +| `yaml` | `-t yaml` | Canonical schema as YAML | +| `csv` | `-t csv` | Stable tidy-record CSV | +| `mermaid` | `-t mermaid` | Layer-oriented Mermaid flowchart | +| `xml` | `-t xml` | Wired libmbus-compatible and wireless XML | +| `annotated` | `-t annotated` | Byte-segment annotation envelope | +| `annotated-text`| `-t annotated-text` | Human-readable byte annotations | --- diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 8707e92..86c23ce 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "m-bus-parser-cli" -version = "0.3.0" +version = "0.4.0" edition = "2021" description = "A cli to use the library for parsing M-Bus frames" license = "MIT" @@ -22,6 +22,7 @@ default = ["decryption"] decryption = ["m-bus-parser/decryption"] [dependencies] -m-bus-parser = { path = "..", version = "0.3.0", features = ["std", "serde"] } +m-bus-parser = { path = "..", version = "0.4.0", features = ["std", "serde"] } hex = "0.4" clap = { version = "4.5.4", features = ["derive"] } +terminal_size = "0.4" diff --git a/cli/README.md b/cli/README.md index 81c0771..74f0de7 100644 --- a/cli/README.md +++ b/cli/README.md @@ -1,89 +1,26 @@ -# M-Bus parser (wired) CLI -This is a command line interface for the m-bus parser. The parser is able to parse the link layer of the m-bus protocol. The application layer is not yet implemented fully, but works partially. It is planned to have various formats for the output. **Currently** the output is in a table format. Input can be a file or a string of the format `0x00 0x01 0x02 ...`, `000102...` or `00 01 02...`. -+=====================================+====================+============+ -| (182007+0)e0[](FabricationNumber, ) | 0,Inst,BCD 8-digit | 07 20 18 00| -+-------------------------------------+--------------------+------------+ -| (269+0)e0[m^3 ]() | 0,Inst,BCD 8-digit | 69 02 00 00| -+-------------------------------------+--------------------+------------+ -``` -+===========================+=======================+============+ -| (0+0)e4[W W ]() | 0,Inst,32-bit Integer | 00 00 00 00| -+---------------------------+-----------------------+------------+ -| (3+0)e-1[m^3 ]() | 0,Inst,BCD 8-digit | 03 00 00 00| -+---------------------------+-----------------------+------------+ -| (0+0)e3[W ]() | 0,Inst,BCD 6-digit | 00 00 00| -+---------------------------+-----------------------+------------+ -| (0+0)e-3[m^3 h^-1 ]() | 0,Inst,BCD 6-digit | 00 00 00| -+---------------------------+-----------------------+------------+ -| (1288+0)e-1[°C ]() | 0,Inst,BCD 4-digit | 88 12| -+---------------------------+-----------------------+------------+ -| (516+0)e-1[°C ]() | 0,Inst,BCD 4-digit | 16 05| -+---------------------------+-----------------------+------------+ -| (7723+0)e-2[°K ]() | 0,Inst,BCD 6-digit | 23 77 00| -+---------------------------+-----------------------+------------+ -| (12/Jan/12)(Date) | 0,Inst,Date Type G | 8C 11| -+---------------------------+-----------------------+------------+ -| (3383+0)e0[day ]() | 0,Inst,16-bit Integer | 37 0D| -+---------------------------+-----------------------+------------+ -| (Manufacturer Specific: [15, 96, 0]None) | None | 60 00| -+---------------------------+-----------------------+------------+ -``` -├──────────────────────────────┼────────────────────┼─────────────┤ -│ (182007)(FabricationNumber)) │ 0,Inst,BCD 8-digit │ 07 20 18 00 │ -├──────────────────────────────┼────────────────────┼─────────────┤ -│ (269)[m³](Volume)) │ 0,Inst,BCD 8-digit │ 69 02 00 00 │ -└──────────────────────────────┴────────────────────┴─────────────┘ +# M-Bus parser CLI + +The CLI decodes wired and wireless M-Bus frames through the same canonical +output contract as the Rust, Python, and WebAssembly APIs. + +```console +cargo install m-bus-parser-cli +m-bus-parser-cli parse --data "68 3D 3D 68 ..." --format json ``` -### String input +Formats: `table` (default), `json`, `yaml`, `csv`, `mermaid`, `xml`, +`annotated`, and `annotated-text`. + +Input accepts compact hexadecimal or complete `HH`/`0xHH` byte tokens separated +by whitespace, colons, or hyphens. Ambiguous or partial input is rejected with +a stable error code. -```bash -$ cargo run -p m-bus-parser-cli --release -- parse --data "68 3D 3D 68 08 01 72 00 51 20 02 82 4D 02 04 00 88 00 00 04 07 00 00 00 00 0C 15 03 00 00 00 0B 2E 00 00 00 0B 3B 00 00 00 0A 5A 88 12 0A 5E 16 05 0B 61 23 77 00 02 6C 8C 11 02 27 37 0D 0F 60 00 67 16" +Tables detect the interactive terminal width automatically. For pipes, the +default is 100 columns; override it explicitly when needed: -Long Frame -┌────────────────────────────────┬─────────────┐ -│ Function │ Address │ -├────────────────────────────────┼─────────────┤ -│ RspUd (ACD: false, DFC: false) │ Primary (1) │ -└────────────────────────────────┴─────────────┘ -┌───────────────────────┬────────────────────────────────────────────┐ -│ Field │ Value │ -├───────────────────────┼────────────────────────────────────────────┤ -│ Identification Number │ 02205100 │ -├───────────────────────┼────────────────────────────────────────────┤ -│ Manufacturer │ ManufacturerCode { code: ['S', 'L', 'B'] } │ -├───────────────────────┼────────────────────────────────────────────┤ -│ Access Number │ 0 │ -├───────────────────────┼────────────────────────────────────────────┤ -│ Status │ Permanent error, Manufacturer specific 3 │ -├───────────────────────┼────────────────────────────────────────────┤ -│ Signature │ 0 │ -├───────────────────────┼────────────────────────────────────────────┤ -│ Version │ 2 │ -├───────────────────────┼────────────────────────────────────────────┤ -│ Device Type │ Heat Meter │ -└───────────────────────┴────────────────────────────────────────────┘ -┌──────────────────────────────────────────┬───────────────────────┬─────────────┐ -│ Value │ Data Information │ Hex │ -├──────────────────────────────────────────┼───────────────────────┼─────────────┤ -│ (0)e4[Wh]) │ 0,Inst,32-bit Integer │ 00 00 00 00 │ -├──────────────────────────────────────────┼───────────────────────┼─────────────┤ -│ (3)e-1[m³](Volume)) │ 0,Inst,BCD 8-digit │ 03 00 00 00 │ -├──────────────────────────────────────────┼───────────────────────┼─────────────┤ -│ (0)e3[W]) │ 0,Inst,BCD 6-digit │ 00 00 00 │ -├──────────────────────────────────────────┼───────────────────────┼─────────────┤ -│ (0)e-3[m³h⁻¹]) │ 0,Inst,BCD 6-digit │ 00 00 00 │ -├──────────────────────────────────────────┼───────────────────────┼─────────────┤ -│ (1288)e-1[°C]) │ 0,Inst,BCD 4-digit │ 88 12 │ -├──────────────────────────────────────────┼───────────────────────┼─────────────┤ -│ (516)e-1[°C]) │ 0,Inst,BCD 4-digit │ 16 05 │ -├──────────────────────────────────────────┼───────────────────────┼─────────────┤ -│ (7723)e-2[°K]) │ 0,Inst,BCD 6-digit │ 23 77 00 │ -├──────────────────────────────────────────┼───────────────────────┼─────────────┤ -│ (12/Jan/12)(Date)) │ 0,Inst,Date Type G │ 8C 11 │ -├──────────────────────────────────────────┼───────────────────────┼─────────────┤ -│ (3383)[day]) │ 0,Inst,16-bit Integer │ 37 0D │ -├──────────────────────────────────────────┼───────────────────────┼─────────────┤ -│ (Manufacturer Specific: [15, 96, 0]None) │ None │ 60 00 │ -└──────────────────────────────────────────┴───────────────────────┴─────────────┘ +```console +m-bus-parser-cli parse --file telegram.hex --format table --width 48 ``` + +Pass a 32-digit AES-128 key with `--key`. Use `--no-enrichment` when only +protocol-derived data should be emitted. diff --git a/cli/src/main.rs b/cli/src/main.rs index 915d22a..fcd4b4d 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -1,8 +1,12 @@ -use clap::{Parser, Subcommand}; -use m_bus_parser::serialize_mbus_data; use std::fs; +use std::io::{self, IsTerminal}; use std::path::PathBuf; -use std::str; +use std::process::ExitCode; +use std::str::FromStr; + +use clap::{Parser, Subcommand}; +use m_bus_parser::{render_hex, DecodeOptions, OutputFormat, RenderOptions}; +use terminal_size::{terminal_size, Width}; #[derive(Parser)] #[command(version, about)] @@ -15,71 +19,105 @@ struct Cli { enum Command { /// Parse an M-Bus data file Parse { - /// The file to parse - #[arg(short = 'f', long)] + /// File containing a hexadecimal M-Bus frame + #[arg(short = 'f', long, conflicts_with = "data")] file: Option, - /// The raw M-Bus data as a string - #[arg(short = 'd', long)] + /// Raw hexadecimal M-Bus frame + #[arg(short = 'd', long, conflicts_with = "file")] data: Option, - /// Output format: table (default), json, yaml, csv, mermaid, xml - #[arg(short = 't', long)] - format: Option, + /// Output format: table, json, yaml, csv, mermaid, xml, annotated, annotated-text + #[arg(short = 't', long, default_value = "table")] + format: String, - /// Decryption key (32 hex characters for AES-128) + /// Decryption key (exactly 32 hexadecimal characters) #[arg(short = 'k', long)] key: Option, + + /// Table width in terminal columns (auto-detected for interactive output) + #[arg(long)] + width: Option, + + /// Omit bundled manufacturer enrichment from canonical outputs + #[arg(long)] + no_enrichment: bool, }, } -fn main() { - let cli = Cli::parse(); +fn main() -> ExitCode { + match run() { + Ok(()) => ExitCode::SUCCESS, + Err(error) => { + eprintln!("error: {error}"); + ExitCode::FAILURE + } + } +} +fn run() -> Result<(), String> { + let cli = Cli::parse(); match cli.command { Command::Parse { file, data, format, key, + width, + no_enrichment, } => { - let key_bytes = parse_key(key.as_deref()); - let fmt = format.as_deref().unwrap_or("table"); - - if let Some(file_path) = file { - let file_content = fs::read_to_string(file_path).expect("Failed to read the file"); - print!( - "{}", - serialize_mbus_data(&file_content, fmt, key_bytes.as_ref()) - ); - } else if let Some(data_string) = data { - print!( - "{}", - serialize_mbus_data(&data_string, fmt, key_bytes.as_ref()) - ); - } else { - eprintln!("Either --file or --data must be provided"); - } + let input = match (file, data) { + (Some(path), None) => fs::read_to_string(&path).map_err(|error| { + format!("[input.file] failed to read {}: {error}", path.display()) + })?, + (None, Some(data)) => data, + (None, None) => { + return Err( + "[option.invalid] either --file or --data must be provided".to_string() + ); + } + (Some(_), Some(_)) => unreachable!("clap enforces conflicts"), + }; + let output_format = OutputFormat::from_str(&format) + .map_err(|error| format!("[{}] {error}", error.code()))?; + let key = key + .as_deref() + .map(parse_key) + .transpose() + .map_err(|error| format!("[option.invalid] {error}"))?; + let width = width.or_else(|| { + if io::stdout().is_terminal() { + terminal_size().map(|(Width(columns), _)| usize::from(columns)) + } else { + Some(100) + } + }); + let rendered = render_hex( + &input, + output_format, + &RenderOptions { + decode: DecodeOptions { + key, + include_enrichment: !no_enrichment, + }, + table_width: width, + }, + ) + .map_err(|error| format!("[{}] {error}", error.code()))?; + print!("{rendered}"); + Ok(()) } } } -fn parse_key(key_hex: Option<&str>) -> Option<[u8; 16]> { - key_hex.and_then(|hex_str| { - hex::decode(hex_str).ok().and_then(|bytes| { - if bytes.len() == 16 { - let mut arr = [0u8; 16]; - arr.copy_from_slice(&bytes); - Some(arr) - } else { - eprintln!( - "Warning: Key must be 16 bytes (32 hex chars), got {} bytes. Ignoring key.", - bytes.len() - ); - None - } - }) - }) +fn parse_key(value: &str) -> Result<[u8; 16], String> { + if value.len() != 32 || !value.chars().all(|character| character.is_ascii_hexdigit()) { + return Err("key must contain exactly 32 hexadecimal characters".to_string()); + } + let bytes = hex::decode(value).map_err(|error| format!("invalid key: {error}"))?; + bytes + .try_into() + .map_err(|_| "key must contain exactly 16 bytes".to_string()) } #[cfg(test)] @@ -87,9 +125,9 @@ mod tests { use super::*; #[test] - fn test_parse_data_from_string() { - let data_string = "0x68, 0x3C, 0x3C, 0x68, 0x08, 0x08, 0x72, 0x78, 0x03, 0x49, 0x11, 0x77, 0x04, 0x0E, 0x16, 0x0A, 0x00, 0x00, 0x00, 0x0C, 0x78, 0x78, 0x03, 0x49, 0x11, 0x04, 0x13, 0x31, 0xD4, 0x00, 0x00, 0x42, 0x6C, 0x00, 0x00, 0x44, 0x13, 0x00, 0x00, 0x00, 0x00, 0x04, 0x6D, 0x0B, 0x0B, 0xCD, 0x13, 0x02, 0x27, 0x00, 0x00, 0x09, 0xFD, 0x0E, 0x02, 0x09, 0xFD, 0x0F, 0x06, 0x0F, 0x00, 0x01, 0x75, 0x13, 0xD3, 0x16"; - let output = serialize_mbus_data(data_string, "table", None); - assert!(output.contains("Hex")); + fn validates_key_exactly() { + assert!(parse_key("00112233445566778899AABBCCDDEEFF").is_ok()); + assert!(parse_key("0011").is_err()); + assert!(parse_key("00112233445566778899AABBCCDDEEFG").is_err()); } } diff --git a/crates/m-bus-application-layer/Cargo.toml b/crates/m-bus-application-layer/Cargo.toml index 79b7138..abc8ead 100644 --- a/crates/m-bus-application-layer/Cargo.toml +++ b/crates/m-bus-application-layer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "m-bus-application-layer" -version = "0.3.0" +version = "0.4.0" edition = "2021" description = "M-Bus application layer parser (DIF/VIF, data records)" license = "MIT" @@ -20,4 +20,4 @@ serde = { version = "1.0", features = ["derive"], optional = true } defmt = { version = "1.0.1", optional = true } bitflags = "2.8.0" arrayvec = { version = "0.7.4", default-features = false } -m-bus-core = { version = "0.3.0", path = "../m-bus-core" } +m-bus-core = { version = "0.4.0", path = "../m-bus-core" } diff --git a/crates/m-bus-core/Cargo.toml b/crates/m-bus-core/Cargo.toml index b511d99..534c019 100644 --- a/crates/m-bus-core/Cargo.toml +++ b/crates/m-bus-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "m-bus-core" -version = "0.3.0" +version = "0.4.0" edition = "2024" description = "Core types for the m-bus-parser M-Bus protocol library" license = "MIT" diff --git a/crates/wired-mbus-link-layer/Cargo.toml b/crates/wired-mbus-link-layer/Cargo.toml index 6b45fbd..087532c 100644 --- a/crates/wired-mbus-link-layer/Cargo.toml +++ b/crates/wired-mbus-link-layer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wired-mbus-link-layer" -version = "0.3.0" +version = "0.4.0" edition = "2024" description = "Wired M-Bus link layer parser (EN 13757-2)" license = "MIT" @@ -15,4 +15,4 @@ defmt = ["dep:defmt"] [dependencies] serde = { version = "1.0", features = ["derive"], optional = true } defmt = { version = "1.0.1", optional = true } -m-bus-core = { version = "0.3.0", path = "../m-bus-core" } +m-bus-core = { version = "0.4.0", path = "../m-bus-core" } diff --git a/crates/wireless-mbus-link-layer/Cargo.toml b/crates/wireless-mbus-link-layer/Cargo.toml index 780e28d..1a4a373 100644 --- a/crates/wireless-mbus-link-layer/Cargo.toml +++ b/crates/wireless-mbus-link-layer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wireless-mbus-link-layer" -version = "0.3.0" +version = "0.4.0" edition = "2024" description = "Wireless M-Bus link layer parser (wMBus)" license = "MIT" @@ -14,6 +14,6 @@ defmt = ["dep:defmt"] [dependencies] crc16 = "0.4.0" -m-bus-core = { version = "0.3.0", path = "../m-bus-core" } +m-bus-core = { version = "0.4.0", path = "../m-bus-core" } serde = { version = "1.0", features = ["derive"], optional = true } defmt = { version = "1.0.1", optional = true } diff --git a/crates/wireless-mbus-link-layer/src/lib.rs b/crates/wireless-mbus-link-layer/src/lib.rs index c2a2ee8..c3b5652 100644 --- a/crates/wireless-mbus-link-layer/src/lib.rs +++ b/crates/wireless-mbus-link-layer/src/lib.rs @@ -94,7 +94,12 @@ pub fn strip_format_a_crcs<'a>(data: &[u8], output: &'a mut [u8]) -> Option<&'a #[derive(Debug, Clone, Copy, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct WirelessFrame<'a> { - pub function: Function, + /// Raw wireless M-Bus C-field. + pub control_field: u8, + /// Decoded C-field when it maps to a function currently known by the + /// shared M-Bus core. Unknown but otherwise valid C-fields are preserved + /// through `control_field` instead of making the frame unparseable. + pub function: Option, pub manufacturer_id: ManufacturerId, #[cfg_attr( feature = "serde", @@ -167,14 +172,15 @@ impl<'a> TryFrom<&'a [u8]> for WirelessFrame<'a> { fn try_from(data: &'a [u8]) -> Result { let length = data.len(); let length_byte = *data.first().ok_or(FrameError::EmptyData)? as usize; - let _c_field = *data.get(1).ok_or(FrameError::TooShort)? as usize; + let control_field = *data.get(1).ok_or(FrameError::TooShort)?; let manufacturer_id = ManufacturerId::try_from(&data[2..])?; // In wireless M-Bus, the L-field contains the number of bytes following the L-field if length_byte + 1 == length { let data_end = trailing_frame_crc_start(data).unwrap_or(length); return Ok(WirelessFrame { - function: Function::SndNk { prm: false }, + control_field, + function: Function::try_from(control_field).ok(), manufacturer_id, data: &data[10..data_end], }); @@ -220,4 +226,26 @@ mod test { &[0x8C, 0x20, 0x27, 0x78, 0x0B, 0x13, 0x43, 0x65, 0x87] ); } + + #[test] + fn c_field_is_decoded_and_preserved() { + let frame = [ + 0x18, 0x44, 0xAE, 0x4C, 0x44, 0x55, 0x22, 0x33, 0x68, 0x07, 0x7A, 0x55, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x13, 0x89, 0xE2, 0x01, 0x00, 0x02, 0x3B, 0x00, + ]; + let parsed = WirelessFrame::try_from(frame.as_slice()).expect("valid wireless frame"); + assert_eq!(parsed.control_field, 0x44); + assert_eq!(parsed.function, Some(Function::SndNr)); + } + + #[test] + fn unknown_c_field_does_not_invalidate_frame() { + let frame = [ + 0x18, 0x45, 0xAE, 0x4C, 0x44, 0x55, 0x22, 0x33, 0x68, 0x07, 0x7A, 0x55, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x13, 0x89, 0xE2, 0x01, 0x00, 0x02, 0x3B, 0x00, + ]; + let parsed = WirelessFrame::try_from(frame.as_slice()).expect("valid wireless frame"); + assert_eq!(parsed.control_field, 0x45); + assert_eq!(parsed.function, None); + } } diff --git a/docs/m_bus_parser_wasm_pack.js b/docs/m_bus_parser_wasm_pack.js index d9d9b82..3bb50ba 100644 --- a/docs/m_bus_parser_wasm_pack.js +++ b/docs/m_bus_parser_wasm_pack.js @@ -1,91 +1,9 @@ -/* @ts-self-types="./m_bus_parser_wasm_pack.d.ts" */ +let wasm; -/** - * @param {string} data - * @param {string} format - * @returns {string} - */ -export function m_bus_parse(data, format) { - let deferred3_0; - let deferred3_1; - try { - const ptr0 = passStringToWasm0(data, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len0 = WASM_VECTOR_LEN; - const ptr1 = passStringToWasm0(format, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - const ret = wasm.m_bus_parse(ptr0, len0, ptr1, len1); - deferred3_0 = ret[0]; - deferred3_1 = ret[1]; - return getStringFromWasm0(ret[0], ret[1]); - } finally { - wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); - } -} - -/** - * @param {string} data - * @param {string} format - * @param {string} key_hex - * @returns {string} - */ -export function m_bus_parse_with_key(data, format, key_hex) { - let deferred4_0; - let deferred4_1; - try { - const ptr0 = passStringToWasm0(data, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len0 = WASM_VECTOR_LEN; - const ptr1 = passStringToWasm0(format, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - const ptr2 = passStringToWasm0(key_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len2 = WASM_VECTOR_LEN; - const ret = wasm.m_bus_parse_with_key(ptr0, len0, ptr1, len1, ptr2, len2); - deferred4_0 = ret[0]; - deferred4_1 = ret[1]; - return getStringFromWasm0(ret[0], ret[1]); - } finally { - wasm.__wbindgen_free(deferred4_0, deferred4_1, 1); - } -} - -/** - * @returns {string} - */ -export function version() { - let deferred1_0; - let deferred1_1; - try { - const ret = wasm.version(); - deferred1_0 = ret[0]; - deferred1_1 = ret[1]; - return getStringFromWasm0(ret[0], ret[1]); - } finally { - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } -} -function __wbg_get_imports() { - const import0 = { - __proto__: null, - __wbindgen_init_externref_table: function() { - const table = wasm.__wbindgen_externrefs; - const offset = table.grow(4); - table.set(0, undefined); - table.set(offset + 0, undefined); - table.set(offset + 1, null); - table.set(offset + 2, true); - table.set(offset + 3, false); - }, - }; - return { - __proto__: null, - "./m_bus_parser_wasm_pack_bg.js": import0, - }; -} - -function getStringFromWasm0(ptr, len) { - return decodeText(ptr >>> 0, len); -} +let WASM_VECTOR_LEN = 0; let cachedUint8ArrayMemory0 = null; + function getUint8ArrayMemory0() { if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); @@ -93,7 +11,23 @@ function getUint8ArrayMemory0() { return cachedUint8ArrayMemory0; } +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + function passStringToWasm0(arg, malloc, realloc) { + if (realloc === undefined) { const buf = cachedTextEncoder.encode(arg); const ptr = malloc(buf.length, 1) >>> 0; @@ -114,13 +48,14 @@ function passStringToWasm0(arg, malloc, realloc) { if (code > 0x7F) break; mem[ptr + offset] = code; } + if (offset !== len) { if (offset !== 0) { arg = arg.slice(offset); } ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); - const ret = cachedTextEncoder.encodeInto(arg, view); + const ret = encodeString(arg, view); offset += ret.written; ptr = realloc(ptr, len, offset, 1) >>> 0; @@ -130,43 +65,163 @@ function passStringToWasm0(arg, malloc, realloc) { return ptr; } -let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); -cachedTextDecoder.decode(); -const MAX_SAFARI_DECODE_BYTES = 2146435072; -let numBytesDecoded = 0; -function decodeText(ptr, len) { - numBytesDecoded += len; - if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) { - cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); - cachedTextDecoder.decode(); - numBytesDecoded = len; +let cachedDataViewMemory0 = null; + +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); } + return cachedDataViewMemory0; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); } -const cachedTextEncoder = new TextEncoder(); +function addToExternrefTable0(obj) { + const idx = wasm.__externref_table_alloc(); + wasm.__wbindgen_export_4.set(idx, obj); + return idx; +} -if (!('encodeInto' in cachedTextEncoder)) { - cachedTextEncoder.encodeInto = function (arg, view) { - const buf = cachedTextEncoder.encode(arg); - view.set(buf); - return { - read: arg.length, - written: buf.length - }; - }; +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + const idx = addToExternrefTable0(e); + wasm.__wbindgen_exn_store(idx); + } } -let WASM_VECTOR_LEN = 0; +function isLikeNone(x) { + return x === undefined || x === null; +} +/** + * @returns {string} + */ +export function version() { + let deferred1_0; + let deferred1_1; + try { + const ret = wasm.version(); + deferred1_0 = ret[0]; + deferred1_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } +} -let wasmModule, wasmInstance, wasm; -function __wbg_finalize_init(instance, module) { - wasmInstance = instance; - wasm = instance.exports; - wasmModule = module; - cachedUint8ArrayMemory0 = null; - wasm.__wbindgen_start(); - return wasm; +function takeFromExternrefTable0(idx) { + const value = wasm.__wbindgen_export_4.get(idx); + wasm.__externref_table_dealloc(idx); + return value; +} +/** + * Decode into the canonical schema as a native JavaScript object. + * @param {string} data + * @param {string | null} [key_hex] + * @param {boolean | null} [include_enrichment] + * @returns {any} + */ +export function m_bus_decode(data, key_hex, include_enrichment) { + const ptr0 = passStringToWasm0(data, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + var ptr1 = isLikeNone(key_hex) ? 0 : passStringToWasm0(key_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + const ret = wasm.m_bus_decode(ptr0, len0, ptr1, len1, isLikeNone(include_enrichment) ? 0xFFFFFF : include_enrichment ? 1 : 0); + if (ret[2]) { + throw takeFromExternrefTable0(ret[1]); + } + return takeFromExternrefTable0(ret[0]); +} + +/** + * Render with the shared Rust/Python/CLI output contract. + * @param {string} data + * @param {string} format + * @param {string | null} [key_hex] + * @param {number | null} [width] + * @param {boolean | null} [include_enrichment] + * @returns {string} + */ +export function m_bus_render(data, format, key_hex, width, include_enrichment) { + let deferred5_0; + let deferred5_1; + try { + const ptr0 = passStringToWasm0(data, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(format, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + var ptr2 = isLikeNone(key_hex) ? 0 : passStringToWasm0(key_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len2 = WASM_VECTOR_LEN; + const ret = wasm.m_bus_render(ptr0, len0, ptr1, len1, ptr2, len2, isLikeNone(width) ? 0x100000001 : (width) >>> 0, isLikeNone(include_enrichment) ? 0xFFFFFF : include_enrichment ? 1 : 0); + var ptr4 = ret[0]; + var len4 = ret[1]; + if (ret[3]) { + ptr4 = 0; len4 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred5_0 = ptr4; + deferred5_1 = len4; + return getStringFromWasm0(ptr4, len4); + } finally { + wasm.__wbindgen_free(deferred5_0, deferred5_1, 1); + } +} + +/** + * Compatibility wrapper returning errors as text. Prefer `m_bus_render`. + * @param {string} data + * @param {string} format + * @returns {string} + */ +export function m_bus_parse(data, format) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passStringToWasm0(data, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(format, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.m_bus_parse(ptr0, len0, ptr1, len1); + deferred3_0 = ret[0]; + deferred3_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } +} + +/** + * Compatibility wrapper returning errors as text. Prefer `m_bus_render`. + * @param {string} data + * @param {string} format + * @param {string} key_hex + * @returns {string} + */ +export function m_bus_parse_with_key(data, format, key_hex) { + let deferred4_0; + let deferred4_1; + try { + const ptr0 = passStringToWasm0(data, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(format, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + const ptr2 = passStringToWasm0(key_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len2 = WASM_VECTOR_LEN; + const ret = wasm.m_bus_parse_with_key(ptr0, len0, ptr1, len1, ptr2, len2); + deferred4_0 = ret[0]; + deferred4_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred4_0, deferred4_1, 1); + } } async function __wbg_load(module, imports) { @@ -174,41 +229,148 @@ async function __wbg_load(module, imports) { if (typeof WebAssembly.instantiateStreaming === 'function') { try { return await WebAssembly.instantiateStreaming(module, imports); - } catch (e) { - const validResponse = module.ok && expectedResponseType(module.type); - if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') { + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); - } else { throw e; } + } else { + throw e; + } } } const bytes = await module.arrayBuffer(); return await WebAssembly.instantiate(bytes, imports); + } else { const instance = await WebAssembly.instantiate(module, imports); if (instance instanceof WebAssembly.Instance) { return { instance, module }; + } else { return instance; } } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbg_String_8f0eb39a4a4c2f66 = function(arg0, arg1) { + const ret = String(arg1); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbg_new_405e22f390576ce2 = function() { + const ret = new Object(); + return ret; + }; + imports.wbg.__wbg_new_5e0be73521bc8c17 = function() { + const ret = new Map(); + return ret; + }; + imports.wbg.__wbg_new_78feb108b6472713 = function() { + const ret = new Array(); + return ret; + }; + imports.wbg.__wbg_new_c68d7209be747379 = function(arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return ret; + }; + imports.wbg.__wbg_set_37837023f3d740e8 = function(arg0, arg1, arg2) { + arg0[arg1 >>> 0] = arg2; + }; + imports.wbg.__wbg_set_3f1d0b984ed272ed = function(arg0, arg1, arg2) { + arg0[arg1] = arg2; + }; + imports.wbg.__wbg_set_8fc6bf8a5b1071d1 = function(arg0, arg1, arg2) { + const ret = arg0.set(arg1, arg2); + return ret; + }; + imports.wbg.__wbg_set_bb8cecf6a62b9f46 = function() { return handleError(function (arg0, arg1, arg2) { + const ret = Reflect.set(arg0, arg1, arg2); + return ret; + }, arguments) }; + imports.wbg.__wbg_setname_6df54b7ebf9404a9 = function(arg0, arg1, arg2) { + arg0.name = getStringFromWasm0(arg1, arg2); + }; + imports.wbg.__wbg_stringify_f7ed6987935b4a24 = function() { return handleError(function (arg0) { + const ret = JSON.stringify(arg0); + return ret; + }, arguments) }; + imports.wbg.__wbindgen_bigint_from_i64 = function(arg0) { + const ret = arg0; + return ret; + }; + imports.wbg.__wbindgen_bigint_from_u64 = function(arg0) { + const ret = BigInt.asUintN(64, arg0); + return ret; + }; + imports.wbg.__wbindgen_error_new = function(arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return ret; + }; + imports.wbg.__wbindgen_init_externref_table = function() { + const table = wasm.__wbindgen_export_4; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + ; + }; + imports.wbg.__wbindgen_is_string = function(arg0) { + const ret = typeof(arg0) === 'string'; + return ret; + }; + imports.wbg.__wbindgen_number_new = function(arg0) { + const ret = arg0; + return ret; + }; + imports.wbg.__wbindgen_string_get = function(arg0, arg1) { + const obj = arg1; + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return ret; + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + + return imports; +} + +function __wbg_init_memory(imports, memory) { - function expectedResponseType(type) { - switch (type) { - case 'basic': case 'cors': case 'default': return true; - } - return false; - } +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedDataViewMemory0 = null; + cachedUint8ArrayMemory0 = null; + + + wasm.__wbindgen_start(); + return wasm; } function initSync(module) { if (wasm !== undefined) return wasm; - if (module !== undefined) { + if (typeof module !== 'undefined') { if (Object.getPrototypeOf(module) === Object.prototype) { ({module} = module) } else { @@ -217,10 +379,15 @@ function initSync(module) { } const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + if (!(module instanceof WebAssembly.Module)) { module = new WebAssembly.Module(module); } + const instance = new WebAssembly.Instance(module, imports); + return __wbg_finalize_init(instance, module); } @@ -228,7 +395,7 @@ async function __wbg_init(module_or_path) { if (wasm !== undefined) return wasm; - if (module_or_path !== undefined) { + if (typeof module_or_path !== 'undefined') { if (Object.getPrototypeOf(module_or_path) === Object.prototype) { ({module_or_path} = module_or_path) } else { @@ -236,7 +403,7 @@ async function __wbg_init(module_or_path) { } } - if (module_or_path === undefined) { + if (typeof module_or_path === 'undefined') { module_or_path = new URL('m_bus_parser_wasm_pack_bg.wasm', import.meta.url); } const imports = __wbg_get_imports(); @@ -245,9 +412,12 @@ async function __wbg_init(module_or_path) { module_or_path = fetch(module_or_path); } + __wbg_init_memory(imports); + const { instance, module } = await __wbg_load(await module_or_path, imports); return __wbg_finalize_init(instance, module); } -export { initSync, __wbg_init as default }; +export { initSync }; +export default __wbg_init; diff --git a/docs/m_bus_parser_wasm_pack_bg.wasm b/docs/m_bus_parser_wasm_pack_bg.wasm index 9b5ffe565dc058f88a8f445020fd168b466b0508..44fe65eb346845babaaccc8ce86a4f005f660718 100644 GIT binary patch literal 411407 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

Hw~cwf+d#UdU3%;M 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 literal 407850 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 F^|# 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 diff --git a/docs/package.json b/docs/package.json index 4f1c69d..226efba 100644 --- a/docs/package.json +++ b/docs/package.json @@ -5,7 +5,7 @@ "Michael Aebli" ], "description": "A wasm-pack to use the library for parsing M-Bus frames", - "version": "0.3.0", + "version": "0.4.0", "license": "MIT", "repository": { "type": "git", @@ -28,4 +28,4 @@ "parse", "wasm-pack" ] -} +} \ No newline at end of file diff --git a/python/Cargo.toml b/python/Cargo.toml index 4927e2f..b906b81 100644 --- a/python/Cargo.toml +++ b/python/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pymbusparser" -version = "0.3.0" +version = "0.4.0" edition = "2021" homepage = "https://maebli.github.io/" repository = "https://github.com/maebli/m-bus-parser" @@ -8,7 +8,7 @@ description = "A Python binding for the M-Bus parser" license = "MIT" [dependencies] -m-bus-parser = { path = "..", version = "0.3.0", features = ["std", "serde", "decryption"] } +m-bus-parser = { path = "..", version = "0.4.0", features = ["std", "serde", "decryption"] } serde_json = "1.0" pyo3 = { version = "0.29.0", features = ["extension-module", "generate-import-lib"] } hex = "0.4" diff --git a/python/README_python.md b/python/README_python.md index d2754b7..e1e8bfc 100644 --- a/python/README_python.md +++ b/python/README_python.md @@ -27,7 +27,7 @@ telegram = """ frame = parse(telegram) print(frame["frame"]) -print(frame.get("data_records")) +print(frame["records"]) ``` Use `parse_records` when the input contains application-layer records without a @@ -40,12 +40,14 @@ records = parse_records("2f2f0413fce0f5052f2f2f2f2f2f2f2f") ``` Use `render` for text-oriented output. Supported formats are `json`, `yaml`, -`csv`, `table`, `mermaid`, `annotated`, `annotated-text`, and `hexview`: +`csv`, `table`, `mermaid`, `xml`, `annotated`, `annotated-text`, and +`hexview`: ```python from pymbusparser import render print(render(telegram, "table")) +print(render(telegram, "table", width=48)) ``` ## Decryption @@ -59,8 +61,10 @@ from pymbusparser import parse decoded = parse(encrypted_telegram, key=bytes.fromhex("00112233445566778899aabbccddeeff")) ``` -Malformed frames, keys, and output formats raise `ValueError`; unsupported input -types raise `TypeError`. +Malformed frames, keys, and output formats raise `MbusParserError`, a +`ValueError` subclass whose message starts with a stable error code. +Unsupported input types raise `TypeError`. Pass `include_enrichment=False` to +omit manufacturer lookup data. ## Compatibility diff --git a/python/pymbusparser.pyi b/python/pymbusparser.pyi index 230aa29..9d2fcc3 100644 --- a/python/pymbusparser.pyi +++ b/python/pymbusparser.pyi @@ -9,21 +9,31 @@ OutputFormat = Literal[ "csv", "table", "mermaid", + "xml", "annotated", "annotated-text", "hexview", ] +class MbusParserError(ValueError): ... + __version__: str __all__: List[str] -def parse(data: DataInput, *, key: Optional[KeyInput] = None) -> Dict[str, Any]: ... +def parse( + data: DataInput, + *, + key: Optional[KeyInput] = None, + include_enrichment: bool = True, +) -> Dict[str, Any]: ... def parse_records(data: DataInput) -> List[Any]: ... def render( data: DataInput, format: OutputFormat = "json", *, key: Optional[KeyInput] = None, + width: Optional[int] = None, + include_enrichment: bool = True, ) -> str: ... def parse_application_layer(data_record: str) -> str: ... def m_bus_parse(data: str, format: OutputFormat, key: Optional[str] = None) -> str: ... diff --git a/python/src/lib.rs b/python/src/lib.rs index 7fd3d6b..c68161b 100644 --- a/python/src/lib.rs +++ b/python/src/lib.rs @@ -1,46 +1,36 @@ -use m_bus_parser::serialize_mbus_data; +use std::str::FromStr; + use m_bus_parser::user_data::DataRecords; -use pyo3::exceptions::{PyTypeError, PyValueError}; +use m_bus_parser::{ + decode_bytes, decode_hex_bytes, render_bytes, render_hex, DecodeOptions, OutputError, + OutputFormat, RenderOptions, +}; +use pyo3::exceptions::PyTypeError; use pyo3::prelude::*; use pyo3::types::{PyAny, PyModule}; -const FORMATS: &[&str] = &[ - "json", - "yaml", - "csv", - "table", - "mermaid", - "xml", - "annotated", - "annotated-text", - "hexview", -]; - -fn decode_hex(value: &str, label: &str) -> PyResult> { - let without_prefix = value.replace("0x", "").replace("0X", ""); - let compact: String = without_prefix - .chars() - .filter(|character| { - !character.is_ascii_whitespace() && !matches!(character, ',' | ':' | '-' | '_') - }) - .collect(); +pyo3::create_exception!( + pymbusparser, + MbusParserError, + pyo3::exceptions::PyValueError +); - if compact.is_empty() { - return Err(PyValueError::new_err(format!("{label} must not be empty"))); - } +fn parser_error(error: OutputError) -> PyErr { + MbusParserError::new_err(format!("[{}] {error}", error.code())) +} - hex::decode(&compact) - .map_err(|error| PyValueError::new_err(format!("invalid hexadecimal {label}: {error}"))) +fn binding_error(code: &'static str, message: impl std::fmt::Display) -> PyErr { + MbusParserError::new_err(format!("[{code}] {message}")) } fn extract_bytes(value: &Bound<'_, PyAny>, label: &str) -> PyResult> { if let Ok(text) = value.extract::() { - return decode_hex(&text, label); + return decode_hex_bytes(&text).map_err(parser_error); } if let Ok(bytes) = value.extract::>() { if bytes.is_empty() { - return Err(PyValueError::new_err(format!("{label} must not be empty"))); + return Err(parser_error(OutputError::EmptyInput)); } return Ok(bytes); } @@ -57,33 +47,12 @@ fn extract_key(key: Option<&Bound<'_, PyAny>>) -> PyResult> { let bytes = extract_bytes(value, "key")?; let length = bytes.len(); - let key = bytes.try_into().map_err(|_| { - PyValueError::new_err(format!( - "key must contain exactly 16 bytes, received {length}" - )) - })?; - - Ok(Some(key)) -} - -fn normalized_data(value: &Bound<'_, PyAny>) -> PyResult { - Ok(hex::encode_upper(extract_bytes(value, "data")?)) -} - -fn normalize_format(format: &str) -> PyResult<&str> { - let format = match format { - "yml" => "yaml", - value => value, - }; - - if FORMATS.contains(&format) { - Ok(format) - } else { - Err(PyValueError::new_err(format!( - "unsupported format {format:?}; expected one of: {}", - FORMATS.join(", ") - ))) - } + bytes.try_into().map(Some).map_err(|_| { + binding_error( + "option.invalid", + format!("key must contain exactly 16 bytes, received {length}"), + ) + }) } fn json_to_python(py: Python<'_>, json: &str) -> PyResult> { @@ -92,50 +61,47 @@ fn json_to_python(py: Python<'_>, json: &str) -> PyResult> { .map(Bound::unbind) } -fn parse_frame_json(data: &str, key: Option<&[u8; 16]>) -> PyResult { - let json = serialize_mbus_data(data, "json", key); - let value: serde_json::Value = serde_json::from_str(&json) - .map_err(|error| PyValueError::new_err(format!("parser returned invalid JSON: {error}")))?; - - if value.as_object().is_some_and(serde_json::Map::is_empty) { - return Err(PyValueError::new_err( - "data is not a valid wired or wireless M-Bus frame", - )); - } - - Ok(json) -} - fn records_json(data: &[u8]) -> PyResult { let records = DataRecords::from(data) .collect::, _>>() .map_err(|error| { - PyValueError::new_err(format!( - "failed to parse application-layer records: {error}" - )) + binding_error( + "application.records_invalid", + format!("failed to parse application-layer records: {error}"), + ) })?; serde_json::to_string(&records).map_err(|error| { - PyValueError::new_err(format!( - "failed to serialize application-layer records: {error}" - )) + binding_error( + "render.serialization", + format!("failed to serialize application-layer records: {error}"), + ) }) } -/// Parse a complete wired or wireless M-Bus frame into native Python objects. +/// Parse a complete wired or wireless M-Bus frame into the canonical schema. /// -/// ``data`` may be a hexadecimal string or a bytes-like object. Pass a 16-byte -/// AES key as bytes or hexadecimal text to decrypt supported encrypted frames. +/// ``data`` may be strict hexadecimal text or a bytes-like object. Pass a +/// 16-byte AES key as bytes or hexadecimal text for supported encrypted frames. #[pyfunction] -#[pyo3(signature = (data, *, key=None))] +#[pyo3(signature = (data, *, key=None, include_enrichment=true))] fn parse( py: Python<'_>, data: &Bound<'_, PyAny>, key: Option<&Bound<'_, PyAny>>, + include_enrichment: bool, ) -> PyResult> { - let data = normalized_data(data)?; - let key = extract_key(key)?; - let json = parse_frame_json(&data, key.as_ref())?; + let data = extract_bytes(data, "data")?; + let decoded = decode_bytes( + &data, + &DecodeOptions { + key: extract_key(key)?, + include_enrichment, + }, + ) + .map_err(parser_error)?; + let json = serde_json::to_string(&decoded) + .map_err(|error| binding_error("render.serialization", error))?; json_to_python(py, &json) } @@ -146,59 +112,77 @@ fn parse_records(py: Python<'_>, data: &Bound<'_, PyAny>) -> PyResult> json_to_python(py, &records_json(&data)?) } -/// Render a complete M-Bus frame in one of the parser's text formats. +/// Render a complete M-Bus frame in one of the canonical text formats. #[pyfunction] -#[pyo3(signature = (data, format="json", *, key=None))] +#[pyo3(signature = (data, format="json", *, key=None, width=None, include_enrichment=true))] fn render( data: &Bound<'_, PyAny>, format: &str, key: Option<&Bound<'_, PyAny>>, + width: Option, + include_enrichment: bool, ) -> PyResult { - let data = normalized_data(data)?; - let format = normalize_format(format)?; - let key = extract_key(key)?; - let json = parse_frame_json(&data, key.as_ref())?; - if format == "json" { - Ok(json) - } else { - Ok(serialize_mbus_data(&data, format, key.as_ref())) - } + let data = extract_bytes(data, "data")?; + let format = OutputFormat::from_str(format).map_err(parser_error)?; + render_bytes( + &data, + format, + &RenderOptions { + decode: DecodeOptions { + key: extract_key(key)?, + include_enrichment, + }, + table_width: width, + }, + ) + .map_err(parser_error) } /// Legacy JSON-string API. Prefer :func:`parse_records` for native objects. #[pyfunction] fn parse_application_layer(data_record: &str) -> PyResult { - let bytes = decode_hex(data_record, "data")?; + let bytes = decode_hex_bytes(data_record).map_err(parser_error)?; records_json(&bytes) } -/// Legacy rendering API. Prefer :func:`parse` or :func:`render`. +/// Compatibility rendering API. Prefer :func:`parse` or :func:`render`. #[pyfunction] #[pyo3(signature = (data, format, key=None))] fn m_bus_parse(data: &str, format: &str, key: Option<&str>) -> PyResult { - let data = decode_hex(data, "data")?; - let data = hex::encode_upper(data); - let format = normalize_format(format)?; let key = key - .map(|value| decode_hex(value, "key")) - .transpose()? + .map(decode_hex_bytes) + .transpose() + .map_err(parser_error)? .map(|bytes| { let length = bytes.len(); bytes.try_into().map_err(|_| { - PyValueError::new_err(format!( - "key must contain exactly 16 bytes, received {length}" - )) + binding_error( + "option.invalid", + format!("key must contain exactly 16 bytes, received {length}"), + ) }) }) .transpose()?; - - Ok(serialize_mbus_data(&data, format, key.as_ref())) + let format = OutputFormat::from_str(format).map_err(parser_error)?; + render_hex( + data, + format, + &RenderOptions { + decode: DecodeOptions { + key, + include_enrichment: true, + }, + ..RenderOptions::default() + }, + ) + .map_err(parser_error) } /// Fast Python bindings for parsing wired and wireless M-Bus frames. #[pymodule] fn pymbusparser(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add("__version__", env!("CARGO_PKG_VERSION"))?; + m.add("MbusParserError", m.py().get_type::())?; m.add_function(wrap_pyfunction!(parse, m)?)?; m.add_function(wrap_pyfunction!(parse_records, m)?)?; m.add_function(wrap_pyfunction!(render, m)?)?; @@ -207,6 +191,7 @@ fn pymbusparser(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add( "__all__", vec![ + "MbusParserError", "parse", "parse_records", "render", @@ -223,20 +208,21 @@ mod tests { use super::*; #[test] - fn decodes_readable_hex() { - let decoded = decode_hex("0x68: 3D-3d,68", "data").unwrap(); - assert_eq!(decoded, [0x68, 0x3D, 0x3D, 0x68]); + fn decodes_supported_readable_hex() { + let decoded = decode_hex_bytes("0x68: 3d-0X16").unwrap(); + assert_eq!(decoded, [0x68, 0x3D, 0x16]); } #[test] - fn rejects_invalid_hex() { - let error = decode_hex("123", "data").unwrap_err(); - assert!(error.to_string().contains("invalid hexadecimal data")); + fn rejects_ambiguous_hex() { + assert!(decode_hex_bytes("68,3D").is_err()); + assert!(decode_hex_bytes("123").is_err()); } #[test] fn validates_output_formats() { - assert_eq!(normalize_format("yml").unwrap(), "yaml"); - assert!(normalize_format("xml").is_err()); + assert_eq!(OutputFormat::from_str("yml").unwrap(), OutputFormat::Yaml); + assert_eq!(OutputFormat::from_str("xml").unwrap(), OutputFormat::Xml); + assert!(OutputFormat::from_str("not-a-format").is_err()); } } diff --git a/python/tests/test_bindings.py b/python/tests/test_bindings.py index d55f981..48c4093 100644 --- a/python/tests/test_bindings.py +++ b/python/tests/test_bindings.py @@ -27,6 +27,8 @@ def test_parse_returns_native_objects(self): frame_bytes = bytes.fromhex(WIRED_FRAME.replace(" ", "")) self.assertIsInstance(parsed, dict) + self.assertEqual(parsed["schema_version"], 1) + self.assertEqual(parsed["protocol"], "wired") self.assertIn("frame", parsed) self.assertEqual(parsed, pymbusparser.parse(frame_bytes)) self.assertEqual(parsed, pymbusparser.parse(bytearray(frame_bytes))) @@ -36,6 +38,7 @@ def test_public_api_is_explicit(self): self.assertEqual( pymbusparser.__all__, [ + "MbusParserError", "parse", "parse_records", "render", @@ -66,17 +69,26 @@ def test_render_and_legacy_api_return_strings(self): ) def test_invalid_inputs_raise_python_exceptions(self): - with self.assertRaisesRegex(ValueError, "valid wired or wireless"): + with self.assertRaisesRegex(pymbusparser.MbusParserError, r"\[frame.invalid\]"): pymbusparser.parse("0102") - with self.assertRaisesRegex(ValueError, "valid wired or wireless"): + with self.assertRaisesRegex(pymbusparser.MbusParserError, r"\[frame.invalid\]"): pymbusparser.render("0102", "table") - with self.assertRaisesRegex(ValueError, "exactly 16 bytes"): + with self.assertRaisesRegex(pymbusparser.MbusParserError, r"\[option.invalid\]"): pymbusparser.parse(WIRED_FRAME, key="1234") - with self.assertRaisesRegex(ValueError, "unsupported format"): + with self.assertRaisesRegex(pymbusparser.MbusParserError, r"\[format.unsupported\]"): pymbusparser.render(WIRED_FRAME, "not-a-format") + with self.assertRaisesRegex(pymbusparser.MbusParserError, r"\[input.invalid_hex\]"): + pymbusparser.parse("68,3D") with self.assertRaises(TypeError): pymbusparser.parse(object()) + def test_render_width_and_enrichment_options(self): + table = pymbusparser.render(WIRED_FRAME, "table", width=44) + self.assertTrue(all(len(line) <= 44 for line in table.splitlines())) + + parsed = pymbusparser.parse(WIRED_FRAME, include_enrichment=False) + self.assertNotIn("enrichment", parsed) + def test_decryption_is_compiled_into_the_wheel(self): rendered = pymbusparser.render( ENCRYPTED_FRAME, "hexview", key=DECRYPTION_KEY diff --git a/src/lib.rs b/src/lib.rs index 385e3ba..67b5a5a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -53,6 +53,8 @@ pub mod annotate; pub mod manufacturers; pub mod mbus_data; #[cfg(feature = "std")] +pub mod output; +#[cfg(feature = "std")] mod rscada_xml; pub use m_bus_application_layer as user_data; @@ -65,6 +67,11 @@ pub use wireless_mbus_link_layer::{ManufacturerId, WirelessFrame}; #[cfg(feature = "std")] pub use mbus_data::serialize_mbus_data; +#[cfg(feature = "std")] +pub use output::{ + decode_bytes, decode_hex, decode_hex_bytes, render_bytes, render_hex, DecodeOptions, + DecodedOutput, OutputError, OutputFormat, RenderOptions, +}; #[derive(Debug, Clone, Copy, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Serialize))] diff --git a/src/mbus_data.rs b/src/mbus_data.rs index 3cf034f..2976bda 100644 --- a/src/mbus_data.rs +++ b/src/mbus_data.rs @@ -1,4 +1,4 @@ -#[cfg(feature = "std")] +#[cfg(all(feature = "std", test))] use prettytable::{format, row, Table}; use wireless_mbus_link_layer::WirelessFrame; @@ -17,6 +17,10 @@ pub struct MbusData<'a, F> { pub frame: F, pub user_data: Option>, pub data_records: Option>, + /// Application-layer parsing is deliberately non-fatal: callers can still + /// inspect a valid link-layer frame and report a partial decode. + #[cfg_attr(feature = "serde", serde(skip_serializing))] + pub application_error: Option, } impl<'a> TryFrom<&'a [u8]> for MbusData<'a, frames::WiredFrame<'a>> { @@ -26,27 +30,31 @@ impl<'a> TryFrom<&'a [u8]> for MbusData<'a, frames::WiredFrame<'a>> { let frame = frames::WiredFrame::try_from(data)?; let mut user_data = None; let mut data_records = None; + let mut application_error = None; match &frame { frames::WiredFrame::LongFrame { data, .. } => { - if let Ok(x) = user_data::UserDataBlock::try_from(*data) { - match &x { - user_data::UserDataBlock::VariableDataStructureWithLongTplHeader { - variable_data_block, - .. - } - | user_data::UserDataBlock::VariableDataStructureWithShortTplHeader { - variable_data_block, - .. - } - | user_data::UserDataBlock::VariableDataStructureWithoutTplHeader { - variable_data_block, - .. - } => { - data_records = Some((*variable_data_block).into()); + match user_data::UserDataBlock::try_from(*data) { + Ok(x) => { + match &x { + user_data::UserDataBlock::VariableDataStructureWithLongTplHeader { + variable_data_block, + .. + } + | user_data::UserDataBlock::VariableDataStructureWithShortTplHeader { + variable_data_block, + .. + } + | user_data::UserDataBlock::VariableDataStructureWithoutTplHeader { + variable_data_block, + .. + } => { + data_records = Some((*variable_data_block).into()); + } + _ => {} } - _ => {} + user_data = Some(x); } - user_data = Some(x); + Err(error) => application_error = Some(error), } } frames::WiredFrame::SingleCharacter { .. } => (), @@ -59,6 +67,7 @@ impl<'a> TryFrom<&'a [u8]> for MbusData<'a, frames::WiredFrame<'a>> { frame, user_data, data_records, + application_error, }) } } @@ -70,38 +79,43 @@ impl<'a> TryFrom<&'a [u8]> for MbusData<'a, WirelessFrame<'a>> { let frame = wireless_mbus_link_layer::WirelessFrame::try_from(data)?; let mut user_data = None; let mut data_records = None; + let mut application_error = None; // Extract application layer data from wireless frame let wireless_mbus_link_layer::WirelessFrame { data, .. } = &frame; - if let Ok(user_data_block) = user_data::UserDataBlock::try_from(*data) { - match &user_data_block { - user_data::UserDataBlock::VariableDataStructureWithLongTplHeader { - variable_data_block, - .. - } => { - data_records = Some((*variable_data_block).into()); - } - user_data::UserDataBlock::VariableDataStructureWithShortTplHeader { - variable_data_block, - .. - } => { - data_records = Some((*variable_data_block).into()); - } - user_data::UserDataBlock::VariableDataStructureWithoutTplHeader { - variable_data_block, - .. - } => { - data_records = Some((*variable_data_block).into()); + match user_data::UserDataBlock::try_from(*data) { + Ok(user_data_block) => { + match &user_data_block { + user_data::UserDataBlock::VariableDataStructureWithLongTplHeader { + variable_data_block, + .. + } => { + data_records = Some((*variable_data_block).into()); + } + user_data::UserDataBlock::VariableDataStructureWithShortTplHeader { + variable_data_block, + .. + } => { + data_records = Some((*variable_data_block).into()); + } + user_data::UserDataBlock::VariableDataStructureWithoutTplHeader { + variable_data_block, + .. + } => { + data_records = Some((*variable_data_block).into()); + } + _ => {} } - _ => {} + user_data = Some(user_data_block); } - user_data = Some(user_data_block); + Err(error) => application_error = Some(error), } Ok(MbusData { frame, user_data, data_records, + application_error, }) } } @@ -126,15 +140,26 @@ fn clean_and_convert(input: &str) -> Vec { #[must_use] pub fn serialize_mbus_data(data: &str, format: &str, key: Option<&[u8; 16]>) -> String { match format { - "json" => parse_to_json(data, key), - "yaml" => parse_to_yaml(data, key), - "csv" => parse_to_csv(data, key), - "xml" => parse_to_xml(data), - "mermaid" => parse_to_mermaid(data, key), - "annotated" => parse_to_annotated(data), - "hexview" => parse_to_hexview(data, key), - "annotated-text" => parse_to_annotated_text(data), - _ => parse_to_table(data, key), + "json-legacy" => parse_to_json(data, key), + "yaml-legacy" => parse_to_yaml(data, key), + "csv-wide" => parse_to_csv(data, key), + "annotated-legacy" => parse_to_annotated(data), + "hexview-legacy" => parse_to_hexview(data, key), + _ => match format.parse::() { + Ok(output_format) => crate::output::render_hex( + data, + output_format, + &crate::output::RenderOptions { + decode: crate::output::DecodeOptions { + key: key.copied(), + include_enrichment: true, + }, + table_width: Some(100), + }, + ) + .unwrap_or_else(|error| format!("Error [{}]: {}", error.code(), error)), + Err(error) => format!("Error [{}]: {}", error.code(), error), + }, } } @@ -460,7 +485,7 @@ fn summarize_wireless( ) -> FrameSummary { let manufacturer_id = &parsed.frame.manufacturer_id; let mut summary = FrameSummary::new("Wireless"); - summary.function = Some(parsed.frame.function.to_string()); + summary.function = parsed.frame.function.map(|function| function.to_string()); summary.identification_number = Some(manufacturer_id.identification_number.to_string()); summary.manufacturer = Some(manufacturer_summary( manufacturer_id.manufacturer_code.to_string(), @@ -607,7 +632,7 @@ fn parse_to_yaml(input: &str, key: Option<&[u8; 16]>) -> String { } } -#[cfg(feature = "std")] +#[cfg(all(feature = "std", test))] #[must_use] fn parse_to_table(input: &str, key: Option<&[u8; 16]>) -> String { match parse_frame_output(input, key) { @@ -616,7 +641,7 @@ fn parse_to_table(input: &str, key: Option<&[u8; 16]>) -> String { } } -#[cfg(feature = "std")] +#[cfg(all(feature = "std", test))] fn render_table(summary: &FrameSummary, key_provided: bool) -> String { let mut out = String::new(); let title = match summary.frame_type { @@ -1004,7 +1029,7 @@ pub fn parse_to_mermaid(input: &str, _key: Option<&[u8; 16]>) -> String { let wireless_mbus_link_layer::WirelessFrame { function, manufacturer_id, - data: _, + .. } = &parsed_data.frame; let mut out = String::from("flowchart TD\n"); @@ -1139,13 +1164,6 @@ fn mermaid_centered_chains(ids: &[&str], max_per_row: usize, pad_prefix: &str) - (body, styles) } -#[cfg(feature = "std")] -#[must_use] -fn parse_to_xml(input: &str) -> String { - let data = clean_and_convert(input); - crate::rscada_xml::render_from_bytes(&data) -} - #[cfg(feature = "std")] #[must_use] fn parse_to_annotated(input: &str) -> String { @@ -1182,6 +1200,61 @@ fn parse_to_hexview(input: &str, key: Option<&[u8; 16]>) -> String { annotated_segments_to_json(&data) } +#[cfg(feature = "std")] +pub(crate) fn render_annotated_bytes( + data: &[u8], + key: Option<&[u8; 16]>, +) -> Result { + let original_segments = crate::annotate::annotate_frame(data).map_err(|error| { + crate::output::OutputError::Rendering { + code: "annotation.failed", + message: error.to_string(), + } + })?; + + #[cfg(feature = "decryption")] + if let Some(key_bytes) = key { + if let Some(display_data) = decrypted_hexview_data(data, key_bytes) { + let mut display_segments = + crate::annotate::annotate_frame(&display_data).map_err(|error| { + crate::output::OutputError::Rendering { + code: "annotation.failed", + message: error.to_string(), + } + })?; + replace_encrypted_payload_segments(&mut display_segments, &display_data); + return serde_json::to_string_pretty(&serde_json::json!({ + "schema_version": 1, + "bytes": display_data, + "segments": display_segments, + "decrypted": true, + "original": { + "bytes": data, + "segments": original_segments, + } + })) + .map_err(|error| crate::output::OutputError::Serialization { + format: "annotated", + message: error.to_string(), + }); + } + } + + #[cfg(not(feature = "decryption"))] + let _ = key; + + serde_json::to_string_pretty(&serde_json::json!({ + "schema_version": 1, + "bytes": data, + "segments": original_segments, + "decrypted": false, + })) + .map_err(|error| crate::output::OutputError::Serialization { + format: "annotated", + message: error.to_string(), + }) +} + #[cfg(feature = "std")] #[must_use] fn annotated_segments_to_json(data: &[u8]) -> String { @@ -1365,16 +1438,6 @@ fn decrypt_variable_data_with_key( } } -#[cfg(feature = "std")] -#[must_use] -fn parse_to_annotated_text(input: &str) -> String { - let data = clean_and_convert(input); - match crate::annotate::annotate_and_render(&data) { - Ok(text) => text, - Err(e) => format!("Error: {}", e), - } -} - #[cfg(feature = "std")] fn mermaid_escape(s: &str) -> String { s.replace('"', "#quot;") @@ -1438,7 +1501,7 @@ mod tests { "Version", "Device Type" ])); - assert!(row.starts_with("Wireless,SndNk,,12345678,ELS,Elster Group,42,No Error(s),")); + assert!(row.starts_with("Wireless,SndNr,,12345678,ELS,Elster Group,42,No Error(s),")); assert!(row.contains("AES-CBC-128; IV ≠ 0")); assert!(row.contains(",51,Gas Meter")); } @@ -1827,7 +1890,7 @@ mod tests { #[test] fn test_annotated_output() { let input = "68 4D 4D 68 08 01 72 01 00 00 00 96 15 01 00 18 00 00 00 0C 78 56 00 00 00 01 FD 1B 00 02 FC 03 48 52 25 74 44 0D 22 FC 03 48 52 25 74 F1 0C 12 FC 03 48 52 25 74 63 11 02 65 B4 09 22 65 86 09 12 65 B7 09 01 72 00 72 65 00 00 B2 01 65 00 00 1F B3 16"; - let output = super::serialize_mbus_data(input, "annotated", None); + let output = super::serialize_mbus_data(input, "annotated-legacy", None); // Should be valid JSON let parsed: serde_json::Value = serde_json::from_str(&output).unwrap_or_else(|e| { @@ -1863,7 +1926,7 @@ mod tests { #[test] fn test_hexview_output_for_ci_78_frame_is_annotated_json() { let input = "1444AE0C7856341201078C2027780B134365877AC5"; - let output = super::serialize_mbus_data(input, "hexview", None); + let output = super::serialize_mbus_data(input, "hexview-legacy", None); let parsed: serde_json::Value = serde_json::from_str(&output).unwrap_or_else(|e| { panic!( diff --git a/src/output.rs b/src/output.rs new file mode 100644 index 0000000..30f6531 --- /dev/null +++ b/src/output.rs @@ -0,0 +1,2496 @@ +//! Typed, harmonized output contract for `std` consumers. +//! +//! The low-level parsers remain allocation-free and `no_std`; this module owns +//! the presentation model used by the CLI, Python, WebAssembly, and text +//! renderers. + +use core::str::FromStr; +use std::fmt; + +use m_bus_core::SecurityMode; +use serde::Serialize; +use unicode_width::{UnicodeWidthChar, UnicodeWidthStr}; +use wired_mbus_link_layer as wired; +use wireless_mbus_link_layer as wireless; + +use crate::mbus_data::MbusData; +use crate::user_data; +use crate::user_data::data_information::{DataFieldCoding, DataType, Month, SingleEveryOrInvalid}; +use crate::user_data::value_information::{Unit, UnitName}; + +const SCHEMA_VERSION: u8 = 1; +const DEFAULT_TABLE_WIDTH: usize = 100; +const MINIMUM_TABLE_WIDTH: usize = 32; + +/// Canonical output formats supported by the typed rendering API. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[non_exhaustive] +pub enum OutputFormat { + Table, + Json, + Yaml, + Csv, + Mermaid, + Xml, + Annotated, + AnnotatedText, +} + +impl OutputFormat { + #[must_use] + pub const fn as_str(self) -> &'static str { + match self { + Self::Table => "table", + Self::Json => "json", + Self::Yaml => "yaml", + Self::Csv => "csv", + Self::Mermaid => "mermaid", + Self::Xml => "xml", + Self::Annotated => "annotated", + Self::AnnotatedText => "annotated-text", + } + } +} + +impl fmt::Display for OutputFormat { + fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + formatter.write_str(self.as_str()) + } +} + +impl FromStr for OutputFormat { + type Err = OutputError; + + fn from_str(value: &str) -> Result { + match value.trim().to_ascii_lowercase().as_str() { + "table" | "table_format" => Ok(Self::Table), + "json" => Ok(Self::Json), + "yaml" | "yml" => Ok(Self::Yaml), + "csv" => Ok(Self::Csv), + "mermaid" => Ok(Self::Mermaid), + "xml" => Ok(Self::Xml), + "annotated" | "hexview" => Ok(Self::Annotated), + "annotated-text" => Ok(Self::AnnotatedText), + _ => Err(OutputError::UnsupportedFormat { + format: value.to_string(), + }), + } + } +} + +/// Options controlling protocol decoding. +#[derive(Debug, Clone)] +pub struct DecodeOptions { + pub key: Option<[u8; 16]>, + pub include_enrichment: bool, +} + +impl Default for DecodeOptions { + fn default() -> Self { + Self { + key: None, + include_enrichment: true, + } + } +} + +/// Options controlling decoding and human-oriented rendering. +#[derive(Debug, Clone)] +pub struct RenderOptions { + pub decode: DecodeOptions, + pub table_width: Option, +} + +impl Default for RenderOptions { + fn default() -> Self { + Self { + decode: DecodeOptions::default(), + table_width: Some(DEFAULT_TABLE_WIDTH), + } + } +} + +/// Stable error taxonomy shared by Rust and language bindings. +#[derive(Debug, Clone, PartialEq, Eq)] +#[non_exhaustive] +pub enum OutputError { + EmptyInput, + InvalidHex { + index: usize, + message: String, + }, + InvalidFrame { + wired: String, + wireless: String, + }, + UnsupportedFormat { + format: String, + }, + InvalidOption { + option: &'static str, + message: String, + }, + Decryption { + code: &'static str, + message: String, + }, + Rendering { + code: &'static str, + message: String, + }, + Serialization { + format: &'static str, + message: String, + }, +} + +impl OutputError { + #[must_use] + pub const fn code(&self) -> &'static str { + match self { + Self::EmptyInput => "input.empty", + Self::InvalidHex { .. } => "input.invalid_hex", + Self::InvalidFrame { .. } => "frame.invalid", + Self::UnsupportedFormat { .. } => "format.unsupported", + Self::InvalidOption { .. } => "option.invalid", + Self::Decryption { code, .. } | Self::Rendering { code, .. } => code, + Self::Serialization { .. } => "render.serialization", + } + } + + #[must_use] + pub const fn layer(&self) -> &'static str { + match self { + Self::EmptyInput | Self::InvalidHex { .. } => "input", + Self::InvalidFrame { .. } => "link", + Self::UnsupportedFormat { .. } + | Self::InvalidOption { .. } + | Self::Serialization { .. } => "render", + Self::Decryption { .. } => "security", + Self::Rendering { .. } => "application", + } + } + + #[must_use] + pub const fn byte_offset(&self) -> Option { + match self { + Self::InvalidHex { index, .. } => Some(*index), + _ => None, + } + } +} + +impl fmt::Display for OutputError { + fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::EmptyInput => formatter.write_str("input must not be empty"), + Self::InvalidHex { index, message } => { + write!(formatter, "invalid hexadecimal input at character {index}: {message}") + } + Self::InvalidFrame { wired, wireless } => write!( + formatter, + "data is not a valid wired or wireless M-Bus frame (wired: {wired}; wireless: {wireless})" + ), + Self::UnsupportedFormat { format } => write!( + formatter, + "unsupported output format {format:?}; expected table, json, yaml, csv, mermaid, xml, annotated, or annotated-text" + ), + Self::InvalidOption { option, message } => { + write!(formatter, "invalid {option}: {message}") + } + Self::Decryption { message, .. } + | Self::Rendering { message, .. } + | Self::Serialization { message, .. } => formatter.write_str(message), + } + } +} + +impl std::error::Error for OutputError {} + +#[derive(Debug, Clone, Serialize)] +pub struct DecodedOutput { + pub schema_version: u8, + pub decode_state: String, + pub protocol: String, + pub frame: FrameOutput, + pub meter: MeterOutput, + pub transport: TransportOutput, + pub security: SecurityOutput, + pub records: Vec, + pub raw: RawOutput, + pub diagnostics: Vec, + #[serde(skip_serializing_if = "Option::is_none")] + pub enrichment: Option, +} + +#[derive(Debug, Clone, Serialize)] +pub struct FrameOutput { + pub kind: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub function: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub address: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub control_field: Option, +} + +#[derive(Debug, Clone, Serialize, PartialEq, Eq)] +pub struct MeterIdentity { + pub source: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub manufacturer_code: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub version: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub device_type: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub device_type_code: Option, +} + +#[derive(Debug, Clone, Serialize)] +pub struct MeterOutput { + #[serde(skip_serializing_if = "Option::is_none")] + pub identity: Option, + #[serde(skip_serializing_if = "Vec::is_empty")] + pub alternate_identities: Vec, +} + +#[derive(Debug, Clone, Serialize)] +pub struct SourcedU8 { + pub source: String, + pub value: u8, +} + +#[derive(Debug, Clone, Serialize)] +pub struct SourcedStatus { + pub source: String, + pub raw: String, + pub display: String, +} + +#[derive(Debug, Clone, Serialize)] +pub struct ConfigurationOutput { + pub source: String, + pub raw: String, +} + +#[derive(Debug, Clone, Serialize)] +pub struct EllOutput { + pub communication_control: String, + pub access_number: u8, + #[serde(skip_serializing_if = "Option::is_none")] + pub receiver_manufacturer: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub receiver_address: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub session_number: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub payload_crc: Option, +} + +#[derive(Debug, Clone, Serialize)] +pub struct TransportOutput { + #[serde(skip_serializing_if = "Option::is_none")] + pub header_kind: Option, + #[serde(skip_serializing_if = "Vec::is_empty")] + pub access_numbers: Vec, + #[serde(skip_serializing_if = "Vec::is_empty")] + pub statuses: Vec, + #[serde(skip_serializing_if = "Option::is_none")] + pub configuration: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub ell: Option, +} + +#[derive(Debug, Clone, Serialize)] +pub struct SecurityOutput { + pub payload_protection: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub mode: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub mode_code: Option, + pub decryption_state: String, + pub key_supplied: bool, + #[serde(skip_serializing_if = "Option::is_none")] + pub encrypted_payload_hex: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub decrypted_payload_hex: Option, +} + +#[derive(Debug, Clone, Serialize)] +pub struct RecordOutput { + pub index: usize, + pub function: String, + pub storage_number: u64, + pub tariff: u64, + pub subunit: u64, + pub quantities: Vec, + pub value: ValueOutput, + #[serde(skip_serializing_if = "Option::is_none")] + pub unit: Option, + pub data_coding: String, + pub header_hex: String, + pub data_hex: String, + pub record_hex: String, +} + +#[derive(Debug, Clone, Serialize)] +pub struct ValueOutput { + pub kind: String, + pub display: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub decimal: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub significand: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub number: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub scale_power10: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub offset_power10: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub precision: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub special: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub components: Option, + pub raw_hex: String, +} + +#[derive(Debug, Clone, Serialize)] +pub struct UnitComponent { + pub name: String, + pub exponent: i32, +} + +#[derive(Debug, Clone, Serialize)] +pub struct UnitOutput { + pub display: String, + pub components: Vec, + #[serde(skip_serializing_if = "Option::is_none")] + pub ucum: Option, +} + +#[derive(Debug, Clone, Serialize)] +pub struct RawOutput { + #[serde(skip_serializing_if = "Option::is_none")] + pub input: Option, + pub original_frame_hex: String, + pub normalized_frame_hex: String, + pub byte_length: usize, + pub format_a_crc_stripped: bool, + #[serde(skip_serializing_if = "Option::is_none")] + pub payload_hex: Option, +} + +#[derive(Debug, Clone, Serialize)] +pub struct Diagnostic { + pub severity: String, + pub code: String, + pub layer: String, + pub message: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub offset_start: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub offset_end: Option, +} + +#[derive(Debug, Clone, Serialize)] +pub struct EnrichmentOutput { + pub source: String, + pub manufacturer_code: String, + pub manufacturer_name: String, + pub manufacturer_website: String, + pub manufacturer_description: String, +} + +#[derive(Clone)] +struct SecurityContext { + encrypted: bool, + mode: Option, + ell_encrypted: bool, + decrypted: bool, + key_supplied: bool, + decrypted_payload: Option>, +} + +/// Decode a human-readable hexadecimal frame. +pub fn decode_hex(input: &str, options: &DecodeOptions) -> Result { + let bytes = decode_hex_bytes(input)?; + let mut decoded = decode_bytes(&bytes, options)?; + decoded.raw.input = Some(input.to_string()); + Ok(decoded) +} + +/// Decode an already materialized frame. +pub fn decode_bytes(data: &[u8], options: &DecodeOptions) -> Result { + if data.is_empty() { + return Err(OutputError::EmptyInput); + } + + let wired_error = match MbusData::::try_from(data) { + Ok(mut parsed) => { + let mut decrypted_buffer = [0u8; 512]; + let security = prepare_security( + parsed.user_data.as_ref(), + None, + options.key.as_ref(), + &mut decrypted_buffer, + )?; + if let Some(decrypted) = security.decrypted_payload.as_deref() { + parsed.data_records = decrypted_records(parsed.user_data.as_ref(), decrypted); + } else if security.encrypted { + parsed.data_records = None; + } + return Ok(build_wired_output( + data, + &parsed, + security.clone(), + options.include_enrichment, + )); + } + Err(error) => error.to_string(), + }; + + let mut crc_buffer = [0u8; 512]; + let normalized = wireless::strip_format_a_crcs(data, &mut crc_buffer).unwrap_or(data); + let stripped = normalized.len() != data.len(); + match MbusData::::try_from(normalized) { + Ok(mut parsed) => { + let mut decrypted_buffer = [0u8; 512]; + let security = prepare_security( + parsed.user_data.as_ref(), + Some(&parsed.frame.manufacturer_id), + options.key.as_ref(), + &mut decrypted_buffer, + )?; + if let Some(decrypted) = security.decrypted_payload.as_deref() { + parsed.data_records = decrypted_records(parsed.user_data.as_ref(), decrypted); + } else if security.encrypted { + parsed.data_records = None; + } + Ok(build_wireless_output( + data, + normalized, + stripped, + &parsed, + security.clone(), + options.include_enrichment, + )) + } + Err(error) => Err(OutputError::InvalidFrame { + wired: wired_error, + wireless: format!("{error:?}"), + }), + } +} + +/// Render a human-readable hexadecimal frame. +pub fn render_hex( + input: &str, + format: OutputFormat, + options: &RenderOptions, +) -> Result { + let bytes = decode_hex_bytes(input)?; + render_bytes(&bytes, format, options) +} + +/// Render an already materialized frame. +pub fn render_bytes( + data: &[u8], + format: OutputFormat, + options: &RenderOptions, +) -> Result { + match format { + OutputFormat::Xml => { + crate::rscada_xml::render_from_bytes(data, options.decode.key.as_ref()).map_err( + |message| OutputError::Rendering { + code: "xml.unsupported", + message, + }, + ) + } + OutputFormat::Annotated => { + crate::mbus_data::render_annotated_bytes(data, options.decode.key.as_ref()) + } + OutputFormat::AnnotatedText => { + crate::annotate::annotate_and_render(data).map_err(|error| OutputError::Rendering { + code: "annotation.failed", + message: error.to_string(), + }) + } + _ => { + let decoded = decode_bytes(data, &options.decode)?; + match format { + OutputFormat::Json => serde_json::to_string_pretty(&decoded).map_err(|error| { + OutputError::Serialization { + format: "json", + message: error.to_string(), + } + }), + OutputFormat::Yaml => { + serde_yaml::to_string(&decoded).map_err(|error| OutputError::Serialization { + format: "yaml", + message: error.to_string(), + }) + } + OutputFormat::Csv => render_csv(&decoded), + OutputFormat::Table => { + render_table(&decoded, options.table_width.unwrap_or(DEFAULT_TABLE_WIDTH)) + } + OutputFormat::Mermaid => Ok(render_mermaid(&decoded)), + _ => unreachable!("specialized formats handled above"), + } + } + } +} + +/// Strictly parse supported hexadecimal input spellings. +pub fn decode_hex_bytes(input: &str) -> Result, OutputError> { + let trimmed = input.trim(); + if trimmed.is_empty() { + return Err(OutputError::EmptyInput); + } + + if trimmed + .chars() + .all(|character| character.is_ascii_hexdigit()) + { + if !trimmed.len().is_multiple_of(2) { + return Err(OutputError::InvalidHex { + index: trimmed.len() - 1, + message: "compact hexadecimal input must contain an even number of digits" + .to_string(), + }); + } + return (0..trimmed.len()) + .step_by(2) + .map(|index| { + u8::from_str_radix(&trimmed[index..index + 2], 16).map_err(|error| { + OutputError::InvalidHex { + index, + message: error.to_string(), + } + }) + }) + .collect(); + } + + let mut bytes = Vec::new(); + let mut token = String::new(); + let mut token_start = 0usize; + let mut saw_separator = true; + for (index, character) in trimmed.char_indices() { + if character.is_ascii_whitespace() || matches!(character, ':' | '-') { + if !token.is_empty() { + push_hex_token(&mut bytes, &token, token_start)?; + token.clear(); + } + saw_separator = true; + continue; + } + if saw_separator { + token_start = index; + saw_separator = false; + } + token.push(character); + } + if !token.is_empty() { + push_hex_token(&mut bytes, &token, token_start)?; + } + if bytes.is_empty() { + return Err(OutputError::EmptyInput); + } + Ok(bytes) +} + +fn push_hex_token(output: &mut Vec, token: &str, index: usize) -> Result<(), OutputError> { + let digits = token + .strip_prefix("0x") + .or_else(|| token.strip_prefix("0X")) + .unwrap_or(token); + if digits.len() != 2 + || !digits + .chars() + .all(|character| character.is_ascii_hexdigit()) + { + return Err(OutputError::InvalidHex { + index, + message: format!("expected a complete byte token, found {token:?}"), + }); + } + let byte = u8::from_str_radix(digits, 16).map_err(|error| OutputError::InvalidHex { + index, + message: error.to_string(), + })?; + output.push(byte); + Ok(()) +} + +fn prepare_security( + user_data: Option<&user_data::UserDataBlock<'_>>, + wireless_id: Option<&wireless::ManufacturerId>, + key: Option<&[u8; 16]>, + output: &mut [u8], +) -> Result { + let (encrypted, mode, ell_encrypted) = security_fields(user_data); + if !encrypted { + return Ok(SecurityContext { + encrypted: false, + mode, + ell_encrypted, + decrypted: false, + key_supplied: key.is_some(), + decrypted_payload: None, + }); + } + let Some(key) = key else { + return Ok(SecurityContext { + encrypted, + mode, + ell_encrypted, + decrypted: false, + key_supplied: false, + decrypted_payload: None, + }); + }; + if ell_encrypted && mode.is_none() { + return Err(OutputError::Decryption { + code: "security.unsupported_mode", + message: "decryption was requested for an ELL-protected payload, which is not currently supported" + .to_string(), + }); + } + + #[cfg(feature = "decryption")] + { + let block = user_data.ok_or_else(|| OutputError::Decryption { + code: "security.unknown_state", + message: "encrypted payload does not expose an application data block".to_string(), + })?; + let len = decrypt_user_data(block, wireless_id, key, output).map_err(|error| { + let code = match error { + crate::decryption::DecryptionError::UnsupportedMode(_) => { + "security.unsupported_mode" + } + crate::decryption::DecryptionError::InvalidKeyLength => "security.invalid_key", + _ => "security.decryption_failed", + }; + OutputError::Decryption { + code, + message: error.to_string(), + } + })?; + let decrypted = output + .get(..len) + .ok_or_else(|| OutputError::Decryption { + code: "security.decryption_failed", + message: "decryption returned an invalid payload length".to_string(), + })? + .to_vec(); + Ok(SecurityContext { + encrypted, + mode, + ell_encrypted, + decrypted: true, + key_supplied: true, + decrypted_payload: Some(decrypted), + }) + } + + #[cfg(not(feature = "decryption"))] + { + let _ = (user_data, wireless_id, key, output); + Err(OutputError::Decryption { + code: "security.feature_unavailable", + message: "this build does not include decryption support".to_string(), + }) + } +} + +fn security_fields( + user_data: Option<&user_data::UserDataBlock<'_>>, +) -> (bool, Option, bool) { + use user_data::UserDataBlock; + match user_data { + Some(UserDataBlock::VariableDataStructureWithLongTplHeader { + long_tpl_header, .. + }) => { + let mode = long_tpl_header + .short_tpl_header + .configuration_field + .security_mode(); + ( + !matches!(mode, SecurityMode::NoEncryption), + Some(mode), + false, + ) + } + Some(UserDataBlock::VariableDataStructureWithShortTplHeader { + extended_link_layer, + short_tpl_header, + .. + }) => { + let ell_encrypted = extended_link_layer + .as_ref() + .is_some_and(|ell| ell.encryption.is_some()); + let mode = short_tpl_header.configuration_field.security_mode(); + if ell_encrypted && matches!(mode, SecurityMode::NoEncryption) { + (true, None, true) + } else { + ( + !matches!(mode, SecurityMode::NoEncryption), + Some(mode), + ell_encrypted, + ) + } + } + _ => (false, None, false), + } +} + +#[cfg(feature = "decryption")] +pub(crate) fn decrypt_user_data( + user_data: &user_data::UserDataBlock<'_>, + wireless_id: Option<&wireless::ManufacturerId>, + key: &[u8; 16], + output: &mut [u8], +) -> Result { + use user_data::UserDataBlock; + let mut provider = crate::decryption::StaticKeyProvider::<1>::new(); + match user_data { + UserDataBlock::VariableDataStructureWithLongTplHeader { + long_tpl_header, .. + } => { + let manufacturer = long_tpl_header + .manufacturer + .map_err(|_| crate::decryption::DecryptionError::UnknownEncryptionState)?; + provider.add_key( + manufacturer.to_id(), + long_tpl_header.identification_number.number, + *key, + )?; + user_data.decrypt_variable_data(&provider, output) + } + UserDataBlock::VariableDataStructureWithShortTplHeader { + short_tpl_header, .. + } => { + if matches!( + short_tpl_header.configuration_field.security_mode(), + SecurityMode::NoEncryption + ) { + return Err(crate::decryption::DecryptionError::UnsupportedMode( + short_tpl_header.configuration_field.security_mode(), + )); + } + let id = + wireless_id.ok_or(crate::decryption::DecryptionError::UnknownEncryptionState)?; + provider.add_key( + id.manufacturer_code.to_id(), + id.identification_number.number, + *key, + )?; + user_data.decrypt_variable_data_with_context( + &provider, + id.manufacturer_code, + id.identification_number.number, + id.version, + id.device_type, + output, + ) + } + _ => Err(crate::decryption::DecryptionError::UnknownEncryptionState), + } +} + +fn decrypted_records<'a>( + block: Option<&'a user_data::UserDataBlock<'a>>, + decrypted: &'a [u8], +) -> Option> { + match block { + Some(user_data::UserDataBlock::VariableDataStructureWithLongTplHeader { + long_tpl_header, + .. + }) => Some(user_data::DataRecords::new( + decrypted, + Some(long_tpl_header), + )), + Some( + user_data::UserDataBlock::VariableDataStructureWithShortTplHeader { .. } + | user_data::UserDataBlock::VariableDataStructureWithoutTplHeader { .. }, + ) => Some(user_data::DataRecords::new(decrypted, None)), + _ => None, + } +} + +fn build_wired_output( + original: &[u8], + parsed: &MbusData>, + security_context: SecurityContext, + include_enrichment: bool, +) -> DecodedOutput { + let (kind, function, address, payload) = match &parsed.frame { + wired::WiredFrame::LongFrame { + function, + address, + data, + } => ( + "long", + Some(function.to_string()), + Some(address.to_string()), + Some(*data), + ), + wired::WiredFrame::ControlFrame { + function, + address, + data, + } => ( + "control", + Some(function.to_string()), + Some(address.to_string()), + Some(*data), + ), + wired::WiredFrame::ShortFrame { function, address } => ( + "short", + Some(function.to_string()), + Some(address.to_string()), + None, + ), + wired::WiredFrame::SingleCharacter { .. } => ("single_character", None, None, None), + _ => ("unknown", None, None, None), + }; + + build_output( + "wired", + FrameOutput { + kind: kind.to_string(), + function, + address, + control_field: None, + }, + original, + original, + false, + payload, + parsed.user_data.as_ref(), + parsed.data_records.as_ref(), + parsed.application_error.as_ref(), + None, + security_context, + include_enrichment, + ) +} + +fn build_wireless_output( + original: &[u8], + normalized: &[u8], + format_a_crc_stripped: bool, + parsed: &MbusData>, + security_context: SecurityContext, + include_enrichment: bool, +) -> DecodedOutput { + build_output( + "wireless", + FrameOutput { + kind: "wireless".to_string(), + function: parsed.frame.function.map(|function| function.to_string()), + address: None, + control_field: Some(format!("{:02X}", parsed.frame.control_field)), + }, + original, + normalized, + format_a_crc_stripped, + Some(parsed.frame.data), + parsed.user_data.as_ref(), + parsed.data_records.as_ref(), + parsed.application_error.as_ref(), + Some(&parsed.frame.manufacturer_id), + security_context, + include_enrichment, + ) +} + +#[allow(clippy::too_many_arguments)] +fn build_output( + protocol: &str, + frame: FrameOutput, + original: &[u8], + normalized: &[u8], + format_a_crc_stripped: bool, + payload: Option<&[u8]>, + user_data: Option<&user_data::UserDataBlock<'_>>, + records: Option<&user_data::DataRecords<'_>>, + application_error: Option<&m_bus_core::ApplicationLayerError>, + wireless_id: Option<&wireless::ManufacturerId>, + security_context: SecurityContext, + include_enrichment: bool, +) -> DecodedOutput { + let mut diagnostics = Vec::new(); + if let Some(error) = application_error { + diagnostics.push(Diagnostic { + severity: "warning".to_string(), + code: "application.partial".to_string(), + layer: "application".to_string(), + message: error.to_string(), + offset_start: None, + offset_end: None, + }); + } + if security_context.encrypted && !security_context.decrypted { + diagnostics.push(Diagnostic { + severity: "warning".to_string(), + code: "security.key_missing".to_string(), + layer: "security".to_string(), + message: "payload is encrypted; header metadata is available but records require a key" + .to_string(), + offset_start: None, + offset_end: None, + }); + } else if security_context.decrypted { + diagnostics.push(Diagnostic { + severity: "info".to_string(), + code: "security.decrypted_unverified".to_string(), + layer: "security".to_string(), + message: "AES-CBC payload was transformed but cannot be authenticated".to_string(), + offset_start: None, + offset_end: None, + }); + } else if security_context.key_supplied { + diagnostics.push(Diagnostic { + severity: "info".to_string(), + code: "security.key_unused".to_string(), + layer: "security".to_string(), + message: "a key was supplied for a cleartext frame and was not used".to_string(), + offset_start: None, + offset_end: None, + }); + } + + let (record_outputs, record_error) = collect_records(records); + if let Some((offset, message)) = record_error.as_ref() { + diagnostics.push(Diagnostic { + severity: "warning".to_string(), + code: "application.record_partial".to_string(), + layer: "application".to_string(), + message: message.clone(), + offset_start: Some(*offset), + offset_end: None, + }); + } + + let (meter, transport) = meter_and_transport(user_data, wireless_id); + let enrichment = if include_enrichment { + meter + .identity + .as_ref() + .and_then(|identity| identity.manufacturer_code.as_deref()) + .and_then(enrichment_for) + } else { + None + }; + + let encrypted_payload_hex = security_context + .encrypted + .then(|| payload.map(hex_string)) + .flatten(); + let decrypted_payload_hex = security_context + .decrypted_payload + .as_deref() + .map(hex_string); + let decryption_state = if !security_context.encrypted { + "not_applicable" + } else if security_context.decrypted { + "decrypted_unverified" + } else { + "key_missing" + }; + let payload_protection = if security_context.encrypted { + "encrypted" + } else if security_context.ell_encrypted { + "unknown" + } else { + "cleartext" + }; + let mode = security_context.mode; + let partial = application_error.is_some() + || record_error.is_some() + || (security_context.encrypted && !security_context.decrypted); + + DecodedOutput { + schema_version: SCHEMA_VERSION, + decode_state: if partial { "partial" } else { "complete" }.to_string(), + protocol: protocol.to_string(), + frame, + meter, + transport, + security: SecurityOutput { + payload_protection: payload_protection.to_string(), + mode: mode.map(|value| value.to_string()), + mode_code: mode.map(|value| value.to_bits()), + decryption_state: decryption_state.to_string(), + key_supplied: security_context.key_supplied, + encrypted_payload_hex, + decrypted_payload_hex, + }, + records: record_outputs, + raw: RawOutput { + input: None, + original_frame_hex: hex_string(original), + normalized_frame_hex: hex_string(normalized), + byte_length: original.len(), + format_a_crc_stripped, + payload_hex: payload.map(hex_string), + }, + diagnostics, + enrichment, + } +} + +fn meter_and_transport( + user_data: Option<&user_data::UserDataBlock<'_>>, + wireless_id: Option<&wireless::ManufacturerId>, +) -> (MeterOutput, TransportOutput) { + use user_data::UserDataBlock; + let link_identity = wireless_id.map(identity_from_wireless); + let mut primary = link_identity.clone(); + let mut alternates = Vec::new(); + let mut transport = TransportOutput { + header_kind: None, + access_numbers: Vec::new(), + statuses: Vec::new(), + configuration: None, + ell: None, + }; + + match user_data { + Some(UserDataBlock::VariableDataStructureWithLongTplHeader { + extended_link_layer, + long_tpl_header, + .. + }) => { + let application_identity = identity_from_long(long_tpl_header); + if let Some(link) = link_identity { + if link != application_identity { + alternates.push(link); + } + } + primary = Some(application_identity); + transport.header_kind = Some("long_tpl".to_string()); + add_short_transport( + &mut transport, + "tpl.long", + &long_tpl_header.short_tpl_header, + ); + transport.ell = extended_link_layer.as_ref().map(ell_output); + } + Some(UserDataBlock::VariableDataStructureWithShortTplHeader { + extended_link_layer, + short_tpl_header, + .. + }) => { + let synthetic = extended_link_layer + .as_ref() + .is_some_and(|ell| ell.encryption.is_some()) + && matches!( + short_tpl_header.configuration_field.security_mode(), + SecurityMode::NoEncryption + ); + transport.header_kind = Some(if synthetic { "ell" } else { "short_tpl" }.to_string()); + if synthetic { + if let Some(ell) = extended_link_layer { + transport.access_numbers.push(SourcedU8 { + source: "ell".to_string(), + value: ell.access_number, + }); + } + } else { + add_short_transport(&mut transport, "tpl.short", short_tpl_header); + } + transport.ell = extended_link_layer.as_ref().map(ell_output); + } + Some(UserDataBlock::VariableDataStructureWithoutTplHeader { + extended_link_layer, + .. + }) => { + transport.header_kind = Some( + if extended_link_layer.is_some() { + "ell" + } else { + "none" + } + .to_string(), + ); + if let Some(ell) = extended_link_layer { + transport.access_numbers.push(SourcedU8 { + source: "ell".to_string(), + value: ell.access_number, + }); + transport.ell = Some(ell_output(ell)); + } + } + Some(UserDataBlock::FixedDataStructure { + identification_number, + access_number, + status, + device_type_and_unit, + .. + }) => { + primary = Some(MeterIdentity { + source: "application.fixed".to_string(), + id: Some(identification_number.to_string()), + manufacturer_code: None, + version: None, + device_type: Some(format!("fixed type/unit 0x{device_type_and_unit:04X}")), + device_type_code: None, + }); + transport.header_kind = Some("fixed".to_string()); + transport.access_numbers.push(SourcedU8 { + source: "application.fixed".to_string(), + value: *access_number, + }); + transport.statuses.push(SourcedStatus { + source: "application.fixed".to_string(), + raw: format!("{:02X}", status.bits()), + display: status.to_string(), + }); + } + Some(UserDataBlock::ResetAtApplicationLevel { .. }) => { + transport.header_kind = Some("application_reset".to_string()); + } + None => {} + Some(_) => {} + } + + ( + MeterOutput { + identity: primary, + alternate_identities: alternates, + }, + transport, + ) +} + +fn add_short_transport( + transport: &mut TransportOutput, + source: &str, + header: &user_data::ShortTplHeader, +) { + transport.access_numbers.push(SourcedU8 { + source: source.to_string(), + value: header.access_number, + }); + transport.statuses.push(SourcedStatus { + source: source.to_string(), + raw: format!("{:02X}", header.status.bits()), + display: header.status.to_string(), + }); + transport.configuration = Some(ConfigurationOutput { + source: source.to_string(), + raw: format!("{:04X}", header.configuration_field.raw()), + }); +} + +fn ell_output(ell: &user_data::extended_link_layer::ExtendedLinkLayer) -> EllOutput { + EllOutput { + communication_control: format!("{:02X}", ell.communication_control), + access_number: ell.access_number, + receiver_manufacturer: ell + .receiver_address + .as_ref() + .map(|address| format!("{:04X}", address.manufacturer)), + receiver_address: ell + .receiver_address + .as_ref() + .map(|address| hex_string(&address.address)), + session_number: ell + .encryption + .as_ref() + .map(|encryption| hex_string(&encryption.session_number)), + payload_crc: ell + .encryption + .as_ref() + .map(|encryption| format!("{:04X}", encryption.payload_crc)), + } +} + +fn identity_from_wireless(id: &wireless::ManufacturerId) -> MeterIdentity { + MeterIdentity { + source: "link.wireless".to_string(), + id: Some(id.identification_number.to_string()), + manufacturer_code: Some(id.manufacturer_code.to_string()), + version: Some(id.version), + device_type: Some(id.device_type.to_string()), + device_type_code: Some(id.device_type.into()), + } +} + +fn identity_from_long(header: &user_data::LongTplHeader) -> MeterIdentity { + MeterIdentity { + source: "tpl.long".to_string(), + id: Some(header.identification_number.to_string()), + manufacturer_code: header.manufacturer.as_ref().ok().map(ToString::to_string), + version: Some(header.version), + device_type: Some(header.device_type.to_string()), + device_type_code: Some(header.device_type.into()), + } +} + +fn enrichment_for(code: &str) -> Option { + crate::manufacturers::lookup_manufacturer(code).map(|info| EnrichmentOutput { + source: "bundled_manufacturer_registry".to_string(), + manufacturer_code: code.to_string(), + manufacturer_name: info.name.to_string(), + manufacturer_website: info.website.to_string(), + manufacturer_description: info.description.to_string(), + }) +} + +fn collect_records( + records: Option<&user_data::DataRecords<'_>>, +) -> (Vec, Option<(usize, String)>) { + let Some(records) = records else { + return (Vec::new(), None); + }; + let mut output = Vec::new(); + let mut offset = 0usize; + for item in records.clone() { + match item { + Ok(record) => { + let size = record.raw_bytes().len(); + output.push(record_output(output.len(), &record)); + offset += size; + } + Err(error) => return (output, Some((offset, error.to_string()))), + } + } + (output, None) +} + +fn record_output(index: usize, record: &user_data::DataRecord<'_>) -> RecordOutput { + let information = record.data_information(); + let value_information = record.value_information(); + let function = information + .map(|value| value.function_field.to_string()) + .unwrap_or_else(|| "manufacturer_specific".to_string()); + let storage_number = information.map_or(0, |value| value.storage_number); + let tariff = information.map_or(0, |value| value.tariff); + let subunit = information.map_or(0, |value| value.device); + let data_coding = information + .map(|value| value.data_field_coding.to_string()) + .unwrap_or_else(|| "manufacturer specific".to_string()); + let quantities = value_information + .map(|value| { + value + .labels + .iter() + .map(|label| format!("{label:?}")) + .collect() + }) + .unwrap_or_default(); + let unit = value_information + .and_then(|value| (!value.units.is_empty()).then(|| unit_output(value.units.as_slice()))); + + RecordOutput { + index, + function, + storage_number, + tariff, + subunit, + quantities, + value: value_output(record), + unit, + data_coding, + header_hex: record.data_record_header_hex(), + data_hex: record.data_hex(), + record_hex: spaced_hex(record.raw_bytes()), + } +} + +fn value_output(record: &user_data::DataRecord<'_>) -> ValueOutput { + let header_size = record.data_record_header.get_size(); + let raw = record.raw_bytes().get(header_size..).unwrap_or_default(); + let raw_hex = spaced_hex(raw); + let information = record.data_information(); + let value_information = record.value_information(); + let scale = value_information.map(|value| value.decimal_scale_exponent); + let offset = record_offset_power10(record); + + match record.value() { + Some(DataType::Number(number)) | Some(DataType::LossyNumber(number)) => { + if information + .is_some_and(|value| value.data_field_coding == DataFieldCoding::Real32Bit) + { + let (number_value, special) = finite_number(*number); + return ValueOutput { + kind: "float".to_string(), + display: special.clone().unwrap_or_else(|| number.to_string()), + decimal: None, + significand: None, + number: number_value, + scale_power10: None, + offset_power10: None, + precision: Some("f32_approximate".to_string()), + special, + components: None, + raw_hex, + }; + } + + let significand = + exact_significand(record, *number).unwrap_or_else(|| format!("{number:.0}")); + let scale_value = scale.unwrap_or(0); + let decimal = scaled_decimal(&significand, scale_value, offset); + let convenience_number = decimal + .parse::() + .ok() + .filter(|value| value.is_finite()); + ValueOutput { + kind: "decimal".to_string(), + display: decimal.clone(), + decimal: Some(decimal), + significand: Some(significand), + number: convenience_number, + scale_power10: Some(scale_value), + offset_power10: offset, + precision: Some("exact".to_string()), + special: None, + components: None, + raw_hex, + } + } + Some(DataType::Text(text)) => { + let display = text.to_string(); + ValueOutput { + kind: "text".to_string(), + display, + decimal: None, + significand: None, + number: None, + scale_power10: None, + offset_power10: None, + precision: None, + special: None, + components: None, + raw_hex, + } + } + Some(DataType::Date(day, month, year)) => { + temporal_value("date", day, month, year, None, None, None, raw_hex) + } + Some(DataType::Time(second, minute, hour)) => temporal_value( + "time", + &SingleEveryOrInvalid::Invalid(), + &SingleEveryOrInvalid::Invalid(), + &SingleEveryOrInvalid::Invalid(), + Some(hour), + Some(minute), + Some(second), + raw_hex, + ), + Some(DataType::DateTime(day, month, year, hour, minute)) => temporal_value( + "datetime", + day, + month, + year, + Some(hour), + Some(minute), + None, + raw_hex, + ), + Some(DataType::DateTimeWithSeconds(day, month, year, hour, minute, second)) => { + temporal_value( + "datetime", + day, + month, + year, + Some(hour), + Some(minute), + Some(second), + raw_hex, + ) + } + Some(DataType::ManufacturerSpecific(data)) => ValueOutput { + kind: "manufacturer_specific".to_string(), + display: hex_string(data), + decimal: None, + significand: None, + number: None, + scale_power10: None, + offset_power10: None, + precision: None, + special: None, + components: None, + raw_hex, + }, + None => ValueOutput { + kind: "none".to_string(), + display: "No data".to_string(), + decimal: None, + significand: None, + number: None, + scale_power10: None, + offset_power10: None, + precision: None, + special: None, + components: None, + raw_hex, + }, + Some(_) => ValueOutput { + kind: "unknown".to_string(), + display: "Unsupported value type".to_string(), + decimal: None, + significand: None, + number: None, + scale_power10: None, + offset_power10: None, + precision: None, + special: None, + components: None, + raw_hex, + }, + } +} + +#[allow(clippy::too_many_arguments)] +fn temporal_value( + kind: &str, + day: &SingleEveryOrInvalid, + month: &SingleEveryOrInvalid, + year: &SingleEveryOrInvalid, + hour: Option<&SingleEveryOrInvalid>, + minute: Option<&SingleEveryOrInvalid>, + second: Option<&SingleEveryOrInvalid>, + raw_hex: String, +) -> ValueOutput { + let mut components = serde_json::Map::new(); + if kind != "time" { + components.insert("day".to_string(), component_json(day)); + components.insert("month".to_string(), component_json(month)); + components.insert("year".to_string(), component_json(year)); + } + if let Some(value) = hour { + components.insert("hour".to_string(), component_json(value)); + } + if let Some(value) = minute { + components.insert("minute".to_string(), component_json(value)); + } + if let Some(value) = second { + components.insert("second".to_string(), component_json(value)); + } + + let iso = temporal_iso(day, month, year, hour, minute, second, kind); + let display = iso.clone().unwrap_or_else(|| { + components + .iter() + .map(|(name, value)| format!("{name}={}", value["value_or_state"])) + .collect::>() + .join(", ") + }); + if let Some(iso) = &iso { + components.insert("iso".to_string(), serde_json::Value::String(iso.clone())); + } + ValueOutput { + kind: kind.to_string(), + display, + decimal: None, + significand: None, + number: None, + scale_power10: None, + offset_power10: None, + precision: None, + special: None, + components: Some(serde_json::Value::Object(components)), + raw_hex, + } +} + +fn component_json(component: &SingleEveryOrInvalid) -> serde_json::Value +where + T: Serialize + fmt::Display, +{ + match component { + SingleEveryOrInvalid::Single(value) => serde_json::json!({ + "state": "single", + "value": value, + "value_or_state": value.to_string(), + }), + SingleEveryOrInvalid::Every() => { + serde_json::json!({"state": "every", "value_or_state": "every"}) + } + SingleEveryOrInvalid::Invalid() => { + serde_json::json!({"state": "invalid", "value_or_state": "invalid"}) + } + _ => serde_json::json!({"state": "unknown", "value_or_state": "unknown"}), + } +} + +fn temporal_iso( + day: &SingleEveryOrInvalid, + month: &SingleEveryOrInvalid, + year: &SingleEveryOrInvalid, + hour: Option<&SingleEveryOrInvalid>, + minute: Option<&SingleEveryOrInvalid>, + second: Option<&SingleEveryOrInvalid>, + kind: &str, +) -> Option { + let day = single(day); + let month = single(month).and_then(month_number); + let year = single(year); + let hour = hour.and_then(single); + let minute = minute.and_then(single); + let second = second.and_then(single); + match kind { + "date" => Some(format!("{:04}-{:02}-{:02}", year?, month?, day?)), + "time" => Some(format!("{:02}:{:02}:{:02}", hour?, minute?, second?)), + _ if second.is_some() => Some(format!( + "{:04}-{:02}-{:02}T{:02}:{:02}:{:02}", + year?, month?, day?, hour?, minute?, second? + )), + _ => Some(format!( + "{:04}-{:02}-{:02}T{:02}:{:02}:00", + year?, month?, day?, hour?, minute? + )), + } +} + +fn single(component: &SingleEveryOrInvalid) -> Option { + match component { + SingleEveryOrInvalid::Single(value) => Some(*value), + _ => None, + } +} + +const fn month_number(month: Month) -> Option { + Some(match month { + Month::January => 1, + Month::February => 2, + Month::March => 3, + Month::April => 4, + Month::May => 5, + Month::June => 6, + Month::July => 7, + Month::August => 8, + Month::September => 9, + Month::October => 10, + Month::November => 11, + Month::December => 12, + #[allow(unreachable_patterns)] + _ => return None, + }) +} + +fn finite_number(value: f64) -> (Option, Option) { + if value.is_nan() { + (None, Some("nan".to_string())) + } else if value == f64::INFINITY { + (None, Some("positive_infinity".to_string())) + } else if value == f64::NEG_INFINITY { + (None, Some("negative_infinity".to_string())) + } else { + (Some(value), None) + } +} + +fn exact_significand(record: &user_data::DataRecord<'_>, parsed: f64) -> Option { + let information = record.data_information()?; + let header_size = record.data_record_header.get_size(); + let data = record.raw_bytes().get(header_size..)?; + match information.data_field_coding { + DataFieldCoding::Integer8Bit => signed_le_decimal(data.get(..1)?), + DataFieldCoding::Integer16Bit => signed_le_decimal(data.get(..2)?), + DataFieldCoding::Integer24Bit => signed_le_decimal(data.get(..3)?), + DataFieldCoding::Integer32Bit => signed_le_decimal(data.get(..4)?), + DataFieldCoding::Integer48Bit => signed_le_decimal(data.get(..6)?), + DataFieldCoding::Integer64Bit => signed_le_decimal(data.get(..8)?), + DataFieldCoding::BCD2Digit + | DataFieldCoding::BCD4Digit + | DataFieldCoding::BCD6Digit + | DataFieldCoding::BCD8Digit + | DataFieldCoding::BCDDigit12 => Some(format!("{parsed:.0}")), + DataFieldCoding::VariableLength => exact_variable_significand(data, parsed), + _ => None, + } +} + +fn exact_variable_significand(data: &[u8], parsed: f64) -> Option { + let marker = *data.first()?; + match marker { + 0xC0..=0xC9 | 0xD0..=0xD9 => Some(format!("{parsed:.0}")), + 0xE0..=0xEF => { + let length = usize::from(marker - 0xE0); + signed_le_decimal(data.get(1..=length)?) + } + 0xF0..=0xF4 => { + let length = usize::from(marker - 0xEC) * 4; + signed_le_decimal(data.get(1..=length)?) + } + 0xF5 => signed_le_decimal(data.get(1..=48)?), + 0xF6 => signed_le_decimal(data.get(1..=64)?), + _ => None, + } +} + +fn signed_le_decimal(bytes: &[u8]) -> Option { + if bytes.is_empty() { + return None; + } + let negative = bytes.last().is_some_and(|byte| byte & 0x80 != 0); + let magnitude = if negative { + let mut value: Vec = bytes.iter().map(|byte| !byte).collect(); + let mut carry = 1u16; + for byte in &mut value { + let sum = u16::from(*byte) + carry; + *byte = sum as u8; + carry = sum >> 8; + if carry == 0 { + break; + } + } + value + } else { + bytes.to_vec() + }; + let mut digits = vec![0u8]; + for byte in magnitude.iter().rev() { + let mut carry = u16::from(*byte); + for digit in &mut digits { + let value = u16::from(*digit) * 256 + carry; + *digit = (value % 10) as u8; + carry = value / 10; + } + while carry != 0 { + digits.push((carry % 10) as u8); + carry /= 10; + } + } + while digits.len() > 1 && digits.last() == Some(&0) { + digits.pop(); + } + let mut value: String = digits + .iter() + .rev() + .map(|digit| char::from(b'0' + *digit)) + .collect(); + if negative && value != "0" { + value.insert(0, '-'); + } + Some(value) +} + +fn record_offset_power10(record: &user_data::DataRecord<'_>) -> Option { + let block = record + .data_record_header + .raw_data_record_header + .value_information_block + .as_ref()?; + block + .value_information_extension + .as_ref()? + .iter() + .filter_map(|extension| { + let code = extension.data & 0x7F; + (0x78..=0x7B) + .contains(&code) + .then(|| isize::from(extension.data & 0b11) - 3) + }) + .next_back() +} + +fn scaled_decimal(significand: &str, scale: isize, offset: Option) -> String { + let (negative, digits) = split_sign(significand); + let minimum_exponent = offset.map_or(scale, |value| value.min(scale)); + let mut left = digits.to_string(); + left.push_str(&"0".repeat(usize::try_from(scale - minimum_exponent).unwrap_or(0))); + let signed_left = if negative { format!("-{left}") } else { left }; + let integer = if let Some(offset_exponent) = offset { + let mut right = "1".to_string(); + right.push_str( + &"0".repeat(usize::try_from(offset_exponent - minimum_exponent).unwrap_or(0)), + ); + add_signed_decimal_integers(&signed_left, &right) + } else { + signed_left + }; + apply_power10(&integer, minimum_exponent) +} + +fn split_sign(value: &str) -> (bool, &str) { + value + .strip_prefix('-') + .map_or((false, value), |digits| (true, digits)) +} + +fn add_signed_decimal_integers(left: &str, right: &str) -> String { + let (left_negative, left_digits) = split_sign(left); + let (right_negative, right_digits) = split_sign(right); + if left_negative == right_negative { + let result = add_abs(left_digits, right_digits); + if left_negative && result != "0" { + format!("-{result}") + } else { + result + } + } else { + match compare_abs(left_digits, right_digits) { + std::cmp::Ordering::Equal => "0".to_string(), + std::cmp::Ordering::Greater => { + let result = subtract_abs(left_digits, right_digits); + if left_negative { + format!("-{result}") + } else { + result + } + } + std::cmp::Ordering::Less => { + let result = subtract_abs(right_digits, left_digits); + if right_negative { + format!("-{result}") + } else { + result + } + } + } + } +} + +fn add_abs(left: &str, right: &str) -> String { + let mut output = Vec::new(); + let mut carry = 0u8; + let mut left = left.bytes().rev(); + let mut right = right.bytes().rev(); + loop { + let a = left.next().map(|value| value - b'0'); + let b = right.next().map(|value| value - b'0'); + if a.is_none() && b.is_none() && carry == 0 { + break; + } + let sum = a.unwrap_or(0) + b.unwrap_or(0) + carry; + output.push(b'0' + sum % 10); + carry = sum / 10; + } + output.reverse(); + String::from_utf8(output).unwrap_or_else(|_| "0".to_string()) +} + +fn subtract_abs(larger: &str, smaller: &str) -> String { + let mut output = Vec::new(); + let mut borrow = 0i8; + let mut smaller = smaller.bytes().rev(); + for value in larger.bytes().rev() { + let mut digit = (value - b'0') as i8 - borrow; + let sub = smaller.next().map_or(0, |item| (item - b'0') as i8); + if digit < sub { + digit += 10; + borrow = 1; + } else { + borrow = 0; + } + output.push(b'0' + u8::try_from(digit - sub).unwrap_or(0)); + } + while output.len() > 1 && output.last() == Some(&b'0') { + output.pop(); + } + output.reverse(); + String::from_utf8(output).unwrap_or_else(|_| "0".to_string()) +} + +fn compare_abs(left: &str, right: &str) -> std::cmp::Ordering { + let left = left.trim_start_matches('0'); + let right = right.trim_start_matches('0'); + left.len().cmp(&right.len()).then_with(|| left.cmp(right)) +} + +fn apply_power10(integer: &str, exponent: isize) -> String { + let (negative, digits) = split_sign(integer); + let mut output = if exponent >= 0 { + let mut value = digits.to_string(); + value.push_str(&"0".repeat(usize::try_from(exponent).unwrap_or(0))); + value + } else { + let places = exponent.unsigned_abs(); + if digits.len() > places { + let split = digits.len() - places; + format!("{}.{}", &digits[..split], &digits[split..]) + } else { + format!("0.{}{}", "0".repeat(places - digits.len()), digits) + } + }; + while output.contains('.') && output.ends_with('0') { + output.pop(); + } + if output.ends_with('.') { + output.pop(); + } + if negative && output != "0" { + output.insert(0, '-'); + } + output +} + +fn unit_output(units: &[Unit]) -> UnitOutput { + let display = units.iter().map(ToString::to_string).collect::(); + let components = units + .iter() + .map(|unit| UnitComponent { + name: format!("{:?}", unit.name), + exponent: unit.exponent, + }) + .collect(); + let ucum = units + .iter() + .map(ucum_component) + .collect::>>() + .map(|components| components.join(".")); + UnitOutput { + display, + components, + ucum, + } +} + +fn ucum_component(unit: &Unit) -> Option { + let symbol = match unit.name { + UnitName::Watt => "W", + UnitName::Joul => "J", + UnitName::Kilogram => "kg", + UnitName::Tonne => "t", + UnitName::Meter => "m", + UnitName::Feet => "[ft_i]", + UnitName::Celsius => "Cel", + UnitName::Kelvin => "K", + UnitName::Bar => "bar", + UnitName::Second => "s", + UnitName::Minute => "min", + UnitName::Hour => "h", + UnitName::Day => "d", + UnitName::Week => "wk", + UnitName::Month => "mo", + UnitName::Year => "a", + UnitName::Liter => "L", + UnitName::Volt => "V", + UnitName::Ampere => "A", + UnitName::Percent => "%", + UnitName::Hertz => "Hz", + UnitName::Fahrenheit => "[degF]", + UnitName::AmericanGallon => "[gal_us]", + UnitName::Calorie => "cal", + _ => return None, + }; + if unit.exponent == 1 { + Some(symbol.to_string()) + } else { + Some(format!("{symbol}{}", unit.exponent)) + } +} + +fn render_csv(decoded: &DecodedOutput) -> Result { + use prettytable::csv; + let mut writer = csv::Writer::from_writer(Vec::new()); + writer + .write_record([ + "schema_version", + "protocol", + "frame_kind", + "frame_function", + "address", + "meter_id", + "manufacturer_code", + "identity_source", + "access_numbers", + "status_codes", + "security_mode", + "decryption_state", + "decode_state", + "record_index", + "record_function", + "storage_number", + "tariff", + "subunit", + "quantities", + "value_type", + "value", + "value_decimal", + "raw_value", + "scale_power10", + "offset_power10", + "unit", + "unit_ucum", + "data_coding", + "header_hex", + "data_hex", + "record_hex", + "diagnostic_codes", + "manufacturer_name", + "manufacturer_website", + "frame_hex", + ]) + .map_err(|error| OutputError::Serialization { + format: "csv", + message: error.to_string(), + })?; + + if decoded.records.is_empty() { + writer + .write_record(csv_row(decoded, None)) + .map_err(|error| OutputError::Serialization { + format: "csv", + message: error.to_string(), + })?; + } else { + for record in &decoded.records { + writer + .write_record(csv_row(decoded, Some(record))) + .map_err(|error| OutputError::Serialization { + format: "csv", + message: error.to_string(), + })?; + } + } + let bytes = writer + .into_inner() + .map_err(|error| OutputError::Serialization { + format: "csv", + message: error.to_string(), + })?; + String::from_utf8(bytes).map_err(|error| OutputError::Serialization { + format: "csv", + message: error.to_string(), + }) +} + +fn csv_row(decoded: &DecodedOutput, record: Option<&RecordOutput>) -> Vec { + let identity = decoded.meter.identity.as_ref(); + let enrichment = decoded.enrichment.as_ref(); + let statuses = decoded + .transport + .statuses + .iter() + .map(|status| status.raw.clone()) + .collect::>() + .join("|"); + let access = decoded + .transport + .access_numbers + .iter() + .map(|value| format!("{}:{}", value.source, value.value)) + .collect::>() + .join("|"); + let diagnostics = decoded + .diagnostics + .iter() + .map(|diagnostic| diagnostic.code.clone()) + .collect::>() + .join("|"); + vec![ + decoded.schema_version.to_string(), + decoded.protocol.clone(), + decoded.frame.kind.clone(), + decoded.frame.function.clone().unwrap_or_default(), + decoded.frame.address.clone().unwrap_or_default(), + identity + .and_then(|value| value.id.clone()) + .unwrap_or_default(), + identity + .and_then(|value| value.manufacturer_code.clone()) + .unwrap_or_default(), + identity + .map(|value| value.source.clone()) + .unwrap_or_default(), + access, + statuses, + decoded.security.mode.clone().unwrap_or_default(), + decoded.security.decryption_state.clone(), + decoded.decode_state.clone(), + record + .map(|value| value.index.to_string()) + .unwrap_or_default(), + record + .map(|value| value.function.clone()) + .unwrap_or_default(), + record + .map(|value| value.storage_number.to_string()) + .unwrap_or_default(), + record + .map(|value| value.tariff.to_string()) + .unwrap_or_default(), + record + .map(|value| value.subunit.to_string()) + .unwrap_or_default(), + record + .map(|value| value.quantities.join("|")) + .unwrap_or_default(), + record + .map(|value| value.value.kind.clone()) + .unwrap_or_default(), + record + .map(|value| value.value.display.clone()) + .unwrap_or_default(), + record + .and_then(|value| value.value.decimal.clone()) + .unwrap_or_default(), + record + .map(|value| value.value.raw_hex.clone()) + .unwrap_or_default(), + record + .and_then(|value| value.value.scale_power10) + .map(|value| value.to_string()) + .unwrap_or_default(), + record + .and_then(|value| value.value.offset_power10) + .map(|value| value.to_string()) + .unwrap_or_default(), + record + .and_then(|value| value.unit.as_ref()) + .map(|value| value.display.clone()) + .unwrap_or_default(), + record + .and_then(|value| value.unit.as_ref()) + .and_then(|value| value.ucum.clone()) + .unwrap_or_default(), + record + .map(|value| value.data_coding.clone()) + .unwrap_or_default(), + record + .map(|value| value.header_hex.clone()) + .unwrap_or_default(), + record + .map(|value| value.data_hex.clone()) + .unwrap_or_default(), + record + .map(|value| value.record_hex.clone()) + .unwrap_or_default(), + diagnostics, + enrichment + .map(|value| value.manufacturer_name.clone()) + .unwrap_or_default(), + enrichment + .map(|value| value.manufacturer_website.clone()) + .unwrap_or_default(), + decoded.raw.original_frame_hex.clone(), + ] +} + +fn render_table(decoded: &DecodedOutput, width: usize) -> Result { + if width < MINIMUM_TABLE_WIDTH { + return Err(OutputError::InvalidOption { + option: "table_width", + message: format!("must be at least {MINIMUM_TABLE_WIDTH} columns"), + }); + } + let mut output = String::new(); + let title = format!( + "{} {} frame · {} decode", + decoded.protocol, decoded.frame.kind, decoded.decode_state + ); + output.push_str(&wrap_display(&title, width).join("\n")); + output.push('\n'); + + let identity = decoded.meter.identity.as_ref(); + let mut summary = vec![ + ( + "Function".to_string(), + decoded + .frame + .function + .clone() + .unwrap_or_else(|| "—".to_string()), + ), + ( + "Meter".to_string(), + identity + .and_then(|value| value.id.clone()) + .unwrap_or_else(|| "—".to_string()), + ), + ( + "Manufacturer".to_string(), + identity + .and_then(|value| value.manufacturer_code.clone()) + .unwrap_or_else(|| "—".to_string()), + ), + ( + "Device".to_string(), + identity + .and_then(|value| value.device_type.clone()) + .unwrap_or_else(|| "—".to_string()), + ), + ( + "Security".to_string(), + format!( + "{} · {}", + decoded.security.payload_protection, decoded.security.decryption_state + ), + ), + ]; + if let Some(enrichment) = &decoded.enrichment { + summary.push(( + "Manufacturer name".to_string(), + enrichment.manufacturer_name.clone(), + )); + summary.push(( + "Website".to_string(), + enrichment.manufacturer_website.clone(), + )); + summary.push(( + "Description".to_string(), + enrichment.manufacturer_description.clone(), + )); + } + output.push_str(&key_value_box(&summary, width)); + + if !decoded.records.is_empty() { + if width >= 100 { + let content = width - 19; + let widths = vec![ + 3, + (content * 34 / 100).max(18), + 12, + 11, + 13, + content.saturating_sub(3 + (content * 34 / 100).max(18) + 12 + 11 + 13), + ]; + let rows = decoded + .records + .iter() + .map(|record| { + vec![ + record.index.to_string(), + reading(record), + record.function.clone(), + format!( + "{}/{}/{}", + record.storage_number, record.tariff, record.subunit + ), + record.data_coding.clone(), + record.record_hex.clone(), + ] + }) + .collect::>(); + output.push_str(&box_table( + &["#", "Reading", "Function", "S/T/U", "Coding", "Raw"], + &rows, + &widths, + )); + } else if width >= 72 { + let content = width - 13; + let reading_width = (content * 52 / 100).max(24); + let widths = vec![ + 3, + reading_width, + 12, + content.saturating_sub(3 + reading_width + 12), + ]; + let rows = decoded + .records + .iter() + .map(|record| { + vec![ + record.index.to_string(), + format!( + "{}\n{} · raw {}", + reading(record), + record.data_coding, + record.record_hex + ), + record.function.clone(), + format!( + "{}/{}/{}", + record.storage_number, record.tariff, record.subunit + ), + ] + }) + .collect::>(); + output.push_str(&box_table( + &["#", "Reading / detail", "Function", "S/T/U"], + &rows, + &widths, + )); + } else { + for record in &decoded.records { + output.push_str(&format!("Record {}\n", record.index)); + output.push_str(&key_value_box( + &[ + ("Reading".to_string(), reading(record)), + ("Function".to_string(), record.function.clone()), + ( + "Storage/Tariff/Subunit".to_string(), + format!( + "{}/{}/{}", + record.storage_number, record.tariff, record.subunit + ), + ), + ("Coding".to_string(), record.data_coding.clone()), + ("Raw".to_string(), record.record_hex.clone()), + ], + width, + )); + } + } + } + if !decoded.diagnostics.is_empty() { + output.push_str("Diagnostics\n"); + let rows = decoded + .diagnostics + .iter() + .map(|diagnostic| { + ( + diagnostic.code.clone(), + format!("{}: {}", diagnostic.severity, diagnostic.message), + ) + }) + .collect::>(); + output.push_str(&key_value_box(&rows, width)); + } + Ok(output) +} + +fn reading(record: &RecordOutput) -> String { + let quantity = if record.quantities.is_empty() { + "Reading".to_string() + } else { + record.quantities.join(", ") + }; + let unit = record + .unit + .as_ref() + .map(|value| format!(" {}", value.display)) + .unwrap_or_default(); + format!("{quantity}: {}{unit}", record.value.display) +} + +fn key_value_box(rows: &[(String, String)], width: usize) -> String { + let content = width.saturating_sub(7); + let key_width = (content / 3).clamp(10, 24); + let value_width = content.saturating_sub(key_width).max(1); + let rows = rows + .iter() + .map(|(key, value)| vec![key.clone(), value.clone()]) + .collect::>(); + box_table(&["Field", "Value"], &rows, &[key_width, value_width]) +} + +fn box_table(headers: &[&str], rows: &[Vec], widths: &[usize]) -> String { + let mut output = String::new(); + push_border(&mut output, '┌', '┬', '┐', widths); + push_row( + &mut output, + &headers + .iter() + .map(|value| value.to_string()) + .collect::>(), + widths, + ); + push_border(&mut output, '├', '┼', '┤', widths); + for (index, row) in rows.iter().enumerate() { + push_row(&mut output, row, widths); + if index + 1 != rows.len() { + push_border(&mut output, '├', '┼', '┤', widths); + } + } + push_border(&mut output, '└', '┴', '┘', widths); + output +} + +fn push_border(output: &mut String, left: char, middle: char, right: char, widths: &[usize]) { + output.push(left); + for (index, width) in widths.iter().enumerate() { + output.push_str(&"─".repeat(width + 2)); + output.push(if index + 1 == widths.len() { + right + } else { + middle + }); + } + output.push('\n'); +} + +fn push_row(output: &mut String, cells: &[String], widths: &[usize]) { + let wrapped = widths + .iter() + .enumerate() + .map(|(index, width)| wrap_display(cells.get(index).map_or("", String::as_str), *width)) + .collect::>(); + let height = wrapped.iter().map(Vec::len).max().unwrap_or(1); + for line in 0..height { + output.push('│'); + for (index, width) in widths.iter().enumerate() { + let value = wrapped + .get(index) + .and_then(|lines| lines.get(line)) + .map_or("", String::as_str); + output.push(' '); + output.push_str(value); + output.push_str(&" ".repeat(width.saturating_sub(UnicodeWidthStr::width(value)))); + output.push(' '); + output.push('│'); + } + output.push('\n'); + } +} + +fn wrap_display(value: &str, width: usize) -> Vec { + if width == 0 { + return vec![String::new()]; + } + let mut lines = Vec::new(); + for source_line in value.split('\n') { + if source_line.is_empty() { + lines.push(String::new()); + continue; + } + let mut line = String::new(); + let mut line_width = 0usize; + for character in source_line.chars() { + let character_width = UnicodeWidthChar::width(character).unwrap_or(0); + if line_width != 0 && line_width + character_width > width { + lines.push(line); + line = String::new(); + line_width = 0; + } + line.push(character); + line_width += character_width; + } + lines.push(line); + } + if lines.is_empty() { + lines.push(String::new()); + } + lines +} + +fn render_mermaid(decoded: &DecodedOutput) -> String { + let mut output = String::from("flowchart TD\n"); + output.push_str(&format!( + " FRAME[\"{} {} frame\"]\n", + mermaid_escape(&decoded.protocol), + mermaid_escape(&decoded.frame.kind) + )); + if let Some(identity) = &decoded.meter.identity { + output.push_str(&format!( + " METER[\"Meter {} · {}\"]\n FRAME --> METER\n", + mermaid_escape(identity.id.as_deref().unwrap_or("unknown")), + mermaid_escape( + identity + .manufacturer_code + .as_deref() + .unwrap_or("unknown manufacturer") + ) + )); + } + output.push_str(&format!( + " SECURITY[\"Security: {} · {}\"]\n FRAME --> SECURITY\n", + mermaid_escape(&decoded.security.payload_protection), + mermaid_escape(&decoded.security.decryption_state) + )); + for record in &decoded.records { + output.push_str(&format!( + " R{}[\"{}\"]\n", + record.index, + mermaid_escape(&reading(record)) + )); + if decoded.meter.identity.is_some() { + output.push_str(&format!(" METER --> R{}\n", record.index)); + } else { + output.push_str(&format!(" FRAME --> R{}\n", record.index)); + } + } + if !decoded.diagnostics.is_empty() { + output.push_str(&format!( + " DIAG[\"{} diagnostic(s)\"]\n FRAME --> DIAG\n", + decoded.diagnostics.len() + )); + } + output +} + +fn mermaid_escape(value: &str) -> String { + value + .replace('&', "&") + .replace('"', """) + .replace('<', "<") + .replace('>', ">") + .replace('\n', " ") +} + +fn hex_string(data: &[u8]) -> String { + data.iter().map(|byte| format!("{byte:02X}")).collect() +} + +fn spaced_hex(data: &[u8]) -> String { + data.iter() + .map(|byte| format!("{byte:02X}")) + .collect::>() + .join(" ") +} + +#[cfg(test)] +mod tests { + use super::*; + + const WIRED_FRAME: &str = "68 3D 3D 68 08 01 72 00 51 20 02 82 4D 02 04 00 88 00 00 04 07 00 00 00 00 0C 15 03 00 00 00 0B 2E 00 00 00 0B 3B 00 00 00 0A 5A 88 12 0A 5E 16 05 0B 61 23 77 00 02 6C 8C 11 02 27 37 0D 0F 60 00 67 16"; + + #[test] + fn strict_hex_accepts_compact_and_byte_tokens() { + assert_eq!(decode_hex_bytes("683D").unwrap(), [0x68, 0x3D]); + assert_eq!( + decode_hex_bytes("0x68: 3d-0X16").unwrap(), + [0x68, 0x3D, 0x16] + ); + } + + #[test] + fn strict_hex_rejects_odd_and_invalid_input() { + assert!(decode_hex_bytes("123").is_err()); + assert!(decode_hex_bytes("68,3D").is_err()); + assert!(decode_hex_bytes("0x6").is_err()); + } + + #[test] + fn canonical_json_has_versioned_layers() { + let rendered = + render_hex(WIRED_FRAME, OutputFormat::Json, &RenderOptions::default()).unwrap(); + let value: serde_json::Value = serde_json::from_str(&rendered).unwrap(); + assert_eq!(value["schema_version"], 1); + assert_eq!(value["protocol"], "wired"); + assert!(value["records"].is_array()); + assert!(value.get("summary").is_none()); + } + + #[test] + fn table_respects_requested_width() { + for width in [32, 71, 72, 99, 100, 120] { + let rendered = render_hex( + WIRED_FRAME, + OutputFormat::Table, + &RenderOptions { + table_width: Some(width), + ..RenderOptions::default() + }, + ) + .unwrap(); + assert!( + rendered + .lines() + .all(|line| UnicodeWidthStr::width(line) <= width), + "line exceeded width {width}:\n{rendered}" + ); + } + } + + #[test] + fn arbitrary_signed_integer_conversion_is_exact() { + assert_eq!(signed_le_decimal(&[0xFF]), Some("-1".to_string())); + assert_eq!( + signed_le_decimal(&[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F]), + Some(i64::MAX.to_string()) + ); + } + + #[test] + fn scaled_decimal_applies_additive_offset() { + assert_eq!(scaled_decimal("876543", -3, None), "876.543"); + assert_eq!(scaled_decimal("10", 0, Some(0)), "11"); + assert_eq!(scaled_decimal("-10", -1, Some(-1)), "-0.9"); + } +} diff --git a/src/rscada_xml.rs b/src/rscada_xml.rs index 556df13..f015f87 100644 --- a/src/rscada_xml.rs +++ b/src/rscada_xml.rs @@ -7,37 +7,299 @@ use crate::mbus_data::MbusData; use crate::user_data; use wired_mbus_link_layer as frames; +use wireless_mbus_link_layer as wireless; const XML_PROCESSING_INSTRUCTION: &str = "\n"; -/// Render a raw frame in the legacy libmbus normalized XML format. -pub(crate) fn render_from_bytes(data: &[u8]) -> String { - let Ok(parsed) = MbusData::::try_from(data) else { - return "Error: Could not parse data as a wired M-Bus frame".to_string(); - }; +/// Render a raw wired frame in the byte-compatible libmbus vocabulary, or a +/// wireless frame in the same documented project vocabulary. +pub(crate) fn render_from_bytes(data: &[u8], key: Option<&[u8; 16]>) -> Result { + if let Ok(parsed) = MbusData::::try_from(data) { + return match &parsed.user_data { + Some(user_data::UserDataBlock::VariableDataStructureWithLongTplHeader { + long_tpl_header, + .. + }) => { + // Keep the established wired byte stream when no key is + // requested, including meters whose configuration bits claim + // encryption while their records remain parseable. + if key.is_none() { + Ok(render_variable( + long_tpl_header, + parsed.data_records.as_ref(), + )) + } else { + render_with_optional_decryption( + long_tpl_header, + parsed.user_data.as_ref(), + parsed.data_records.as_ref(), + None, + key, + ) + } + } + Some(user_data::UserDataBlock::FixedDataStructure { + identification_number, + access_number, + status, + device_type_and_unit, + counter1, + counter2, + }) => Ok(render_fixed( + identification_number.number, + *access_number, + status.bits(), + *device_type_and_unit, + counter1, + counter2, + )), + _ => Err("unsupported wired frame type for legacy XML output".to_string()), + }; + } + let mut crc_buffer = [0u8; 512]; + let normalized = wireless::strip_format_a_crcs(data, &mut crc_buffer).unwrap_or(data); + let parsed = MbusData::::try_from(normalized) + .map_err(|error| format!("could not parse data as wired or wireless M-Bus: {error:?}"))?; + render_wireless(&parsed, key) +} + +fn render_wireless( + parsed: &MbusData>, + key: Option<&[u8; 16]>, +) -> Result { + use user_data::UserDataBlock; match &parsed.user_data { - Some(user_data::UserDataBlock::VariableDataStructureWithLongTplHeader { + Some(UserDataBlock::VariableDataStructureWithLongTplHeader { + long_tpl_header, .. + }) => render_with_optional_decryption( long_tpl_header, + parsed.user_data.as_ref(), + parsed.data_records.as_ref(), + Some(&parsed.frame.manufacturer_id), + key, + ), + Some(UserDataBlock::VariableDataStructureWithShortTplHeader { + extended_link_layer, + short_tpl_header, + .. + }) => { + let synthetic = extended_link_layer + .as_ref() + .is_some_and(|ell| ell.encryption.is_some()) + && matches!( + short_tpl_header.configuration_field.security_mode(), + m_bus_core::SecurityMode::NoEncryption + ); + let access = if synthetic { + extended_link_layer.as_ref().map(|ell| ell.access_number) + } else { + Some(short_tpl_header.access_number) + }; + let status = (!synthetic).then_some(short_tpl_header.status.bits()); + let signature = (!synthetic).then_some(short_tpl_header.configuration_field.raw()); + render_wireless_with_optional_decryption(parsed, access, status, signature, key) + } + Some(UserDataBlock::VariableDataStructureWithoutTplHeader { + extended_link_layer, .. - }) => render_variable(long_tpl_header, parsed.data_records.as_ref()), - Some(user_data::UserDataBlock::FixedDataStructure { + }) => Ok(render_wireless_variable( + &parsed.frame.manufacturer_id, + extended_link_layer.as_ref().map(|ell| ell.access_number), + None, + None, + parsed.data_records.as_ref(), + )), + Some(UserDataBlock::FixedDataStructure { identification_number, access_number, status, device_type_and_unit, counter1, counter2, - }) => render_fixed( + }) => Ok(render_fixed( identification_number.number, *access_number, status.bits(), *device_type_and_unit, counter1, counter2, - ), - _ => "Error: Unsupported frame type for legacy XML output".to_string(), + )), + _ => Ok(render_wireless_variable( + &parsed.frame.manufacturer_id, + None, + None, + None, + None, + )), + } +} + +fn render_with_optional_decryption( + header: &user_data::LongTplHeader, + user_data: Option<&user_data::UserDataBlock<'_>>, + records: Option<&user_data::DataRecords<'_>>, + wireless_id: Option<&wireless::ManufacturerId>, + key: Option<&[u8; 16]>, +) -> Result { + if !header.is_encrypted() { + return Ok(render_variable(header, records)); + } + let Some(key) = key else { + return Ok(render_variable(header, None)); + }; + #[cfg(feature = "decryption")] + { + let mut decrypted = [0u8; 512]; + let block = user_data.ok_or_else(|| "encrypted XML frame has no user data".to_string())?; + let len = crate::output::decrypt_user_data(block, wireless_id, key, &mut decrypted) + .map_err(|error| error.to_string())?; + let data = decrypted + .get(..len) + .ok_or_else(|| "decryption returned an invalid payload length".to_string())?; + let records = user_data::DataRecords::new(data, Some(header)); + Ok(render_variable(header, Some(&records))) + } + #[cfg(not(feature = "decryption"))] + { + let _ = (user_data, wireless_id, key); + Err("this build does not include decryption support".to_string()) + } +} + +fn render_wireless_with_optional_decryption( + parsed: &MbusData>, + access: Option, + status: Option, + signature: Option, + key: Option<&[u8; 16]>, +) -> Result { + let encrypted = match &parsed.user_data { + Some(user_data::UserDataBlock::VariableDataStructureWithShortTplHeader { + extended_link_layer, + short_tpl_header, + .. + }) => { + extended_link_layer + .as_ref() + .is_some_and(|ell| ell.encryption.is_some()) + || short_tpl_header.is_encrypted() + } + _ => false, + }; + if !encrypted { + return Ok(render_wireless_variable( + &parsed.frame.manufacturer_id, + access, + status, + signature, + parsed.data_records.as_ref(), + )); + } + let Some(key) = key else { + return Ok(render_wireless_variable( + &parsed.frame.manufacturer_id, + access, + status, + signature, + None, + )); + }; + #[cfg(feature = "decryption")] + { + let mut decrypted = [0u8; 512]; + let block = parsed + .user_data + .as_ref() + .ok_or_else(|| "encrypted XML frame has no user data".to_string())?; + let len = crate::output::decrypt_user_data( + block, + Some(&parsed.frame.manufacturer_id), + key, + &mut decrypted, + ) + .map_err(|error| error.to_string())?; + let data = decrypted + .get(..len) + .ok_or_else(|| "decryption returned an invalid payload length".to_string())?; + let records = user_data::DataRecords::new(data, None); + Ok(render_wireless_variable( + &parsed.frame.manufacturer_id, + access, + status, + signature, + Some(&records), + )) } + #[cfg(not(feature = "decryption"))] + { + let _ = key; + Err("this build does not include decryption support".to_string()) + } +} + +fn render_wireless_variable( + identity: &wireless::ManufacturerId, + access: Option, + status: Option, + signature: Option, + records: Option<&user_data::DataRecords<'_>>, +) -> String { + let manufacturer = identity.manufacturer_code.to_string(); + let medium = u8::from(identity.device_type); + let mut out = String::new(); + out.push_str(XML_PROCESSING_INSTRUCTION); + out.push_str("\n\n"); + out.push_str(" \n"); + out.push_str(&format!( + " {}\n", + identity.identification_number.number + )); + out.push_str(&format!( + " {}\n", + manufacturer + )); + out.push_str(&format!( + " {}\n", + identity.version + )); + out.push_str(&format!( + " {}\n", + xml_encode(&product_name( + &manufacturer, + identity.version, + medium, + identity.identification_number.number, + )) + )); + out.push_str(&format!( + " {}\n", + xml_encode(&medium_lookup(medium)) + )); + if let Some(access) = access { + out.push_str(&format!( + " {}\n", + access + )); + } + if let Some(status) = status { + out.push_str(&format!(" {status:02X}\n")); + } + if let Some(signature) = signature { + out.push_str(&format!( + " {:02X}{:02X}\n", + (signature >> 8) as u8, + (signature & 0xFF) as u8 + )); + } + out.push_str(" \n\n"); + if let Some(records) = records { + for (index, record) in records.clone().flatten().enumerate() { + out.push_str(&render_variable_record(index, &record)); + } + } + out.push_str("\n"); + out } fn render_variable( diff --git a/tests/output_contract.rs b/tests/output_contract.rs new file mode 100644 index 0000000..36b2dd1 --- /dev/null +++ b/tests/output_contract.rs @@ -0,0 +1,90 @@ +#![cfg(feature = "std")] +#![allow(clippy::unwrap_used)] + +use std::str::FromStr; + +use m_bus_parser::{ + decode_hex, render_hex, DecodeOptions, OutputError, OutputFormat, RenderOptions, +}; + +const WIRED_FRAME: &str = concat!( + "68 3D 3D 68 08 01 72 00 51 20 02 82 4D 02 04 00 88 00 00 ", + "04 07 00 00 00 00 0C 15 03 00 00 00 0B 2E 00 00 00 0B 3B ", + "00 00 00 0A 5A 88 12 0A 5E 16 05 0B 61 23 77 00 02 6C ", + "8C 11 02 27 37 0D 0F 60 00 67 16" +); + +#[test] +fn canonical_json_has_a_versioned_stable_root() { + let rendered = render_hex(WIRED_FRAME, OutputFormat::Json, &RenderOptions::default()).unwrap(); + let value: serde_json::Value = serde_json::from_str(&rendered).unwrap(); + let object = value.as_object().unwrap(); + + for field in [ + "schema_version", + "decode_state", + "protocol", + "frame", + "meter", + "transport", + "security", + "records", + "raw", + "diagnostics", + "enrichment", + ] { + assert!( + object.contains_key(field), + "missing canonical field {field}" + ); + } + assert_eq!(value["schema_version"], 1); + assert_eq!(value["protocol"], "wired"); + assert!(!object.contains_key("summary")); +} + +#[test] +fn enrichment_is_optional_without_changing_the_schema() { + let decoded = decode_hex( + WIRED_FRAME, + &DecodeOptions { + key: None, + include_enrichment: false, + }, + ) + .unwrap(); + let value = serde_json::to_value(decoded).unwrap(); + assert_eq!(value["schema_version"], 1); + assert!(value.get("enrichment").is_none()); +} + +#[test] +fn formats_and_compatibility_aliases_share_one_parser() { + assert_eq!(OutputFormat::from_str("yml").unwrap(), OutputFormat::Yaml); + assert_eq!( + OutputFormat::from_str("table_format").unwrap(), + OutputFormat::Table + ); + assert_eq!( + OutputFormat::from_str("hexview").unwrap(), + OutputFormat::Annotated + ); + + let csv = render_hex(WIRED_FRAME, OutputFormat::Csv, &RenderOptions::default()).unwrap(); + assert!(csv.starts_with("schema_version,protocol,frame_kind")); +} + +#[test] +fn typed_errors_have_stable_codes_and_offsets() { + let error = decode_hex("68,3D", &DecodeOptions::default()).unwrap_err(); + assert_eq!(error.code(), "input.invalid_hex"); + assert_eq!(error.layer(), "input"); + assert!(error.byte_offset().is_some()); + + let error = OutputFormat::from_str("html").unwrap_err(); + assert_eq!(error.code(), "format.unsupported"); + + let invalid_frame = decode_hex("0102", &DecodeOptions::default()).unwrap_err(); + assert!(matches!(invalid_frame, OutputError::InvalidFrame { .. })); + assert_eq!(invalid_frame.code(), "frame.invalid"); +} diff --git a/tests/rscada_xml.rs b/tests/rscada_xml.rs index a231c60..21c153e 100644 --- a/tests/rscada_xml.rs +++ b/tests/rscada_xml.rs @@ -10,6 +10,11 @@ use std::fs; use std::path::PathBuf; +use std::str::FromStr; + +#[cfg(feature = "decryption")] +use m_bus_parser::DecodeOptions; +use m_bus_parser::{render_hex, OutputFormat, RenderOptions}; /// Frames that do not yet match libmbus's normalized XML output. /// @@ -123,3 +128,73 @@ fn xml_output_matches_libmbus_normalized_xml() { fixed ); } + +#[test] +fn wireless_short_transport_xml_uses_link_identity_and_transport_fields() { + let input = concat!( + "18 44 AE 4C 44 55 22 33 68 07 ", + "7A 55 00 00 00 04 13 89 E2 01 00 02 3B 00 00" + ); + let xml = render_hex(input, OutputFormat::Xml, &RenderOptions::default()) + .expect("wireless short-transport XML"); + + assert!(xml.starts_with("")); + assert!(xml.contains("33225544")); + assert!(xml.contains("SEN")); + assert!(xml.contains("Water")); + assert!(xml.contains("85")); + assert!(xml.contains("00")); + assert!(xml.contains("0000")); + assert!(xml.contains("")); +} + +#[test] +fn wireless_ell_xml_uses_real_ell_access_without_inventing_tpl_fields() { + let input = "12 44 AE 0C 78 56 34 12 01 07 8C 20 27 78 0B 13 43 65 87"; + let xml = render_hex( + input, + OutputFormat::from_str("xml").unwrap(), + &RenderOptions::default(), + ) + .expect("wireless ELL XML"); + + assert!(xml.contains("12345678")); + assert!(xml.contains("CEN")); + assert!(xml.contains("39")); + assert!(!xml.contains("")); + assert!(!xml.contains("")); + assert!(xml.contains("")); +} + +#[cfg(feature = "decryption")] +#[test] +fn wireless_encrypted_xml_is_header_only_without_key_and_decodes_with_key() { + let input = concat!( + "2E44931578563412330333637A2A002025", + "5923C95AAA26D1B2E7493BC2AD013EC4", + "A6F6D3529B520EDFF0EA6DEFC955B29D", + "6D69EBF3EC8A" + ); + let without_key = render_hex(input, OutputFormat::Xml, &RenderOptions::default()) + .expect("encrypted wireless XML header"); + assert!(without_key.contains("12345678")); + assert!(!without_key.contains("")); + assert!(with_key.contains("")); +} diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 41c8979..749c3db 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "m-bus-parser-wasm-pack" -version = "0.3.0" +version = "0.4.0" edition = "2021" description = "A wasm-pack to use the library for parsing M-Bus frames" license = "MIT" @@ -22,9 +22,11 @@ decryption = ["m-bus-parser/decryption"] [dependencies] wasm-bindgen = "0.2.84" -m-bus-parser = { path = "..", version = "0.3.0", features = ["std", "serde"] } +m-bus-parser = { path = "..", version = "0.4.0", features = ["std", "serde"] } +js-sys = "0.3" serde = { version = "1.0" } serde_json = "1.0" +serde-wasm-bindgen = "0.6" # The `console_error_panic_hook` crate provides better debugging of panics by # logging them with `console.error`. This is great for development, but requires diff --git a/wasm/README.md b/wasm/README.md index 528b8a6..e4423b9 100644 --- a/wasm/README.md +++ b/wasm/README.md @@ -1,3 +1,20 @@ -# WASM Package for m-bus-parser (wired) +# WASM package for m-bus-parser -This package is a WebAssembly (WASM) package for the mbus parser so it may be used in the browser for example. \ No newline at end of file +Browser bindings for the wired and wireless M-Bus parser. + +- `m_bus_decode(data, key?, includeEnrichment?)` returns the canonical schema + as a native JavaScript object. +- `m_bus_render(data, format, key?, width?, includeEnrichment?)` renders + `table`, `json`, `yaml`, `csv`, `mermaid`, `xml`, `annotated`, or + `annotated-text`. +- Rejected promises/errors are `MbusParserError` objects with stable `code`, + `layer`, and optional `byteOffset` properties. +- `m_bus_parse` and `m_bus_parse_with_key` remain compatibility wrappers. + +```js +import init, { m_bus_decode, m_bus_render } from 'm-bus-parser-wasm-pack' + +await init() +const decoded = m_bus_decode('68 3D 3D 68 ...') +const narrowTable = m_bus_render('68 3D 3D 68 ...', 'table', undefined, 48) +``` diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs index 2b19b32..66b3dc0 100644 --- a/wasm/src/lib.rs +++ b/wasm/src/lib.rs @@ -1,40 +1,133 @@ -use m_bus_parser::serialize_mbus_data; +use std::str::FromStr; + +use js_sys::{Error as JsError, Reflect}; +use m_bus_parser::{ + decode_hex, decode_hex_bytes, render_hex, DecodeOptions, OutputError, OutputFormat, + RenderOptions, +}; use wasm_bindgen::prelude::*; #[wasm_bindgen] -extern "C" { - fn alert(s: &str); +pub fn version() -> String { + env!("CARGO_PKG_VERSION").to_string() } +fn error_to_js(error: OutputError) -> JsValue { + let js_error = JsError::new(&error.to_string()); + js_error.set_name("MbusParserError"); + let value: JsValue = js_error.into(); + let _ = Reflect::set( + &value, + &JsValue::from_str("code"), + &JsValue::from_str(error.code()), + ); + let _ = Reflect::set( + &value, + &JsValue::from_str("layer"), + &JsValue::from_str(error.layer()), + ); + if let Some(offset) = error.byte_offset() { + let _ = Reflect::set( + &value, + &JsValue::from_str("byteOffset"), + &JsValue::from_f64(offset as f64), + ); + } + value +} + +fn parse_key(key_hex: Option<&str>) -> Result, OutputError> { + let Some(key_hex) = key_hex.filter(|value| !value.trim().is_empty()) else { + return Ok(None); + }; + let bytes = decode_hex_bytes(key_hex)?; + let length = bytes.len(); + bytes + .try_into() + .map(Some) + .map_err(|_| OutputError::InvalidOption { + option: "key", + message: format!("must contain exactly 16 bytes, received {length}"), + }) +} + +fn decode_options( + key_hex: Option<&str>, + include_enrichment: Option, +) -> Result { + Ok(DecodeOptions { + key: parse_key(key_hex)?, + include_enrichment: include_enrichment.unwrap_or(true), + }) +} + +/// Decode into the canonical schema as a native JavaScript object. #[wasm_bindgen] -pub fn version() -> String { - env!("CARGO_PKG_VERSION").to_string() +pub fn m_bus_decode( + data: &str, + key_hex: Option, + include_enrichment: Option, +) -> Result { + let decoded = decode_hex( + data, + &decode_options(key_hex.as_deref(), include_enrichment).map_err(error_to_js)?, + ) + .map_err(error_to_js)?; + serde_wasm_bindgen::to_value(&decoded).map_err(|error| { + error_to_js(OutputError::Serialization { + format: "javascript", + message: error.to_string(), + }) + }) +} + +/// Render with the shared Rust/Python/CLI output contract. +#[wasm_bindgen] +pub fn m_bus_render( + data: &str, + format: &str, + key_hex: Option, + width: Option, + include_enrichment: Option, +) -> Result { + let format = OutputFormat::from_str(format).map_err(error_to_js)?; + let options = RenderOptions { + decode: decode_options(key_hex.as_deref(), include_enrichment).map_err(error_to_js)?, + table_width: width, + }; + render_hex(data, format, &options).map_err(error_to_js) } +/// Compatibility wrapper returning errors as text. Prefer `m_bus_render`. #[wasm_bindgen] pub fn m_bus_parse(data: &str, format: &str) -> String { - serialize_mbus_data(data, format, None) + m_bus_render(data, format, None, None, None).unwrap_or_else(|value| { + js_sys::JSON::stringify(&value) + .ok() + .and_then(|value| value.as_string()) + .unwrap_or_else(|| "M-Bus rendering failed".to_string()) + }) } +/// Compatibility wrapper returning errors as text. Prefer `m_bus_render`. #[wasm_bindgen] pub fn m_bus_parse_with_key(data: &str, format: &str, key_hex: &str) -> String { - let key = parse_key(key_hex); - serialize_mbus_data(data, format, key.as_ref()) + m_bus_render(data, format, Some(key_hex.to_string()), None, None).unwrap_or_else(|value| { + js_sys::JSON::stringify(&value) + .ok() + .and_then(|value| value.as_string()) + .unwrap_or_else(|| "M-Bus rendering failed".to_string()) + }) } -fn parse_key(key_hex: &str) -> Option<[u8; 16]> { - if key_hex.is_empty() { - return None; - } - let bytes: Vec = (0..key_hex.len()) - .step_by(2) - .filter_map(|i| u8::from_str_radix(&key_hex[i..i + 2], 16).ok()) - .collect(); - if bytes.len() == 16 { - let mut arr = [0u8; 16]; - arr.copy_from_slice(&bytes); - Some(arr) - } else { - None +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn strict_key_validation_does_not_panic_on_odd_input() { + assert!(parse_key(Some("123")).is_err()); + assert!(parse_key(Some("00")).is_err()); + assert!(parse_key(Some("00112233445566778899AABBCCDDEEFF")).is_ok()); } } diff --git a/wasm/tests/web.rs b/wasm/tests/web.rs index 053747e..10603c0 100644 --- a/wasm/tests/web.rs +++ b/wasm/tests/web.rs @@ -3,6 +3,8 @@ #![cfg(target_arch = "wasm32")] extern crate wasm_bindgen_test; +use js_sys::Reflect; +use wasm_bindgen::JsValue; use wasm_bindgen_test::*; wasm_bindgen_test_configure!(run_in_browser); @@ -16,10 +18,34 @@ fn pass() { fn test_m_bus_parse_table() { let input = "68 3D 3D 68 08 01 72 00 51 20 02 82 4D 02 04 00 88 00 00 04 07 00 00 00 00 0C 15 03 00 00 00 0B 2E 00 00 00 0B 3B 00 00 00 0A 5A 88 12 0A 5E 16 05 0B 61 23 77 00 02 6C 8C 11 02 27 37 0D 0F 60 00 67 16"; let output = m_bus_parser_wasm_pack::m_bus_parse(input, "table_format"); - assert!(output.contains("Long Frame")); - assert!(output.contains("RspUd (ACD: false, DFC: false)")); + assert!(output.contains("wired")); + assert!(output.contains("RspUd")); assert!(output.contains("02205100")); - assert!(output.contains("[Wh]")); + assert!(output.lines().all(|line| line.chars().count() <= 100)); +} + +#[wasm_bindgen_test] +fn decode_returns_a_native_versioned_object() { + let input = "68 3D 3D 68 08 01 72 00 51 20 02 82 4D 02 04 00 88 00 00 04 07 00 00 00 00 0C 15 03 00 00 00 0B 2E 00 00 00 0B 3B 00 00 00 0A 5A 88 12 0A 5E 16 05 0B 61 23 77 00 02 6C 8C 11 02 27 37 0D 0F 60 00 67 16"; + let decoded = + m_bus_parser_wasm_pack::m_bus_decode(input, None, Some(false)).expect("valid frame"); + + assert_eq!( + Reflect::get(&decoded, &JsValue::from_str("schema_version")) + .unwrap() + .as_f64(), + Some(1.0) + ); + assert_eq!( + Reflect::get(&decoded, &JsValue::from_str("protocol")) + .unwrap() + .as_string() + .as_deref(), + Some("wired") + ); + assert!(Reflect::get(&decoded, &JsValue::from_str("enrichment")) + .unwrap() + .is_undefined()); } #[wasm_bindgen_test] @@ -28,7 +54,10 @@ fn test_m_bus_parse_hexview_ci_78_annotations() { let output = m_bus_parser_wasm_pack::m_bus_parse(input, "hexview"); let segments: serde_json::Value = serde_json::from_str(&output).expect("hexview should return annotated JSON"); - let segments = segments.as_array().expect("hexview should return an array"); + let segments = segments + .get("segments") + .and_then(|value| value.as_array()) + .expect("hexview should return a canonical annotation envelope"); assert!(segments.iter().any(|seg| { seg.get("kind").and_then(|v| v.as_str()) == Some("CiField") @@ -94,6 +123,14 @@ fn test_m_bus_parse_with_key_preserves_utf8_text() { let key = "0102030405060708090A0B0C0D0E0F11"; let output = m_bus_parser_wasm_pack::m_bus_parse_with_key(input, "json", key); - assert!(output.contains("\"Text\": \"m³\""), "{output}"); + assert!(output.contains("m³"), "{output}"); assert!(!output.contains("m³"), "{output}"); } + +#[wasm_bindgen_test] +fn typed_render_rejects_invalid_keys_without_panicking() { + let input = "68 03 03 68 08 01 00 09 16"; + let result = + m_bus_parser_wasm_pack::m_bus_render(input, "json", Some("123".to_string()), None, None); + assert!(result.is_err()); +} From db942e6d4af28748b3c941f9627754e4bccf2ba0 Mon Sep 17 00:00:00 2001 From: Michael Aebli Date: Sun, 26 Jul 2026 22:36:58 +0200 Subject: [PATCH 2/2] Modernize docs output presentation --- .gitattributes | 1 + .github/workflows/rust.yml | 33 +- .gitignore | 3 + docs-ui/package-lock.json | 1060 ++++++++++++++++++++++++++++++++++++ docs-ui/package.json | 18 + docs-ui/scripts/check.mjs | 79 +++ docs-ui/src/highlighter.js | 111 ++++ docs/assets/highlighter.js | 153 ++++++ docs/index.html | 388 ++++++++----- 9 files changed, 1714 insertions(+), 132 deletions(-) create mode 100644 .gitattributes create mode 100644 docs-ui/package-lock.json create mode 100644 docs-ui/package.json create mode 100644 docs-ui/scripts/check.mjs create mode 100644 docs-ui/src/highlighter.js create mode 100644 docs/assets/highlighter.js diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..41933fb --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +docs/assets/highlighter.js -diff linguist-generated=true diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index a9765b3..e7af5ca 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -90,12 +90,36 @@ jobs: run: | cd wasm cargo test --verbose + - name: Install wasm-pack + run: cargo install wasm-pack --locked + - name: Run WASM browser tests + run: | + cd wasm + wasm-pack test --headless --firefox - name: Lint WASM with Clippy run: | rustup component add clippy cd wasm cargo clippy -- -D warnings + build-docs-ui: + runs-on: ubuntu-latest + if: github.event_name == 'push' || github.event_name == 'pull_request' + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v6 + with: + node-version: '24' + cache: npm + cache-dependency-path: docs-ui/package-lock.json + - name: Build and verify syntax highlighting + working-directory: docs-ui + run: | + npm ci + npm test + - name: Check generated highlighter + run: git diff --exit-code -- docs/assets/highlighter.js + publish-library: needs: build-library runs-on: ubuntu-latest @@ -208,7 +232,7 @@ jobs: cargo publish publish-wasm: - needs: build-wasm + needs: [build-wasm, build-docs-ui] runs-on: ubuntu-latest permissions: id-token: write @@ -239,6 +263,11 @@ jobs: cd wasm/pkg npm install npm ci + - name: Build and verify docs highlighter + working-directory: docs-ui + run: | + npm ci + npm test - name: Publish to npm run: | cd wasm/pkg @@ -267,6 +296,6 @@ jobs: run: | git config user.name "github-actions" git config user.email "github-actions@github.com" - git add docs/m_bus_parser_wasm_pack.js docs/m_bus_parser_wasm_pack_bg.js docs/m_bus_parser_wasm_pack_bg.wasm docs/meter.png docs/package.json + git add docs/assets/highlighter.js docs/m_bus_parser_wasm_pack.js docs/m_bus_parser_wasm_pack_bg.js docs/m_bus_parser_wasm_pack_bg.wasm docs/meter.png docs/package.json git commit -m "Update docs wasm artifacts" || echo "No changes to commit" git push origin HEAD:main diff --git a/.gitignore b/.gitignore index 49a3732..b2c8911 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ Cargo.lock # Mac .DS_Store + +# Node build dependencies +node_modules/ diff --git a/docs-ui/package-lock.json b/docs-ui/package-lock.json new file mode 100644 index 0000000..edb074e --- /dev/null +++ b/docs-ui/package-lock.json @@ -0,0 +1,1060 @@ +{ + "name": "m-bus-parser-docs-ui", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "m-bus-parser-docs-ui", + "dependencies": { + "@shikijs/langs": "4.3.1", + "@shikijs/themes": "4.3.1", + "shiki": "4.3.1" + }, + "devDependencies": { + "esbuild": "0.28.1" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@shikijs/core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.3.1.tgz", + "integrity": "sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==", + "license": "MIT", + "dependencies": { + "@shikijs/primitive": "4.3.1", + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.3.1.tgz", + "integrity": "sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.6" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.3.1.tgz", + "integrity": "sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/langs": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.3.1.tgz", + "integrity": "sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/primitive": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.3.1.tgz", + "integrity": "sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/themes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.3.1.tgz", + "integrity": "sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/types": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.1.tgz", + "integrity": "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", + "license": "ISC" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/oniguruma-parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", + "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", + "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/shiki": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.3.1.tgz", + "integrity": "sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.3.1", + "@shikijs/engine-javascript": "4.3.1", + "@shikijs/engine-oniguruma": "4.3.1", + "@shikijs/langs": "4.3.1", + "@shikijs/themes": "4.3.1", + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docs-ui/package.json b/docs-ui/package.json new file mode 100644 index 0000000..34db801 --- /dev/null +++ b/docs-ui/package.json @@ -0,0 +1,18 @@ +{ + "name": "m-bus-parser-docs-ui", + "private": true, + "type": "module", + "scripts": { + "build": "esbuild src/highlighter.js --bundle --format=esm --minify --target=es2020 --outfile=../docs/assets/highlighter.js", + "check": "node scripts/check.mjs", + "test": "npm run build && npm run check" + }, + "dependencies": { + "@shikijs/langs": "4.3.1", + "@shikijs/themes": "4.3.1", + "shiki": "4.3.1" + }, + "devDependencies": { + "esbuild": "0.28.1" + } +} diff --git a/docs-ui/scripts/check.mjs b/docs-ui/scripts/check.mjs new file mode 100644 index 0000000..6d48c10 --- /dev/null +++ b/docs-ui/scripts/check.mjs @@ -0,0 +1,79 @@ +import { gzipSync } from 'node:zlib' +import { readFileSync } from 'node:fs' +import { resolve } from 'node:path' +import githubLightHighContrast from '@shikijs/themes/github-light-high-contrast' +import githubDarkHighContrast from '@shikijs/themes/github-dark-high-contrast' + +const REQUIRED_RATIO = 4.5 +const MAX_GZIP_BYTES = 100 * 1024 + +function channels(color) { + const match = /^#([\da-f]{6})(?:[\da-f]{2})?$/i.exec(color) + if (!match) return null + return [0, 2, 4].map((offset) => Number.parseInt(match[1].slice(offset, offset + 2), 16)) +} + +function luminance(color) { + const rgb = channels(color) + if (!rgb) return null + const linear = rgb.map((value) => { + const channel = value / 255 + return channel <= 0.04045 + ? channel / 12.92 + : ((channel + 0.055) / 1.055) ** 2.4 + }) + return 0.2126 * linear[0] + 0.7152 * linear[1] + 0.0722 * linear[2] +} + +function contrast(foreground, background) { + const foregroundLuminance = luminance(foreground) + const backgroundLuminance = luminance(background) + if (foregroundLuminance === null || backgroundLuminance === null) return null + const lighter = Math.max(foregroundLuminance, backgroundLuminance) + const darker = Math.min(foregroundLuminance, backgroundLuminance) + return (lighter + 0.05) / (darker + 0.05) +} + +function themeColors(theme) { + const colors = new Set() + if (theme.fg) colors.add(theme.fg) + for (const setting of theme.settings || []) { + if (setting.settings?.foreground) colors.add(setting.settings.foreground) + } + return colors +} + +function checkTheme(theme) { + const background = theme.bg || theme.colors?.['editor.background'] + const failures = [] + for (const color of themeColors(theme)) { + const ratio = contrast(color, background) + if (ratio !== null && ratio + Number.EPSILON < REQUIRED_RATIO) { + failures.push(`${color} on ${background}: ${ratio.toFixed(2)}:1`) + } + } + if (failures.length) { + throw new Error(`${theme.name} has sub-AA token colors:\n${failures.join('\n')}`) + } +} + +checkTheme(githubLightHighContrast) +checkTheme(githubDarkHighContrast) + +for (const [foreground, background, label] of [ + ['#4b5563', '#ffffff', 'light line numbers'], + ['#c7cdd5', '#0d1117', 'dark line numbers'], +]) { + const ratio = contrast(foreground, background) + if (ratio < REQUIRED_RATIO) { + throw new Error(`${label} contrast is ${ratio.toFixed(2)}:1`) + } +} + +const bundlePath = resolve(import.meta.dirname, '../../docs/assets/highlighter.js') +const gzipBytes = gzipSync(readFileSync(bundlePath)).byteLength +if (gzipBytes > MAX_GZIP_BYTES) { + throw new Error(`highlighter bundle is ${gzipBytes} gzip bytes; budget is ${MAX_GZIP_BYTES}`) +} + +console.log(`Syntax themes meet WCAG AA; highlighter bundle is ${gzipBytes} gzip bytes.`) diff --git a/docs-ui/src/highlighter.js b/docs-ui/src/highlighter.js new file mode 100644 index 0000000..4a1a536 --- /dev/null +++ b/docs-ui/src/highlighter.js @@ -0,0 +1,111 @@ +import json from '@shikijs/langs/json' +import yaml from '@shikijs/langs/yaml' +import csv from '@shikijs/langs/csv' +import xml from '@shikijs/langs/xml' +import githubLightHighContrast from '@shikijs/themes/github-light-high-contrast' +import githubDarkHighContrast from '@shikijs/themes/github-dark-high-contrast' +import { createHighlighterCore } from 'shiki/core' +import { createJavaScriptRegexEngine } from 'shiki/engine/javascript' + +const supportedLanguages = new Set(['json', 'yaml', 'csv', 'xml']) +const aliases = new Map([ + ['yml', 'yaml'], + ['text', 'plaintext'], + ['txt', 'plaintext'], + ['table', 'plaintext'], +]) + +let highlighterPromise + +function getHighlighter() { + highlighterPromise ??= createHighlighterCore({ + themes: [githubLightHighContrast, githubDarkHighContrast], + langs: [json, yaml, csv, xml], + engine: createJavaScriptRegexEngine(), + }) + return highlighterPromise +} + +function normalizeLanguage(language) { + const normalized = String(language || 'plaintext').toLowerCase() + return aliases.get(normalized) || normalized +} + +function createPlainCode(source) { + const pre = document.createElement('pre') + pre.className = 'code-source' + const code = document.createElement('code') + code.textContent = source + pre.appendChild(code) + return pre +} + +function createLineGutter(source) { + const gutter = document.createElement('div') + gutter.className = 'line-gutter' + gutter.setAttribute('aria-hidden', 'true') + const lineCount = Math.max(1, source.split('\n').length) + for (let line = 1; line <= lineCount; line += 1) { + const number = document.createElement('span') + number.textContent = String(line) + gutter.appendChild(number) + } + return gutter +} + +function createViewer(source, codeElement, label) { + const viewer = document.createElement('div') + viewer.className = 'code-viewer' + + const scroll = document.createElement('div') + scroll.className = 'code-scroll' + scroll.setAttribute('role', 'region') + scroll.setAttribute('aria-label', label) + scroll.tabIndex = 0 + + codeElement.classList.add('code-source') + codeElement.removeAttribute('tabindex') + scroll.append(createLineGutter(source), codeElement) + viewer.appendChild(scroll) + return viewer +} + +/** + * Render output with deterministic line numbers and a safe plaintext fallback. + * The returned promise resolves after Shiki has replaced the fallback. + */ +export async function renderCodeViewer( + container, + source, + language = 'plaintext', + label = 'Parser output', +) { + source = String(source ?? '') + const normalizedLanguage = normalizeLanguage(language) + const fallback = createViewer(source, createPlainCode(source), label) + container.replaceChildren(fallback) + + if (!supportedLanguages.has(normalizedLanguage)) return fallback + + try { + const highlighter = await getHighlighter() + const html = highlighter.codeToHtml(source, { + lang: normalizedLanguage, + themes: { + light: 'github-light-high-contrast', + dark: 'github-dark-high-contrast', + }, + defaultColor: false, + }) + const template = document.createElement('template') + template.innerHTML = html + const highlighted = template.content.querySelector('pre') + if (!highlighted || !container.contains(fallback)) return fallback + const viewer = createViewer(source, highlighted, label) + container.replaceChildren(viewer) + return viewer + } catch (error) { + console.warn('Syntax highlighting unavailable; using plaintext output.', error) + return fallback + } +} diff --git a/docs/assets/highlighter.js b/docs/assets/highlighter.js new file mode 100644 index 0000000..adec0c9 --- /dev/null +++ b/docs/assets/highlighter.js @@ -0,0 +1,153 @@ +var zn=Object.defineProperty;var yo=Object.getPrototypeOf;var ko=Reflect.get;var Hn=t=>{throw TypeError(t)};var wo=(t,e,n)=>e in t?zn(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var vo=(t,e)=>{for(var n in e)zn(t,n,{get:e[n],enumerable:!0})};var m=(t,e,n)=>wo(t,typeof e!="symbol"?e+"":e,n),zt=(t,e,n)=>e.has(t)||Hn("Cannot "+n);var M=(t,e,n)=>(zt(t,e,"read from private field"),n?n.call(t):e.get(t)),be=(t,e,n)=>e.has(t)?Hn("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n),q=(t,e,n,r)=>(zt(t,e,"write to private field"),r?r.call(t,n):e.set(t,n),n),Ht=(t,e,n)=>(zt(t,e,"access private method"),n);var Un=(t,e,n)=>ko(yo(t),n,e);var Co=Object.freeze(JSON.parse('{"displayName":"JSON","name":"json","patterns":[{"include":"#value"}],"repository":{"array":{"begin":"\\\\[","beginCaptures":{"0":{"name":"punctuation.definition.array.begin.json"}},"end":"]","endCaptures":{"0":{"name":"punctuation.definition.array.end.json"}},"name":"meta.structure.array.json","patterns":[{"include":"#value"},{"match":",","name":"punctuation.separator.array.json"},{"match":"[^]\\\\s]","name":"invalid.illegal.expected-array-separator.json"}]},"comments":{"patterns":[{"begin":"/\\\\*\\\\*(?!/)","captures":{"0":{"name":"punctuation.definition.comment.json"}},"end":"\\\\*/","name":"comment.block.documentation.json"},{"begin":"/\\\\*","captures":{"0":{"name":"punctuation.definition.comment.json"}},"end":"\\\\*/","name":"comment.block.json"},{"captures":{"1":{"name":"punctuation.definition.comment.json"}},"match":"(//).*$\\\\n?","name":"comment.line.double-slash.js"}]},"constant":{"match":"\\\\b(?:true|false|null)\\\\b","name":"constant.language.json"},"number":{"match":"-?(?:0|[1-9]\\\\d*)(?:(?:\\\\.\\\\d+)?(?:[Ee][-+]?\\\\d+)?)?","name":"constant.numeric.json"},"object":{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.dictionary.begin.json"}},"end":"}","endCaptures":{"0":{"name":"punctuation.definition.dictionary.end.json"}},"name":"meta.structure.dictionary.json","patterns":[{"include":"#objectkey"},{"include":"#comments"},{"begin":":","beginCaptures":{"0":{"name":"punctuation.separator.dictionary.key-value.json"}},"end":"(,)|(?=})","endCaptures":{"1":{"name":"punctuation.separator.dictionary.pair.json"}},"name":"meta.structure.dictionary.value.json","patterns":[{"include":"#value"},{"match":"[^,\\\\s]","name":"invalid.illegal.expected-dictionary-separator.json"}]},{"match":"[^}\\\\s]","name":"invalid.illegal.expected-dictionary-separator.json"}]},"objectkey":{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.support.type.property-name.begin.json"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.support.type.property-name.end.json"}},"name":"string.json support.type.property-name.json","patterns":[{"include":"#stringcontent"}]},"string":{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.json"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.json"}},"name":"string.quoted.double.json","patterns":[{"include":"#stringcontent"}]},"stringcontent":{"patterns":[{"match":"\\\\\\\\(?:[\\"/\\\\\\\\bfnrt]|u\\\\h{4})","name":"constant.character.escape.json"},{"match":"\\\\\\\\.","name":"invalid.illegal.unrecognized-string-escape.json"}]},"value":{"patterns":[{"include":"#constant"},{"include":"#number"},{"include":"#string"},{"include":"#array"},{"include":"#object"},{"include":"#comments"}]}},"scopeName":"source.json"}')),Wn=[Co];var _o=Object.freeze(JSON.parse(`{"displayName":"YAML","fileTypes":["yaml","yml","rviz","reek","clang-format","yaml-tmlanguage","syntax","sublime-syntax"],"firstLineMatch":"^%YAML( ?1.\\\\d+)?","name":"yaml","patterns":[{"include":"#comment"},{"include":"#property"},{"include":"#directive"},{"match":"^---","name":"entity.other.document.begin.yaml"},{"match":"^\\\\.{3}","name":"entity.other.document.end.yaml"},{"include":"#node"}],"repository":{"block-collection":{"patterns":[{"include":"#block-sequence"},{"include":"#block-mapping"}]},"block-mapping":{"patterns":[{"include":"#block-pair"}]},"block-node":{"patterns":[{"include":"#prototype"},{"include":"#block-scalar"},{"include":"#block-collection"},{"include":"#flow-scalar-plain-out"},{"include":"#flow-node"}]},"block-pair":{"patterns":[{"begin":"\\\\?","beginCaptures":{"1":{"name":"punctuation.definition.key-value.begin.yaml"}},"end":"(?=\\\\?)|^ *(:)|(:)","endCaptures":{"1":{"name":"punctuation.separator.key-value.mapping.yaml"},"2":{"name":"invalid.illegal.expected-newline.yaml"}},"name":"meta.block-mapping.yaml","patterns":[{"include":"#block-node"}]},{"begin":"(?=(?:[^-\\\\]!\\"#%\\\\&'*,:>?@\\\\[\`{|}\\\\s]|[-:?]\\\\S)([^:\\\\s]|:\\\\S|\\\\s+(?![#\\\\s]))*\\\\s*:(\\\\s|$))","end":"(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$))","patterns":[{"include":"#flow-scalar-plain-out-implicit-type"},{"begin":"[^-\\\\]!\\"#%\\\\&'*,:>?@\\\\[\`{|}\\\\s]|[-:?]\\\\S","beginCaptures":{"0":{"name":"entity.name.tag.yaml"}},"contentName":"entity.name.tag.yaml","end":"(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$))","name":"string.unquoted.plain.out.yaml"}]},{"match":":(?=\\\\s|$)","name":"punctuation.separator.key-value.mapping.yaml"}]},"block-scalar":{"begin":"(?:(\\\\|)|(>))([1-9])?([-+])?(.*\\\\n?)","beginCaptures":{"1":{"name":"keyword.control.flow.block-scalar.literal.yaml"},"2":{"name":"keyword.control.flow.block-scalar.folded.yaml"},"3":{"name":"constant.numeric.indentation-indicator.yaml"},"4":{"name":"storage.modifier.chomping-indicator.yaml"},"5":{"patterns":[{"include":"#comment"},{"match":".+","name":"invalid.illegal.expected-comment-or-newline.yaml"}]}},"end":"^(?=\\\\S)|(?!\\\\G)","patterns":[{"begin":"^( +)(?! )","end":"^(?!\\\\1|\\\\s*$)","name":"string.unquoted.block.yaml"}]},"block-sequence":{"match":"(-)(?!\\\\S)","name":"punctuation.definition.block.sequence.item.yaml"},"comment":{"begin":"(?:^([\\\\t ]*)|[\\\\t ]+)(?=#\\\\p{print}*$)","beginCaptures":{"1":{"name":"punctuation.whitespace.comment.leading.yaml"}},"end":"(?!\\\\G)","patterns":[{"begin":"#","beginCaptures":{"0":{"name":"punctuation.definition.comment.yaml"}},"end":"\\\\n","name":"comment.line.number-sign.yaml"}]},"directive":{"begin":"^%","beginCaptures":{"0":{"name":"punctuation.definition.directive.begin.yaml"}},"end":"(?=$|[\\\\t ]+($|#))","name":"meta.directive.yaml","patterns":[{"captures":{"1":{"name":"keyword.other.directive.yaml.yaml"},"2":{"name":"constant.numeric.yaml-version.yaml"}},"match":"\\\\G(YAML)[\\\\t ]+(\\\\d+\\\\.\\\\d+)"},{"captures":{"1":{"name":"keyword.other.directive.tag.yaml"},"2":{"name":"storage.type.tag-handle.yaml"},"3":{"name":"support.type.tag-prefix.yaml"}},"match":"\\\\G(TAG)(?:[\\\\t ]+(!(?:[-0-9A-Za-z]*!)?)(?:[\\\\t ]+(!(?:%\\\\h{2}|[]!#$\\\\&-;=?-\\\\[_a-z~])*|(?![]!,\\\\[{}])(?:%\\\\h{2}|[]!#$\\\\&-;=?-\\\\[_a-z~])+))?)?"},{"captures":{"1":{"name":"support.other.directive.reserved.yaml"},"2":{"name":"string.unquoted.directive-name.yaml"},"3":{"name":"string.unquoted.directive-parameter.yaml"}},"match":"\\\\G(\\\\w+)(?:[\\\\t ]+(\\\\w+)(?:[\\\\t ]+(\\\\w+))?)?"},{"match":"\\\\S+","name":"invalid.illegal.unrecognized.yaml"}]},"flow-alias":{"captures":{"1":{"name":"keyword.control.flow.alias.yaml"},"2":{"name":"punctuation.definition.alias.yaml"},"3":{"name":"variable.other.alias.yaml"},"4":{"name":"invalid.illegal.character.anchor.yaml"}},"match":"((\\\\*))([^],/\\\\[{}\\\\s]+)([^],}\\\\s]\\\\S*)?"},"flow-collection":{"patterns":[{"include":"#flow-sequence"},{"include":"#flow-mapping"}]},"flow-mapping":{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.mapping.begin.yaml"}},"end":"}","endCaptures":{"0":{"name":"punctuation.definition.mapping.end.yaml"}},"name":"meta.flow-mapping.yaml","patterns":[{"include":"#prototype"},{"match":",","name":"punctuation.separator.mapping.yaml"},{"include":"#flow-pair"}]},"flow-node":{"patterns":[{"include":"#prototype"},{"include":"#flow-alias"},{"include":"#flow-collection"},{"include":"#flow-scalar"}]},"flow-pair":{"patterns":[{"begin":"\\\\?","beginCaptures":{"0":{"name":"punctuation.definition.key-value.begin.yaml"}},"end":"(?=[],}])","name":"meta.flow-pair.explicit.yaml","patterns":[{"include":"#prototype"},{"include":"#flow-pair"},{"include":"#flow-node"},{"begin":":(?=\\\\s|$|[],\\\\[{}])","beginCaptures":{"0":{"name":"punctuation.separator.key-value.mapping.yaml"}},"end":"(?=[],}])","patterns":[{"include":"#flow-value"}]}]},{"begin":"(?=(?:[^-\\\\]!\\"#%\\\\&'*,:>?@\\\\[\`{|}\\\\s]|[-:?][^],\\\\[{}\\\\s])([^],:\\\\[{}\\\\s]|:[^],\\\\[{}\\\\s]|\\\\s+(?![#\\\\s]))*\\\\s*:(\\\\s|$))","end":"(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$)|\\\\s*:[],\\\\[{}]|\\\\s*[],\\\\[{}])","name":"meta.flow-pair.key.yaml","patterns":[{"include":"#flow-scalar-plain-in-implicit-type"},{"begin":"[^-\\\\]!\\"#%\\\\&'*,:>?@\\\\[\`{|}\\\\s]|[-:?][^],\\\\[{}\\\\s]","beginCaptures":{"0":{"name":"entity.name.tag.yaml"}},"contentName":"entity.name.tag.yaml","end":"(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$)|\\\\s*:[],\\\\[{}]|\\\\s*[],\\\\[{}])","name":"string.unquoted.plain.in.yaml"}]},{"include":"#flow-node"},{"begin":":(?=\\\\s|$|[],\\\\[{}])","captures":{"0":{"name":"punctuation.separator.key-value.mapping.yaml"}},"end":"(?=[],}])","name":"meta.flow-pair.yaml","patterns":[{"include":"#flow-value"}]}]},"flow-scalar":{"patterns":[{"include":"#flow-scalar-double-quoted"},{"include":"#flow-scalar-single-quoted"},{"include":"#flow-scalar-plain-in"}]},"flow-scalar-double-quoted":{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.yaml"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.yaml"}},"name":"string.quoted.double.yaml","patterns":[{"match":"\\\\\\\\([ \\"/0LN\\\\\\\\_abefnprtv]|x\\\\d\\\\d|u\\\\d{4}|U\\\\d{8})","name":"constant.character.escape.yaml"},{"match":"\\\\\\\\\\\\n","name":"constant.character.escape.double-quoted.newline.yaml"}]},"flow-scalar-plain-in":{"patterns":[{"include":"#flow-scalar-plain-in-implicit-type"},{"begin":"[^-\\\\]!\\"#%\\\\&'*,:>?@\\\\[\`{|}\\\\s]|[-:?][^],\\\\[{}\\\\s]","end":"(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$)|\\\\s*:[],\\\\[{}]|\\\\s*[],\\\\[{}])","name":"string.unquoted.plain.in.yaml"}]},"flow-scalar-plain-in-implicit-type":{"patterns":[{"captures":{"1":{"name":"constant.language.null.yaml"},"2":{"name":"constant.language.boolean.yaml"},"3":{"name":"constant.numeric.integer.yaml"},"4":{"name":"constant.numeric.float.yaml"},"5":{"name":"constant.other.timestamp.yaml"},"6":{"name":"constant.language.value.yaml"},"7":{"name":"constant.language.merge.yaml"}},"match":"(?:(null|Null|NULL|~)|([Yy]|yes|Yes|YES|[Nn]|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF)|([-+]?0b[01_]+|[-+]?0[0-7_]+|[-+]?(?:0|[1-9][0-9_]*)|[-+]?0x[_\\\\h]+|[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)|([-+]?(?:[0-9][0-9_]*)?\\\\.[.0-9]*(?:[Ee][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))|(\\\\d{4}-\\\\d{2}-\\\\d{2}|\\\\d{4}-\\\\d{1,2}-\\\\d{1,2}(?:[Tt]|[\\\\t ]+)\\\\d{1,2}:\\\\d{2}:\\\\d{2}(?:\\\\.\\\\d*)?(?:[\\\\t ]*Z|[-+]\\\\d{1,2}(?::\\\\d{1,2})?)?)|(=)|(<<))(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$)|\\\\s*:[],\\\\[{}]|\\\\s*[],\\\\[{}])"}]},"flow-scalar-plain-out":{"patterns":[{"include":"#flow-scalar-plain-out-implicit-type"},{"begin":"[^-\\\\]!\\"#%\\\\&'*,:>?@\\\\[\`{|}\\\\s]|[-:?]\\\\S","end":"(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$))","name":"string.unquoted.plain.out.yaml"}]},"flow-scalar-plain-out-implicit-type":{"patterns":[{"captures":{"1":{"name":"constant.language.null.yaml"},"2":{"name":"constant.language.boolean.yaml"},"3":{"name":"constant.numeric.integer.yaml"},"4":{"name":"constant.numeric.float.yaml"},"5":{"name":"constant.other.timestamp.yaml"},"6":{"name":"constant.language.value.yaml"},"7":{"name":"constant.language.merge.yaml"}},"match":"(?:(null|Null|NULL|~)|([Yy]|yes|Yes|YES|[Nn]|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF)|([-+]?0b[01_]+|[-+]?0[0-7_]+|[-+]?(?:0|[1-9][0-9_]*)|[-+]?0x[_\\\\h]+|[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)|([-+]?(?:[0-9][0-9_]*)?\\\\.[.0-9]*(?:[Ee][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))|(\\\\d{4}-\\\\d{2}-\\\\d{2}|\\\\d{4}-\\\\d{1,2}-\\\\d{1,2}(?:[Tt]|[\\\\t ]+)\\\\d{1,2}:\\\\d{2}:\\\\d{2}(?:\\\\.\\\\d*)?(?:[\\\\t ]*Z|[-+]\\\\d{1,2}(?::\\\\d{1,2})?)?)|(=)|(<<))(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$))"}]},"flow-scalar-single-quoted":{"begin":"'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.yaml"}},"end":"'(?!')","endCaptures":{"0":{"name":"punctuation.definition.string.end.yaml"}},"name":"string.quoted.single.yaml","patterns":[{"match":"''","name":"constant.character.escape.single-quoted.yaml"}]},"flow-sequence":{"begin":"\\\\[","beginCaptures":{"0":{"name":"punctuation.definition.sequence.begin.yaml"}},"end":"]","endCaptures":{"0":{"name":"punctuation.definition.sequence.end.yaml"}},"name":"meta.flow-sequence.yaml","patterns":[{"include":"#prototype"},{"match":",","name":"punctuation.separator.sequence.yaml"},{"include":"#flow-pair"},{"include":"#flow-node"}]},"flow-value":{"patterns":[{"begin":"\\\\G(?![],}])","end":"(?=[],}])","name":"meta.flow-pair.value.yaml","patterns":[{"include":"#flow-node"}]}]},"node":{"patterns":[{"include":"#block-node"}]},"property":{"begin":"(?=[!\\\\&])","end":"(?!\\\\G)","name":"meta.property.yaml","patterns":[{"captures":{"1":{"name":"keyword.control.property.anchor.yaml"},"2":{"name":"punctuation.definition.anchor.yaml"},"3":{"name":"entity.name.type.anchor.yaml"},"4":{"name":"invalid.illegal.character.anchor.yaml"}},"match":"\\\\G((&))([^],/\\\\[{}\\\\s]+)(\\\\S+)?"},{"match":"\\\\G!(?:<(?:%\\\\h{2}|[]!#$\\\\&-;=?-\\\\[_a-z~])+>|(?:[-0-9A-Za-z]*!)?(?:%\\\\h{2}|[#$\\\\&-+\\\\--;=?-Z_a-z~])+|)(?=[\\\\t ]|$)","name":"storage.type.tag-handle.yaml"},{"match":"\\\\S+","name":"invalid.illegal.tag-handle.yaml"}]},"prototype":{"patterns":[{"include":"#comment"},{"include":"#property"}]}},"scopeName":"source.yaml","aliases":["yml"]}`)),qn=[_o];var So=Object.freeze(JSON.parse('{"displayName":"CSV","fileTypes":["csv"],"name":"csv","patterns":[{"captures":{"1":{"name":"rainbow1"},"2":{"name":"keyword.rainbow2"},"3":{"name":"entity.name.function.rainbow3"},"4":{"name":"comment.rainbow4"},"5":{"name":"string.rainbow5"},"6":{"name":"variable.parameter.rainbow6"},"7":{"name":"constant.numeric.rainbow7"},"8":{"name":"entity.name.type.rainbow8"},"9":{"name":"markup.bold.rainbow9"},"10":{"name":"invalid.rainbow10"}},"match":"( *\\"(?:[^\\"]*\\"\\")*[^\\"]*\\" *(?:,|$)|[^,]*(?:,|$))?( *\\"(?:[^\\"]*\\"\\")*[^\\"]*\\" *(?:,|$)|[^,]*(?:,|$))?( *\\"(?:[^\\"]*\\"\\")*[^\\"]*\\" *(?:,|$)|[^,]*(?:,|$))?( *\\"(?:[^\\"]*\\"\\")*[^\\"]*\\" *(?:,|$)|[^,]*(?:,|$))?( *\\"(?:[^\\"]*\\"\\")*[^\\"]*\\" *(?:,|$)|[^,]*(?:,|$))?( *\\"(?:[^\\"]*\\"\\")*[^\\"]*\\" *(?:,|$)|[^,]*(?:,|$))?( *\\"(?:[^\\"]*\\"\\")*[^\\"]*\\" *(?:,|$)|[^,]*(?:,|$))?( *\\"(?:[^\\"]*\\"\\")*[^\\"]*\\" *(?:,|$)|[^,]*(?:,|$))?( *\\"(?:[^\\"]*\\"\\")*[^\\"]*\\" *(?:,|$)|[^,]*(?:,|$))?( *\\"(?:[^\\"]*\\"\\")*[^\\"]*\\" *(?:,|$)|[^,]*(?:,|$))?","name":"rainbowgroup"}],"scopeName":"text.csv"}')),Vn=[So];var xo=Object.freeze(JSON.parse(`{"displayName":"Java","name":"java","patterns":[{"begin":"\\\\b(package)\\\\b\\\\s*","beginCaptures":{"1":{"name":"keyword.other.package.java"}},"contentName":"storage.modifier.package.java","end":"\\\\s*(;)","endCaptures":{"1":{"name":"punctuation.terminator.java"}},"name":"meta.package.java","patterns":[{"include":"#comments"},{"match":"(?<=\\\\.)\\\\s*\\\\.|\\\\.(?=\\\\s*;)","name":"invalid.illegal.character_not_allowed_here.java"},{"match":"(?","endCaptures":{"0":{"name":"punctuation.bracket.angle.java"}},"patterns":[{"match":"\\\\b(extends|super)\\\\b","name":"storage.modifier.$1.java"},{"captures":{"1":{"name":"storage.type.java"}},"match":"(?>>?|[\\\\^~])","name":"keyword.operator.bitwise.java"},{"match":"(([\\\\&^|]|<<|>>>?)=)","name":"keyword.operator.assignment.bitwise.java"},{"match":"(===?|!=|<=|>=|<>|[<>])","name":"keyword.operator.comparison.java"},{"match":"([-%*+/]=)","name":"keyword.operator.assignment.arithmetic.java"},{"match":"(=)","name":"keyword.operator.assignment.java"},{"match":"(--|\\\\+\\\\+)","name":"keyword.operator.increment-decrement.java"},{"match":"([-%*+/])","name":"keyword.operator.arithmetic.java"},{"match":"(!|&&|\\\\|\\\\|)","name":"keyword.operator.logical.java"},{"match":"([\\\\&|])","name":"keyword.operator.bitwise.java"},{"match":"\\\\b(const|goto)\\\\b","name":"keyword.reserved.java"}]},"lambda-expression":{"patterns":[{"match":"->","name":"storage.type.function.arrow.java"}]},"member-variables":{"begin":"(?=private|protected|public|native|synchronized|abstract|threadsafe|transient|static|final)","end":"(?=[;=])","patterns":[{"include":"#storage-modifiers"},{"include":"#variables"},{"include":"#primitive-arrays"},{"include":"#object-types"}]},"method-call":{"begin":"(\\\\.)\\\\s*([$A-Z_a-z][$\\\\w]*)\\\\s*(\\\\()","beginCaptures":{"1":{"name":"punctuation.separator.period.java"},"2":{"name":"entity.name.function.java"},"3":{"name":"punctuation.definition.parameters.begin.bracket.round.java"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.parameters.end.bracket.round.java"}},"name":"meta.method-call.java","patterns":[{"include":"#code"}]},"methods":{"begin":"(?!new)(?=[<\\\\w].*\\\\s+)(?=([^/=]|/(?!/))+\\\\()","end":"(})|(?=;)","endCaptures":{"1":{"name":"punctuation.section.method.end.bracket.curly.java"}},"name":"meta.method.java","patterns":[{"include":"#storage-modifiers"},{"begin":"(\\\\w+)\\\\s*(\\\\()","beginCaptures":{"1":{"name":"entity.name.function.java"},"2":{"name":"punctuation.definition.parameters.begin.bracket.round.java"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.parameters.end.bracket.round.java"}},"name":"meta.method.identifier.java","patterns":[{"include":"#parameters"},{"include":"#parens"},{"include":"#comments"}]},{"include":"#generics"},{"begin":"(?=\\\\w.*\\\\s+\\\\w+\\\\s*\\\\()","end":"(?=\\\\s+\\\\w+\\\\s*\\\\()","name":"meta.method.return-type.java","patterns":[{"include":"#all-types"},{"include":"#parens"},{"include":"#comments"}]},{"include":"#throws"},{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.method.begin.bracket.curly.java"}},"contentName":"meta.method.body.java","end":"(?=})","patterns":[{"include":"#code"}]},{"include":"#comments"}]},"module":{"begin":"((open)\\\\s)?(module)\\\\s+(\\\\w+)","beginCaptures":{"1":{"name":"storage.modifier.java"},"3":{"name":"storage.modifier.java"},"4":{"name":"entity.name.type.module.java"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.module.end.bracket.curly.java"}},"name":"meta.module.java","patterns":[{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.module.begin.bracket.curly.java"}},"contentName":"meta.module.body.java","end":"(?=})","patterns":[{"include":"#comments"},{"include":"#comments-javadoc"},{"match":"\\\\b(requires|transitive|exports|opens|to|uses|provides|with)\\\\b","name":"keyword.module.java"}]}]},"numbers":{"patterns":[{"match":"\\\\b(?)?(\\\\()","beginCaptures":{"1":{"name":"storage.modifier.java"},"2":{"name":"entity.name.type.record.java"},"3":{"patterns":[{"include":"#generics"}]},"4":{"name":"punctuation.definition.parameters.begin.bracket.round.java"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.parameters.end.bracket.round.java"}},"name":"meta.record.identifier.java","patterns":[{"include":"#code"}]},{"begin":"(implements)\\\\s","beginCaptures":{"1":{"name":"storage.modifier.implements.java"}},"end":"(?=\\\\s*\\\\{)","name":"meta.definition.class.implemented.interfaces.java","patterns":[{"include":"#object-types-inherited"},{"include":"#comments"}]},{"include":"#record-body"}]},"record-body":{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.class.begin.bracket.curly.java"}},"end":"(?=})","name":"meta.record.body.java","patterns":[{"include":"#record-constructor"},{"include":"#class-body"}]},"record-constructor":{"begin":"(?!new)(?=[<\\\\w].*\\\\s+)(?=([^(/=]|/(?!/))+(?=\\\\{))","end":"(})|(?=;)","endCaptures":{"1":{"name":"punctuation.section.method.end.bracket.curly.java"}},"name":"meta.method.java","patterns":[{"include":"#storage-modifiers"},{"begin":"(\\\\w+)","beginCaptures":{"1":{"name":"entity.name.function.java"}},"end":"(?=\\\\s*\\\\{)","name":"meta.method.identifier.java","patterns":[{"include":"#comments"}]},{"include":"#comments"},{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.method.begin.bracket.curly.java"}},"contentName":"meta.method.body.java","end":"(?=})","patterns":[{"include":"#code"}]}]},"static-initializer":{"patterns":[{"include":"#anonymous-block-and-instance-initializer"},{"match":"static","name":"storage.modifier.java"}]},"storage-modifiers":{"match":"\\\\b(public|private|protected|static|final|native|synchronized|abstract|threadsafe|transient|volatile|default|strictfp|sealed|non-sealed)\\\\b","name":"storage.modifier.java"},"strings":{"patterns":[{"begin":"\\"\\"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.java"}},"end":"\\"\\"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.java"}},"name":"string.quoted.triple.java","patterns":[{"match":"(\\\\\\\\\\"\\"\\")(?!\\")|(\\\\\\\\.)","name":"constant.character.escape.java"}]},{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.java"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.java"}},"name":"string.quoted.double.java","patterns":[{"match":"\\\\\\\\.","name":"constant.character.escape.java"}]},{"begin":"'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.java"}},"end":"'","endCaptures":{"0":{"name":"punctuation.definition.string.end.java"}},"name":"string.quoted.single.java","patterns":[{"match":"\\\\\\\\.","name":"constant.character.escape.java"}]}]},"throws":{"begin":"throws","beginCaptures":{"0":{"name":"storage.modifier.java"}},"end":"(?=[;{])","name":"meta.throwables.java","patterns":[{"match":",","name":"punctuation.separator.delimiter.java"},{"match":"[$A-Z_a-z][$.0-9A-Z_a-z]*","name":"storage.type.java"},{"include":"#comments"}]},"try-catch-finally":{"patterns":[{"begin":"\\\\btry\\\\b","beginCaptures":{"0":{"name":"keyword.control.try.java"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.try.end.bracket.curly.java"}},"name":"meta.try.java","patterns":[{"begin":"\\\\(","beginCaptures":{"0":{"name":"punctuation.section.try.resources.begin.bracket.round.java"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.section.try.resources.end.bracket.round.java"}},"name":"meta.try.resources.java","patterns":[{"include":"#code"}]},{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.try.begin.bracket.curly.java"}},"contentName":"meta.try.body.java","end":"(?=})","patterns":[{"include":"#code"}]}]},{"begin":"\\\\b(catch)\\\\b","beginCaptures":{"1":{"name":"keyword.control.catch.java"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.catch.end.bracket.curly.java"}},"name":"meta.catch.java","patterns":[{"include":"#comments"},{"begin":"\\\\(","beginCaptures":{"0":{"name":"punctuation.definition.parameters.begin.bracket.round.java"}},"contentName":"meta.catch.parameters.java","end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.parameters.end.bracket.round.java"}},"patterns":[{"include":"#comments"},{"include":"#storage-modifiers"},{"begin":"[$A-Z_a-z][$.0-9A-Z_a-z]*","beginCaptures":{"0":{"name":"storage.type.java"}},"end":"(\\\\|)|(?=\\\\))","endCaptures":{"1":{"name":"punctuation.catch.separator.java"}},"patterns":[{"include":"#comments"},{"captures":{"0":{"name":"variable.parameter.java"}},"match":"\\\\w+"}]}]},{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.catch.begin.bracket.curly.java"}},"contentName":"meta.catch.body.java","end":"(?=})","patterns":[{"include":"#code"}]}]},{"begin":"\\\\bfinally\\\\b","beginCaptures":{"0":{"name":"keyword.control.finally.java"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.finally.end.bracket.curly.java"}},"name":"meta.finally.java","patterns":[{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.finally.begin.bracket.curly.java"}},"contentName":"meta.finally.body.java","end":"(?=})","patterns":[{"include":"#code"}]}]}]},"variables":{"begin":"(?=\\\\b((void|boolean|byte|char|short|int|float|long|double)|(?>(\\\\w+\\\\.)*[A-Z_]+\\\\w*))\\\\b\\\\s*(<[],.<>?\\\\[\\\\w\\\\s]*>)?\\\\s*((\\\\[])*)?\\\\s+[$A-Z_a-z][$\\\\w]*([]$,\\\\[\\\\w][],\\\\[\\\\w\\\\s]*)?\\\\s*([:;=]))","end":"(?=[:;=])","name":"meta.definition.variable.java","patterns":[{"captures":{"1":{"name":"variable.other.definition.java"}},"match":"([$A-Z_a-z][$\\\\w]*)(?=\\\\s*(\\\\[])*\\\\s*([,:;=]))"},{"include":"#all-types"},{"include":"#code"}]},"variables-local":{"begin":"(?=\\\\b(var)\\\\b\\\\s+[$A-Z_a-z][$\\\\w]*\\\\s*([:;=]))","end":"(?=[:;=])","name":"meta.definition.variable.local.java","patterns":[{"match":"\\\\bvar\\\\b","name":"storage.type.local.java"},{"captures":{"1":{"name":"variable.other.definition.java"}},"match":"([$A-Z_a-z][$\\\\w]*)(?=\\\\s*(\\\\[])*\\\\s*([:;=]))"},{"include":"#code"}]}},"scopeName":"source.java"}`)),Zn=[xo];var Io=Object.freeze(JSON.parse(`{"displayName":"XML","name":"xml","patterns":[{"begin":"(<\\\\?)\\\\s*([-0-9A-Z_a-z]+)","captures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"entity.name.tag.xml"}},"end":"(\\\\?>)","name":"meta.tag.preprocessor.xml","patterns":[{"match":" ([-A-Za-z]+)","name":"entity.other.attribute-name.xml"},{"include":"#doublequotedString"},{"include":"#singlequotedString"}]},{"begin":"()","name":"meta.tag.sgml.doctype.xml","patterns":[{"include":"#internalSubset"}]},{"include":"#comments"},{"begin":"(<)((?:([-0-9A-Z_a-z]+)(:))?([-0-:A-Z_a-z]+))(?=(\\\\s[^>]*)?>)","beginCaptures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"entity.name.tag.xml"},"3":{"name":"entity.name.tag.namespace.xml"},"4":{"name":"punctuation.separator.namespace.xml"},"5":{"name":"entity.name.tag.localname.xml"}},"end":"(>)()","endCaptures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"punctuation.definition.tag.xml"},"3":{"name":"entity.name.tag.xml"},"4":{"name":"entity.name.tag.namespace.xml"},"5":{"name":"punctuation.separator.namespace.xml"},"6":{"name":"entity.name.tag.localname.xml"},"7":{"name":"punctuation.definition.tag.xml"}},"name":"meta.tag.no-content.xml","patterns":[{"include":"#tagStuff"}]},{"begin":"()","name":"meta.tag.xml","patterns":[{"include":"#tagStuff"}]},{"include":"#entity"},{"include":"#bare-ampersand"},{"begin":"<%@","beginCaptures":{"0":{"name":"punctuation.section.embedded.begin.xml"}},"end":"%>","endCaptures":{"0":{"name":"punctuation.section.embedded.end.xml"}},"name":"source.java-props.embedded.xml","patterns":[{"match":"page|include|taglib","name":"keyword.other.page-props.xml"}]},{"begin":"<%[!=]?(?!--)","beginCaptures":{"0":{"name":"punctuation.section.embedded.begin.xml"}},"end":"(?!--)%>","endCaptures":{"0":{"name":"punctuation.section.embedded.end.xml"}},"name":"source.java.embedded.xml","patterns":[{"include":"source.java"}]},{"begin":"","endCaptures":{"0":{"name":"punctuation.definition.string.end.xml"}},"name":"string.unquoted.cdata.xml"}],"repository":{"EntityDecl":{"begin":"()","patterns":[{"include":"#doublequotedString"},{"include":"#singlequotedString"}]},"bare-ampersand":{"match":"&","name":"invalid.illegal.bad-ampersand.xml"},"comments":{"patterns":[{"begin":"<%--","captures":{"0":{"name":"punctuation.definition.comment.xml"},"end":"--%>","name":"comment.block.xml"}},{"begin":"","name":"comment.block.xml","patterns":[{"begin":"--(?!>)","captures":{"0":{"name":"invalid.illegal.bad-comments-or-CDATA.xml"}}}]}]},"doublequotedString":{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.xml"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.xml"}},"name":"string.quoted.double.xml","patterns":[{"include":"#entity"},{"include":"#bare-ampersand"}]},"entity":{"captures":{"1":{"name":"punctuation.definition.constant.xml"},"3":{"name":"punctuation.definition.constant.xml"}},"match":"(&)([:A-Z_a-z][-.0-:A-Z_a-z]*|#[0-9]+|#x\\\\h+)(;)","name":"constant.character.entity.xml"},"internalSubset":{"begin":"(\\\\[)","captures":{"1":{"name":"punctuation.definition.constant.xml"}},"end":"(])","name":"meta.internalsubset.xml","patterns":[{"include":"#EntityDecl"},{"include":"#parameterEntity"},{"include":"#comments"}]},"parameterEntity":{"captures":{"1":{"name":"punctuation.definition.constant.xml"},"3":{"name":"punctuation.definition.constant.xml"}},"match":"(%)([:A-Z_a-z][-.0-:A-Z_a-z]*)(;)","name":"constant.character.parameter-entity.xml"},"singlequotedString":{"begin":"'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.xml"}},"end":"'","endCaptures":{"0":{"name":"punctuation.definition.string.end.xml"}},"name":"string.quoted.single.xml","patterns":[{"include":"#entity"},{"include":"#bare-ampersand"}]},"tagStuff":{"patterns":[{"captures":{"1":{"name":"entity.other.attribute-name.namespace.xml"},"2":{"name":"entity.other.attribute-name.xml"},"3":{"name":"punctuation.separator.namespace.xml"},"4":{"name":"entity.other.attribute-name.localname.xml"}},"match":"(?:^|\\\\s+)(?:([-.\\\\w]+)((:)))?([-.:\\\\w]+)\\\\s*="},{"include":"#doublequotedString"},{"include":"#singlequotedString"}]}},"scopeName":"text.xml","embeddedLangs":["java"]}`)),Xn=[...Zn,Io];var Yn=Object.freeze(JSON.parse('{"colors":{"activityBar.activeBorder":"#ef5b48","activityBar.background":"#ffffff","activityBar.border":"#20252c","activityBar.foreground":"#0e1116","activityBar.inactiveForeground":"#0e1116","activityBarBadge.background":"#0349b4","activityBarBadge.foreground":"#ffffff","badge.background":"#0349b4","badge.foreground":"#ffffff","breadcrumb.activeSelectionForeground":"#0e1116","breadcrumb.focusForeground":"#0e1116","breadcrumb.foreground":"#0e1116","breadcrumbPicker.background":"#ffffff","button.background":"#055d20","button.foreground":"#ffffff","button.hoverBackground":"#024c1a","button.secondaryBackground":"#acb6c0","button.secondaryForeground":"#0e1116","button.secondaryHoverBackground":"#ced5dc","checkbox.background":"#e7ecf0","checkbox.border":"#20252c","debugConsole.errorForeground":"#a0111f","debugConsole.infoForeground":"#4b535d","debugConsole.sourceForeground":"#744500","debugConsole.warningForeground":"#603700","debugConsoleInputIcon.foreground":"#512598","debugIcon.breakpointForeground":"#a0111f","debugTokenExpression.boolean":"#024c1a","debugTokenExpression.error":"#86061d","debugTokenExpression.name":"#023b95","debugTokenExpression.number":"#024c1a","debugTokenExpression.string":"#032563","debugTokenExpression.value":"#032563","debugToolBar.background":"#ffffff","descriptionForeground":"#0e1116","diffEditor.insertedLineBackground":"#82e5964d","diffEditor.insertedTextBackground":"#43c66380","diffEditor.removedLineBackground":"#ffc1bc4d","diffEditor.removedTextBackground":"#ee5a5d66","dropdown.background":"#ffffff","dropdown.border":"#20252c","dropdown.foreground":"#0e1116","dropdown.listBackground":"#ffffff","editor.background":"#ffffff","editor.findMatchBackground":"#744500","editor.findMatchHighlightBackground":"#f0ce5380","editor.focusedStackFrameHighlightBackground":"#26a148","editor.foldBackground":"#66707b1a","editor.foreground":"#0e1116","editor.inactiveSelectionBackground":"#66707b","editor.lineHighlightBackground":"#e7ecf0","editor.linkedEditingBackground":"#0349b412","editor.selectionBackground":"#0e1116","editor.selectionForeground":"#ffffff","editor.selectionHighlightBackground":"#26a14840","editor.stackFrameHighlightBackground":"#b58407","editor.wordHighlightBackground":"#e7ecf080","editor.wordHighlightBorder":"#acb6c099","editor.wordHighlightStrongBackground":"#acb6c04d","editor.wordHighlightStrongBorder":"#acb6c099","editorBracketHighlight.foreground1":"#0349b4","editorBracketHighlight.foreground2":"#055d20","editorBracketHighlight.foreground3":"#744500","editorBracketHighlight.foreground4":"#a0111f","editorBracketHighlight.foreground5":"#971368","editorBracketHighlight.foreground6":"#622cbc","editorBracketHighlight.unexpectedBracket.foreground":"#0e1116","editorBracketMatch.background":"#26a14840","editorBracketMatch.border":"#26a14899","editorCursor.foreground":"#0349b4","editorGroup.border":"#20252c","editorGroupHeader.tabsBackground":"#ffffff","editorGroupHeader.tabsBorder":"#20252c","editorGutter.addedBackground":"#26a148","editorGutter.deletedBackground":"#ee5a5d","editorGutter.modifiedBackground":"#b58407","editorIndentGuide.activeBackground":"#0e11163d","editorIndentGuide.background":"#0e11161f","editorInlayHint.background":"#acb6c033","editorInlayHint.foreground":"#0e1116","editorInlayHint.paramBackground":"#acb6c033","editorInlayHint.paramForeground":"#0e1116","editorInlayHint.typeBackground":"#acb6c033","editorInlayHint.typeForeground":"#0e1116","editorLineNumber.activeForeground":"#0e1116","editorLineNumber.foreground":"#88929d","editorOverviewRuler.border":"#ffffff","editorWhitespace.foreground":"#acb6c0","editorWidget.background":"#ffffff","errorForeground":"#a0111f","focusBorder":"#0349b4","foreground":"#0e1116","gitDecoration.addedResourceForeground":"#055d20","gitDecoration.conflictingResourceForeground":"#873800","gitDecoration.deletedResourceForeground":"#a0111f","gitDecoration.ignoredResourceForeground":"#66707b","gitDecoration.modifiedResourceForeground":"#744500","gitDecoration.submoduleResourceForeground":"#0e1116","gitDecoration.untrackedResourceForeground":"#055d20","icon.foreground":"#0e1116","input.background":"#ffffff","input.border":"#20252c","input.foreground":"#0e1116","input.placeholderForeground":"#66707b","keybindingLabel.foreground":"#0e1116","list.activeSelectionBackground":"#acb6c033","list.activeSelectionForeground":"#0e1116","list.focusBackground":"#dff7ff","list.focusForeground":"#0e1116","list.highlightForeground":"#0349b4","list.hoverBackground":"#e7ecf0","list.hoverForeground":"#0e1116","list.inactiveFocusBackground":"#dff7ff","list.inactiveSelectionBackground":"#acb6c033","list.inactiveSelectionForeground":"#0e1116","minimapSlider.activeBackground":"#88929d47","minimapSlider.background":"#88929d33","minimapSlider.hoverBackground":"#88929d3d","notificationCenterHeader.background":"#e7ecf0","notificationCenterHeader.foreground":"#0e1116","notifications.background":"#ffffff","notifications.border":"#20252c","notifications.foreground":"#0e1116","notificationsErrorIcon.foreground":"#a0111f","notificationsInfoIcon.foreground":"#0349b4","notificationsWarningIcon.foreground":"#744500","panel.background":"#ffffff","panel.border":"#20252c","panelInput.border":"#20252c","panelTitle.activeBorder":"#ef5b48","panelTitle.activeForeground":"#0e1116","panelTitle.inactiveForeground":"#0e1116","pickerGroup.border":"#20252c","pickerGroup.foreground":"#0e1116","progressBar.background":"#0349b4","quickInput.background":"#ffffff","quickInput.foreground":"#0e1116","scrollbar.shadow":"#66707b33","scrollbarSlider.activeBackground":"#88929d47","scrollbarSlider.background":"#88929d33","scrollbarSlider.hoverBackground":"#88929d3d","settings.headerForeground":"#0e1116","settings.modifiedItemIndicator":"#b58407","sideBar.background":"#ffffff","sideBar.border":"#20252c","sideBar.foreground":"#0e1116","sideBarSectionHeader.background":"#ffffff","sideBarSectionHeader.border":"#20252c","sideBarSectionHeader.foreground":"#0e1116","sideBarTitle.foreground":"#0e1116","statusBar.background":"#ffffff","statusBar.border":"#20252c","statusBar.debuggingBackground":"#a0111f","statusBar.debuggingForeground":"#ffffff","statusBar.focusBorder":"#0349b480","statusBar.foreground":"#0e1116","statusBar.noFolderBackground":"#ffffff","statusBarItem.activeBackground":"#0e11161f","statusBarItem.focusBorder":"#0349b4","statusBarItem.hoverBackground":"#0e111614","statusBarItem.prominentBackground":"#acb6c033","statusBarItem.remoteBackground":"#e7ecf0","statusBarItem.remoteForeground":"#0e1116","symbolIcon.arrayForeground":"#702c00","symbolIcon.booleanForeground":"#023b95","symbolIcon.classForeground":"#702c00","symbolIcon.colorForeground":"#032563","symbolIcon.constantForeground":"#024c1a","symbolIcon.constructorForeground":"#341763","symbolIcon.enumeratorForeground":"#702c00","symbolIcon.enumeratorMemberForeground":"#023b95","symbolIcon.eventForeground":"#4b535d","symbolIcon.fieldForeground":"#702c00","symbolIcon.fileForeground":"#603700","symbolIcon.folderForeground":"#603700","symbolIcon.functionForeground":"#512598","symbolIcon.interfaceForeground":"#702c00","symbolIcon.keyForeground":"#023b95","symbolIcon.keywordForeground":"#86061d","symbolIcon.methodForeground":"#512598","symbolIcon.moduleForeground":"#86061d","symbolIcon.namespaceForeground":"#86061d","symbolIcon.nullForeground":"#023b95","symbolIcon.numberForeground":"#024c1a","symbolIcon.objectForeground":"#702c00","symbolIcon.operatorForeground":"#032563","symbolIcon.packageForeground":"#702c00","symbolIcon.propertyForeground":"#702c00","symbolIcon.referenceForeground":"#023b95","symbolIcon.snippetForeground":"#023b95","symbolIcon.stringForeground":"#032563","symbolIcon.structForeground":"#702c00","symbolIcon.textForeground":"#032563","symbolIcon.typeParameterForeground":"#032563","symbolIcon.unitForeground":"#023b95","symbolIcon.variableForeground":"#702c00","tab.activeBackground":"#ffffff","tab.activeBorder":"#ffffff","tab.activeBorderTop":"#ef5b48","tab.activeForeground":"#0e1116","tab.border":"#20252c","tab.hoverBackground":"#ffffff","tab.inactiveBackground":"#ffffff","tab.inactiveForeground":"#0e1116","tab.unfocusedActiveBorder":"#ffffff","tab.unfocusedActiveBorderTop":"#20252c","tab.unfocusedHoverBackground":"#e7ecf0","terminal.ansiBlack":"#0e1116","terminal.ansiBlue":"#0349b4","terminal.ansiBrightBlack":"#4b535d","terminal.ansiBrightBlue":"#1168e3","terminal.ansiBrightCyan":"#3192aa","terminal.ansiBrightGreen":"#055d20","terminal.ansiBrightMagenta":"#844ae7","terminal.ansiBrightRed":"#86061d","terminal.ansiBrightWhite":"#88929d","terminal.ansiBrightYellow":"#4e2c00","terminal.ansiCyan":"#1b7c83","terminal.ansiGreen":"#024c1a","terminal.ansiMagenta":"#622cbc","terminal.ansiRed":"#a0111f","terminal.ansiWhite":"#66707b","terminal.ansiYellow":"#3f2200","terminal.foreground":"#0e1116","textBlockQuote.background":"#ffffff","textBlockQuote.border":"#20252c","textCodeBlock.background":"#acb6c033","textLink.activeForeground":"#0349b4","textLink.foreground":"#0349b4","textPreformat.background":"#acb6c033","textPreformat.foreground":"#0e1116","textSeparator.foreground":"#88929d","titleBar.activeBackground":"#ffffff","titleBar.activeForeground":"#0e1116","titleBar.border":"#20252c","titleBar.inactiveBackground":"#ffffff","titleBar.inactiveForeground":"#0e1116","tree.indentGuidesStroke":"#88929d","welcomePage.buttonBackground":"#e7ecf0","welcomePage.buttonHoverBackground":"#ced5dc"},"displayName":"GitHub Light High Contrast","name":"github-light-high-contrast","semanticHighlighting":true,"tokenColors":[{"scope":["comment","punctuation.definition.comment","string.comment"],"settings":{"foreground":"#66707b"}},{"scope":["constant.other.placeholder","constant.character"],"settings":{"foreground":"#a0111f"}},{"scope":["constant","entity.name.constant","variable.other.constant","variable.other.enummember","variable.language","entity"],"settings":{"foreground":"#023b95"}},{"scope":["entity.name","meta.export.default","meta.definition.variable"],"settings":{"foreground":"#702c00"}},{"scope":["variable.parameter.function","meta.jsx.children","meta.block","meta.tag.attributes","entity.name.constant","meta.object.member","meta.embedded.expression"],"settings":{"foreground":"#0e1116"}},{"scope":"entity.name.function","settings":{"foreground":"#622cbc"}},{"scope":["entity.name.tag","support.class.component"],"settings":{"foreground":"#024c1a"}},{"scope":"keyword","settings":{"foreground":"#a0111f"}},{"scope":["storage","storage.type"],"settings":{"foreground":"#a0111f"}},{"scope":["storage.modifier.package","storage.modifier.import","storage.type.java"],"settings":{"foreground":"#0e1116"}},{"scope":["string","string punctuation.section.embedded source"],"settings":{"foreground":"#032563"}},{"scope":"support","settings":{"foreground":"#023b95"}},{"scope":"meta.property-name","settings":{"foreground":"#023b95"}},{"scope":"variable","settings":{"foreground":"#702c00"}},{"scope":"variable.other","settings":{"foreground":"#0e1116"}},{"scope":"invalid.broken","settings":{"fontStyle":"italic","foreground":"#6e011a"}},{"scope":"invalid.deprecated","settings":{"fontStyle":"italic","foreground":"#6e011a"}},{"scope":"invalid.illegal","settings":{"fontStyle":"italic","foreground":"#6e011a"}},{"scope":"invalid.unimplemented","settings":{"fontStyle":"italic","foreground":"#6e011a"}},{"scope":"carriage-return","settings":{"background":"#a0111f","content":"^M","fontStyle":"italic underline","foreground":"#ffffff"}},{"scope":"message.error","settings":{"foreground":"#6e011a"}},{"scope":"string variable","settings":{"foreground":"#023b95"}},{"scope":["source.regexp","string.regexp"],"settings":{"foreground":"#032563"}},{"scope":["string.regexp.character-class","string.regexp constant.character.escape","string.regexp source.ruby.embedded","string.regexp string.regexp.arbitrary-repitition"],"settings":{"foreground":"#032563"}},{"scope":"string.regexp constant.character.escape","settings":{"fontStyle":"bold","foreground":"#024c1a"}},{"scope":"support.constant","settings":{"foreground":"#023b95"}},{"scope":"support.variable","settings":{"foreground":"#023b95"}},{"scope":"support.type.property-name.json","settings":{"foreground":"#024c1a"}},{"scope":"meta.module-reference","settings":{"foreground":"#023b95"}},{"scope":"punctuation.definition.list.begin.markdown","settings":{"foreground":"#702c00"}},{"scope":["markup.heading","markup.heading entity.name"],"settings":{"fontStyle":"bold","foreground":"#023b95"}},{"scope":"markup.quote","settings":{"foreground":"#024c1a"}},{"scope":"markup.italic","settings":{"fontStyle":"italic","foreground":"#0e1116"}},{"scope":"markup.bold","settings":{"fontStyle":"bold","foreground":"#0e1116"}},{"scope":["markup.underline"],"settings":{"fontStyle":"underline"}},{"scope":["markup.strikethrough"],"settings":{"fontStyle":"strikethrough"}},{"scope":"markup.inline.raw","settings":{"foreground":"#023b95"}},{"scope":["markup.deleted","meta.diff.header.from-file","punctuation.definition.deleted"],"settings":{"background":"#fff0ee","foreground":"#6e011a"}},{"scope":["punctuation.section.embedded"],"settings":{"foreground":"#a0111f"}},{"scope":["markup.inserted","meta.diff.header.to-file","punctuation.definition.inserted"],"settings":{"background":"#d2fedb","foreground":"#024c1a"}},{"scope":["markup.changed","punctuation.definition.changed"],"settings":{"background":"#ffc67b","foreground":"#702c00"}},{"scope":["markup.ignored","markup.untracked"],"settings":{"background":"#023b95","foreground":"#e7ecf0"}},{"scope":"meta.diff.range","settings":{"fontStyle":"bold","foreground":"#622cbc"}},{"scope":"meta.diff.header","settings":{"foreground":"#023b95"}},{"scope":"meta.separator","settings":{"fontStyle":"bold","foreground":"#023b95"}},{"scope":"meta.output","settings":{"foreground":"#023b95"}},{"scope":["brackethighlighter.tag","brackethighlighter.curly","brackethighlighter.round","brackethighlighter.square","brackethighlighter.angle","brackethighlighter.quote"],"settings":{"foreground":"#4b535d"}},{"scope":"brackethighlighter.unmatched","settings":{"foreground":"#6e011a"}},{"scope":["constant.other.reference.link","string.other.link"],"settings":{"foreground":"#032563"}}],"type":"light"}'));var Jn=Object.freeze(JSON.parse('{"colors":{"activityBar.activeBorder":"#ff967d","activityBar.background":"#0a0c10","activityBar.border":"#7a828e","activityBar.foreground":"#f0f3f6","activityBar.inactiveForeground":"#f0f3f6","activityBarBadge.background":"#409eff","activityBarBadge.foreground":"#0a0c10","badge.background":"#409eff","badge.foreground":"#0a0c10","breadcrumb.activeSelectionForeground":"#f0f3f6","breadcrumb.focusForeground":"#f0f3f6","breadcrumb.foreground":"#f0f3f6","breadcrumbPicker.background":"#272b33","button.background":"#09b43a","button.foreground":"#0a0c10","button.hoverBackground":"#26cd4d","button.secondaryBackground":"#4c525d","button.secondaryForeground":"#f0f3f6","button.secondaryHoverBackground":"#525964","checkbox.background":"#272b33","checkbox.border":"#7a828e","debugConsole.errorForeground":"#ffb1af","debugConsole.infoForeground":"#bdc4cc","debugConsole.sourceForeground":"#f7c843","debugConsole.warningForeground":"#f0b72f","debugConsoleInputIcon.foreground":"#cb9eff","debugIcon.breakpointForeground":"#ff6a69","debugTokenExpression.boolean":"#4ae168","debugTokenExpression.error":"#ffb1af","debugTokenExpression.name":"#91cbff","debugTokenExpression.number":"#4ae168","debugTokenExpression.string":"#addcff","debugTokenExpression.value":"#addcff","debugToolBar.background":"#272b33","descriptionForeground":"#f0f3f6","diffEditor.insertedLineBackground":"#09b43a26","diffEditor.insertedTextBackground":"#26cd4d4d","diffEditor.removedLineBackground":"#ff6a6926","diffEditor.removedTextBackground":"#ff94924d","dropdown.background":"#272b33","dropdown.border":"#7a828e","dropdown.foreground":"#f0f3f6","dropdown.listBackground":"#272b33","editor.background":"#0a0c10","editor.findMatchBackground":"#e09b13","editor.findMatchHighlightBackground":"#fbd66980","editor.focusedStackFrameHighlightBackground":"#09b43a","editor.foldBackground":"#9ea7b31a","editor.foreground":"#f0f3f6","editor.inactiveSelectionBackground":"#9ea7b3","editor.lineHighlightBackground":"#9ea7b31a","editor.lineHighlightBorder":"#71b7ff","editor.linkedEditingBackground":"#71b7ff12","editor.selectionBackground":"#ffffff","editor.selectionForeground":"#0a0c10","editor.selectionHighlightBackground":"#26cd4d40","editor.stackFrameHighlightBackground":"#e09b13","editor.wordHighlightBackground":"#9ea7b380","editor.wordHighlightBorder":"#9ea7b399","editor.wordHighlightStrongBackground":"#9ea7b34d","editor.wordHighlightStrongBorder":"#9ea7b399","editorBracketHighlight.foreground1":"#91cbff","editorBracketHighlight.foreground2":"#4ae168","editorBracketHighlight.foreground3":"#f7c843","editorBracketHighlight.foreground4":"#ffb1af","editorBracketHighlight.foreground5":"#ffadd4","editorBracketHighlight.foreground6":"#dbb7ff","editorBracketHighlight.unexpectedBracket.foreground":"#f0f3f6","editorBracketMatch.background":"#26cd4d40","editorBracketMatch.border":"#26cd4d99","editorCursor.foreground":"#71b7ff","editorGroup.border":"#7a828e","editorGroupHeader.tabsBackground":"#010409","editorGroupHeader.tabsBorder":"#7a828e","editorGutter.addedBackground":"#09b43a","editorGutter.deletedBackground":"#ff6a69","editorGutter.modifiedBackground":"#e09b13","editorIndentGuide.activeBackground":"#f0f3f63d","editorIndentGuide.background":"#f0f3f61f","editorInlayHint.background":"#bdc4cc33","editorInlayHint.foreground":"#f0f3f6","editorInlayHint.paramBackground":"#bdc4cc33","editorInlayHint.paramForeground":"#f0f3f6","editorInlayHint.typeBackground":"#bdc4cc33","editorInlayHint.typeForeground":"#f0f3f6","editorLineNumber.activeForeground":"#f0f3f6","editorLineNumber.foreground":"#9ea7b3","editorOverviewRuler.border":"#010409","editorWhitespace.foreground":"#7a828e","editorWidget.background":"#272b33","errorForeground":"#ff6a69","focusBorder":"#409eff","foreground":"#f0f3f6","gitDecoration.addedResourceForeground":"#26cd4d","gitDecoration.conflictingResourceForeground":"#e7811d","gitDecoration.deletedResourceForeground":"#ff6a69","gitDecoration.ignoredResourceForeground":"#9ea7b3","gitDecoration.modifiedResourceForeground":"#f0b72f","gitDecoration.submoduleResourceForeground":"#f0f3f6","gitDecoration.untrackedResourceForeground":"#26cd4d","icon.foreground":"#f0f3f6","input.background":"#0a0c10","input.border":"#7a828e","input.foreground":"#f0f3f6","input.placeholderForeground":"#9ea7b3","keybindingLabel.foreground":"#f0f3f6","list.activeSelectionBackground":"#9ea7b366","list.activeSelectionForeground":"#f0f3f6","list.focusBackground":"#409eff26","list.focusForeground":"#f0f3f6","list.highlightForeground":"#71b7ff","list.hoverBackground":"#9ea7b31a","list.hoverForeground":"#f0f3f6","list.inactiveFocusBackground":"#409eff26","list.inactiveSelectionBackground":"#9ea7b366","list.inactiveSelectionForeground":"#f0f3f6","minimapSlider.activeBackground":"#bdc4cc47","minimapSlider.background":"#bdc4cc33","minimapSlider.hoverBackground":"#bdc4cc3d","notificationCenterHeader.background":"#272b33","notificationCenterHeader.foreground":"#f0f3f6","notifications.background":"#272b33","notifications.border":"#7a828e","notifications.foreground":"#f0f3f6","notificationsErrorIcon.foreground":"#ff6a69","notificationsInfoIcon.foreground":"#71b7ff","notificationsWarningIcon.foreground":"#f0b72f","panel.background":"#010409","panel.border":"#7a828e","panelInput.border":"#7a828e","panelTitle.activeBorder":"#ff967d","panelTitle.activeForeground":"#f0f3f6","panelTitle.inactiveForeground":"#f0f3f6","peekViewEditor.background":"#9ea7b31a","peekViewEditor.matchHighlightBackground":"#e09b13","peekViewResult.background":"#0a0c10","peekViewResult.matchHighlightBackground":"#e09b13","pickerGroup.border":"#7a828e","pickerGroup.foreground":"#f0f3f6","progressBar.background":"#409eff","quickInput.background":"#272b33","quickInput.foreground":"#f0f3f6","scrollbar.shadow":"#7a828e33","scrollbarSlider.activeBackground":"#bdc4cc47","scrollbarSlider.background":"#bdc4cc33","scrollbarSlider.hoverBackground":"#bdc4cc3d","settings.headerForeground":"#f0f3f6","settings.modifiedItemIndicator":"#e09b13","sideBar.background":"#010409","sideBar.border":"#7a828e","sideBar.foreground":"#f0f3f6","sideBarSectionHeader.background":"#010409","sideBarSectionHeader.border":"#7a828e","sideBarSectionHeader.foreground":"#f0f3f6","sideBarTitle.foreground":"#f0f3f6","statusBar.background":"#0a0c10","statusBar.border":"#7a828e","statusBar.debuggingBackground":"#ff6a69","statusBar.debuggingForeground":"#0a0c10","statusBar.focusBorder":"#409eff80","statusBar.foreground":"#f0f3f6","statusBar.noFolderBackground":"#0a0c10","statusBarItem.activeBackground":"#f0f3f61f","statusBarItem.focusBorder":"#409eff","statusBarItem.hoverBackground":"#f0f3f614","statusBarItem.prominentBackground":"#9ea7b366","statusBarItem.remoteBackground":"#525964","statusBarItem.remoteForeground":"#f0f3f6","symbolIcon.arrayForeground":"#fe9a2d","symbolIcon.booleanForeground":"#71b7ff","symbolIcon.classForeground":"#fe9a2d","symbolIcon.colorForeground":"#91cbff","symbolIcon.constantForeground":["#acf7b6","#72f088","#4ae168","#26cd4d","#09b43a","#09b43a","#02a232","#008c2c","#007728","#006222"],"symbolIcon.constructorForeground":"#dbb7ff","symbolIcon.enumeratorForeground":"#fe9a2d","symbolIcon.enumeratorMemberForeground":"#71b7ff","symbolIcon.eventForeground":"#9ea7b3","symbolIcon.fieldForeground":"#fe9a2d","symbolIcon.fileForeground":"#f0b72f","symbolIcon.folderForeground":"#f0b72f","symbolIcon.functionForeground":"#cb9eff","symbolIcon.interfaceForeground":"#fe9a2d","symbolIcon.keyForeground":"#71b7ff","symbolIcon.keywordForeground":"#ff9492","symbolIcon.methodForeground":"#cb9eff","symbolIcon.moduleForeground":"#ff9492","symbolIcon.namespaceForeground":"#ff9492","symbolIcon.nullForeground":"#71b7ff","symbolIcon.numberForeground":"#26cd4d","symbolIcon.objectForeground":"#fe9a2d","symbolIcon.operatorForeground":"#91cbff","symbolIcon.packageForeground":"#fe9a2d","symbolIcon.propertyForeground":"#fe9a2d","symbolIcon.referenceForeground":"#71b7ff","symbolIcon.snippetForeground":"#71b7ff","symbolIcon.stringForeground":"#91cbff","symbolIcon.structForeground":"#fe9a2d","symbolIcon.textForeground":"#91cbff","symbolIcon.typeParameterForeground":"#91cbff","symbolIcon.unitForeground":"#71b7ff","symbolIcon.variableForeground":"#fe9a2d","tab.activeBackground":"#0a0c10","tab.activeBorder":"#0a0c10","tab.activeBorderTop":"#ff967d","tab.activeForeground":"#f0f3f6","tab.border":"#7a828e","tab.hoverBackground":"#0a0c10","tab.inactiveBackground":"#010409","tab.inactiveForeground":"#f0f3f6","tab.unfocusedActiveBorder":"#0a0c10","tab.unfocusedActiveBorderTop":"#7a828e","tab.unfocusedHoverBackground":"#9ea7b31a","terminal.ansiBlack":"#7a828e","terminal.ansiBlue":"#71b7ff","terminal.ansiBrightBlack":"#9ea7b3","terminal.ansiBrightBlue":"#91cbff","terminal.ansiBrightCyan":"#56d4dd","terminal.ansiBrightGreen":"#4ae168","terminal.ansiBrightMagenta":"#dbb7ff","terminal.ansiBrightRed":"#ffb1af","terminal.ansiBrightWhite":"#ffffff","terminal.ansiBrightYellow":"#f7c843","terminal.ansiCyan":"#39c5cf","terminal.ansiGreen":"#26cd4d","terminal.ansiMagenta":"#cb9eff","terminal.ansiRed":"#ff9492","terminal.ansiWhite":"#d9dee3","terminal.ansiYellow":"#f0b72f","terminal.foreground":"#f0f3f6","textBlockQuote.background":"#010409","textBlockQuote.border":"#7a828e","textCodeBlock.background":"#9ea7b366","textLink.activeForeground":"#71b7ff","textLink.foreground":"#71b7ff","textPreformat.background":"#9ea7b366","textPreformat.foreground":"#f0f3f6","textSeparator.foreground":"#7a828e","titleBar.activeBackground":"#0a0c10","titleBar.activeForeground":"#f0f3f6","titleBar.border":"#7a828e","titleBar.inactiveBackground":"#010409","titleBar.inactiveForeground":"#f0f3f6","tree.indentGuidesStroke":"#7a828e","welcomePage.buttonBackground":"#272b33","welcomePage.buttonHoverBackground":"#525964"},"displayName":"GitHub Dark High Contrast","name":"github-dark-high-contrast","semanticHighlighting":true,"tokenColors":[{"scope":["comment","punctuation.definition.comment","string.comment"],"settings":{"foreground":"#bdc4cc"}},{"scope":["constant.other.placeholder","constant.character"],"settings":{"foreground":"#ff9492"}},{"scope":["constant","entity.name.constant","variable.other.constant","variable.other.enummember","variable.language","entity"],"settings":{"foreground":"#91cbff"}},{"scope":["entity.name","meta.export.default","meta.definition.variable"],"settings":{"foreground":"#ffb757"}},{"scope":["variable.parameter.function","meta.jsx.children","meta.block","meta.tag.attributes","entity.name.constant","meta.object.member","meta.embedded.expression"],"settings":{"foreground":"#f0f3f6"}},{"scope":"entity.name.function","settings":{"foreground":"#dbb7ff"}},{"scope":["entity.name.tag","support.class.component"],"settings":{"foreground":"#72f088"}},{"scope":"keyword","settings":{"foreground":"#ff9492"}},{"scope":["storage","storage.type"],"settings":{"foreground":"#ff9492"}},{"scope":["storage.modifier.package","storage.modifier.import","storage.type.java"],"settings":{"foreground":"#f0f3f6"}},{"scope":["string","string punctuation.section.embedded source"],"settings":{"foreground":"#addcff"}},{"scope":"support","settings":{"foreground":"#91cbff"}},{"scope":"meta.property-name","settings":{"foreground":"#91cbff"}},{"scope":"variable","settings":{"foreground":"#ffb757"}},{"scope":"variable.other","settings":{"foreground":"#f0f3f6"}},{"scope":"invalid.broken","settings":{"fontStyle":"italic","foreground":"#ffb1af"}},{"scope":"invalid.deprecated","settings":{"fontStyle":"italic","foreground":"#ffb1af"}},{"scope":"invalid.illegal","settings":{"fontStyle":"italic","foreground":"#ffb1af"}},{"scope":"invalid.unimplemented","settings":{"fontStyle":"italic","foreground":"#ffb1af"}},{"scope":"carriage-return","settings":{"background":"#ff9492","content":"^M","fontStyle":"italic underline","foreground":"#ffffff"}},{"scope":"message.error","settings":{"foreground":"#ffb1af"}},{"scope":"string variable","settings":{"foreground":"#91cbff"}},{"scope":["source.regexp","string.regexp"],"settings":{"foreground":"#addcff"}},{"scope":["string.regexp.character-class","string.regexp constant.character.escape","string.regexp source.ruby.embedded","string.regexp string.regexp.arbitrary-repitition"],"settings":{"foreground":"#addcff"}},{"scope":"string.regexp constant.character.escape","settings":{"fontStyle":"bold","foreground":"#72f088"}},{"scope":"support.constant","settings":{"foreground":"#91cbff"}},{"scope":"support.variable","settings":{"foreground":"#91cbff"}},{"scope":"support.type.property-name.json","settings":{"foreground":"#72f088"}},{"scope":"meta.module-reference","settings":{"foreground":"#91cbff"}},{"scope":"punctuation.definition.list.begin.markdown","settings":{"foreground":"#ffb757"}},{"scope":["markup.heading","markup.heading entity.name"],"settings":{"fontStyle":"bold","foreground":"#91cbff"}},{"scope":"markup.quote","settings":{"foreground":"#72f088"}},{"scope":"markup.italic","settings":{"fontStyle":"italic","foreground":"#f0f3f6"}},{"scope":"markup.bold","settings":{"fontStyle":"bold","foreground":"#f0f3f6"}},{"scope":["markup.underline"],"settings":{"fontStyle":"underline"}},{"scope":["markup.strikethrough"],"settings":{"fontStyle":"strikethrough"}},{"scope":"markup.inline.raw","settings":{"foreground":"#91cbff"}},{"scope":["markup.deleted","meta.diff.header.from-file","punctuation.definition.deleted"],"settings":{"background":"#ad0116","foreground":"#ffb1af"}},{"scope":["punctuation.section.embedded"],"settings":{"foreground":"#ff9492"}},{"scope":["markup.inserted","meta.diff.header.to-file","punctuation.definition.inserted"],"settings":{"background":"#006222","foreground":"#72f088"}},{"scope":["markup.changed","punctuation.definition.changed"],"settings":{"background":"#a74c00","foreground":"#ffb757"}},{"scope":["markup.ignored","markup.untracked"],"settings":{"background":"#91cbff","foreground":"#272b33"}},{"scope":"meta.diff.range","settings":{"fontStyle":"bold","foreground":"#dbb7ff"}},{"scope":"meta.diff.header","settings":{"foreground":"#91cbff"}},{"scope":"meta.separator","settings":{"fontStyle":"bold","foreground":"#91cbff"}},{"scope":"meta.output","settings":{"foreground":"#91cbff"}},{"scope":["brackethighlighter.tag","brackethighlighter.curly","brackethighlighter.round","brackethighlighter.square","brackethighlighter.angle","brackethighlighter.quote"],"settings":{"foreground":"#bdc4cc"}},{"scope":"brackethighlighter.unmatched","settings":{"foreground":"#ffb1af"}},{"scope":["constant.other.reference.link","string.other.link"],"settings":{"foreground":"#addcff"}}],"type":"dark"}'));var A=class extends Error{constructor(t){super(t),this.name="ShikiError"}};function Ao(t){return Qt(t)}function Qt(t){return Array.isArray(t)?Eo(t):t instanceof RegExp?t:typeof t=="object"?No(t):t}function Eo(t){let e=[];for(let n=0,r=t.length;n{for(let r in n)t[r]=n[r]}),t}function sr(t){let e=~t.lastIndexOf("/")||~t.lastIndexOf("\\");return e===0?t:~e===t.length-1?sr(t.substring(0,t.length-1)):t.substr(~e+1)}var Ut=/\$(\d+)|\${(\d+):\/(downcase|upcase)}/g,ot=class{static hasCaptures(t){return t===null?!1:(Ut.lastIndex=0,Ut.test(t))}static replaceCaptures(t,e,n){return t.replace(Ut,(r,a,o,i)=>{let s=n[parseInt(a||o,10)];if(s){let l=e.substring(s.start,s.end);for(;l[0]===".";)l=l.substring(1);switch(i){case"downcase":return l.toLowerCase();case"upcase":return l.toUpperCase();default:return l}}else return r})}};function lr(t,e){return te?1:0}function cr(t,e){if(t===null&&e===null)return 0;if(!t)return-1;if(!e)return 1;let n=t.length,r=e.length;if(n===r){for(let a=0;athis._root.match(t)));this._colorMap=t,this._defaults=e,this._root=n}static createFromRawTheme(t,e){return this.createFromParsedTheme(jo(t),e)}static createFromParsedTheme(t,e){return Lo(t,e)}getColorMap(){return this._colorMap.getColorMap()}getDefaults(){return this._defaults}match(t){if(t===null)return this._defaults;let e=t.scopeName,r=this._cachedMatchRoot.get(e).find(a=>Ro(t.parent,a.parentScopes));return r?new pr(r.fontStyle,r.foreground,r.background):null}},Wt=class it{constructor(e,n){this.parent=e,this.scopeName=n}static push(e,n){for(let r of n)e=new it(e,r);return e}static from(...e){let n=null;for(let r=0;r"){if(n===e.length-1)return!1;r=e[++n],a=!0}for(;t&&!Bo(t.scopeName,r);){if(a)return!1;t=t.parent}if(!t)return!1;t=t.parent}return!0}function Bo(t,e){return e===t||t.startsWith(e)&&t[e.length]==="."}var pr=class{constructor(t,e,n){this.fontStyle=t,this.foregroundId=e,this.backgroundId=n}};function jo(t){if(!t)return[];if(!t.settings||!Array.isArray(t.settings))return[];let e=t.settings,n=[],r=0;for(let a=0,o=e.length;a1&&(w=g.slice(0,g.length-1),w.reverse()),n[r++]=new To(k,w,a,l,c,u)}}return n}var To=class{constructor(t,e,n,r,a,o){this.scope=t,this.parentScopes=e,this.index=n,this.fontStyle=r,this.foreground=a,this.background=o}},$=(t=>(t[t.NotSet=-1]="NotSet",t[t.None=0]="None",t[t.Italic=1]="Italic",t[t.Bold=2]="Bold",t[t.Underline=4]="Underline",t[t.Strikethrough=8]="Strikethrough",t))($||{});function Lo(t,e){t.sort((l,c)=>{let u=lr(l.scope,c.scope);return u!==0||(u=cr(l.parentScopes,c.parentScopes),u!==0)?u:l.index-c.index});let n=0,r="#000000",a="#ffffff";for(;t.length>=1&&t[0].scope==="";){let l=t.shift();l.fontStyle!==-1&&(n=l.fontStyle),l.foreground!==null&&(r=l.foreground),l.background!==null&&(a=l.background)}let o=new $o(e),i=new pr(n,o.getId(r),o.getId(a)),s=new Fo(new Vt(0,null,-1,0,0),[]);for(let l=0,c=t.length;le?console.log("how did this happen?"):this.scopeDepth=e,n!==-1&&(this.fontStyle=n),r!==0&&(this.foreground=r),a!==0&&(this.background=a)}},Fo=class Zt{constructor(e,n=[],r={}){m(this,"_rulesWithParentScopes");this._mainRule=e,this._children=r,this._rulesWithParentScopes=n}static _cmpBySpecificity(e,n){if(e.scopeDepth!==n.scopeDepth)return n.scopeDepth-e.scopeDepth;let r=0,a=0;for(;e.parentScopes[r]===">"&&r++,n.parentScopes[a]===">"&&a++,!(r>=e.parentScopes.length||a>=n.parentScopes.length);){let o=n.parentScopes[a].length-e.parentScopes[r].length;if(o!==0)return o;r++,a++}return n.parentScopes.length-e.parentScopes.length}match(e){if(e!==""){let r=e.indexOf("."),a,o;if(r===-1?(a=e,o=""):(a=e.substring(0,r),o=e.substring(r+1)),this._children.hasOwnProperty(a))return this._children[a].match(o)}let n=this._rulesWithParentScopes.concat(this._mainRule);return n.sort(Zt._cmpBySpecificity),n}insert(e,n,r,a,o,i){if(n===""){this._doInsertHere(e,r,a,o,i);return}let s=n.indexOf("."),l,c;s===-1?(l=n,c=""):(l=n.substring(0,s),c=n.substring(s+1));let u;this._children.hasOwnProperty(l)?u=this._children[l]:(u=new Zt(this._mainRule.clone(),Vt.cloneArr(this._rulesWithParentScopes)),this._children[l]=u),u.insert(e+1,c,r,a,o,i)}_doInsertHere(e,n,r,a,o){if(n===null){this._mainRule.acceptOverwrite(e,r,a,o);return}for(let i=0,s=this._rulesWithParentScopes.length;i>>0}static getTokenType(e){return(e&768)>>>8}static containsBalancedBrackets(e){return(e&1024)!==0}static getFontStyle(e){return(e&30720)>>>11}static getForeground(e){return(e&16744448)>>>15}static getBackground(e){return(e&4278190080)>>>24}static set(e,n,r,a,o,i,s){let l=z.getLanguageId(e),c=z.getTokenType(e),u=z.containsBalancedBrackets(e)?1:0,d=z.getFontStyle(e),p=z.getForeground(e),f=z.getBackground(e);return n!==0&&(l=n),r!==8&&(c=r),a!==null&&(u=a?1:0),o!==-1&&(d=o),i!==0&&(p=i),s!==0&&(f=s),(l<<0|c<<8|u<<10|d<<11|p<<15|f<<24)>>>0}};function lt(t,e){let n=[],r=Mo(t),a=r.next();for(;a!==null;){let l=0;if(a.length===2&&a.charAt(1)===":"){switch(a.charAt(0)){case"R":l=1;break;case"L":l=-1;break;default:console.log(`Unknown priority ${a} in scope selector`)}a=r.next()}let c=i();if(n.push({matcher:c,priority:l}),a!==",")break;a=r.next()}return n;function o(){if(a==="-"){a=r.next();let l=o();return c=>!!l&&!l(c)}if(a==="("){a=r.next();let l=s();return a===")"&&(a=r.next()),l}if(Kn(a)){let l=[];do l.push(a),a=r.next();while(Kn(a));return c=>e(l,c)}return null}function i(){let l=[],c=o();for(;c;)l.push(c),c=o();return u=>l.every(d=>d(u))}function s(){let l=[],c=i();for(;c&&(l.push(c),a==="|"||a===",");){do a=r.next();while(a==="|"||a===",");c=i()}return u=>l.some(d=>d(u))}}function Kn(t){return!!t&&!!t.match(/[\w\.:]+/)}function Mo(t){let e=/([LR]:|[\w\.:][\w\.:\-]*|[\,\|\-\(\)])/g,n=e.exec(t);return{next:()=>{if(!n)return null;let r=n[0];return n=e.exec(t),r}}}function gr(t){typeof t.dispose=="function"&&t.dispose()}var Oe=class{constructor(t){this.scopeName=t}toKey(){return this.scopeName}},Go=class{constructor(t,e){this.scopeName=t,this.ruleName=e}toKey(){return`${this.scopeName}#${this.ruleName}`}},Oo=class{constructor(){m(this,"_references",[]);m(this,"_seenReferenceKeys",new Set);m(this,"visitedRule",new Set)}get references(){return this._references}add(t){let e=t.toKey();this._seenReferenceKeys.has(e)||(this._seenReferenceKeys.add(e),this._references.push(t))}},Do=class{constructor(t,e){m(this,"seenFullScopeRequests",new Set);m(this,"seenPartialScopeRequests",new Set);m(this,"Q");this.repo=t,this.initialScopeName=e,this.seenFullScopeRequests.add(this.initialScopeName),this.Q=[new Oe(this.initialScopeName)]}processQueue(){let t=this.Q;this.Q=[];let e=new Oo;for(let n of t)zo(n,this.initialScopeName,this.repo,e);for(let n of e.references)if(n instanceof Oe){if(this.seenFullScopeRequests.has(n.scopeName))continue;this.seenFullScopeRequests.add(n.scopeName),this.Q.push(n)}else{if(this.seenFullScopeRequests.has(n.scopeName)||this.seenPartialScopeRequests.has(n.toKey()))continue;this.seenPartialScopeRequests.add(n.toKey()),this.Q.push(n)}}};function zo(t,e,n,r){let a=n.lookup(t.scopeName);if(!a){if(t.scopeName===e)throw new Error(`No grammar provided for <${e}>`);return}let o=n.lookup(e);t instanceof Oe?st({baseGrammar:o,selfGrammar:a},r):Xt(t.ruleName,{baseGrammar:o,selfGrammar:a,repository:a.repository},r);let i=n.injections(t.scopeName);if(i)for(let s of i)r.add(new Oe(s))}function Xt(t,e,n){if(e.repository&&e.repository[t]){let r=e.repository[t];ct([r],e,n)}}function st(t,e){t.selfGrammar.patterns&&Array.isArray(t.selfGrammar.patterns)&&ct(t.selfGrammar.patterns,{...t,repository:t.selfGrammar.repository},e),t.selfGrammar.injections&&ct(Object.values(t.selfGrammar.injections),{...t,repository:t.selfGrammar.repository},e)}function ct(t,e,n){for(let r of t){if(n.visitedRule.has(r))continue;n.visitedRule.add(r);let a=r.repository?ir({},e.repository,r.repository):e.repository;Array.isArray(r.patterns)&&ct(r.patterns,{...e,repository:a},n);let o=r.include;if(!o)continue;let i=mr(o);switch(i.kind){case 0:st({...e,selfGrammar:e.baseGrammar},n);break;case 1:st(e,n);break;case 2:Xt(i.ruleName,{...e,repository:a},n);break;case 3:case 4:let s=i.scopeName===e.selfGrammar.scopeName?e.selfGrammar:i.scopeName===e.baseGrammar.scopeName?e.baseGrammar:void 0;if(s){let l={baseGrammar:e.baseGrammar,selfGrammar:s,repository:a};i.kind===4?Xt(i.ruleName,l,n):st(l,n)}else i.kind===4?n.add(new Go(i.scopeName,i.ruleName)):n.add(new Oe(i.scopeName));break}}}var Ho=class{constructor(){m(this,"kind",0)}},Uo=class{constructor(){m(this,"kind",1)}},Wo=class{constructor(t){m(this,"kind",2);this.ruleName=t}},qo=class{constructor(t){m(this,"kind",3);this.scopeName=t}},Vo=class{constructor(t,e){m(this,"kind",4);this.scopeName=t,this.ruleName=e}};function mr(t){if(t==="$base")return new Ho;if(t==="$self")return new Uo;let e=t.indexOf("#");if(e===-1)return new qo(t);if(e===0)return new Wo(t.substring(1));{let n=t.substring(0,e),r=t.substring(e+1);return new Vo(n,r)}}var Zo=/\\(\d+)/,er=/\\(\d+)/g;var Xo=-1,hr=-2;var He=class{constructor(t,e,n,r){m(this,"$location");m(this,"id");m(this,"_nameIsCapturing");m(this,"_name");m(this,"_contentNameIsCapturing");m(this,"_contentName");this.$location=t,this.id=e,this._name=n||null,this._nameIsCapturing=ot.hasCaptures(this._name),this._contentName=r||null,this._contentNameIsCapturing=ot.hasCaptures(this._contentName)}get debugName(){let t=this.$location?`${sr(this.$location.filename)}:${this.$location.line}`:"unknown";return`${this.constructor.name}#${this.id} @ ${t}`}getName(t,e){return!this._nameIsCapturing||this._name===null||t===null||e===null?this._name:ot.replaceCaptures(this._name,t,e)}getContentName(t,e){return!this._contentNameIsCapturing||this._contentName===null?this._contentName:ot.replaceCaptures(this._contentName,t,e)}},Yo=class extends He{constructor(e,n,r,a,o){super(e,n,r,a);m(this,"retokenizeCapturedWithRuleId");this.retokenizeCapturedWithRuleId=o}dispose(){}collectPatterns(e,n){throw new Error("Not supported!")}compile(e,n){throw new Error("Not supported!")}compileAG(e,n,r,a){throw new Error("Not supported!")}},Jo=class extends He{constructor(e,n,r,a,o){super(e,n,r,null);m(this,"_match");m(this,"captures");m(this,"_cachedCompiledPatterns");this._match=new De(a,this.id),this.captures=o,this._cachedCompiledPatterns=null}dispose(){this._cachedCompiledPatterns&&(this._cachedCompiledPatterns.dispose(),this._cachedCompiledPatterns=null)}get debugMatchRegExp(){return`${this._match.source}`}collectPatterns(e,n){n.push(this._match)}compile(e,n){return this._getCachedCompiledPatterns(e).compile(e)}compileAG(e,n,r,a){return this._getCachedCompiledPatterns(e).compileAG(e,r,a)}_getCachedCompiledPatterns(e){return this._cachedCompiledPatterns||(this._cachedCompiledPatterns=new ze,this.collectPatterns(e,this._cachedCompiledPatterns)),this._cachedCompiledPatterns}},tr=class extends He{constructor(e,n,r,a,o){super(e,n,r,a);m(this,"hasMissingPatterns");m(this,"patterns");m(this,"_cachedCompiledPatterns");this.patterns=o.patterns,this.hasMissingPatterns=o.hasMissingPatterns,this._cachedCompiledPatterns=null}dispose(){this._cachedCompiledPatterns&&(this._cachedCompiledPatterns.dispose(),this._cachedCompiledPatterns=null)}collectPatterns(e,n){for(let r of this.patterns)e.getRule(r).collectPatterns(e,n)}compile(e,n){return this._getCachedCompiledPatterns(e).compile(e)}compileAG(e,n,r,a){return this._getCachedCompiledPatterns(e).compileAG(e,r,a)}_getCachedCompiledPatterns(e){return this._cachedCompiledPatterns||(this._cachedCompiledPatterns=new ze,this.collectPatterns(e,this._cachedCompiledPatterns)),this._cachedCompiledPatterns}},Yt=class extends He{constructor(e,n,r,a,o,i,s,l,c,u){super(e,n,r,a);m(this,"_begin");m(this,"beginCaptures");m(this,"_end");m(this,"endHasBackReferences");m(this,"endCaptures");m(this,"applyEndPatternLast");m(this,"hasMissingPatterns");m(this,"patterns");m(this,"_cachedCompiledPatterns");this._begin=new De(o,this.id),this.beginCaptures=i,this._end=new De(s||"\uFFFF",-1),this.endHasBackReferences=this._end.hasBackReferences,this.endCaptures=l,this.applyEndPatternLast=c||!1,this.patterns=u.patterns,this.hasMissingPatterns=u.hasMissingPatterns,this._cachedCompiledPatterns=null}dispose(){this._cachedCompiledPatterns&&(this._cachedCompiledPatterns.dispose(),this._cachedCompiledPatterns=null)}get debugBeginRegExp(){return`${this._begin.source}`}get debugEndRegExp(){return`${this._end.source}`}getEndWithResolvedBackReferences(e,n){return this._end.resolveBackReferences(e,n)}collectPatterns(e,n){n.push(this._begin)}compile(e,n){return this._getCachedCompiledPatterns(e,n).compile(e)}compileAG(e,n,r,a){return this._getCachedCompiledPatterns(e,n).compileAG(e,r,a)}_getCachedCompiledPatterns(e,n){if(!this._cachedCompiledPatterns){this._cachedCompiledPatterns=new ze;for(let r of this.patterns)e.getRule(r).collectPatterns(e,this._cachedCompiledPatterns);this.applyEndPatternLast?this._cachedCompiledPatterns.push(this._end.hasBackReferences?this._end.clone():this._end):this._cachedCompiledPatterns.unshift(this._end.hasBackReferences?this._end.clone():this._end)}return this._end.hasBackReferences&&(this.applyEndPatternLast?this._cachedCompiledPatterns.setSource(this._cachedCompiledPatterns.length()-1,n):this._cachedCompiledPatterns.setSource(0,n)),this._cachedCompiledPatterns}},ut=class extends He{constructor(e,n,r,a,o,i,s,l,c){super(e,n,r,a);m(this,"_begin");m(this,"beginCaptures");m(this,"whileCaptures");m(this,"_while");m(this,"whileHasBackReferences");m(this,"hasMissingPatterns");m(this,"patterns");m(this,"_cachedCompiledPatterns");m(this,"_cachedCompiledWhilePatterns");this._begin=new De(o,this.id),this.beginCaptures=i,this.whileCaptures=l,this._while=new De(s,hr),this.whileHasBackReferences=this._while.hasBackReferences,this.patterns=c.patterns,this.hasMissingPatterns=c.hasMissingPatterns,this._cachedCompiledPatterns=null,this._cachedCompiledWhilePatterns=null}dispose(){this._cachedCompiledPatterns&&(this._cachedCompiledPatterns.dispose(),this._cachedCompiledPatterns=null),this._cachedCompiledWhilePatterns&&(this._cachedCompiledWhilePatterns.dispose(),this._cachedCompiledWhilePatterns=null)}get debugBeginRegExp(){return`${this._begin.source}`}get debugWhileRegExp(){return`${this._while.source}`}getWhileWithResolvedBackReferences(e,n){return this._while.resolveBackReferences(e,n)}collectPatterns(e,n){n.push(this._begin)}compile(e,n){return this._getCachedCompiledPatterns(e).compile(e)}compileAG(e,n,r,a){return this._getCachedCompiledPatterns(e).compileAG(e,r,a)}_getCachedCompiledPatterns(e){if(!this._cachedCompiledPatterns){this._cachedCompiledPatterns=new ze;for(let n of this.patterns)e.getRule(n).collectPatterns(e,this._cachedCompiledPatterns)}return this._cachedCompiledPatterns}compileWhile(e,n){return this._getCachedCompiledWhilePatterns(e,n).compile(e)}compileWhileAG(e,n,r,a){return this._getCachedCompiledWhilePatterns(e,n).compileAG(e,r,a)}_getCachedCompiledWhilePatterns(e,n){return this._cachedCompiledWhilePatterns||(this._cachedCompiledWhilePatterns=new ze,this._cachedCompiledWhilePatterns.push(this._while.hasBackReferences?this._while.clone():this._while)),this._while.hasBackReferences&&this._cachedCompiledWhilePatterns.setSource(0,n||"\uFFFF"),this._cachedCompiledWhilePatterns}},br=class P{static createCaptureRule(e,n,r,a,o){return e.registerRule(i=>new Yo(n,i,r,a,o))}static getCompiledRuleId(e,n,r){return e.id||n.registerRule(a=>{if(e.id=a,e.match)return new Jo(e.$vscodeTextmateLocation,e.id,e.name,e.match,P._compileCaptures(e.captures,n,r));if(typeof e.begin>"u"){e.repository&&(r=ir({},r,e.repository));let o=e.patterns;return typeof o>"u"&&e.include&&(o=[{include:e.include}]),new tr(e.$vscodeTextmateLocation,e.id,e.name,e.contentName,P._compilePatterns(o,n,r))}return e.while?new ut(e.$vscodeTextmateLocation,e.id,e.name,e.contentName,e.begin,P._compileCaptures(e.beginCaptures||e.captures,n,r),e.while,P._compileCaptures(e.whileCaptures||e.captures,n,r),P._compilePatterns(e.patterns,n,r)):new Yt(e.$vscodeTextmateLocation,e.id,e.name,e.contentName,e.begin,P._compileCaptures(e.beginCaptures||e.captures,n,r),e.end,P._compileCaptures(e.endCaptures||e.captures,n,r),e.applyEndPatternLast,P._compilePatterns(e.patterns,n,r))}),e.id}static _compileCaptures(e,n,r){let a=[];if(e){let o=0;for(let i in e){if(i==="$vscodeTextmateLocation")continue;let s=parseInt(i,10);s>o&&(o=s)}for(let i=0;i<=o;i++)a[i]=null;for(let i in e){if(i==="$vscodeTextmateLocation")continue;let s=parseInt(i,10),l=0;e[i].patterns&&(l=P.getCompiledRuleId(e[i],n,r)),a[s]=P.createCaptureRule(n,e[i].$vscodeTextmateLocation,e[i].name,e[i].contentName,l)}}return a}static _compilePatterns(e,n,r){let a=[];if(e)for(let o=0,i=e.length;oe.substring(a.start,a.end));return er.lastIndex=0,this.source.replace(er,(a,o)=>ur(r[parseInt(o,10)]||""))}_buildAnchorCache(){if(typeof this.source!="string")throw new Error("This method should only be called if the source is a string");let e=[],n=[],r=[],a=[],o,i,s,l;for(o=0,i=this.source.length;on.source);this._cached=new nr(t,e,this._items.map(n=>n.ruleId))}return this._cached}compileAG(t,e,n){return this._hasAnchors?e?n?(this._anchorCache.A1_G1||(this._anchorCache.A1_G1=this._resolveAnchors(t,e,n)),this._anchorCache.A1_G1):(this._anchorCache.A1_G0||(this._anchorCache.A1_G0=this._resolveAnchors(t,e,n)),this._anchorCache.A1_G0):n?(this._anchorCache.A0_G1||(this._anchorCache.A0_G1=this._resolveAnchors(t,e,n)),this._anchorCache.A0_G1):(this._anchorCache.A0_G0||(this._anchorCache.A0_G0=this._resolveAnchors(t,e,n)),this._anchorCache.A0_G0):this.compile(t)}_resolveAnchors(t,e,n){let r=this._items.map(a=>a.resolveAnchors(e,n));return new nr(t,r,this._items.map(a=>a.ruleId))}},nr=class{constructor(t,e,n){m(this,"scanner");this.regExps=e,this.rules=n,this.scanner=t.createOnigScanner(e)}dispose(){typeof this.scanner.dispose=="function"&&this.scanner.dispose()}toString(){let t=[];for(let e=0,n=this.rules.length;e{let n=this._scopeToLanguage(e),r=this._toStandardTokenType(e);return new qt(n,r)}));this._defaultAttributes=new qt(e,8),this._embeddedLanguagesMatcher=new Ko(Object.entries(n||{}))}getDefaultAttributes(){return this._defaultAttributes}getBasicScopeAttributes(e){return e===null?Q._NULL_SCOPE_METADATA:this._getBasicScopeAttributes.get(e)}_scopeToLanguage(e){return this._embeddedLanguagesMatcher.match(e)||0}_toStandardTokenType(e){let n=e.match(Q.STANDARD_TOKEN_TYPE_REGEXP);if(!n)return 8;switch(n[1]){case"comment":return 1;case"string":return 2;case"regex":return 3;case"meta.embedded":return 0}throw new Error("Unexpected match for standard token type!")}},m(Q,"_NULL_SCOPE_METADATA",new qt(0,0)),m(Q,"STANDARD_TOKEN_TYPE_REGEXP",/\b(comment|string|regex|meta\.embedded)\b/),Q),Ko=class{constructor(t){m(this,"values");m(this,"scopesRegExp");if(t.length===0)this.values=null,this.scopesRegExp=null;else{this.values=new Map(t);let e=t.map(([n,r])=>ur(n));e.sort(),e.reverse(),this.scopesRegExp=new RegExp(`^((${e.join(")|(")}))($|\\.)`,"")}}match(t){if(!this.scopesRegExp)return;let e=t.match(this.scopesRegExp);if(e)return this.values.get(e[1])}},jc={InDebugMode:typeof process<"u"&&!!process.env.VSCODE_TEXTMATE_DEBUG},kr=!1,rr=class{constructor(t,e){this.stack=t,this.stoppedEarly=e}};function wr(t,e,n,r,a,o,i,s){let l=e.content.length,c=!1,u=-1;if(i){let f=ei(t,e,n,r,a,o);a=f.stack,r=f.linePos,n=f.isFirstLine,u=f.anchorPosition}let d=Date.now();for(;!c;){if(s!==0&&Date.now()-d>s)return new rr(a,!0);p()}return new rr(a,!1);function p(){let f=ti(t,e,n,r,a,u);if(!f){o.produce(a,l),c=!0;return}let g=f.captureIndices,k=f.matchedRuleId,w=g&&g.length>0?g[0].end>r:!1;if(k===Xo){let b=a.getRule(t);o.produce(a,g[0].start),a=a.withContentNameScopesList(a.nameScopesList),Fe(t,e,n,a,o,b.endCaptures,g),o.produce(a,g[0].end);let y=a;if(a=a.parent,u=y.getAnchorPos(),!w&&y.getEnterPos()===r){a=y,o.produce(a,l),c=!0;return}}else{let b=t.getRule(k);o.produce(a,g[0].start);let y=a,v=b.getName(e.content,g),S=a.contentNameScopesList.pushAttributed(v,t);if(a=a.push(k,r,u,g[0].end===l,null,S,S),b instanceof Yt){let I=b;Fe(t,e,n,a,o,I.beginCaptures,g),o.produce(a,g[0].end),u=g[0].end;let L=I.getContentName(e.content,g),F=S.pushAttributed(L,t);if(a=a.withContentNameScopesList(F),I.endHasBackReferences&&(a=a.withEndRule(I.getEndWithResolvedBackReferences(e.content,g))),!w&&y.hasSameRuleAs(a)){a=a.pop(),o.produce(a,l),c=!0;return}}else if(b instanceof ut){let I=b;Fe(t,e,n,a,o,I.beginCaptures,g),o.produce(a,g[0].end),u=g[0].end;let L=I.getContentName(e.content,g),F=S.pushAttributed(L,t);if(a=a.withContentNameScopesList(F),I.whileHasBackReferences&&(a=a.withEndRule(I.getWhileWithResolvedBackReferences(e.content,g))),!w&&y.hasSameRuleAs(a)){a=a.pop(),o.produce(a,l),c=!0;return}}else if(Fe(t,e,n,a,o,b.captures,g),o.produce(a,g[0].end),a=a.pop(),!w){a=a.safePop(),o.produce(a,l),c=!0;return}}g[0].end>r&&(r=g[0].end,n=!1)}}function ei(t,e,n,r,a,o){let i=a.beginRuleCapturedEOL?0:-1,s=[];for(let l=a;l;l=l.pop()){let c=l.getRule(t);c instanceof ut&&s.push({rule:c,stack:l})}for(let l=s.pop();l;l=s.pop()){let{ruleScanner:c,findOptions:u}=ai(l.rule,t,l.stack.endRule,n,r===i),d=c.findNextMatchSync(e,r,u);if(d){if(d.ruleId!==hr){a=l.stack.pop();break}d.captureIndices&&d.captureIndices.length&&(o.produce(l.stack,d.captureIndices[0].start),Fe(t,e,n,l.stack,o,l.rule.whileCaptures,d.captureIndices),o.produce(l.stack,d.captureIndices[0].end),i=d.captureIndices[0].end,d.captureIndices[0].end>r&&(r=d.captureIndices[0].end,n=!1))}else{a=l.stack.pop();break}}return{stack:a,linePos:r,anchorPosition:i,isFirstLine:n}}function ti(t,e,n,r,a,o){let i=ni(t,e,n,r,a,o),s=t.getInjections();if(s.length===0)return i;let l=ri(s,t,e,n,r,a,o);if(!l)return i;if(!i)return l;let c=i.captureIndices[0].start,u=l.captureIndices[0].start;return u=s)&&(s=v,l=y.captureIndices,c=y.ruleId,u=g.priority,s===a))break}return l?{priorityMatch:u===-1,captureIndices:l,matchedRuleId:c}:null}function vr(t,e,n,r,a){if(kr){let i=t.compile(e,n),s=Cr(r,a);return{ruleScanner:i,findOptions:s}}return{ruleScanner:t.compileAG(e,n,r,a),findOptions:0}}function ai(t,e,n,r,a){if(kr){let i=t.compileWhile(e,n),s=Cr(r,a);return{ruleScanner:i,findOptions:s}}return{ruleScanner:t.compileWhileAG(e,n,r,a),findOptions:0}}function Cr(t,e){let n=0;return t||(n|=1),e||(n|=4),n}function Fe(t,e,n,r,a,o,i){if(o.length===0)return;let s=e.content,l=Math.min(o.length,i.length),c=[],u=i[0].end;for(let d=0;du)break;for(;c.length>0&&c[c.length-1].endPos<=f.start;)a.produceFromScopes(c[c.length-1].scopes,c[c.length-1].endPos),c.pop();if(c.length>0?a.produceFromScopes(c[c.length-1].scopes,f.start):a.produce(r,f.start),p.retokenizeCapturedWithRuleId){let k=p.getName(s,i),w=r.contentNameScopesList.pushAttributed(k,t),b=p.getContentName(s,i),y=w.pushAttributed(b,t),v=r.push(p.retokenizeCapturedWithRuleId,f.start,-1,!1,null,w,y),S=t.createOnigString(s.substring(0,f.end));wr(t,S,n&&f.start===0,f.start,v,a,!1,0),gr(S);continue}let g=p.getName(s,i);if(g!==null){let w=(c.length>0?c[c.length-1].scopes:r.contentNameScopesList).pushAttributed(g,t);c.push(new oi(w,f.end))}}for(;c.length>0;)a.produceFromScopes(c[c.length-1].scopes,c[c.length-1].endPos),c.pop()}var oi=class{constructor(t,e){m(this,"scopes");m(this,"endPos");this.scopes=t,this.endPos=e}};function ii(t,e,n,r,a,o,i,s){return new li(t,e,n,r,a,o,i,s)}function ar(t,e,n,r,a){let o=lt(e,dt),i=br.getCompiledRuleId(n,r,a.repository);for(let s of o)t.push({debugSelector:e,matcher:s.matcher,ruleId:i,grammar:a,priority:s.priority})}function dt(t,e){if(e.length{for(let a=n;an&&t.substr(0,n)===e&&t[n]==="."}var li=class{constructor(t,e,n,r,a,o,i,s){m(this,"_rootId");m(this,"_lastRuleId");m(this,"_ruleId2desc");m(this,"_includedGrammars");m(this,"_grammarRepository");m(this,"_grammar");m(this,"_injections");m(this,"_basicScopeAttributesProvider");m(this,"_tokenTypeMatchers");if(this._rootScopeName=t,this.balancedBracketSelectors=o,this._onigLib=s,this._basicScopeAttributesProvider=new Qo(n,r),this._rootId=-1,this._lastRuleId=0,this._ruleId2desc=[null],this._includedGrammars={},this._grammarRepository=i,this._grammar=or(e,null),this._injections=null,this._tokenTypeMatchers=[],a)for(let l of Object.keys(a)){let c=lt(l,dt);for(let u of c)this._tokenTypeMatchers.push({matcher:u.matcher,type:a[l]})}}get themeProvider(){return this._grammarRepository}dispose(){for(let t of this._ruleId2desc)t&&t.dispose()}createOnigScanner(t){return this._onigLib.createOnigScanner(t)}createOnigString(t){return this._onigLib.createOnigString(t)}getMetadataForScope(t){return this._basicScopeAttributesProvider.getBasicScopeAttributes(t)}_collectInjections(){let t={lookup:a=>a===this._rootScopeName?this._grammar:this.getExternalGrammar(a),injections:a=>this._grammarRepository.injections(a)},e=[],n=this._rootScopeName,r=t.lookup(n);if(r){let a=r.injections;if(a)for(let i in a)ar(e,i,a[i],this,r);let o=this._grammarRepository.injections(n);o&&o.forEach(i=>{let s=this.getExternalGrammar(i);if(s){let l=s.injectionSelector;l&&ar(e,l,s,this,s)}})}return e.sort((a,o)=>a.priority-o.priority),e}getInjections(){return this._injections===null&&(this._injections=this._collectInjections()),this._injections}registerRule(t){let e=++this._lastRuleId,n=t(e);return this._ruleId2desc[e]=n,n}getRule(t){return this._ruleId2desc[t]}getExternalGrammar(t,e){if(this._includedGrammars[t])return this._includedGrammars[t];if(this._grammarRepository){let n=this._grammarRepository.lookup(t);if(n)return this._includedGrammars[t]=or(n,e&&e.$base),this._includedGrammars[t]}}tokenizeLine(t,e,n=0){let r=this._tokenize(t,e,!1,n);return{tokens:r.lineTokens.getResult(r.ruleStack,r.lineLength),ruleStack:r.ruleStack,stoppedEarly:r.stoppedEarly}}tokenizeLine2(t,e,n=0){let r=this._tokenize(t,e,!0,n);return{tokens:r.lineTokens.getBinaryResult(r.ruleStack,r.lineLength),ruleStack:r.ruleStack,stoppedEarly:r.stoppedEarly}}_tokenize(t,e,n,r){this._rootId===-1&&(this._rootId=br.getCompiledRuleId(this._grammar.repository.$self,this,this._grammar.repository),this.getInjections());let a;if(!e||e===Jt.NULL){a=!0;let c=this._basicScopeAttributesProvider.getDefaultAttributes(),u=this.themeProvider.getDefaults(),d=ce.set(0,c.languageId,c.tokenType,null,u.fontStyle,u.foregroundId,u.backgroundId),p=this.getRule(this._rootId).getName(null,null),f;p?f=Me.createRootAndLookUpScopeName(p,d,this):f=Me.createRoot("unknown",d),e=new Jt(null,this._rootId,-1,-1,!1,null,f,f)}else a=!1,e.reset();t=t+` +`;let o=this.createOnigString(t),i=o.content.length,s=new ui(n,t,this._tokenTypeMatchers,this.balancedBracketSelectors),l=wr(this,o,a,0,e,s,!0,r);return gr(o),{lineLength:i,lineTokens:s,ruleStack:l.stack,stoppedEarly:l.stoppedEarly}}};function or(t,e){return t=Ao(t),t.repository=t.repository||{},t.repository.$self={$vscodeTextmateLocation:t.$vscodeTextmateLocation,patterns:t.patterns,name:t.scopeName},t.repository.$base=e||t.repository.$self,t}var Me=class Y{constructor(e,n,r){this.parent=e,this.scopePath=n,this.tokenAttributes=r}static fromExtension(e,n){let r=e,a=e?.scopePath??null;for(let o of n)a=Wt.push(a,o.scopeNames),r=new Y(r,a,o.encodedTokenAttributes);return r}static createRoot(e,n){return new Y(null,new Wt(null,e),n)}static createRootAndLookUpScopeName(e,n,r){let a=r.getMetadataForScope(e),o=new Wt(null,e),i=r.themeProvider.themeMatch(o),s=Y.mergeAttributes(n,a,i);return new Y(null,o,s)}get scopeName(){return this.scopePath.scopeName}toString(){return this.getScopeNames().join(" ")}equals(e){return Y.equals(this,e)}static equals(e,n){do{if(e===n||!e&&!n)return!0;if(!e||!n||e.scopeName!==n.scopeName||e.tokenAttributes!==n.tokenAttributes)return!1;e=e.parent,n=n.parent}while(!0)}static mergeAttributes(e,n,r){let a=-1,o=0,i=0;return r!==null&&(a=r.fontStyle,o=r.foregroundId,i=r.backgroundId),ce.set(e,n.languageId,n.tokenType,null,a,o,i)}pushAttributed(e,n){if(e===null)return this;if(e.indexOf(" ")===-1)return Y._pushAttributed(this,e,n);let r=e.split(/ /g),a=this;for(let o of r)a=Y._pushAttributed(a,o,n);return a}static _pushAttributed(e,n,r){let a=r.getMetadataForScope(n),o=e.scopePath.push(n),i=r.themeProvider.themeMatch(o),s=Y.mergeAttributes(e.tokenAttributes,a,i);return new Y(e,o,s)}getScopeNames(){return this.scopePath.getSegments()}getExtensionIfDefined(e){let n=[],r=this;for(;r&&r!==e;)n.push({encodedTokenAttributes:r.tokenAttributes,scopeNames:r.scopePath.getExtensionIfDefined(r.parent?.scopePath??null)}),r=r.parent;return r===e?n.reverse():void 0}},H,Jt=(H=class{constructor(e,n,r,a,o,i,s,l){m(this,"_stackElementBrand");m(this,"_enterPos");m(this,"_anchorPos");m(this,"depth");this.parent=e,this.ruleId=n,this.beginRuleCapturedEOL=o,this.endRule=i,this.nameScopesList=s,this.contentNameScopesList=l,this.depth=this.parent?this.parent.depth+1:1,this._enterPos=r,this._anchorPos=a}equals(e){return e===null?!1:H._equals(this,e)}static _equals(e,n){return e===n?!0:this._structuralEquals(e,n)?Me.equals(e.contentNameScopesList,n.contentNameScopesList):!1}static _structuralEquals(e,n){do{if(e===n||!e&&!n)return!0;if(!e||!n||e.depth!==n.depth||e.ruleId!==n.ruleId||e.endRule!==n.endRule)return!1;e=e.parent,n=n.parent}while(!0)}clone(){return this}static _reset(e){for(;e;)e._enterPos=-1,e._anchorPos=-1,e=e.parent}reset(){H._reset(this)}pop(){return this.parent}safePop(){return this.parent?this.parent:this}push(e,n,r,a,o,i,s){return new H(this,e,n,r,a,o,i,s)}getEnterPos(){return this._enterPos}getAnchorPos(){return this._anchorPos}getRule(e){return e.getRule(this.ruleId)}toString(){let e=[];return this._writeString(e,0),"["+e.join(",")+"]"}_writeString(e,n){return this.parent&&(n=this.parent._writeString(e,n)),e[n++]=`(${this.ruleId}, ${this.nameScopesList?.toString()}, ${this.contentNameScopesList?.toString()})`,n}withContentNameScopesList(e){return this.contentNameScopesList===e?this:this.parent.push(this.ruleId,this._enterPos,this._anchorPos,this.beginRuleCapturedEOL,this.endRule,this.nameScopesList,e)}withEndRule(e){return this.endRule===e?this:new H(this.parent,this.ruleId,this._enterPos,this._anchorPos,this.beginRuleCapturedEOL,e,this.nameScopesList,this.contentNameScopesList)}hasSameRuleAs(e){let n=this;for(;n&&n._enterPos===e._enterPos;){if(n.ruleId===e.ruleId)return!0;n=n.parent}return!1}toStateStackFrame(){return{ruleId:this.ruleId,beginRuleCapturedEOL:this.beginRuleCapturedEOL,endRule:this.endRule,nameScopesList:this.nameScopesList?.getExtensionIfDefined(this.parent?.nameScopesList??null)??[],contentNameScopesList:this.contentNameScopesList?.getExtensionIfDefined(this.nameScopesList)??[]}}static pushFrame(e,n){let r=Me.fromExtension(e?.nameScopesList??null,n.nameScopesList);return new H(e,n.ruleId,n.enterPos??-1,n.anchorPos??-1,n.beginRuleCapturedEOL,n.endRule,r,Me.fromExtension(r,n.contentNameScopesList))}},m(H,"NULL",new H(null,0,0,0,!1,null,null,null)),H),ci=class{constructor(t,e){m(this,"balancedBracketScopes");m(this,"unbalancedBracketScopes");m(this,"allowAny",!1);this.balancedBracketScopes=t.flatMap(n=>n==="*"?(this.allowAny=!0,[]):lt(n,dt).map(r=>r.matcher)),this.unbalancedBracketScopes=e.flatMap(n=>lt(n,dt).map(r=>r.matcher))}get matchesAlways(){return this.allowAny&&this.unbalancedBracketScopes.length===0}get matchesNever(){return this.balancedBracketScopes.length===0&&!this.allowAny}match(t){for(let e of this.unbalancedBracketScopes)if(e(t))return!1;for(let e of this.balancedBracketScopes)if(e(t))return!0;return this.allowAny}},ui=class{constructor(t,e,n,r){m(this,"_emitBinaryTokens");m(this,"_lineText");m(this,"_tokens");m(this,"_binaryTokens");m(this,"_lastTokenEndIndex");m(this,"_tokenTypeOverrides");this.balancedBracketSelectors=r,this._emitBinaryTokens=t,this._tokenTypeOverrides=n,this._lineText=null,this._tokens=[],this._binaryTokens=[],this._lastTokenEndIndex=0}produce(t,e){this.produceFromScopes(t.contentNameScopesList,e)}produceFromScopes(t,e){if(this._lastTokenEndIndex>=e)return;if(this._emitBinaryTokens){let r=t?.tokenAttributes??0,a=!1;if(this.balancedBracketSelectors?.matchesAlways&&(a=!0),this._tokenTypeOverrides.length>0||this.balancedBracketSelectors&&!this.balancedBracketSelectors.matchesAlways&&!this.balancedBracketSelectors.matchesNever){let o=t?.getScopeNames()??[];for(let i of this._tokenTypeOverrides)i.matcher(o)&&(r=ce.set(r,0,i.type,null,-1,0,0));this.balancedBracketSelectors&&(a=this.balancedBracketSelectors.match(o))}if(a&&(r=ce.set(r,0,8,a,-1,0,0)),this._binaryTokens.length>0&&this._binaryTokens[this._binaryTokens.length-1]===r){this._lastTokenEndIndex=e;return}this._binaryTokens.push(this._lastTokenEndIndex),this._binaryTokens.push(r),this._lastTokenEndIndex=e;return}let n=t?.getScopeNames()??[];this._tokens.push({startIndex:this._lastTokenEndIndex,endIndex:e,scopes:n}),this._lastTokenEndIndex=e}getResult(t,e){return this._tokens.length>0&&this._tokens[this._tokens.length-1].startIndex===e-1&&this._tokens.pop(),this._tokens.length===0&&(this._lastTokenEndIndex=-1,this.produce(t,e),this._tokens[this._tokens.length-1].startIndex=0),this._tokens}getBinaryResult(t,e){this._binaryTokens.length>0&&this._binaryTokens[this._binaryTokens.length-2]===e-1&&(this._binaryTokens.pop(),this._binaryTokens.pop()),this._binaryTokens.length===0&&(this._lastTokenEndIndex=-1,this.produce(t,e),this._binaryTokens[this._binaryTokens.length-2]=0);let n=new Uint32Array(this._binaryTokens.length);for(let r=0,a=this._binaryTokens.length;r0;)o.Q.map(i=>this._loadSingleGrammar(i.scopeName)),o.processQueue();return this._grammarForScopeName(t,e,n,r,a)}_loadSingleGrammar(t){this._ensureGrammarCache.has(t)||(this._doLoadSingleGrammar(t),this._ensureGrammarCache.set(t,!0))}_doLoadSingleGrammar(t){let e=this._options.loadGrammar(t);if(e){let n=typeof this._options.getInjections=="function"?this._options.getInjections(t):void 0;this._syncRegistry.addGrammar(e,n)}}addGrammar(t,e=[],n=0,r=null){return this._syncRegistry.addGrammar(t,e),this._grammarForScopeName(t.scopeName,n,r)}_grammarForScopeName(t,e=0,n=null,r=null,a=null){return this._syncRegistry.grammarForScopeName(t,e,n,r,a)}},pt=Jt.NULL;function We(t,e){let n=typeof t=="string"?{}:{...t.colorReplacements},r=typeof t=="string"?t:t.name;for(let[a,o]of Object.entries(e?.colorReplacements||{}))typeof o=="string"?n[a]=o:a===r&&Object.assign(n,o);return n}function K(t,e){return t&&(e?.[t?.toLowerCase()]||t)}function Er(t){return Array.isArray(t)?t:[t]}async function Kt(t){return Promise.resolve(typeof t=="function"?t():t).then(e=>e.default||e)}function qe(t){return!t||["plaintext","txt","text","plain"].includes(t)}function Nr(t){return t==="ansi"||qe(t)}function Ve(t){return t==="none"}function Rr(t){return Ve(t)}var pi=/(\r?\n)/g;function Re(t,e=!1){if(t.length===0)return[["",0]];let n=t.split(pi),r=0,a=[];for(let o=0;o!l.name&&!l.scope):void 0;s?.settings?.foreground&&(r=s.settings.foreground),s?.settings?.background&&(n=s.settings.background),!r&&e?.colors?.["editor.foreground"]&&(r=e.colors["editor.foreground"]),!n&&e?.colors?.["editor.background"]&&(n=e.colors["editor.background"]),r||(r=e.type==="light"?Sr.light:Sr.dark),n||(n=e.type==="light"?xr.light:xr.dark),e.fg=r,e.bg=n}e.settings[0]&&e.settings[0].settings&&!e.settings[0].scope||e.settings.unshift({settings:{foreground:e.fg,background:e.bg}});let a=0,o=new Map;function i(s){if(o.has(s))return o.get(s);a+=1;let l=`#${a.toString(16).padStart(8,"0").toLowerCase()}`;return e.colorReplacements?.[`#${l}`]?i(s):(o.set(s,l),l)}e.settings=e.settings.map(s=>{let l=s.settings?.foreground&&!s.settings.foreground.startsWith("#"),c=s.settings?.background&&!s.settings.background.startsWith("#");if(!l&&!c)return s;let u={...s,settings:{...s.settings}};if(l){let d=i(s.settings.foreground);e.colorReplacements[d]=s.settings.foreground,u.settings.foreground=d}if(c){let d=i(s.settings.background);e.colorReplacements[d]=s.settings.background,u.settings.background=d}return u});for(let s of Object.keys(e.colors||{}))if((s==="editor.foreground"||s==="editor.background"||s.startsWith("terminal.ansi"))&&!e.colors[s]?.startsWith("#")){let l=i(e.colors[s]);e.colorReplacements[l]=e.colors[s],e.colors[s]=l}return Object.defineProperty(e,Ir,{enumerable:!1,writable:!1,value:!0}),e}async function Br(t){return[...new Set((await Promise.all(t.filter(e=>!Nr(e)).map(async e=>await Kt(e).then(n=>Array.isArray(n)?n:[n])))).flat())]}async function jr(t){return(await Promise.all(t.map(async e=>Rr(e)?null:ft(await Kt(e))))).filter(e=>!!e)}function Tr(t,e){if(!e)return t;if(e[t]){let n=new Set([t]);for(;e[t];){if(t=e[t],n.has(t))throw new A(`Circular alias \`${[...n].join(" -> ")} -> ${t}\``);n.add(t)}}return t}var fi=class extends _r{constructor(e,n,r,a={}){super(e);m(this,"_resolver");m(this,"_themes");m(this,"_langs");m(this,"_alias");m(this,"_resolvedThemes",new Map);m(this,"_resolvedGrammars",new Map);m(this,"_langMap",new Map);m(this,"_langGraph",new Map);m(this,"_textmateThemeCache",new WeakMap);m(this,"_loadedThemesCache",null);m(this,"_loadedLanguagesCache",null);this._resolver=e,this._themes=n,this._langs=r,this._alias=a,this._themes.map(o=>this.loadTheme(o)),this.loadLanguages(this._langs)}getTheme(e){return typeof e=="string"?this._resolvedThemes.get(e):this.loadTheme(e)}loadTheme(e){let n=ft(e);return n.name&&(this._resolvedThemes.set(n.name,n),this._loadedThemesCache=null),n}getLoadedThemes(){return this._loadedThemesCache||(this._loadedThemesCache=[...this._resolvedThemes.keys()]),this._loadedThemesCache}setTheme(e){let n=this._textmateThemeCache.get(e);n||(n=Ge.createFromRawTheme(e),this._textmateThemeCache.set(e,n)),this._syncRegistry.setTheme(n)}getGrammar(e){return e=Tr(e,this._alias),this._resolvedGrammars.get(e)}loadLanguage(e){if(this.getGrammar(e.name))return;let n=new Set([...this._langMap.values()].filter(o=>o.embeddedLangsLazy?.includes(e.name)));this._resolver.addLanguage(e);let r={balancedBracketSelectors:e.balancedBracketSelectors||["*"],unbalancedBracketSelectors:e.unbalancedBracketSelectors||[]};this._syncRegistry._rawGrammars.set(e.scopeName,e);let a=this.loadGrammarWithConfiguration(e.scopeName,1,r);if(a.name=e.name,this._resolvedGrammars.set(e.name,a),e.aliases&&e.aliases.forEach(o=>{this._alias[o]=e.name}),this._loadedLanguagesCache=null,n.size)for(let o of n)this._resolvedGrammars.delete(o.name),this._loadedLanguagesCache=null,this._syncRegistry?._injectionGrammars?.delete(o.scopeName),this._syncRegistry?._grammars?.delete(o.scopeName),this.loadLanguage(this._langMap.get(o.name))}dispose(){super.dispose(),this._resolvedThemes.clear(),this._resolvedGrammars.clear(),this._langMap.clear(),this._langGraph.clear(),this._loadedThemesCache=null}loadLanguages(e){for(let a of e)this.resolveEmbeddedLanguages(a);let n=[...this._langGraph.entries()],r=n.filter(([a,o])=>!o);if(r.length){let a=n.filter(([o,i])=>i?(i.embeddedLanguages||i.embeddedLangs)?.some(s=>r.map(([l])=>l).includes(s)):!1).filter(o=>!r.includes(o));throw new A(`Missing languages ${r.map(([o])=>`\`${o}\``).join(", ")}, required by ${a.map(([o])=>`\`${o}\``).join(", ")}`)}for(let[a,o]of n)this._resolver.addLanguage(o);for(let[a,o]of n)this.loadLanguage(o)}getLoadedLanguages(){return this._loadedLanguagesCache||(this._loadedLanguagesCache=[...new Set([...this._resolvedGrammars.keys(),...Object.keys(this._alias)])]),this._loadedLanguagesCache}resolveEmbeddedLanguages(e){this._langMap.set(e.name,e),this._langGraph.set(e.name,e);let n=e.embeddedLanguages??e.embeddedLangs;if(n)for(let r of n)this._langGraph.set(r,this._langMap.get(r))}},gi=class{constructor(t,e){m(this,"_langs",new Map);m(this,"_scopeToLang",new Map);m(this,"_injections",new Map);m(this,"_onigLib");this._onigLib={createOnigScanner:n=>t.createScanner(n),createOnigString:n=>t.createString(n)},e.forEach(n=>this.addLanguage(n))}get onigLib(){return this._onigLib}getLangRegistration(t){return this._langs.get(t)}loadGrammar(t){return this._scopeToLang.get(t)}addLanguage(t){this._langs.set(t.name,t),t.aliases&&t.aliases.forEach(e=>{this._langs.set(e,t)}),this._scopeToLang.set(t.scopeName,t),t.injectTo&&t.injectTo.forEach(e=>{this._injections.get(e)||this._injections.set(e,[]),this._injections.get(e).push(t.scopeName)})}getInjections(t){let e=t.split("."),n=[];for(let r=1;r<=e.length;r++){let a=e.slice(0,r).join(".");n=[...n,...this._injections.get(a)||[]]}return n}},Ue=0;function en(t){Ue+=1,t.warnings!==!1&&Ue>=10&&Ue%10===0&&console.warn(`[Shiki] ${Ue} instances have been created. Shiki is supposed to be used as a singleton, consider refactoring your code to cache your highlighter instance; Or call \`highlighter.dispose()\` to release unused instances.`);let e=!1;if(!t.engine)throw new A("`engine` option is required for synchronous mode");let n=(t.langs||[]).flat(1),r=(t.themes||[]).flat(1).map(ft),a=new fi(new gi(t.engine,n),r,n,t.langAlias),o;function i(y){return Tr(y,t.langAlias)}function s(y){w();let v=a.getGrammar(typeof y=="string"?y:y.name);if(!v)throw new A(`Language \`${y}\` not found, you may need to load it first`);return v}function l(y){if(y==="none")return{bg:"",fg:"",name:"none",settings:[],type:"dark"};w();let v=a.getTheme(y);if(!v)throw new A(`Theme \`${y}\` not found, you may need to load it first`);return v}function c(y){w();let v=l(y);return o!==y&&(a.setTheme(v),o=y),{theme:v,colorMap:a.getColorMap()}}function u(){return w(),a.getLoadedThemes()}function d(){return w(),a.getLoadedLanguages()}function p(...y){w(),a.loadLanguages(y.flat(1))}async function f(...y){return p(await Br(y))}function g(...y){w();for(let v of y.flat(1))a.loadTheme(v)}async function k(...y){return w(),g(await jr(y))}function w(){if(e)throw new A("Shiki instance has been disposed")}function b(){e||(e=!0,a.dispose(),Ue-=1)}return{setTheme:c,getTheme:l,getLanguage:s,getLoadedThemes:u,getLoadedLanguages:d,resolveLangAlias:i,loadLanguage:f,loadLanguageSync:p,loadTheme:k,loadThemeSync:g,dispose:b,[Symbol.dispose]:b}}async function tn(t){t.engine||console.warn("`engine` option is required. Use `createOnigurumaEngine` or `createJavaScriptRegexEngine` to create an engine.");let[e,n,r]=await Promise.all([jr(t.themes||[]),Br(t.langs||[]),t.engine]);return en({...t,themes:e,langs:n,engine:r})}var Lr=new WeakMap;function Ze(t,e){Lr.set(t,e)}function Be(t){return Lr.get(t)}var gt=class $r{constructor(...e){m(this,"_stacks",{});m(this,"lang");if(e.length===2){let[n,r]=e;this.lang=r,this._stacks=n}else{let[n,r,a]=e;this.lang=r,this._stacks={[a]:n}}}get themes(){return Object.keys(this._stacks)}get theme(){return this.themes[0]}get _stack(){return this._stacks[this.theme]}static initial(e,n){return new $r(Object.fromEntries(Er(n).map(r=>[r,pt])),e)}getInternalStack(e=this.theme){return this._stacks[e]}getScopes(e=this.theme){return mi(this._stacks[e])}toJSON(){return{lang:this.lang,theme:this.theme,themes:this.themes,scopes:this.getScopes()}}};function mi(t){let e=[],n=new Set;function r(a){if(n.has(a))return;n.add(a);let o=a?.nameScopesList?.scopeName;o&&e.push(o),a.parent&&r(a.parent)}return r(t),e}function hi(t,e){if(!(t instanceof gt))throw new A("Invalid grammar state");return t.getInternalStack(e)}var bi=/,/,yi=/ /;function nn(t,e,n={}){let{theme:r=t.getLoadedThemes()[0]}=n;if(qe(t.resolveLangAlias(n.lang||"text"))||Ve(r))return Re(e).map(s=>[{content:s[0],offset:s[1]}]);let{theme:a,colorMap:o}=t.setTheme(r),i=t.getLanguage(n.lang||"text");if(n.grammarState){if(n.grammarState.lang!==i.name)throw new A(`Grammar state language "${n.grammarState.lang}" does not match highlight language "${i.name}"`);if(!n.grammarState.themes.includes(a.name))throw new A(`Grammar state themes "${n.grammarState.themes}" do not contain highlight theme "${a.name}"`)}return Fr(e,i,a,o,n)}function Pr(...t){if(t.length===2)return Be(t[1]);let[e,n,r={}]=t,{lang:a="text",theme:o=e.getLoadedThemes()[0]}=r;if(qe(a)||Ve(o))throw new A("Plain language does not have grammar state");if(a==="ansi")throw new A("ANSI language does not have grammar state");let{theme:i,colorMap:s}=e.setTheme(o),l=e.getLanguage(a);return new gt(rn(n,l,i,s,r).stateStack,l.name,i.name)}function Fr(t,e,n,r,a){let o=rn(t,e,n,r,a),i=new gt(o.stateStack,e.name,n.name);return Ze(o.tokens,i),o.tokens}function rn(t,e,n,r,a){let o=We(n,a),{tokenizeMaxLineLength:i=0,tokenizeTimeLimit:s=500,includeExplanation:l=!1}=a,c=Re(t),u=a.grammarState?hi(a.grammarState,n.name)??pt:a.grammarContextCode!=null?rn(a.grammarContextCode,e,n,r,{...a,grammarState:void 0,grammarContextCode:void 0}).stateStack:pt,d=[],p=[];for(let f=0,g=c.length;f0&&k.length>=i){d=[],p.push([{content:k,offset:w,color:"",fontStyle:0}]);continue}let b,y,v;l&&l!=="tokenType"&&(b=e.tokenizeLine(k,u,s),y=b.tokens,v=0);let S=e.tokenizeLine2(k,u,s),I=S.tokens.length/2;for(let L=0;LDt.trim());break;case"object":Ne=J.scope;break;default:continue}On.push({settings:J,selectors:Ne.map(Dt=>Dt.split(yi))})}X.explanation=[];let Dn=0;for(;F+Dn({scopeName:e}))}function wi(t,e){let n=[];for(let r=0,a=e.length;r=0&&a>=0;)Ar(t[r],n[a])&&(r-=1),a-=1;return r===-1}function Ci(t,e,n){let r=[];for(let{selectors:a,settings:o}of t)for(let i of a)if(vi(i,e,n)){r.push(o);break}return r}function mt(t,e,n,r=nn){let a=Object.entries(n.themes).filter(c=>c[1]).map(c=>({color:c[0],theme:c[1]})),o=a.map(c=>{let u=r(t,e,{...n,theme:c.theme});return{tokens:u,state:Be(u),theme:typeof c.theme=="string"?c.theme:c.theme.name}}),i=_i(...o.map(c=>c.tokens)),s=i[0].map((c,u)=>c.map((d,p)=>{let f={content:d.content,variants:{},offset:d.offset};return"includeExplanation"in n&&n.includeExplanation&&(f.explanation=d.explanation),i.forEach((g,k)=>{let{content:w,explanation:b,offset:y,...v}=g[u][p];f.variants[a[k].color]=v}),f})),l=o[0].state?new gt(Object.fromEntries(o.map(c=>[c.theme,c.state?.getInternalStack(c.theme)])),o[0].state.lang):void 0;return l&&Ze(s,l),s}function _i(...t){let e=t.map(()=>[]),n=t.length;for(let r=0;rl[r]),o=e.map(()=>[]);e.forEach((l,c)=>l.push(o[c]));let i=a.map(()=>0),s=a.map(l=>l[0]);for(;s.every(l=>l);){let l=Math.min(...s.map(c=>c.content.length));for(let c=0;cC,booleanish:()=>E,commaOrSpaceSeparated:()=>G,commaSeparated:()=>te,number:()=>h,overloadedBoolean:()=>ht,spaceSeparated:()=>x});var Si=0,C=ye(),E=ye(),ht=ye(),h=ye(),x=ye(),te=ye(),G=ye();function ye(){return 2**++Si}var on=Object.keys(Ye),ke=class extends T{constructor(e,n,r,a){let o=-1;if(super(e,n),Gr(this,"space",a),typeof r=="number")for(;++o4&&n.slice(0,4)==="data"&&Ii.test(e)){if(e.charAt(4)==="-"){let o=e.slice(5).replace(zr,Ei);r="data"+o.charAt(0).toUpperCase()+o.slice(1)}else{let o=e.slice(4);if(!zr.test(o)){let i=o.replace(xi,Ai);i.charAt(0)!=="-"&&(i="-"+i),e="data"+i}}a=ke}return new a(r,e)}function Ai(t){return"-"+t.toLowerCase()}function Ei(t){return t.charAt(1).toUpperCase()}var Hr=an([sn,Or,ln,cn,un],"html"),kt=an([sn,Dr,ln,cn,un],"svg");var Ur={}.hasOwnProperty;function Wr(t,e){let n=e||{};function r(a,...o){let i=r.invalid,s=r.handlers;if(a&&Ur.call(a,t)){let l=String(a[t]);i=Ur.call(s,l)?s[l]:r.unknown}if(i)return i.call(this,a,...o)}return r.handlers=n.handlers||{},r.invalid=n.invalid,r.unknown=n.unknown,r}var Ni=/["&'<>`]/g,Ri=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Bi=/[\x01-\t\v\f\x0E-\x1F\x7F\x81\x8D\x8F\x90\x9D\xA0-\uFFFF]/g,ji=/[|\\{}()[\]^$+*?.]/g,qr=new WeakMap;function Vr(t,e){if(t=t.replace(e.subset?Ti(e.subset):Ni,r),e.subset||e.escapeOnly)return t;return t.replace(Ri,n).replace(Bi,r);function n(a,o,i){return e.format((a.charCodeAt(0)-55296)*1024+a.charCodeAt(1)-56320+65536,i.charCodeAt(o+2),e)}function r(a,o,i){return e.format(a.charCodeAt(0),i.charCodeAt(o+1),e)}}function Ti(t){let e=qr.get(t);return e||(e=Li(t),qr.set(t,e)),e}function Li(t){let e=[],n=-1;for(;++n",OElig:"\u0152",oelig:"\u0153",Scaron:"\u0160",scaron:"\u0161",Yuml:"\u0178",circ:"\u02C6",tilde:"\u02DC",ensp:"\u2002",emsp:"\u2003",thinsp:"\u2009",zwnj:"\u200C",zwj:"\u200D",lrm:"\u200E",rlm:"\u200F",ndash:"\u2013",mdash:"\u2014",lsquo:"\u2018",rsquo:"\u2019",sbquo:"\u201A",ldquo:"\u201C",rdquo:"\u201D",bdquo:"\u201E",dagger:"\u2020",Dagger:"\u2021",permil:"\u2030",lsaquo:"\u2039",rsaquo:"\u203A",euro:"\u20AC"};var Jr=["cent","copy","divide","gt","lt","not","para","times"];var Qr={}.hasOwnProperty,pn={},vt;for(vt in wt)Qr.call(wt,vt)&&(pn[wt[vt]]=vt);var Fi=/[^\dA-Za-z]/;function Kr(t,e,n,r){let a=String.fromCharCode(t);if(Qr.call(pn,a)){let o=pn[a],i="&"+o;return n&&Yr.includes(o)&&!Jr.includes(o)&&(!r||e&&e!==61&&Fi.test(String.fromCharCode(e)))?i:i+";"}return""}function ea(t,e,n){let r=Zr(t,e,n.omitOptionalSemicolons),a;if((n.useNamedReferences||n.useShortestReferences)&&(a=Kr(t,e,n.omitOptionalSemicolons,n.attribute)),(n.useShortestReferences||!a)&&n.useShortestReferences){let o=Xr(t,e,n.omitOptionalSemicolons);o.length|^->||--!>|"],Oi=["<",">"];function ta(t,e,n,r){return r.settings.bogusComments?"":"";function a(o){return ne(o,Object.assign({},r.settings.characterReferences,{subset:Oi}))}}function na(t,e,n,r){return""}function fn(t,e){let n=String(t);if(typeof e!="string")throw new TypeError("Expected character");let r=0,a=n.indexOf(e);for(;a!==-1;)r++,a=n.indexOf(e,a+e.length);return r}function ra(t,e){let n=e||{};return(t[t.length-1]===""?[...t,""]:t).join((n.padRight?" ":"")+","+(n.padLeft===!1?"":" ")).trim()}function aa(t){return t.join(" ").trim()}var Di=/[ \t\n\f\r]/g;function we(t){return typeof t=="object"?t.type==="text"?oa(t.value):!1:oa(t)}function oa(t){return t.replace(Di,"")===""}var N=ia(1),gn=ia(-1),zi=[];function ia(t){return e;function e(n,r,a){let o=n?n.children:zi,i=(r||0)+t,s=o[i];if(!a)for(;s&&we(s);)i+=t,s=o[i];return s}}var Hi={}.hasOwnProperty;function Ct(t){return e;function e(n,r,a){return Hi.call(t,n.tagName)&&t[n.tagName](n,r,a)}}var Je=Ct({body:Wi,caption:mn,colgroup:mn,dd:Xi,dt:Zi,head:mn,html:Ui,li:Vi,optgroup:Yi,option:Ji,p:qi,rp:sa,rt:sa,tbody:Ki,td:la,tfoot:es,th:la,thead:Qi,tr:ts});function mn(t,e,n){let r=N(n,e,!0);return!r||r.type!=="comment"&&!(r.type==="text"&&we(r.value.charAt(0)))}function Ui(t,e,n){let r=N(n,e);return!r||r.type!=="comment"}function Wi(t,e,n){let r=N(n,e);return!r||r.type!=="comment"}function qi(t,e,n){let r=N(n,e);return r?r.type==="element"&&(r.tagName==="address"||r.tagName==="article"||r.tagName==="aside"||r.tagName==="blockquote"||r.tagName==="details"||r.tagName==="div"||r.tagName==="dl"||r.tagName==="fieldset"||r.tagName==="figcaption"||r.tagName==="figure"||r.tagName==="footer"||r.tagName==="form"||r.tagName==="h1"||r.tagName==="h2"||r.tagName==="h3"||r.tagName==="h4"||r.tagName==="h5"||r.tagName==="h6"||r.tagName==="header"||r.tagName==="hgroup"||r.tagName==="hr"||r.tagName==="main"||r.tagName==="menu"||r.tagName==="nav"||r.tagName==="ol"||r.tagName==="p"||r.tagName==="pre"||r.tagName==="section"||r.tagName==="table"||r.tagName==="ul"):!n||!(n.type==="element"&&(n.tagName==="a"||n.tagName==="audio"||n.tagName==="del"||n.tagName==="ins"||n.tagName==="map"||n.tagName==="noscript"||n.tagName==="video"))}function Vi(t,e,n){let r=N(n,e);return!r||r.type==="element"&&r.tagName==="li"}function Zi(t,e,n){let r=N(n,e);return!!(r&&r.type==="element"&&(r.tagName==="dt"||r.tagName==="dd"))}function Xi(t,e,n){let r=N(n,e);return!r||r.type==="element"&&(r.tagName==="dt"||r.tagName==="dd")}function sa(t,e,n){let r=N(n,e);return!r||r.type==="element"&&(r.tagName==="rp"||r.tagName==="rt")}function Yi(t,e,n){let r=N(n,e);return!r||r.type==="element"&&r.tagName==="optgroup"}function Ji(t,e,n){let r=N(n,e);return!r||r.type==="element"&&(r.tagName==="option"||r.tagName==="optgroup")}function Qi(t,e,n){let r=N(n,e);return!!(r&&r.type==="element"&&(r.tagName==="tbody"||r.tagName==="tfoot"))}function Ki(t,e,n){let r=N(n,e);return!r||r.type==="element"&&(r.tagName==="tbody"||r.tagName==="tfoot")}function es(t,e,n){return!N(n,e)}function ts(t,e,n){let r=N(n,e);return!r||r.type==="element"&&r.tagName==="tr"}function la(t,e,n){let r=N(n,e);return!r||r.type==="element"&&(r.tagName==="td"||r.tagName==="th")}var ca=Ct({body:as,colgroup:os,head:rs,html:ns,tbody:is});function ns(t){let e=N(t,-1);return!e||e.type!=="comment"}function rs(t){let e=new Set;for(let r of t.children)if(r.type==="element"&&(r.tagName==="base"||r.tagName==="title")){if(e.has(r.tagName))return!1;e.add(r.tagName)}let n=t.children[0];return!n||n.type==="element"}function as(t){let e=N(t,-1,!0);return!e||e.type!=="comment"&&!(e.type==="text"&&we(e.value.charAt(0)))&&!(e.type==="element"&&(e.tagName==="meta"||e.tagName==="link"||e.tagName==="script"||e.tagName==="style"||e.tagName==="template"))}function os(t,e,n){let r=gn(n,e),a=N(t,-1,!0);return n&&r&&r.type==="element"&&r.tagName==="colgroup"&&Je(r,n.children.indexOf(r),n)?!1:!!(a&&a.type==="element"&&a.tagName==="col")}function is(t,e,n){let r=gn(n,e),a=N(t,-1);return n&&r&&r.type==="element"&&(r.tagName==="thead"||r.tagName==="tbody")&&Je(r,n.children.indexOf(r),n)?!1:!!(a&&a.type==="element"&&a.tagName==="tr")}var _t={name:[[` +\f\r &/=>`.split(""),` +\f\r "&'/=>\``.split("")],[`\0 +\f\r "&'/<=>`.split(""),`\0 +\f\r "&'/<=>\``.split("")]],unquoted:[[` +\f\r &>`.split(""),`\0 +\f\r "&'<=>\``.split("")],[`\0 +\f\r "&'<=>\``.split(""),`\0 +\f\r "&'<=>\``.split("")]],single:[["&'".split(""),"\"&'`".split("")],["\0&'".split(""),"\0\"&'`".split("")]],double:[['"&'.split(""),"\"&'`".split("")],['\0"&'.split(""),"\0\"&'`".split("")]]};function ua(t,e,n,r){let a=r.schema,o=a.space==="svg"?!1:r.settings.omitOptionalTags,i=a.space==="svg"?r.settings.closeEmptyElements:r.settings.voids.includes(t.tagName.toLowerCase()),s=[],l;a.space==="html"&&t.tagName==="svg"&&(r.schema=kt);let c=ss(r,t.properties),u=r.all(a.space==="html"&&t.tagName==="template"?t.content:t);return r.schema=a,u&&(i=!1),(c||!o||!ca(t,e,n))&&(s.push("<",t.tagName,c?" "+c:""),i&&(a.space==="svg"||r.settings.closeSelfClosing)&&(l=c.charAt(c.length-1),(!r.settings.tightSelfClosing||l==="/"||l&&l!=='"'&&l!=="'")&&s.push(" "),s.push("/")),s.push(">")),s.push(u),!i&&(!o||!Je(t,e,n))&&s.push(""),s.join("")}function ss(t,e){let n=[],r=-1,a;if(e){for(a in e)if(e[a]!==null&&e[a]!==void 0){let o=ls(t,a,e[a]);o&&n.push(o)}}for(;++rfn(n,t.alternative)&&(i=t.alternative),s=i+ne(n,Object.assign({},t.settings.characterReferences,{subset:(i==="'"?_t.single:_t.double)[a][o],attribute:!0}))+i),l+(s&&"="+s))}var cs=["<","&"];function St(t,e,n,r){return n&&n.type==="element"&&(n.tagName==="script"||n.tagName==="style")?t.value:ne(t.value,Object.assign({},r.settings.characterReferences,{subset:cs}))}function da(t,e,n,r){return r.settings.allowDangerousHtml?t.value:St(t,e,n,r)}function pa(t,e,n,r){return r.all(t)}var fa=Wr("type",{invalid:us,unknown:ds,handlers:{comment:ta,doctype:na,element:ua,raw:da,root:pa,text:St}});function us(t){throw new Error("Expected node, not `"+t+"`")}function ds(t){let e=t;throw new Error("Cannot compile unknown node `"+e.type+"`")}var ps={},fs={},gs=[];function hn(t,e){let n=e||ps,r=n.quote||'"',a=r==='"'?"'":'"';if(r!=='"'&&r!=="'")throw new Error("Invalid quote `"+r+"`, expected `'` or `\"`");return{one:ms,all:hs,settings:{omitOptionalTags:n.omitOptionalTags||!1,allowParseErrors:n.allowParseErrors||!1,allowDangerousCharacters:n.allowDangerousCharacters||!1,quoteSmart:n.quoteSmart||!1,preferUnquoted:n.preferUnquoted||!1,tightAttributes:n.tightAttributes||!1,upperDoctype:n.upperDoctype||!1,tightDoctype:n.tightDoctype||!1,bogusComments:n.bogusComments||!1,tightCommaSeparatedLists:n.tightCommaSeparatedLists||!1,tightSelfClosing:n.tightSelfClosing||!1,collapseEmptyAttributes:n.collapseEmptyAttributes||!1,allowDangerousHtml:n.allowDangerousHtml||!1,voids:n.voids||Mr,characterReferences:n.characterReferences||fs,closeSelfClosing:n.closeSelfClosing||!1,closeEmptyElements:n.closeEmptyElements||!1},schema:n.space==="svg"?kt:Hr,quote:r,alternative:a}.one(Array.isArray(t)?{type:"root",children:t}:t,void 0,void 0)}function ms(t,e,n){return fa(t,e,n,this)}function hs(t){let e=[],n=t&&t.children||gs,r=-1;for(;++ra);function n(a){if(a===t.length)return{line:e.length-1,character:e.at(-1).length};let o=a,i=0;for(let s of e){if(on&&r.push({...t,content:t.content.slice(n,a),offset:t.offset+n}),n=a;return nr-a);return n.length?t.map(r=>r.flatMap(a=>{let o=n.filter(i=>a.offseti-a.offset).sort((i,s)=>i-s);return o.length?ks(a,o):a})):t}function vs(t,e,n,r,a="css-vars"){let o={content:t.content,explanation:t.explanation,offset:t.offset},i=e.map(u=>xt(t.variants[u])),s=new Set(i.flatMap(u=>Object.keys(u))),l={},c=(u,d)=>{let p=d==="color"?"":d==="background-color"?"-bg":`-${d}`;return n+e[u]+(d==="color"?"":p)};return i.forEach((u,d)=>{for(let p of s){let f=u[p]||"inherit";if(d===0&&r&&ys.includes(p))if(r==="light-dark()"&&i.length>1){let g=e.findIndex(w=>w==="light"),k=e.findIndex(w=>w==="dark");if(g===-1||k===-1)throw new A('When using `defaultColor: "light-dark()"`, you must provide both `light` and `dark` themes');l[p]=`light-dark(${i[g][p]||"inherit"}, ${i[k][p]||"inherit"})`,a==="css-vars"&&(l[c(d,p)]=f)}else l[p]=f;else a==="css-vars"&&(l[c(d,p)]=f)}}),o.htmlStyle=l,o}function xt(t){let e={};if(t.color&&(e.color=t.color),t.bgColor&&(e["background-color"]=t.bgColor),t.fontStyle){t.fontStyle&$.Italic&&(e["font-style"]="italic"),t.fontStyle&$.Bold&&(e["font-weight"]="bold");let n=[];t.fontStyle&$.Underline&&n.push("underline"),t.fontStyle&$.Strikethrough&&n.push("line-through"),n.length&&(e["text-decoration"]=n.join(" "))}return e}function yn(t){return typeof t=="string"?t:Object.entries(t).map(([e,n])=>`${e}:${n}`).join(";")}function Cs(){let t=new WeakMap;function e(n){if(!t.has(n.meta)){let a=function(i){if(typeof i=="number"){if(i<0||i>n.source.length)throw new A(`Invalid decoration offset: ${i}. Code length: ${n.source.length}`);return{...r.indexToPos(i),offset:i}}else{let s=r.lines[i.line];if(s===void 0)throw new A(`Invalid decoration position ${JSON.stringify(i)}. Lines length: ${r.lines.length}`);let l=i.character;if(l<0&&(l=s.length+l),l<0||l>s.length)throw new A(`Invalid decoration position ${JSON.stringify(i)}. Line ${i.line} length: ${s.length}`);return{...i,character:l,offset:r.posToIndex(i.line,l)}}},r=bs(n.source),o=(n.options.decorations||[]).map(i=>({...i,start:a(i.start),end:a(i.end)}));_s(o),t.set(n.meta,{decorations:o,converter:r,source:n.source})}return t.get(n.meta)}return{name:"shiki:decorations",tokens(n){if(this.options.decorations?.length)return ws(n,e(this).decorations.flatMap(r=>[r.start.offset,r.end.offset]))},code(n){if(!this.options.decorations?.length)return;let r=e(this),a=[...n.children].filter(u=>u.type==="element"&&u.tagName==="span");if(a.length!==r.converter.lines.length)throw new A(`Number of lines in code element (${a.length}) does not match the number of lines in the source (${r.converter.lines.length}). Failed to apply decorations.`);function o(u,d,p,f){let g=a[u],k="",w=-1,b=-1;if(d===0&&(w=0),p===0&&(b=0),p===Number.POSITIVE_INFINITY&&(b=g.children.length),w===-1||b===-1)for(let v=0;vk);return u.tagName=d.tagName||"span",u.properties={...u.properties,...f,class:u.properties.class},d.properties?.class&&ba(u,d.properties.class),u=g(u,p)||u,u}let l=[],c=r.decorations.sort((u,d)=>d.start.offset-u.start.offset||u.end.offset-d.end.offset);for(let u of c){let{start:d,end:p}=u;if(d.line===p.line)o(d.line,d.character,p.character,u);else if(d.linei(f,u));o(p.line,0,p.character,u)}}l.forEach(u=>u())}}}function _s(t){for(let e=0;en.end.offset)throw new A(`Invalid decoration range: ${JSON.stringify(n.start)} - ${JSON.stringify(n.end)}`);for(let r=e+1;rNumber.parseInt(r));return n.length!==3||n.some(r=>Number.isNaN(r))?void 0:{type:"rgb",rgb:n}}else if(e==="5"){let n=t.shift();if(n)return{type:"table",index:Number(n)}}}function As(t){let e=[];for(;t.length>0;){let n=t.shift();if(!n)continue;let r=Number.parseInt(n);if(!Number.isNaN(r))if(r===0)e.push({type:"resetAll"});else if(r<=9)bn[r]&&e.push({type:"setDecoration",value:bn[r]});else if(r<=29){let a=bn[r-20];a&&(e.push({type:"resetDecoration",value:a}),a==="dim"&&e.push({type:"resetDecoration",value:"bold"}))}else if(r<=37)e.push({type:"setForegroundColor",value:{type:"named",name:ve[r-30]}});else if(r===38){let a=ma(t);a&&e.push({type:"setForegroundColor",value:a})}else if(r===39)e.push({type:"resetForegroundColor"});else if(r<=47)e.push({type:"setBackgroundColor",value:{type:"named",name:ve[r-40]}});else if(r===48){let a=ma(t);a&&e.push({type:"setBackgroundColor",value:a})}else r===49?e.push({type:"resetBackgroundColor"}):r===53?e.push({type:"setDecoration",value:"overline"}):r===55?e.push({type:"resetDecoration",value:"overline"}):r>=90&&r<=97?e.push({type:"setForegroundColor",value:{type:"named",name:ve[r-90+8]}}):r>=100&&r<=107&&e.push({type:"setBackgroundColor",value:{type:"named",name:ve[r-100+8]}})}return e}function Es(){let t=null,e=null,n=new Set;return{parse(r){let a=[],o=0;do{let i=Is(r,o),s=i.sequence?r.substring(o,i.startPosition):r.substring(o);if(s.length>0&&a.push({value:s,foreground:t,background:e,decorations:new Set(n)}),i.sequence){let l=As(i.sequence);for(let c of l)c.type==="resetAll"?(t=null,e=null,n.clear()):c.type==="resetForegroundColor"?t=null:c.type==="resetBackgroundColor"?e=null:c.type==="resetDecoration"&&n.delete(c.value);for(let c of l)c.type==="setForegroundColor"?t=c.value:c.type==="setBackgroundColor"?e=c.value:c.type==="setDecoration"&&n.add(c.value)}o=i.position}while(oMath.max(0,Math.min(l,255)).toString(16).padStart(2,"0")).join("")}`}let r;function a(){if(r)return r;r=[];for(let c=0;c{let l=`terminal.ansi${s[0].toUpperCase()}${s.substring(1)}`;return[s,t.colors?.[l]||Ts[s]]}))),i=Es();return a.map(s=>i.parse(s[0]).map(l=>{let c,u;l.decorations.has("reverse")?(c=l.background?o.value(l.background):t.bg,u=l.foreground?o.value(l.foreground):t.fg):(c=l.foreground?o.value(l.foreground):t.fg,u=l.background?o.value(l.background):void 0),c=K(c,r),u=K(u,r),l.decorations.has("dim")&&(c=$s(c));let d=$.None;return l.decorations.has("bold")&&(d|=$.Bold),l.decorations.has("italic")&&(d|=$.Italic),l.decorations.has("underline")&&(d|=$.Underline),l.decorations.has("strikethrough")&&(d|=$.Strikethrough),{content:l.value,offset:s[1],color:c,bgColor:u,fontStyle:d}}))}function $s(t){let e=t.match(Bs);if(e){let r=e[1];if(r.length===8){let a=Math.round(Number.parseInt(r.slice(6,8),16)/2).toString(16).padStart(2,"0");return`#${r.slice(0,6)}${a}`}else{if(r.length===6)return`#${r}80`;if(r.length===4){let a=r[0],o=r[1],i=r[2],s=r[3];return`#${a}${a}${o}${o}${i}${i}${Math.round(Number.parseInt(`${s}${s}`,16)/2).toString(16).padStart(2,"0")}`}else if(r.length===3){let a=r[0],o=r[1],i=r[2];return`#${a}${a}${o}${o}${i}${i}80`}}}let n=t.match(js);return n?`var(${n[1]}-dim)`:t}function kn(t,e,n={}){let r=t.resolveLangAlias(n.lang||"text"),{theme:a=t.getLoadedThemes()[0]}=n;if(!qe(r)&&!Ve(a)&&r==="ansi"){let{theme:o}=t.setTheme(a);return Ls(o,e,n)}return nn(t,e,n)}function At(t,e,n){let r,a,o,i,s,l;if("themes"in n){let{defaultColor:c="light",cssVariablePrefix:u="--shiki-",colorsRendering:d="css-vars"}=n,p=Object.entries(n.themes).filter(b=>b[1]).map(b=>({color:b[0],theme:b[1]})).sort((b,y)=>b.color===c?-1:y.color===c?1:0);if(p.length===0)throw new A("`themes` option must not be empty");let f=mt(t,e,n,kn);if(l=Be(f),c&&c!=="light-dark()"&&!p.some(b=>b.color===c))throw new A(`\`themes\` option must contain the defaultColor key \`${c}\``);let g=p.map(b=>t.getTheme(b.theme)),k=p.map(b=>b.color);o=f.map(b=>b.map(y=>vs(y,k,u,c,d))),l&&Ze(o,l);let w=p.map(b=>We(b.theme,n));a=ha(p,g,w,u,c,"fg",d),r=ha(p,g,w,u,c,"bg",d),i=`shiki-themes ${g.map(b=>b.name).join(" ")}`,s=c?void 0:[a,r].join(";")}else if("theme"in n){let c=We(n.theme,n);o=kn(t,e,n);let u=t.getTheme(n.theme);r=K(u.bg,c),a=K(u.fg,c),i=u.name,l=Be(o)}else throw new A("Invalid options, either `theme` or `themes` must be provided");return{tokens:o,fg:a,bg:r,themeName:i,rootStyle:s,grammarState:l}}function ha(t,e,n,r,a,o,i){return t.map((s,l)=>{let c=K(e[l][o],n[l])||"inherit",u=`${r+s.color}${o==="bg"?"-bg":""}:${c}`;if(l===0&&a){if(a==="light-dark()"&&t.length>1){let d=t.findIndex(f=>f.color==="light"),p=t.findIndex(f=>f.color==="dark");if(d===-1||p===-1)throw new A('When using `defaultColor: "light-dark()"`, you must provide both `light` and `dark` themes');return`light-dark(${K(e[d][o],n[d])||"inherit"}, ${K(e[p][o],n[p])||"inherit"});${u}`}return c}return i==="css-vars"?u:null}).filter(s=>!!s).join(";")}var ka=/^\s+$/,Ps=/^(\s*)(.*?)(\s*)$/;function Et(t,e,n,r={meta:{},options:n,codeToHast:(a,o)=>Et(t,a,o),codeToTokens:(a,o)=>At(t,a,o)}){let a=e;for(let g of It(n))a=g.preprocess?.call(r,a,n)||a;let{tokens:o,fg:i,bg:s,themeName:l,rootStyle:c,grammarState:u}=At(t,a,n),{mergeWhitespaces:d=!0,mergeSameStyleTokens:p=!1}=n;d===!0?o=Ms(o):d==="never"&&(o=Gs(o)),p&&(o=Os(o));let f={...r,get source(){return a}};for(let g of It(n))o=g.tokens?.call(f,o)||o;return Fs(o,{...n,fg:i,bg:s,themeName:l,rootStyle:n.rootStyle===!1?!1:n.rootStyle??c},f,u)}function Fs(t,e,n,r=Be(t)){let a=It(e),o=[],i={type:"root",children:[]},{structure:s="classic",tabindex:l="0"}=e,c={class:`shiki ${e.themeName||""}`};e.rootStyle!==!1&&(e.rootStyle!=null?c.style=e.rootStyle:c.style=`background-color:${e.bg};color:${e.fg}`),l!==!1&&l!=null&&(c.tabindex=l.toString());for(let[k,w]of Object.entries(e.meta||{}))k.startsWith("_")||(c[k]=w);let u={type:"element",tagName:"pre",properties:c,children:[],data:e.data},d={type:"element",tagName:"code",properties:{},children:o},p=[],f={...n,structure:s,addClassToHast:ba,get source(){return n.source},get tokens(){return t},get options(){return e},get root(){return i},get pre(){return u},get code(){return d},get lines(){return p}};if(t.forEach((k,w)=>{w&&(s==="inline"?i.children.push({type:"element",tagName:"br",properties:{},children:[]}):s==="classic"&&o.push({type:"text",value:` +`}));let b={type:"element",tagName:"span",properties:{class:"line"},children:[]},y=0;for(let v of k){let S={type:"element",tagName:"span",properties:{...v.htmlAttrs},children:[{type:"text",value:v.content}]},I=yn(v.htmlStyle||xt(v));I&&(S.properties.style=I);for(let L of a)S=L?.span?.call(f,S,w+1,y,b,v)||S;s==="inline"?i.children.push(S):s==="classic"&&b.children.push(S),y+=v.content.length}if(s==="classic"){for(let v of a)b=v?.line?.call(f,b,w+1)||b;p.push(b),o.push(b)}else s==="inline"&&p.push(b)}),s==="classic"){for(let k of a)d=k?.code?.call(f,d)||d;u.children.push(d);for(let k of a)u=k?.pre?.call(f,u)||u;i.children.push(u)}else if(s==="inline"){let k=[],w={type:"element",tagName:"span",properties:{class:"line"},children:[]};for(let y of i.children)y.type==="element"&&y.tagName==="br"?(k.push(w),w={type:"element",tagName:"span",properties:{class:"line"},children:[]}):(y.type==="element"||y.type==="text")&&w.children.push(y);k.push(w);let b={type:"element",tagName:"code",properties:{},children:k};for(let y of a)b=y?.code?.call(f,b)||b;i.children=[];for(let y=0;y0&&i.children.push({type:"element",tagName:"br",properties:{},children:[]});let v=b.children[y];v.type==="element"&&i.children.push(...v.children)}}let g=i;for(let k of a)g=k?.root?.call(f,g)||g;return r&&Ze(g,r),g}function Ms(t){return t.map(e=>{let n=[],r="",a;return e.forEach((o,i)=>{let s=!(o.fontStyle&&(o.fontStyle&$.Underline||o.fontStyle&$.Strikethrough));s&&ka.test(o.content)&&e[i+1]?(a===void 0&&(a=o.offset),r+=o.content):r?(s?n.push({...o,offset:a,content:r+o.content}):n.push({content:r,offset:a},o),a=void 0,r=""):n.push(o)}),n})}function Gs(t){return t.map(e=>e.flatMap(n=>{if(ka.test(n.content))return n;let r=n.content.match(Ps);if(!r)return n;let[,a,o,i]=r;if(!a&&!i)return n;let s=[{...n,offset:n.offset+a.length,content:o}];return a&&s.unshift({content:a,offset:n.offset}),i&&s.push({content:i,offset:n.offset+a.length+o.length}),s}))}function Os(t){return t.map(e=>{let n=[];for(let r of e){if(n.length===0){n.push({...r});continue}let a=n.at(-1),o=yn(a.htmlStyle||xt(a)),i=yn(r.htmlStyle||xt(r)),s=a.fontStyle&&(a.fontStyle&$.Underline||a.fontStyle&$.Strikethrough),l=r.fontStyle&&(r.fontStyle&$.Underline||r.fontStyle&$.Strikethrough);!s&&!l&&o===i?a.content+=r.content:n.push({...r})}return n})}var Ds=hn;function zs(t,e,n){let r={meta:{},options:n,codeToHast:(o,i)=>Et(t,o,i),codeToTokens:(o,i)=>At(t,o,i)},a=Ds(Et(t,e,n,r));for(let o of It(n))a=o.postprocess?.call(r,a,n)||a;return a}async function wa(t){let e=await tn(t);return{getLastGrammarState:(...n)=>Pr(e,...n),codeToTokensBase:(n,r)=>kn(e,n,r),codeToTokensWithThemes:(n,r)=>mt(e,n,r),codeToTokens:(n,r)=>At(e,n,r),codeToHast:(n,r)=>Et(e,n,r),codeToHtml:(n,r)=>zs(e,n,r),getBundledLanguages:()=>({}),getBundledThemes:()=>({}),...e,getInternalContext:()=>e}}var va=class{constructor(t,e={}){m(this,"patterns");m(this,"options");m(this,"regexps");this.patterns=t,this.options=e;let{forgiving:n=!1,cache:r,regexConstructor:a}=e;if(!a)throw new Error("Option `regexConstructor` is not provided");this.regexps=t.map(o=>{if(typeof o!="string")return o;let i=r?.get(o);if(i){if(i instanceof RegExp)return i;if(n)return null;throw i}try{let s=a(o);return r?.set(o,s),s}catch(s){if(r?.set(o,s),n)return null;throw s}})}findNextMatchSync(t,e,n){let r=typeof t=="string"?t:t.content,a=[];function o(i,s,l=0){return{index:i,captureIndices:s.indices.map(c=>c==null?{start:4294967295,end:4294967295,length:0}:{start:c[0]+l,end:c[1]+l,length:c[1]-c[0]})}}for(let i=0;is[1].index));for(let[s,l,c]of a)if(l.index===i)return o(s,l,c)}return null}};function ue(t){if([...t].length!==1)throw new Error(`Expected "${t}" to be a single code point`);return t.codePointAt(0)}function Ca(t,e,n){return t.has(e)||t.set(e,n),t.get(e)}var Qe=new Set(["alnum","alpha","ascii","blank","cntrl","digit","graph","lower","print","punct","space","upper","word","xdigit"]),B=String.raw;function re(t,e){if(t==null)throw new Error(e??"Value expected");return t}var Ea=B`\[\^?`,Na=`c.? | C(?:-.?)?|${B`[pP]\{(?:\^?[-\x20_]*[A-Za-z][-\x20\w]*\})?`}|${B`x[89A-Fa-f]\p{AHex}(?:\\x[89A-Fa-f]\p{AHex})*`}|${B`u(?:\p{AHex}{4})? | x\{[^\}]*\}? | x\p{AHex}{0,2}`}|${B`o\{[^\}]*\}?`}|${B`\d{1,3}`}`,vn=/[?*+][?+]?|\{(?:\d+(?:,\d*)?|,\d+)\}\??/,Nt=new RegExp(B` + \\ (?: + ${Na} + | [gk]<[^>]*>? + | [gk]'[^']*'? + | . + ) + | \( (?: + \? (?: + [:=!>({] + | <[=!] + | <[^>]*> + | '[^']*' + | ~\|? + | #(?:[^)\\]|\\.?)* + | [^:)]*[:)] + )? + | \*[^\)]*\)? + )? + | (?:${vn.source})+ + | ${Ea} + | . +`.replace(/\s+/g,""),"gsu"),wn=new RegExp(B` + \\ (?: + ${Na} + | . + ) + | \[:(?:\^?\p{Alpha}+|\^):\] + | ${Ea} + | && + | . +`.replace(/\s+/g,""),"gsu");function Ra(t,e={}){let n={flags:"",...e,rules:{captureGroup:!1,singleline:!1,...e.rules}};if(typeof t!="string")throw new Error("String expected as pattern");let r=sl(n.flags),a=[r.extended],o={captureGroup:n.rules.captureGroup,getCurrentModX(){return a.at(-1)},numOpenGroups:0,popModX(){a.pop()},pushModX(d){a.push(d)},replaceCurrentModX(d){a[a.length-1]=d},singleline:n.rules.singleline},i=[],s;for(Nt.lastIndex=0;s=Nt.exec(t);){let d=Hs(o,t,s[0],Nt.lastIndex);d.tokens?i.push(...d.tokens):d.token&&i.push(d.token),d.lastIndex!==void 0&&(Nt.lastIndex=d.lastIndex)}let l=[],c=0;i.filter(d=>d.type==="GroupOpen").forEach(d=>{d.kind==="capturing"?d.number=++c:d.raw==="("&&l.push(d)}),c||l.forEach((d,p)=>{d.kind="capturing",d.number=p+1});let u=c||l.length;return{tokens:i.map(d=>d.type==="EscapedNumber"?cl(d,u):d).flat(),flags:r}}function Hs(t,e,n,r){let[a,o]=n;if(n==="["||n==="[^"){let i=Us(e,n,r);return{tokens:i.tokens,lastIndex:i.lastIndex}}if(a==="\\"){if("AbBGyYzZ".includes(o))return{token:_a(n,n)};if(/^\\g[<']/.test(n)){if(!/^\\g(?:<[^>]+>|'[^']+')$/.test(n))throw new Error(`Invalid group name "${n}"`);return{token:el(n)}}if(/^\\k[<']/.test(n)){if(!/^\\k(?:<[^>]+>|'[^']+')$/.test(n))throw new Error(`Invalid group name "${n}"`);return{token:ja(n)}}if(o==="K")return{token:Ta("keep",n)};if(o==="N"||o==="R")return{token:Ce("newline",n,{negate:o==="N"})};if(o==="O")return{token:Ce("any",n)};if(o==="X")return{token:Ce("text_segment",n)};let i=Ba(n,{inCharClass:!1});return Array.isArray(i)?{tokens:i}:{token:i}}if(a==="("){if(o==="*")return{token:al(n)};if(n==="(?{")throw new Error(`Unsupported callout "${n}"`);if(n.startsWith("(?#")){if(e[r]!==")")throw new Error('Unclosed comment group "(?#"');return{lastIndex:r+1}}if(/^\(\?[-imx]+[:)]$/.test(n))return{token:rl(n,t)};if(t.pushModX(t.getCurrentModX()),t.numOpenGroups++,n==="("&&!t.captureGroup||n==="(?:")return{token:je("group",n)};if(n==="(?>")return{token:je("atomic",n)};if(n==="(?="||n==="(?!"||n==="(?<="||n==="(?")||n.startsWith("(?'")&&n.endsWith("'"))return{token:je("capturing",n,{...n!=="("&&{name:n.slice(3,-1)}})};if(n.startsWith("(?~")){if(n==="(?~|")throw new Error(`Unsupported absence function kind "${n}"`);return{token:je("absence_repeater",n)}}throw n==="(?("?new Error(`Unsupported conditional "${n}"`):new Error(`Invalid or unsupported group option "${n}"`)}if(n===")"){if(t.popModX(),t.numOpenGroups--,t.numOpenGroups<0)throw new Error('Unmatched ")"');return{token:Js(n)}}if(t.getCurrentModX()){if(n==="#"){let i=e.indexOf(` +`,r);return{lastIndex:i===-1?e.length:i}}if(/^\s$/.test(n)){let i=/\s+/y;return i.lastIndex=r,{lastIndex:i.exec(e)?i.lastIndex:r}}}if(n===".")return{token:Ce("dot",n)};if(n==="^"||n==="$"){let i=t.singleline?{"^":B`\A`,$:B`\Z`}[n]:n;return{token:_a(i,n)}}return n==="|"?{token:qs(n)}:vn.test(n)?{tokens:ul(n)}:{token:ae(ue(n),n)}}function Us(t,e,n){let r=[Sa(e[1]==="^",e)],a=1,o;for(wn.lastIndex=n;o=wn.exec(t);){let i=o[0];if(i[0]==="["&&i[1]!==":")a++,r.push(Sa(i[1]==="^",i));else if(i==="]"){if(r.at(-1).type==="CharacterClassOpen")r.push(ae(93,i));else if(a--,r.push(Vs(i)),!a)break}else{let s=Ws(i);Array.isArray(s)?r.push(...s):r.push(s)}}return{tokens:r,lastIndex:wn.lastIndex||t.length}}function Ws(t){if(t[0]==="\\")return Ba(t,{inCharClass:!0});if(t[0]==="["){let e=/\[:(?\^?)(?[a-z]+):\]/.exec(t);if(!e||!Qe.has(e.groups.name))throw new Error(`Invalid POSIX class "${t}"`);return Ce("posix",t,{value:e.groups.name,negate:!!e.groups.negate})}return t==="-"?Zs(t):t==="&&"?Xs(t):ae(ue(t),t)}function Ba(t,{inCharClass:e}){let n=t[1];if(n==="c"||n==="C")return nl(t);if("dDhHsSwW".includes(n))return ol(t);if(t.startsWith(B`\o{`))throw new Error(`Incomplete, invalid, or unsupported octal code point "${t}"`);if(/^\\[pP]\{/.test(t)){if(t.length===3)throw new Error(`Incomplete or invalid Unicode property "${t}"`);return il(t)}if(/^\\x[89A-Fa-f]\p{AHex}/u.test(t))try{let r=t.split(/\\x/).slice(1).map(i=>parseInt(i,16)),a=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}).decode(new Uint8Array(r)),o=new TextEncoder;return[...a].map(i=>{let s=[...o.encode(i)].map(l=>`\\x${l.toString(16)}`).join("");return ae(ue(i),s)})}catch{throw new Error(`Multibyte code "${t}" incomplete or invalid in Oniguruma`)}if(n==="u"||n==="x")return ae(ll(t),t);if(xa.has(n))return ae(xa.get(n),t);if(/\d/.test(n))return Ys(e,t);if(t==="\\")throw new Error(B`Incomplete escape "\"`);if(n==="M")throw new Error(`Unsupported meta "${t}"`);if([...t].length===2)return ae(t.codePointAt(1),t);throw new Error(`Unexpected escape "${t}"`)}function qs(t){return{type:"Alternator",raw:t}}function _a(t,e){return{type:"Assertion",kind:t,raw:e}}function ja(t){return{type:"Backreference",raw:t}}function ae(t,e){return{type:"Character",value:t,raw:e}}function Vs(t){return{type:"CharacterClassClose",raw:t}}function Zs(t){return{type:"CharacterClassHyphen",raw:t}}function Xs(t){return{type:"CharacterClassIntersector",raw:t}}function Sa(t,e){return{type:"CharacterClassOpen",negate:t,raw:e}}function Ce(t,e,n={}){return{type:"CharacterSet",kind:t,...n,raw:e}}function Ta(t,e,n={}){return t==="keep"?{type:"Directive",kind:t,raw:e}:{type:"Directive",kind:t,flags:re(n.flags),raw:e}}function Ys(t,e){return{type:"EscapedNumber",inCharClass:t,raw:e}}function Js(t){return{type:"GroupClose",raw:t}}function je(t,e,n={}){return{type:"GroupOpen",kind:t,...n,raw:e}}function Qs(t,e,n,r){return{type:"NamedCallout",kind:t,tag:e,arguments:n,raw:r}}function Ks(t,e,n,r){return{type:"Quantifier",kind:t,min:e,max:n,raw:r}}function el(t){return{type:"Subroutine",raw:t}}var tl=new Set(["COUNT","CMP","ERROR","FAIL","MAX","MISMATCH","SKIP","TOTAL_COUNT"]),xa=new Map([["a",7],["b",8],["e",27],["f",12],["n",10],["r",13],["t",9],["v",11]]);function nl(t){let e=t[1]==="c"?t[2]:t[3];if(!e||!/[A-Za-z]/.test(e))throw new Error(`Unsupported control character "${t}"`);return ae(ue(e.toUpperCase())-64,t)}function rl(t,e){let{on:n,off:r}=/^\(\?(?[imx]*)(?:-(?[-imx]*))?/.exec(t).groups;r??(r="");let a=(e.getCurrentModX()||n.includes("x"))&&!r.includes("x"),o=Aa(n),i=Aa(r),s={};if(o&&(s.enable=o),i&&(s.disable=i),t.endsWith(")"))return e.replaceCurrentModX(a),Ta("flags",t,{flags:s});if(t.endsWith(":"))return e.pushModX(a),e.numOpenGroups++,je("group",t,{...(o||i)&&{flags:s}});throw new Error(`Unexpected flag modifier "${t}"`)}function al(t){let e=/\(\*(?[A-Za-z_]\w*)?(?:\[(?(?:[A-Za-z_]\w*)?)\])?(?:\{(?[^}]*)\})?\)/.exec(t);if(!e)throw new Error(`Incomplete or invalid named callout "${t}"`);let{name:n,tag:r,args:a}=e.groups;if(!n)throw new Error(`Invalid named callout "${t}"`);if(r==="")throw new Error(`Named callout tag with empty value not allowed "${t}"`);let o=a?a.split(",").filter(u=>u!=="").map(u=>/^[+-]?\d+$/.test(u)?+u:u):[],[i,s,l]=o,c=tl.has(n)?n.toLowerCase():"custom";switch(c){case"fail":case"mismatch":case"skip":if(o.length>0)throw new Error(`Named callout arguments not allowed "${o}"`);break;case"error":if(o.length>1)throw new Error(`Named callout allows only one argument "${o}"`);if(typeof i=="string")throw new Error(`Named callout argument must be a number "${i}"`);break;case"max":if(!o.length||o.length>2)throw new Error(`Named callout must have one or two arguments "${o}"`);if(typeof i=="string"&&!/^[A-Za-z_]\w*$/.test(i))throw new Error(`Named callout argument one must be a tag or number "${i}"`);if(o.length===2&&(typeof s=="number"||!/^[<>X]$/.test(s)))throw new Error(`Named callout optional argument two must be '<', '>', or 'X' "${s}"`);break;case"count":case"total_count":if(o.length>1)throw new Error(`Named callout allows only one argument "${o}"`);if(o.length===1&&(typeof i=="number"||!/^[<>X]$/.test(i)))throw new Error(`Named callout optional argument must be '<', '>', or 'X' "${i}"`);break;case"cmp":if(o.length!==3)throw new Error(`Named callout must have three arguments "${o}"`);if(typeof i=="string"&&!/^[A-Za-z_]\w*$/.test(i))throw new Error(`Named callout argument one must be a tag or number "${i}"`);if(typeof s=="number"||!/^(?:[<>!=]=|[<>])$/.test(s))throw new Error(`Named callout argument two must be '==', '!=', '>', '<', '>=', or '<=' "${s}"`);if(typeof l=="string"&&!/^[A-Za-z_]\w*$/.test(l))throw new Error(`Named callout argument three must be a tag or number "${l}"`);break;case"custom":throw new Error(`Undefined callout name "${n}"`);default:throw new Error(`Unexpected named callout kind "${c}"`)}return Qs(c,r??null,a?.split(",")??null,t)}function Ia(t){let e=null,n,r;if(t[0]==="{"){let{minStr:a,maxStr:o}=/^\{(?\d*)(?:,(?\d*))?/.exec(t).groups,i=1e5;if(+a>i||o&&+o>i)throw new Error("Quantifier value unsupported in Oniguruma");if(n=+a,r=o===void 0?+a:o===""?1/0:+o,n>r&&(e="possessive",[n,r]=[r,n]),t.endsWith("?")){if(e==="possessive")throw new Error('Unsupported possessive interval quantifier chain with "?"');e="lazy"}else e||(e="greedy")}else n=t[0]==="+"?1:0,r=t[0]==="?"?1:1/0,e=t[1]==="+"?"possessive":t[1]==="?"?"lazy":"greedy";return Ks(e,n,r,t)}function ol(t){let e=t[1].toLowerCase();return Ce({d:"digit",h:"hex",s:"space",w:"word"}[e],t,{negate:t[1]!==e})}function il(t){let{p:e,neg:n,value:r}=/^\\(?

[pP])\{(?\^?)(?[^}]+)/.exec(t).groups;return Ce("property",t,{value:r,negate:e==="P"&&!n||e==="p"&&!!n})}function Aa(t){let e={};return t.includes("i")&&(e.ignoreCase=!0),t.includes("m")&&(e.dotAll=!0),t.includes("x")&&(e.extended=!0),Object.keys(e).length?e:null}function sl(t){let e={ignoreCase:!1,dotAll:!1,extended:!1,digitIsAscii:!1,posixIsAscii:!1,spaceIsAscii:!1,wordIsAscii:!1,textSegmentMode:null};for(let n=0;n\p{AHex}+)/u.exec(t).groups.hex:t.slice(2);return parseInt(e,16)}function cl(t,e){let{raw:n,inCharClass:r}=t,a=n.slice(1);if(!r&&(a!=="0"&&a.length===1||a[0]!=="0"&&+a<=e))return[ja(n)];let o=[],i=a.match(/^[0-7]+|\d/g);for(let s=0;s127)throw new Error(B`Octal encoded byte above 177 unsupported "${n}"`)}else c=ue(l);o.push(ae(c,(s===0?"\\":"")+l))}return o}function ul(t){let e=[],n=new RegExp(vn,"gy"),r;for(;r=n.exec(t);){let a=r[0];if(a[0]==="{"){let o=/^\{(?\d+),(?\d+)\}\??$/.exec(a);if(o){let{min:i,max:s}=o.groups;if(+i>+s&&a.endsWith("?")){n.lastIndex--,e.push(Ia(a.slice(0,-1)));continue}}}e.push(Ia(a))}return e}function Rt(t,e){if(!Array.isArray(t.body))throw new Error("Expected node with body array");if(t.body.length!==1)return!1;let n=t.body[0];return!e||Object.keys(e).every(r=>e[r]===n[r])}function La(t){return dl.has(t.type)}var dl=new Set(["AbsenceFunction","Backreference","CapturingGroup","Character","CharacterClass","CharacterSet","Group","Quantifier","Subroutine"]);function jt(t,e={}){let n={flags:"",normalizeUnknownPropertyNames:!1,skipBackrefValidation:!1,skipLookbehindValidation:!1,skipPropertyNameValidation:!1,unicodePropertyMap:null,...e,rules:{captureGroup:!1,singleline:!1,...e.rules}},r=Ra(t,{flags:n.flags,rules:{captureGroup:n.rules.captureGroup,singleline:n.rules.singleline}}),a=(p,f)=>{let g=r.tokens[o.nextIndex];switch(o.parent=p,o.nextIndex++,g.type){case"Alternator":return oe();case"Assertion":return pl(g);case"Backreference":return fl(g,o);case"Character":return Te(g.value,{useLastValid:!!f.isCheckingRangeEnd});case"CharacterClassHyphen":return gl(g,o,f);case"CharacterClassOpen":return ml(g,o,f);case"CharacterSet":return hl(g,o);case"Directive":return Cl(g.kind,{flags:g.flags});case"GroupOpen":return bl(g,o,f);case"NamedCallout":return Sl(g.kind,g.tag,g.arguments);case"Quantifier":return yl(g,o);case"Subroutine":return kl(g,o);default:throw new Error(`Unexpected token type "${g.type}"`)}},o={capturingGroups:[],hasNumberedRef:!1,namedGroupsByName:new Map,nextIndex:0,normalizeUnknownPropertyNames:n.normalizeUnknownPropertyNames,parent:null,skipBackrefValidation:n.skipBackrefValidation,skipLookbehindValidation:n.skipLookbehindValidation,skipPropertyNameValidation:n.skipPropertyNameValidation,subroutines:[],tokens:r.tokens,unicodePropertyMap:n.unicodePropertyMap,walk:a},i=Il(_l(r.flags)),s=i.body[0];for(;o.nextIndexl.length)throw new Error("Subroutine uses a group number that's not defined");p&&(l[p-1].isSubroutined=!0)}else if(u.has(p)){if(u.get(p).length>1)throw new Error(B`Subroutine uses a duplicate group name "\g<${p}>"`);u.get(p)[0].isSubroutined=!0}else throw new Error(B`Subroutine uses a group name that's not defined "\g<${p}>"`);return i}function pl({kind:t}){return Tt(re({"^":"line_start",$:"line_end","\\A":"string_start","\\b":"word_boundary","\\B":"word_boundary","\\G":"search_start","\\y":"text_segment_boundary","\\Y":"text_segment_boundary","\\z":"string_end","\\Z":"string_end_newline"}[t],`Unexpected assertion kind "${t}"`),{negate:t===B`\B`||t===B`\Y`})}function fl({raw:t},e){let n=/^\\k[<']/.test(t),r=n?t.slice(3,-1):t.slice(1),a=(o,i=!1)=>{let s=e.capturingGroups.length,l=!1;if(o>s)if(e.skipBackrefValidation)l=!0;else throw new Error(`Not enough capturing groups defined to the left "${t}"`);return e.hasNumberedRef=!0,Bt(i?s+1-o:o,{orphan:l})};if(n){let o=/^(?-?)0*(?[1-9]\d*)$/.exec(r);if(o)return a(+o.groups.num,!!o.groups.sign);if(/[-+]/.test(r))throw new Error(`Invalid backref name "${t}"`);if(!e.namedGroupsByName.has(r))throw new Error(`Group name not defined to the left "${t}"`);return Bt(r)}return a(+r)}function gl(t,e,n){let{tokens:r,walk:a}=e,o=e.parent,i=o.body.at(-1),s=r[e.nextIndex];if(!n.isCheckingRangeEnd&&i&&i.type!=="CharacterClass"&&i.type!=="CharacterClassRange"&&s&&s.type!=="CharacterClassOpen"&&s.type!=="CharacterClassClose"&&s.type!=="CharacterClassIntersector"){let l=a(o,{...n,isCheckingRangeEnd:!0});if(i.type==="Character"&&l.type==="Character")return o.body.pop(),vl(i,l);throw new Error("Invalid character class range")}return Te(ue("-"))}function ml({negate:t},e,n){let{tokens:r,walk:a}=e,o=[Ke()],i=r[e.nextIndex],s=Fa(i);for(;s.type!=="CharacterClassClose";){if(s.type==="CharacterClassIntersector")o.push(Ke()),e.nextIndex++;else{let c=o.at(-1);c.body.push(a(c,n))}s=Fa(r[e.nextIndex],i)}let l=Ke({negate:t});return o.length===1?l.body=o[0].body:(l.kind="intersection",l.body=o.map(c=>c.body.length===1?c.body[0]:c)),e.nextIndex++,l}function hl({kind:t,negate:e,value:n},r){let{normalizeUnknownPropertyNames:a,skipPropertyNameValidation:o,unicodePropertyMap:i}=r;if(t==="property"){let s=Le(n);if(Qe.has(s)&&!i?.has(s))t="posix",n=s;else return _e(n,{negate:e,normalizeUnknownPropertyNames:a,skipPropertyNameValidation:o,unicodePropertyMap:i})}return t==="posix"?xl(n,{negate:e}):Lt(t,{negate:e})}function bl(t,e,n){let{tokens:r,capturingGroups:a,namedGroupsByName:o,skipLookbehindValidation:i,walk:s}=e,l=Al(t),c=l.type==="AbsenceFunction",u=Pa(l),d=u&&l.negate;if(l.type==="CapturingGroup"&&(a.push(l),l.name&&Ca(o,l.name,[]).push(l)),c&&n.isInAbsenceFunction)throw new Error("Nested absence function not supported by Oniguruma");let p=Ma(r[e.nextIndex]);for(;p.type!=="GroupClose";){if(p.type==="Alternator")l.body.push(oe()),e.nextIndex++;else{let f=l.body.at(-1),g=s(f,{...n,isInAbsenceFunction:n.isInAbsenceFunction||c,isInLookbehind:n.isInLookbehind||u,isInNegLookbehind:n.isInNegLookbehind||d});if(f.body.push(g),(u||n.isInLookbehind)&&!i){let k="Lookbehind includes a pattern not allowed by Oniguruma";if(d||n.isInNegLookbehind){if($a(g)||g.type==="CapturingGroup")throw new Error(k)}else if($a(g)||Pa(g)&&g.negate)throw new Error(k)}}p=Ma(r[e.nextIndex])}return e.nextIndex++,l}function yl({kind:t,min:e,max:n},r){let a=r.parent,o=a.body.at(-1);if(!o||!La(o))throw new Error("Quantifier requires a repeatable token");let i=_n(t,e,n,o);return a.body.pop(),i}function kl({raw:t},e){let{capturingGroups:n,subroutines:r}=e,a=t.slice(3,-1),o=/^(?[-+]?)0*(?[1-9]\d*)$/.exec(a);if(o){let s=+o.groups.num,l=n.length;if(e.hasNumberedRef=!0,a={"":s,"+":l+s,"-":l+1-s}[o.groups.sign],a<1)throw new Error("Invalid subroutine number")}else a==="0"&&(a=0);let i=Sn(a);return r.push(i),i}function wl(t,e){if(t!=="repeater")throw new Error(`Unexpected absence function kind "${t}"`);return{type:"AbsenceFunction",kind:t,body:et(e?.body)}}function oe(t){return{type:"Alternative",body:Ga(t?.body)}}function Tt(t,e){let n={type:"Assertion",kind:t};return(t==="word_boundary"||t==="text_segment_boundary")&&(n.negate=!!e?.negate),n}function Bt(t,e){let n=!!e?.orphan;return{type:"Backreference",ref:t,...n&&{orphan:n}}}function Cn(t,e){let n={name:void 0,isSubroutined:!1,...e};if(n.name!==void 0&&!El(n.name))throw new Error(`Group name "${n.name}" invalid in Oniguruma`);return{type:"CapturingGroup",number:t,...n.name&&{name:n.name},...n.isSubroutined&&{isSubroutined:n.isSubroutined},body:et(e?.body)}}function Te(t,e){let n={useLastValid:!1,...e};if(t>1114111){let r=t.toString(16);if(n.useLastValid)t=1114111;else throw t>1310719?new Error(`Invalid code point out of range "\\x{${r}}"`):new Error(`Invalid code point out of range in JS "\\x{${r}}"`)}return{type:"Character",value:t}}function Ke(t){let e={kind:"union",negate:!1,...t};return{type:"CharacterClass",kind:e.kind,negate:e.negate,body:Ga(t?.body)}}function vl(t,e){if(e.valuen)throw new Error("Invalid reversed quantifier range");return{type:"Quantifier",kind:t,min:e,max:n,body:r}}function Il(t,e){return{type:"Regex",body:et(e?.body),flags:t}}function Sn(t){return{type:"Subroutine",ref:t}}function _e(t,e){let n={negate:!1,normalizeUnknownPropertyNames:!1,skipPropertyNameValidation:!1,unicodePropertyMap:null,...e},r=n.unicodePropertyMap?.get(Le(t));if(!r){if(n.normalizeUnknownPropertyNames)r=Nl(t);else if(n.unicodePropertyMap&&!n.skipPropertyNameValidation)throw new Error(B`Invalid Unicode property "\p{${t}}"`)}return{type:"CharacterSet",kind:"property",value:r??t,negate:n.negate}}function Al({flags:t,kind:e,name:n,negate:r,number:a}){switch(e){case"absence_repeater":return wl("repeater");case"atomic":return D({atomic:!0});case"capturing":return Cn(a,{name:n});case"group":return D({flags:t});case"lookahead":case"lookbehind":return de({behind:e==="lookbehind",negate:r});default:throw new Error(`Unexpected group kind "${e}"`)}}function et(t){if(t===void 0)t=[oe()];else if(!Array.isArray(t)||!t.length||!t.every(e=>e.type==="Alternative"))throw new Error("Invalid body; expected array of one or more Alternative nodes");return t}function Ga(t){if(t===void 0)t=[];else if(!Array.isArray(t)||!t.every(e=>!!e.type))throw new Error("Invalid body; expected array of nodes");return t}function $a(t){return t.type==="LookaroundAssertion"&&t.kind==="lookahead"}function Pa(t){return t.type==="LookaroundAssertion"&&t.kind==="lookbehind"}function El(t){return/^[\p{Alpha}\p{Pc}][^)]*$/u.test(t)}function Nl(t){return t.trim().replace(/[- _]+/g,"_").replace(/[A-Z][a-z]+(?=[A-Z])/g,"$&_").replace(/[A-Za-z]+/g,e=>e[0].toUpperCase()+e.slice(1).toLowerCase())}function Le(t){return t.replace(/[- _]+/g,"").toLowerCase()}function Fa(t,e){let n=e;return re(t,`Unclosed character class${n?.type==="Character"&&n.value===93&&n.raw==="]"?' (started with "]")':""}`)}function Ma(t){return re(t,"Unclosed group")}function Se(t,e,n=null){function r(o,i){for(let s=0;sA-Za-z\-]|<[=!]|\(DEFINE\))`;function Da(t,e){for(let n=0;n=e&&t[n]++}function za(t,e,n,r){return t.slice(0,e)+r+t.slice(e+n.length)}var O=Object.freeze({DEFAULT:"DEFAULT",CHAR_CLASS:"CHAR_CLASS"});function tt(t,e,n,r){let a=new RegExp(String.raw`${e}|(?<$skip>\[\^?|\\?.)`,"gsu"),o=[!1],i=0,s="";for(let l of t.matchAll(a)){let{0:c,groups:{$skip:u}}=l;if(!u&&(!r||r===O.DEFAULT==!i)){n instanceof Function?s+=n(l,{context:i?O.CHAR_CLASS:O.DEFAULT,negated:o[o.length-1]}):s+=n;continue}c[0]==="["?(i++,o.push(c[1]==="^")):c==="]"&&i&&(i--,o.pop()),s+=c}return s}function xn(t,e,n,r){tt(t,e,n,r)}function Rl(t,e,n=0,r){if(!new RegExp(e,"su").test(t))return null;let a=new RegExp(`${e}|(?<$skip>\\\\?.)`,"gsu");a.lastIndex=n;let o=0,i;for(;i=a.exec(t);){let{0:s,groups:{$skip:l}}=i;if(!l&&(!r||r===O.DEFAULT==!o))return i;s==="["?o++:s==="]"&&o&&o--,a.lastIndex==i.index&&a.lastIndex++}return null}function nt(t,e,n){return!!Rl(t,e,0,n)}function Ha(t,e){let n=/\\?./gsu;n.lastIndex=e;let r=t.length,a=0,o=1,i;for(;i=n.exec(t);){let[s]=i;if(s==="[")a++;else if(a)s==="]"&&a--;else if(s==="(")o++;else if(s===")"&&(o--,!o)){r=i.index;break}}return t.slice(e,r)}var Ua=new RegExp(String.raw`(?${Oa})|(?\((?:\?<[^>]+>)?)|\\?.`,"gsu");function An(t,e){let n=e?.hiddenCaptures??[],r=e?.captureTransfers??new Map;if(!/\(\?>/.test(t))return{pattern:t,captureTransfers:r,hiddenCaptures:n};let a="(?>",o="(?:(?=(",i=[0],s=[],l=0,c=0,u=NaN,d;do{d=!1;let p=0,f=0,g=!1,k;for(Ua.lastIndex=Number.isNaN(u)?0:u+o.length;k=Ua.exec(t);){let{0:w,index:b,groups:{capturingStart:y,noncapturingStart:v}}=k;if(w==="[")p++;else if(p)w==="]"&&p--;else if(w===a&&!g)u=b,g=!0;else if(g&&v)f++;else if(y)g?f++:(l++,i.push(l+c));else if(w===")"&&g){if(!f){c++;let S=l+c;if(t=`${t.slice(0,u)}${o}${t.slice(u+a.length,b)}))<$$${S}>)${t.slice(b+1)}`,d=!0,s.push(S),Da(n,S),r.size){let I=new Map;r.forEach((L,F)=>{I.set(F>=S?F+1:F,L.map(Z=>Z>=S?Z+1:Z))}),r=I}break}f--}}}while(d);return n.push(...s),t=tt(t,String.raw`\\(?[1-9]\d*)|<\$\$(?\d+)>`,({0:p,groups:{backrefNum:f,wrappedBackrefNum:g}})=>{if(f){let k=+f;if(k>i.length-1)throw new Error(`Backref "${p}" greater than number of captures`);return`\\${i[k]}`}return`\\${g}`},O.DEFAULT),{pattern:t,captureTransfers:r,hiddenCaptures:n}}var Wa=String.raw`(?:[?*+]|\{\d+(?:,\d*)?\})`,In=new RegExp(String.raw` +\\(?: \d+ + | c[A-Za-z] + | [gk]<[^>]+> + | [pPu]\{[^\}]+\} + | u[A-Fa-f\d]{4} + | x[A-Fa-f\d]{2} + ) +| \((?: \? (?: [:=!>] + | <(?:[=!]|[^>]+>) + | [A-Za-z\-]+: + | \(DEFINE\) + ))? +| (?${Wa})(?[?+]?)(?[?*+\{]?) +| \\?. +`.replace(/\s+/g,""),"gsu");function En(t){if(!new RegExp(`${Wa}\\+`).test(t))return{pattern:t};let e=[],n=null,r=null,a="",o=0,i;for(In.lastIndex=0;i=In.exec(t);){let{0:s,index:l,groups:{qBase:c,qMod:u,invalidQ:d}}=i;if(s==="[")o||(r=l),o++;else if(s==="]")o?o--:r=null;else if(!o)if(u==="+"&&a&&!a.startsWith("(")){if(d)throw new Error(`Invalid quantifier "${s}"`);let p=-1;if(/^\{\d+\}$/.test(c))t=za(t,l+c.length,u,"");else{if(a===")"||a==="]"){let f=a===")"?n:r;if(f===null)throw new Error(`Invalid unmatched "${a}"`);t=`${t.slice(0,f)}(?>${t.slice(f,l)}${c})${t.slice(l+s.length)}`}else t=`${t.slice(0,l-a.length)}(?>${a}${c})${t.slice(l+s.length)}`;p+=4}In.lastIndex+=p}else s[0]==="("?e.push(l):s===")"&&(n=e.length?e.pop():null);a=s}return{pattern:t}}var W=String.raw,Bl=W`\\g<(?[^>&]+)&R=(?[^>]+)>`,Rn=W`\(\?R=(?[^\)]+)\)|${Bl}`,Pt=W`\(\?<(?![=!])(?[^>]+)>`,Ya=W`${Pt}|(?\()(?!\?)`,xe=new RegExp(W`${Pt}|${Rn}|\(\?|\\?.`,"gsu"),Nn="Cannot use multiple overlapping recursions";function Ja(t,e){let{hiddenCaptures:n,mode:r}={hiddenCaptures:[],mode:"plugin",...e},a=e?.captureTransfers??new Map;if(!new RegExp(Rn,"su").test(t))return{pattern:t,captureTransfers:a,hiddenCaptures:n};if(r==="plugin"&&nt(t,W`\(\?\(DEFINE\)`,O.DEFAULT))throw new Error("DEFINE groups cannot be used with recursion");let o=[],i=nt(t,W`\\[1-9]`,O.DEFAULT),s=new Map,l=[],c=!1,u=0,d=0,p;for(xe.lastIndex=0;p=xe.exec(t);){let{0:f,groups:{captureName:g,rDepth:k,gRNameOrNum:w,gRDepth:b}}=p;if(f==="[")u++;else if(u)f==="]"&&u--;else if(k){if(qa(k),c)throw new Error(Nn);if(i)throw new Error(`${r==="external"?"Backrefs":"Numbered backrefs"} cannot be used with global recursion`);let y=t.slice(0,p.index),v=t.slice(xe.lastIndex);if(nt(v,Rn,O.DEFAULT))throw new Error(Nn);let S=+k-1;t=Va(y,v,S,!1,n,o,d),a=Xa(a,y,S,o.length,0,d);break}else if(w){qa(b);let y=!1;for(let X of l)if(X.name===w||X.num===+w){if(y=!0,X.hasRecursedWithin)throw new Error(Nn);break}if(!y)throw new Error(W`Recursive \g cannot be used outside the referenced group "${r==="external"?w:W`\g<${w}&R=${b}>`}"`);let v=s.get(w),S=Ha(t,v);if(i&&nt(S,W`${Pt}|\((?!\?)`,O.DEFAULT))throw new Error(`${r==="external"?"Backrefs":"Numbered backrefs"} cannot be used with recursion of capturing groups`);let I=t.slice(v,p.index),L=S.slice(I.length+f.length),F=o.length,Z=+b-1,Ee=Va(I,L,Z,!0,n,o,d);a=Xa(a,I,Z,o.length-F,F,d);let Gt=t.slice(0,v),Ot=t.slice(v+S.length);t=`${Gt}${Ee}${Ot}`,xe.lastIndex+=Ee.length-f.length-I.length-L.length,l.forEach(X=>X.hasRecursedWithin=!0),c=!0}else if(g)d++,s.set(String(d),xe.lastIndex),s.set(g,xe.lastIndex),l.push({num:d,name:g});else if(f[0]==="("){let y=f==="(";y&&(d++,s.set(String(d),xe.lastIndex)),l.push(y?{num:d}:{})}else f===")"&&l.pop()}return n.push(...o),{pattern:t,captureTransfers:a,hiddenCaptures:n}}function qa(t){let e=`Max depth must be integer between 2 and 100; used ${t}`;if(!/^[1-9]\d*$/.test(t))throw new Error(e);if(t=+t,t<2||t>100)throw new Error(e)}function Va(t,e,n,r,a,o,i){let s=new Set;r&&xn(t+e,Pt,({groups:{captureName:c}})=>{s.add(c)},O.DEFAULT);let l=[n,r?s:null,a,o,i];return`${t}${Za(`(?:${t}`,"forward",...l)}(?:)${Za(`${e})`,"backward",...l)}${e}`}function Za(t,e,n,r,a,o,i){let l=u=>e==="forward"?u+2:n-u+2-1,c="";for(let u=0;u[^>]+)>`,({0:p,groups:{captureName:f,unnamed:g,backref:k}})=>{if(k&&r&&!r.has(k))return p;let w=`_$${d}`;if(g||f){let b=i+o.length+1;return o.push(b),jl(a,b),g?p:`(?<${f}${w}>`}return W`\k<${k}${w}>`},O.DEFAULT)}return c}function jl(t,e){for(let n=0;n=e&&t[n]++}function Xa(t,e,n,r,a,o){if(t.size&&r){let i=0;xn(e,Ya,()=>i++,O.DEFAULT);let s=o-i+a,l=new Map;return t.forEach((c,u)=>{let d=(r-i*n)/n,p=i*n,f=u>s+i?u+r:u,g=[];for(let k of c)if(k<=s)g.push(k);else if(k>s+i+d)g.push(k+r);else if(k<=s+i)for(let w=0;w<=n;w++)g.push(k+i*w);else for(let w=0;w<=n;w++)g.push(k+p+d*w);l.set(f,g)}),l}return t}var j=String.fromCodePoint,_=String.raw,V={},Mt=globalThis.RegExp;V.flagGroups=(()=>{try{new Mt("(?i:)")}catch{return!1}return!0})();V.unicodeSets=(()=>{try{new Mt("[[]]","v")}catch{return!1}return!0})();V.bugFlagVLiteralHyphenIsRange=V.unicodeSets?(()=>{try{new Mt(_`[\d\-a]`,"v")}catch{return!0}return!1})():!1;V.bugNestedClassIgnoresNegation=V.unicodeSets&&new Mt("[[^a]]","v").test("a");function Ft(t,{enable:e,disable:n}){return{dotAll:!n?.dotAll&&!!(e?.dotAll||t.dotAll),ignoreCase:!n?.ignoreCase&&!!(e?.ignoreCase||t.ignoreCase)}}function rt(t,e,n){return t.has(e)||t.set(e,n),t.get(e)}function $n(t,e){return Qa[t]>=Qa[e]}function Tl(t,e){if(t==null)throw new Error(e??"Value expected");return t}var Qa={ES2025:2025,ES2024:2024,ES2018:2018},Ll={auto:"auto",ES2025:"ES2025",ES2024:"ES2024",ES2018:"ES2018"};function ro(t={}){if({}.toString.call(t)!=="[object Object]")throw new Error("Unexpected options");if(t.target!==void 0&&!Ll[t.target])throw new Error(`Unexpected target "${t.target}"`);let e={accuracy:"default",avoidSubclass:!1,flags:"",global:!1,hasIndices:!1,lazyCompileLength:1/0,target:"auto",verbose:!1,...t,rules:{allowOrphanBackrefs:!1,asciiWordBoundaries:!1,captureGroup:!1,recursionLimit:20,singleline:!1,...t.rules}};return e.target==="auto"&&(e.target=V.flagGroups?"ES2025":V.unicodeSets?"ES2024":"ES2018"),e}var $l="[ -\r ]",Pl=new Set([j(304),j(305)]),ie=_`[\p{L}\p{M}\p{N}\p{Pc}]`;function ao(t){if(Pl.has(t))return[t];let e=new Set,n=t.toLowerCase(),r=n.toUpperCase(),a=Gl.get(n),o=Fl.get(n),i=Ml.get(n);return[...r].length===1&&e.add(r),i&&e.add(i),a&&e.add(a),e.add(n),o&&e.add(o),[...e]}var Fn=new Map(`C Other +Cc Control cntrl +Cf Format +Cn Unassigned +Co Private_Use +Cs Surrogate +L Letter +LC Cased_Letter +Ll Lowercase_Letter +Lm Modifier_Letter +Lo Other_Letter +Lt Titlecase_Letter +Lu Uppercase_Letter +M Mark Combining_Mark +Mc Spacing_Mark +Me Enclosing_Mark +Mn Nonspacing_Mark +N Number +Nd Decimal_Number digit +Nl Letter_Number +No Other_Number +P Punctuation punct +Pc Connector_Punctuation +Pd Dash_Punctuation +Pe Close_Punctuation +Pf Final_Punctuation +Pi Initial_Punctuation +Po Other_Punctuation +Ps Open_Punctuation +S Symbol +Sc Currency_Symbol +Sk Modifier_Symbol +Sm Math_Symbol +So Other_Symbol +Z Separator +Zl Line_Separator +Zp Paragraph_Separator +Zs Space_Separator +ASCII +ASCII_Hex_Digit AHex +Alphabetic Alpha +Any +Assigned +Bidi_Control Bidi_C +Bidi_Mirrored Bidi_M +Case_Ignorable CI +Cased +Changes_When_Casefolded CWCF +Changes_When_Casemapped CWCM +Changes_When_Lowercased CWL +Changes_When_NFKC_Casefolded CWKCF +Changes_When_Titlecased CWT +Changes_When_Uppercased CWU +Dash +Default_Ignorable_Code_Point DI +Deprecated Dep +Diacritic Dia +Emoji +Emoji_Component EComp +Emoji_Modifier EMod +Emoji_Modifier_Base EBase +Emoji_Presentation EPres +Extended_Pictographic ExtPict +Extender Ext +Grapheme_Base Gr_Base +Grapheme_Extend Gr_Ext +Hex_Digit Hex +IDS_Binary_Operator IDSB +IDS_Trinary_Operator IDST +ID_Continue IDC +ID_Start IDS +Ideographic Ideo +Join_Control Join_C +Logical_Order_Exception LOE +Lowercase Lower +Math +Noncharacter_Code_Point NChar +Pattern_Syntax Pat_Syn +Pattern_White_Space Pat_WS +Quotation_Mark QMark +Radical +Regional_Indicator RI +Sentence_Terminal STerm +Soft_Dotted SD +Terminal_Punctuation Term +Unified_Ideograph UIdeo +Uppercase Upper +Variation_Selector VS +White_Space space +XID_Continue XIDC +XID_Start XIDS`.split(/\s/).map(t=>[Le(t),t])),Fl=new Map([["s",j(383)],[j(383),"s"]]),Ml=new Map([[j(223),j(7838)],[j(107),j(8490)],[j(229),j(8491)],[j(969),j(8486)]]),Gl=new Map([pe(453),pe(456),pe(459),pe(498),...Bn(8072,8079),...Bn(8088,8095),...Bn(8104,8111),pe(8124),pe(8140),pe(8188)]),Ol=new Map([["alnum",_`[\p{Alpha}\p{Nd}]`],["alpha",_`\p{Alpha}`],["ascii",_`\p{ASCII}`],["blank",_`[\p{Zs}\t]`],["cntrl",_`\p{Cc}`],["digit",_`\p{Nd}`],["graph",_`[\P{space}&&\P{Cc}&&\P{Cn}&&\P{Cs}]`],["lower",_`\p{Lower}`],["print",_`[[\P{space}&&\P{Cc}&&\P{Cn}&&\P{Cs}]\p{Zs}]`],["punct",_`[\p{P}\p{S}]`],["space",_`\p{space}`],["upper",_`\p{Upper}`],["word",_`[\p{Alpha}\p{M}\p{Nd}\p{Pc}]`],["xdigit",_`\p{AHex}`]]);function Dl(t,e){let n=[];for(let r=t;r<=e;r++)n.push(r);return n}function pe(t){let e=j(t);return[e.toLowerCase(),e]}function Bn(t,e){return Dl(t,e).map(n=>pe(n))}var oo=new Set(["Lower","Lowercase","Upper","Uppercase","Ll","Lowercase_Letter","Lt","Titlecase_Letter","Lu","Uppercase_Letter"]);function zl(t,e){let n={accuracy:"default",asciiWordBoundaries:!1,avoidSubclass:!1,bestEffortTarget:"ES2025",...e};io(t);let r={accuracy:n.accuracy,asciiWordBoundaries:n.asciiWordBoundaries,avoidSubclass:n.avoidSubclass,flagDirectivesByAlt:new Map,jsGroupNameMap:new Map,minTargetEs2024:$n(n.bestEffortTarget,"ES2024"),passedLookbehind:!1,strategy:null,subroutineRefMap:new Map,supportedGNodes:new Set,digitIsAscii:t.flags.digitIsAscii,spaceIsAscii:t.flags.spaceIsAscii,wordIsAscii:t.flags.wordIsAscii};Se(t,Hl,r);let a={dotAll:t.flags.dotAll,ignoreCase:t.flags.ignoreCase},o={currentFlags:a,prevFlags:null,globalFlags:a,groupOriginByCopy:new Map,groupsByName:new Map,multiplexCapturesToLeftByRef:new Map,openRefs:new Map,reffedNodesByReferencer:new Map,subroutineRefMap:r.subroutineRefMap};Se(t,Ul,o);let i={groupsByName:o.groupsByName,highestOrphanBackref:0,numCapturesToLeft:0,reffedNodesByReferencer:o.reffedNodesByReferencer};return Se(t,Wl,i),t._originMap=o.groupOriginByCopy,t._strategy=r.strategy,t}var Hl={AbsenceFunction({node:t,parent:e,replaceWith:n}){let{body:r,kind:a}=t;if(a==="repeater"){let o=D();o.body[0].body.push(de({negate:!0,body:r}),_e("Any"));let i=D();i.body[0].body.push(_n("greedy",0,1/0,o)),n(R(i,e),{traverse:!0})}else throw new Error('Unsupported absence function "(?~|"')},Alternative:{enter({node:t,parent:e,key:n},{flagDirectivesByAlt:r}){let a=t.body.filter(o=>o.kind==="flags");for(let o=n+1;o\r\n|${a?_`\p{RGI_Emoji}`:p}|\P{M}\p{M}*)`,{skipPropertyNameValidation:!0}),e))}else if(l==="hex")n(fe(_e("AHex",{negate:c}),e));else if(l==="newline")n(R(se(c?`[^ +]`:`(?>\r +?|[ +\v\f\x85\u2028\u2029])`),e));else if(l==="posix")if(!a&&(u==="graph"||u==="print")){if(r==="strict")throw new Error(`POSIX class "${u}" requires min target ES2024 or non-strict accuracy`);let d={graph:"!-~",print:" -~"}[u];c&&(d=`\0-${j(d.codePointAt(0)-1)}${j(d.codePointAt(2)+1)}-\u{10FFFF}`),n(R(se(`[${d}]`),e))}else n(R(Ln(se(Ol.get(u)),c),e));else if(l==="property")Fn.has(Le(u))||(t.key="sc");else if(l==="space")n(fe(_e("space",{negate:c}),e));else if(l==="word")n(R(Ln(se(ie),c),e));else throw new Error(`Unexpected character set kind "${l}"`)},Directive({node:t,parent:e,root:n,remove:r,replaceWith:a,removeAllPrevSiblings:o,removeAllNextSiblings:i}){let{kind:s,flags:l}=t;if(s==="flags")if(!l.enable&&!l.disable)r();else{let c=D({flags:l});c.body[0].body=i(),a(R(c,e),{traverse:!0})}else if(s==="keep"){let c=n.body[0],d=n.body.length===1&&Rt(c,{type:"Group"})&&c.body[0].body.length===1?c.body[0]:n;if(e.parent!==d||d.body.length>1)throw new Error(_`Uses "\K" in a way that's unsupported`);let p=de({behind:!0});p.body[0].body=o(),a(R(p,e))}else throw new Error(`Unexpected directive kind "${s}"`)},Flags({node:t,parent:e}){if(t.posixIsAscii)throw new Error('Unsupported flag "P"');if(t.textSegmentMode==="word")throw new Error('Unsupported flag "y{w}"');["digitIsAscii","extended","posixIsAscii","spaceIsAscii","wordIsAscii","textSegmentMode"].forEach(n=>delete t[n]),Object.assign(t,{global:!1,hasIndices:!1,multiline:!1,sticky:t.sticky??!1}),e.options={disable:{x:!0,n:!0},force:{v:!0}}},Group({node:t}){if(!t.flags)return;let{enable:e,disable:n}=t.flags;e?.extended&&delete e.extended,n?.extended&&delete n.extended,e?.dotAll&&n?.dotAll&&delete e.dotAll,e?.ignoreCase&&n?.ignoreCase&&delete e.ignoreCase,e&&!Object.keys(e).length&&delete t.flags.enable,n&&!Object.keys(n).length&&delete t.flags.disable,!t.flags.enable&&!t.flags.disable&&delete t.flags},LookaroundAssertion({node:t},e){let{kind:n}=t;n==="lookbehind"&&(e.passedLookbehind=!0)},NamedCallout({node:t,parent:e,replaceWith:n}){let{kind:r}=t;if(r==="fail")n(R(de({negate:!0}),e));else throw new Error(`Unsupported named callout "(*${r.toUpperCase()}"`)},Quantifier({node:t}){if(t.body.type==="Quantifier"){let e=D();e.body[0].body.push(t.body),t.body=R(e,t)}},Regex:{enter({node:t},{supportedGNodes:e}){let n=[],r=!1,a=!1;for(let o of t.body)if(o.body.length===1&&o.body[0].kind==="search_start")o.body.pop();else{let i=uo(o.body);i?(r=!0,Array.isArray(i)?n.push(...i):n.push(i)):a=!0}r&&!a&&n.forEach(o=>e.add(o))},exit(t,{accuracy:e,passedLookbehind:n,strategy:r}){if(e==="strict"&&n&&r)throw new Error(_`Uses "\G" in a way that requires non-strict accuracy`)}},Subroutine({node:t},{jsGroupNameMap:e}){let{ref:n}=t;typeof n=="string"&&!Tn(n)&&(n=jn(n,e),t.ref=n)}},Ul={Backreference({node:t},{multiplexCapturesToLeftByRef:e,reffedNodesByReferencer:n}){let{orphan:r,ref:a}=t;r||n.set(t,[...e.get(a).map(({node:o})=>o)])},CapturingGroup:{enter({node:t,parent:e,replaceWith:n,skip:r},{groupOriginByCopy:a,groupsByName:o,multiplexCapturesToLeftByRef:i,openRefs:s,reffedNodesByReferencer:l}){let c=a.get(t);if(c&&s.has(t.number)){let d=fe(Ka(t.number),e);l.set(d,s.get(t.number)),n(d);return}s.set(t.number,t),i.set(t.number,[]),t.name&&rt(i,t.name,[]);let u=i.get(t.name??t.number);for(let d=0;dp.type==="Group"&&!!p.flags)),d=u?Ft(r.globalFlags,u):r.globalFlags;ql(d,r.currentFlags)||(c=D({flags:Xl(d)}),c.body[0].body.push(l))}n(R(c,e),{traverse:!s})}},Wl={Backreference({node:t,parent:e,replaceWith:n},r){if(t.orphan){r.highestOrphanBackref=Math.max(r.highestOrphanBackref,t.ref);return}let o=r.reffedNodesByReferencer.get(t).filter(i=>Vl(i,t));if(!o.length)n(R(de({negate:!0}),e));else if(o.length>1){let i=D({atomic:!0,body:o.reverse().map(s=>oe({body:[Bt(s.number)]}))});n(R(i,e))}else t.ref=o[0].number},CapturingGroup({node:t},e){t.number=++e.numCapturesToLeft,t.name&&e.groupsByName.get(t.name).get(t).hasDuplicateNameToRemove&&delete t.name},Regex:{exit({node:t},e){let n=Math.max(e.highestOrphanBackref-e.numCapturesToLeft,0);for(let r=0;r{e.forEach(a=>{r.enable?.[a]&&(delete n.disable[a],n.enable[a]=!0),r.disable?.[a]&&(n.disable[a]=!0)})}),Object.keys(n.enable).length||delete n.enable,Object.keys(n.disable).length||delete n.disable,n.enable||n.disable?n:null}function Xl({dotAll:t,ignoreCase:e}){let n={};return(t||e)&&(n.enable={},t&&(n.enable.dotAll=!0),e&&(n.enable.ignoreCase=!0)),(!t||!e)&&(n.disable={},!t&&(n.disable.dotAll=!0),!e&&(n.disable.ignoreCase=!0)),n}function co(t){if(!t)throw new Error("Node expected");let{body:e}=t;return Array.isArray(e)?e:e?[e]:null}function uo(t){let e=t.find(n=>n.kind==="search_start"||Ql(n,{negate:!1})||!Yl(n));if(!e)return null;if(e.kind==="search_start")return e;if(e.type==="LookaroundAssertion")return e.body[0].body[0];if(e.type==="CapturingGroup"||e.type==="Group"){let n=[];for(let r of e.body){let a=uo(r.body);if(!a)return null;Array.isArray(a)?n.push(...a):n.push(a)}return n}return null}function po(t,e){let n=co(t)??[];for(let r of n)if(r===e||po(r,e))return!0;return!1}function Yl({type:t}){return t==="Assertion"||t==="Directive"||t==="LookaroundAssertion"}function Jl(t){let e=["Character","CharacterClass","CharacterSet"];return e.includes(t.type)||t.type==="Quantifier"&&t.min&&e.includes(t.body.type)}function Ql(t,e){let n={negate:null,...e};return t.type==="LookaroundAssertion"&&(n.negate===null||t.negate===n.negate)&&t.body.length===1&&Rt(t.body[0],{type:"Assertion",kind:"search_start"})}function Tn(t){return/^[$_\p{IDS}][$\u200C\u200D\p{IDC}]*$/u.test(t)}function se(t,e){let r=jt(t,{...e,unicodePropertyMap:Fn}).body;return r.length>1||r[0].body.length>1?D({body:r}):r[0].body[0]}function Ln(t,e){return t.negate=e,t}function fe(t,e){return t.parent=e,t}function R(t,e){return io(t),t.parent=e,t}function Kl(t,e){let n=ro(e),r=$n(n.target,"ES2024"),a=$n(n.target,"ES2025"),o=n.rules.recursionLimit;if(!Number.isInteger(o)||o<2||o>20)throw new Error("Invalid recursionLimit; use 2-20");let i=null,s=null;if(!a){let f=[t.flags.ignoreCase];Se(t,ec,{getCurrentModI:()=>f.at(-1),popModI(){f.pop()},pushModI(g){f.push(g)},setHasCasedChar(){f.at(-1)?i=!0:s=!0}})}let l={dotAll:t.flags.dotAll,ignoreCase:!!((t.flags.ignoreCase||i)&&!s)},c=t,u={accuracy:n.accuracy,appliedGlobalFlags:l,captureMap:new Map,currentFlags:{dotAll:t.flags.dotAll,ignoreCase:t.flags.ignoreCase},inCharClass:!1,lastNode:c,originMap:t._originMap,recursionLimit:o,useAppliedIgnoreCase:!!(!a&&i&&s),useFlagMods:a,useFlagV:r,verbose:n.verbose};function d(f){return u.lastNode=c,c=f,Tl(tc[f.type],`Unexpected node type "${f.type}"`)(f,u,d)}let p={pattern:t.body.map(d).join("|"),flags:d(t.flags),options:{...t.options}};return r||(delete p.options.force.v,p.options.disable.v=!0,p.options.unicodeSetsPlugin=null),p._captureTransfers=new Map,p._hiddenCaptures=[],u.captureMap.forEach((f,g)=>{f.hidden&&p._hiddenCaptures.push(g),f.transferTo&&rt(p._captureTransfers,f.transferTo,[]).push(g)}),p}var ec={"*":{enter({node:t},e){if(to(t)){let n=e.getCurrentModI();e.pushModI(t.flags?Ft({ignoreCase:n},t.flags).ignoreCase:n)}},exit({node:t},e){to(t)&&e.popModI()}},Backreference(t,e){e.setHasCasedChar()},Character({node:t},e){Mn(j(t.value))&&e.setHasCasedChar()},CharacterClassRange({node:t,skip:e},n){e(),fo(t,{firstOnly:!0}).length&&n.setHasCasedChar()},CharacterSet({node:t},e){t.kind==="property"&&oo.has(t.value)&&e.setHasCasedChar()}},tc={Alternative({body:t},e,n){return t.map(n).join("")},Assertion({kind:t,negate:e}){if(t==="string_end")return"$";if(t==="string_start")return"^";if(t==="word_boundary")return e?_`\B`:_`\b`;throw new Error(`Unexpected assertion kind "${t}"`)},Backreference({ref:t},e){if(typeof t!="number")throw new Error("Unexpected named backref in transformed AST");if(!e.useFlagMods&&e.accuracy==="strict"&&e.currentFlags.ignoreCase&&!e.captureMap.get(t).ignoreCase)throw new Error("Use of case-insensitive backref to case-sensitive group requires target ES2025 or non-strict accuracy");return"\\"+t},CapturingGroup(t,e,n){let{body:r,name:a,number:o}=t,i={ignoreCase:e.currentFlags.ignoreCase},s=e.originMap.get(t);return s&&(i.hidden=!0,o>s.number&&(i.transferTo=s.number)),e.captureMap.set(o,i),`(${a?`?<${a}>`:""}${r.map(n).join("|")})`},Character({value:t},e){let n=j(t),r=Pe(t,{escDigit:e.lastNode.type==="Backreference",inCharClass:e.inCharClass,useFlagV:e.useFlagV});if(r!==n)return r;if(e.useAppliedIgnoreCase&&e.currentFlags.ignoreCase&&Mn(n)){let a=ao(n);return e.inCharClass?a.join(""):a.length>1?`[${a.join("")}]`:a[0]}return n},CharacterClass(t,e,n){let{kind:r,negate:a,parent:o}=t,{body:i}=t;if(r==="intersection"&&!e.useFlagV)throw new Error("Use of character class intersection requires min target ES2024");V.bugFlagVLiteralHyphenIsRange&&e.useFlagV&&i.some(no)&&(i=[Te(45),...i.filter(c=>!no(c))]);let s=()=>`[${a?"^":""}${i.map(n).join(r==="intersection"?"&&":"")}]`;if(!e.inCharClass){if((!e.useFlagV||V.bugNestedClassIgnoresNegation)&&!a){let u=i.filter(d=>d.type==="CharacterClass"&&d.kind==="union"&&d.negate);if(u.length){let d=D(),p=d.body[0];return d.parent=o,p.parent=d,i=i.filter(f=>!u.includes(f)),t.body=i,i.length?(t.parent=p,p.body.push(t)):d.body.pop(),u.forEach(f=>{let g=oe({body:[f]});f.parent=g,g.parent=d,d.body.push(g)}),n(d)}}e.inCharClass=!0;let c=s();return e.inCharClass=!1,c}let l=i[0];if(r==="union"&&!a&&l&&((!e.useFlagV||!e.verbose)&&o.kind==="union"&&!(V.bugFlagVLiteralHyphenIsRange&&e.useFlagV)||!e.verbose&&o.kind==="intersection"&&i.length===1&&l.type!=="CharacterClassRange"))return i.map(n).join("");if(!e.useFlagV&&o.type==="CharacterClass")throw new Error("Uses nested character class in a way that requires min target ES2024");return s()},CharacterClassRange(t,e){let n=t.min.value,r=t.max.value,a={escDigit:!1,inCharClass:!0,useFlagV:e.useFlagV},o=Pe(n,a),i=Pe(r,a),s=new Set;if(e.useAppliedIgnoreCase&&e.currentFlags.ignoreCase){let l=fo(t);ic(l).forEach(u=>{s.add(Array.isArray(u)?`${Pe(u[0],a)}-${Pe(u[1],a)}`:Pe(u,a))})}return`${o}-${i}${[...s].join("")}`},CharacterSet({kind:t,negate:e,value:n,key:r},a){if(t==="dot")return a.currentFlags.dotAll?a.appliedGlobalFlags.dotAll||a.useFlagMods?".":"[^]":_`[^\n]`;if(t==="digit")return e?_`\D`:_`\d`;if(t==="property"){if(a.useAppliedIgnoreCase&&a.currentFlags.ignoreCase&&oo.has(n))throw new Error(`Unicode property "${n}" can't be case-insensitive when other chars have specific case`);return`${e?_`\P`:_`\p`}{${r?`${r}=`:""}${n}}`}if(t==="word")return e?_`\W`:_`\w`;throw new Error(`Unexpected character set kind "${t}"`)},Flags(t,e){return(e.appliedGlobalFlags.ignoreCase?"i":"")+(t.dotAll?"s":"")+(t.sticky?"y":"")},Group({atomic:t,body:e,flags:n,parent:r},a,o){let i=a.currentFlags;n&&(a.currentFlags=Ft(i,n));let s=e.map(o).join("|"),l=!a.verbose&&e.length===1&&r.type!=="Quantifier"&&!t&&(!a.useFlagMods||!n)?s:`(?${sc(t,n,a.useFlagMods)}${s})`;return a.currentFlags=i,l},LookaroundAssertion({body:t,kind:e,negate:n},r,a){return`(?${`${e==="lookahead"?"":"<"}${n?"!":"="}`}${t.map(a).join("|")})`},Quantifier(t,e,n){return n(t.body)+lc(t)},Subroutine({isRecursive:t,ref:e},n){if(!t)throw new Error("Unexpected non-recursive subroutine in transformed AST");let r=n.recursionLimit;return e===0?`(?R=${r})`:_`\g<${e}&R=${r}>`}},nc=new Set(["$","(",")","*","+",".","?","[","\\","]","^","{","|","}"]),rc=new Set(["-","\\","]","^","["]),ac=new Set(["(",")","-","/","[","\\","]","^","{","|","}","!","#","$","%","&","*","+",",",".",":",";","<","=",">","?","@","`","~"]),eo=new Map([[9,_`\t`],[10,_`\n`],[11,_`\v`],[12,_`\f`],[13,_`\r`],[8232,_`\u2028`],[8233,_`\u2029`],[65279,_`\uFEFF`]]),oc=/^\p{Cased}$/u;function Mn(t){return oc.test(t)}function fo(t,e){let n=!!e?.firstOnly,r=t.min.value,a=t.max.value,o=[];if(r<65&&(a===65535||a>=131071)||r===65536&&a>=131071)return o;for(let i=r;i<=a;i++){let s=j(i);if(!Mn(s))continue;let l=ao(s).filter(c=>{let u=c.codePointAt(0);return ua});if(l.length&&(o.push(...l),n))break}return o}function Pe(t,{escDigit:e,inCharClass:n,useFlagV:r}){if(eo.has(t))return eo.get(t);if(t<32||t>126&&t<160||t>262143||e&&cc(t))return t>255?`\\u{${t.toString(16).toUpperCase()}}`:`\\x${t.toString(16).toUpperCase().padStart(2,"0")}`;let a=n?r?ac:rc:nc,o=j(t);return(a.has(o)?"\\":"")+o}function ic(t){let e=t.map(a=>a.codePointAt(0)).sort((a,o)=>a-o),n=[],r=null;for(let a=0;a";let r="";if(e&&n){let{enable:a,disable:o}=e;r=(a?.ignoreCase?"i":"")+(a?.dotAll?"s":"")+(o?"-":"")+(o?.ignoreCase?"i":"")+(o?.dotAll?"s":"")}return`${r}:`}function lc({kind:t,max:e,min:n}){let r;return!n&&e===1?r="?":!n&&e===1/0?r="*":n===1&&e===1/0?r="+":n===e?r=`{${n}}`:r=`{${n},${e===1/0?"":e}}`,r+{greedy:"",lazy:"?",possessive:"+"}[t]}function to({type:t}){return t==="CapturingGroup"||t==="Group"||t==="LookaroundAssertion"}function cc(t){return t>47&&t<58}function no({type:t,value:e}){return t==="Character"&&e===45}var ge,le,Ie,me,Ae,at,Pn,he,uc=(he=class extends RegExp{constructor(n,r,a){var e=(...mf)=>(super(...mf),be(this,at),be(this,ge,new Map),be(this,le,null),be(this,Ie),be(this,me,null),be(this,Ae,null),m(this,"rawOptions",{}),this);let o=!!a?.lazyCompile;if(n instanceof RegExp){if(a)throw new Error("Cannot provide options when copying a regexp");let i=n;e(i,r),q(this,Ie,i.source),i instanceof he&&(q(this,ge,M(i,ge)),q(this,me,M(i,me)),q(this,Ae,M(i,Ae)),this.rawOptions=i.rawOptions)}else{let i={hiddenCaptures:[],strategy:null,transfers:[],...a};e(o?"":n,r),q(this,Ie,n),q(this,ge,pc(i.hiddenCaptures,i.transfers)),q(this,Ae,i.strategy),this.rawOptions=a??{}}o||q(this,le,this)}get source(){return M(this,Ie)||"(?:)"}exec(n){if(!M(this,le)){let{lazyCompile:o,...i}=this.rawOptions;q(this,le,new he(M(this,Ie),this.flags,i))}let r=this.global||this.sticky,a=this.lastIndex;if(M(this,Ae)==="clip_search"&&r&&a){this.lastIndex=0;let o=Ht(this,at,Pn).call(this,n.slice(a));return o&&(dc(o,a,n,this.hasIndices),this.lastIndex+=a),o}return Ht(this,at,Pn).call(this,n)}},ge=new WeakMap,le=new WeakMap,Ie=new WeakMap,me=new WeakMap,Ae=new WeakMap,at=new WeakSet,Pn=function(n){M(this,le).lastIndex=this.lastIndex;let r=Un(he.prototype,this,"exec").call(M(this,le),n);if(this.lastIndex=M(this,le).lastIndex,!r||!M(this,ge).size)return r;let a=[...r];r.length=1;let o;this.hasIndices&&(o=[...r.indices],r.indices.length=1);let i=[0];for(let s=1;s{let s=o[i];s&&(o[i]=[s[0]+e,s[1]+e])})}}function pc(t,e){let n=new Map;for(let r of t)n.set(r,{hidden:!0});for(let[r,a]of e)for(let o of a)rt(n,o,{}).transferTo=r;return n}function fc(t){let e=/(?\((?:\?<(?![=!])(?[^>]+)>|(?!\?)))|\\?./gsu,n=new Map,r=0,a=0,o;for(;o=e.exec(t);){let{0:i,groups:{capture:s,name:l}}=o;i==="["?r++:r?i==="]"&&r--:s&&(a++,l&&n.set(a,l))}return n}function go(t,e){let n=gc(t,e);return n.options?new uc(n.pattern,n.flags,n.options):new RegExp(n.pattern,n.flags)}function gc(t,e){let n=ro(e),r=jt(t,{flags:n.flags,normalizeUnknownPropertyNames:!0,rules:{captureGroup:n.rules.captureGroup,singleline:n.rules.singleline},skipBackrefValidation:n.rules.allowOrphanBackrefs,unicodePropertyMap:Fn}),a=zl(r,{accuracy:n.accuracy,asciiWordBoundaries:n.rules.asciiWordBoundaries,avoidSubclass:n.avoidSubclass,bestEffortTarget:n.target}),o=Kl(a,n),i=Ja(o.pattern,{captureTransfers:o._captureTransfers,hiddenCaptures:o._hiddenCaptures,mode:"external"}),s=En(i.pattern),l=An(s.pattern,{captureTransfers:i.captureTransfers,hiddenCaptures:i.hiddenCaptures}),c={pattern:l.pattern,flags:`${n.hasIndices?"d":""}${n.global?"g":""}${o.flags}${o.options.disable.v?"u":"v"}`};if(n.avoidSubclass){if(n.lazyCompileLength!==1/0)throw new Error("Lazy compilation requires subclass")}else{let u=l.hiddenCaptures.sort((g,k)=>g-k),d=Array.from(l.captureTransfers),p=a._strategy,f=c.pattern.length>=n.lazyCompileLength;(u.length||d.length||p||f)&&(c.options={...u.length&&{hiddenCaptures:u},...d.length&&{transfers:d},...p&&{strategy:p},...f&&{lazyCompile:f}})}return c}function mo(t,e){return go(t,{global:!0,hasIndices:!0,lazyCompileLength:3e3,rules:{allowOrphanBackrefs:!0,asciiWordBoundaries:!0,captureGroup:!0,recursionLimit:5,singleline:!0},...e})}function Gn(t={}){let e={target:"auto",cache:new Map,...t};return e.regexConstructor||(e.regexConstructor=n=>mo(n,{target:e.target})),{createScanner(n){return new va(n,e)},createString(n){return{content:n}}}}var mc=new Set(["json","yaml","csv","xml"]),hc=new Map([["yml","yaml"],["text","plaintext"],["txt","plaintext"],["table","plaintext"]]),ho;function bc(){return ho??(ho=wa({themes:[Yn,Jn],langs:[Wn,qn,Vn,Xn],engine:Gn()})),ho}function yc(t){let e=String(t||"plaintext").toLowerCase();return hc.get(e)||e}function kc(t){let e=document.createElement("pre");e.className="code-source";let n=document.createElement("code");return n.textContent=t,e.appendChild(n),e}function wc(t){let e=document.createElement("div");e.className="line-gutter",e.setAttribute("aria-hidden","true");let n=Math.max(1,t.split(` +`).length);for(let r=1;r<=n;r+=1){let a=document.createElement("span");a.textContent=String(r),e.appendChild(a)}return e}function bo(t,e,n){let r=document.createElement("div");r.className="code-viewer";let a=document.createElement("div");return a.className="code-scroll",a.setAttribute("role","region"),a.setAttribute("aria-label",n),a.tabIndex=0,e.classList.add("code-source"),e.removeAttribute("tabindex"),a.append(wc(t),e),r.appendChild(a),r}async function Rf(t,e,n="plaintext",r="Parser output"){e=String(e??"");let a=yc(n),o=bo(e,kc(e),r);if(t.replaceChildren(o),!mc.has(a))return o;try{let s=(await bc()).codeToHtml(e,{lang:a,themes:{light:"github-light-high-contrast",dark:"github-dark-high-contrast"},defaultColor:!1}),l=document.createElement("template");l.innerHTML=s;let c=l.content.querySelector("pre");if(!c||!t.contains(o))return o;let u=bo(e,c,r);return t.replaceChildren(u),u}catch(i){return console.warn("Syntax highlighting unavailable; using plaintext output.",i),o}}export{Rf as renderCodeViewer}; diff --git a/docs/index.html b/docs/index.html index 4fe0b86..24740fa 100644 --- a/docs/index.html +++ b/docs/index.html @@ -4,9 +4,6 @@ M-Bus Parser (Wired & Wireless) - - - @@ -686,14 +783,17 @@

Online M-Bus Parser -

+