diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c0b7b10..cd2412fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # Changelog +## 1.8.2 + +### Security + +- Update both bundled SQLite engines to 3.54.1, from 3.49.1 (WebAssembly) and 3.51.2 (native). This fixes an FTS5 out-of-bounds access that a crafted database can trigger (CVE-2025-7709, WebAssembly engine), FTS5 heap overflows reachable through SQL while defensive mode is off, which both engines leave off (CVE-2026-11822 and CVE-2026-11824, both engines), and an integer overflow reachable through SQL (CVE-2025-6965, WebAssembly engine). 3.54.1 rather than 3.54.0 because 3.54.0 has a heap overflow on 32-bit builds, which includes WebAssembly. +- Refuse SQL-level `ATTACH` and `DETACH` on the native engine, so SQL sent to the native worker cannot open, read or write another database file. The bundled runtime enforces the same rule in C, independent of the worker's statement check, and allows only the snapshot file of a running export. +- Refuse SQL-level `VACUUM INTO` on the native engine, which could create a copy of the open database at any path, even from a read-only connection. Exports keep using it for their own snapshot file. + +### Changes + +- SQLite 3.54 writes some REAL values as text with up to 17 significant digits, for example `9.6529377952984946e+282` instead of `9.6529377952985e+282`. The grid and exports show SQLite's text where JavaScript would render a REAL differently. +- The WebAssembly engine includes upstream sql.js fixes for SQL larger than the WebAssembly stack, statement iterator cleanup, error messages thrown by user-defined functions, aggregate initialization over zero rows, and isolated SQL names and function registrations. + +### Maintenance + +- Resolve all open Dependabot alerts in build tooling and website dependencies. None of the affected packages ship in the extension. +- Package with `@vscode/vsce` 4.0.0, from 3.9.2. The six VSIX packages contain the same files as before. +- Make the WebAssembly and query-plan runtime build reproducible with the pinned toolchain (Emscripten 5.0.0 and the official Zig 0.16.0 release): a rebuild from any directory produces identical bytes, and the builder refuses other Zig distributions, whose Linux libraries differ. +- Link the SQLite Explorer desktop app from the README. + ## 1.8.1 ### Fixes diff --git a/CLAUDE.md b/CLAUDE.md index a0896e96..e8422506 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -395,7 +395,7 @@ Settings in `package.json` → `contributes.configuration`: ### Build - **WASM not found**: Run `node scripts/build.mjs` if `assets/sqlite3.wasm` is missing - **Browser vs Node**: Check `import.meta.env.VSCODE_BROWSER_EXT` for environment-specific code -- **Query-plan runtime**: `src/runtime/query-plan.c` bounds plan compilation and extraction on the primary connection. `node scripts/build-query-plan.mjs` builds the five native libraries and the WASM runtime from that file and pinned sql.js commit `424163d6c9c34acec7bac07eb2cecedd86185a60`. It requires Emscripten 5.0.0 and Zig 0.16.0; use `--emcc PATH` and optionally `--sqljs-source GIT_CHECKOUT`. The source checkout is read through `git archive` at the pin. `scripts/refresh-sqljs.mjs` delegates to this builder. Native Explain uses the primary connection's signalled `Database.allAsync` so cancel RPCs remain deliverable without losing TEMP or pending transaction state. `scripts/refresh-natives.mjs` pins the tested `master` commit, Actions run, and hashes for all five native targets. +- **Query-plan runtime**: `src/runtime/query-plan.c` bounds plan compilation and extraction on the primary connection. `node scripts/build-query-plan.mjs` builds the five native libraries and the WASM runtime from that file and pinned sql.js commit `3181cc5ee888d3251228d3995c32bf9ea03c3240` and SQLite amalgamation 3.54.1. It requires Emscripten 5.0.0 and the official Zig 0.16.0 release (`zig cc --version` must report `clang version 21.1.0`; distribution builds such as Homebrew's are refused); use `--emcc PATH` and optionally `--sqljs-source GIT_CHECKOUT`. The source checkout is read through `git archive` at the pin. `scripts/refresh-sqljs.mjs` delegates to this builder. Native Explain uses the primary connection's signalled `Database.allAsync` so cancel RPCs remain deliverable without losing TEMP or pending transaction state. `scripts/refresh-natives.mjs` pins the tested `master` commit, Actions run, and hashes for all five native targets. - **Runtime artifact gate**: `vendor/query-plan-manifest.json` records source and output hashes. Normal builds verify it before bundling. Regenerate runtime changes with the builder; do not edit native libraries, WASM/glue, or the manifest by hand. `node scripts/build-query-plan.mjs --check` verifies all copies. ## Extension Identifiers diff --git a/README.md b/README.md index a90eae4e..44ff9556 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ A powerful, open-source SQLite database viewer and editor for Visual Studio Code. -**[Try it in your browser](https://sqlite-explorer.zknpr.xyz/demo)** | **[Website](https://sqlite-explorer.zknpr.xyz/)** | **[Changelog](CHANGELOG.md)** +**[Try it in your browser](https://sqlite-explorer.zknpr.xyz/demo)** | **[Desktop app](https://github.com/zknpr/SQLite-Explorer-App)** | **[Website](https://sqlite-explorer.zknpr.xyz/)** | **[Changelog](CHANGELOG.md)** ![SQLite Explorer](media/main.png) @@ -134,6 +134,12 @@ Or from the command line: code --install-extension zknpr.sqlite-explorer ``` +### Desktop app + +SQLite Explorer also runs as a standalone desktop application, no VS Code required. It uses the same viewer inside a Tauri shell and ships packages for macOS (Apple Silicon `.dmg`), Linux (x86-64 `.deb`) and Windows (x86-64 installer). Download them from the [SQLite Explorer App releases](https://github.com/zknpr/SQLite-Explorer-App/releases). + +The packages are not signed with a publisher identity yet, so macOS and Windows warn on first launch. The app's [install notes](https://github.com/zknpr/SQLite-Explorer-App#install) cover the first-launch steps and checksum verification. + ## Usage 1. Open any `.sqlite`, `.db`, or `.sqlite3` file in VS Code diff --git a/natives/aarch64-linux-gnu/query-plan.so b/natives/aarch64-linux-gnu/query-plan.so index 04f73e8d..60ba7d3c 100644 Binary files a/natives/aarch64-linux-gnu/query-plan.so and b/natives/aarch64-linux-gnu/query-plan.so differ diff --git a/natives/aarch64-linux-gnu/tjs b/natives/aarch64-linux-gnu/tjs index c1c82c9d..182bbe39 100755 Binary files a/natives/aarch64-linux-gnu/tjs and b/natives/aarch64-linux-gnu/tjs differ diff --git a/natives/aarch64-macos/tjs b/natives/aarch64-macos/tjs index b7c77902..871b7344 100755 Binary files a/natives/aarch64-macos/tjs and b/natives/aarch64-macos/tjs differ diff --git a/natives/native-worker.js b/natives/native-worker.js index a6a16c63..329a5d22 100644 --- a/natives/native-worker.js +++ b/natives/native-worker.js @@ -49,6 +49,228 @@ function describeNativeError(error, fallback) { + `... [truncated from ${message.length} characters]`; } +// ============================================================================ +// SQL Path Authority +// ============================================================================ + +/** + * Stable identity of the ATTACH/DETACH refusal. Worker errors cross IPC as + * plain strings, so the code is part of the message as well as `error.code`. + */ +const NATIVE_SQL_ATTACH_BLOCKED = 'ERR_NATIVE_SQL_ATTACH_BLOCKED'; + +/** + * Whitespace for the leading-verb check: space and \t \n \v \f \r. SQLite's + * tokenizer classes \v (0x0B) as illegal rather than space, so skipping it + * only makes this check refuse statements SQLite would reject anyway. + */ +function isSqliteSpace(code) { + return code === 0x20 || (code >= 0x09 && code <= 0x0d); +} + +/** SQLite's IdChar: ASCII letters, digits, `_`, `$`, and every code unit >= 0x80. */ +function isSqliteIdChar(code) { + return (code >= 0x61 && code <= 0x7a) || (code >= 0x41 && code <= 0x5a) + || (code >= 0x30 && code <= 0x39) || code === 0x5f || code === 0x24 || code >= 0x80; +} + +/** + * Skip the whitespace and comments SQLite skips before a token, mirroring + * tokenize.c: `--` runs to `\n` only, `/*` to the first `*\/` (no nesting; an + * unterminated comment runs to the end), and a U+FEFF byte-order mark at a + * token start is whitespace (CC_BOM), so `\uFEFFATTACH ...` runs the ATTACH. + * Between statements SQLite also skips the `;` of empty statements, so + * `;; ATTACH ...` compiles the ATTACH. + */ +function skipSqlTrivia(sql, index, skipEmptyStatements) { + for (;;) { + const code = sql.charCodeAt(index); + if (isSqliteSpace(code) || code === 0xfeff || (skipEmptyStatements && code === 0x3b)) { + index++; + } else if (code === 0x2d && sql.charCodeAt(index + 1) === 0x2d) { + const end = sql.indexOf('\n', index + 2); + index = end < 0 ? sql.length : end; + } else if (code === 0x2f && sql.charCodeAt(index + 1) === 0x2a) { + const end = sql.indexOf('*/', index + 2); + index = end < 0 ? sql.length : end + 2; + } else { + return index; + } + } +} + +/** + * The keyword-shaped token at `index`, ASCII-lowercased, and where it ends. + * SQLite folds keyword case in ASCII only, so a token containing anything but + * ASCII letters is an identifier and never one of the keywords compared here. + */ +function readSqlWord(sql, index) { + let end = index; + while (end < sql.length && isSqliteIdChar(sql.charCodeAt(end))) end++; + const word = sql.slice(index, end); + return { word: /^[A-Za-z]+$/.test(word) ? word.toLowerCase() : word, end }; +} + +/** + * The verb of the first statement SQLite would compile from `sql`, looking + * through `EXPLAIN` and `EXPLAIN QUERY PLAN`. + */ +function leadingStatementVerb(sql) { + let token = readSqlWord(sql, skipSqlTrivia(sql, 0, true)); + if (token.word !== 'explain') return token.word; + token = readSqlWord(sql, skipSqlTrivia(sql, token.end, false)); + if (token.word !== 'query') return token.word; + token = readSqlWord(sql, skipSqlTrivia(sql, token.end, false)); + if (token.word !== 'plan') return token.word; + return readSqlWord(sql, skipSqlTrivia(sql, token.end, false)).word; +} + +/** + * Refuse SQL that would ATTACH or DETACH a database. + * + * The connections here are real-filesystem SQLite handles. ATTACH opens any + * path the process can reach: it reads every existing database, writes into + * it, and turns any existing empty file into one (even under a read-only + * open, which blocks writes through the attached schema but not ATTACH or the + * reads). It would make the bound path meaningless, so it is never allowed. + * + * Checking the first statement's leading verb is complete because ATTACH and + * DETACH only exist as a whole statement: SQLite rejects them at compile time + * inside WITH, a subquery, VALUES or a trigger body, and the `sqlite_attach` + * function they compile to is not callable by name. Every caller passes a + * string whose FIRST statement is the only one it compiles (prepare, allAsync, + * AsyncDatabase.all/run); exec, which runs every statement, is rebuilt below + * as a per-statement walk that checks each one before compiling it. + * + * EXPLAIN ATTACH is refused too, so this guard never depends on EXPLAIN + * semantics. Non-string SQL is refused because the binding coerces it with + * ToString: an array ['ATTACH ...'] would otherwise compile unchecked. + * + * The bundled runtime enforces the same rule in C: every connection installs + * an authorizer at open that refuses ATTACH and DETACH (see runVacuumInto for + * the one permitted path), so a future SQLite tokenizer change that this + * mirror misses still cannot attach a file. This check stays in front for its + * specific error code. + */ +function assertSqlPathAuthority(sql) { + if (typeof sql !== 'string') { + throw new TypeError('Native SQLite requires SQL text as a string'); + } + const verb = leadingStatementVerb(sql); + if (verb !== 'attach' && verb !== 'detach') return; + const reason = verb === 'attach' + ? 'it can open, read or write a database file outside the one this editor opened' + : 'this editor keeps one database per connection, so there is nothing to detach'; + const error = new Error( + `${verb.toUpperCase()} is not allowed on the native SQLite engine: ${reason}. ` + + `(${NATIVE_SQL_ATTACH_BLOCKED})` + ); + error.code = NATIVE_SQL_ATTACH_BLOCKED; + throw error; +} + +const SQLITE_AUTH = 23; + +/** + * Visit an error and everything it wraps: AggregateError members and `cause` + * chains (deadline, cancellation and cleanup wrappers nest them). Bounded and + * cycle-safe because the values come from the runtime. + */ +function forEachWrappedError(error, visit, depth = 0, seen = new Set()) { + if (!error || typeof error !== 'object' || depth > 8 || seen.has(error)) return; + seen.add(error); + visit(error); + if (Array.isArray(error.errors)) { + for (const member of error.errors) forEachWrappedError(member, visit, depth + 1, seen); + } + forEachWrappedError(error.cause, visit, depth + 1, seen); +} + +/** + * The runtime's authorizer denies only ATTACH, DETACH and the ATTACH inside + * VACUUM INTO, so SQLITE_AUTH on these connections is exactly that refusal, + * wherever a wrapper put it. + */ +function isPathAuthorityRefusal(error) { + let found = false; + forEachWrappedError(error, candidate => { if (candidate.errno === SQLITE_AUTH) found = true; }); + return found; +} + +/** + * Error text for the IPC reply. The authorizer's refusal gets its code, and + * every other failure it was wrapped with (a failed permit withdrawal, a + * failed deadline cleanup, a cancellation) is kept rather than replaced. + */ +function describeWorkerError(error) { + if (!isPathAuthorityRefusal(error)) return describeNativeError(error, 'Unknown native worker error'); + const others = []; + forEachWrappedError(error, candidate => { + // An AggregateError's own message repeats its members; the refusal is + // replaced by the coded text below. + if (candidate.errno === SQLITE_AUTH || Array.isArray(candidate.errors)) return; + const message = describeNativeError(candidate, 'Unknown error'); + if (!others.includes(message)) others.push(message); + }); + const text = 'The native SQLite engine refused a statement that would ATTACH, DETACH or ' + + 'VACUUM INTO a database other than the one this editor opened. ' + + `(${NATIVE_SQL_ATTACH_BLOCKED})` + others.map(message => `; ${message}`).join(''); + // The same IPC bound as every other worker error. + return describeNativeError({ message: text }, 'Unknown native worker error'); +} + +/** A failed batch whose savepoint cleanup also failed, keeping both errors for describeWorkerError. */ +function batchCleanupError(error, cleanupError) { + return new AggregateError( + [error, cleanupError], + `Batch failed (${String(error)}); savepoint cleanup failed (${String(cleanupError)})` + ); +} + +/** + * Install the guard on the connection classes themselves, once, before any + * connection exists. Every handle this worker opens (the primary, the + * AsyncDatabase reader, dedicated cell-read snapshots) and every RPC that + * reaches SQL then goes through it, including any added later. + */ +function installSqlPathAuthorityGuard() { + const rawPrepare = Database.prototype.prepare; + Database.prototype.prepare = function prepare(sql, ...rest) { + assertSqlPathAuthority(sql); + return rawPrepare.call(this, sql, ...rest); + }; + + // The native exec runs every statement in the string, so checking only the + // first would miss `SELECT 1; ATTACH ...`. Executing one statement at a + // time through the guarded prepare lets SQLite's own parser find each + // boundary, and runs earlier DDL before a later statement that needs it is + // compiled. It is not a drop-in sqlite3_exec: it materializes each + // statement's rows, caps a script at MAX_QUERY_STATEMENTS, and refuses + // parameter tokens (sqlite3_exec binds them as NULL). Every caller sends one + // parameterless statement. + Database.prototype.exec = function exec(sql) { + executeQuery(this, sql, []); + }; + + const guardAsync = (prototype, name) => { + const raw = prototype?.[name]; + if (typeof raw !== 'function') return; + prototype[name] = function (sql, ...rest) { + try { + assertSqlPathAuthority(sql); + } catch (error) { + return Promise.reject(error); + } + return raw.call(this, sql, ...rest); + }; + }; + guardAsync(Database.prototype, 'allAsync'); + guardAsync(AsyncDatabase?.prototype, 'all'); + guardAsync(AsyncDatabase?.prototype, 'run'); +} + +installSqlPathAuthorityGuard(); + // Both stdio handles changed API in the same txiki generation. Detect once so // the legacy path stays identical and the WHATWG handles remain locked to one // reader/writer for the worker's lifetime. @@ -448,7 +670,15 @@ function executeInterruptibleAsyncOperation(requestId, timeoutMs, operation) { })(); } -/** VACUUM must run on the interruptible connection and outside transactions. */ +/** + * VACUUM must run on the interruptible connection and outside transactions. + * + * VACUUM INTO attaches its destination, and the runtime's authorizer refuses + * every ATTACH except the one path a connection permits. The permit names + * exactly this host-chosen snapshot and is withdrawn when the VACUUM settles, + * so SQL-level VACUUM INTO any other path (which would create an arbitrary + * file holding a copy of the database) stays refused. + */ function runVacuumInto(asyncDatabase, database, snapshotPath, signal) { if (!asyncDatabase || typeof asyncDatabase.run !== 'function') { return Promise.reject( @@ -463,7 +693,47 @@ function runVacuumInto(asyncDatabase, database, snapshotPath, signal) { if (typeof snapshotPath !== 'string' || snapshotPath.length === 0) { return Promise.reject(new Error('A native export snapshot path is required')); } - return asyncDatabase.run('VACUUM main INTO ?', [snapshotPath], { signal }); + try { + asyncDatabase.permitAttach(snapshotPath); + } catch (error) { + return Promise.reject(error); + } + const withdrawPermit = () => { + try { + asyncDatabase.permitAttach(null); + } catch (error) { + // A closing connection ('Invalid DB') takes its permit with it. Any + // other failure leaves the permit installed, so the connection is + // closed (no handle keeps authorizing the path, even if a cancellation + // wrapper later hides this error) and the failure is reported. A + // reworded closing message lands here too, which fails closed. + if (error?.message === 'Invalid DB') return; + releaseAsyncDatabase(asyncDatabase); + throw error; + } + }; + // Through a promise, so a synchronous throw from run also withdraws the permit. + return new Promise(resolve => resolve( + asyncDatabase.run('VACUUM main INTO ?', [snapshotPath], { signal }) + )).then( + result => { + withdrawPermit(); + return result; + }, + error => { + try { + withdrawPermit(); + } catch (withdrawError) { + throw new AggregateError( + [error, withdrawError], + `${describeNativeError(error, 'VACUUM INTO failed')}; ` + + `withdrawing the ATTACH permit also failed: ` + + `${describeNativeError(withdrawError, 'Unknown permit error')}` + ); + } + throw error; + } + ); } /** Abort one active async operation without affecting queued or future work. */ @@ -477,6 +747,23 @@ function cancelOperation(correlationId) { return true; } +/** + * Take an AsyncDatabase out of service now. For the shared connection this + * goes through closeAsyncDatabase, which clears `asyncDb` synchronously, so + * later reads fall back to the primary connection instead of a closed handle. + */ +function releaseAsyncDatabase(connection) { + // Any other connection's close may be synchronous or throw; it is reported + // here rather than replacing the failure the caller is about to throw. + const closing = connection === asyncDb + ? closeAsyncDatabase() + : new Promise(resolve => resolve(connection.close())); + closing.catch(closeError => { + console.error('[native-worker] closing the snapshot connection failed:', + describeNativeError(closeError, 'Unknown close error')); + }); +} + function closeAsyncDatabase() { return (async () => { const connection = asyncDb; @@ -587,6 +874,10 @@ function executeStatement(db, sql, params) { stmt.finalize(); } catch (finalizeError) { if (executionError !== undefined) { + // finalize reports a failed step's code again: that is one failure. + if (finalizeError?.errno !== undefined && finalizeError.errno === executionError?.errno) { + throw executionError; + } throw new AggregateError( [executionError, finalizeError], `${describeNativeError(executionError, 'Statement execution failed')}; ` + @@ -2196,9 +2487,7 @@ async function handleRequest(request) { db.exec(`ROLLBACK TO SAVEPOINT ${savepointName}`); if (ownsSavepoint) db.exec(`RELEASE SAVEPOINT ${savepointName}`); } catch (rollbackErr) { - throw new Error( - `Batch failed (${String(err)}); savepoint cleanup failed (${String(rollbackErr)})` - ); + throw batchCleanupError(err, rollbackErr); } throw err; } @@ -2345,7 +2634,7 @@ async function handleRequest(request) { return { id, result }; } catch (err) { - const errorMsg = describeNativeError(err, 'Unknown native worker error'); + const errorMsg = describeWorkerError(err); console.error(`[native-worker] ERROR in ${method}:`, errorMsg); return { id, diff --git a/natives/x86_64-linux-gnu/query-plan.so b/natives/x86_64-linux-gnu/query-plan.so index b1b93766..fb1faf4c 100644 Binary files a/natives/x86_64-linux-gnu/query-plan.so and b/natives/x86_64-linux-gnu/query-plan.so differ diff --git a/natives/x86_64-linux-gnu/tjs b/natives/x86_64-linux-gnu/tjs index 25e16257..a5939e5d 100755 Binary files a/natives/x86_64-linux-gnu/tjs and b/natives/x86_64-linux-gnu/tjs differ diff --git a/natives/x86_64-macos/tjs b/natives/x86_64-macos/tjs index 256837f5..d20bdd8b 100755 Binary files a/natives/x86_64-macos/tjs and b/natives/x86_64-macos/tjs differ diff --git a/natives/x86_64-windows/tjs.exe b/natives/x86_64-windows/tjs.exe index 93faef2d..6bc49d98 100755 Binary files a/natives/x86_64-windows/tjs.exe and b/natives/x86_64-windows/tjs.exe differ diff --git a/package-lock.json b/package-lock.json index 81a5f605..d2fe41f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sqlite-explorer", - "version": "1.8.1", + "version": "1.8.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sqlite-explorer", - "version": "1.8.1", + "version": "1.8.2", "funding": [ { "type": "github", @@ -26,43 +26,26 @@ "@scure/base": "^2.4.0", "@vscode/codicons": "^0.0.45", "@vscode/extension-telemetry": "^1.5.2", - "sql.js": "^1.14.2" + "sql.js": "^1.15.0" }, "devDependencies": { - "@types/node": "^26.5.1", + "@types/node": "^26.6.5", "@types/vscode": "=1.110.0", "@vscode/test-electron": "^3.1.0", - "@vscode/vsce": "^3.9.2", + "@vscode/vsce": "^4.0.0", "esbuild": "^0.28.2", "esbuild-plugin-polyfill-node": "^0.3.0", - "mocha": "^12.0.1", - "ovsx": "1.2.0", - "playwright-core": "1.63.0", + "mocha": "^12.0.3", + "ovsx": "1.3.0", + "playwright-core": "1.64.1", "ts-node": "^10.9.2", - "tsx": "^4.23.13", + "tsx": "^4.23.15", "typescript": "^6.0.3" }, "engines": { "vscode": "^1.110.0" } }, - "node_modules/@azu/format-text": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@azu/format-text/-/format-text-1.0.2.tgz", - "integrity": "sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@azu/style-format": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azu/style-format/-/style-format-1.0.1.tgz", - "integrity": "sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g==", - "dev": true, - "license": "WTFPL", - "dependencies": { - "@azu/format-text": "^1.0.1" - } - }, "node_modules/@azure/abort-controller": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", @@ -108,6 +91,16 @@ "node": ">=18.0.0" } }, + "node_modules/@azure/core-process": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@azure/core-process/-/core-process-1.0.0.tgz", + "integrity": "sha512-/shnJ+ooO8WPxDhPEeI/2oRQuubn16gZ6CvlbpWbEswZfzwI9tI/sMAHmF3x1LuQ9yZYXfLW3TjzGMLEC5blKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.0.0" + } + }, "node_modules/@azure/core-rest-pipeline": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.2.tgz", @@ -156,26 +149,27 @@ } }, "node_modules/@azure/identity": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.13.1.tgz", - "integrity": "sha512-5C/2WD5Vb1lHnZS16dNQRPMjN6oV/Upba+C9nBIs15PmOi6A3ZGs4Lr2u60zw4S04gi+u3cEXiqTVP7M4Pz3kw==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.14.0.tgz", + "integrity": "sha512-8utCLdTZn14CiAe0HW4JbtzUMsc0mdDwnjUvStFMrR4IxQP8S2eL9zVAdplpfORVJGYmidZElpeXRYjJQ4UyUw==", "dev": true, "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.9.0", "@azure/core-client": "^1.9.2", + "@azure/core-process": "^1.0.0", "@azure/core-rest-pipeline": "^1.17.0", "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.11.0", "@azure/logger": "^1.0.0", "@azure/msal-browser": "^5.5.0", - "@azure/msal-node": "^5.1.0", - "open": "^10.1.0", + "@azure/msal-node": "^6.0.0", + "open": "^11.0.0", "tslib": "^2.2.0" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@azure/logger": { @@ -216,42 +210,27 @@ } }, "node_modules/@azure/msal-node": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-5.2.2.tgz", - "integrity": "sha512-toS+2AePxqyzb0YOKttDOOiSl3jrkK9aiqIvpurpis0O34QcIS5gToqrgT39p04Dpxw3YoUU0lxJKTpSFFfA6Q==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-6.0.1.tgz", + "integrity": "sha512-ixSO1Y/kCVRthRs+hSx/5qkwaunX1/RAePhlMN0wIpIQ4WEZ6AREGGnGd1AP0qspHVsAwzWQKGubpjh50JyJIQ==", "dev": true, "license": "MIT", "dependencies": { - "@azure/msal-common": "16.6.2", + "@azure/msal-common": "16.14.1", "jsonwebtoken": "^9.0.0" }, "engines": { "node": ">=20" } }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "node_modules/@azure/msal-node/node_modules/@azure/msal-common": { + "version": "16.14.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-16.14.1.tgz", + "integrity": "sha512-Or6xhPNyi4zHW25158yxBoyxuCqNSPa5YBVqfF1J5Ks4MJWBo/USXdp05DQIPu1Zli00YZu6t0+h6KvHJealxQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=0.8.0" } }, "node_modules/@cspotcode/source-map-support": { @@ -1248,7 +1227,6 @@ "integrity": "sha512-WrOw/bcXm0f9qHkumlT1QlArXSTWqaY9sunsDpOk+yCCorCKMxvWT/a3xko4EYHVdeZoh00yI2TydXn6eyICDA==", "dev": true, "license": "MIT", - "optional": true, "engines": { "node": ">= 10" }, @@ -1781,44 +1759,6 @@ "node": ">= 10" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@scure/base": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@scure/base/-/base-2.4.0.tgz", @@ -1828,37 +1768,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@secretlint/config-creator": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/config-creator/-/config-creator-10.2.2.tgz", - "integrity": "sha512-BynOBe7Hn3LJjb3CqCHZjeNB09s/vgf0baBaHVw67w7gHF0d25c3ZsZ5+vv8TgwSchRdUCRrbbcq5i2B1fJ2QQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/types": "^10.2.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/config-loader": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/config-loader/-/config-loader-10.2.2.tgz", - "integrity": "sha512-ndjjQNgLg4DIcMJp4iaRD6xb9ijWQZVbd9694Ol2IszBIbGPPkwZHzJYKICbTBmh6AH/pLr0CiCaWdGJU7RbpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/profiler": "^10.2.2", - "@secretlint/resolver": "^10.2.2", - "@secretlint/types": "^10.2.2", - "ajv": "^8.17.1", - "debug": "^4.4.1", - "rc-config-loader": "^4.1.3" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@secretlint/core": { "version": "10.2.2", "resolved": "https://registry.npmjs.org/@secretlint/core/-/core-10.2.2.tgz", @@ -1875,62 +1784,6 @@ "node": ">=20.0.0" } }, - "node_modules/@secretlint/formatter": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/formatter/-/formatter-10.2.2.tgz", - "integrity": "sha512-10f/eKV+8YdGKNQmoDUD1QnYL7TzhI2kzyx95vsJKbEa8akzLAR5ZrWIZ3LbcMmBLzxlSQMMccRmi05yDQ5YDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/resolver": "^10.2.2", - "@secretlint/types": "^10.2.2", - "@textlint/linter-formatter": "^15.2.0", - "@textlint/module-interop": "^15.2.0", - "@textlint/types": "^15.2.0", - "chalk": "^5.4.1", - "debug": "^4.4.1", - "pluralize": "^8.0.0", - "strip-ansi": "^7.1.0", - "table": "^6.9.0", - "terminal-link": "^4.0.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/formatter/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@secretlint/node": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/node/-/node-10.2.2.tgz", - "integrity": "sha512-eZGJQgcg/3WRBwX1bRnss7RmHHK/YlP/l7zOQsrjexYt6l+JJa5YhUmHbuGXS94yW0++3YkEJp0kQGYhiw1DMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/config-loader": "^10.2.2", - "@secretlint/core": "^10.2.2", - "@secretlint/formatter": "^10.2.2", - "@secretlint/profiler": "^10.2.2", - "@secretlint/source-creator": "^10.2.2", - "@secretlint/types": "^10.2.2", - "debug": "^4.4.1", - "p-map": "^7.0.3" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@secretlint/profiler": { "version": "10.2.2", "resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-10.2.2.tgz", @@ -1938,23 +1791,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@secretlint/resolver": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/resolver/-/resolver-10.2.2.tgz", - "integrity": "sha512-3md0cp12e+Ae5V+crPQYGd6aaO7ahw95s28OlULGyclyyUtf861UoRGS2prnUrKh7MZb23kdDOyGCYb9br5e4w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@secretlint/secretlint-formatter-sarif": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/secretlint-formatter-sarif/-/secretlint-formatter-sarif-10.2.2.tgz", - "integrity": "sha512-ojiF9TGRKJJw308DnYBucHxkpNovDNu1XvPh7IfUp0A12gzTtxuWDqdpuVezL7/IP8Ua7mp5/VkDMN9OLp1doQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "node-sarif-builder": "^3.2.0" - } - }, "node_modules/@secretlint/secretlint-rule-no-dotenv": { "version": "10.2.2", "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-no-dotenv/-/secretlint-rule-no-dotenv-10.2.2.tgz", @@ -2002,125 +1838,6 @@ "node": ">=20.0.0" } }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@textlint/ast-node-types": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.4.1.tgz", - "integrity": "sha512-XifMpBMdo0E1Fuh85YdcYAgy+okNg9WKBzIPIO4JUDnSWUVFihnogrM4cjDapeHkgzSgulwR8oJVJ17eyxI1bA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@textlint/linter-formatter": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-15.4.1.tgz", - "integrity": "sha512-kAV7Sup3vwvqxKvBbf9lx/JaPHkRybQp/LLvA73U1AorPZE6XyfBAFG24BbMiCs4OX1ax4g7kXRuFPgMLWRf+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azu/format-text": "^1.0.2", - "@azu/style-format": "^1.0.1", - "@textlint/module-interop": "15.4.1", - "@textlint/resolver": "15.4.1", - "@textlint/types": "15.4.1", - "chalk": "^4.1.2", - "debug": "^4.4.3", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "pluralize": "^2.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "table": "^6.9.0", - "text-table": "^0.2.0" - } - }, - "node_modules/@textlint/linter-formatter/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@textlint/linter-formatter/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@textlint/linter-formatter/node_modules/pluralize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-2.0.0.tgz", - "integrity": "sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@textlint/linter-formatter/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@textlint/linter-formatter/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@textlint/module-interop": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-15.4.1.tgz", - "integrity": "sha512-jHtM2E5CR68P3z/+FGrEU5pml2fQVzEo2sez9FEjrVHSPCrHtqHcPaKfsYbQJjc9C48ObwaWrCzRNaL3KedNCQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@textlint/resolver": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-15.4.1.tgz", - "integrity": "sha512-uVssyG3XXXKNY+O7NOajGvQZTyOuhPviwlq7Xek6ZT9K1eDQtA8074cPkAQoLMYhi/TUyOE5P5kpz42UF8Lmdw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@textlint/types": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/@textlint/types/-/types-15.4.1.tgz", - "integrity": "sha512-WByVZ3zblbvuI+voWQplUP7seSTKXI9z6TMVXEB3dY3JFrZCIXWKNfLbETX5lZV7fYkCMaDtILO1l6s11wdbQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@textlint/ast-node-types": "15.4.1" - } - }, "node_modules/@tsconfig/node10": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", @@ -2161,29 +1878,16 @@ } }, "node_modules/@types/node": { - "version": "26.5.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.5.1.tgz", - "integrity": "sha512-CzNm2FezW4VR/LjG6yUdiEgLE/rAQ9Slj5gCu/C2VrdcW7I0ahNZ8DRbHT7zOZ6r3ONgd/bsQIeSaoDGrd1C6g==", + "version": "26.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.5.tgz", + "integrity": "sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~8.9.0" } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/sarif": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", - "integrity": "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/vscode": { "version": "1.110.0", "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.110.0.tgz", @@ -2246,73 +1950,69 @@ } }, "node_modules/@vscode/vsce": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.9.2.tgz", - "integrity": "sha512-XSxMosEEDO6vLxELAHVkwmhC0qe0ijZni2jB9Rcs8kQsW4lhTDQ/wMzmwFs/buotAWSnpmUp/dRWD2ufG3UYKA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-4.0.0.tgz", + "integrity": "sha512-NImwuLaenMmb5D5Jer9/lzi/F9ZQUBOp8Azhj/BVYcTFgixv8KehFXqEUDjQlD2tAiw2E6dDGyjTuAB//di60A==", "dev": true, "license": "MIT", "dependencies": { - "@azure/identity": "^4.1.0", - "@secretlint/node": "^10.1.2", - "@secretlint/secretlint-formatter-sarif": "^10.1.2", - "@secretlint/secretlint-rule-no-dotenv": "^10.1.2", - "@secretlint/secretlint-rule-preset-recommend": "^10.1.2", - "@vscode/vsce-sign": "^2.0.0", + "@azure/identity": "^4.13.2", + "@napi-rs/keyring": "^1.3.0", + "@secretlint/core": "^10.2.2", + "@secretlint/secretlint-rule-no-dotenv": "^10.2.2", + "@secretlint/secretlint-rule-preset-recommend": "^10.2.2", + "@secretlint/source-creator": "^10.2.2", + "@secretlint/types": "^10.2.2", + "@vscode/vsce-sign": "^2.1.0", "azure-devops-node-api": "^12.5.0", - "chalk": "^4.1.2", - "cheerio": "^1.0.0-rc.9", - "cockatiel": "^3.1.2", + "cockatiel": "^3.2.1", "commander": "^12.1.0", - "form-data": "^4.0.0", - "glob": "^13.0.6", - "hosted-git-info": "^4.0.2", - "jsonc-parser": "^3.2.0", - "leven": "^3.1.0", - "markdown-it": "^14.1.0", - "mime": "^1.3.4", - "minimatch": "^10.2.2", - "parse-semver": "^1.1.1", + "hosted-git-info": "^4.1.0", + "jsonc-parser": "^3.3.1", + "marked": "^18.0.11", + "mime": "^1.6.0", + "minimatch": "^10.2.6", + "parse5": "^8.0.1", + "proper-lockfile": "^4.1.2", "read": "^1.0.7", - "secretlint": "^10.1.2", - "semver": "^7.5.2", - "tmp": "^0.2.3", - "typed-rest-client": "^1.8.4", + "semver": "^7.8.5", + "tinyglobby": "^0.2.17", + "typed-rest-client": "^1.8.11", "url-join": "^4.0.1", "xml2js": "^0.5.0", - "yauzl": "^3.2.1", - "yazl": "^2.2.2" + "yauzl": "^3.4.0", + "yazl": "^2.5.1" }, "bin": { "vsce": "vsce" }, "engines": { - "node": ">= 20" - }, - "optionalDependencies": { - "keytar": "^7.7.0" + "node": ">= 22" } }, "node_modules/@vscode/vsce-sign": { - "version": "2.0.4", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.1.0.tgz", + "integrity": "sha512-9AQrqazrBgTgRSuwleLVXUrIUphY02/SFCh2TKYoLV/xifJAdblhdmEmw5gUrYSPQ3sRwNs9iyCMD14sATEE6g==", "dev": true, "hasInstallScript": true, "license": "SEE LICENSE IN LICENSE.txt", "optionalDependencies": { - "@vscode/vsce-sign-alpine-arm64": "2.0.2", - "@vscode/vsce-sign-alpine-x64": "2.0.2", - "@vscode/vsce-sign-darwin-arm64": "2.0.2", - "@vscode/vsce-sign-darwin-x64": "2.0.2", - "@vscode/vsce-sign-linux-arm": "2.0.2", - "@vscode/vsce-sign-linux-arm64": "2.0.2", - "@vscode/vsce-sign-linux-x64": "2.0.2", - "@vscode/vsce-sign-win32-arm64": "2.0.2", - "@vscode/vsce-sign-win32-x64": "2.0.2" + "@vscode/vsce-sign-alpine-arm64": "2.0.6", + "@vscode/vsce-sign-alpine-x64": "2.0.6", + "@vscode/vsce-sign-darwin-arm64": "2.0.6", + "@vscode/vsce-sign-darwin-x64": "2.0.6", + "@vscode/vsce-sign-linux-arm": "2.0.6", + "@vscode/vsce-sign-linux-arm64": "2.0.6", + "@vscode/vsce-sign-linux-x64": "2.0.6", + "@vscode/vsce-sign-win32-arm64": "2.0.6", + "@vscode/vsce-sign-win32-x64": "2.0.6" } }, "node_modules/@vscode/vsce-sign-alpine-arm64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.2.tgz", - "integrity": "sha512-E80YvqhtZCLUv3YAf9+tIbbqoinWLCO/B3j03yQPbjT3ZIHCliKZlsy1peNc4XNZ5uIb87Jn0HWx/ZbPXviuAQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.6.tgz", + "integrity": "sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==", "cpu": [ "arm64" ], @@ -2324,9 +2024,9 @@ ] }, "node_modules/@vscode/vsce-sign-alpine-x64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.2.tgz", - "integrity": "sha512-n1WC15MSMvTaeJ5KjWCzo0nzjydwxLyoHiMJHu1Ov0VWTZiddasmOQHekA47tFRycnt4FsQrlkSCTdgHppn6bw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.6.tgz", + "integrity": "sha512-YoAGlmdK39vKi9jA18i4ufBbd95OqGJxRvF3n6ZbCyziwy3O+JgOpIUPxv5tjeO6gQfx29qBivQ8ZZTUF2Ba0w==", "cpu": [ "x64" ], @@ -2338,7 +2038,9 @@ ] }, "node_modules/@vscode/vsce-sign-darwin-arm64": { - "version": "2.0.2", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.6.tgz", + "integrity": "sha512-5HMHaJRIQuozm/XQIiJiA0W9uhdblwwl2ZNDSSAeXGO9YhB9MH5C4KIHOmvyjUnKy4UCuiP43VKpIxW1VWP4tQ==", "cpu": [ "arm64" ], @@ -2350,9 +2052,9 @@ ] }, "node_modules/@vscode/vsce-sign-darwin-x64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.2.tgz", - "integrity": "sha512-MCjPrQ5MY/QVoZ6n0D92jcRb7eYvxAujG/AH2yM6lI0BspvJQxp0o9s5oiAM9r32r9tkLpiy5s2icsbwefAQIw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.6.tgz", + "integrity": "sha512-25GsUbTAiNfHSuRItoQafXOIpxlYj+IXb4/qarrXu7kmbH94jlm5sdWSCKrrREs8+GsXF1b+l3OB7VJy5jsykw==", "cpu": [ "x64" ], @@ -2364,9 +2066,9 @@ ] }, "node_modules/@vscode/vsce-sign-linux-arm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.2.tgz", - "integrity": "sha512-Fkb5jpbfhZKVw3xwR6t7WYfwKZktVGNXdg1m08uEx1anO0oUPUkoQRsNm4QniL3hmfw0ijg00YA6TrxCRkPVOQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.6.tgz", + "integrity": "sha512-UndEc2Xlq4HsuMPnwu7420uqceXjs4yb5W8E2/UkaHBB9OWCwMd3/bRe/1eLe3D8kPpxzcaeTyXiK3RdzS/1CA==", "cpu": [ "arm" ], @@ -2378,9 +2080,9 @@ ] }, "node_modules/@vscode/vsce-sign-linux-arm64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.2.tgz", - "integrity": "sha512-Ybeu7cA6+/koxszsORXX0OJk9N0GgfHq70Wqi4vv2iJCZvBrOWwcIrxKjvFtwyDgdeQzgPheH5nhLVl5eQy7WA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.6.tgz", + "integrity": "sha512-cfb1qK7lygtMa4NUl2582nP7aliLYuDEVpAbXJMkDq1qE+olIw/es+C8j1LJwvcRq1I2yWGtSn3EkDp9Dq5FdA==", "cpu": [ "arm64" ], @@ -2392,9 +2094,9 @@ ] }, "node_modules/@vscode/vsce-sign-linux-x64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.2.tgz", - "integrity": "sha512-NsPPFVtLaTlVJKOiTnO8Cl78LZNWy0Q8iAg+LlBiCDEgC12Gt4WXOSs2pmcIjDYzj2kY4NwdeN1mBTaujYZaPg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.6.tgz", + "integrity": "sha512-/olerl1A4sOqdP+hjvJ1sbQjKN07Y3DVnxO4gnbn/ahtQvFrdhUi0G1VsZXDNjfqmXw57DmPi5ASnj/8PGZhAA==", "cpu": [ "x64" ], @@ -2406,9 +2108,9 @@ ] }, "node_modules/@vscode/vsce-sign-win32-arm64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.2.tgz", - "integrity": "sha512-wPs848ymZ3Ny+Y1Qlyi7mcT6VSigG89FWQnp2qRYCyMhdJxOpA4lDwxzlpL8fG6xC8GjQjGDkwbkWUcCobvksQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.6.tgz", + "integrity": "sha512-ivM/MiGIY0PJNZBoGtlRBM/xDpwbdlCWomUWuLmIxbi1Cxe/1nooYrEQoaHD8ojVRgzdQEUzMsRbyF5cJJgYOg==", "cpu": [ "arm64" ], @@ -2420,9 +2122,9 @@ ] }, "node_modules/@vscode/vsce-sign-win32-x64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.2.tgz", - "integrity": "sha512-pAiRN6qSAhDM5SVOIxgx+2xnoVUePHbRNC7OD2aOR3WltTKxxF25OfpK8h8UQ7A0BuRkSgREbB59DBlFk4iAeg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.6.tgz", + "integrity": "sha512-mgth9Kvze+u8CruYMmhHw6Zgy3GRX2S+Ed5oSokDEK5vPEwGGKnmuXua9tmFhomeAnhgJnL4DCna3TiNuGrBTQ==", "cpu": [ "x64" ], @@ -2477,39 +2179,6 @@ "node": ">= 14" } }, - "node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", - "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "6.1.0", "dev": true, @@ -2537,22 +2206,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/aproba": { - "version": "1.2.0", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/are-we-there-yet": { - "version": "1.1.7", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -2565,21 +2218,6 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, "node_modules/azure-devops-node-api": { "version": "12.5.0", "dev": true, @@ -2599,26 +2237,6 @@ "node": "18 || 20 || >=22" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true - }, "node_modules/binaryextensions": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-6.11.0.tgz", @@ -2635,36 +2253,6 @@ "url": "https://bevry.me/fund" } }, - "node_modules/bl": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/boundary": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/boundary/-/boundary-2.0.0.tgz", @@ -2685,19 +2273,6 @@ "node": "20 || >=22" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -2705,30 +2280,6 @@ "dev": true, "license": "ISC" }, - "node_modules/buffer": { - "version": "5.7.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/buffer-crc32": { "version": "0.2.13", "dev": true, @@ -2745,9 +2296,9 @@ "license": "BSD-3-Clause" }, "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.1.tgz", + "integrity": "sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==", "dev": true, "license": "MIT", "dependencies": { @@ -2791,23 +2342,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/chardet": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", @@ -2815,41 +2349,6 @@ "dev": true, "license": "MIT" }, - "node_modules/cheerio": { - "version": "1.0.0-rc.10", - "dev": true, - "license": "MIT", - "dependencies": { - "cheerio-select": "^1.5.0", - "dom-serializer": "^1.3.2", - "domhandler": "^4.2.0", - "htmlparser2": "^6.1.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "1.5.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "css-select": "^4.1.3", - "css-what": "^5.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0", - "domutils": "^2.7.0" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/chokidar": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", @@ -2866,12 +2365,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/chownr": { - "version": "1.1.4", - "dev": true, - "license": "ISC", - "optional": true - }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -2919,22 +2412,15 @@ } }, "node_modules/cockatiel": { - "version": "3.1.2", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.2.1.tgz", + "integrity": "sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==", "dev": true, "license": "MIT", "engines": { "node": ">=16" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2955,33 +2441,16 @@ "dev": true, "license": "MIT" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=20" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "dev": true, - "license": "ISC", - "optional": true - }, "node_modules/core-util-is": { "version": "1.0.3", "dev": true, @@ -3014,32 +2483,6 @@ "@napi-rs/keyring": "^1.2.0" } }, - "node_modules/css-select": { - "version": "4.2.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "5.1.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -3058,34 +2501,10 @@ } } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/default-browser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", - "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz", + "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==", "dev": true, "license": "MIT", "dependencies": { @@ -3161,29 +2580,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/detect-libc": { - "version": "2.0.1", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, "node_modules/diff": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", @@ -3194,65 +2590,6 @@ "node": ">=0.3.1" } }, - "node_modules/dom-serializer": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.2.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -3302,39 +2639,19 @@ "dev": true, "license": "MIT" }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/entities": { - "version": "4.5.0", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.1.0.tgz", + "integrity": "sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==", "dev": true, "license": "BSD-2-Clause", "engines": { - "node": ">=0.12" + "node": ">=20.19.0" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -3368,22 +2685,6 @@ "node": ">= 0.4" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/esbuild": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", @@ -3391,6 +2692,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -3438,181 +2740,32 @@ "esbuild": "*" } }, - "node_modules/expand-template": { - "version": "2.0.3", + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", "dev": true, - "license": "(MIT OR WTFPL)", - "optional": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-uri": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.7.tgz", - "integrity": "sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-8.0.0.tgz", - "integrity": "sha512-JGG8pvDi2C+JxidYdIwQDyS/CgcrIdh18cvgxcBge3wSHRQOrooMD3GlFBcmMJAN9M42SAZjDp5zv1dglJjwww==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^8.0.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", - "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data/node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/function-bind": { @@ -3625,75 +2778,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "2.7.4", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/gauge/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/gauge/node_modules/string-width": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/get-east-asian-width": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", @@ -3746,12 +2830,6 @@ "node": ">= 0.4" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/glob": { "version": "13.0.6", "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", @@ -3770,19 +2848,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", @@ -3800,27 +2865,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -3877,28 +2921,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "license": "ISC", - "optional": true - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -3923,32 +2945,6 @@ "node": ">=10" } }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "2.2.0", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -3994,36 +2990,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause", - "optional": true - }, - "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", @@ -4040,30 +3006,11 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/index-to-position": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", - "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/inherits": { "version": "2.0.4", "dev": true, "license": "ISC" }, - "node_modules/ini": { - "version": "1.3.8", - "dev": true, - "license": "ISC", - "optional": true - }, "node_modules/is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", @@ -4093,16 +3040,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "dev": true, @@ -4111,17 +3048,17 @@ "node": ">=8" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", "dev": true, "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-inside-container": { @@ -4169,16 +3106,6 @@ "node": ">=12" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/is-path-inside": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", @@ -4206,9 +3133,9 @@ } }, "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "dev": true, "license": "MIT", "dependencies": { @@ -4244,74 +3171,13 @@ "url": "https://bevry.me/fund" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true, "license": "MIT" }, - "node_modules/js-yaml": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", - "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/nodeca" - } - ], - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/jsonwebtoken": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", @@ -4371,25 +3237,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/keytar": { - "version": "7.9.0", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-addon-api": "^4.3.0", - "prebuild-install": "^7.0.1" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/lie": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", @@ -4400,49 +3247,6 @@ "immediate": "~3.0.5" } }, - "node_modules/linkify-it": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", - "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/markdown-it" - } - ], - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/locate-path": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-8.0.0.tgz", - "integrity": "sha512-XT9ewWAC43tiAV7xDAPflMkG0qOPn2QjHqlgX8FOqmWa/rxnyYDulF9T0F7tRy1u+TVTmK/M//6VIOye+2zDXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -4492,13 +3296,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true, - "license": "MIT" - }, "node_modules/lru-cache": { "version": "6.0.0", "dev": true, @@ -4517,32 +3314,17 @@ "dev": true, "license": "ISC" }, - "node_modules/markdown-it": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.0.tgz", - "integrity": "sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==", + "node_modules/marked": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-18.1.1.tgz", + "integrity": "sha512-zEGgrtUG8crk+TrMacJSVABU4DYDDkS8uqgU3ohrn/2fW9C2AEfUrO3m6IhpIpQpl7YcVpiXXC9cSMWDANT3dg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/markdown-it" - } - ], "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.5.0", - "linkify-it": "^5.0.2", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, "bin": { - "markdown-it": "bin/markdown-it.mjs" + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" } }, "node_modules/math-intrinsics": { @@ -4555,11 +3337,6 @@ "node": ">= 0.4" } }, - "node_modules/mdurl": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/meow": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/meow/-/meow-14.1.0.tgz", @@ -4573,30 +3350,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/mime": { "version": "1.6.0", "dev": true, @@ -4608,25 +3361,6 @@ "node": ">=4" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/mimic-function": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", @@ -4640,26 +3374,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^5.0.8" }, "engines": { "node": "18 || 20 || >=22" @@ -4668,17 +3390,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minipass": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", @@ -4689,16 +3400,10 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/mocha": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-12.0.1.tgz", - "integrity": "sha512-/ILgtFHV+R7EJLwN0OkrPPOu6wbJyrtuRtTJ5szdFHv2A3mPmkbu3r1H2q6FhaAfywDJCulcQQ2S9qDGfZW6dw==", + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-12.0.3.tgz", + "integrity": "sha512-beammieDdiWdkjANWeWPpkxUROYGi5FN88fPOkLiticz7HTg3Y+Pho3EYE6SUdcuWnZ3h2WD8EXCA55JF4o6wg==", "dev": true, "license": "MIT", "dependencies": { @@ -4706,7 +3411,7 @@ "chokidar": "^5.0.0", "debug": "^4.3.5", "diff": "^9.0.0", - "find-up": "^8.0.0", + "find-up-simple": "^1.0.1", "glob": "^13.0.0", "is-path-inside": "^4.0.0", "is-unicode-supported": "^0.1.0", @@ -4813,120 +3518,6 @@ "dev": true, "license": "ISC" }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/node-abi": { - "version": "3.8.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/node-sarif-builder": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-3.3.1.tgz", - "integrity": "sha512-8z5dAbhpxmk/WRQHXlv4V0h+9Y4Ugk+w08lyhV/7E/CQX9yDdBc3025/EG+RSMJU2aPFh/IQ7XDV7Ti5TLt/TA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/sarif": "^2.1.7", - "fs-extra": "^11.1.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/npmlog": { - "version": "4.1.2", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/nth-check": { - "version": "2.0.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -4950,15 +3541,6 @@ "node": ">= 0.4" } }, - "node_modules/once": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "wrappy": "1" - } - }, "node_modules/onetime": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", @@ -4976,19 +3558,21 @@ } }, "node_modules/open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.4.tgz", + "integrity": "sha512-++Zlftm0kVLPmzC06t6epuWmcRMDbI4z5P3NNX979WA/k23+NtSOynEGzsVfZwguKw2mi5umVgnBlJQMwRz4Pg==", "dev": true, "license": "MIT", "dependencies": { - "default-browser": "^5.2.1", + "default-browser": "^5.5.1", "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" + "powershell-utils": "^0.2.1", + "wsl-utils": "^1.0.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5062,21 +3646,18 @@ } }, "node_modules/ovsx": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ovsx/-/ovsx-1.2.0.tgz", - "integrity": "sha512-12mauBqsLehlJ0cRiroQz4uKYVjblVS5OobgSJ278CdCtkDfRQD+SI3NQ00GNalDqzp5PDN11yx84miFUojeMw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ovsx/-/ovsx-1.3.0.tgz", + "integrity": "sha512-U5B1YCo+6knEipsEF9O+iO+uwK+vTm8qNQyvc5zzE/2P6Zfzjhw4Xj4UJ7WZ1aU/kVGI70FuUWxv/GVXK5JmXw==", "dev": true, "license": "EPL-2.0", "dependencies": { "@inquirer/prompts": "^7.10.1", - "@vscode/vsce": "^3.7.1", - "commander": "^6.2.1", + "@vscode/vsce": "^4.0.0", + "commander": "^14.0.3", "cross-keychain": "^1.1.0", - "follow-redirects": "^1.16.0", "is-ci": "^2.0.0", - "leven": "^3.1.0", "semver": "^7.6.0", - "tmp": "^0.2.3", "yauzl-promise": "^4.0.0" }, "bin": { @@ -5086,105 +3667,24 @@ "node": ">=22.0.0" } }, - "node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "(MIT AND Zlib)" }, - "node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "entities": "^8.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true, - "license": "(MIT AND Zlib)" - }, - "node_modules/parse-json": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", - "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "index-to-position": "^1.1.0", - "type-fest": "^4.39.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-semver": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^5.1.0" - } - }, - "node_modules/parse-semver/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "parse5": "^6.0.1" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/path-scurry": { @@ -5214,19 +3714,6 @@ "node": "20 || >=22" } }, - "node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -5241,23 +3728,10 @@ "dev": true, "license": "ISC" }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/playwright-core": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz", - "integrity": "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==", + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.64.1.tgz", + "integrity": "sha512-BC4s8y6SEVA6Q1rSxZTto8hI1KUI3xXlHGZgvGqP4IqPdI/a6FX9H29IDNz7vKo9l21b6LfYosScPL6M3xxyDQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -5267,41 +3741,17 @@ "node": ">=20" } }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "node_modules/powershell-utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.1.tgz", + "integrity": "sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" - } - }, - "node_modules/prebuild-install": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" + "node": ">=20" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/process-nextick-args": { @@ -5309,23 +3759,24 @@ "dev": true, "license": "MIT" }, - "node_modules/pump": { - "version": "3.0.0", + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" } }, - "node_modules/punycode.js": { - "version": "2.3.1", + "node_modules/proper-lockfile/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "license": "ISC" }, "node_modules/qs": { "version": "6.16.0", @@ -5344,55 +3795,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/rc": { - "version": "1.2.8", - "dev": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "optional": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc-config-loader": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz", - "integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "js-yaml": "^4.1.0", - "json5": "^2.2.2", - "require-from-string": "^2.0.2" - } - }, "node_modules/read": { "version": "1.0.7", "dev": true, @@ -5404,39 +3806,6 @@ "node": ">=0.8" } }, - "node_modules/read-pkg": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", - "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.3", - "normalize-package-data": "^6.0.0", - "parse-json": "^8.0.0", - "type-fest": "^4.6.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/readable-stream": { "version": "2.3.7", "dev": true, @@ -5465,16 +3834,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", @@ -5492,15 +3851,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, "license": "MIT", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">= 4" } }, "node_modules/run-applescript": { @@ -5516,30 +3874,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/safe-buffer": { "version": "5.1.2", "dev": true, @@ -5557,32 +3891,10 @@ "dev": true, "license": "ISC" }, - "node_modules/secretlint": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/secretlint/-/secretlint-10.2.2.tgz", - "integrity": "sha512-xVpkeHV/aoWe4vP4TansF622nBEImzCY73y/0042DuJ29iKIaqgoJ8fGxre3rVSHHbxar4FdJobmTnLp9AU0eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/config-creator": "^10.2.2", - "@secretlint/formatter": "^10.2.2", - "@secretlint/node": "^10.2.2", - "@secretlint/profiler": "^10.2.2", - "debug": "^4.4.1", - "globby": "^14.1.0", - "read-pkg": "^9.0.1" - }, - "bin": { - "secretlint": "bin/secretlint.js" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { @@ -5602,12 +3914,6 @@ "node": ">=20.0.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "optional": true - }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -5703,51 +4009,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simple-concat": { - "version": "1.0.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true - }, - "node_modules/simple-get": { - "version": "4.0.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/simple-invariant": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/simple-invariant/-/simple-invariant-2.0.1.tgz", @@ -5758,77 +4019,10 @@ "node": ">=10" } }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/sql.js": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sql.js/-/sql.js-1.14.2.tgz", - "integrity": "sha512-3ZGPovObMFrdw79zrUHbfdE/DLIsy8jdNdssmMSQuRAymedU6q84asPt0kgiqrdMYlPegDItiIMfmIXzZnYFcw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/sql.js/-/sql.js-1.15.0.tgz", + "integrity": "sha512-54VT5h9/VGlLaQan5pX/Zx8k6Vbykwl5hRUtl4h4+VYnaZCTraUs4P1i2WLz21O6oPVp6Gvg+d1OyPo01ZG5ig==", "license": "MIT" }, "node_modules/stdin-discarder": { @@ -5883,15 +4077,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/structured-source": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/structured-source/-/structured-source-4.0.0.tgz", @@ -5902,203 +4087,69 @@ "boundary": "^2.0.0" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", - "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "node_modules/textextensions": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-6.11.0.tgz", + "integrity": "sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==", "dev": true, - "license": "MIT", + "license": "Artistic-2.0", "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "editions": "^6.21.0" }, "engines": { - "node": ">=14.18" + "node": ">=4" }, "funding": { - "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" - } - }, - "node_modules/table": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", - "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/table/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "url": "https://bevry.me/fund" } }, - "node_modules/tar-stream": { - "version": "2.2.0", + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" }, "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "node": ">=12.0.0" }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/terminal-link": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-4.0.0.tgz", - "integrity": "sha512-lk+vH+MccxNqgVqSnkMVKx4VLJfnLjDBGzH16JVZjKE2DoxP57s6/vt6JmXV5I3jBcfGrxNrYtC+mPtU7WJztA==", + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-escapes": "^7.0.0", - "supports-hyperlinks": "^3.2.0" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/textextensions": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-6.11.0.tgz", - "integrity": "sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==", - "dev": true, - "license": "Artistic-2.0", - "dependencies": { - "editions": "^6.21.0" + "node": ">=12.0.0" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "picomatch": "^3 || ^4" }, - "funding": { - "url": "https://bevry.me/fund" + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/tmp": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", - "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", + "peer": true, "engines": { - "node": ">=14.14" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" + "node": ">=12" }, - "engines": { - "node": ">=8.0" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/ts-node": { @@ -6147,12 +4198,13 @@ }, "node_modules/tslib": { "version": "2.6.2", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tsx": { - "version": "4.23.13", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.13.tgz", - "integrity": "sha512-BL5MGkRln6aDYhb0xbQlEAGw743BaZYWdbWtdJOBriYJboKgUUYCadFp2/FpBBZquBC/ezNBn7wMMPx7FDZUDw==", + "version": "4.23.15", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.15.tgz", + "integrity": "sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==", "dev": true, "license": "MIT", "dependencies": { @@ -6176,31 +4228,6 @@ "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/typed-rest-client": { "version": "1.8.11", "dev": true, @@ -6217,6 +4244,7 @@ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6225,13 +4253,6 @@ "node": ">=14.17" } }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true, - "license": "MIT" - }, "node_modules/underscore": { "version": "1.13.8", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", @@ -6246,29 +4267,6 @@ "dev": true, "license": "MIT" }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/url-join": { "version": "4.0.1", "dev": true, @@ -6286,17 +4284,6 @@ "dev": true, "license": "MIT" }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/version-range": { "version": "4.15.0", "resolved": "https://registry.npmjs.org/version-range/-/version-range-4.15.0.tgz", @@ -6310,62 +4297,6 @@ "url": "https://bevry.me/fund" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wide-align/node_modules/string-width/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wide-align/node_modules/string-width/node_modules/strip-ansi": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wide-align/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/workerpool": { "version": "10.0.3", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-10.0.3.tgz", @@ -6433,23 +4364,18 @@ "node": ">=8" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC", - "optional": true - }, "node_modules/wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-1.0.1.tgz", + "integrity": "sha512-c16PKLIRxBYpR3jSWsdS7SFp0COm5SOQdiFjY818dYFHJbMGuLBszpF07LBWmOS1uzrHa9VGdynsEgoeKy0oOQ==", "dev": true, "license": "MIT", "dependencies": { - "is-wsl": "^3.1.0" + "is-wsl": "^3.1.0", + "powershell-utils": "^0.2.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6481,13 +4407,12 @@ "license": "ISC" }, "node_modules/yauzl": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.3.0.tgz", - "integrity": "sha512-PtGEvEP30p7sbIBJKUBjUnqgTVOyMURc4dLo9iNyAJnNIEz9pm88cCXF21w94Kg3k6RXkeZh5DHOGS0qEONvNQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.4.0.tgz", + "integrity": "sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==", "dev": true, "license": "MIT", "dependencies": { - "buffer-crc32": "~0.2.3", "pend": "~1.2.0" }, "engines": { @@ -6527,19 +4452,6 @@ "node": ">=6" } }, - "node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/yoctocolors-cjs": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", diff --git a/package.json b/package.json index 2a40f347..f9a3bab4 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "name": "sqlite-explorer", "displayName": "SQLite Explorer", "description": "A powerful SQLite database viewer and editor for VS Code", - "version": "1.8.1", + "version": "1.8.2", "publisher": "zknpr", "license": "MIT", "repository": { @@ -285,24 +285,24 @@ "test:native-smoke": "node --import tsx --test tests/unit/native_real_smoke.test.ts" }, "devDependencies": { - "@types/node": "^26.5.1", + "@types/node": "^26.6.5", "@types/vscode": "=1.110.0", "@vscode/test-electron": "^3.1.0", - "@vscode/vsce": "^3.9.2", + "@vscode/vsce": "^4.0.0", "esbuild": "^0.28.2", "esbuild-plugin-polyfill-node": "^0.3.0", - "mocha": "^12.0.1", - "ovsx": "1.2.0", - "playwright-core": "1.63.0", + "mocha": "^12.0.3", + "ovsx": "1.3.0", + "playwright-core": "1.64.1", "ts-node": "^10.9.2", - "tsx": "^4.23.13", + "tsx": "^4.23.15", "typescript": "^6.0.3" }, "dependencies": { "@scure/base": "^2.4.0", "@vscode/codicons": "^0.0.45", "@vscode/extension-telemetry": "^1.5.2", - "sql.js": "^1.14.2" + "sql.js": "^1.15.0" }, "overrides": { "qs": "^6.16.0", diff --git a/scripts/build-query-plan.mjs b/scripts/build-query-plan.mjs index 1cf86b35..cd81a42c 100644 --- a/scripts/build-query-plan.mjs +++ b/scripts/build-query-plan.mjs @@ -7,7 +7,7 @@ import { fileURLToPath } from 'node:url'; import { createPinnedArtifactPolicy } from './lib/pinned-artifacts.mjs'; const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); -const sourceCommit = '424163d6c9c34acec7bac07eb2cecedd86185a60'; +const sourceCommit = '3181cc5ee888d3251228d3995c32bf9ea03c3240'; const manifestPath = 'vendor/query-plan-manifest.json'; const sourceFiles = ['src/runtime/query-plan.c', 'scripts/build-query-plan.mjs']; const nativeTargets = [ @@ -23,6 +23,11 @@ const wasmCopies = { }; const outputFiles = [...Object.values(wasmCopies).flat(), ...nativeTargets.map(([triple, , extension]) => `natives/${triple}/query-plan.${extension}`)]; const hash = contents => createHash('sha256').update(contents).digest('hex'); +// Exact identities, not substrings: a different Emscripten commit or a Zig +// distribution with another bundled LLVM produces different bytes. +const expectedEmcc = 'emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 5.0.0 (a7c5deabd7c88ba1c38ebe988112256775f944c6)'; +const expectedZigVersion = '0.16.0'; +const expectedZigClang = 'clang version 21.1.0'; export function verifyQueryPlanArtifacts(directory = root, { includeBuildAssets = true } = {}) { const manifest = JSON.parse(readFileSync(path.join(directory, manifestPath), 'utf8')); @@ -62,13 +67,30 @@ export async function buildQueryPlanRuntime(args = process.argv.slice(2)) { if (!key || !args[index + 1]) throw new Error('Usage: node scripts/build-query-plan.mjs [--check] [--emcc PATH] [--zig PATH] [--sqljs-source GIT_CHECKOUT]'); options[key] = args[index + 1]; } - const emccVersion = String(run(options.emcc, ['--version'], { stdio: 'pipe' })).split('\n')[0]; + // Resolve once so every child process runs the same tool whatever its cwd. + // Either separator marks a path on Windows; a bare name stays a PATH lookup. + for (const tool of ['emcc', 'zig']) if (/[\\/]/.test(options[tool])) options[tool] = path.resolve(options[tool]); + const emccVersion = String(run(options.emcc, ['--version'], { stdio: 'pipe' })).split('\n')[0].trim(); + if (emccVersion !== expectedEmcc) { + throw new Error(`Reproducible runtime builds require Emscripten 5.0.0 ("${expectedEmcc}"); found "${emccVersion}".`); + } const zigVersion = String(run(options.zig, ['version'], { stdio: 'pipe' })).trim(); - if (!emccVersion.includes('5.0.0') || zigVersion !== '0.16.0') throw new Error('Reproducible runtime builds require Emscripten 5.0.0 and Zig 0.16.0.'); + if (zigVersion !== expectedZigVersion) { + throw new Error(`Reproducible runtime builds require the official Zig ${expectedZigVersion} release; found "${zigVersion}".`); + } const inputs = Object.fromEntries(sourceFiles.map(file => [file, hash(readFileSync(path.join(root, file)))])); mkdirSync(path.join(root, '.tmp'), { recursive: true }); const build = mkdtempSync(path.join(root, '.tmp/query-plan-build-')); try { + // Linux outputs record the linker identity in .comment, so only the official + // Zig 0.16.0 release (bundled LLVM 21.1.0) reproduces the pinned bytes. + // Distribution builds such as Homebrew's report the same `zig version`. + // `zig cc --version` also writes an empty a.o, so it runs in the build dir. + const zigClang = String(run(options.zig, ['cc', '--version'], { stdio: 'pipe', cwd: build })).split('\n')[0].trim(); + if (zigClang !== expectedZigClang) { + throw new Error(`Reproducible runtime builds require the official Zig ${expectedZigVersion} release ` + + `(zig cc must report "${expectedZigClang}"); found "${zigClang}".`); + } let checkout = options.source && path.resolve(options.source); if (!checkout) { checkout = path.join(build, 'upstream'); @@ -79,9 +101,9 @@ export async function buildQueryPlanRuntime(args = process.argv.slice(2)) { run('tar', ['-xf', '-', '-C', source], { input: archive, stdio: ['pipe', 'inherit', 'inherit'] }); const sqliteSource = path.join(source, 'sqlite-src'); mkdirSync(sqliteSource, { recursive: true }); const zip = path.join(build, 'sqlite.zip'); - await download('https://sqlite.org/2025/sqlite-amalgamation-3490100.zip', zip, 'sha3-256', 'e7eb4cfb2d95626e782cfa748f534c74482f2c3c93f13ee828b9187ce05b2da7'); + await download('https://sqlite.org/2026/sqlite-amalgamation-3540100.zip', zip, 'sha3-256', '92281c86e2957f9b9305890f9ac04204caa7b677cc868dc326d942689df28e30'); run('unzip', ['-q', zip, '-d', sqliteSource]); - const headers = path.join(sqliteSource, 'sqlite-amalgamation-3490100'); + const headers = path.join(sqliteSource, 'sqlite-amalgamation-3540100'); await download('https://www.sqlite.org/contrib/download/extension-functions.c?get=25', path.join(headers, 'extension-functions.c'), 'sha1', 'c68fa706d6d9ff98608044c00212473f9c14892f'); const helper = path.join(root, sourceFiles[0]); const outputs = new Map(); @@ -96,13 +118,16 @@ export async function buildQueryPlanRuntime(args = process.argv.slice(2)) { } const out = path.join(source, 'out'), dist = path.join(source, 'dist'); mkdirSync(out, { recursive: true }); mkdirSync(dist, { recursive: true }); - const compileFlags = ['-Oz', '-DSQLITE_OMIT_LOAD_EXTENSION', '-DSQLITE_DISABLE_LFS', '-DSQLITE_ENABLE_FTS3', '-DSQLITE_ENABLE_FTS3_PARENTHESIS', + // extension-functions.c asserts embed __FILE__; map the random build + // directory (and the checkout) to fixed names so outputs reproduce. + const prefixMaps = [`-ffile-prefix-map=${build}=/query-plan-build`, `-ffile-prefix-map=${root}=/sqlite-explorer`]; + const compileFlags = ['-Oz', ...prefixMaps, '-DSQLITE_OMIT_LOAD_EXTENSION', '-DSQLITE_DISABLE_LFS', '-DSQLITE_ENABLE_FTS3', '-DSQLITE_ENABLE_FTS3_PARENTHESIS', '-DSQLITE_ENABLE_FTS5', '-DSQLITE_THREADSAFE=0', '-DSQLITE_ENABLE_NORMALIZE', '-DSQLITE_LIKE_DOESNT_MATCH_BLOBS']; for (const [input, name, flags] of [ [path.join(headers, 'sqlite3.c'), 'sqlite3', compileFlags], [path.join(headers, 'extension-functions.c'), 'extension-functions', compileFlags], [path.join(source, 'src/vfs.c'), 'vfs', compileFlags], - [helper, 'query-plan', ['-Oz', '-DSQLITE_CORE']] + [helper, 'query-plan', ['-Oz', ...prefixMaps, '-DSQLITE_CORE']] ]) run(options.emcc, [...flags, '-I', headers, '-c', input, '-o', path.join(out, `${name}.o`)]); const exportsPath = path.join(source, 'src/exported_functions.json'); const exported = JSON.parse(readFileSync(exportsPath, 'utf8')); @@ -110,20 +135,20 @@ export async function buildQueryPlanRuntime(args = process.argv.slice(2)) { writeFileSync(exportsPath, JSON.stringify(exported)); // The Makefile's object prerequisites download tools that are unnecessary // here: all three upstream sources were verified and compiled above. - run('make', ['dist/sql-wasm.js', `EMCC=${options.emcc.includes(path.sep) ? path.resolve(options.emcc) : options.emcc}`, 'BITCODE_FILES=out/sqlite3.o out/extension-functions.o out/vfs.o out/query-plan.o', + run('make', ['dist/sql-wasm.js', `EMCC=${options.emcc}`, 'BITCODE_FILES=out/sqlite3.o out/extension-functions.o out/vfs.o out/query-plan.o', '-o', 'out/sqlite3.o', '-o', 'out/extension-functions.o', '-o', 'out/vfs.o'], { cwd: source }); for (const [file, copies] of Object.entries(wasmCopies)) { const contents = readFileSync(path.join(dist, file)); for (const copy of copies) outputs.set(copy, contents); } for (const file of sourceFiles) if (hash(readFileSync(path.join(root, file))) !== inputs[file]) throw new Error(`Source changed during runtime build: ${file}`); - const manifest = { schema: 1, sqlJsCommit: sourceCommit, emcc: emccVersion, zig: zigVersion, inputs, + const manifest = { schema: 1, sqlJsCommit: sourceCommit, emcc: emccVersion, zig: zigVersion, zigClang, inputs, outputs: Object.fromEntries([...outputs].map(([file, contents]) => [file, hash(contents)])) }; outputs.set(manifestPath, Buffer.from(JSON.stringify(manifest, null, 2) + '\n')); - // Reuse the existing rollback-protected installer. Provenance above refers - // to this source build; the pinned run identifies only its upstream base. + // Reuse only the rollback-protected installer. The manifest above is this + // source build's provenance; a local build has no Actions run to pin. const { installArtifacts } = createPinnedArtifactPolicy({ scriptName: 'build-query-plan.mjs', repository: 'zknpr/sql.js', - sourceBranch: 'agent/paged-vfs-attach-isolation', sourceCommit, pinnedRunId: '31639875548', expectedArtifactPaths: {} }); + sourceBranch: 'master', sourceCommit, pinnedRunId: null, expectedArtifactPaths: {} }); installArtifacts([...outputs].map(([file, contents]) => ({ destination: path.join(root, file), contents, expectedHash: hash(contents) }))); verifyQueryPlanArtifacts(); console.log('Built and verified WASM query-plan support and five native libraries.'); diff --git a/scripts/refresh-natives.mjs b/scripts/refresh-natives.mjs index 9d1415aa..5e21acd6 100644 --- a/scripts/refresh-natives.mjs +++ b/scripts/refresh-natives.mjs @@ -7,8 +7,8 @@ * An already-downloaded artifact can be verified without network access only * when its complete pinned provenance is supplied explicitly: * node scripts/refresh-natives.mjs --from /path/to/run-artifacts \ - * --run 34697570391 --branch master \ - * --commit 62b02dc97461662abc5a34cc1b97ddd49e43c808 + * --run 39983760340 --branch master \ + * --commit 0353db5719c80ee69e0f400f4dfcd2256a034ee0 */ import { execFileSync } from 'node:child_process'; @@ -20,14 +20,14 @@ import { createPinnedArtifactPolicy } from './lib/pinned-artifacts.mjs'; const REPOSITORY = 'zknpr/txiki.js'; const SOURCE_BRANCH = 'master'; -const SOURCE_COMMIT = '62b02dc97461662abc5a34cc1b97ddd49e43c808'; -const PINNED_RUN_ID = '34697570391'; +const SOURCE_COMMIT = '0353db5719c80ee69e0f400f4dfcd2256a034ee0'; +const PINNED_RUN_ID = '39983760340'; const PINNED_SHA256 = Object.freeze({ - 'aarch64-linux-gnu/tjs': '94cdc849413a62ad2f0521fb75bcbe166f423539af2a81ed56c26a900b26037e', - 'aarch64-macos/tjs': '2927d5dfe7d240310d53d1ad583497ac9fc5f17c84354d43ee020d42e8ba6dfa', - 'x86_64-linux-gnu/tjs': 'e82dac892d2370f71f118f83ea468a6befc13c74acd6b6ed4d23c3988ee77227', - 'x86_64-macos/tjs': '226fe2164262c97350dd3beb0b365d82e931334138afb60441a5cd6244dba4b8', - 'x86_64-windows/tjs.exe': '71adba65a4e14773cf4273e2acb6d08fd45e6790e7afafc6bd1c1c50e69c067f' + 'aarch64-linux-gnu/tjs': '6ec923d4ade3dc0d0e3d00224db52f4e39c9bfbce771a9b61b8843a90954ab96', + 'aarch64-macos/tjs': '155a7abdfbbbad0b2610b6ca6e6a6d10aa83bd610d4be0f6a15d352bf3f6969a', + 'x86_64-linux-gnu/tjs': 'ec13344d64c8506c1821d4006999e4d089b05fe2499cd13f103e700d9a06b395', + 'x86_64-macos/tjs': '6b9537e33cb5180501e5ef9e735b8126a72998e5fb4a17519722c2ec72457978', + 'x86_64-windows/tjs.exe': '83b757b6f9698c669b26aead2bf795d0e2800d1cb9da85513881dc21630d2a4b' }); const scriptDirectory = path.dirname(fileURLToPath(import.meta.url)); diff --git a/scripts/refresh-sqljs.mjs b/scripts/refresh-sqljs.mjs index fbce2ba3..0e5cc033 100644 --- a/scripts/refresh-sqljs.mjs +++ b/scripts/refresh-sqljs.mjs @@ -3,7 +3,8 @@ * upstream source and the shared C helper together; the old upstream-only * workflow artifacts do not contain the reader and must not replace this build. * - * Requires Emscripten 5.0.0 and Zig 0.16.0. Accepts the same options as: + * Requires Emscripten 5.0.0 and the official Zig 0.16.0 release (`zig cc --version` + * must report "clang version 21.1.0"). Accepts the same options as: * node scripts/build-query-plan.mjs --sqljs-source /path/to/sql.js-checkout */ import { buildQueryPlanRuntime } from './build-query-plan.mjs'; diff --git a/tests/unit/artifact_refresh_policy.test.ts b/tests/unit/artifact_refresh_policy.test.ts index 863692a0..87d27a07 100644 --- a/tests/unit/artifact_refresh_policy.test.ts +++ b/tests/unit/artifact_refresh_policy.test.ts @@ -28,8 +28,8 @@ const sourceRepositoryRoot = path.resolve( ); const TXIKI_BRANCH = 'master'; -const TXIKI_COMMIT = '62b02dc97461662abc5a34cc1b97ddd49e43c808'; -const TXIKI_RUN = '34697570391'; +const TXIKI_COMMIT = '0353db5719c80ee69e0f400f4dfcd2256a034ee0'; +const TXIKI_RUN = '39983760340'; interface ScriptSpec { name: string; diff --git a/tests/unit/nativeWorker.test.ts b/tests/unit/nativeWorker.test.ts index 4c295627..b519ca64 100644 --- a/tests/unit/nativeWorker.test.ts +++ b/tests/unit/nativeWorker.test.ts @@ -4178,11 +4178,18 @@ describe('native async VACUUM routing', () => { const runVacuumInto = loadNativeWorkerFunction( 'runVacuumInto', ['asyncDatabase', 'database', 'snapshotPath', 'signal'], - { isExplicitlyOutsideTransaction } + { isExplicitlyOutsideTransaction, releaseAsyncDatabase: () => {} } ); const calls: unknown[][] = []; + let failNextRun = false; const asyncDatabase = { - async run(...args: unknown[]) { calls.push(args); } + // The runtime refuses VACUUM INTO's internal ATTACH unless the + // destination is the connection's one permitted path. + permitAttach(path: string | null) { calls.push(['permitAttach', path]); }, + async run(...args: unknown[]) { + calls.push(['run', ...args]); + if (failNextRun) throw new Error('disk full'); + } }; const signal = new AbortController().signal; @@ -4192,17 +4199,278 @@ describe('native async VACUUM routing', () => { "/private/quote'snapshot.sqlite", signal ); - assert.deepStrictEqual(calls, [[ - 'VACUUM main INTO ?', - ["/private/quote'snapshot.sqlite"], - { signal } - ]]); + assert.deepStrictEqual(calls, [ + ['permitAttach', "/private/quote'snapshot.sqlite"], + ['run', 'VACUUM main INTO ?', ["/private/quote'snapshot.sqlite"], { signal }], + ['permitAttach', null] + ]); + + // A failed VACUUM still withdraws the permit. + calls.length = 0; + failNextRun = true; + await assert.rejects( + runVacuumInto(asyncDatabase, { inTransaction: false }, '/private/failed.sqlite', signal), + /disk full/ + ); + assert.deepStrictEqual(calls.map(call => call[0] === 'run' ? 'run' : call), [ + ['permitAttach', '/private/failed.sqlite'], + 'run', + ['permitAttach', null] + ]); + calls.length = 0; await assert.rejects( runVacuumInto(asyncDatabase, { inTransaction: true }, '/private/blocked.sqlite', signal), /active transaction/i ); - assert.strictEqual(calls.length, 1); + assert.deepStrictEqual(calls, [], 'a refused snapshot never grants a permit'); + }); + + it('takes the snapshot connection out of service when the ATTACH permit cannot be withdrawn', async () => { + const isExplicitlyOutsideTransaction = loadNativeWorkerFunction( + 'isExplicitlyOutsideTransaction', + ['database'] + ); + const released: unknown[] = []; + const runVacuumInto = loadNativeWorkerFunction( + 'runVacuumInto', + ['asyncDatabase', 'database', 'snapshotPath', 'signal'], + { isExplicitlyOutsideTransaction, releaseAsyncDatabase: (connection: unknown) => { released.push(connection); } } + ); + const asyncDatabase = { + permitAttach(path: string | null) { + if (path === null) throw new Error('permit store failed'); + }, + async run() {} + }; + await assert.rejects( + runVacuumInto(asyncDatabase, { inTransaction: false }, '/private/a.sqlite', new AbortController().signal), + /permit store failed/ + ); + // No reachable handle may keep authorizing ATTACH of the snapshot path, + // and later reads must not be routed to a closed one. + assert.deepStrictEqual(released, [asyncDatabase]); + }); + + it('withdraws the ATTACH permit when run throws synchronously', async () => { + const isExplicitlyOutsideTransaction = loadNativeWorkerFunction( + 'isExplicitlyOutsideTransaction', + ['database'] + ); + const runVacuumInto = loadNativeWorkerFunction( + 'runVacuumInto', + ['asyncDatabase', 'database', 'snapshotPath', 'signal'], + { isExplicitlyOutsideTransaction, releaseAsyncDatabase: () => {} } + ); + const permits: Array = []; + const asyncDatabase = { + permitAttach(path: string | null) { permits.push(path); }, + run() { throw new TypeError('bad arguments'); } + }; + await assert.rejects( + () => runVacuumInto(asyncDatabase, { inTransaction: false }, '/private/a.sqlite', new AbortController().signal), + /bad arguments/ + ); + assert.deepStrictEqual(permits, ['/private/a.sqlite', null]); + }); + + it('releases the shared async connection so later work falls back to the primary', async () => { + const isExplicitlyOutsideTransaction = loadNativeWorkerFunction( + 'isExplicitlyOutsideTransaction', + ['database'] + ); + const shouldUseAsyncDatabase = loadNativeWorkerFunction( + 'shouldUseAsyncDatabase', + ['database', 'asyncDatabase'], + { isExplicitlyOutsideTransaction } + ); + const describeNativeError = loadNativeWorkerFunction( + 'describeNativeError', + ['error', 'fallback'], + { MAX_NATIVE_ERROR_MESSAGE_LENGTH: 8192 } + ); + // The real releaseAsyncDatabase and closeAsyncDatabase over one shared + // `asyncDb` binding and spool set, as in the worker. + const source = ['function releaseAsyncDatabase(connection)', 'function closeAsyncDatabase()'] + .map(signature => { + const escaped = signature.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + const match = nativeWorkerSource.match(new RegExp(`${escaped} \\{[\\s\\S]*?^\\}`, 'm'))?.[0]; + assert.ok(match, `native worker signature changed; expected ${signature}`); + return match; + }) + .join('\n'); + const errors: string[] = []; + const workerState = (initial: unknown) => Function( + 'initial', 'describeNativeError', 'console', + `"use strict"; + let asyncDb = initial; + const exportSpools = new Set(['spool_1']); + ${source} + return { releaseAsyncDatabase, state: () => ({ asyncDb, spools: exportSpools.size }) };` + )(initial, describeNativeError, { error: (...args: unknown[]) => errors.push(args.join(' ')) }); + + let closed = 0; + const shared = { async close() { closed++; } }; + const worker = workerState(shared); + worker.releaseAsyncDatabase(shared); + // Synchronously, before the close settles: no later request can pick the + // stuck handle, and its TEMP spools are forgotten with it. + assert.deepStrictEqual(worker.state(), { asyncDb: null, spools: 0 }); + assert.strictEqual(shouldUseAsyncDatabase({ inTransaction: false }, worker.state().asyncDb), false); + await new Promise(resolve => setImmediate(resolve)); + assert.strictEqual(closed, 1); + + // A connection other than the shared one is closed without touching it. + const other = workerState(shared); + const stray = { async close() { closed++; } }; + other.releaseAsyncDatabase(stray); + await new Promise(resolve => setImmediate(resolve)); + assert.strictEqual(closed, 2); + assert.deepStrictEqual(other.state(), { asyncDb: shared, spools: 1 }); + + // A synchronous close, returning nothing or throwing, is handled the same way. + other.releaseAsyncDatabase({ close() { closed++; } }); + other.releaseAsyncDatabase({ close() { throw new Error('sync close failed'); } }); + await new Promise(resolve => setImmediate(resolve)); + assert.strictEqual(closed, 3); + + // A failed close is reported, not swallowed or left unhandled. + const failing = { async close() { throw new Error('close failed'); } }; + workerState(failing).releaseAsyncDatabase(failing); + await new Promise(resolve => setImmediate(resolve)); + assert.deepStrictEqual(errors, [ + '[native-worker] closing the snapshot connection failed: sync close failed', + '[native-worker] closing the snapshot connection failed: close failed' + ]); + }); + + it('keeps every failure when reporting a runtime ATTACH refusal', () => { + const forEachWrappedError: (error: unknown, visit: (error: { errno?: number }) => void) => void = + loadNativeWorkerFunction('forEachWrappedError', ['error', 'visit', 'depth = 0', 'seen = new Set()']); + const isPathAuthorityRefusal = loadNativeWorkerFunction( + 'isPathAuthorityRefusal', + ['error'], + { SQLITE_AUTH: 23, forEachWrappedError } + ); + const describeWorkerError = loadNativeWorkerFunction( + 'describeWorkerError', + ['error'], + { isPathAuthorityRefusal, forEachWrappedError, SQLITE_AUTH: 23, NATIVE_SQL_ATTACH_BLOCKED: 'ERR_NATIVE_SQL_ATTACH_BLOCKED' } + ); + const refusal = () => Object.assign(new Error('authorization denied'), { errno: 23 }); + + const withdrawal = describeWorkerError( + new AggregateError([refusal(), new Error('permit store failed')], 'combined') + ); + assert.match(withdrawal, /ERR_NATIVE_SQL_ATTACH_BLOCKED/); + assert.match(withdrawal, /permit store failed/, 'a second failure must not be dropped'); + + // runWithQueryDeadline wraps executeStatement's failure in another AggregateError. + const nested = describeWorkerError(new AggregateError([ + new AggregateError([refusal()], 'inner'), + new Error('clearing the query deadline failed') + ], 'outer')); + assert.match(nested, /ERR_NATIVE_SQL_ATTACH_BLOCKED/); + assert.match(nested, /clearing the query deadline failed/); + + const viaCause = describeWorkerError(new Error('Operation cancelled', { cause: refusal() })); + assert.match(viaCause, /ERR_NATIVE_SQL_ATTACH_BLOCKED/); + assert.match(viaCause, /Operation cancelled/); + + assert.strictEqual(describeWorkerError(new Error('disk I/O error')), 'disk I/O error'); + + // The joined text keeps the IPC bound every other native error has. + const long = (label: string) => new Error(`${label}: ${'x'.repeat(8000)}`); + const bounded = describeWorkerError(new AggregateError( + [refusal(), long('withdrawal'), long('deadline'), new Error('cancelled', { cause: long('cause') })], + 'combined' + )); + assert.match(bounded, /ERR_NATIVE_SQL_ATTACH_BLOCKED/); + assert.match(bounded, /\[truncated from \d+ characters\]$/); + assert.ok(bounded.length < 8300, `refusal text is ${bounded.length} characters`); + }); + + it('keeps a runtime ATTACH refusal coded when the batch savepoint cleanup also fails', () => { + const forEachWrappedError = loadNativeWorkerFunction('forEachWrappedError', ['error', 'visit', 'depth = 0', 'seen = new Set()']); + const isPathAuthorityRefusal = loadNativeWorkerFunction( + 'isPathAuthorityRefusal', + ['error'], + { SQLITE_AUTH: 23, forEachWrappedError } + ); + const describeWorkerError = loadNativeWorkerFunction( + 'describeWorkerError', + ['error'], + { isPathAuthorityRefusal, forEachWrappedError, SQLITE_AUTH: 23, NATIVE_SQL_ATTACH_BLOCKED: 'ERR_NATIVE_SQL_ATTACH_BLOCKED' } + ); + const batchCleanupError = loadNativeWorkerFunction('batchCleanupError', ['error', 'cleanupError']); + const refusal = Object.assign(new Error('authorization denied'), { errno: 23 }); + + const coded = describeWorkerError(batchCleanupError(refusal, new Error('cannot rollback - no transaction is active'))); + assert.match(coded, /ERR_NATIVE_SQL_ATTACH_BLOCKED/); + assert.match(coded, /cannot rollback - no transaction is active/); + + // Other batch failures keep the text they had. + assert.strictEqual( + describeWorkerError(batchCleanupError(new Error('UNIQUE constraint failed'), new Error('disk I/O error'))), + 'Batch failed (Error: UNIQUE constraint failed); savepoint cleanup failed (Error: disk I/O error)' + ); + }); + + it('reports a failing statement once when finalize repeats its error code', () => { + const executeStatement = loadNativeWorkerFunction('executeStatement', ['db', 'sql', 'params']); + const sqliteError = (errno: number, message: string) => Object.assign(new Error(message), { errno }); + const database = (finalizeErrno: number) => ({ + prepare() { + return { + run() { throw sqliteError(19, 'constraint failed'); }, + finalize() { throw sqliteError(finalizeErrno, finalizeErrno === 19 ? 'constraint failed' : 'disk I/O error'); } + }; + } + }); + assert.throws( + () => executeStatement(database(19), 'INSERT INTO t VALUES (NULL)', []), + (error: Error) => error.message === 'constraint failed' && !(error instanceof AggregateError) + ); + // A different finalize failure is still reported alongside. + assert.throws( + () => executeStatement(database(10), 'INSERT INTO t VALUES (NULL)', []), + (error: Error) => error instanceof AggregateError && /constraint failed/.test(error.message) && /disk I\/O error/.test(error.message) + ); + }); + + it('surfaces a failed ATTACH permit withdrawal unless the connection is closing', async () => { + const isExplicitlyOutsideTransaction = loadNativeWorkerFunction( + 'isExplicitlyOutsideTransaction', + ['database'] + ); + const runVacuumInto = loadNativeWorkerFunction( + 'runVacuumInto', + ['asyncDatabase', 'database', 'snapshotPath', 'signal'], + { isExplicitlyOutsideTransaction, releaseAsyncDatabase: () => {} } + ); + const signal = new AbortController().signal; + const connection = (withdrawError: Error | undefined, runError?: Error) => ({ + permitAttach(path: string | null) { + if (path === null && withdrawError) throw withdrawError; + }, + async run() { + if (runError) throw runError; + }, + async close() {} + }); + + // A permit left open with nothing reported is the silent failure. + await assert.rejects( + runVacuumInto(connection(new Error('permit store failed')), { inTransaction: false }, '/private/a.sqlite', signal), + /permit store failed/ + ); + // Both failures are reported when the VACUUM itself also failed. + await assert.rejects( + runVacuumInto(connection(new Error('permit store failed'), new Error('disk full')), { inTransaction: false }, '/private/b.sqlite', signal), + (error: Error) => /disk full/.test(error.message) && /permit store failed/.test(error.message) + ); + // A closing connection takes its permit with it. + await runVacuumInto(connection(new Error('Invalid DB')), { inTransaction: false }, '/private/c.sqlite', signal); }); it('reports a deadline that lands before an async completion is observed', async () => { diff --git a/tests/unit/native_attach_guard.test.ts b/tests/unit/native_attach_guard.test.ts new file mode 100644 index 00000000..bf4005d6 --- /dev/null +++ b/tests/unit/native_attach_guard.test.ts @@ -0,0 +1,457 @@ +import './vscode_mock_setup'; // Must be first + +import assert from 'node:assert/strict'; +import { execFileSync } from 'node:child_process'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; +import { DatabaseSync } from 'node:sqlite'; +import { it, type TestContext } from 'node:test'; + +import { NativeWorkerProcess } from '../../src/nativeWorker'; + +/** + * SQL-level ATTACH on the native engine's real-filesystem connection opens or + * creates any path SQLite can reach, so the worker refuses ATTACH/DETACH on + * every connection it opens. These tests drive the bundled txiki runtime + * through the raw host->worker RPC channel: that channel, not a host helper, + * is the boundary the guard has to hold. + */ + +const BLOCKED = /ERR_NATIVE_SQL_ATTACH_BLOCKED/; +/** A SQL string literal: fixture paths may contain apostrophes. */ +const sqlLiteral = (value: string) => `'${value.replaceAll("'", "''")}'`; +const NOT_TEXT = /Native SQLite requires SQL text as a string/; +const SECRET = 'TOP-SECRET-OUTSIDE-BOUND-PATH'; +const BOUNDARY = '/*sqlite_explorer_boundary_attach_guard*/'; + +interface QueryResult { + columns: string[]; + values: unknown[][]; + resultSets?: QueryResult[]; +} + +function bundledRuntime(): { binary: string; library: string } | undefined { + const target = process.platform === 'darwin' + ? (process.arch === 'arm64' ? 'aarch64-macos' : 'x86_64-macos') + : process.platform === 'linux' + ? (process.arch === 'arm64' ? 'aarch64-linux-gnu' : 'x86_64-linux-gnu') + : process.platform === 'win32' && process.arch === 'x64' ? 'x86_64-windows' : undefined; + if (!target) return undefined; + const directory = path.join(process.cwd(), 'natives', target); + const binary = path.join(directory, process.platform === 'win32' ? 'tjs.exe' : 'tjs'); + const suffix = process.platform === 'darwin' ? 'dylib' : process.platform === 'win32' ? 'dll' : 'so'; + return fs.existsSync(binary) + ? { binary, library: path.join(directory, `query-plan.${suffix}`) } + : undefined; +} + +function render(value: unknown): string { + try { + return JSON.stringify(value, (_key, item) => typeof item === 'bigint' ? `${item}n` : item); + } catch { + return String(value); + } +} + +async function startFixture(t: TestContext) { + const runtime = bundledRuntime(); + if (!runtime) { + t.skip(`no bundled native runtime for ${process.platform}-${process.arch}`); + return undefined; + } + const root = process.cwd(); + fs.mkdirSync(path.join(root, '.tmp'), { recursive: true }); + const directory = fs.mkdtempSync(path.join(root, '.tmp', 'native-attach-guard-')); + let worker: NativeWorkerProcess | undefined; + // Registered before anything can throw, so a failed start leaks nothing. + t.after(() => { + worker?.stop(); + fs.rmSync(directory, { recursive: true, force: true }); + }); + // The bound database and the attacker's targets live in sibling + // directories: nothing under outside/ is reachable through the bound path. + const boundDirectory = path.join(directory, 'bound'); + const outsideDirectory = path.join(directory, 'outside'); + fs.mkdirSync(boundDirectory); + fs.mkdirSync(outsideDirectory); + const bound = path.join(boundDirectory, 'bound.sqlite'); + const secret = path.join(outsideDirectory, 'secret.sqlite'); + for (const [file, sql] of [ + [bound, "CREATE TABLE entries(id INTEGER PRIMARY KEY, value TEXT); INSERT INTO entries VALUES (1, 'kept');"], + [secret, `CREATE TABLE secret(v TEXT); INSERT INTO secret VALUES ('${SECRET}');`] + ] as const) { + const seed = new DatabaseSync(file); + try { seed.exec(sql); } finally { seed.close(); } + } + // SQLite treats an existing zero-byte file as an empty database, so ATTACH + // can turn any empty file the user owns into one. + const emptyFile = path.join(outsideDirectory, 'empty.bin'); + fs.writeFileSync(emptyFile, new Uint8Array(0)); + const outsideSeen = new Set(fs.readdirSync(outsideDirectory)); + let emptyFileSize = 0; + + const started = new NativeWorkerProcess(runtime.binary, path.join(root, 'natives', 'native-worker.js')); + worker = started; + await started.start(); + await started.call('open', [bound, false]); + // Tests switch modes through reopen() so a side-effect reset restores the + // mode the case is running in. + let readOnly = false; + const reopen = async (mode: boolean) => { + readOnly = mode; + await started.call('open', [bound, mode]); + }; + + let counter = 0; + const outsidePath = (label: string) => path.join(outsideDirectory, `${label}-${++counter}.sqlite`); + const query = (sql: string, params?: unknown[]) => started.call('query', [sql, params]); + const attachedSchemas = async () => (await query('PRAGMA database_list')).values + .map(row => String(row[1])) + .filter(name => name !== 'main' && name !== 'temp'); + + /** + * Observable effects of an executed ATTACH since the last call: an extra + * schema on the connection, or a file the bound path does not cover. DETACH + * is refused like ATTACH, so an attached schema is cleared by reopening the + * bound database, which keeps one executed case from masking the next. + */ + const sideEffects = async (): Promise => { + const effects: string[] = []; + const schemas = await attachedSchemas(); + for (const schema of schemas) effects.push(`schema "${schema}" attached`); + if (schemas.length > 0) await started.call('open', [bound, readOnly]); + // Report each file effect once, so a later case is not blamed for it. + for (const entry of fs.readdirSync(outsideDirectory)) { + if (outsideSeen.has(entry)) continue; + outsideSeen.add(entry); + effects.push(`created outside/${entry}`); + } + const size = fs.statSync(emptyFile).size; + if (size !== emptyFileSize) { + effects.push(`wrote ${size} bytes into outside/empty.bin`); + emptyFileSize = size; + } + return effects; + }; + + const control = async () => { + assert.deepEqual((await query('SELECT value FROM entries')).values, [['kept']], + 'a benign read on the same connection must keep working'); + }; + + return { worker: started, reopen, runtime, directory, bound, secret, emptyFile, outsidePath, query, attachedSchemas, sideEffects, control }; +} + +type Fixture = NonNullable>>; + +/** + * Run one attempt and describe what the native worker actually did. Returns + * undefined only for a policy refusal that left no side effect. + */ +async function refusalProblem( + f: Fixture, + label: string, + attempt: () => Promise, + expectedRefusal: RegExp = BLOCKED +): Promise { + let outcome: unknown; + let failure: Error | undefined; + try { + outcome = await attempt(); + } catch (error) { + failure = error as Error; + } + const effects = await f.sideEffects(); + if (failure === undefined) { + return `${label}: EXECUTED by the native worker; result=${render(outcome)}` + + (effects.length > 0 ? `; side effects: ${effects.join(', ')}` : ''); + } + if (!expectedRefusal.test(failure.message)) { + return `${label}: refused for an unrelated reason (${failure.message})` + + (effects.length > 0 ? `; side effects: ${effects.join(', ')}` : ''); + } + if (effects.length > 0) return `${label}: refused but left side effects: ${effects.join(', ')}`; + return undefined; +} + +it('refuses SQL-level ATTACH that reads a database outside the bound path', async t => { + const f = await startFixture(t); if (!f) return; + await f.control(); + + const readSecret = `SELECT 1 AS ok; ATTACH DATABASE ${sqlLiteral(f.secret)} AS leak; SELECT v FROM leak.secret`; + const writable = await refusalProblem(f, 'query: ATTACH as 2nd statement, then read', () => f.query(readSecret)); + + // A read-only open does not help: it blocks writes through the attached + // schema, never the ATTACH itself or a read through it. + await f.reopen(true); + const readOnly = await refusalProblem(f, 'read-only open: ATTACH, then read', () => f.query(readSecret)); + await f.reopen(false); + + assert.deepEqual([writable, readOnly].filter(problem => problem !== undefined), []); + await f.control(); +}); + +it('refuses SQL-level ATTACH that writes files outside the bound path', async t => { + const f = await startFixture(t); if (!f) return; + await f.control(); + + const problems: string[] = []; + const record = (problem: string | undefined) => { if (problem !== undefined) problems.push(problem); }; + + // Write into an existing SQLite database outside the bound directory. + record(await refusalProblem(f, 'exec: ATTACH an existing outside database, CREATE TABLE, INSERT', () => f.worker.call('exec', [ + `ATTACH ${sqlLiteral(f.secret)} AS planted; CREATE TABLE planted.injected(a); INSERT INTO planted.injected VALUES ('written')` + ]))); + const secretCopy = new DatabaseSync(f.secret, { readOnly: true }); + try { + const injected = secretCopy.prepare("SELECT name FROM sqlite_schema WHERE name = 'injected'").all(); + if (injected.length > 0) problems.push('outside/secret.sqlite now contains table "injected"'); + } finally { + secretCopy.close(); + } + + // Turn an existing empty file into a database. + record(await refusalProblem(f, 'exec: ATTACH an existing empty file, CREATE TABLE', () => f.worker.call('exec', [ + `ATTACH ${sqlLiteral(f.emptyFile)} AS planted_empty; CREATE TABLE planted_empty.t(a); INSERT INTO planted_empty.t VALUES ('written')` + ]))); + + // Create a new file. The worker opens without SQLITE_OPEN_CREATE, which + // attached schemas inherit, so SQLite itself refuses this one today; the + // guard must refuse it before SQLite is consulted at all. + const target = f.outsidePath('created'); + record(await refusalProblem(f, 'exec: ATTACH a new path, CREATE TABLE', () => f.worker.call('exec', [ + `ATTACH ${sqlLiteral(target)} AS planted_new; CREATE TABLE planted_new.t(a)` + ]))); + + assert.deepEqual(problems, []); + assert.equal(fs.existsSync(target), false); + await f.control(); +}); + +it('refuses ATTACH and DETACH at every SQL entry point of the native worker', async t => { + const f = await startFixture(t); if (!f) return; + const { worker } = f; + + const cases: Array<[string, (target: string, alias: string) => Promise, RegExp?]> = [ + ['query', (p, a) => f.query(`ATTACH ${sqlLiteral(p)} AS ${a}`)], + ['query: 2nd of three statements', (p, a) => f.query(`SELECT 1; ATTACH ${sqlLiteral(p)} AS ${a}; SELECT 2`)], + ['query: block and line comments first', (p, a) => f.query(`/* leading */ -- line comment\n ATTACH ${sqlLiteral(p)} AS ${a}`)], + ['query: empty statements, mixed case', (p, a) => f.query(`;;\n\t; AtTaCh DATABASE ${sqlLiteral(p)} AS ${a}`)], + // SQLite skips a U+FEFF byte-order mark at any token start (CC_BOM). + ['query: byte-order mark after a comment', (p, a) => f.query(`/**/\uFEFFATTACH ${sqlLiteral(p)} AS ${a}`)], + ['exec: byte-order mark before the 2nd statement', (p, a) => worker.call('exec', [`SELECT 1;\uFEFF\uFEFFATTACH ${sqlLiteral(p)} AS ${a}`])], + ['query: bound filename', (p, a) => f.query(`ATTACH ? AS ${a}`, [p])], + ['queryNumeric', (p, a) => worker.call('queryNumeric', [`ATTACH ${sqlLiteral(p)} AS ${a}`, [], ['x']])], + ['queryBatch: 2nd item', (p, a) => worker.call('queryBatch', [[{ sql: 'SELECT 1' }, { sql: `ATTACH ${sqlLiteral(p)} AS ${a}` }]])], + ['querySingle', (p, a) => worker.call('querySingle', [`ATTACH ${sqlLiteral(p)} AS ${a}\n${BOUNDARY}`, [], BOUNDARY])], + ['run', (p, a) => worker.call('run', [`ATTACH ${sqlLiteral(p)} AS ${a}`])], + ['runSingle', (p, a) => { + const sql = `ATTACH ${sqlLiteral(p)} AS ${a}`; + return worker.call('runSingle', [`${sql}\n${BOUNDARY}`, sql, [], BOUNDARY]); + }], + ['exec: 2nd statement', (p, a) => worker.call('exec', [`SELECT 1; ATTACH ${sqlLiteral(p)} AS ${a}`])], + ['execBatch', (p, a) => worker.call('execBatch', [[{ sql: `ATTACH ${sqlLiteral(p)} AS ${a}` }]])], + ['execBatch: paramsList', (p, a) => worker.call('execBatch', [[{ sql: `ATTACH ? AS ${a}`, paramsList: [[p]] }]])], + ['prepare + stmtRun', async (p, a) => { + const { stmtId } = await worker.call<{ stmtId: number }>('prepare', [`ATTACH ? AS ${a}`]); + return worker.call('stmtRun', [stmtId, [p]]); + }], + ['queryBounded', (p, a) => { + const sql = `ATTACH ${sqlLiteral(p)} AS ${a}`; + return worker.call('queryBounded', [`${sql}\n${BOUNDARY}`, sql, BOUNDARY, ['x'], undefined, 1, 5000]); + }], + ['workspaceQuery: primary allAsync', (p, a) => worker.call('workspaceQuery', [`ATTACH ${sqlLiteral(p)} AS ${a}`, BOUNDARY, [], [], 5000])], + ['workspaceQueryPlan: primary allAsync', (p, a) => worker.call('workspaceQueryPlan', [`ATTACH ${sqlLiteral(p)} AS ${a}`, [], f.runtime.library, 5000])], + // The binding coerces non-string SQL with ToString, so an array whose + // only element is the statement compiles exactly like the string. + ['prepare: SQL as a one-element array', async (p, a) => { + const { stmtId } = await worker.call<{ stmtId: number }>('prepare', [[`ATTACH ${sqlLiteral(p)} AS ${a}`]]); + return worker.call('stmtRun', [stmtId, []]); + }, NOT_TEXT], + ['workspaceQueryPlan: SQL as a one-element array', (p, a) => worker.call('workspaceQueryPlan', [[`ATTACH ${sqlLiteral(p)} AS ${a}`], [], f.runtime.library, 5000]), NOT_TEXT], + // EXPLAIN of an ATTACH lists opcodes and opens nothing; it is refused + // anyway so the guard never depends on that. + ['query: EXPLAIN ATTACH', (p, a) => f.query(`EXPLAIN ATTACH ${sqlLiteral(p)} AS ${a}`)], + ['query: EXPLAIN QUERY PLAN ATTACH', (p, a) => f.query(`EXPLAIN /* c */ QUERY\nPLAN ATTACH ${sqlLiteral(p)} AS ${a}`)], + ]; + + // Every case targets the existing outside database: an executed ATTACH + // then shows up as an attached schema rather than as an open failure. + const problems: string[] = []; + let index = 0; + for (const [label, attempt, expectedRefusal] of cases) { + const alias = `guard_${++index}`; + const problem = await refusalProblem(f, label, () => attempt(f.secret, alias), expectedRefusal); + if (problem !== undefined) problems.push(problem); + } + + // compileBatch reports compile failures per probe instead of rejecting. + const compiled = await worker.call<{ errors: Array }>('compileBatch', [[ + `EXPLAIN ATTACH ${sqlLiteral(f.secret)} AS compile_probe` + ]]); + if (!BLOCKED.test(compiled.errors[0] ?? '')) { + problems.push(`compileBatch: EXPLAIN ATTACH compiled (errors=${render(compiled.errors)})`); + } + + // DETACH needs a schema to detach. Before the fix the ATTACH below + // succeeds; after it, the ATTACH is refused and the DETACH must be too. + try { await worker.call('exec', [`ATTACH ${sqlLiteral(f.secret)} AS detach_target`]); } catch { /* refused */ } + for (const [label, sql] of [ + ['query: DETACH', 'DETACH DATABASE detach_target'], + ['run: comment-prefixed DETACH', '/* c */ DETACH detach_target'], + ['exec: DETACH main', 'SELECT 1; DETACH main'] + ] as const) { + let outcome: unknown; + let failure: Error | undefined; + try { + outcome = await worker.call(label.startsWith('exec') ? 'exec' : label.startsWith('run') ? 'run' : 'query', [sql]); + } catch (error) { + failure = error as Error; + } + if (failure === undefined) problems.push(`${label}: EXECUTED; result=${render(outcome)}`); + else if (!BLOCKED.test(failure.message)) problems.push(`${label}: refused for an unrelated reason (${failure.message})`); + } + const leftover = await f.sideEffects(); + if (leftover.length > 0) problems.push(`after DETACH cases: ${leftover.join(', ')}`); + + assert.deepEqual(problems, []); + await f.control(); +}); + +it('keeps the worker\'s own SQL and benign scripts working (control arm)', async t => { + const f = await startFixture(t); if (!f) return; + const { worker } = f; + await f.control(); + + // exec runs a multi-statement script whose later statement depends on the + // DDL of an earlier one, so each statement must execute before the next compiles. + await worker.call('exec', ["CREATE TABLE made(a TEXT); INSERT INTO made VALUES ('ok'); -- trailing comment\n"]); + assert.deepEqual((await f.query('SELECT a FROM made')).values, [['ok']]); + + // Mentioning attach/detach as an identifier, a string or a column is not ATTACH. + await worker.call('run', ['CREATE TABLE attach_log(detach TEXT, "attach" TEXT, attach_count INTEGER)']); + await worker.call('run', ["INSERT INTO attach_log VALUES ('ATTACH x', 'DETACH y', 1)"]); + const mentions = await f.query("SELECT detach, \"attach\", attach_count FROM attach_log; SELECT 'ATTACH ''q'' AS z' AS word"); + assert.deepEqual(mentions.resultSets?.map(set => set.values), [[['ATTACH x', 'DETACH y', 1]], [["ATTACH 'q' AS z"]]]); + + // Internal statements: the execBatch SAVEPOINT bracket, PRAGMA journal_mode, + // compile-only EXPLAIN probes, the primary allAsync read and VACUUM INTO. + await worker.call('execBatch', [[{ sql: 'INSERT INTO made VALUES (?)', params: ['batched'] }]]); + await worker.call('setJournalMode', ['wal']); + assert.equal((await f.query('PRAGMA journal_mode')).values[0][0], 'wal'); + await worker.call('setJournalMode', ['delete']); + assert.equal((await f.query('PRAGMA journal_mode')).values[0][0], 'delete'); + assert.deepEqual((await worker.call<{ errors: unknown[] }>('compileBatch', [['EXPLAIN SELECT a FROM made']])).errors, [null]); + const read = await worker.call<{ values: unknown[][] }>('workspaceQuery', ['SELECT a FROM made ORDER BY rowid', BOUNDARY, [], ['a'], 5000]); + assert.deepEqual(read.values, [['ok'], ['batched']]); + + const snapshot = path.join(f.directory, 'snapshot.sqlite'); + await worker.call('vacuumInto', [snapshot, 5000]); + const copy = new DatabaseSync(snapshot, { readOnly: true }); + try { + assert.deepEqual(copy.prepare('SELECT a FROM made ORDER BY rowid').all().map(row => row.a), ['ok', 'batched']); + } finally { + copy.close(); + } + + assert.deepEqual(await f.attachedSchemas(), []); + await f.control(); +}); + +it('refuses SQL-level VACUUM INTO a path the worker did not choose', async t => { + const f = await startFixture(t); if (!f) return; + const { worker } = f; + await f.control(); + + // VACUUM INTO creates a new file holding a copy of the open database, and + // a read-only open does not stop it. The runtime's authorizer sees the + // destination as the ATTACH that VACUUM performs internally. + const cases: Array<[string, (target: string) => Promise]> = [ + ['query', p => f.query(`VACUUM INTO ${sqlLiteral(p)}`)], + ['query: bound destination', p => f.query('VACUUM main INTO ?', [p])], + ['run', p => worker.call('run', [`VACUUM main INTO ${sqlLiteral(p)}`])], + ['exec: 2nd statement', p => worker.call('exec', [`SELECT 1; VACUUM INTO ${sqlLiteral(p)}`])], + ]; + const problems: string[] = []; + for (const [label, attempt] of cases) { + const target = f.outsidePath('vacuum'); + const problem = await refusalProblem(f, label, () => attempt(target)); + if (problem !== undefined) problems.push(problem); + if (fs.existsSync(target)) problems.push(`${label}: wrote ${path.basename(target)}`); + } + await f.reopen(true); + const readOnlyTarget = f.outsidePath('vacuum-read-only'); + const readOnly = await refusalProblem(f, 'read-only open: VACUUM INTO', () => f.query(`VACUUM INTO ${sqlLiteral(readOnlyTarget)}`)); + if (readOnly !== undefined) problems.push(readOnly); + await f.reopen(false); + + // Control arm: the host's own snapshot RPC still writes its destination, + // and the permit it needed is gone once it settles, even for that path. + const snapshot = path.join(f.directory, 'snapshot.sqlite'); + await worker.call('vacuumInto', [snapshot, 5000]); + assert.equal(fs.existsSync(snapshot), true, 'vacuumInto writes the host-chosen snapshot'); + fs.rmSync(snapshot); + const reuse = await refusalProblem(f, 'query: VACUUM INTO the snapshot path after vacuumInto settled', + () => f.query(`VACUUM INTO ${sqlLiteral(snapshot)}`)); + if (reuse !== undefined) problems.push(reuse); + if (fs.existsSync(snapshot)) problems.push('the vacuumInto permit outlived the RPC'); + + // The refusal reads as one policy error, not a step failure followed by + // the same code again from finalize. + const runRefusal = await worker.call('run', [`VACUUM INTO ${sqlLiteral(f.outsidePath('vacuum-message'))}`]) + .then(() => undefined, (error: Error) => error.message); + if (runRefusal === undefined || !BLOCKED.test(runRefusal) || /finalization also failed/.test(runRefusal)) { + problems.push(`run: VACUUM INTO refusal message is ${render(runRefusal)}`); + } + + assert.deepEqual(problems, []); + await f.control(); +}); + +it('enforces the ATTACH refusal in the runtime itself, beneath the worker guard', async t => { + const f = await startFixture(t); if (!f) return; + + // Run the bundled runtime directly, without native-worker.js and its + // JavaScript guard: the refusal must come from the runtime's authorizer. + const script = path.join(f.directory, 'runtime-authority.js'); + fs.writeFileSync(script, ` + import { Database } from 'tjs:sqlite'; + const [bound, secret] = ${JSON.stringify([f.bound, f.secret])}; + const quote = p => "'" + p.replaceAll("'", "''") + "'"; + const outcome = {}; + const db = new Database(bound); + try { + db.exec('ATTACH ' + quote(secret) + ' AS leak'); + outcome.unpermitted = db.prepare('SELECT v FROM leak.secret').all(); + } catch (error) { + outcome.unpermitted = { errno: error.errno, message: error.message }; + } + db.permitAttach(secret); + try { + db.exec('ATTACH ' + quote(secret) + ' AS permitted'); + outcome.permitted = db.prepare('SELECT v FROM permitted.secret').all(); + } catch (error) { + outcome.permitted = { errno: error.errno, message: error.message }; + } + db.close(); + console.log(JSON.stringify(outcome)); + `); + const outcome = JSON.parse(execFileSync(f.runtime.binary, ['run', script], { encoding: 'utf8' }).trim()) as { + unpermitted: unknown; + permitted: unknown; + }; + + assert.deepEqual(outcome.unpermitted, { errno: 23, message: 'authorization denied' }, + 'the runtime refuses ATTACH with SQLITE_AUTH even without the worker guard'); + // Control arm: the same statement attaches once permitted, so the refusal + // above is the authorizer and not the path or the syntax. + assert.deepEqual(outcome.permitted, [{ v: SECRET }]); +}); + +it('explains a DETACH refusal without the ATTACH justification', async t => { + const f = await startFixture(t); if (!f) return; + const message = await f.query('DETACH DATABASE elsewhere').then(() => undefined, (error: Error) => error.message); + assert.match(message ?? '', BLOCKED); + assert.doesNotMatch(message ?? '', /open, read or write a database file/, + 'DETACH opens nothing; its refusal must not claim it can'); +}); diff --git a/tests/unit/native_real_smoke.test.ts b/tests/unit/native_real_smoke.test.ts index 5707449c..18537d6c 100644 --- a/tests/unit/native_real_smoke.test.ts +++ b/tests/unit/native_real_smoke.test.ts @@ -36,9 +36,10 @@ import type { TableQueryOptions } from '../../src/core/types'; -const BUNDLED_TXIKI_SQLITE_VERSION = '3.51.2'; +const BUNDLED_TXIKI_SQLITE_VERSION = '3.54.1'; const DIVERGENT_REAL_TEXT_BY_NATIVE_SQLITE_VERSION: Record = { - '3.51.2': '9.6529377952985e+282' + '3.51.2': '9.6529377952985e+282', + '3.54.1': '9.6529377952984946e+282' }; const USER_VIEW_BODY = `SELECT @@ -472,6 +473,21 @@ it('passes the native view smoke lane through the bundled txiki worker', async ( ); const engine = connection.databaseOps; + await testContext.test('refuses SQL-level ATTACH through the native host operations', async () => { + // The read-only copy is an existing database the bound path does + // not cover; before the guard this attached it and read through it. + await assert.rejects( + engine.executeQuery(`SELECT 1; ATTACH '${readOnlyDatabasePath.replaceAll("'", "''")}' AS smoke_attached`), + /ERR_NATIVE_SQL_ATTACH_BLOCKED/ + ); + const schemas = await engine.executeQuery('PRAGMA database_list'); + assert.deepStrictEqual( + schemas[0].rows.map(row => row[1]).filter(name => name !== 'main' && name !== 'temp'), + [] + ); + assert.deepStrictEqual((await engine.executeQuery('SELECT 1 AS ok'))[0].rows, [[1]]); + }); + await testContext.test('serializes through an isolated native snapshot', async () => { const snapshot = await engine.serializeDatabase(); assert.strictEqual( @@ -4531,54 +4547,21 @@ SELECT value AS x, value * 10 AS x FROM sequence`; ); }); - await testContext.test('refuses to rebind a native TEMP trigger historically attached elsewhere', async () => { - await engine.executeQuery("ATTACH DATABASE ':memory:' AS native_aux_history"); - await engine.executeQuery( - 'CREATE TABLE native_aux_history.native_historical_rows (value INTEGER)' - ); - await engine.executeQuery( - 'CREATE VIEW native_aux_history.native_historical_view AS ' + - 'SELECT value FROM native_historical_rows' - ); - await engine.executeQuery( - 'CREATE TEMP TABLE native_historical_log (value INTEGER)' - ); - await engine.executeQuery( - 'CREATE TEMP TRIGGER native_historical_aux_insert ' + - 'INSTEAD OF INSERT ON native_historical_view ' + - 'BEGIN INSERT INTO native_historical_log VALUES (NEW.value); END' - ); - await engine.executeQuery('CREATE TABLE native_historical_main_rows (value INTEGER)'); - await engine.executeQuery( - 'CREATE VIEW native_historical_view AS ' + - 'SELECT value FROM native_historical_main_rows' - ); - - const browsed = await engine.getViewDefinition('native_historical_view'); - assert.deepStrictEqual(browsed.triggers, []); - assert.deepStrictEqual( - browsed.ambiguousTemporaryTriggerNames, - ['native_historical_aux_insert'] - ); - await assert.rejects( - engine.editView( - 'native_historical_view', - 'SELECT value * 2 AS value FROM native_historical_main_rows', - true - ), - /native_historical_aux_insert.*TEMP trigger.*schema-qualified target/is - ); + await testContext.test('cannot bind a native TEMP trigger to an attached schema', async () => { + // Native connections refuse every ATTACH, including ':memory:' + // (which opens no file), so a TEMP trigger historically bound to an + // attached schema cannot exist here. The rebind refusal for that + // state stays covered on WASM in view_operations.test.ts and + // web_demo_worker.test.ts, whose in-memory VFS has no path to escape. await assert.rejects( - engine.executeQuery('INSERT INTO main.native_historical_view VALUES (23)'), - /cannot modify.*view|SQL logic error/i - ); - await engine.executeQuery( - 'INSERT INTO native_aux_history.native_historical_view VALUES (29)' + engine.executeQuery("ATTACH DATABASE ':memory:' AS native_aux_history"), + /ERR_NATIVE_SQL_ATTACH_BLOCKED/ ); - const logged = await engine.executeQuery( - 'SELECT value FROM native_historical_log' + const schemas = await engine.executeQuery('PRAGMA database_list'); + assert.deepStrictEqual( + schemas[0].rows.map(row => row[1]).filter(name => name !== 'main' && name !== 'temp'), + [] ); - assert.strictEqual(logged[0].rows[0][0], 29); }); await testContext.test('preserves a bracket-qualified main TEMP trigger through a temp shadow', async () => { diff --git a/tests/unit/query_plan_artifacts.test.ts b/tests/unit/query_plan_artifacts.test.ts index 9699bb6a..92fbe86f 100644 --- a/tests/unit/query_plan_artifacts.test.ts +++ b/tests/unit/query_plan_artifacts.test.ts @@ -8,7 +8,7 @@ import path from 'node:path'; const require = createRequire(import.meta.url); const { verifyQueryPlanArtifacts } = require('../../scripts/build-query-plan.mjs') as { verifyQueryPlanArtifacts(root?: string, options?: { includeBuildAssets?: boolean }): { - schema: number; sqlJsCommit: string; inputs: Record; outputs: Record + schema: number; sqlJsCommit: string; zigClang?: string; inputs: Record; outputs: Record }; }; @@ -84,19 +84,110 @@ it('rejects legacy artifact refresh arguments before touching generated files', assert.deepEqual(verifyQueryPlanArtifacts(), before); }); -it('requires the pinned source commit even when a different local checkout is supplied', () => { - const before = verifyQueryPlanArtifacts(); - const directory = fs.mkdtempSync(path.resolve('.tmp/query-plan-source-')); +const OFFICIAL_EMCC = 'emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 5.0.0 (a7c5deabd7c88ba1c38ebe988112256775f944c6)'; +const OFFICIAL_ZIG_CLANG = 'clang version 21.1.0'; + +/** + * Version-only stand-ins for emcc and zig: enough for the builder's toolchain + * gate and source admission, never enough to compile. Like the real zig, + * `zig cc --version` writes an empty a.o into its working directory. + */ +function withFakeToolchain( + tools: { emcc?: string; zigVersion?: string; zigClang?: string }, + run: (directory: string, emcc: string, zig: string) => void +): void { + fs.mkdirSync('.tmp', { recursive: true }); + const directory = fs.mkdtempSync(path.resolve('.tmp/query-plan-toolchain-')); try { + const emcc = path.join(directory, 'emcc'), zig = path.join(directory, 'zig'); + fs.writeFileSync(emcc, `#!${process.execPath}\nprocess.stdout.write(${JSON.stringify(`${tools.emcc ?? OFFICIAL_EMCC}\n`)});\n`, { mode: 0o755 }); + fs.writeFileSync(zig, `#!${process.execPath} +if (process.argv[2] === 'cc') { + process.getBuiltinModule('node:fs').writeFileSync('a.o', ''); + process.stdout.write(${JSON.stringify(`${tools.zigClang ?? OFFICIAL_ZIG_CLANG}\n`)}); +} else { + process.stdout.write(${JSON.stringify(`${tools.zigVersion ?? '0.16.0'}\n`)}); +} +`, { mode: 0o755 }); + run(directory, emcc, zig); + } finally { fs.rmSync(directory, { recursive: true, force: true }); } +} + +// The builder shells out to make, tar and unzip, and the fake tools are +// shebang scripts; neither runs on Windows. +const posixToolchain = { skip: process.platform === 'win32' ? 'the runtime builder and its fake tools need a POSIX toolchain' : false }; + +function runBuilder(args: string[]) { + return spawnSync(process.execPath, ['scripts/build-query-plan.mjs', ...args], { encoding: 'utf8' }); +} + +it('requires the pinned source commit even when a different local checkout is supplied', posixToolchain, () => { + const before = verifyQueryPlanArtifacts(); + withFakeToolchain({}, (directory, emcc, zig) => { const checkout = path.join(directory, 'source'); assert.equal(spawnSync('git', ['init', '--quiet', checkout]).status, 0); - // Version-only tools let this exercise source admission without compiling. - const emcc = path.join(directory, 'emcc'), zig = path.join(directory, 'zig'); - fs.writeFileSync(emcc, `#!${process.execPath}\nprocess.stdout.write('emcc 5.0.0\\n');\n`, { mode: 0o755 }); - fs.writeFileSync(zig, `#!${process.execPath}\nprocess.stdout.write('0.16.0\\n');\n`, { mode: 0o755 }); const result = spawnSync(process.execPath, ['scripts/refresh-sqljs.mjs', '--emcc', emcc, '--zig', zig, '--sqljs-source', checkout], { encoding: 'utf8' }); assert.equal(result.status, 1, result.stderr); assert.match(result.stderr, new RegExp(`not a (?:valid object name|tree object): ${before.sqlJsCommit}`)); assert.deepEqual(verifyQueryPlanArtifacts(), before); - } finally { fs.rmSync(directory, { recursive: true, force: true }); } + }); +}); + +it('accepts relative --emcc and --zig paths', posixToolchain, () => { + const before = verifyQueryPlanArtifacts(); + withFakeToolchain({}, (directory, emcc, zig) => { + const checkout = path.join(directory, 'source'); + assert.equal(spawnSync('git', ['init', '--quiet', checkout]).status, 0); + const result = runBuilder(['--emcc', path.relative(process.cwd(), emcc), '--zig', path.relative(process.cwd(), zig), '--sqljs-source', checkout]); + assert.equal(result.status, 1, result.stderr); + // Past the toolchain gate: the failure is source admission, not a spawn error. + assert.doesNotMatch(result.stderr, /ENOENT/); + assert.match(result.stderr, new RegExp(`not a (?:valid object name|tree object): ${before.sqlJsCommit}`)); + }); +}); + +it('runs the zig identity probe outside the checkout', posixToolchain, () => { + const marker = path.resolve('a.o'); + const stamp = () => (fs.existsSync(marker) ? fs.statSync(marker).mtimeMs : undefined); + const before = stamp(); + withFakeToolchain({}, (directory, emcc, zig) => { + const checkout = path.join(directory, 'source'); + assert.equal(spawnSync('git', ['init', '--quiet', checkout]).status, 0); + const result = runBuilder(['--emcc', emcc, '--zig', zig, '--sqljs-source', checkout]); + assert.equal(result.status, 1, result.stderr); + // The fake zig writes a.o into its working directory, as the real one does. + assert.equal(stamp(), before, 'zig cc --version must not write a.o into the checkout'); + }); +}); + +it('refuses a Zig distribution whose clang identity differs from the official 0.16.0 release', posixToolchain, () => { + const before = verifyQueryPlanArtifacts(); + // Same `zig version` as the official release, different bundled LLVM: its + // Linux libraries would differ in .comment. + withFakeToolchain({ zigClang: 'Homebrew clang version 21.1.8' }, (_directory, emcc, zig) => { + const result = runBuilder(['--emcc', emcc, '--zig', zig]); + assert.equal(result.status, 1, result.stderr); + assert.match(result.stderr, /official Zig 0\.16\.0 release.*found "Homebrew clang version 21\.1\.8"/); + assert.deepEqual(verifyQueryPlanArtifacts(), before); + }); +}); + +it('names the toolchain check that failed', posixToolchain, () => { + for (const [tools, expected] of [ + [{ emcc: OFFICIAL_EMCC.replace(' 5.0.0 ', ' 4.0.10 ') }, /Emscripten 5\.0\.0.*found "emcc .* 4\.0\.10 /], + // A substring test would admit 15.0.0. + [{ emcc: OFFICIAL_EMCC.replace(' 5.0.0 ', ' 15.0.0 ') }, /Emscripten 5\.0\.0.*found "emcc .* 15\.0\.0 /], + [{ emcc: OFFICIAL_EMCC.replace('a7c5deab', 'deadbeef') }, /Emscripten 5\.0\.0.*deadbeef/], + [{ zigVersion: '0.17.0' }, /Zig 0\.16\.0.*found "0\.17\.0"/], + ] as const) { + withFakeToolchain(tools, (_directory, emcc, zig) => { + const result = runBuilder(['--emcc', emcc, '--zig', zig]); + assert.equal(result.status, 1, result.stderr); + assert.match(result.stderr, expected); + }); + } +}); + +it('records the Zig clang identity in the runtime manifest', () => { + assert.equal(verifyQueryPlanArtifacts().zigClang, OFFICIAL_ZIG_CLANG); }); diff --git a/tests/unit/web_demo_worker.test.ts b/tests/unit/web_demo_worker.test.ts index e2bf3592..89537269 100644 --- a/tests/unit/web_demo_worker.test.ts +++ b/tests/unit/web_demo_worker.test.ts @@ -36,9 +36,10 @@ const bundledWorkerPath = path.resolve( process.cwd(), 'website/public/sqlite-viewer/worker.js' ); -const BUNDLED_SQLJS_SQLITE_VERSION = '3.49.1'; +const BUNDLED_SQLJS_SQLITE_VERSION = '3.54.1'; const DIVERGENT_REAL_TEXT_BY_SQLJS_SQLITE_VERSION: Record = { - '3.49.1': '9.6529377952985e+282' + '3.49.1': '9.6529377952985e+282', + '3.54.1': '9.6529377952984946e+282' }; let currentWorkerBundle: Promise | undefined; diff --git a/vendor/query-plan-manifest.json b/vendor/query-plan-manifest.json index 7cd056d1..08269351 100644 --- a/vendor/query-plan-manifest.json +++ b/vendor/query-plan-manifest.json @@ -1,22 +1,23 @@ { "schema": 1, - "sqlJsCommit": "424163d6c9c34acec7bac07eb2cecedd86185a60", + "sqlJsCommit": "3181cc5ee888d3251228d3995c32bf9ea03c3240", "emcc": "emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 5.0.0 (a7c5deabd7c88ba1c38ebe988112256775f944c6)", "zig": "0.16.0", + "zigClang": "clang version 21.1.0", "inputs": { "src/runtime/query-plan.c": "a2e6d39c36152bf36bb3729aff12567ed4fa2d9c7ef3751e60db580f5276cc8f", - "scripts/build-query-plan.mjs": "ed06af73937ffef2f8339eb4f9d35469704090a8d0273c241c80cdf9579aec78" + "scripts/build-query-plan.mjs": "0e4d926fd88b8bbe057e661adbcf0b04cafffdeda633e88f5e2fa61565031eb4" }, "outputs": { "natives/aarch64-macos/query-plan.dylib": "3a51dcd0ebc627e63d664e9b9c317667cb356f197e0d5645262bc3b5ef7b8c3c", "natives/x86_64-macos/query-plan.dylib": "6fe67e3149912a0bab1d4bc212dcab29e5a1138539f108facaf33975324ff773", - "natives/x86_64-linux-gnu/query-plan.so": "25d7cfc5a5ee6cd3a6ff8cda5e7f21c167431911cf448057710930217134d763", - "natives/aarch64-linux-gnu/query-plan.so": "2116570714d59da17ba34c55cec087cd93c6b30e622de4681173a5750c3ed98c", + "natives/x86_64-linux-gnu/query-plan.so": "340669408947665a9468d1c579c2b5c5cf33d95f3600521fbd9c6abb3a487b75", + "natives/aarch64-linux-gnu/query-plan.so": "c98df0252291daeac6e97ad38e706b4a3f016c3b983fc1ee936639c301a90dce", "natives/x86_64-windows/query-plan.dll": "8ac0a58303c8ae9eb27534878b7775d2476157db8e01ee8d275325848778a177", - "vendor/sql.js/sql-wasm.js": "8d044434bd1ed032816b7fe3559fa77421033b175c080bd9f6190df166bd846a", - "website/public/sqlite-viewer/sql-wasm.js": "8d044434bd1ed032816b7fe3559fa77421033b175c080bd9f6190df166bd846a", - "vendor/sql.js/sql-wasm.wasm": "10013ab296e8adfa5df66c86e3fc5b10726078185646c7f31d11b527bbbca063", - "assets/sqlite3.wasm": "10013ab296e8adfa5df66c86e3fc5b10726078185646c7f31d11b527bbbca063", - "website/public/sqlite-viewer/sql-wasm.wasm": "10013ab296e8adfa5df66c86e3fc5b10726078185646c7f31d11b527bbbca063" + "vendor/sql.js/sql-wasm.js": "9ec25067a7a2adf6faa080f922ac06fd10b4def3f4c9ea8428863e86093f6763", + "website/public/sqlite-viewer/sql-wasm.js": "9ec25067a7a2adf6faa080f922ac06fd10b4def3f4c9ea8428863e86093f6763", + "vendor/sql.js/sql-wasm.wasm": "ea94cafe49733bd55b8b2481d5cf0f07c5e006728c94b04999be04582b19a1e7", + "assets/sqlite3.wasm": "ea94cafe49733bd55b8b2481d5cf0f07c5e006728c94b04999be04582b19a1e7", + "website/public/sqlite-viewer/sql-wasm.wasm": "ea94cafe49733bd55b8b2481d5cf0f07c5e006728c94b04999be04582b19a1e7" } } diff --git a/vendor/sql.js/sql-wasm.js b/vendor/sql.js/sql-wasm.js index d1e10490..be68699c 100644 --- a/vendor/sql.js/sql-wasm.js +++ b/vendor/sql.js/sql-wasm.js @@ -69,111 +69,111 @@ var initSqlJs = function (moduleConfig) { // The emcc-generated code and shell-post.js code goes below, // meaning that all of it runs inside of this promise. If anything throws an exception, our promise will abort -var l;l||=typeof Module != 'undefined' ? Module : {};var ca=!!globalThis.window,da=!!globalThis.WorkerGlobalScope,ea=globalThis.process?.versions?.node&&"renderer"!=globalThis.process?.type; -l.onRuntimeInitialized=function(){function a(e,h){switch(typeof h){case "boolean":Bc(e,h?1:0);break;case "number":Cc(e,h);break;case "string":Dc(e,h,-1,-1);break;case "object":if(null===h)Gb(e);else if(null!=h.length){var k=ha(h.length);n.set(h,k);Ec(e,k,h.length,-1);ia(k)}else Ia(e,"Wrong API use : tried to return a value of an unknown type ("+h+").",-1);break;default:Gb(e)}}function b(e,h){for(var k=[],m=0;m>>0);if(null!=e){var h=this.filename,k="/",m=h;k&&(k="string"==typeof k?k:ka(k),m=h?la(k+"/"+h):k);h=ma(!0,!0);m=na(m,h);if(e){if("string"==typeof e){k=Array(e.length);for(var q=0,r=e.length;qm||!Number.isSafeInteger(m))return-1;try{if(e){a:{var r= -e.chunkSize,y=e.cb-m;var u=0;var A=m;var F,N;for(y>k&&(y=k);uy-u&&(P=y-u);if(F=e.lb.get(K))C.set(F.subarray(S,S+P),h+u);else{var M=e.nb-A;M>P&&(M=P);if(0M&&(N=N.subarray(0,M),fa=M);0M&&C.fill(0,h+u+M,h+u+P)}u+=P;A+=P}oa=u}return oa}u=q.read(m,k);if(null==u)return 0;A=u.length;A>k&&(u=u.subarray(0,k),A=k);C.set(u,h);return A}catch(Ma){return-1}}function v(e){var h= -Z[e];e=aa[e];if(!h)return-1;if(e)return e.cb;try{var k=h.size()}catch(m){return-1}return"number"!==typeof k||0>k||!Number.isSafeInteger(k)?-1:k}function z(e,h){var k=e.chunkSize,m=[];h=h?m.push(r):y+k>h&&q.fill(0,h-y)}),m.forEach(function(q){e.lb.delete(q)}),hm||!Number.isSafeInteger(m)||0>k)return-1;try{for(var r=e.chunkSize,y=m,u=0,A,F,N,K,S;uk-u&&(K=k-u);S=e.lb.get(A);if(!S){S=new Uint8Array(r);if(K=ba)){ba>oa.length&&(ba=oa.length);P=(M=fa.read(Ma,ba))?M.length:0;P>ba&&(M=M.subarray(0,ba),P=ba);if(Pe.cb&&(e.cb=m+k);return 0}catch(Ed){return-1}}function B(e,h){e=aa[e];if(!e)return-1;h=Number(h);if(0>h||!Number.isSafeInteger(h))return-1; -try{return z(e,h),0}catch(k){return-1}}function L(){throw Error("paged databases are read-only snapshots; export() is only available on openPagedWritable instances");}function hb(){var e,h,k;if(null===this.db)throw Error("Database closed");if(0===Kb(this.db))throw Error("cannot export a paged database while a transaction is open; COMMIT or ROLLBACK first");var m=aa[this.tb];var q=Z[this.tb];var r=m.chunkSize;var y=new Uint8Array(m.cb);for(e=0;em.cb-e&&(u=m.cb-e);if(h=m.lb.get(e/ -r))y.set(h.subarray(0,u),e);else if(h=m.nb-e,h>u&&(h=u),0h&&(k=k.subarray(0,h));if(!k||k.lengthNumber.MAX_SAFE_INTEGER)throw"rowId too big to fit inside a Number";e(h,m,q,Number(r))},"viiiij");Rb(this.db,this.hb,0);return this};var Z={},aa={},Oa=1,pa=null,Pa=null,jb=null,Ub=null;g.openPaged=function(e){if(!e||"function"!==typeof e.read||"function"!==typeof e.size)throw Error("openPaged requires a hostIo object with read(offset, length) and size() functions");null===pa&&(pa=G(p,"iiiij"),Pa=G(v,"di"));var h=Sb(pa,Pa);if(0!==h)throw Error("could not register the sqljs_host VFS (error code "+ -h+")");var k=Oa;Oa+=1;Z[k]=e;try{h=fd(k,J);var m=w(J,"i32");if(0!==h){var q=0!==m?ib(m):"SQLite error "+h;0!==m&&wa(m);throw Error(q);}}catch(r){throw delete Z[k],r;}e=Object.create(g.prototype);e.db=m;e.filename=null;e.tb=k;e.kb={};e.Za={};La(e.db);e.Db=L;e["export"]=L;e.close=Na;e.close=Na;return e};g.openPagedWritable=function(e){if(!e||"function"!==typeof e.read||"function"!==typeof e.size)throw Error("openPagedWritable requires a hostIo object with read(offset, length) and size() functions"); -var h=e.size();if("number"!==typeof h||0>h||!Number.isSafeInteger(h))throw Error("hostIo.size() must return a non-negative byte count");null===pa&&(pa=G(p,"iiiij"),Pa=G(v,"di"));null===jb&&(jb=G(x,"iiiij"),Ub=G(B,"iij"));var k=Sb(pa,Pa);0===k&&(k=gd(jb,Ub));if(0!==k)throw Error("could not register the sqljs_host VFS (error code "+k+")");var m=Oa;Oa+=1;Z[m]=e;a:{try{var q=e.read(16,2)}catch(u){e=4096;break a}!q||2>q.length?e=4096:(e=256*q[0]+q[1],e=1===e?65536:512<=e&&32768>=e&&0===(e&e-1)?e:4096)}aa[m]= -{chunkSize:e,lb:new Map,cb:h,nb:h};try{k=hd(m,J);var r=w(J,"i32");if(0!==k){var y=0!==r?ib(r):"SQLite error "+k;0!==r&&wa(r);throw Error(y);}}catch(u){throw delete Z[m],delete aa[m],u;}k=Object.create(g.prototype);k.db=r;k.filename=null;k.tb=m;k.kb={};k.Za={};La(k.db);k.Db=hb;k["export"]=hb;k.xc=Lb;k.exportPagedWritableOverlay=Lb;k.close=Na;k.close=Na;return k};c.prototype.bind=c.prototype.bind;c.prototype.step=c.prototype.step;c.prototype.get=c.prototype.get;c.prototype.getColumnNames=c.prototype.Pb; -c.prototype.getAsObject=c.prototype.Ob;c.prototype.getSQL=c.prototype.hc;c.prototype.getNormalizedSQL=c.prototype.dc;c.prototype.run=c.prototype.run;c.prototype.reset=c.prototype.reset;c.prototype.freemem=c.prototype.freemem;c.prototype.free=c.prototype.ib;f.prototype.next=f.prototype.next;f.prototype.getRemainingSQL=f.prototype.ec;g.prototype.run=g.prototype.run;g.prototype.exec=g.prototype.exec;g.prototype.each=g.prototype.bc;g.prototype.prepare=g.prototype.Ib;g.prototype.iterateStatements=g.prototype.kc; -g.prototype["export"]=g.prototype.Db;g.prototype.close=g.prototype.close;g.prototype.handleError=g.prototype.handleError;g.prototype.getRowsModified=g.prototype.fc;g.prototype.progress_handler=g.prototype.nc;g.prototype.interrupt=g.prototype.jc;g.prototype.create_function=g.prototype.$b;g.prototype.create_aggregate=g.prototype.Zb;g.prototype.updateHook=g.prototype.qc;l.Database=g};var Ca="./this.program",Da=(a,b)=>{throw b;},Ea=globalThis.document?.currentScript?.src; +var m;m||=typeof Module != 'undefined' ? Module : {};var ca=!!globalThis.window,da=!!globalThis.WorkerGlobalScope,ea=globalThis.process?.versions?.node&&"renderer"!=globalThis.process?.type; +m.onRuntimeInitialized=function(){function a(e,g){Fb(e,g instanceof Error?g.message:String(g),-1)}function b(e,g){switch(typeof g){case "boolean":Dc(e,g?1:0);break;case "number":Ec(e,g);break;case "string":Fc(e,g,-1,-1);break;case "object":if(null===g)Gb(e);else if(null!=g.length){var k=fa(g.length);p.set(g,k);Gc(e,k,g.length,-1);ia(k)}else Fb(e,"Wrong API use : tried to return a value of an unknown type ("+g+").",-1);break;default:Gb(e)}}function c(e,g){for(var k=[],n=0;n>>0);if(null!=e){var g=this.filename,k="/",n=g;k&&(k="string"==typeof k?k:ka(k),n=g?la(k+"/"+g):k);g=ma(!0,!0);n=na(n,g);if(e){if("string"==typeof e){k=Array(e.length);for(var q=0,r=e.length;qn||!Number.isSafeInteger(n))return-1;try{if(e){a:{var r=e.chunkSize,y=e.cb-n;var t=0;var E=n;var D,I;for(y>k&&(y=k);ty-t&&(M=y-t);if(D=e.mb.get(Q))C.set(D.subarray(O,O+M),g+t);else{var J=e.nb-E;J>M&&(J=M);if(0J&&(I=I.subarray(0,J),ha=J);0J&&C.fill(0, +g+t+J,g+t+M)}t+=M;E+=M}qa=t}return qa}t=q.read(n,k);if(null==t)return 0;E=t.length;E>k&&(t=t.subarray(0,k),E=k);C.set(t,g);return E}catch(La){return-1}}function A(e){var g=Z[e];e=aa[e];if(!g)return-1;if(e)return e.cb;try{var k=g.size()}catch(n){return-1}return"number"!==typeof k||0>k||!Number.isSafeInteger(k)?-1:k}function N(e,g){var k=e.chunkSize,n=[];g=g?n.push(r):y+k>g&&q.fill(0,g-y)}),n.forEach(function(q){e.mb.delete(q)}),gn||!Number.isSafeInteger(n)||0>k)return-1;try{for(var r=e.chunkSize,y=n,t=0,E,D,I,Q,O;tk-t&&(Q=k-t);O=e.mb.get(E);if(!O){O=new Uint8Array(r);if(Q=ba)){ba>qa.length&&(ba=qa.length);M=(J=ha.read(La,ba))?J.length:0;M>ba&&(J=J.subarray(0,ba),M=ba);if(Me.cb&&(e.cb=n+k);return 0}catch(Gd){return-1}}function Pc(e,g){e=aa[e];if(!e)return-1;g=Number(g);if(0>g||!Number.isSafeInteger(g))return-1;try{return N(e,g),0}catch(k){return-1}}function Lb(){throw Error("paged databases are read-only snapshots; export() is only available on openPagedWritable instances");}function Mb(){var e,g,k;if(null===this.db)throw Error("Database closed");if(0===Nb(this.db))throw Error("cannot export a paged database while a transaction is open; COMMIT or ROLLBACK first"); +var n=aa[this.tb];var q=Z[this.tb];var r=n.chunkSize;var y=new Uint8Array(n.cb);for(e=0;en.cb-e&&(t=n.cb-e);if(g=n.mb.get(e/r))y.set(g.subarray(0,t),e);else if(g=n.nb-e,g>t&&(g=t),0g&&(k=k.subarray(0,g));if(!k||k.lengthNumber.MAX_SAFE_INTEGER)throw"rowId too big to fit inside a Number";e(g,n,q,Number(r))},"viiiij");Tb(this.db,this.ib,0);return this};var Z={},aa={},Na=1,ra=null,Oa=null,ib=null,Wb=null;l.openPaged=function(e){if(!e||"function"!==typeof e.read||"function"!==typeof e.size)throw Error("openPaged requires a hostIo object with read(offset, length) and size() functions");null===ra&&(ra=G(x,"iiiij"),Oa=G(A,"di"));var g=Ub(ra, +Oa);if(0!==g)throw Error("could not register the sqljs_host VFS (error code "+g+")");var k=Na;Na+=1;Z[k]=e;try{g=hd(k,L);var n=w(L,"i32");if(0!==g){var q=0!==n?hb(n):"SQLite error "+g;0!==n&&xa(n);throw Error(q);}}catch(r){throw delete Z[k],r;}e=Object.create(l.prototype);e.db=n;e.filename=null;e.tb=k;e.lb={};e.$a=new Map;Ka(e.db);e.Eb=Lb;e["export"]=Lb;e.close=Ma;e.close=Ma;return e};l.openPagedWritable=function(e){if(!e||"function"!==typeof e.read||"function"!==typeof e.size)throw Error("openPagedWritable requires a hostIo object with read(offset, length) and size() functions"); +var g=e.size();if("number"!==typeof g||0>g||!Number.isSafeInteger(g))throw Error("hostIo.size() must return a non-negative byte count");null===ra&&(ra=G(x,"iiiij"),Oa=G(A,"di"));null===ib&&(ib=G(Kb,"iiiij"),Wb=G(Pc,"iij"));var k=Ub(ra,Oa);0===k&&(k=jd(ib,Wb));if(0!==k)throw Error("could not register the sqljs_host VFS (error code "+k+")");var n=Na;Na+=1;Z[n]=e;a:{try{var q=e.read(16,2)}catch(t){e=4096;break a}!q||2>q.length?e=4096:(e=256*q[0]+q[1],e=1===e?65536:512<=e&&32768>=e&&0===(e&e-1)?e:4096)}aa[n]= +{chunkSize:e,mb:new Map,cb:g,nb:g};try{k=kd(n,L);var r=w(L,"i32");if(0!==k){var y=0!==r?hb(r):"SQLite error "+k;0!==r&&xa(r);throw Error(y);}}catch(t){throw delete Z[n],delete aa[n],t;}k=Object.create(l.prototype);k.db=r;k.filename=null;k.tb=n;k.lb={};k.$a=new Map;Ka(k.db);k.Eb=Mb;k["export"]=Mb;k.xc=Ob;k.exportPagedWritableOverlay=Ob;k.close=Ma;k.close=Ma;return k};d.prototype.bind=d.prototype.bind;d.prototype.step=d.prototype.step;d.prototype.get=d.prototype.get;d.prototype.getColumnNames=d.prototype.Pb; +d.prototype.getAsObject=d.prototype.Ob;d.prototype.getSQL=d.prototype.hc;d.prototype.getNormalizedSQL=d.prototype.dc;d.prototype.run=d.prototype.run;d.prototype.reset=d.prototype.reset;d.prototype.freemem=d.prototype.freemem;d.prototype.free=d.prototype.fb;h.prototype.next=h.prototype.next;h.prototype.getRemainingSQL=h.prototype.ec;l.prototype.run=l.prototype.run;l.prototype.exec=l.prototype.exec;l.prototype.each=l.prototype.bc;l.prototype.prepare=l.prototype.Ib;l.prototype.iterateStatements=l.prototype.kc; +l.prototype["export"]=l.prototype.Eb;l.prototype.close=l.prototype.close;l.prototype.handleError=l.prototype.handleError;l.prototype.getRowsModified=l.prototype.fc;l.prototype.progress_handler=l.prototype.nc;l.prototype.interrupt=l.prototype.jc;l.prototype.create_function=l.prototype.$b;l.prototype.create_aggregate=l.prototype.Zb;l.prototype.updateHook=l.prototype.qc;m.Database=l};var Ca="./this.program",Da=(a,b)=>{throw b;},Ea=globalThis.document?.currentScript?.src; "undefined"!=typeof __filename?Ea=__filename:da&&(Ea=self.location.href);var Fa="",Ga,Ha; -if(ea){var fs=require("node:fs");Fa=__dirname+"/";Ha=a=>{a=Ja(a)?new URL(a):a;return fs.readFileSync(a)};Ga=async a=>{a=Ja(a)?new URL(a):a;return fs.readFileSync(a,void 0)};1{process.exitCode=a;throw b;}}else if(ca||da){try{Fa=(new URL(".",Ea)).href}catch{}da&&(Ha=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)}); -Ga=async a=>{if(Ja(a))return new Promise((c,d)=>{var f=new XMLHttpRequest;f.open("GET",a,!0);f.responseType="arraybuffer";f.onload=()=>{200==f.status||0==f.status&&f.response?c(f.response):d(f.status)};f.onerror=d;f.send(null)});var b=await fetch(a,{credentials:"same-origin"});if(b.ok)return b.arrayBuffer();throw Error(b.status+" : "+b.url);}}var Ka=console.log.bind(console),Qa=console.error.bind(console),Ra,Sa=!1,Ta,Ja=a=>a.startsWith("file://"),n,C,Ua,H,I,Va,Wa,O; -function Xa(){var a=Ya.buffer;n=new Int8Array(a);Ua=new Int16Array(a);C=new Uint8Array(a);new Uint16Array(a);H=new Int32Array(a);I=new Uint32Array(a);Va=new Float32Array(a);Wa=new Float64Array(a);O=new BigInt64Array(a);new BigUint64Array(a)}function Za(a){l.onAbort?.(a);a="Aborted("+a+")";Qa(a);Sa=!0;throw new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");}var $a; -async function ab(a){if(!Ra)try{var b=await Ga(a);return new Uint8Array(b)}catch{}if(a==$a&&Ra)a=new Uint8Array(Ra);else if(Ha)a=Ha(a);else throw"both async and sync fetching of the wasm failed";return a}async function bb(a,b){try{var c=await ab(a);return await WebAssembly.instantiate(c,b)}catch(d){Qa(`failed to asynchronously prepare wasm: ${d}`),Za(d)}} -async function cb(a){var b=$a;if(!Ra&&!Ja(b)&&!ea)try{var c=fetch(b,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(c,a)}catch(d){Qa(`wasm streaming compile failed: ${d}`),Qa("falling back to ArrayBuffer instantiation")}return bb(b,a)}class db{name="ExitStatus";constructor(a){this.message=`Program terminated with exit(${a})`;this.status=a}}var eb=a=>{for(;0{var a=l.preRun.shift();gb.push(a)},lb=0,mb=null; -function w(a,b="i8"){b.endsWith("*")&&(b="*");switch(b){case "i1":return n[a];case "i8":return n[a];case "i16":return Ua[a>>1];case "i32":return H[a>>2];case "i64":return O[a>>3];case "float":return Va[a>>2];case "double":return Wa[a>>3];case "*":return I[a>>2];default:Za(`invalid type for getValue: ${b}`)}}var nb=!0; -function ya(a){var b="i32";b.endsWith("*")&&(b="*");switch(b){case "i1":n[a]=0;break;case "i8":n[a]=0;break;case "i16":Ua[a>>1]=0;break;case "i32":H[a>>2]=0;break;case "i64":O[a>>3]=BigInt(0);break;case "float":Va[a>>2]=0;break;case "double":Wa[a>>3]=0;break;case "*":I[a>>2]=0;break;default:Za(`invalid type for setValue: ${b}`)}} -var ob=new TextDecoder,pb=(a,b,c,d)=>{c=b+c;if(d)return c;for(;a[b]&&!(b>=c);)++b;return b},E=(a,b,c)=>a?ob.decode(C.subarray(a,pb(C,a,b,c))):"",qb=(a,b)=>{for(var c=0,d=a.length-1;0<=d;d--){var f=a[d];"."===f?a.splice(d,1):".."===f?(a.splice(d,1),c++):c&&(a.splice(d,1),c--)}if(b)for(;c;c--)a.unshift("..");return a},la=a=>{var b="/"===a.charAt(0),c="/"===a.slice(-1);(a=qb(a.split("/").filter(d=>!!d),!b).join("/"))||b||(a=".");a&&c&&(a+="/");return(b?"/":"")+a},rb=a=>{var b=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(a).slice(1); -a=b[0];b=b[1];if(!a&&!b)return".";b&&=b.slice(0,-1);return a+b},sb=a=>a&&a.match(/([^\/]+|\/)\/*$/)[1],tb=()=>{if(ea){var a=require("node:crypto");return b=>a.randomFillSync(b)}return b=>crypto.getRandomValues(b)},ub=a=>{(ub=tb())(a)},vb=(...a)=>{for(var b="",c=!1,d=a.length-1;-1<=d&&!c;d--){c=0<=d?a[d]:"/";if("string"!=typeof c)throw new TypeError("Arguments to path.resolve must be strings");if(!c)return"";b=c+"/"+b;c="/"===c.charAt(0)}b=qb(b.split("/").filter(f=>!!f),!c).join("/");return(c?"/": -"")+b||"."},wb=a=>{var b=pb(a,0);return ob.decode(a.buffer?a.subarray(0,b):new Uint8Array(a.slice(0,b)))},xb=[],yb=a=>{for(var b=0,c=0;c=d?b++:2047>=d?b+=2:55296<=d&&57343>=d?(b+=4,++c):b+=3}return b},Q=(a,b,c,d)=>{if(!(0=p){if(c>=d)break;b[c++]=p}else if(2047>=p){if(c+1>=d)break;b[c++]=192|p>>6;b[c++]=128|p&63}else if(65535>=p){if(c+2>=d)break;b[c++]=224|p>>12;b[c++]=128| -p>>6&63;b[c++]=128|p&63}else{if(c+3>=d)break;b[c++]=240|p>>18;b[c++]=128|p>>12&63;b[c++]=128|p>>6&63;b[c++]=128|p&63;g++}}b[c]=0;return c-f},zb=[];function Ab(a,b){zb[a]={input:[],output:[],sb:b};Bb(a,Cb)} -var Cb={open(a){var b=zb[a.node.rdev];if(!b)throw new R(43);a.tty=b;a.seekable=!1},close(a){a.tty.sb.fsync(a.tty)},fsync(a){a.tty.sb.fsync(a.tty)},read(a,b,c,d){if(!a.tty||!a.tty.sb.Rb)throw new R(60);for(var f=0,g=0;g=a.node.$a)return 0;a=Math.min(a.node.$a-f,d);if(8=g||(g=Math.max(g,p*(1048576>p?2:1.125)>>>0),0!=p&&(g=Math.max(g,256)),p=a.Va,a.Va=new Uint8Array(g),0b)throw new R(28); -return b},yb(a,b,c,d,f){if(32768!==(a.node.mode&61440))throw new R(43);a=a.node.Va;if(f&2||!a||a.buffer!==n.buffer){f=!0;d=65536*Math.ceil(b/65536);var g=Vb(65536,d);g&&C.fill(0,g,g+d);d=g;if(!d)throw new R(48);if(a){if(0{var c=0;a&&(c|=365);b&&(c|=146);return c},Wb=null,Xb={},Yb=[],Zb=1,$b=null,ac= -!1,bc=!0,cc={},R=class{name="ErrnoError";constructor(a){this.Xa=a}},dc=class{wb={};node=null;get flags(){return this.wb.flags}set flags(a){this.wb.flags=a}get position(){return this.wb.position}set position(a){this.wb.position=a}},ec=class{Ta={};Ua={};qb=null;constructor(a,b,c,d){a||=this;this.parent=a;this.jb=a.jb;this.id=Zb++;this.name=b;this.mode=c;this.rdev=d;this.atime=this.mtime=this.ctime=Date.now()}get read(){return 365===(this.mode&365)}set read(a){a?this.mode|=365:this.mode&=-366}get write(){return 146=== +if(ea){var fs=require("node:fs");Fa=__dirname+"/";Ha=a=>{a=Ia(a)?new URL(a):a;return fs.readFileSync(a)};Ga=async a=>{a=Ia(a)?new URL(a):a;return fs.readFileSync(a,void 0)};1{process.exitCode=a;throw b;}}else if(ca||da){try{Fa=(new URL(".",Ea)).href}catch{}da&&(Ha=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)}); +Ga=async a=>{if(Ia(a))return new Promise((c,d)=>{var f=new XMLHttpRequest;f.open("GET",a,!0);f.responseType="arraybuffer";f.onload=()=>{200==f.status||0==f.status&&f.response?c(f.response):d(f.status)};f.onerror=d;f.send(null)});var b=await fetch(a,{credentials:"same-origin"});if(b.ok)return b.arrayBuffer();throw Error(b.status+" : "+b.url);}}var Ja=console.log.bind(console),Pa=console.error.bind(console),Qa,Ra=!1,Sa,Ia=a=>a.startsWith("file://"),p,C,Ta,H,K,Ua,Va,P; +function Wa(){var a=Xa.buffer;p=new Int8Array(a);Ta=new Int16Array(a);C=new Uint8Array(a);new Uint16Array(a);H=new Int32Array(a);K=new Uint32Array(a);Ua=new Float32Array(a);Va=new Float64Array(a);P=new BigInt64Array(a);new BigUint64Array(a)}function Ya(a){m.onAbort?.(a);a="Aborted("+a+")";Pa(a);Ra=!0;throw new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");}var Za; +async function $a(a){if(!Qa)try{var b=await Ga(a);return new Uint8Array(b)}catch{}if(a==Za&&Qa)a=new Uint8Array(Qa);else if(Ha)a=Ha(a);else throw"both async and sync fetching of the wasm failed";return a}async function ab(a,b){try{var c=await $a(a);return await WebAssembly.instantiate(c,b)}catch(d){Pa(`failed to asynchronously prepare wasm: ${d}`),Ya(d)}} +async function bb(a){var b=Za;if(!Qa&&!Ia(b)&&!ea)try{var c=fetch(b,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(c,a)}catch(d){Pa(`wasm streaming compile failed: ${d}`),Pa("falling back to ArrayBuffer instantiation")}return ab(b,a)}class cb{name="ExitStatus";constructor(a){this.message=`Program terminated with exit(${a})`;this.status=a}}var db=a=>{for(;0{var a=m.preRun.shift();fb.push(a)},kb=0,lb=null; +function w(a,b="i8"){b.endsWith("*")&&(b="*");switch(b){case "i1":return p[a];case "i8":return p[a];case "i16":return Ta[a>>1];case "i32":return H[a>>2];case "i64":return P[a>>3];case "float":return Ua[a>>2];case "double":return Va[a>>3];case "*":return K[a>>2];default:Ya(`invalid type for getValue: ${b}`)}}var mb=!0; +function ya(a){var b="i32";b.endsWith("*")&&(b="*");switch(b){case "i1":p[a]=0;break;case "i8":p[a]=0;break;case "i16":Ta[a>>1]=0;break;case "i32":H[a>>2]=0;break;case "i64":P[a>>3]=BigInt(0);break;case "float":Ua[a>>2]=0;break;case "double":Va[a>>3]=0;break;case "*":K[a>>2]=0;break;default:Ya(`invalid type for setValue: ${b}`)}} +var nb=new TextDecoder,ob=(a,b,c,d)=>{c=b+c;if(d)return c;for(;a[b]&&!(b>=c);)++b;return b},F=(a,b,c)=>a?nb.decode(C.subarray(a,ob(C,a,b,c))):"",pb=(a,b)=>{for(var c=0,d=a.length-1;0<=d;d--){var f=a[d];"."===f?a.splice(d,1):".."===f?(a.splice(d,1),c++):c&&(a.splice(d,1),c--)}if(b)for(;c;c--)a.unshift("..");return a},la=a=>{var b="/"===a.charAt(0),c="/"===a.slice(-1);(a=pb(a.split("/").filter(d=>!!d),!b).join("/"))||b||(a=".");a&&c&&(a+="/");return(b?"/":"")+a},qb=a=>{var b=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(a).slice(1); +a=b[0];b=b[1];if(!a&&!b)return".";b&&=b.slice(0,-1);return a+b},rb=a=>a&&a.match(/([^\/]+|\/)\/*$/)[1],sb=()=>{if(ea){var a=require("node:crypto");return b=>a.randomFillSync(b)}return b=>crypto.getRandomValues(b)},tb=a=>{(tb=sb())(a)},ub=(...a)=>{for(var b="",c=!1,d=a.length-1;-1<=d&&!c;d--){c=0<=d?a[d]:"/";if("string"!=typeof c)throw new TypeError("Arguments to path.resolve must be strings");if(!c)return"";b=c+"/"+b;c="/"===c.charAt(0)}b=pb(b.split("/").filter(f=>!!f),!c).join("/");return(c?"/": +"")+b||"."},vb=a=>{var b=ob(a,0);return nb.decode(a.buffer?a.subarray(0,b):new Uint8Array(a.slice(0,b)))},wb=[],xb=a=>{for(var b=0,c=0;c=d?b++:2047>=d?b+=2:55296<=d&&57343>=d?(b+=4,++c):b+=3}return b},R=(a,b,c,d)=>{if(!(0=l){if(c>=d)break;b[c++]=l}else if(2047>=l){if(c+1>=d)break;b[c++]=192|l>>6;b[c++]=128|l&63}else if(65535>=l){if(c+2>=d)break;b[c++]=224|l>>12;b[c++]=128| +l>>6&63;b[c++]=128|l&63}else{if(c+3>=d)break;b[c++]=240|l>>18;b[c++]=128|l>>12&63;b[c++]=128|l>>6&63;b[c++]=128|l&63;h++}}b[c]=0;return c-f},yb=[];function zb(a,b){yb[a]={input:[],output:[],sb:b};Ab(a,Bb)} +var Bb={open(a){var b=yb[a.node.rdev];if(!b)throw new S(43);a.tty=b;a.seekable=!1},close(a){a.tty.sb.fsync(a.tty)},fsync(a){a.tty.sb.fsync(a.tty)},read(a,b,c,d){if(!a.tty||!a.tty.sb.Rb)throw new S(60);for(var f=0,h=0;h=a.node.Za)return 0;a=Math.min(a.node.Za-f,d);if(8=h||(h=Math.max(h,l*(1048576>l?2:1.125)>>>0),0!=l&&(h=Math.max(h,256)),l=a.Va,a.Va=new Uint8Array(h),0b)throw new S(28); +return b},zb(a,b,c,d,f){if(32768!==(a.node.mode&61440))throw new S(43);a=a.node.Va;if(f&2||!a||a.buffer!==p.buffer){f=!0;d=65536*Math.ceil(b/65536);var h=Xb(65536,d);h&&C.fill(0,h,h+d);d=h;if(!d)throw new S(48);if(a){if(0{var c=0;a&&(c|=365);b&&(c|=146);return c},Yb=null,Zb={},$b=[],ac=1,bc=null,cc= +!1,dc=!0,ec={},S=class{name="ErrnoError";constructor(a){this.Xa=a}},fc=class{wb={};node=null;get flags(){return this.wb.flags}set flags(a){this.wb.flags=a}get position(){return this.wb.position}set position(a){this.wb.position=a}},gc=class{Ta={};Ua={};qb=null;constructor(a,b,c,d){a||=this;this.parent=a;this.kb=a.kb;this.id=ac++;this.name=b;this.mode=c;this.rdev=d;this.atime=this.mtime=this.ctime=Date.now()}get read(){return 365===(this.mode&365)}set read(a){a?this.mode|=365:this.mode&=-366}get write(){return 146=== (this.mode&146)}set write(a){a?this.mode|=146:this.mode&=-147}}; -function V(a,b={}){if(!a)throw new R(44);b.Fb??(b.Fb=!0);"/"===a.charAt(0)||(a="//"+a);var c=0;a:for(;40>c;c++){a=a.split("/").filter(v=>!!v);for(var d=Wb,f="/",g=0;g>>0)%$b.length} -function Tb(a){var b=fc(a.parent.id,a.name);if($b[b]===a)$b[b]=a.rb;else for(b=$b[b];b;){if(b.rb===a){b.rb=a.rb;break}b=b.rb}}function Ib(a,b){var c=U(a.mode)?(c=gc(a,"x"))?c:a.Ta.lookup?0:2:54;if(c)throw new R(c);for(c=$b[fc(a.id,b)];c;c=c.rb){var d=c.name;if(c.parent.id===a.id&&d===b)return c}return a.Ta.lookup(a,b)}function Hb(a,b,c,d){a=new ec(a,b,c,d);b=fc(a.parent.id,a.name);a.rb=$b[b];return $b[b]=a}function U(a){return 16384===(a&61440)} -function hc(a){var b=["r","w","rw"][a&3];a&512&&(b+="w");return b}function gc(a,b){if(bc)return 0;if(!b.includes("r")||a.mode&292){if(b.includes("w")&&!(a.mode&146)||b.includes("x")&&!(a.mode&73))return 2}else return 2;return 0}function ic(a,b){if(!U(a.mode))return 54;try{return Ib(a,b),20}catch(c){}return gc(a,"wx")} -function jc(a,b,c){try{var d=Ib(a,b)}catch(f){return f.Xa}if(a=gc(a,"wx"))return a;if(c){if(!U(d.mode))return 54;if(d===d.parent||"/"===ka(d))return 10}else if(U(d.mode))return 31;return 0}function kc(a){if(!a)throw new R(63);return a}function W(a){a=Yb[a];if(!a)throw new R(8);return a}function lc(a,b=-1){a=Object.assign(new dc,a);if(-1==b)a:{for(b=0;4096>=b;b++)if(!Yb[b])break a;throw new R(33);}a.fd=b;return Yb[b]=a}function mc(a,b=-1){a=lc(a,b);a.Ua?.wc?.(a);return a} -function nc(a,b,c){var d=a?.Ua.eb;a=d?a:b;d??=b.Ta.eb;kc(d);d(a,c)}var Fb={open(a){a.Ua=Xb[a.node.rdev].Ua;a.Ua.open?.(a)},fb(){throw new R(70);}};function Bb(a,b){Xb[a]={Ua:b}}function oc(a,b){var c="/"===b;if(c&&Wb)throw new R(10);if(!c&&b){var d=V(b,{Fb:!1});b=d.path;d=d.node;if(d.qb)throw new R(10);if(!U(d.mode))throw new R(54);}b={type:a,Cc:{},Tb:b,lc:[]};a=a.jb(b);a.jb=b;b.root=a;c?Wb=a:d&&(d.qb=b,d.jb&&d.jb.lc.push(b))} -function pc(a,b,c){var d=V(a,{parent:!0}).node;a=sb(a);if(!a)throw new R(28);if("."===a||".."===a)throw new R(20);var f=ic(d,a);if(f)throw new R(f);if(!d.Ta.xb)throw new R(63);return d.Ta.xb(d,a,b,c)}function na(a,b=438){return pc(a,b&4095|32768,0)}function X(a,b=511){return pc(a,b&1023|16384,0)}function qc(a,b,c){"undefined"==typeof c&&(c=b,b=438);pc(a,b|8192,c)} -function rc(a,b){if(!vb(a))throw new R(44);var c=V(b,{parent:!0}).node;if(!c)throw new R(44);b=sb(b);var d=ic(c,b);if(d)throw new R(d);if(!c.Ta.symlink)throw new R(63);c.Ta.symlink(c,b,a)}function sc(a){var b=V(a,{parent:!0}).node;a=sb(a);var c=Ib(b,a),d=jc(b,a,!0);if(d)throw new R(d);if(!b.Ta.rmdir)throw new R(63);if(c.qb)throw new R(10);b.Ta.rmdir(b,a);Tb(c)} -function Ba(a){var b=V(a,{parent:!0}).node;if(!b)throw new R(44);a=sb(a);var c=Ib(b,a),d=jc(b,a,!1);if(d)throw new R(d);if(!b.Ta.unlink)throw new R(63);if(c.qb)throw new R(10);b.Ta.unlink(b,a);Tb(c)}function tc(a,b){a=V(a,{pb:!b}).node;return kc(a.Ta.bb)(a)}function uc(a,b,c,d){nc(a,b,{mode:c&4095|b.mode&-4096,ctime:Date.now(),ac:d})}function qa(a,b){a="string"==typeof a?V(a,{pb:!0}).node:a;uc(null,a,b)} -function vc(a,b,c){if(U(b.mode))throw new R(31);if(32768!==(b.mode&61440))throw new R(28);var d=gc(b,"w");if(d)throw new R(d);nc(a,b,{size:c,timestamp:Date.now()})} -function ra(a,b,c=438){if(""===a)throw new R(44);if("string"==typeof b){var d={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090}[b];if("undefined"==typeof d)throw Error(`Unknown file open mode: ${b}`);b=d}c=b&64?c&4095|32768:0;if("object"==typeof a)d=a;else{var f=a.endsWith("/");a=V(a,{pb:!(b&131072),mc:!0});d=a.node;a=a.path}var g=!1;if(b&64)if(d){if(b&128)throw new R(20);}else{if(f)throw new R(31);d=pc(a,c|511,0);g=!0}if(!d)throw new R(44);8192===(d.mode&61440)&&(b&=-513);if(b&65536&&!U(d.mode))throw new R(54); -if(!g&&(f=d?40960===(d.mode&61440)?32:U(d.mode)&&("r"!==hc(b)||b&576)?31:gc(d,hc(b)):44))throw new R(f);b&512&&!g&&(f=d,f="string"==typeof f?V(f,{pb:!0}).node:f,vc(null,f,0));b&=-131713;f=lc({node:d,path:ka(d),flags:b,seekable:!0,position:0,Ua:d.Ua,pc:[],error:!1});f.Ua.open&&f.Ua.open(f);g&&qa(d,c&511);!l.logReadFiles||b&1||a in cc||(cc[a]=1);return f}function ta(a){if(null===a.fd)throw new R(8);a.Gb&&(a.Gb=null);try{a.Ua.close&&a.Ua.close(a)}catch(b){throw b;}finally{Yb[a.fd]=null}a.fd=null} -function wc(a,b,c){if(null===a.fd)throw new R(8);if(!a.seekable||!a.Ua.fb)throw new R(70);if(0!=c&&1!=c&&2!=c)throw new R(28);a.position=a.Ua.fb(a,b,c);a.pc=[]}function xc(a,b,c,d,f){if(0>d||0>f)throw new R(28);if(null===a.fd)throw new R(8);if(1===(a.flags&2097155))throw new R(8);if(U(a.node.mode))throw new R(31);if(!a.Ua.read)throw new R(28);var g="undefined"!=typeof f;if(!g)f=a.position;else if(!a.seekable)throw new R(70);b=a.Ua.read(a,b,c,d,f);g||(a.position+=b);return b} -function sa(a,b,c,d,f){if(0>d||0>f)throw new R(28);if(null===a.fd)throw new R(8);if(0===(a.flags&2097155))throw new R(8);if(U(a.node.mode))throw new R(31);if(!a.Ua.write)throw new R(28);a.seekable&&a.flags&1024&&wc(a,0,2);var g="undefined"!=typeof f;if(!g)f=a.position;else if(!a.seekable)throw new R(70);b=a.Ua.write(a,b,c,d,f,void 0);g||(a.position+=b);return b} -function Aa(a){var b=b||0;var c="binary";"utf8"!==c&&"binary"!==c&&Za(`Invalid encoding type "${c}"`);b=ra(a,b);a=tc(a).size;var d=new Uint8Array(a);xc(b,d,0,a,0);"utf8"===c&&(d=wb(d));ta(b);return d} -function yc(a,b,c){a=la("/dev/"+a);var d=ma(!!b,!!c);yc.Sb??(yc.Sb=64);var f=yc.Sb++<<8|0;Bb(f,{open(g){g.seekable=!1},close(){c?.buffer?.length&&c(10)},read(g,p,v,z){for(var x=0,B=0;B>2]=b.dev;I[a+4>>2]=b.mode;I[a+8>>2]=b.nlink;I[a+12>>2]=b.uid;I[a+16>>2]=b.gid;I[a+20>>2]=b.rdev;O[a+24>>3]=BigInt(b.size);H[a+32>>2]=4096;H[a+36>>2]=b.blocks;var c=b.atime.getTime(),d=b.mtime.getTime(),f=b.ctime.getTime();O[a+40>>3]=BigInt(Math.floor(c/1E3));I[a+48>>2]=c%1E3*1E6;O[a+56>>3]=BigInt(Math.floor(d/1E3));I[a+64>>2]=d%1E3*1E6;O[a+72>>3]=BigInt(Math.floor(f/1E3));I[a+80>>2]=f%1E3*1E6;O[a+88>>3]=BigInt(b.ino);return 0} -var Mc=void 0,jd=()=>{var a=H[+Mc>>2];Mc+=4;return a},kd=0,ld=[0,31,60,91,121,152,182,213,244,274,305,335],md=[0,31,59,90,120,151,181,212,243,273,304,334],nd={},od=a=>{Ta=a;nb||0{if(!Sa)try{a()}catch(b){b instanceof db||"unwind"==b||Da(1,b)}finally{if(!(nb||0{if(!rd){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(globalThis.navigator?.language?? -"C").replace("-","_")+".UTF-8",_:Ca||"./this.program"},b;for(b in qd)void 0===qd[b]?delete a[b]:a[b]=qd[b];var c=[];for(b in a)c.push(`${b}=${a[b]}`);rd=c}return rd},rd,td=(a,b,c,d)=>{var f={string:x=>{var B=0;if(null!==x&&void 0!==x&&0!==x){B=yb(x)+1;var L=ua(B);Q(x,C,L,B);B=L}return B},array:x=>{var B=ua(x.length);n.set(x,B);return B}};a=l["_"+a];var g=[],p=0;if(d)for(var v=0;v{var b=yb(a)+1,c=ha(b);c&&Q(a,C,c,b);return c},ud,vd=[],D=a=>{ud.delete(wd.get(a));wd.set(a,null);vd.push(a)},xd=a=>{const b=a.length;return[b%128|128,b>>7,...a]},yd={i:127,p:127,j:126,f:125,d:124,e:111},zd=a=>xd(Array.from(a,b=>yd[b])),G=(a,b)=>{if(!ud){ud=new WeakMap;var c=wd.length;if(ud)for(var d=0;d<0+c;d++){var f=wd.get(d);f&&ud.set(f,d)}}if(c=ud.get(a)||0)return c;c=vd.length?vd.pop():wd.grow(1);try{wd.set(c,a)}catch(g){if(!(g instanceof TypeError))throw g; -b=Uint8Array.of(0,97,115,109,1,0,0,0,1,...xd([1,96,...zd(b.slice(1)),...zd("v"===b[0]?"":b[0])]),2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0);b=new WebAssembly.Module(b);b=(new WebAssembly.Instance(b,{e:{f:a}})).exports.f;wd.set(c,b)}ud.set(a,c);return c};$b=Array(4096);oc(T,"/");X("/tmp");X("/home");X("/home/web_user"); -(function(){X("/dev");Bb(259,{read:()=>0,write:(d,f,g,p)=>p,fb:()=>0});qc("/dev/null",259);Ab(1280,Db);Ab(1536,Eb);qc("/dev/tty",1280);qc("/dev/tty1",1536);var a=new Uint8Array(1024),b=0,c=()=>{0===b&&(ub(a),b=a.byteLength);return a[--b]};yc("random",c);yc("urandom",c);X("/dev/shm");X("/dev/shm/tmp")})(); -(function(){X("/proc");var a=X("/proc/self");X("/proc/self/fd");oc({jb(){var b=Hb(a,"fd",16895,73);b.Ua={fb:T.Ua.fb};b.Ta={lookup(c,d){c=+d;var f=W(c);c={parent:null,jb:{Tb:"fake"},Ta:{readlink:()=>f.path},id:c+1};return c.parent=c},readdir(){return Array.from(Yb.entries()).filter(([,c])=>c).map(([c])=>c.toString())}};return b}},"/proc/self/fd")})();l.noExitRuntime&&(nb=l.noExitRuntime);l.print&&(Ka=l.print);l.printErr&&(Qa=l.printErr);l.wasmBinary&&(Ra=l.wasmBinary);l.thisProgram&&(Ca=l.thisProgram); -if(l.preInit)for("function"==typeof l.preInit&&(l.preInit=[l.preInit]);0xa();l.stackRestore=a=>za(a);l.stackAlloc=a=>ua(a);l.cwrap=(a,b,c,d)=>{var f=!c||c.every(g=>"number"===g||"boolean"===g);return"string"!==b&&f&&!d?l["_"+a]:(...g)=>td(a,b,c,g)};l.addFunction=G;l.removeFunction=D;l.UTF8ToString=E;l.stringToNewUTF8=ja;l.writeArrayToMemory=(a,b)=>{n.set(a,b)}; -var ha,ia,Vb,Ad,za,ua,xa,Ya,wd,Bd={a:(a,b,c,d)=>Za(`Assertion failed: ${E(a)}, at: `+[b?E(b):"unknown filename",c,d?E(d):"unknown function"]),i:function(a,b){try{return a=E(a),qa(a,b),0}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return-c.Xa}},L:function(a,b,c){try{b=E(b);b=zc(a,b);if(c&-8)return-28;var d=V(b,{pb:!0}).node;if(!d)return-44;a="";c&4&&(a+="r");c&2&&(a+="w");c&1&&(a+="x");return a&&gc(d,a)?-2:0}catch(f){if("undefined"==typeof Y||"ErrnoError"!==f.name)throw f;return-f.Xa}}, -j:function(a,b){try{var c=W(a);uc(c,c.node,b,!1);return 0}catch(d){if("undefined"==typeof Y||"ErrnoError"!==d.name)throw d;return-d.Xa}},h:function(a){try{var b=W(a);nc(b,b.node,{timestamp:Date.now(),ac:!1});return 0}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return-c.Xa}},b:function(a,b,c){Mc=c;try{var d=W(a);switch(b){case 0:var f=jd();if(0>f)break;for(;Yb[f];)f++;return mc(d,f).fd;case 1:case 2:return 0;case 3:return d.flags;case 4:return f=jd(),d.flags|=f,0;case 12:return f= -jd(),Ua[f+0>>1]=2,0;case 13:case 14:return 0}return-28}catch(g){if("undefined"==typeof Y||"ErrnoError"!==g.name)throw g;return-g.Xa}},g:function(a,b){try{var c=W(a),d=c.node,f=c.Ua.bb;a=f?c:d;f??=d.Ta.bb;kc(f);var g=f(a);return Ac(b,g)}catch(p){if("undefined"==typeof Y||"ErrnoError"!==p.name)throw p;return-p.Xa}},H:function(a,b){b=-9007199254740992>b||9007199254740992b||0===(c.flags&2097155))throw new R(28);vc(c,c.node,b);return 0}catch(d){if("undefined"== -typeof Y||"ErrnoError"!==d.name)throw d;return-d.Xa}},G:function(a,b){try{if(0===b)return-28;var c=yb("/")+1;if(b=d)return-28;var f=V(b).node;if(!f)throw new R(44);if(!f.Ta.readlink)throw new R(28);var g=f.Ta.readlink(f);var p=Math.min(d,yb(g)),v=n[c+p]; -Q(g,C,c,d+1);n[c+p]=v;return p}catch(z){if("undefined"==typeof Y||"ErrnoError"!==z.name)throw z;return-z.Xa}},u:function(a){try{return a=E(a),sc(a),0}catch(b){if("undefined"==typeof Y||"ErrnoError"!==b.name)throw b;return-b.Xa}},f:function(a,b){try{return a=E(a),Ac(b,tc(a))}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return-c.Xa}},r:function(a,b,c){try{b=E(b);b=zc(a,b);if(c)if(512===c)sc(b);else return-28;else Ba(b);return 0}catch(d){if("undefined"==typeof Y||"ErrnoError"!==d.name)throw d; -return-d.Xa}},q:function(a,b,c){try{b=E(b);b=zc(a,b,!0);var d=Date.now(),f,g;if(c){var p=I[c>>2]+4294967296*H[c+4>>2],v=H[c+8>>2];1073741823==v?f=d:1073741822==v?f=null:f=1E3*p+v/1E6;c+=16;p=I[c>>2]+4294967296*H[c+4>>2];v=H[c+8>>2];1073741823==v?g=d:1073741822==v?g=null:g=1E3*p+v/1E6}else g=f=d;if(null!==(g??f)){a=f;var z=V(b,{pb:!0}).node;kc(z.Ta.eb)(z,{atime:a,mtime:g})}return 0}catch(x){if("undefined"==typeof Y||"ErrnoError"!==x.name)throw x;return-x.Xa}},m:()=>Za(""),l:()=>{nb=!1;kd=0},A:function(a, -b){a=-9007199254740992>a||9007199254740992>2]=a.getSeconds();H[b+4>>2]=a.getMinutes();H[b+8>>2]=a.getHours();H[b+12>>2]=a.getDate();H[b+16>>2]=a.getMonth();H[b+20>>2]=a.getFullYear()-1900;H[b+24>>2]=a.getDay();var c=a.getFullYear();H[b+28>>2]=(0!==c%4||0===c%100&&0!==c%400?md:ld)[a.getMonth()]+a.getDate()-1|0;H[b+36>>2]=-(60*a.getTimezoneOffset());c=(new Date(a.getFullYear(),6,1)).getTimezoneOffset();var d=(new Date(a.getFullYear(),0,1)).getTimezoneOffset(); -H[b+32>>2]=(c!=d&&a.getTimezoneOffset()==Math.min(d,c))|0},y:function(a,b,c,d,f,g,p){f=-9007199254740992>f||9007199254740992>2]=z.Ub;I[p>>2]=x;return 0}catch(B){if("undefined"==typeof Y||"ErrnoError"!==B.name)throw B;return-B.Xa}},z:function(a,b,c,d,f,g){g=-9007199254740992>g|| -9007199254740992{nd[a]&&(clearTimeout(nd[a].id),delete nd[a]);if(!b)return 0;var c=setTimeout(()=>{delete nd[a];pd(()=>Ad(a,performance.now()))},b);nd[a]={id:c,Dc:b};return 0},B:(a,b,c,d)=>{var f=(new Date).getFullYear(),g=(new Date(f,0,1)).getTimezoneOffset(); -f=(new Date(f,6,1)).getTimezoneOffset();I[a>>2]=60*Math.max(g,f);H[b>>2]=Number(g!=f);b=p=>{var v=Math.abs(p);return`UTC${0<=p?"-":"+"}${String(Math.floor(v/60)).padStart(2,"0")}${String(v%60).padStart(2,"0")}`};a=b(g);b=b(f);fDate.now(),s:()=>2147483648,c:()=>performance.now(),o:a=>{var b=C.length;a>>>=0;if(2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);a:{d=(Math.min(2147483648,65536*Math.ceil(Math.max(a, -d)/65536))-Ya.buffer.byteLength+65535)/65536|0;try{Ya.grow(d);Xa();var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},E:(a,b)=>{var c=0,d=0,f;for(f of sd()){var g=b+c;I[a+d>>2]=g;c+=Q(f,C,g,Infinity)+1;d+=4}return 0},F:(a,b)=>{var c=sd();I[a>>2]=c.length;a=0;for(var d of c)a+=yb(d)+1;I[b>>2]=a;return 0},e:function(a){try{var b=W(a);ta(b);return 0}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return c.Xa}},p:function(a,b){try{var c=W(a);n[b]=c.tty?2:U(c.mode)?3:40960===(c.mode& -61440)?7:4;Ua[b+2>>1]=0;O[b+8>>3]=BigInt(0);O[b+16>>3]=BigInt(0);return 0}catch(d){if("undefined"==typeof Y||"ErrnoError"!==d.name)throw d;return d.Xa}},w:function(a,b,c,d){try{a:{var f=W(a);a=b;for(var g,p=b=0;p>2],z=I[a+4>>2];a+=8;var x=xc(f,n,v,z,g);if(0>x){var B=-1;break a}b+=x;if(x>2]=B;return 0}catch(L){if("undefined"==typeof Y||"ErrnoError"!==L.name)throw L;return L.Xa}},D:function(a,b,c,d){b=-9007199254740992>b||9007199254740992< -b?NaN:Number(b);try{if(isNaN(b))return 61;var f=W(a);wc(f,b,c);O[d>>3]=BigInt(f.position);f.Gb&&0===b&&0===c&&(f.Gb=null);return 0}catch(g){if("undefined"==typeof Y||"ErrnoError"!==g.name)throw g;return g.Xa}},I:function(a){try{var b=W(a);return b.Ua?.fsync?.(b)}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return c.Xa}},t:function(a,b,c,d){try{a:{var f=W(a);a=b;for(var g,p=b=0;p>2],z=I[a+4>>2];a+=8;var x=sa(f,n,v,z,g);if(0>x){var B=-1;break a}b+=x;if(x>2]=B;return 0}catch(L){if("undefined"==typeof Y||"ErrnoError"!==L.name)throw L;return L.Xa}},k:od}; -function Cd(){function a(){l.calledRun=!0;if(!Sa){if(!l.noFSInit&&!ac){var b,c;ac=!0;b??=l.stdin;c??=l.stdout;d??=l.stderr;b?yc("stdin",b):rc("/dev/tty","/dev/stdin");c?yc("stdout",null,c):rc("/dev/tty","/dev/stdout");d?yc("stderr",null,d):rc("/dev/tty1","/dev/stderr");ra("/dev/stdin",0);ra("/dev/stdout",1);ra("/dev/stderr",1)}Dd.N();bc=!1;l.onRuntimeInitialized?.();if(l.postRun)for("function"==typeof l.postRun&&(l.postRun=[l.postRun]);l.postRun.length;){var d=l.postRun.shift();fb.push(d)}eb(fb)}} -if(0{setTimeout(()=>l.setStatus(""),1);a()},1)):a()}}var Dd; -(async function(){function a(c){c=Dd=c.exports;l._sqlite3_free=c.P;l._sqlite3_value_text=c.Q;l._sqlite3_prepare_v2=c.R;l._sqlite3_step=c.S;l._sqlite3_reset=c.T;l._sqlite3_exec=c.U;l._sqlite3_finalize=c.V;l._sqlite3_column_name=c.W;l._sqlite3_column_text=c.X;l._sqlite3_column_type=c.Y;l._sqlite3_errmsg=c.Z;l._sqlite3_clear_bindings=c._;l._sqlite3_value_blob=c.$;l._sqlite3_value_bytes=c.aa;l._sqlite3_value_double=c.ba;l._sqlite3_value_int=c.ca;l._sqlite3_value_type=c.da;l._sqlite3_result_blob=c.ea; -l._sqlite3_result_double=c.fa;l._sqlite3_result_error=c.ga;l._sqlite3_result_int=c.ha;l._sqlite3_result_int64=c.ia;l._sqlite3_result_null=c.ja;l._sqlite3_result_text=c.ka;l._sqlite3_aggregate_context=c.la;l._sqlite3_column_count=c.ma;l._sqlite3_data_count=c.na;l._sqlite3_column_blob=c.oa;l._sqlite3_column_bytes=c.pa;l._sqlite3_column_double=c.qa;l._sqlite3_bind_blob=c.ra;l._sqlite3_bind_double=c.sa;l._sqlite3_bind_int=c.ta;l._sqlite3_bind_text=c.ua;l._sqlite3_bind_parameter_index=c.va;l._sqlite3_sql= -c.wa;l._sqlite3_normalized_sql=c.xa;l._sqlite3_changes=c.ya;l._sqlite3_close_v2=c.za;l._sqlite3_progress_handler=c.Aa;l._sqlite3_interrupt=c.Ba;l._sqlite3_create_function_v2=c.Ca;l._sqlite3_update_hook=c.Da;l._sqlite3_open=c.Ea;l._sqlite3_get_autocommit=c.Fa;ha=l._malloc=c.Ga;ia=l._free=c.Ha;l._RegisterExtensionFunctions=c.Ia;l._sqljs_vfs_register=c.Ja;l._sqljs_open_paged=c.Ka;l._sqljs_vfs_register_rw=c.La;l._sqljs_open_paged_rw=c.Ma;l._sqlite_explorer_register_query_plan=c.Na;Vb=c.Oa;Ad=c.Pa;za= -c.Qa;ua=c.Ra;xa=c.Sa;Ya=c.M;wd=c.O;Xa();lb--;l.monitorRunDependencies?.(lb);0==lb&&mb&&(c=mb,mb=null,c());return Dd}lb++;l.monitorRunDependencies?.(lb);var b={a:Bd};if(l.instantiateWasm)return new Promise(c=>{l.instantiateWasm(b,(d,f)=>{c(a(d,f))})});$a??=l.locateFile?l.locateFile("sql-wasm.wasm",Fa):Fa+"sql-wasm.wasm";return a((await cb(b)).instance)})();Cd(); +function V(a,b={}){if(!a)throw new S(44);b.Fb??(b.Fb=!0);"/"===a.charAt(0)||(a="//"+a);var c=0;a:for(;40>c;c++){a=a.split("/").filter(v=>!!v);for(var d=Yb,f="/",h=0;h>>0)%bc.length} +function Vb(a){var b=hc(a.parent.id,a.name);if(bc[b]===a)bc[b]=a.rb;else for(b=bc[b];b;){if(b.rb===a){b.rb=a.rb;break}b=b.rb}}function Ib(a,b){var c=U(a.mode)?(c=ic(a,"x"))?c:a.Ta.lookup?0:2:54;if(c)throw new S(c);for(c=bc[hc(a.id,b)];c;c=c.rb){var d=c.name;if(c.parent.id===a.id&&d===b)return c}return a.Ta.lookup(a,b)}function Hb(a,b,c,d){a=new gc(a,b,c,d);b=hc(a.parent.id,a.name);a.rb=bc[b];return bc[b]=a}function U(a){return 16384===(a&61440)} +function jc(a){var b=["r","w","rw"][a&3];a&512&&(b+="w");return b}function ic(a,b){if(dc)return 0;if(!b.includes("r")||a.mode&292){if(b.includes("w")&&!(a.mode&146)||b.includes("x")&&!(a.mode&73))return 2}else return 2;return 0}function kc(a,b){if(!U(a.mode))return 54;try{return Ib(a,b),20}catch(c){}return ic(a,"wx")} +function lc(a,b,c){try{var d=Ib(a,b)}catch(f){return f.Xa}if(a=ic(a,"wx"))return a;if(c){if(!U(d.mode))return 54;if(d===d.parent||"/"===ka(d))return 10}else if(U(d.mode))return 31;return 0}function mc(a){if(!a)throw new S(63);return a}function W(a){a=$b[a];if(!a)throw new S(8);return a}function nc(a,b=-1){a=Object.assign(new fc,a);if(-1==b)a:{for(b=0;4096>=b;b++)if(!$b[b])break a;throw new S(33);}a.fd=b;return $b[b]=a}function oc(a,b=-1){a=nc(a,b);a.Ua?.wc?.(a);return a} +function pc(a,b,c){var d=a?.Ua.eb;a=d?a:b;d??=b.Ta.eb;mc(d);d(a,c)}var Eb={open(a){a.Ua=Zb[a.node.rdev].Ua;a.Ua.open?.(a)},gb(){throw new S(70);}};function Ab(a,b){Zb[a]={Ua:b}}function qc(a,b){var c="/"===b;if(c&&Yb)throw new S(10);if(!c&&b){var d=V(b,{Fb:!1});b=d.path;d=d.node;if(d.qb)throw new S(10);if(!U(d.mode))throw new S(54);}b={type:a,Cc:{},Tb:b,lc:[]};a=a.kb(b);a.kb=b;b.root=a;c?Yb=a:d&&(d.qb=b,d.kb&&d.kb.lc.push(b))} +function rc(a,b,c){var d=V(a,{parent:!0}).node;a=rb(a);if(!a)throw new S(28);if("."===a||".."===a)throw new S(20);var f=kc(d,a);if(f)throw new S(f);if(!d.Ta.yb)throw new S(63);return d.Ta.yb(d,a,b,c)}function na(a,b=438){return rc(a,b&4095|32768,0)}function X(a,b=511){return rc(a,b&1023|16384,0)}function sc(a,b,c){"undefined"==typeof c&&(c=b,b=438);rc(a,b|8192,c)} +function tc(a,b){if(!ub(a))throw new S(44);var c=V(b,{parent:!0}).node;if(!c)throw new S(44);b=rb(b);var d=kc(c,b);if(d)throw new S(d);if(!c.Ta.symlink)throw new S(63);c.Ta.symlink(c,b,a)}function uc(a){var b=V(a,{parent:!0}).node;a=rb(a);var c=Ib(b,a),d=lc(b,a,!0);if(d)throw new S(d);if(!b.Ta.rmdir)throw new S(63);if(c.qb)throw new S(10);b.Ta.rmdir(b,a);Vb(c)} +function Ba(a){var b=V(a,{parent:!0}).node;if(!b)throw new S(44);a=rb(a);var c=Ib(b,a),d=lc(b,a,!1);if(d)throw new S(d);if(!b.Ta.unlink)throw new S(63);if(c.qb)throw new S(10);b.Ta.unlink(b,a);Vb(c)}function vc(a,b){a=V(a,{pb:!b}).node;return mc(a.Ta.bb)(a)}function wc(a,b,c,d){pc(a,b,{mode:c&4095|b.mode&-4096,ctime:Date.now(),ac:d})}function oa(a,b){a="string"==typeof a?V(a,{pb:!0}).node:a;wc(null,a,b)} +function xc(a,b,c){if(U(b.mode))throw new S(31);if(32768!==(b.mode&61440))throw new S(28);var d=ic(b,"w");if(d)throw new S(d);pc(a,b,{size:c,timestamp:Date.now()})} +function pa(a,b,c=438){if(""===a)throw new S(44);if("string"==typeof b){var d={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090}[b];if("undefined"==typeof d)throw Error(`Unknown file open mode: ${b}`);b=d}c=b&64?c&4095|32768:0;if("object"==typeof a)d=a;else{var f=a.endsWith("/");a=V(a,{pb:!(b&131072),mc:!0});d=a.node;a=a.path}var h=!1;if(b&64)if(d){if(b&128)throw new S(20);}else{if(f)throw new S(31);d=rc(a,c|511,0);h=!0}if(!d)throw new S(44);8192===(d.mode&61440)&&(b&=-513);if(b&65536&&!U(d.mode))throw new S(54); +if(!h&&(f=d?40960===(d.mode&61440)?32:U(d.mode)&&("r"!==jc(b)||b&576)?31:ic(d,jc(b)):44))throw new S(f);b&512&&!h&&(f=d,f="string"==typeof f?V(f,{pb:!0}).node:f,xc(null,f,0));b&=-131713;f=nc({node:d,path:ka(d),flags:b,seekable:!0,position:0,Ua:d.Ua,pc:[],error:!1});f.Ua.open&&f.Ua.open(f);h&&oa(d,c&511);!m.logReadFiles||b&1||a in ec||(ec[a]=1);return f}function ta(a){if(null===a.fd)throw new S(8);a.Gb&&(a.Gb=null);try{a.Ua.close&&a.Ua.close(a)}catch(b){throw b;}finally{$b[a.fd]=null}a.fd=null} +function yc(a,b,c){if(null===a.fd)throw new S(8);if(!a.seekable||!a.Ua.gb)throw new S(70);if(0!=c&&1!=c&&2!=c)throw new S(28);a.position=a.Ua.gb(a,b,c);a.pc=[]}function zc(a,b,c,d,f){if(0>d||0>f)throw new S(28);if(null===a.fd)throw new S(8);if(1===(a.flags&2097155))throw new S(8);if(U(a.node.mode))throw new S(31);if(!a.Ua.read)throw new S(28);var h="undefined"!=typeof f;if(!h)f=a.position;else if(!a.seekable)throw new S(70);b=a.Ua.read(a,b,c,d,f);h||(a.position+=b);return b} +function sa(a,b,c,d,f){if(0>d||0>f)throw new S(28);if(null===a.fd)throw new S(8);if(0===(a.flags&2097155))throw new S(8);if(U(a.node.mode))throw new S(31);if(!a.Ua.write)throw new S(28);a.seekable&&a.flags&1024&&yc(a,0,2);var h="undefined"!=typeof f;if(!h)f=a.position;else if(!a.seekable)throw new S(70);b=a.Ua.write(a,b,c,d,f,void 0);h||(a.position+=b);return b} +function Aa(a){var b=b||0;var c="binary";"utf8"!==c&&"binary"!==c&&Ya(`Invalid encoding type "${c}"`);b=pa(a,b);a=vc(a).size;var d=new Uint8Array(a);zc(b,d,0,a,0);"utf8"===c&&(d=vb(d));ta(b);return d} +function Ac(a,b,c){a=la("/dev/"+a);var d=ma(!!b,!!c);Ac.Sb??(Ac.Sb=64);var f=Ac.Sb++<<8|0;Ab(f,{open(h){h.seekable=!1},close(){c?.buffer?.length&&c(10)},read(h,l,v,z){for(var x=0,A=0;A>2]=b.dev;K[a+4>>2]=b.mode;K[a+8>>2]=b.nlink;K[a+12>>2]=b.uid;K[a+16>>2]=b.gid;K[a+20>>2]=b.rdev;P[a+24>>3]=BigInt(b.size);H[a+32>>2]=4096;H[a+36>>2]=b.blocks;var c=b.atime.getTime(),d=b.mtime.getTime(),f=b.ctime.getTime();P[a+40>>3]=BigInt(Math.floor(c/1E3));K[a+48>>2]=c%1E3*1E6;P[a+56>>3]=BigInt(Math.floor(d/1E3));K[a+64>>2]=d%1E3*1E6;P[a+72>>3]=BigInt(Math.floor(f/1E3));K[a+80>>2]=f%1E3*1E6;P[a+88>>3]=BigInt(b.ino);return 0} +var Oc=void 0,ld=()=>{var a=H[+Oc>>2];Oc+=4;return a},md=0,nd=[0,31,60,91,121,152,182,213,244,274,305,335],od=[0,31,59,90,120,151,181,212,243,273,304,334],pd={},qd=a=>{Sa=a;mb||0{if(!Ra)try{a()}catch(b){b instanceof cb||"unwind"==b||Da(1,b)}finally{if(!(mb||0{if(!td){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(globalThis.navigator?.language?? +"C").replace("-","_")+".UTF-8",_:Ca||"./this.program"},b;for(b in sd)void 0===sd[b]?delete a[b]:a[b]=sd[b];var c=[];for(b in a)c.push(`${b}=${a[b]}`);td=c}return td},td,vd=(a,b,c,d)=>{var f={string:x=>{var A=0;if(null!==x&&void 0!==x&&0!==x){A=xb(x)+1;var N=ua(A);R(x,C,N,A);A=N}return A},array:x=>{var A=ua(x.length);p.set(x,A);return A}};a=m["_"+a];var h=[],l=0;if(d)for(var v=0;v{var b=xb(a)+1,c=fa(b);c&&R(a,C,c,b);return c},wd,xd=[],B=a=>{wd.delete(yd.get(a));yd.set(a,null);xd.push(a)},zd=a=>{const b=a.length;return[b%128|128,b>>7,...a]},Ad={i:127,p:127,j:126,f:125,d:124,e:111},Bd=a=>zd(Array.from(a,b=>Ad[b])),G=(a,b)=>{if(!wd){wd=new WeakMap;var c=yd.length;if(wd)for(var d=0;d<0+c;d++){var f=yd.get(d);f&&wd.set(f,d)}}if(c=wd.get(a)||0)return c;c=xd.length?xd.pop():yd.grow(1);try{yd.set(c,a)}catch(h){if(!(h instanceof TypeError))throw h; +b=Uint8Array.of(0,97,115,109,1,0,0,0,1,...zd([1,96,...Bd(b.slice(1)),...Bd("v"===b[0]?"":b[0])]),2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0);b=new WebAssembly.Module(b);b=(new WebAssembly.Instance(b,{e:{f:a}})).exports.f;yd.set(c,b)}wd.set(a,c);return c};bc=Array(4096);qc(T,"/");X("/tmp");X("/home");X("/home/web_user"); +(function(){X("/dev");Ab(259,{read:()=>0,write:(d,f,h,l)=>l,gb:()=>0});sc("/dev/null",259);zb(1280,Cb);zb(1536,Db);sc("/dev/tty",1280);sc("/dev/tty1",1536);var a=new Uint8Array(1024),b=0,c=()=>{0===b&&(tb(a),b=a.byteLength);return a[--b]};Ac("random",c);Ac("urandom",c);X("/dev/shm");X("/dev/shm/tmp")})(); +(function(){X("/proc");var a=X("/proc/self");X("/proc/self/fd");qc({kb(){var b=Hb(a,"fd",16895,73);b.Ua={gb:T.Ua.gb};b.Ta={lookup(c,d){c=+d;var f=W(c);c={parent:null,kb:{Tb:"fake"},Ta:{readlink:()=>f.path},id:c+1};return c.parent=c},readdir(){return Array.from($b.entries()).filter(([,c])=>c).map(([c])=>c.toString())}};return b}},"/proc/self/fd")})();m.noExitRuntime&&(mb=m.noExitRuntime);m.print&&(Ja=m.print);m.printErr&&(Pa=m.printErr);m.wasmBinary&&(Qa=m.wasmBinary);m.thisProgram&&(Ca=m.thisProgram); +if(m.preInit)for("function"==typeof m.preInit&&(m.preInit=[m.preInit]);0va();m.stackRestore=a=>za(a);m.stackAlloc=a=>ua(a);m.cwrap=(a,b,c,d)=>{var f=!c||c.every(h=>"number"===h||"boolean"===h);return"string"!==b&&f&&!d?m["_"+a]:(...h)=>vd(a,b,c,h)};m.addFunction=G;m.removeFunction=B;m.UTF8ToString=F;m.stringToNewUTF8=ja;m.writeArrayToMemory=(a,b)=>{p.set(a,b)}; +var fa,ia,Xb,Cd,za,ua,va,Xa,yd,Dd={a:(a,b,c,d)=>Ya(`Assertion failed: ${F(a)}, at: `+[b?F(b):"unknown filename",c,d?F(d):"unknown function"]),i:function(a,b){try{return a=F(a),oa(a,b),0}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return-c.Xa}},L:function(a,b,c){try{b=F(b);b=Bc(a,b);if(c&-8)return-28;var d=V(b,{pb:!0}).node;if(!d)return-44;a="";c&4&&(a+="r");c&2&&(a+="w");c&1&&(a+="x");return a&&ic(d,a)?-2:0}catch(f){if("undefined"==typeof Y||"ErrnoError"!==f.name)throw f;return-f.Xa}}, +j:function(a,b){try{var c=W(a);wc(c,c.node,b,!1);return 0}catch(d){if("undefined"==typeof Y||"ErrnoError"!==d.name)throw d;return-d.Xa}},h:function(a){try{var b=W(a);pc(b,b.node,{timestamp:Date.now(),ac:!1});return 0}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return-c.Xa}},b:function(a,b,c){Oc=c;try{var d=W(a);switch(b){case 0:var f=ld();if(0>f)break;for(;$b[f];)f++;return oc(d,f).fd;case 1:case 2:return 0;case 3:return d.flags;case 4:return f=ld(),d.flags|=f,0;case 12:return f= +ld(),Ta[f+0>>1]=2,0;case 13:case 14:return 0}return-28}catch(h){if("undefined"==typeof Y||"ErrnoError"!==h.name)throw h;return-h.Xa}},g:function(a,b){try{var c=W(a),d=c.node,f=c.Ua.bb;a=f?c:d;f??=d.Ta.bb;mc(f);var h=f(a);return Cc(b,h)}catch(l){if("undefined"==typeof Y||"ErrnoError"!==l.name)throw l;return-l.Xa}},H:function(a,b){b=-9007199254740992>b||9007199254740992b||0===(c.flags&2097155))throw new S(28);xc(c,c.node,b);return 0}catch(d){if("undefined"== +typeof Y||"ErrnoError"!==d.name)throw d;return-d.Xa}},G:function(a,b){try{if(0===b)return-28;var c=xb("/")+1;if(b=d)return-28;var f=V(b).node;if(!f)throw new S(44);if(!f.Ta.readlink)throw new S(28);var h=f.Ta.readlink(f);var l=Math.min(d,xb(h)),v=p[c+l]; +R(h,C,c,d+1);p[c+l]=v;return l}catch(z){if("undefined"==typeof Y||"ErrnoError"!==z.name)throw z;return-z.Xa}},u:function(a){try{return a=F(a),uc(a),0}catch(b){if("undefined"==typeof Y||"ErrnoError"!==b.name)throw b;return-b.Xa}},f:function(a,b){try{return a=F(a),Cc(b,vc(a))}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return-c.Xa}},r:function(a,b,c){try{b=F(b);b=Bc(a,b);if(c)if(512===c)uc(b);else return-28;else Ba(b);return 0}catch(d){if("undefined"==typeof Y||"ErrnoError"!==d.name)throw d; +return-d.Xa}},q:function(a,b,c){try{b=F(b);b=Bc(a,b,!0);var d=Date.now(),f,h;if(c){var l=K[c>>2]+4294967296*H[c+4>>2],v=H[c+8>>2];1073741823==v?f=d:1073741822==v?f=null:f=1E3*l+v/1E6;c+=16;l=K[c>>2]+4294967296*H[c+4>>2];v=H[c+8>>2];1073741823==v?h=d:1073741822==v?h=null:h=1E3*l+v/1E6}else h=f=d;if(null!==(h??f)){a=f;var z=V(b,{pb:!0}).node;mc(z.Ta.eb)(z,{atime:a,mtime:h})}return 0}catch(x){if("undefined"==typeof Y||"ErrnoError"!==x.name)throw x;return-x.Xa}},m:()=>Ya(""),l:()=>{mb=!1;md=0},A:function(a, +b){a=-9007199254740992>a||9007199254740992>2]=a.getSeconds();H[b+4>>2]=a.getMinutes();H[b+8>>2]=a.getHours();H[b+12>>2]=a.getDate();H[b+16>>2]=a.getMonth();H[b+20>>2]=a.getFullYear()-1900;H[b+24>>2]=a.getDay();var c=a.getFullYear();H[b+28>>2]=(0!==c%4||0===c%100&&0!==c%400?od:nd)[a.getMonth()]+a.getDate()-1|0;H[b+36>>2]=-(60*a.getTimezoneOffset());c=(new Date(a.getFullYear(),6,1)).getTimezoneOffset();var d=(new Date(a.getFullYear(),0,1)).getTimezoneOffset(); +H[b+32>>2]=(c!=d&&a.getTimezoneOffset()==Math.min(d,c))|0},y:function(a,b,c,d,f,h,l){f=-9007199254740992>f||9007199254740992>2]=z.Ub;K[l>>2]=x;return 0}catch(A){if("undefined"==typeof Y||"ErrnoError"!==A.name)throw A;return-A.Xa}},z:function(a,b,c,d,f,h){h=-9007199254740992>h|| +9007199254740992{pd[a]&&(clearTimeout(pd[a].id),delete pd[a]);if(!b)return 0;var c=setTimeout(()=>{delete pd[a];rd(()=>Cd(a,performance.now()))},b);pd[a]={id:c,Dc:b};return 0},B:(a,b,c,d)=>{var f=(new Date).getFullYear(),h=(new Date(f,0,1)).getTimezoneOffset(); +f=(new Date(f,6,1)).getTimezoneOffset();K[a>>2]=60*Math.max(h,f);H[b>>2]=Number(h!=f);b=l=>{var v=Math.abs(l);return`UTC${0<=l?"-":"+"}${String(Math.floor(v/60)).padStart(2,"0")}${String(v%60).padStart(2,"0")}`};a=b(h);b=b(f);fDate.now(),s:()=>2147483648,c:()=>performance.now(),o:a=>{var b=C.length;a>>>=0;if(2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);a:{d=(Math.min(2147483648,65536*Math.ceil(Math.max(a, +d)/65536))-Xa.buffer.byteLength+65535)/65536|0;try{Xa.grow(d);Wa();var f=1;break a}catch(h){}f=void 0}if(f)return!0}return!1},E:(a,b)=>{var c=0,d=0,f;for(f of ud()){var h=b+c;K[a+d>>2]=h;c+=R(f,C,h,Infinity)+1;d+=4}return 0},F:(a,b)=>{var c=ud();K[a>>2]=c.length;a=0;for(var d of c)a+=xb(d)+1;K[b>>2]=a;return 0},e:function(a){try{var b=W(a);ta(b);return 0}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return c.Xa}},p:function(a,b){try{var c=W(a);p[b]=c.tty?2:U(c.mode)?3:40960===(c.mode& +61440)?7:4;Ta[b+2>>1]=0;P[b+8>>3]=BigInt(0);P[b+16>>3]=BigInt(0);return 0}catch(d){if("undefined"==typeof Y||"ErrnoError"!==d.name)throw d;return d.Xa}},w:function(a,b,c,d){try{a:{var f=W(a);a=b;for(var h,l=b=0;l>2],z=K[a+4>>2];a+=8;var x=zc(f,p,v,z,h);if(0>x){var A=-1;break a}b+=x;if(x>2]=A;return 0}catch(N){if("undefined"==typeof Y||"ErrnoError"!==N.name)throw N;return N.Xa}},D:function(a,b,c,d){b=-9007199254740992>b||9007199254740992< +b?NaN:Number(b);try{if(isNaN(b))return 61;var f=W(a);yc(f,b,c);P[d>>3]=BigInt(f.position);f.Gb&&0===b&&0===c&&(f.Gb=null);return 0}catch(h){if("undefined"==typeof Y||"ErrnoError"!==h.name)throw h;return h.Xa}},I:function(a){try{var b=W(a);return b.Ua?.fsync?.(b)}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return c.Xa}},t:function(a,b,c,d){try{a:{var f=W(a);a=b;for(var h,l=b=0;l>2],z=K[a+4>>2];a+=8;var x=sa(f,p,v,z,h);if(0>x){var A=-1;break a}b+=x;if(x>2]=A;return 0}catch(N){if("undefined"==typeof Y||"ErrnoError"!==N.name)throw N;return N.Xa}},k:qd}; +function Ed(){function a(){m.calledRun=!0;if(!Ra){if(!m.noFSInit&&!cc){var b,c;cc=!0;b??=m.stdin;c??=m.stdout;d??=m.stderr;b?Ac("stdin",b):tc("/dev/tty","/dev/stdin");c?Ac("stdout",null,c):tc("/dev/tty","/dev/stdout");d?Ac("stderr",null,d):tc("/dev/tty1","/dev/stderr");pa("/dev/stdin",0);pa("/dev/stdout",1);pa("/dev/stderr",1)}Fd.N();dc=!1;m.onRuntimeInitialized?.();if(m.postRun)for("function"==typeof m.postRun&&(m.postRun=[m.postRun]);m.postRun.length;){var d=m.postRun.shift();eb.push(d)}db(eb)}} +if(0{setTimeout(()=>m.setStatus(""),1);a()},1)):a()}}var Fd; +(async function(){function a(c){c=Fd=c.exports;m._sqlite3_free=c.P;m._sqlite3_value_text=c.Q;m._sqlite3_prepare_v2=c.R;m._sqlite3_step=c.S;m._sqlite3_reset=c.T;m._sqlite3_exec=c.U;m._sqlite3_finalize=c.V;m._sqlite3_column_name=c.W;m._sqlite3_column_text=c.X;m._sqlite3_column_type=c.Y;m._sqlite3_errmsg=c.Z;m._sqlite3_clear_bindings=c._;m._sqlite3_value_blob=c.$;m._sqlite3_value_bytes=c.aa;m._sqlite3_value_double=c.ba;m._sqlite3_value_int=c.ca;m._sqlite3_value_type=c.da;m._sqlite3_result_blob=c.ea; +m._sqlite3_result_double=c.fa;m._sqlite3_result_error=c.ga;m._sqlite3_result_int=c.ha;m._sqlite3_result_int64=c.ia;m._sqlite3_result_null=c.ja;m._sqlite3_result_text=c.ka;m._sqlite3_aggregate_context=c.la;m._sqlite3_column_count=c.ma;m._sqlite3_data_count=c.na;m._sqlite3_column_blob=c.oa;m._sqlite3_column_bytes=c.pa;m._sqlite3_column_double=c.qa;m._sqlite3_bind_blob=c.ra;m._sqlite3_bind_double=c.sa;m._sqlite3_bind_int=c.ta;m._sqlite3_bind_text=c.ua;m._sqlite3_bind_parameter_index=c.va;m._sqlite3_sql= +c.wa;m._sqlite3_normalized_sql=c.xa;m._sqlite3_changes=c.ya;m._sqlite3_close_v2=c.za;m._sqlite3_progress_handler=c.Aa;m._sqlite3_interrupt=c.Ba;m._sqlite3_create_function_v2=c.Ca;m._sqlite3_update_hook=c.Da;m._sqlite3_open=c.Ea;m._sqlite3_get_autocommit=c.Fa;fa=m._malloc=c.Ga;ia=m._free=c.Ha;m._RegisterExtensionFunctions=c.Ia;m._sqljs_vfs_register=c.Ja;m._sqljs_open_paged=c.Ka;m._sqljs_vfs_register_rw=c.La;m._sqljs_open_paged_rw=c.Ma;m._sqlite_explorer_register_query_plan=c.Na;Xb=c.Oa;Cd=c.Pa;za= +c.Qa;ua=c.Ra;va=c.Sa;Xa=c.M;yd=c.O;Wa();kb--;m.monitorRunDependencies?.(kb);0==kb&&lb&&(c=lb,lb=null,c());return Fd}kb++;m.monitorRunDependencies?.(kb);var b={a:Dd};if(m.instantiateWasm)return new Promise(c=>{m.instantiateWasm(b,(d,f)=>{c(a(d,f))})});Za??=m.locateFile?m.locateFile("sql-wasm.wasm",Fa):Fa+"sql-wasm.wasm";return a((await bb(b)).instance)})();Ed(); // The shell-pre.js and emcc-generated code goes above diff --git a/vendor/sql.js/sql-wasm.wasm b/vendor/sql.js/sql-wasm.wasm index 4731f026..a5030fd0 100644 Binary files a/vendor/sql.js/sql-wasm.wasm and b/vendor/sql.js/sql-wasm.wasm differ diff --git a/website/package-lock.json b/website/package-lock.json index 732bd993..a2452edb 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -10,20 +10,20 @@ "dependencies": { "@vercel/analytics": "^2.0.1", "@vercel/speed-insights": "^2.0.0", - "lucide-react": "^1.45.0", - "next": "^16.3.5", - "react": "^19.3.0", - "react-dom": "^19.3.0" + "lucide-react": "^1.58.0", + "next": "^16.4.2", + "react": "^19.3.1", + "react-dom": "^19.3.1" }, "devDependencies": { "@eslint/compat": "^2.1.1", "@tailwindcss/postcss": "^4.3.3", - "@types/node": "^26.5.1", + "@types/node": "^26.6.5", "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0", - "eslint": "^10.10.0", - "eslint-config-next": "^16.3.5", - "postcss": "^8.5.28", + "eslint": "^10.13.0", + "eslint-config-next": "^16.4.2", + "postcss": "^8.5.30", "tailwindcss": "^4.3.3", "typescript": "^6.0.3" } @@ -72,6 +72,7 @@ "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -305,29 +306,6 @@ "keyv": "^5.6.0" } }, - "node_modules/@emnapi/core": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", - "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.3", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", - "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@emnapi/wasi-threads": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", @@ -335,7 +313,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -1132,15 +1109,15 @@ } }, "node_modules/@next/env": { - "version": "16.3.5", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.3.5.tgz", - "integrity": "sha512-NWEXVDMqoEo0ktmU6u0sE2Vg0LOcsD7NnOTJNo3/fEaTfsg+F1bMIxuDmQbda4e3yTIQwVdUREF2yIuMOusKtg==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.4.2.tgz", + "integrity": "sha512-nTUTFH7G5/J/fmpkjVLegOkqyKOP0CEsJcMsyO4UCYeN1su+YMW/MfaSErnJskL7XM+UDK6aTvslxsRCyya/sA==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { - "version": "16.3.5", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.3.5.tgz", - "integrity": "sha512-PGfSeItHJ12DH8t+6sEbuMe59NE5rAhCfgk06QKTH2ne9VUL1JlaXdYXY3B8RaiF2SO50rDYvd39TulP6A6xZQ==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.4.2.tgz", + "integrity": "sha512-gCTWlw0e+Y6kajpFyKKgA195jUJCRhlzJE0lV7ufe8a+ghIsANWZ0/FiJwg6DuOG1+OvRbcZDcFBoRh3mNJx0g==", "dev": true, "license": "MIT", "dependencies": { @@ -1181,9 +1158,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "16.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.3.5.tgz", - "integrity": "sha512-pMmGgETfKvElucLHtVaeiMRbp2zUbvKx7b1yGko0liBz3cw1mKSggWN/Rp/wPz8z+E1O82u3r4L1Co+ZS5hokQ==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.4.2.tgz", + "integrity": "sha512-ONkhFvZNFWlsEHOM/81AtxdyuJP2KRYKYR0JxPwvcu1AuPMMMgcL+wW2luldJvMtZwKtUxoSkCychW5wIeoYSw==", "cpu": [ "arm64" ], @@ -1197,9 +1174,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "16.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.3.5.tgz", - "integrity": "sha512-76VaGYvf6HPa5/w12yLkE3dXTn9AfdEviI79oEL3aZoAmRLc9rWitjWqyjViVysK/ht/y9YKzFkBrUdi/wGkow==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.4.2.tgz", + "integrity": "sha512-luPCMbOsCoaF+kXJEUjmjmOZg1lC3BflhmUu+ZmW4tBu2vW/4AXak8JBFvePizGkxVmNiAw/r9ra+6UviCWtWQ==", "cpu": [ "x64" ], @@ -1213,9 +1190,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.3.5.tgz", - "integrity": "sha512-zKDELJ5jSQMHeO/hmXUQsAzagX4bQD4OiMi3pQ5FbUj+yK506oLVHnKA2YXMlbg1EHHqJYtyePOgByIDXD1lqw==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.4.2.tgz", + "integrity": "sha512-xhwFTAncJyaCNy5KqKKuKaIIdCy1/1ZV1s5S1G0hhT7wGMkDTlfJ6aQbfRFnIG/s3/kDrxQ8aycVe+c5QnP8ow==", "cpu": [ "arm64" ], @@ -1229,9 +1206,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.3.5.tgz", - "integrity": "sha512-7Vql0pgzCoHagv6+FNOZoqmJqA52c6zeVbhtS/47qFozO1MSx4ms7x7GHiciY8R5CDsSMKMQjJEryoJLcsBIbA==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.4.2.tgz", + "integrity": "sha512-T1PNmfbPcxr5ndtWUL/3wQtLXsz808lq6sc2GrNT5k2oquF7UyqZddHSuAewHVsWsGXe6nsl9HoN1YNriVjuSg==", "cpu": [ "arm64" ], @@ -1245,9 +1222,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.3.5.tgz", - "integrity": "sha512-NH/xzehyHEFWE2nlcZon7TB/0+H4shfWCi7S1zka815XCOhJDYZhoeJtOYy0dh0WVRWACVXSyGNFFytoMxUhRg==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.4.2.tgz", + "integrity": "sha512-N9cDUOCGtkJG5PNKDFZUF3xXndrJJcpLp121uAGjIGvO/U2p9tfdNOM9htj7+5f72l0m8rMw/cvYacUJBQoudg==", "cpu": [ "x64" ], @@ -1261,9 +1238,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "16.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.3.5.tgz", - "integrity": "sha512-lV4+EhWMfS8jcC+EH2nn/Cm5cn6XsgbE07bU9tMH8fCo0tNAqhyzi1b5wQ/Tn6NGFTvKDY65w3ZH95EjwBRAnQ==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.4.2.tgz", + "integrity": "sha512-yY2uh1YhX6ufuYy2FCbw1dqblbhI57GLYAJfCkqD9auTv6pLrH67Uccjc3QMKBeCYAG6lkgu08ExmX1bbjejjQ==", "cpu": [ "x64" ], @@ -1277,9 +1254,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.3.5.tgz", - "integrity": "sha512-/wKzAREX2RF++MhicjDbg8tGn2AiBIM0+EFeTFKoUEUbW5D6amCJehd5Z5G1H5/gxNdgnwoXMcHz24H/c2tGkQ==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.4.2.tgz", + "integrity": "sha512-j/ArWRIHpMMB6wYLMhr2puTguBt70lNU/Cmjl9p6dTDE8DGknYJMP9PdwPk2dqpCNL/KIX9yfngDvIesxJPmsg==", "cpu": [ "arm64" ], @@ -1293,9 +1270,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.3.5.tgz", - "integrity": "sha512-LNdCHzgLFc+UeqMS84LzXPaeBRKyqDN9OMyFAr1OrB0XrNw78IRrEVtZvvA7245W/HsaoeVOQX9jPjPk8jojwA==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.4.2.tgz", + "integrity": "sha512-AA4edyWHDko3NCSo0x6GomsdgFb0oR1J3MXU1b5xt6FRFg4AucrMPW3S0hCe/9onU0O1BbpGQBsqo1r0Gneu1g==", "cpu": [ "x64" ], @@ -1595,27 +1572,6 @@ "node": ">=14.0.0" } }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.11.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.11.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { "version": "1.2.2", "dev": true, @@ -1749,9 +1705,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.5.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.5.1.tgz", - "integrity": "sha512-CzNm2FezW4VR/LjG6yUdiEgLE/rAQ9Slj5gCu/C2VrdcW7I0ahNZ8DRbHT7zOZ6r3ONgd/bsQIeSaoDGrd1C6g==", + "version": "26.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.5.tgz", + "integrity": "sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg==", "dev": true, "license": "MIT", "dependencies": { @@ -1762,8 +1718,9 @@ "version": "19.3.0", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", - "dev": true, + "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -1823,6 +1780,7 @@ "integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.65.0", "@typescript-eslint/types": "8.65.0", @@ -2454,6 +2412,7 @@ "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2734,9 +2693,9 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2779,6 +2738,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.44", "caniuse-lite": "^1.0.30001806", @@ -2916,7 +2876,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/damerau-levenshtein": { @@ -3330,11 +3290,12 @@ } }, "node_modules/eslint": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.10.0.tgz", - "integrity": "sha512-NPXn6r5zl4uET1DAVPaOwzX3rut4c0wcmw3dWJAfOsTM5+TogXo0DDjz8pwm/hL8cyVNpHqeK4JpN0NjnyFFNw==", + "version": "10.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.13.0.tgz", + "integrity": "sha512-UohDjD4zSzEwhf58M3O7vc/ycc8O1I7dNlhtD0WxE8Px8EHNJKtUwzBqrzeGhisRuv2ag4sAYswszCJRgKXYUg==", "dev": true, "license": "MIT", + "peer": true, "workspaces": [ "packages/*" ], @@ -3389,21 +3350,21 @@ } }, "node_modules/eslint-config-next": { - "version": "16.3.5", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.3.5.tgz", - "integrity": "sha512-wPjq9MLQuWykHs8tsm2gH6OJThk6N27L8Te2JatlaGZ7jT1gtgGmJKukygL28xOlWsg5J1a1bGy/PvLyQC8OYA==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.4.2.tgz", + "integrity": "sha512-P33vjcETMXc+qBjpF77TeJHZLzk6cPcTy8KjpxLucYB3mCIFIORMcZ+cBXcAiIYjE5RM7jyknEEOwMNdnx/ADQ==", "dev": true, "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "16.3.5", + "@next/eslint-plugin-next": "16.4.2", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", - "eslint-plugin-react-hooks": "^7.0.0", + "eslint-plugin-react-hooks": "^7.1.0", "globals": "16.4.0", - "typescript-eslint": "^8.46.0" + "typescript-eslint": "^8.56.0" }, "peerDependencies": { "eslint": ">=9.0.0", @@ -3423,9 +3384,9 @@ "license": "MIT" }, "node_modules/eslint-config-next/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { @@ -3474,6 +3435,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -4785,6 +4747,7 @@ "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@keyv/serialize": "^1.1.1" } @@ -5124,12 +5087,18 @@ } }, "node_modules/lucide-react": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.45.0.tgz", - "integrity": "sha512-yH1ubCAduho9UR7oJhRXIQXogksRILBiTuZC4/bQIGeB9JOkxMlSuEHyyZpo1Z3S0yWJO2KTSUZbjiNvVxeOUw==", + "version": "1.58.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.58.0.tgz", + "integrity": "sha512-hXaFNm6mk6QVtBnDGBn1YAs8j2tGUk0A4s/CpclIcczfxeXiW1rdOLVo6zCsoIih9XXsGvDODQerl749a2n7bA==", "license": "ISC", "peerDependencies": { + "@types/react": "*", "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/magic-string": { @@ -5210,9 +5179,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", + "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", "funding": [ { "type": "github", @@ -5251,12 +5220,13 @@ "license": "MIT" }, "node_modules/next": { - "version": "16.3.5", - "resolved": "https://registry.npmjs.org/next/-/next-16.3.5.tgz", - "integrity": "sha512-MdtsTgzyfCPRLC6uJ1mN8ao7lyJ4BB0U6Inhnx3gta1UcCIdHK3yxLG0E8OWQteWD8/Q0qb8A5o7wJaL8M9y2w==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/next/-/next-16.4.2.tgz", + "integrity": "sha512-r+oBJojfefUjOiWkBhXgLS+igxX/7BWyK59uHnyOyplMSLtBZ+QLP3okrdYTbrfrbrmNTVWLBPaHDX9KRaIt3w==", "license": "MIT", + "peer": true, "dependencies": { - "@next/env": "16.3.5", + "@next/env": "16.4.2", "@swc/helpers": "0.5.23", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", @@ -5270,15 +5240,15 @@ "node": ">=20.9.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "16.3.5", - "@next/swc-darwin-x64": "16.3.5", - "@next/swc-linux-arm64-gnu": "16.3.5", - "@next/swc-linux-arm64-musl": "16.3.5", - "@next/swc-linux-x64-gnu": "16.3.5", - "@next/swc-linux-x64-musl": "16.3.5", - "@next/swc-win32-arm64-msvc": "16.3.5", - "@next/swc-win32-x64-msvc": "16.3.5", - "sharp": "^0.35.4" + "@next/swc-darwin-arm64": "16.4.2", + "@next/swc-darwin-x64": "16.4.2", + "@next/swc-linux-arm64-gnu": "16.4.2", + "@next/swc-linux-arm64-musl": "16.4.2", + "@next/swc-linux-x64-gnu": "16.4.2", + "@next/swc-linux-x64-musl": "16.4.2", + "@next/swc-win32-arm64-msvc": "16.4.2", + "@next/swc-win32-x64-msvc": "16.4.2", + "sharp": "^0.35.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -5609,9 +5579,9 @@ } }, "node_modules/postcss": { - "version": "8.5.28", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", - "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "version": "8.5.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.30.tgz", + "integrity": "sha512-zkd+e9S1AQHhmaBKye9zlFHWjOwVgqXl1q3ECYy8561K7qxR2cREf/STLskulBFd78k6AOFeA+ff1TtEzk9bAA==", "dev": true, "funding": [ { @@ -5629,9 +5599,9 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.18", + "nanoid": "^3.3.20", "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "source-map-js": "^1.2.2" }, "engines": { "node": "^10 || ^12 || >=14" @@ -5711,24 +5681,26 @@ "license": "MIT" }, "node_modules/react": { - "version": "19.3.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz", - "integrity": "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==", + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.1.tgz", + "integrity": "sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.3.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.0.tgz", - "integrity": "sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==", + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.1.tgz", + "integrity": "sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.28.0" }, "peerDependencies": { - "react": "^19.3.0" + "react": "^19.3.1" } }, "node_modules/react-is": { @@ -6134,9 +6106,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -6385,6 +6357,7 @@ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -6547,6 +6520,7 @@ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6825,6 +6799,7 @@ "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/website/package.json b/website/package.json index 3d88b66e..521e4343 100644 --- a/website/package.json +++ b/website/package.json @@ -13,10 +13,10 @@ "dependencies": { "@vercel/analytics": "^2.0.1", "@vercel/speed-insights": "^2.0.0", - "lucide-react": "^1.45.0", - "next": "^16.3.5", - "react": "^19.3.0", - "react-dom": "^19.3.0" + "lucide-react": "^1.58.0", + "next": "^16.4.2", + "react": "^19.3.1", + "react-dom": "^19.3.1" }, "overrides": { "picomatch@>=4.0.0 <4.0.4": "4.0.4", @@ -27,12 +27,12 @@ "devDependencies": { "@eslint/compat": "^2.1.1", "@tailwindcss/postcss": "^4.3.3", - "@types/node": "^26.5.1", + "@types/node": "^26.6.5", "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0", - "eslint": "^10.10.0", - "eslint-config-next": "^16.3.5", - "postcss": "^8.5.28", + "eslint": "^10.13.0", + "eslint-config-next": "^16.4.2", + "postcss": "^8.5.30", "tailwindcss": "^4.3.3", "typescript": "^6.0.3" } diff --git a/website/public/sqlite-viewer/sql-wasm.js b/website/public/sqlite-viewer/sql-wasm.js index d1e10490..be68699c 100644 --- a/website/public/sqlite-viewer/sql-wasm.js +++ b/website/public/sqlite-viewer/sql-wasm.js @@ -69,111 +69,111 @@ var initSqlJs = function (moduleConfig) { // The emcc-generated code and shell-post.js code goes below, // meaning that all of it runs inside of this promise. If anything throws an exception, our promise will abort -var l;l||=typeof Module != 'undefined' ? Module : {};var ca=!!globalThis.window,da=!!globalThis.WorkerGlobalScope,ea=globalThis.process?.versions?.node&&"renderer"!=globalThis.process?.type; -l.onRuntimeInitialized=function(){function a(e,h){switch(typeof h){case "boolean":Bc(e,h?1:0);break;case "number":Cc(e,h);break;case "string":Dc(e,h,-1,-1);break;case "object":if(null===h)Gb(e);else if(null!=h.length){var k=ha(h.length);n.set(h,k);Ec(e,k,h.length,-1);ia(k)}else Ia(e,"Wrong API use : tried to return a value of an unknown type ("+h+").",-1);break;default:Gb(e)}}function b(e,h){for(var k=[],m=0;m>>0);if(null!=e){var h=this.filename,k="/",m=h;k&&(k="string"==typeof k?k:ka(k),m=h?la(k+"/"+h):k);h=ma(!0,!0);m=na(m,h);if(e){if("string"==typeof e){k=Array(e.length);for(var q=0,r=e.length;qm||!Number.isSafeInteger(m))return-1;try{if(e){a:{var r= -e.chunkSize,y=e.cb-m;var u=0;var A=m;var F,N;for(y>k&&(y=k);uy-u&&(P=y-u);if(F=e.lb.get(K))C.set(F.subarray(S,S+P),h+u);else{var M=e.nb-A;M>P&&(M=P);if(0M&&(N=N.subarray(0,M),fa=M);0M&&C.fill(0,h+u+M,h+u+P)}u+=P;A+=P}oa=u}return oa}u=q.read(m,k);if(null==u)return 0;A=u.length;A>k&&(u=u.subarray(0,k),A=k);C.set(u,h);return A}catch(Ma){return-1}}function v(e){var h= -Z[e];e=aa[e];if(!h)return-1;if(e)return e.cb;try{var k=h.size()}catch(m){return-1}return"number"!==typeof k||0>k||!Number.isSafeInteger(k)?-1:k}function z(e,h){var k=e.chunkSize,m=[];h=h?m.push(r):y+k>h&&q.fill(0,h-y)}),m.forEach(function(q){e.lb.delete(q)}),hm||!Number.isSafeInteger(m)||0>k)return-1;try{for(var r=e.chunkSize,y=m,u=0,A,F,N,K,S;uk-u&&(K=k-u);S=e.lb.get(A);if(!S){S=new Uint8Array(r);if(K=ba)){ba>oa.length&&(ba=oa.length);P=(M=fa.read(Ma,ba))?M.length:0;P>ba&&(M=M.subarray(0,ba),P=ba);if(Pe.cb&&(e.cb=m+k);return 0}catch(Ed){return-1}}function B(e,h){e=aa[e];if(!e)return-1;h=Number(h);if(0>h||!Number.isSafeInteger(h))return-1; -try{return z(e,h),0}catch(k){return-1}}function L(){throw Error("paged databases are read-only snapshots; export() is only available on openPagedWritable instances");}function hb(){var e,h,k;if(null===this.db)throw Error("Database closed");if(0===Kb(this.db))throw Error("cannot export a paged database while a transaction is open; COMMIT or ROLLBACK first");var m=aa[this.tb];var q=Z[this.tb];var r=m.chunkSize;var y=new Uint8Array(m.cb);for(e=0;em.cb-e&&(u=m.cb-e);if(h=m.lb.get(e/ -r))y.set(h.subarray(0,u),e);else if(h=m.nb-e,h>u&&(h=u),0h&&(k=k.subarray(0,h));if(!k||k.lengthNumber.MAX_SAFE_INTEGER)throw"rowId too big to fit inside a Number";e(h,m,q,Number(r))},"viiiij");Rb(this.db,this.hb,0);return this};var Z={},aa={},Oa=1,pa=null,Pa=null,jb=null,Ub=null;g.openPaged=function(e){if(!e||"function"!==typeof e.read||"function"!==typeof e.size)throw Error("openPaged requires a hostIo object with read(offset, length) and size() functions");null===pa&&(pa=G(p,"iiiij"),Pa=G(v,"di"));var h=Sb(pa,Pa);if(0!==h)throw Error("could not register the sqljs_host VFS (error code "+ -h+")");var k=Oa;Oa+=1;Z[k]=e;try{h=fd(k,J);var m=w(J,"i32");if(0!==h){var q=0!==m?ib(m):"SQLite error "+h;0!==m&&wa(m);throw Error(q);}}catch(r){throw delete Z[k],r;}e=Object.create(g.prototype);e.db=m;e.filename=null;e.tb=k;e.kb={};e.Za={};La(e.db);e.Db=L;e["export"]=L;e.close=Na;e.close=Na;return e};g.openPagedWritable=function(e){if(!e||"function"!==typeof e.read||"function"!==typeof e.size)throw Error("openPagedWritable requires a hostIo object with read(offset, length) and size() functions"); -var h=e.size();if("number"!==typeof h||0>h||!Number.isSafeInteger(h))throw Error("hostIo.size() must return a non-negative byte count");null===pa&&(pa=G(p,"iiiij"),Pa=G(v,"di"));null===jb&&(jb=G(x,"iiiij"),Ub=G(B,"iij"));var k=Sb(pa,Pa);0===k&&(k=gd(jb,Ub));if(0!==k)throw Error("could not register the sqljs_host VFS (error code "+k+")");var m=Oa;Oa+=1;Z[m]=e;a:{try{var q=e.read(16,2)}catch(u){e=4096;break a}!q||2>q.length?e=4096:(e=256*q[0]+q[1],e=1===e?65536:512<=e&&32768>=e&&0===(e&e-1)?e:4096)}aa[m]= -{chunkSize:e,lb:new Map,cb:h,nb:h};try{k=hd(m,J);var r=w(J,"i32");if(0!==k){var y=0!==r?ib(r):"SQLite error "+k;0!==r&&wa(r);throw Error(y);}}catch(u){throw delete Z[m],delete aa[m],u;}k=Object.create(g.prototype);k.db=r;k.filename=null;k.tb=m;k.kb={};k.Za={};La(k.db);k.Db=hb;k["export"]=hb;k.xc=Lb;k.exportPagedWritableOverlay=Lb;k.close=Na;k.close=Na;return k};c.prototype.bind=c.prototype.bind;c.prototype.step=c.prototype.step;c.prototype.get=c.prototype.get;c.prototype.getColumnNames=c.prototype.Pb; -c.prototype.getAsObject=c.prototype.Ob;c.prototype.getSQL=c.prototype.hc;c.prototype.getNormalizedSQL=c.prototype.dc;c.prototype.run=c.prototype.run;c.prototype.reset=c.prototype.reset;c.prototype.freemem=c.prototype.freemem;c.prototype.free=c.prototype.ib;f.prototype.next=f.prototype.next;f.prototype.getRemainingSQL=f.prototype.ec;g.prototype.run=g.prototype.run;g.prototype.exec=g.prototype.exec;g.prototype.each=g.prototype.bc;g.prototype.prepare=g.prototype.Ib;g.prototype.iterateStatements=g.prototype.kc; -g.prototype["export"]=g.prototype.Db;g.prototype.close=g.prototype.close;g.prototype.handleError=g.prototype.handleError;g.prototype.getRowsModified=g.prototype.fc;g.prototype.progress_handler=g.prototype.nc;g.prototype.interrupt=g.prototype.jc;g.prototype.create_function=g.prototype.$b;g.prototype.create_aggregate=g.prototype.Zb;g.prototype.updateHook=g.prototype.qc;l.Database=g};var Ca="./this.program",Da=(a,b)=>{throw b;},Ea=globalThis.document?.currentScript?.src; +var m;m||=typeof Module != 'undefined' ? Module : {};var ca=!!globalThis.window,da=!!globalThis.WorkerGlobalScope,ea=globalThis.process?.versions?.node&&"renderer"!=globalThis.process?.type; +m.onRuntimeInitialized=function(){function a(e,g){Fb(e,g instanceof Error?g.message:String(g),-1)}function b(e,g){switch(typeof g){case "boolean":Dc(e,g?1:0);break;case "number":Ec(e,g);break;case "string":Fc(e,g,-1,-1);break;case "object":if(null===g)Gb(e);else if(null!=g.length){var k=fa(g.length);p.set(g,k);Gc(e,k,g.length,-1);ia(k)}else Fb(e,"Wrong API use : tried to return a value of an unknown type ("+g+").",-1);break;default:Gb(e)}}function c(e,g){for(var k=[],n=0;n>>0);if(null!=e){var g=this.filename,k="/",n=g;k&&(k="string"==typeof k?k:ka(k),n=g?la(k+"/"+g):k);g=ma(!0,!0);n=na(n,g);if(e){if("string"==typeof e){k=Array(e.length);for(var q=0,r=e.length;qn||!Number.isSafeInteger(n))return-1;try{if(e){a:{var r=e.chunkSize,y=e.cb-n;var t=0;var E=n;var D,I;for(y>k&&(y=k);ty-t&&(M=y-t);if(D=e.mb.get(Q))C.set(D.subarray(O,O+M),g+t);else{var J=e.nb-E;J>M&&(J=M);if(0J&&(I=I.subarray(0,J),ha=J);0J&&C.fill(0, +g+t+J,g+t+M)}t+=M;E+=M}qa=t}return qa}t=q.read(n,k);if(null==t)return 0;E=t.length;E>k&&(t=t.subarray(0,k),E=k);C.set(t,g);return E}catch(La){return-1}}function A(e){var g=Z[e];e=aa[e];if(!g)return-1;if(e)return e.cb;try{var k=g.size()}catch(n){return-1}return"number"!==typeof k||0>k||!Number.isSafeInteger(k)?-1:k}function N(e,g){var k=e.chunkSize,n=[];g=g?n.push(r):y+k>g&&q.fill(0,g-y)}),n.forEach(function(q){e.mb.delete(q)}),gn||!Number.isSafeInteger(n)||0>k)return-1;try{for(var r=e.chunkSize,y=n,t=0,E,D,I,Q,O;tk-t&&(Q=k-t);O=e.mb.get(E);if(!O){O=new Uint8Array(r);if(Q=ba)){ba>qa.length&&(ba=qa.length);M=(J=ha.read(La,ba))?J.length:0;M>ba&&(J=J.subarray(0,ba),M=ba);if(Me.cb&&(e.cb=n+k);return 0}catch(Gd){return-1}}function Pc(e,g){e=aa[e];if(!e)return-1;g=Number(g);if(0>g||!Number.isSafeInteger(g))return-1;try{return N(e,g),0}catch(k){return-1}}function Lb(){throw Error("paged databases are read-only snapshots; export() is only available on openPagedWritable instances");}function Mb(){var e,g,k;if(null===this.db)throw Error("Database closed");if(0===Nb(this.db))throw Error("cannot export a paged database while a transaction is open; COMMIT or ROLLBACK first"); +var n=aa[this.tb];var q=Z[this.tb];var r=n.chunkSize;var y=new Uint8Array(n.cb);for(e=0;en.cb-e&&(t=n.cb-e);if(g=n.mb.get(e/r))y.set(g.subarray(0,t),e);else if(g=n.nb-e,g>t&&(g=t),0g&&(k=k.subarray(0,g));if(!k||k.lengthNumber.MAX_SAFE_INTEGER)throw"rowId too big to fit inside a Number";e(g,n,q,Number(r))},"viiiij");Tb(this.db,this.ib,0);return this};var Z={},aa={},Na=1,ra=null,Oa=null,ib=null,Wb=null;l.openPaged=function(e){if(!e||"function"!==typeof e.read||"function"!==typeof e.size)throw Error("openPaged requires a hostIo object with read(offset, length) and size() functions");null===ra&&(ra=G(x,"iiiij"),Oa=G(A,"di"));var g=Ub(ra, +Oa);if(0!==g)throw Error("could not register the sqljs_host VFS (error code "+g+")");var k=Na;Na+=1;Z[k]=e;try{g=hd(k,L);var n=w(L,"i32");if(0!==g){var q=0!==n?hb(n):"SQLite error "+g;0!==n&&xa(n);throw Error(q);}}catch(r){throw delete Z[k],r;}e=Object.create(l.prototype);e.db=n;e.filename=null;e.tb=k;e.lb={};e.$a=new Map;Ka(e.db);e.Eb=Lb;e["export"]=Lb;e.close=Ma;e.close=Ma;return e};l.openPagedWritable=function(e){if(!e||"function"!==typeof e.read||"function"!==typeof e.size)throw Error("openPagedWritable requires a hostIo object with read(offset, length) and size() functions"); +var g=e.size();if("number"!==typeof g||0>g||!Number.isSafeInteger(g))throw Error("hostIo.size() must return a non-negative byte count");null===ra&&(ra=G(x,"iiiij"),Oa=G(A,"di"));null===ib&&(ib=G(Kb,"iiiij"),Wb=G(Pc,"iij"));var k=Ub(ra,Oa);0===k&&(k=jd(ib,Wb));if(0!==k)throw Error("could not register the sqljs_host VFS (error code "+k+")");var n=Na;Na+=1;Z[n]=e;a:{try{var q=e.read(16,2)}catch(t){e=4096;break a}!q||2>q.length?e=4096:(e=256*q[0]+q[1],e=1===e?65536:512<=e&&32768>=e&&0===(e&e-1)?e:4096)}aa[n]= +{chunkSize:e,mb:new Map,cb:g,nb:g};try{k=kd(n,L);var r=w(L,"i32");if(0!==k){var y=0!==r?hb(r):"SQLite error "+k;0!==r&&xa(r);throw Error(y);}}catch(t){throw delete Z[n],delete aa[n],t;}k=Object.create(l.prototype);k.db=r;k.filename=null;k.tb=n;k.lb={};k.$a=new Map;Ka(k.db);k.Eb=Mb;k["export"]=Mb;k.xc=Ob;k.exportPagedWritableOverlay=Ob;k.close=Ma;k.close=Ma;return k};d.prototype.bind=d.prototype.bind;d.prototype.step=d.prototype.step;d.prototype.get=d.prototype.get;d.prototype.getColumnNames=d.prototype.Pb; +d.prototype.getAsObject=d.prototype.Ob;d.prototype.getSQL=d.prototype.hc;d.prototype.getNormalizedSQL=d.prototype.dc;d.prototype.run=d.prototype.run;d.prototype.reset=d.prototype.reset;d.prototype.freemem=d.prototype.freemem;d.prototype.free=d.prototype.fb;h.prototype.next=h.prototype.next;h.prototype.getRemainingSQL=h.prototype.ec;l.prototype.run=l.prototype.run;l.prototype.exec=l.prototype.exec;l.prototype.each=l.prototype.bc;l.prototype.prepare=l.prototype.Ib;l.prototype.iterateStatements=l.prototype.kc; +l.prototype["export"]=l.prototype.Eb;l.prototype.close=l.prototype.close;l.prototype.handleError=l.prototype.handleError;l.prototype.getRowsModified=l.prototype.fc;l.prototype.progress_handler=l.prototype.nc;l.prototype.interrupt=l.prototype.jc;l.prototype.create_function=l.prototype.$b;l.prototype.create_aggregate=l.prototype.Zb;l.prototype.updateHook=l.prototype.qc;m.Database=l};var Ca="./this.program",Da=(a,b)=>{throw b;},Ea=globalThis.document?.currentScript?.src; "undefined"!=typeof __filename?Ea=__filename:da&&(Ea=self.location.href);var Fa="",Ga,Ha; -if(ea){var fs=require("node:fs");Fa=__dirname+"/";Ha=a=>{a=Ja(a)?new URL(a):a;return fs.readFileSync(a)};Ga=async a=>{a=Ja(a)?new URL(a):a;return fs.readFileSync(a,void 0)};1{process.exitCode=a;throw b;}}else if(ca||da){try{Fa=(new URL(".",Ea)).href}catch{}da&&(Ha=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)}); -Ga=async a=>{if(Ja(a))return new Promise((c,d)=>{var f=new XMLHttpRequest;f.open("GET",a,!0);f.responseType="arraybuffer";f.onload=()=>{200==f.status||0==f.status&&f.response?c(f.response):d(f.status)};f.onerror=d;f.send(null)});var b=await fetch(a,{credentials:"same-origin"});if(b.ok)return b.arrayBuffer();throw Error(b.status+" : "+b.url);}}var Ka=console.log.bind(console),Qa=console.error.bind(console),Ra,Sa=!1,Ta,Ja=a=>a.startsWith("file://"),n,C,Ua,H,I,Va,Wa,O; -function Xa(){var a=Ya.buffer;n=new Int8Array(a);Ua=new Int16Array(a);C=new Uint8Array(a);new Uint16Array(a);H=new Int32Array(a);I=new Uint32Array(a);Va=new Float32Array(a);Wa=new Float64Array(a);O=new BigInt64Array(a);new BigUint64Array(a)}function Za(a){l.onAbort?.(a);a="Aborted("+a+")";Qa(a);Sa=!0;throw new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");}var $a; -async function ab(a){if(!Ra)try{var b=await Ga(a);return new Uint8Array(b)}catch{}if(a==$a&&Ra)a=new Uint8Array(Ra);else if(Ha)a=Ha(a);else throw"both async and sync fetching of the wasm failed";return a}async function bb(a,b){try{var c=await ab(a);return await WebAssembly.instantiate(c,b)}catch(d){Qa(`failed to asynchronously prepare wasm: ${d}`),Za(d)}} -async function cb(a){var b=$a;if(!Ra&&!Ja(b)&&!ea)try{var c=fetch(b,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(c,a)}catch(d){Qa(`wasm streaming compile failed: ${d}`),Qa("falling back to ArrayBuffer instantiation")}return bb(b,a)}class db{name="ExitStatus";constructor(a){this.message=`Program terminated with exit(${a})`;this.status=a}}var eb=a=>{for(;0{var a=l.preRun.shift();gb.push(a)},lb=0,mb=null; -function w(a,b="i8"){b.endsWith("*")&&(b="*");switch(b){case "i1":return n[a];case "i8":return n[a];case "i16":return Ua[a>>1];case "i32":return H[a>>2];case "i64":return O[a>>3];case "float":return Va[a>>2];case "double":return Wa[a>>3];case "*":return I[a>>2];default:Za(`invalid type for getValue: ${b}`)}}var nb=!0; -function ya(a){var b="i32";b.endsWith("*")&&(b="*");switch(b){case "i1":n[a]=0;break;case "i8":n[a]=0;break;case "i16":Ua[a>>1]=0;break;case "i32":H[a>>2]=0;break;case "i64":O[a>>3]=BigInt(0);break;case "float":Va[a>>2]=0;break;case "double":Wa[a>>3]=0;break;case "*":I[a>>2]=0;break;default:Za(`invalid type for setValue: ${b}`)}} -var ob=new TextDecoder,pb=(a,b,c,d)=>{c=b+c;if(d)return c;for(;a[b]&&!(b>=c);)++b;return b},E=(a,b,c)=>a?ob.decode(C.subarray(a,pb(C,a,b,c))):"",qb=(a,b)=>{for(var c=0,d=a.length-1;0<=d;d--){var f=a[d];"."===f?a.splice(d,1):".."===f?(a.splice(d,1),c++):c&&(a.splice(d,1),c--)}if(b)for(;c;c--)a.unshift("..");return a},la=a=>{var b="/"===a.charAt(0),c="/"===a.slice(-1);(a=qb(a.split("/").filter(d=>!!d),!b).join("/"))||b||(a=".");a&&c&&(a+="/");return(b?"/":"")+a},rb=a=>{var b=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(a).slice(1); -a=b[0];b=b[1];if(!a&&!b)return".";b&&=b.slice(0,-1);return a+b},sb=a=>a&&a.match(/([^\/]+|\/)\/*$/)[1],tb=()=>{if(ea){var a=require("node:crypto");return b=>a.randomFillSync(b)}return b=>crypto.getRandomValues(b)},ub=a=>{(ub=tb())(a)},vb=(...a)=>{for(var b="",c=!1,d=a.length-1;-1<=d&&!c;d--){c=0<=d?a[d]:"/";if("string"!=typeof c)throw new TypeError("Arguments to path.resolve must be strings");if(!c)return"";b=c+"/"+b;c="/"===c.charAt(0)}b=qb(b.split("/").filter(f=>!!f),!c).join("/");return(c?"/": -"")+b||"."},wb=a=>{var b=pb(a,0);return ob.decode(a.buffer?a.subarray(0,b):new Uint8Array(a.slice(0,b)))},xb=[],yb=a=>{for(var b=0,c=0;c=d?b++:2047>=d?b+=2:55296<=d&&57343>=d?(b+=4,++c):b+=3}return b},Q=(a,b,c,d)=>{if(!(0=p){if(c>=d)break;b[c++]=p}else if(2047>=p){if(c+1>=d)break;b[c++]=192|p>>6;b[c++]=128|p&63}else if(65535>=p){if(c+2>=d)break;b[c++]=224|p>>12;b[c++]=128| -p>>6&63;b[c++]=128|p&63}else{if(c+3>=d)break;b[c++]=240|p>>18;b[c++]=128|p>>12&63;b[c++]=128|p>>6&63;b[c++]=128|p&63;g++}}b[c]=0;return c-f},zb=[];function Ab(a,b){zb[a]={input:[],output:[],sb:b};Bb(a,Cb)} -var Cb={open(a){var b=zb[a.node.rdev];if(!b)throw new R(43);a.tty=b;a.seekable=!1},close(a){a.tty.sb.fsync(a.tty)},fsync(a){a.tty.sb.fsync(a.tty)},read(a,b,c,d){if(!a.tty||!a.tty.sb.Rb)throw new R(60);for(var f=0,g=0;g=a.node.$a)return 0;a=Math.min(a.node.$a-f,d);if(8=g||(g=Math.max(g,p*(1048576>p?2:1.125)>>>0),0!=p&&(g=Math.max(g,256)),p=a.Va,a.Va=new Uint8Array(g),0b)throw new R(28); -return b},yb(a,b,c,d,f){if(32768!==(a.node.mode&61440))throw new R(43);a=a.node.Va;if(f&2||!a||a.buffer!==n.buffer){f=!0;d=65536*Math.ceil(b/65536);var g=Vb(65536,d);g&&C.fill(0,g,g+d);d=g;if(!d)throw new R(48);if(a){if(0{var c=0;a&&(c|=365);b&&(c|=146);return c},Wb=null,Xb={},Yb=[],Zb=1,$b=null,ac= -!1,bc=!0,cc={},R=class{name="ErrnoError";constructor(a){this.Xa=a}},dc=class{wb={};node=null;get flags(){return this.wb.flags}set flags(a){this.wb.flags=a}get position(){return this.wb.position}set position(a){this.wb.position=a}},ec=class{Ta={};Ua={};qb=null;constructor(a,b,c,d){a||=this;this.parent=a;this.jb=a.jb;this.id=Zb++;this.name=b;this.mode=c;this.rdev=d;this.atime=this.mtime=this.ctime=Date.now()}get read(){return 365===(this.mode&365)}set read(a){a?this.mode|=365:this.mode&=-366}get write(){return 146=== +if(ea){var fs=require("node:fs");Fa=__dirname+"/";Ha=a=>{a=Ia(a)?new URL(a):a;return fs.readFileSync(a)};Ga=async a=>{a=Ia(a)?new URL(a):a;return fs.readFileSync(a,void 0)};1{process.exitCode=a;throw b;}}else if(ca||da){try{Fa=(new URL(".",Ea)).href}catch{}da&&(Ha=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)}); +Ga=async a=>{if(Ia(a))return new Promise((c,d)=>{var f=new XMLHttpRequest;f.open("GET",a,!0);f.responseType="arraybuffer";f.onload=()=>{200==f.status||0==f.status&&f.response?c(f.response):d(f.status)};f.onerror=d;f.send(null)});var b=await fetch(a,{credentials:"same-origin"});if(b.ok)return b.arrayBuffer();throw Error(b.status+" : "+b.url);}}var Ja=console.log.bind(console),Pa=console.error.bind(console),Qa,Ra=!1,Sa,Ia=a=>a.startsWith("file://"),p,C,Ta,H,K,Ua,Va,P; +function Wa(){var a=Xa.buffer;p=new Int8Array(a);Ta=new Int16Array(a);C=new Uint8Array(a);new Uint16Array(a);H=new Int32Array(a);K=new Uint32Array(a);Ua=new Float32Array(a);Va=new Float64Array(a);P=new BigInt64Array(a);new BigUint64Array(a)}function Ya(a){m.onAbort?.(a);a="Aborted("+a+")";Pa(a);Ra=!0;throw new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");}var Za; +async function $a(a){if(!Qa)try{var b=await Ga(a);return new Uint8Array(b)}catch{}if(a==Za&&Qa)a=new Uint8Array(Qa);else if(Ha)a=Ha(a);else throw"both async and sync fetching of the wasm failed";return a}async function ab(a,b){try{var c=await $a(a);return await WebAssembly.instantiate(c,b)}catch(d){Pa(`failed to asynchronously prepare wasm: ${d}`),Ya(d)}} +async function bb(a){var b=Za;if(!Qa&&!Ia(b)&&!ea)try{var c=fetch(b,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(c,a)}catch(d){Pa(`wasm streaming compile failed: ${d}`),Pa("falling back to ArrayBuffer instantiation")}return ab(b,a)}class cb{name="ExitStatus";constructor(a){this.message=`Program terminated with exit(${a})`;this.status=a}}var db=a=>{for(;0{var a=m.preRun.shift();fb.push(a)},kb=0,lb=null; +function w(a,b="i8"){b.endsWith("*")&&(b="*");switch(b){case "i1":return p[a];case "i8":return p[a];case "i16":return Ta[a>>1];case "i32":return H[a>>2];case "i64":return P[a>>3];case "float":return Ua[a>>2];case "double":return Va[a>>3];case "*":return K[a>>2];default:Ya(`invalid type for getValue: ${b}`)}}var mb=!0; +function ya(a){var b="i32";b.endsWith("*")&&(b="*");switch(b){case "i1":p[a]=0;break;case "i8":p[a]=0;break;case "i16":Ta[a>>1]=0;break;case "i32":H[a>>2]=0;break;case "i64":P[a>>3]=BigInt(0);break;case "float":Ua[a>>2]=0;break;case "double":Va[a>>3]=0;break;case "*":K[a>>2]=0;break;default:Ya(`invalid type for setValue: ${b}`)}} +var nb=new TextDecoder,ob=(a,b,c,d)=>{c=b+c;if(d)return c;for(;a[b]&&!(b>=c);)++b;return b},F=(a,b,c)=>a?nb.decode(C.subarray(a,ob(C,a,b,c))):"",pb=(a,b)=>{for(var c=0,d=a.length-1;0<=d;d--){var f=a[d];"."===f?a.splice(d,1):".."===f?(a.splice(d,1),c++):c&&(a.splice(d,1),c--)}if(b)for(;c;c--)a.unshift("..");return a},la=a=>{var b="/"===a.charAt(0),c="/"===a.slice(-1);(a=pb(a.split("/").filter(d=>!!d),!b).join("/"))||b||(a=".");a&&c&&(a+="/");return(b?"/":"")+a},qb=a=>{var b=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(a).slice(1); +a=b[0];b=b[1];if(!a&&!b)return".";b&&=b.slice(0,-1);return a+b},rb=a=>a&&a.match(/([^\/]+|\/)\/*$/)[1],sb=()=>{if(ea){var a=require("node:crypto");return b=>a.randomFillSync(b)}return b=>crypto.getRandomValues(b)},tb=a=>{(tb=sb())(a)},ub=(...a)=>{for(var b="",c=!1,d=a.length-1;-1<=d&&!c;d--){c=0<=d?a[d]:"/";if("string"!=typeof c)throw new TypeError("Arguments to path.resolve must be strings");if(!c)return"";b=c+"/"+b;c="/"===c.charAt(0)}b=pb(b.split("/").filter(f=>!!f),!c).join("/");return(c?"/": +"")+b||"."},vb=a=>{var b=ob(a,0);return nb.decode(a.buffer?a.subarray(0,b):new Uint8Array(a.slice(0,b)))},wb=[],xb=a=>{for(var b=0,c=0;c=d?b++:2047>=d?b+=2:55296<=d&&57343>=d?(b+=4,++c):b+=3}return b},R=(a,b,c,d)=>{if(!(0=l){if(c>=d)break;b[c++]=l}else if(2047>=l){if(c+1>=d)break;b[c++]=192|l>>6;b[c++]=128|l&63}else if(65535>=l){if(c+2>=d)break;b[c++]=224|l>>12;b[c++]=128| +l>>6&63;b[c++]=128|l&63}else{if(c+3>=d)break;b[c++]=240|l>>18;b[c++]=128|l>>12&63;b[c++]=128|l>>6&63;b[c++]=128|l&63;h++}}b[c]=0;return c-f},yb=[];function zb(a,b){yb[a]={input:[],output:[],sb:b};Ab(a,Bb)} +var Bb={open(a){var b=yb[a.node.rdev];if(!b)throw new S(43);a.tty=b;a.seekable=!1},close(a){a.tty.sb.fsync(a.tty)},fsync(a){a.tty.sb.fsync(a.tty)},read(a,b,c,d){if(!a.tty||!a.tty.sb.Rb)throw new S(60);for(var f=0,h=0;h=a.node.Za)return 0;a=Math.min(a.node.Za-f,d);if(8=h||(h=Math.max(h,l*(1048576>l?2:1.125)>>>0),0!=l&&(h=Math.max(h,256)),l=a.Va,a.Va=new Uint8Array(h),0b)throw new S(28); +return b},zb(a,b,c,d,f){if(32768!==(a.node.mode&61440))throw new S(43);a=a.node.Va;if(f&2||!a||a.buffer!==p.buffer){f=!0;d=65536*Math.ceil(b/65536);var h=Xb(65536,d);h&&C.fill(0,h,h+d);d=h;if(!d)throw new S(48);if(a){if(0{var c=0;a&&(c|=365);b&&(c|=146);return c},Yb=null,Zb={},$b=[],ac=1,bc=null,cc= +!1,dc=!0,ec={},S=class{name="ErrnoError";constructor(a){this.Xa=a}},fc=class{wb={};node=null;get flags(){return this.wb.flags}set flags(a){this.wb.flags=a}get position(){return this.wb.position}set position(a){this.wb.position=a}},gc=class{Ta={};Ua={};qb=null;constructor(a,b,c,d){a||=this;this.parent=a;this.kb=a.kb;this.id=ac++;this.name=b;this.mode=c;this.rdev=d;this.atime=this.mtime=this.ctime=Date.now()}get read(){return 365===(this.mode&365)}set read(a){a?this.mode|=365:this.mode&=-366}get write(){return 146=== (this.mode&146)}set write(a){a?this.mode|=146:this.mode&=-147}}; -function V(a,b={}){if(!a)throw new R(44);b.Fb??(b.Fb=!0);"/"===a.charAt(0)||(a="//"+a);var c=0;a:for(;40>c;c++){a=a.split("/").filter(v=>!!v);for(var d=Wb,f="/",g=0;g>>0)%$b.length} -function Tb(a){var b=fc(a.parent.id,a.name);if($b[b]===a)$b[b]=a.rb;else for(b=$b[b];b;){if(b.rb===a){b.rb=a.rb;break}b=b.rb}}function Ib(a,b){var c=U(a.mode)?(c=gc(a,"x"))?c:a.Ta.lookup?0:2:54;if(c)throw new R(c);for(c=$b[fc(a.id,b)];c;c=c.rb){var d=c.name;if(c.parent.id===a.id&&d===b)return c}return a.Ta.lookup(a,b)}function Hb(a,b,c,d){a=new ec(a,b,c,d);b=fc(a.parent.id,a.name);a.rb=$b[b];return $b[b]=a}function U(a){return 16384===(a&61440)} -function hc(a){var b=["r","w","rw"][a&3];a&512&&(b+="w");return b}function gc(a,b){if(bc)return 0;if(!b.includes("r")||a.mode&292){if(b.includes("w")&&!(a.mode&146)||b.includes("x")&&!(a.mode&73))return 2}else return 2;return 0}function ic(a,b){if(!U(a.mode))return 54;try{return Ib(a,b),20}catch(c){}return gc(a,"wx")} -function jc(a,b,c){try{var d=Ib(a,b)}catch(f){return f.Xa}if(a=gc(a,"wx"))return a;if(c){if(!U(d.mode))return 54;if(d===d.parent||"/"===ka(d))return 10}else if(U(d.mode))return 31;return 0}function kc(a){if(!a)throw new R(63);return a}function W(a){a=Yb[a];if(!a)throw new R(8);return a}function lc(a,b=-1){a=Object.assign(new dc,a);if(-1==b)a:{for(b=0;4096>=b;b++)if(!Yb[b])break a;throw new R(33);}a.fd=b;return Yb[b]=a}function mc(a,b=-1){a=lc(a,b);a.Ua?.wc?.(a);return a} -function nc(a,b,c){var d=a?.Ua.eb;a=d?a:b;d??=b.Ta.eb;kc(d);d(a,c)}var Fb={open(a){a.Ua=Xb[a.node.rdev].Ua;a.Ua.open?.(a)},fb(){throw new R(70);}};function Bb(a,b){Xb[a]={Ua:b}}function oc(a,b){var c="/"===b;if(c&&Wb)throw new R(10);if(!c&&b){var d=V(b,{Fb:!1});b=d.path;d=d.node;if(d.qb)throw new R(10);if(!U(d.mode))throw new R(54);}b={type:a,Cc:{},Tb:b,lc:[]};a=a.jb(b);a.jb=b;b.root=a;c?Wb=a:d&&(d.qb=b,d.jb&&d.jb.lc.push(b))} -function pc(a,b,c){var d=V(a,{parent:!0}).node;a=sb(a);if(!a)throw new R(28);if("."===a||".."===a)throw new R(20);var f=ic(d,a);if(f)throw new R(f);if(!d.Ta.xb)throw new R(63);return d.Ta.xb(d,a,b,c)}function na(a,b=438){return pc(a,b&4095|32768,0)}function X(a,b=511){return pc(a,b&1023|16384,0)}function qc(a,b,c){"undefined"==typeof c&&(c=b,b=438);pc(a,b|8192,c)} -function rc(a,b){if(!vb(a))throw new R(44);var c=V(b,{parent:!0}).node;if(!c)throw new R(44);b=sb(b);var d=ic(c,b);if(d)throw new R(d);if(!c.Ta.symlink)throw new R(63);c.Ta.symlink(c,b,a)}function sc(a){var b=V(a,{parent:!0}).node;a=sb(a);var c=Ib(b,a),d=jc(b,a,!0);if(d)throw new R(d);if(!b.Ta.rmdir)throw new R(63);if(c.qb)throw new R(10);b.Ta.rmdir(b,a);Tb(c)} -function Ba(a){var b=V(a,{parent:!0}).node;if(!b)throw new R(44);a=sb(a);var c=Ib(b,a),d=jc(b,a,!1);if(d)throw new R(d);if(!b.Ta.unlink)throw new R(63);if(c.qb)throw new R(10);b.Ta.unlink(b,a);Tb(c)}function tc(a,b){a=V(a,{pb:!b}).node;return kc(a.Ta.bb)(a)}function uc(a,b,c,d){nc(a,b,{mode:c&4095|b.mode&-4096,ctime:Date.now(),ac:d})}function qa(a,b){a="string"==typeof a?V(a,{pb:!0}).node:a;uc(null,a,b)} -function vc(a,b,c){if(U(b.mode))throw new R(31);if(32768!==(b.mode&61440))throw new R(28);var d=gc(b,"w");if(d)throw new R(d);nc(a,b,{size:c,timestamp:Date.now()})} -function ra(a,b,c=438){if(""===a)throw new R(44);if("string"==typeof b){var d={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090}[b];if("undefined"==typeof d)throw Error(`Unknown file open mode: ${b}`);b=d}c=b&64?c&4095|32768:0;if("object"==typeof a)d=a;else{var f=a.endsWith("/");a=V(a,{pb:!(b&131072),mc:!0});d=a.node;a=a.path}var g=!1;if(b&64)if(d){if(b&128)throw new R(20);}else{if(f)throw new R(31);d=pc(a,c|511,0);g=!0}if(!d)throw new R(44);8192===(d.mode&61440)&&(b&=-513);if(b&65536&&!U(d.mode))throw new R(54); -if(!g&&(f=d?40960===(d.mode&61440)?32:U(d.mode)&&("r"!==hc(b)||b&576)?31:gc(d,hc(b)):44))throw new R(f);b&512&&!g&&(f=d,f="string"==typeof f?V(f,{pb:!0}).node:f,vc(null,f,0));b&=-131713;f=lc({node:d,path:ka(d),flags:b,seekable:!0,position:0,Ua:d.Ua,pc:[],error:!1});f.Ua.open&&f.Ua.open(f);g&&qa(d,c&511);!l.logReadFiles||b&1||a in cc||(cc[a]=1);return f}function ta(a){if(null===a.fd)throw new R(8);a.Gb&&(a.Gb=null);try{a.Ua.close&&a.Ua.close(a)}catch(b){throw b;}finally{Yb[a.fd]=null}a.fd=null} -function wc(a,b,c){if(null===a.fd)throw new R(8);if(!a.seekable||!a.Ua.fb)throw new R(70);if(0!=c&&1!=c&&2!=c)throw new R(28);a.position=a.Ua.fb(a,b,c);a.pc=[]}function xc(a,b,c,d,f){if(0>d||0>f)throw new R(28);if(null===a.fd)throw new R(8);if(1===(a.flags&2097155))throw new R(8);if(U(a.node.mode))throw new R(31);if(!a.Ua.read)throw new R(28);var g="undefined"!=typeof f;if(!g)f=a.position;else if(!a.seekable)throw new R(70);b=a.Ua.read(a,b,c,d,f);g||(a.position+=b);return b} -function sa(a,b,c,d,f){if(0>d||0>f)throw new R(28);if(null===a.fd)throw new R(8);if(0===(a.flags&2097155))throw new R(8);if(U(a.node.mode))throw new R(31);if(!a.Ua.write)throw new R(28);a.seekable&&a.flags&1024&&wc(a,0,2);var g="undefined"!=typeof f;if(!g)f=a.position;else if(!a.seekable)throw new R(70);b=a.Ua.write(a,b,c,d,f,void 0);g||(a.position+=b);return b} -function Aa(a){var b=b||0;var c="binary";"utf8"!==c&&"binary"!==c&&Za(`Invalid encoding type "${c}"`);b=ra(a,b);a=tc(a).size;var d=new Uint8Array(a);xc(b,d,0,a,0);"utf8"===c&&(d=wb(d));ta(b);return d} -function yc(a,b,c){a=la("/dev/"+a);var d=ma(!!b,!!c);yc.Sb??(yc.Sb=64);var f=yc.Sb++<<8|0;Bb(f,{open(g){g.seekable=!1},close(){c?.buffer?.length&&c(10)},read(g,p,v,z){for(var x=0,B=0;B>2]=b.dev;I[a+4>>2]=b.mode;I[a+8>>2]=b.nlink;I[a+12>>2]=b.uid;I[a+16>>2]=b.gid;I[a+20>>2]=b.rdev;O[a+24>>3]=BigInt(b.size);H[a+32>>2]=4096;H[a+36>>2]=b.blocks;var c=b.atime.getTime(),d=b.mtime.getTime(),f=b.ctime.getTime();O[a+40>>3]=BigInt(Math.floor(c/1E3));I[a+48>>2]=c%1E3*1E6;O[a+56>>3]=BigInt(Math.floor(d/1E3));I[a+64>>2]=d%1E3*1E6;O[a+72>>3]=BigInt(Math.floor(f/1E3));I[a+80>>2]=f%1E3*1E6;O[a+88>>3]=BigInt(b.ino);return 0} -var Mc=void 0,jd=()=>{var a=H[+Mc>>2];Mc+=4;return a},kd=0,ld=[0,31,60,91,121,152,182,213,244,274,305,335],md=[0,31,59,90,120,151,181,212,243,273,304,334],nd={},od=a=>{Ta=a;nb||0{if(!Sa)try{a()}catch(b){b instanceof db||"unwind"==b||Da(1,b)}finally{if(!(nb||0{if(!rd){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(globalThis.navigator?.language?? -"C").replace("-","_")+".UTF-8",_:Ca||"./this.program"},b;for(b in qd)void 0===qd[b]?delete a[b]:a[b]=qd[b];var c=[];for(b in a)c.push(`${b}=${a[b]}`);rd=c}return rd},rd,td=(a,b,c,d)=>{var f={string:x=>{var B=0;if(null!==x&&void 0!==x&&0!==x){B=yb(x)+1;var L=ua(B);Q(x,C,L,B);B=L}return B},array:x=>{var B=ua(x.length);n.set(x,B);return B}};a=l["_"+a];var g=[],p=0;if(d)for(var v=0;v{var b=yb(a)+1,c=ha(b);c&&Q(a,C,c,b);return c},ud,vd=[],D=a=>{ud.delete(wd.get(a));wd.set(a,null);vd.push(a)},xd=a=>{const b=a.length;return[b%128|128,b>>7,...a]},yd={i:127,p:127,j:126,f:125,d:124,e:111},zd=a=>xd(Array.from(a,b=>yd[b])),G=(a,b)=>{if(!ud){ud=new WeakMap;var c=wd.length;if(ud)for(var d=0;d<0+c;d++){var f=wd.get(d);f&&ud.set(f,d)}}if(c=ud.get(a)||0)return c;c=vd.length?vd.pop():wd.grow(1);try{wd.set(c,a)}catch(g){if(!(g instanceof TypeError))throw g; -b=Uint8Array.of(0,97,115,109,1,0,0,0,1,...xd([1,96,...zd(b.slice(1)),...zd("v"===b[0]?"":b[0])]),2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0);b=new WebAssembly.Module(b);b=(new WebAssembly.Instance(b,{e:{f:a}})).exports.f;wd.set(c,b)}ud.set(a,c);return c};$b=Array(4096);oc(T,"/");X("/tmp");X("/home");X("/home/web_user"); -(function(){X("/dev");Bb(259,{read:()=>0,write:(d,f,g,p)=>p,fb:()=>0});qc("/dev/null",259);Ab(1280,Db);Ab(1536,Eb);qc("/dev/tty",1280);qc("/dev/tty1",1536);var a=new Uint8Array(1024),b=0,c=()=>{0===b&&(ub(a),b=a.byteLength);return a[--b]};yc("random",c);yc("urandom",c);X("/dev/shm");X("/dev/shm/tmp")})(); -(function(){X("/proc");var a=X("/proc/self");X("/proc/self/fd");oc({jb(){var b=Hb(a,"fd",16895,73);b.Ua={fb:T.Ua.fb};b.Ta={lookup(c,d){c=+d;var f=W(c);c={parent:null,jb:{Tb:"fake"},Ta:{readlink:()=>f.path},id:c+1};return c.parent=c},readdir(){return Array.from(Yb.entries()).filter(([,c])=>c).map(([c])=>c.toString())}};return b}},"/proc/self/fd")})();l.noExitRuntime&&(nb=l.noExitRuntime);l.print&&(Ka=l.print);l.printErr&&(Qa=l.printErr);l.wasmBinary&&(Ra=l.wasmBinary);l.thisProgram&&(Ca=l.thisProgram); -if(l.preInit)for("function"==typeof l.preInit&&(l.preInit=[l.preInit]);0xa();l.stackRestore=a=>za(a);l.stackAlloc=a=>ua(a);l.cwrap=(a,b,c,d)=>{var f=!c||c.every(g=>"number"===g||"boolean"===g);return"string"!==b&&f&&!d?l["_"+a]:(...g)=>td(a,b,c,g)};l.addFunction=G;l.removeFunction=D;l.UTF8ToString=E;l.stringToNewUTF8=ja;l.writeArrayToMemory=(a,b)=>{n.set(a,b)}; -var ha,ia,Vb,Ad,za,ua,xa,Ya,wd,Bd={a:(a,b,c,d)=>Za(`Assertion failed: ${E(a)}, at: `+[b?E(b):"unknown filename",c,d?E(d):"unknown function"]),i:function(a,b){try{return a=E(a),qa(a,b),0}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return-c.Xa}},L:function(a,b,c){try{b=E(b);b=zc(a,b);if(c&-8)return-28;var d=V(b,{pb:!0}).node;if(!d)return-44;a="";c&4&&(a+="r");c&2&&(a+="w");c&1&&(a+="x");return a&&gc(d,a)?-2:0}catch(f){if("undefined"==typeof Y||"ErrnoError"!==f.name)throw f;return-f.Xa}}, -j:function(a,b){try{var c=W(a);uc(c,c.node,b,!1);return 0}catch(d){if("undefined"==typeof Y||"ErrnoError"!==d.name)throw d;return-d.Xa}},h:function(a){try{var b=W(a);nc(b,b.node,{timestamp:Date.now(),ac:!1});return 0}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return-c.Xa}},b:function(a,b,c){Mc=c;try{var d=W(a);switch(b){case 0:var f=jd();if(0>f)break;for(;Yb[f];)f++;return mc(d,f).fd;case 1:case 2:return 0;case 3:return d.flags;case 4:return f=jd(),d.flags|=f,0;case 12:return f= -jd(),Ua[f+0>>1]=2,0;case 13:case 14:return 0}return-28}catch(g){if("undefined"==typeof Y||"ErrnoError"!==g.name)throw g;return-g.Xa}},g:function(a,b){try{var c=W(a),d=c.node,f=c.Ua.bb;a=f?c:d;f??=d.Ta.bb;kc(f);var g=f(a);return Ac(b,g)}catch(p){if("undefined"==typeof Y||"ErrnoError"!==p.name)throw p;return-p.Xa}},H:function(a,b){b=-9007199254740992>b||9007199254740992b||0===(c.flags&2097155))throw new R(28);vc(c,c.node,b);return 0}catch(d){if("undefined"== -typeof Y||"ErrnoError"!==d.name)throw d;return-d.Xa}},G:function(a,b){try{if(0===b)return-28;var c=yb("/")+1;if(b=d)return-28;var f=V(b).node;if(!f)throw new R(44);if(!f.Ta.readlink)throw new R(28);var g=f.Ta.readlink(f);var p=Math.min(d,yb(g)),v=n[c+p]; -Q(g,C,c,d+1);n[c+p]=v;return p}catch(z){if("undefined"==typeof Y||"ErrnoError"!==z.name)throw z;return-z.Xa}},u:function(a){try{return a=E(a),sc(a),0}catch(b){if("undefined"==typeof Y||"ErrnoError"!==b.name)throw b;return-b.Xa}},f:function(a,b){try{return a=E(a),Ac(b,tc(a))}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return-c.Xa}},r:function(a,b,c){try{b=E(b);b=zc(a,b);if(c)if(512===c)sc(b);else return-28;else Ba(b);return 0}catch(d){if("undefined"==typeof Y||"ErrnoError"!==d.name)throw d; -return-d.Xa}},q:function(a,b,c){try{b=E(b);b=zc(a,b,!0);var d=Date.now(),f,g;if(c){var p=I[c>>2]+4294967296*H[c+4>>2],v=H[c+8>>2];1073741823==v?f=d:1073741822==v?f=null:f=1E3*p+v/1E6;c+=16;p=I[c>>2]+4294967296*H[c+4>>2];v=H[c+8>>2];1073741823==v?g=d:1073741822==v?g=null:g=1E3*p+v/1E6}else g=f=d;if(null!==(g??f)){a=f;var z=V(b,{pb:!0}).node;kc(z.Ta.eb)(z,{atime:a,mtime:g})}return 0}catch(x){if("undefined"==typeof Y||"ErrnoError"!==x.name)throw x;return-x.Xa}},m:()=>Za(""),l:()=>{nb=!1;kd=0},A:function(a, -b){a=-9007199254740992>a||9007199254740992>2]=a.getSeconds();H[b+4>>2]=a.getMinutes();H[b+8>>2]=a.getHours();H[b+12>>2]=a.getDate();H[b+16>>2]=a.getMonth();H[b+20>>2]=a.getFullYear()-1900;H[b+24>>2]=a.getDay();var c=a.getFullYear();H[b+28>>2]=(0!==c%4||0===c%100&&0!==c%400?md:ld)[a.getMonth()]+a.getDate()-1|0;H[b+36>>2]=-(60*a.getTimezoneOffset());c=(new Date(a.getFullYear(),6,1)).getTimezoneOffset();var d=(new Date(a.getFullYear(),0,1)).getTimezoneOffset(); -H[b+32>>2]=(c!=d&&a.getTimezoneOffset()==Math.min(d,c))|0},y:function(a,b,c,d,f,g,p){f=-9007199254740992>f||9007199254740992>2]=z.Ub;I[p>>2]=x;return 0}catch(B){if("undefined"==typeof Y||"ErrnoError"!==B.name)throw B;return-B.Xa}},z:function(a,b,c,d,f,g){g=-9007199254740992>g|| -9007199254740992{nd[a]&&(clearTimeout(nd[a].id),delete nd[a]);if(!b)return 0;var c=setTimeout(()=>{delete nd[a];pd(()=>Ad(a,performance.now()))},b);nd[a]={id:c,Dc:b};return 0},B:(a,b,c,d)=>{var f=(new Date).getFullYear(),g=(new Date(f,0,1)).getTimezoneOffset(); -f=(new Date(f,6,1)).getTimezoneOffset();I[a>>2]=60*Math.max(g,f);H[b>>2]=Number(g!=f);b=p=>{var v=Math.abs(p);return`UTC${0<=p?"-":"+"}${String(Math.floor(v/60)).padStart(2,"0")}${String(v%60).padStart(2,"0")}`};a=b(g);b=b(f);fDate.now(),s:()=>2147483648,c:()=>performance.now(),o:a=>{var b=C.length;a>>>=0;if(2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);a:{d=(Math.min(2147483648,65536*Math.ceil(Math.max(a, -d)/65536))-Ya.buffer.byteLength+65535)/65536|0;try{Ya.grow(d);Xa();var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},E:(a,b)=>{var c=0,d=0,f;for(f of sd()){var g=b+c;I[a+d>>2]=g;c+=Q(f,C,g,Infinity)+1;d+=4}return 0},F:(a,b)=>{var c=sd();I[a>>2]=c.length;a=0;for(var d of c)a+=yb(d)+1;I[b>>2]=a;return 0},e:function(a){try{var b=W(a);ta(b);return 0}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return c.Xa}},p:function(a,b){try{var c=W(a);n[b]=c.tty?2:U(c.mode)?3:40960===(c.mode& -61440)?7:4;Ua[b+2>>1]=0;O[b+8>>3]=BigInt(0);O[b+16>>3]=BigInt(0);return 0}catch(d){if("undefined"==typeof Y||"ErrnoError"!==d.name)throw d;return d.Xa}},w:function(a,b,c,d){try{a:{var f=W(a);a=b;for(var g,p=b=0;p>2],z=I[a+4>>2];a+=8;var x=xc(f,n,v,z,g);if(0>x){var B=-1;break a}b+=x;if(x>2]=B;return 0}catch(L){if("undefined"==typeof Y||"ErrnoError"!==L.name)throw L;return L.Xa}},D:function(a,b,c,d){b=-9007199254740992>b||9007199254740992< -b?NaN:Number(b);try{if(isNaN(b))return 61;var f=W(a);wc(f,b,c);O[d>>3]=BigInt(f.position);f.Gb&&0===b&&0===c&&(f.Gb=null);return 0}catch(g){if("undefined"==typeof Y||"ErrnoError"!==g.name)throw g;return g.Xa}},I:function(a){try{var b=W(a);return b.Ua?.fsync?.(b)}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return c.Xa}},t:function(a,b,c,d){try{a:{var f=W(a);a=b;for(var g,p=b=0;p>2],z=I[a+4>>2];a+=8;var x=sa(f,n,v,z,g);if(0>x){var B=-1;break a}b+=x;if(x>2]=B;return 0}catch(L){if("undefined"==typeof Y||"ErrnoError"!==L.name)throw L;return L.Xa}},k:od}; -function Cd(){function a(){l.calledRun=!0;if(!Sa){if(!l.noFSInit&&!ac){var b,c;ac=!0;b??=l.stdin;c??=l.stdout;d??=l.stderr;b?yc("stdin",b):rc("/dev/tty","/dev/stdin");c?yc("stdout",null,c):rc("/dev/tty","/dev/stdout");d?yc("stderr",null,d):rc("/dev/tty1","/dev/stderr");ra("/dev/stdin",0);ra("/dev/stdout",1);ra("/dev/stderr",1)}Dd.N();bc=!1;l.onRuntimeInitialized?.();if(l.postRun)for("function"==typeof l.postRun&&(l.postRun=[l.postRun]);l.postRun.length;){var d=l.postRun.shift();fb.push(d)}eb(fb)}} -if(0{setTimeout(()=>l.setStatus(""),1);a()},1)):a()}}var Dd; -(async function(){function a(c){c=Dd=c.exports;l._sqlite3_free=c.P;l._sqlite3_value_text=c.Q;l._sqlite3_prepare_v2=c.R;l._sqlite3_step=c.S;l._sqlite3_reset=c.T;l._sqlite3_exec=c.U;l._sqlite3_finalize=c.V;l._sqlite3_column_name=c.W;l._sqlite3_column_text=c.X;l._sqlite3_column_type=c.Y;l._sqlite3_errmsg=c.Z;l._sqlite3_clear_bindings=c._;l._sqlite3_value_blob=c.$;l._sqlite3_value_bytes=c.aa;l._sqlite3_value_double=c.ba;l._sqlite3_value_int=c.ca;l._sqlite3_value_type=c.da;l._sqlite3_result_blob=c.ea; -l._sqlite3_result_double=c.fa;l._sqlite3_result_error=c.ga;l._sqlite3_result_int=c.ha;l._sqlite3_result_int64=c.ia;l._sqlite3_result_null=c.ja;l._sqlite3_result_text=c.ka;l._sqlite3_aggregate_context=c.la;l._sqlite3_column_count=c.ma;l._sqlite3_data_count=c.na;l._sqlite3_column_blob=c.oa;l._sqlite3_column_bytes=c.pa;l._sqlite3_column_double=c.qa;l._sqlite3_bind_blob=c.ra;l._sqlite3_bind_double=c.sa;l._sqlite3_bind_int=c.ta;l._sqlite3_bind_text=c.ua;l._sqlite3_bind_parameter_index=c.va;l._sqlite3_sql= -c.wa;l._sqlite3_normalized_sql=c.xa;l._sqlite3_changes=c.ya;l._sqlite3_close_v2=c.za;l._sqlite3_progress_handler=c.Aa;l._sqlite3_interrupt=c.Ba;l._sqlite3_create_function_v2=c.Ca;l._sqlite3_update_hook=c.Da;l._sqlite3_open=c.Ea;l._sqlite3_get_autocommit=c.Fa;ha=l._malloc=c.Ga;ia=l._free=c.Ha;l._RegisterExtensionFunctions=c.Ia;l._sqljs_vfs_register=c.Ja;l._sqljs_open_paged=c.Ka;l._sqljs_vfs_register_rw=c.La;l._sqljs_open_paged_rw=c.Ma;l._sqlite_explorer_register_query_plan=c.Na;Vb=c.Oa;Ad=c.Pa;za= -c.Qa;ua=c.Ra;xa=c.Sa;Ya=c.M;wd=c.O;Xa();lb--;l.monitorRunDependencies?.(lb);0==lb&&mb&&(c=mb,mb=null,c());return Dd}lb++;l.monitorRunDependencies?.(lb);var b={a:Bd};if(l.instantiateWasm)return new Promise(c=>{l.instantiateWasm(b,(d,f)=>{c(a(d,f))})});$a??=l.locateFile?l.locateFile("sql-wasm.wasm",Fa):Fa+"sql-wasm.wasm";return a((await cb(b)).instance)})();Cd(); +function V(a,b={}){if(!a)throw new S(44);b.Fb??(b.Fb=!0);"/"===a.charAt(0)||(a="//"+a);var c=0;a:for(;40>c;c++){a=a.split("/").filter(v=>!!v);for(var d=Yb,f="/",h=0;h>>0)%bc.length} +function Vb(a){var b=hc(a.parent.id,a.name);if(bc[b]===a)bc[b]=a.rb;else for(b=bc[b];b;){if(b.rb===a){b.rb=a.rb;break}b=b.rb}}function Ib(a,b){var c=U(a.mode)?(c=ic(a,"x"))?c:a.Ta.lookup?0:2:54;if(c)throw new S(c);for(c=bc[hc(a.id,b)];c;c=c.rb){var d=c.name;if(c.parent.id===a.id&&d===b)return c}return a.Ta.lookup(a,b)}function Hb(a,b,c,d){a=new gc(a,b,c,d);b=hc(a.parent.id,a.name);a.rb=bc[b];return bc[b]=a}function U(a){return 16384===(a&61440)} +function jc(a){var b=["r","w","rw"][a&3];a&512&&(b+="w");return b}function ic(a,b){if(dc)return 0;if(!b.includes("r")||a.mode&292){if(b.includes("w")&&!(a.mode&146)||b.includes("x")&&!(a.mode&73))return 2}else return 2;return 0}function kc(a,b){if(!U(a.mode))return 54;try{return Ib(a,b),20}catch(c){}return ic(a,"wx")} +function lc(a,b,c){try{var d=Ib(a,b)}catch(f){return f.Xa}if(a=ic(a,"wx"))return a;if(c){if(!U(d.mode))return 54;if(d===d.parent||"/"===ka(d))return 10}else if(U(d.mode))return 31;return 0}function mc(a){if(!a)throw new S(63);return a}function W(a){a=$b[a];if(!a)throw new S(8);return a}function nc(a,b=-1){a=Object.assign(new fc,a);if(-1==b)a:{for(b=0;4096>=b;b++)if(!$b[b])break a;throw new S(33);}a.fd=b;return $b[b]=a}function oc(a,b=-1){a=nc(a,b);a.Ua?.wc?.(a);return a} +function pc(a,b,c){var d=a?.Ua.eb;a=d?a:b;d??=b.Ta.eb;mc(d);d(a,c)}var Eb={open(a){a.Ua=Zb[a.node.rdev].Ua;a.Ua.open?.(a)},gb(){throw new S(70);}};function Ab(a,b){Zb[a]={Ua:b}}function qc(a,b){var c="/"===b;if(c&&Yb)throw new S(10);if(!c&&b){var d=V(b,{Fb:!1});b=d.path;d=d.node;if(d.qb)throw new S(10);if(!U(d.mode))throw new S(54);}b={type:a,Cc:{},Tb:b,lc:[]};a=a.kb(b);a.kb=b;b.root=a;c?Yb=a:d&&(d.qb=b,d.kb&&d.kb.lc.push(b))} +function rc(a,b,c){var d=V(a,{parent:!0}).node;a=rb(a);if(!a)throw new S(28);if("."===a||".."===a)throw new S(20);var f=kc(d,a);if(f)throw new S(f);if(!d.Ta.yb)throw new S(63);return d.Ta.yb(d,a,b,c)}function na(a,b=438){return rc(a,b&4095|32768,0)}function X(a,b=511){return rc(a,b&1023|16384,0)}function sc(a,b,c){"undefined"==typeof c&&(c=b,b=438);rc(a,b|8192,c)} +function tc(a,b){if(!ub(a))throw new S(44);var c=V(b,{parent:!0}).node;if(!c)throw new S(44);b=rb(b);var d=kc(c,b);if(d)throw new S(d);if(!c.Ta.symlink)throw new S(63);c.Ta.symlink(c,b,a)}function uc(a){var b=V(a,{parent:!0}).node;a=rb(a);var c=Ib(b,a),d=lc(b,a,!0);if(d)throw new S(d);if(!b.Ta.rmdir)throw new S(63);if(c.qb)throw new S(10);b.Ta.rmdir(b,a);Vb(c)} +function Ba(a){var b=V(a,{parent:!0}).node;if(!b)throw new S(44);a=rb(a);var c=Ib(b,a),d=lc(b,a,!1);if(d)throw new S(d);if(!b.Ta.unlink)throw new S(63);if(c.qb)throw new S(10);b.Ta.unlink(b,a);Vb(c)}function vc(a,b){a=V(a,{pb:!b}).node;return mc(a.Ta.bb)(a)}function wc(a,b,c,d){pc(a,b,{mode:c&4095|b.mode&-4096,ctime:Date.now(),ac:d})}function oa(a,b){a="string"==typeof a?V(a,{pb:!0}).node:a;wc(null,a,b)} +function xc(a,b,c){if(U(b.mode))throw new S(31);if(32768!==(b.mode&61440))throw new S(28);var d=ic(b,"w");if(d)throw new S(d);pc(a,b,{size:c,timestamp:Date.now()})} +function pa(a,b,c=438){if(""===a)throw new S(44);if("string"==typeof b){var d={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090}[b];if("undefined"==typeof d)throw Error(`Unknown file open mode: ${b}`);b=d}c=b&64?c&4095|32768:0;if("object"==typeof a)d=a;else{var f=a.endsWith("/");a=V(a,{pb:!(b&131072),mc:!0});d=a.node;a=a.path}var h=!1;if(b&64)if(d){if(b&128)throw new S(20);}else{if(f)throw new S(31);d=rc(a,c|511,0);h=!0}if(!d)throw new S(44);8192===(d.mode&61440)&&(b&=-513);if(b&65536&&!U(d.mode))throw new S(54); +if(!h&&(f=d?40960===(d.mode&61440)?32:U(d.mode)&&("r"!==jc(b)||b&576)?31:ic(d,jc(b)):44))throw new S(f);b&512&&!h&&(f=d,f="string"==typeof f?V(f,{pb:!0}).node:f,xc(null,f,0));b&=-131713;f=nc({node:d,path:ka(d),flags:b,seekable:!0,position:0,Ua:d.Ua,pc:[],error:!1});f.Ua.open&&f.Ua.open(f);h&&oa(d,c&511);!m.logReadFiles||b&1||a in ec||(ec[a]=1);return f}function ta(a){if(null===a.fd)throw new S(8);a.Gb&&(a.Gb=null);try{a.Ua.close&&a.Ua.close(a)}catch(b){throw b;}finally{$b[a.fd]=null}a.fd=null} +function yc(a,b,c){if(null===a.fd)throw new S(8);if(!a.seekable||!a.Ua.gb)throw new S(70);if(0!=c&&1!=c&&2!=c)throw new S(28);a.position=a.Ua.gb(a,b,c);a.pc=[]}function zc(a,b,c,d,f){if(0>d||0>f)throw new S(28);if(null===a.fd)throw new S(8);if(1===(a.flags&2097155))throw new S(8);if(U(a.node.mode))throw new S(31);if(!a.Ua.read)throw new S(28);var h="undefined"!=typeof f;if(!h)f=a.position;else if(!a.seekable)throw new S(70);b=a.Ua.read(a,b,c,d,f);h||(a.position+=b);return b} +function sa(a,b,c,d,f){if(0>d||0>f)throw new S(28);if(null===a.fd)throw new S(8);if(0===(a.flags&2097155))throw new S(8);if(U(a.node.mode))throw new S(31);if(!a.Ua.write)throw new S(28);a.seekable&&a.flags&1024&&yc(a,0,2);var h="undefined"!=typeof f;if(!h)f=a.position;else if(!a.seekable)throw new S(70);b=a.Ua.write(a,b,c,d,f,void 0);h||(a.position+=b);return b} +function Aa(a){var b=b||0;var c="binary";"utf8"!==c&&"binary"!==c&&Ya(`Invalid encoding type "${c}"`);b=pa(a,b);a=vc(a).size;var d=new Uint8Array(a);zc(b,d,0,a,0);"utf8"===c&&(d=vb(d));ta(b);return d} +function Ac(a,b,c){a=la("/dev/"+a);var d=ma(!!b,!!c);Ac.Sb??(Ac.Sb=64);var f=Ac.Sb++<<8|0;Ab(f,{open(h){h.seekable=!1},close(){c?.buffer?.length&&c(10)},read(h,l,v,z){for(var x=0,A=0;A>2]=b.dev;K[a+4>>2]=b.mode;K[a+8>>2]=b.nlink;K[a+12>>2]=b.uid;K[a+16>>2]=b.gid;K[a+20>>2]=b.rdev;P[a+24>>3]=BigInt(b.size);H[a+32>>2]=4096;H[a+36>>2]=b.blocks;var c=b.atime.getTime(),d=b.mtime.getTime(),f=b.ctime.getTime();P[a+40>>3]=BigInt(Math.floor(c/1E3));K[a+48>>2]=c%1E3*1E6;P[a+56>>3]=BigInt(Math.floor(d/1E3));K[a+64>>2]=d%1E3*1E6;P[a+72>>3]=BigInt(Math.floor(f/1E3));K[a+80>>2]=f%1E3*1E6;P[a+88>>3]=BigInt(b.ino);return 0} +var Oc=void 0,ld=()=>{var a=H[+Oc>>2];Oc+=4;return a},md=0,nd=[0,31,60,91,121,152,182,213,244,274,305,335],od=[0,31,59,90,120,151,181,212,243,273,304,334],pd={},qd=a=>{Sa=a;mb||0{if(!Ra)try{a()}catch(b){b instanceof cb||"unwind"==b||Da(1,b)}finally{if(!(mb||0{if(!td){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(globalThis.navigator?.language?? +"C").replace("-","_")+".UTF-8",_:Ca||"./this.program"},b;for(b in sd)void 0===sd[b]?delete a[b]:a[b]=sd[b];var c=[];for(b in a)c.push(`${b}=${a[b]}`);td=c}return td},td,vd=(a,b,c,d)=>{var f={string:x=>{var A=0;if(null!==x&&void 0!==x&&0!==x){A=xb(x)+1;var N=ua(A);R(x,C,N,A);A=N}return A},array:x=>{var A=ua(x.length);p.set(x,A);return A}};a=m["_"+a];var h=[],l=0;if(d)for(var v=0;v{var b=xb(a)+1,c=fa(b);c&&R(a,C,c,b);return c},wd,xd=[],B=a=>{wd.delete(yd.get(a));yd.set(a,null);xd.push(a)},zd=a=>{const b=a.length;return[b%128|128,b>>7,...a]},Ad={i:127,p:127,j:126,f:125,d:124,e:111},Bd=a=>zd(Array.from(a,b=>Ad[b])),G=(a,b)=>{if(!wd){wd=new WeakMap;var c=yd.length;if(wd)for(var d=0;d<0+c;d++){var f=yd.get(d);f&&wd.set(f,d)}}if(c=wd.get(a)||0)return c;c=xd.length?xd.pop():yd.grow(1);try{yd.set(c,a)}catch(h){if(!(h instanceof TypeError))throw h; +b=Uint8Array.of(0,97,115,109,1,0,0,0,1,...zd([1,96,...Bd(b.slice(1)),...Bd("v"===b[0]?"":b[0])]),2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0);b=new WebAssembly.Module(b);b=(new WebAssembly.Instance(b,{e:{f:a}})).exports.f;yd.set(c,b)}wd.set(a,c);return c};bc=Array(4096);qc(T,"/");X("/tmp");X("/home");X("/home/web_user"); +(function(){X("/dev");Ab(259,{read:()=>0,write:(d,f,h,l)=>l,gb:()=>0});sc("/dev/null",259);zb(1280,Cb);zb(1536,Db);sc("/dev/tty",1280);sc("/dev/tty1",1536);var a=new Uint8Array(1024),b=0,c=()=>{0===b&&(tb(a),b=a.byteLength);return a[--b]};Ac("random",c);Ac("urandom",c);X("/dev/shm");X("/dev/shm/tmp")})(); +(function(){X("/proc");var a=X("/proc/self");X("/proc/self/fd");qc({kb(){var b=Hb(a,"fd",16895,73);b.Ua={gb:T.Ua.gb};b.Ta={lookup(c,d){c=+d;var f=W(c);c={parent:null,kb:{Tb:"fake"},Ta:{readlink:()=>f.path},id:c+1};return c.parent=c},readdir(){return Array.from($b.entries()).filter(([,c])=>c).map(([c])=>c.toString())}};return b}},"/proc/self/fd")})();m.noExitRuntime&&(mb=m.noExitRuntime);m.print&&(Ja=m.print);m.printErr&&(Pa=m.printErr);m.wasmBinary&&(Qa=m.wasmBinary);m.thisProgram&&(Ca=m.thisProgram); +if(m.preInit)for("function"==typeof m.preInit&&(m.preInit=[m.preInit]);0va();m.stackRestore=a=>za(a);m.stackAlloc=a=>ua(a);m.cwrap=(a,b,c,d)=>{var f=!c||c.every(h=>"number"===h||"boolean"===h);return"string"!==b&&f&&!d?m["_"+a]:(...h)=>vd(a,b,c,h)};m.addFunction=G;m.removeFunction=B;m.UTF8ToString=F;m.stringToNewUTF8=ja;m.writeArrayToMemory=(a,b)=>{p.set(a,b)}; +var fa,ia,Xb,Cd,za,ua,va,Xa,yd,Dd={a:(a,b,c,d)=>Ya(`Assertion failed: ${F(a)}, at: `+[b?F(b):"unknown filename",c,d?F(d):"unknown function"]),i:function(a,b){try{return a=F(a),oa(a,b),0}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return-c.Xa}},L:function(a,b,c){try{b=F(b);b=Bc(a,b);if(c&-8)return-28;var d=V(b,{pb:!0}).node;if(!d)return-44;a="";c&4&&(a+="r");c&2&&(a+="w");c&1&&(a+="x");return a&&ic(d,a)?-2:0}catch(f){if("undefined"==typeof Y||"ErrnoError"!==f.name)throw f;return-f.Xa}}, +j:function(a,b){try{var c=W(a);wc(c,c.node,b,!1);return 0}catch(d){if("undefined"==typeof Y||"ErrnoError"!==d.name)throw d;return-d.Xa}},h:function(a){try{var b=W(a);pc(b,b.node,{timestamp:Date.now(),ac:!1});return 0}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return-c.Xa}},b:function(a,b,c){Oc=c;try{var d=W(a);switch(b){case 0:var f=ld();if(0>f)break;for(;$b[f];)f++;return oc(d,f).fd;case 1:case 2:return 0;case 3:return d.flags;case 4:return f=ld(),d.flags|=f,0;case 12:return f= +ld(),Ta[f+0>>1]=2,0;case 13:case 14:return 0}return-28}catch(h){if("undefined"==typeof Y||"ErrnoError"!==h.name)throw h;return-h.Xa}},g:function(a,b){try{var c=W(a),d=c.node,f=c.Ua.bb;a=f?c:d;f??=d.Ta.bb;mc(f);var h=f(a);return Cc(b,h)}catch(l){if("undefined"==typeof Y||"ErrnoError"!==l.name)throw l;return-l.Xa}},H:function(a,b){b=-9007199254740992>b||9007199254740992b||0===(c.flags&2097155))throw new S(28);xc(c,c.node,b);return 0}catch(d){if("undefined"== +typeof Y||"ErrnoError"!==d.name)throw d;return-d.Xa}},G:function(a,b){try{if(0===b)return-28;var c=xb("/")+1;if(b=d)return-28;var f=V(b).node;if(!f)throw new S(44);if(!f.Ta.readlink)throw new S(28);var h=f.Ta.readlink(f);var l=Math.min(d,xb(h)),v=p[c+l]; +R(h,C,c,d+1);p[c+l]=v;return l}catch(z){if("undefined"==typeof Y||"ErrnoError"!==z.name)throw z;return-z.Xa}},u:function(a){try{return a=F(a),uc(a),0}catch(b){if("undefined"==typeof Y||"ErrnoError"!==b.name)throw b;return-b.Xa}},f:function(a,b){try{return a=F(a),Cc(b,vc(a))}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return-c.Xa}},r:function(a,b,c){try{b=F(b);b=Bc(a,b);if(c)if(512===c)uc(b);else return-28;else Ba(b);return 0}catch(d){if("undefined"==typeof Y||"ErrnoError"!==d.name)throw d; +return-d.Xa}},q:function(a,b,c){try{b=F(b);b=Bc(a,b,!0);var d=Date.now(),f,h;if(c){var l=K[c>>2]+4294967296*H[c+4>>2],v=H[c+8>>2];1073741823==v?f=d:1073741822==v?f=null:f=1E3*l+v/1E6;c+=16;l=K[c>>2]+4294967296*H[c+4>>2];v=H[c+8>>2];1073741823==v?h=d:1073741822==v?h=null:h=1E3*l+v/1E6}else h=f=d;if(null!==(h??f)){a=f;var z=V(b,{pb:!0}).node;mc(z.Ta.eb)(z,{atime:a,mtime:h})}return 0}catch(x){if("undefined"==typeof Y||"ErrnoError"!==x.name)throw x;return-x.Xa}},m:()=>Ya(""),l:()=>{mb=!1;md=0},A:function(a, +b){a=-9007199254740992>a||9007199254740992>2]=a.getSeconds();H[b+4>>2]=a.getMinutes();H[b+8>>2]=a.getHours();H[b+12>>2]=a.getDate();H[b+16>>2]=a.getMonth();H[b+20>>2]=a.getFullYear()-1900;H[b+24>>2]=a.getDay();var c=a.getFullYear();H[b+28>>2]=(0!==c%4||0===c%100&&0!==c%400?od:nd)[a.getMonth()]+a.getDate()-1|0;H[b+36>>2]=-(60*a.getTimezoneOffset());c=(new Date(a.getFullYear(),6,1)).getTimezoneOffset();var d=(new Date(a.getFullYear(),0,1)).getTimezoneOffset(); +H[b+32>>2]=(c!=d&&a.getTimezoneOffset()==Math.min(d,c))|0},y:function(a,b,c,d,f,h,l){f=-9007199254740992>f||9007199254740992>2]=z.Ub;K[l>>2]=x;return 0}catch(A){if("undefined"==typeof Y||"ErrnoError"!==A.name)throw A;return-A.Xa}},z:function(a,b,c,d,f,h){h=-9007199254740992>h|| +9007199254740992{pd[a]&&(clearTimeout(pd[a].id),delete pd[a]);if(!b)return 0;var c=setTimeout(()=>{delete pd[a];rd(()=>Cd(a,performance.now()))},b);pd[a]={id:c,Dc:b};return 0},B:(a,b,c,d)=>{var f=(new Date).getFullYear(),h=(new Date(f,0,1)).getTimezoneOffset(); +f=(new Date(f,6,1)).getTimezoneOffset();K[a>>2]=60*Math.max(h,f);H[b>>2]=Number(h!=f);b=l=>{var v=Math.abs(l);return`UTC${0<=l?"-":"+"}${String(Math.floor(v/60)).padStart(2,"0")}${String(v%60).padStart(2,"0")}`};a=b(h);b=b(f);fDate.now(),s:()=>2147483648,c:()=>performance.now(),o:a=>{var b=C.length;a>>>=0;if(2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);a:{d=(Math.min(2147483648,65536*Math.ceil(Math.max(a, +d)/65536))-Xa.buffer.byteLength+65535)/65536|0;try{Xa.grow(d);Wa();var f=1;break a}catch(h){}f=void 0}if(f)return!0}return!1},E:(a,b)=>{var c=0,d=0,f;for(f of ud()){var h=b+c;K[a+d>>2]=h;c+=R(f,C,h,Infinity)+1;d+=4}return 0},F:(a,b)=>{var c=ud();K[a>>2]=c.length;a=0;for(var d of c)a+=xb(d)+1;K[b>>2]=a;return 0},e:function(a){try{var b=W(a);ta(b);return 0}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return c.Xa}},p:function(a,b){try{var c=W(a);p[b]=c.tty?2:U(c.mode)?3:40960===(c.mode& +61440)?7:4;Ta[b+2>>1]=0;P[b+8>>3]=BigInt(0);P[b+16>>3]=BigInt(0);return 0}catch(d){if("undefined"==typeof Y||"ErrnoError"!==d.name)throw d;return d.Xa}},w:function(a,b,c,d){try{a:{var f=W(a);a=b;for(var h,l=b=0;l>2],z=K[a+4>>2];a+=8;var x=zc(f,p,v,z,h);if(0>x){var A=-1;break a}b+=x;if(x>2]=A;return 0}catch(N){if("undefined"==typeof Y||"ErrnoError"!==N.name)throw N;return N.Xa}},D:function(a,b,c,d){b=-9007199254740992>b||9007199254740992< +b?NaN:Number(b);try{if(isNaN(b))return 61;var f=W(a);yc(f,b,c);P[d>>3]=BigInt(f.position);f.Gb&&0===b&&0===c&&(f.Gb=null);return 0}catch(h){if("undefined"==typeof Y||"ErrnoError"!==h.name)throw h;return h.Xa}},I:function(a){try{var b=W(a);return b.Ua?.fsync?.(b)}catch(c){if("undefined"==typeof Y||"ErrnoError"!==c.name)throw c;return c.Xa}},t:function(a,b,c,d){try{a:{var f=W(a);a=b;for(var h,l=b=0;l>2],z=K[a+4>>2];a+=8;var x=sa(f,p,v,z,h);if(0>x){var A=-1;break a}b+=x;if(x>2]=A;return 0}catch(N){if("undefined"==typeof Y||"ErrnoError"!==N.name)throw N;return N.Xa}},k:qd}; +function Ed(){function a(){m.calledRun=!0;if(!Ra){if(!m.noFSInit&&!cc){var b,c;cc=!0;b??=m.stdin;c??=m.stdout;d??=m.stderr;b?Ac("stdin",b):tc("/dev/tty","/dev/stdin");c?Ac("stdout",null,c):tc("/dev/tty","/dev/stdout");d?Ac("stderr",null,d):tc("/dev/tty1","/dev/stderr");pa("/dev/stdin",0);pa("/dev/stdout",1);pa("/dev/stderr",1)}Fd.N();dc=!1;m.onRuntimeInitialized?.();if(m.postRun)for("function"==typeof m.postRun&&(m.postRun=[m.postRun]);m.postRun.length;){var d=m.postRun.shift();eb.push(d)}db(eb)}} +if(0{setTimeout(()=>m.setStatus(""),1);a()},1)):a()}}var Fd; +(async function(){function a(c){c=Fd=c.exports;m._sqlite3_free=c.P;m._sqlite3_value_text=c.Q;m._sqlite3_prepare_v2=c.R;m._sqlite3_step=c.S;m._sqlite3_reset=c.T;m._sqlite3_exec=c.U;m._sqlite3_finalize=c.V;m._sqlite3_column_name=c.W;m._sqlite3_column_text=c.X;m._sqlite3_column_type=c.Y;m._sqlite3_errmsg=c.Z;m._sqlite3_clear_bindings=c._;m._sqlite3_value_blob=c.$;m._sqlite3_value_bytes=c.aa;m._sqlite3_value_double=c.ba;m._sqlite3_value_int=c.ca;m._sqlite3_value_type=c.da;m._sqlite3_result_blob=c.ea; +m._sqlite3_result_double=c.fa;m._sqlite3_result_error=c.ga;m._sqlite3_result_int=c.ha;m._sqlite3_result_int64=c.ia;m._sqlite3_result_null=c.ja;m._sqlite3_result_text=c.ka;m._sqlite3_aggregate_context=c.la;m._sqlite3_column_count=c.ma;m._sqlite3_data_count=c.na;m._sqlite3_column_blob=c.oa;m._sqlite3_column_bytes=c.pa;m._sqlite3_column_double=c.qa;m._sqlite3_bind_blob=c.ra;m._sqlite3_bind_double=c.sa;m._sqlite3_bind_int=c.ta;m._sqlite3_bind_text=c.ua;m._sqlite3_bind_parameter_index=c.va;m._sqlite3_sql= +c.wa;m._sqlite3_normalized_sql=c.xa;m._sqlite3_changes=c.ya;m._sqlite3_close_v2=c.za;m._sqlite3_progress_handler=c.Aa;m._sqlite3_interrupt=c.Ba;m._sqlite3_create_function_v2=c.Ca;m._sqlite3_update_hook=c.Da;m._sqlite3_open=c.Ea;m._sqlite3_get_autocommit=c.Fa;fa=m._malloc=c.Ga;ia=m._free=c.Ha;m._RegisterExtensionFunctions=c.Ia;m._sqljs_vfs_register=c.Ja;m._sqljs_open_paged=c.Ka;m._sqljs_vfs_register_rw=c.La;m._sqljs_open_paged_rw=c.Ma;m._sqlite_explorer_register_query_plan=c.Na;Xb=c.Oa;Cd=c.Pa;za= +c.Qa;ua=c.Ra;va=c.Sa;Xa=c.M;yd=c.O;Wa();kb--;m.monitorRunDependencies?.(kb);0==kb&&lb&&(c=lb,lb=null,c());return Fd}kb++;m.monitorRunDependencies?.(kb);var b={a:Dd};if(m.instantiateWasm)return new Promise(c=>{m.instantiateWasm(b,(d,f)=>{c(a(d,f))})});Za??=m.locateFile?m.locateFile("sql-wasm.wasm",Fa):Fa+"sql-wasm.wasm";return a((await bb(b)).instance)})();Ed(); // The shell-pre.js and emcc-generated code goes above diff --git a/website/public/sqlite-viewer/sql-wasm.wasm b/website/public/sqlite-viewer/sql-wasm.wasm index 4731f026..a5030fd0 100644 Binary files a/website/public/sqlite-viewer/sql-wasm.wasm and b/website/public/sqlite-viewer/sql-wasm.wasm differ