From 500568a1cd2de24c8a41fc9f241a0f4283fc9601 Mon Sep 17 00:00:00 2001 From: Diego Rodrigues de Sa e Souza Date: Wed, 2 Sep 2026 10:41:00 -0300 Subject: [PATCH] fix(providers): migrate web cookie TLS transport to wreq-js (#12429) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migrates the Claude, Grok, LMArena, Notion and Perplexity web-cookie transports from the tls-client-node/Koffi sidecar to the exactly pinned wreq-js 3.2.0 runtime, keeping the per-provider browser/OS profiles, making request cookies ephemeral, bounding and generation-protecting the shared native transport pool, removing the legacy downloader and repair path, and carrying the native binding and license evidence through the npm, standalone, Electron, Docker and Bun packaging surfaces. This is the consolidation of the two competing migrations, and the consolidation was decided by evidence rather than by preference. #11753's six suites were installed over this implementation and run as an independent specification: 31 of 36 passed. All five failures are artefacts of #11753 being the older design, not coverage gaps — - two hardcode the 3.0.0 pin in their assertions (this branch pins 3.2.0, which is what the release tip already resolves; #11753's 3.0.0 would have conflicted); - one reads open-sse/services/chatgptTlsClient.ts, deleted when #11754 retired ChatGPT Web, so the test is stale against the current tip; - two import WREQ_JS_NATIVE_BINARY_NAMES / resolveWreqJsNativeBinaryName, which this branch redesigned into WREQ_JS_NATIVE_BINDINGS / resolveWreqJsNativeBinding plus WREQ_JS_VERSION — a rename from modelling natives as file names to modelling them as package bindings, verified as an API difference rather than a lost capability (the linux-x64-gnu .node is present and serviceable). This branch is also the strict superset by scope: 7 files exclusive to it, including the wreq-js Rust license inventory and notices, .trivyignore, open-sse/utils/tlsClient.ts and assembleStandalone.mjs. #11753 had one exclusive file, its changelog fragment. Nothing needed porting, so #11753 is superseded rather than merged, and the changelog entry credits both. Reconciled on merge: clean against the tip. The new migration suite (tests/unit/tls-client-wreq-migration.test.ts, 1374 lines, 31 cases) is frozen at its exact LOC with the rationale — it shares one native-transport harness, so splitting it mid-merge would duplicate that harness for no coverage gain. Verified that no existing cap moves. Verified: 182/182 across the eight TLS, native-manifest, postinstall, standalone-bundle, pack-artifact and provider-validation suites, typecheck:core clean, check:cycles OK, check-changelog-integrity OK, check-file-size OK, and every changed TypeScript file parses. --- .env.example | 30 +- .github/workflows/electron-release.yml | 20 +- .trivyignore | 10 - Dockerfile | 15 +- Dockerfile.bun | 6 +- THIRD_PARTY_NOTICES.md | 46 + .../v3851-wreq-js-web-cookie-transport.md | 1 + config/quality/.license-allowlist.json | 6 - config/quality/dependency-allowlist.json | 1 - config/quality/file-size-baseline.json | 4 +- config/release/wreq-js-native-manifest.json | 159 + .../wreq-js-rust-license-inventory.json | 3111 ++++++ config/release/wreq-js-rust-notices.md | 9709 +++++++++++++++++ docs/guides/TROUBLESHOOTING.md | 10 +- docs/reference/ENVIRONMENT.md | 16 +- docs/security/STEALTH_GUIDE.md | 55 +- next.config.mjs | 3 - open-sse/executors/grok-web.ts | 4 +- open-sse/executors/lmarena.ts | 5 +- open-sse/executors/lmarena/models.ts | 6 +- open-sse/executors/lmarena/response.ts | 2 +- open-sse/executors/notion-web.ts | 83 +- open-sse/executors/perplexity-web.ts | 2 +- .../services/__tests__/grokTlsClient.test.ts | 13 +- open-sse/services/claudeTlsClient.ts | 10 +- open-sse/services/claudeTurnstileSolver.ts | 2 +- open-sse/services/grokTlsClient.ts | 8 +- open-sse/services/lmarenaTlsClient.ts | 9 +- open-sse/services/notionTlsClient.ts | 8 +- open-sse/services/perplexityTlsClient.ts | 8 +- open-sse/services/tlsClientBase.ts | 1313 ++- open-sse/services/tlsClientDownloadDir.ts | 23 - open-sse/utils/tlsClient.ts | 388 +- package-lock.json | 39 +- package.json | 8 +- pnpm-workspace.yaml | 4 - pnpm.json | 2 - scripts/build/assembleStandalone.mjs | 30 +- scripts/build/fixTlsClientNodeBinary.mjs | 148 - scripts/build/hydrateNativeDeps.mjs | 51 +- scripts/build/pack-artifact-policy.ts | 12 +- scripts/build/postinstall.mjs | 121 +- scripts/build/wreqJsNative.mjs | 131 + src/lib/providers/validation/webProvidersA.ts | 4 +- tests/unit/build/check-licenses.test.ts | 23 +- tests/unit/build/standalone-bundle.test.ts | 47 +- tests/unit/claude-web-slow-first-byte.test.ts | 25 +- tests/unit/executor-notion-web.test.ts | 50 +- .../fix-tls-client-node-binary-7802.test.ts | 113 - tests/unit/pack-artifact-policy.test.ts | 5 +- ...e-7134-claude-web-empty-error-body.test.ts | 62 +- .../provider-validation-specialty.test.ts | 4 +- .../unit/tls-client-download-dir-8579.test.ts | 80 - ...tls-client-node-docker-binary-7802.test.ts | 48 - tests/unit/tls-client-wreq-migration.test.ts | 1373 +++ tests/unit/tls-client-wreq-residue.test.ts | 93 + tests/unit/tls-profiles-valid-5591.test.mjs | 53 +- ...i-key-modal-validation-error-5088.test.tsx | 13 +- tests/unit/wreq-native-manifest.test.ts | 358 + tests/unit/wreq-postinstall-native.test.ts | 89 + 60 files changed, 16506 insertions(+), 1566 deletions(-) create mode 100644 changelog.d/fixes/v3851-wreq-js-web-cookie-transport.md create mode 100644 config/release/wreq-js-native-manifest.json create mode 100644 config/release/wreq-js-rust-license-inventory.json create mode 100644 config/release/wreq-js-rust-notices.md delete mode 100644 open-sse/services/tlsClientDownloadDir.ts delete mode 100644 scripts/build/fixTlsClientNodeBinary.mjs create mode 100644 scripts/build/wreqJsNative.mjs delete mode 100644 tests/unit/fix-tls-client-node-binary-7802.test.ts delete mode 100644 tests/unit/tls-client-download-dir-8579.test.ts delete mode 100644 tests/unit/tls-client-node-docker-binary-7802.test.ts create mode 100644 tests/unit/tls-client-wreq-migration.test.ts create mode 100644 tests/unit/tls-client-wreq-residue.test.ts create mode 100644 tests/unit/wreq-native-manifest.test.ts create mode 100644 tests/unit/wreq-postinstall-native.test.ts diff --git a/.env.example b/.env.example index c50a6517ad..4eb0369213 100644 --- a/.env.example +++ b/.env.example @@ -1466,17 +1466,15 @@ CURSOR_USER_AGENT="Cursor/3.4" # FIRECRAWL_BASE_URL=https://api.firecrawl.dev # FIRECRAWL_TIMEOUT_MS=30000 # Per-request timeout (default: 30000 = 30s) -# ── Claude TLS sidecar (Chromium-fingerprinted client) ── -# Used by: open-sse/services/claudeTlsClient.ts — wire-level timeout for -# the bogdanfinn/tls-client koffi binding and the JS-side grace window -# layered on top of it when the native library is wedged. +# ── Claude TLS transport (Chromium-fingerprinted client) ── +# Used by: open-sse/services/claudeTlsClient.ts — native wreq-js request timeout +# plus the absolute JS hard-deadline grace when the native request is wedged. # OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS=60000 # OMNIROUTE_CLAUDE_TLS_GRACE_MS=10000 -# ── Perplexity TLS sidecar (Firefox-fingerprinted client) ── -# Used by: open-sse/services/perplexityTlsClient.ts — wire-level timeout for -# the bogdanfinn/tls-client koffi binding and the JS-side grace window -# layered on top of it when the native library is wedged. +# ── Perplexity TLS transport (Firefox-fingerprinted client) ── +# Used by: open-sse/services/perplexityTlsClient.ts — native wreq-js request +# timeout plus the absolute JS hard-deadline grace. # OMNIROUTE_PPLX_TLS_TIMEOUT_MS=30000 # OMNIROUTE_PPLX_TLS_GRACE_MS=10000 @@ -1488,18 +1486,16 @@ CURSOR_USER_AGENT="Cursor/3.4" # meta-commentary. Set to 1/true/yes/on to restore the old behavior. # OMNIROUTE_PPLX_SEARCH_HINT=0 -# ── Grok web TLS sidecar (Chrome-fingerprinted client) ── -# Used by: open-sse/services/grokTlsClient.ts — wire-level timeout for the -# bogdanfinn/tls-client koffi binding and the JS-side grace window layered on -# top of it when the native library is wedged. +# ── Grok web TLS transport (Chrome-fingerprinted client) ── +# Used by: open-sse/services/grokTlsClient.ts — native wreq-js request timeout +# plus the absolute JS hard-deadline grace. # OMNIROUTE_GROK_TLS_TIMEOUT_MS=60000 # OMNIROUTE_GROK_TLS_GRACE_MS=10000 -# ── Notion web TLS sidecar (Chrome-fingerprinted client) ── -# Used by: open-sse/services/notionTlsClient.ts — wire-level timeout for the -# bogdanfinn/tls-client koffi binding and the JS-side grace window layered on -# top of it when the native library is wedged. The notion-web executor raises -# the wire timeout per-request to 180000 for long generations. +# ── Notion web TLS transport (Chrome-fingerprinted client) ── +# Used by: open-sse/services/notionTlsClient.ts — native wreq-js request timeout +# plus the absolute JS hard-deadline grace. The notion-web executor raises the +# native timeout per request to 180000 for long generations. # OMNIROUTE_NOTION_TLS_TIMEOUT_MS=30000 # OMNIROUTE_NOTION_TLS_GRACE_MS=10000 diff --git a/.github/workflows/electron-release.yml b/.github/workflows/electron-release.yml index d061d6769e..94fd16879f 100644 --- a/.github/workflows/electron-release.yml +++ b/.github/workflows/electron-release.yml @@ -187,6 +187,22 @@ jobs: env: NPM_CONFIG_LEGACY_PEER_DEPS: true + # The Linux leg produces x64 + arm64 installers from one x64 runner. npm + # deliberately installs only host-compatible optional dependencies, so + # hydrateNativeDeps cannot source the arm64 fork unless we fetch the exact + # package pinned in package-lock before either build path runs. + - name: Install Linux arm64 wreq binding for cross-package + if: matrix.platform == 'linux' + shell: bash + run: | + npm install --no-save --ignore-scripts --force --legacy-peer-deps \ + @wreq-js/binding-linux-arm64-gnu@3.2.0 + git diff --exit-code -- package.json package-lock.json + mkdir -p "$RUNNER_TEMP/omniroute-wreq-verify" + DATA_DIR="$RUNNER_TEMP/omniroute-wreq-verify" node --import tsx/esm --test \ + --test-name-pattern='wreq-js 3.2 manifest pins all nine' \ + tests/unit/wreq-native-manifest.test.ts + - name: Sanitize Windows home directory if: runner.os == 'Windows' shell: bash @@ -235,9 +251,9 @@ jobs: # targets, and no unlisted files) byte-for-byte. # hydrate: the bundle was built on ubuntu, so install-machine-forked native # optionals (@img/sharp-*, @img/sharp-libvips-*, @ngrok/ngrok-*, - # fsevents) carry linux forks. Replace them with the forks this + # @wreq-js/binding-*, fsevents) carry linux forks. Replace them with the forks this # leg's own `npm ci` resolved, then assert every bundled native - # (koffi triplets, better-sqlite3 prebuilds, wreq-js, onnxruntime) + # (better-sqlite3 prebuilds, wreq-js, onnxruntime) # can service this leg's platform/arch before packaging starts. run: | node scripts/build/standaloneBundle.mjs restore --archive web-bundle.tar.gz diff --git a/.trivyignore b/.trivyignore index d160ab6fb5..51023c5668 100644 --- a/.trivyignore +++ b/.trivyignore @@ -18,13 +18,3 @@ # # Keep this list SHORT and reviewed every release. Prefer fixing (rebuild on a # patched base / bump the dep) over suppressing. Stale entries are debt. -# -# CVE-2025-68121 — Go stdlib crypto/tls (session-resumption certificate validation) -# inside the PREBUILT bogdanfinn/tls-client v1.15.1 .so that tls-client-node's -# postinstall downloads (built with go 1.24.1; fixed in 1.24.13). No upstream -# rebuild exists (v1.15.1 is still the latest release) and nothing in this repo -# can bump it. The binary is only loaded by the browser-TLS web-provider -# executors (claude-web / grok-web / lmarena / perplexity-web / notion-web), -# whose handshakes go through utls. Tracking issue: #12084. Revisit at the next -# tls-client release or base-image bump and BEFORE the v3.8.51 tag (2026-09-15). -CVE-2025-68121 diff --git a/Dockerfile b/Dockerfile index 43d9a309ca..471cbc86d5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -103,25 +103,12 @@ RUN test -f package-lock.json \ # node-gyp comes from npm's own bundled copy (deterministic, already in the image) # instead of `npx --yes`, which would install an arbitrary registry version # on-demand and run its lifecycle scripts (Sonar docker:S6505). -# -# tls-client-node (claude-web/grok-web/lmarena/perplexity-web TLS -# impersonation) hits the same --ignore-scripts wall: its own postinstall.js -# fetches a platform .so/.dylib/.dll from the bogdanfinn/tls-client GitHub -# Releases API and is never invoked when npm ci skips lifecycle scripts. Unlike -# better-sqlite3 above, that script never throws on failure — it only -# `console.warn`s and exits 0 — so a rate-limited or offline build would -# otherwise succeed silently with an empty bin/ and only fail at first request -# in production (TlsClientUnavailableError, #7802). Run it explicitly here so -# a broken/rate-limited fetch fails the BUILD loudly instead of shipping a -# broken image. RUN --mount=type=cache,id=s/92ca8a61-c1ba-421f-a389-d48ac7258c2d-npm-cache,target=/root/.npm \ npm ci --include=optional --no-audit --no-fund --legacy-peer-deps --ignore-scripts \ && (cd node_modules/better-sqlite3 \ && node /usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js rebuild) \ && node -e "require('better-sqlite3')(':memory:').close()" \ - && node node_modules/tls-client-node/scripts/postinstall.js \ - && (test -n "$(find node_modules/tls-client-node/bin -mindepth 1 -print -quit 2>/dev/null)" \ - || (echo "tls-client-node native binary missing after postinstall — GitHub API fetch likely rate-limited or failed (#7802)" >&2 && exit 1)) + && node -e "const wreq=require('wreq-js'); if(typeof wreq.createTransport!=='function') process.exit(1)" # Build with Turbopack (stable in Next 16, the repo default). The v3.8.27-era # TurbopackInternalError panic ("entered unreachable code: there must be a path to a diff --git a/Dockerfile.bun b/Dockerfile.bun index f1c59962f2..cf7f662c75 100644 --- a/Dockerfile.bun +++ b/Dockerfile.bun @@ -31,10 +31,8 @@ COPY scripts/dev/sync-env.mjs ./scripts/dev/sync-env.mjs # Fast Bun native package install RUN bun install --include=optional --quiet -# Fetch tls-client-node native binary if script exists -RUN if [ -f "node_modules/tls-client-node/scripts/postinstall.js" ] && [ ! -d "node_modules/tls-client-node/bin" ]; then \ - bun node_modules/tls-client-node/scripts/postinstall.js || true; \ - fi +# Fail the build if wreq-js cannot resolve its current platform binding. +RUN bun -e "const wreq = require('wreq-js'); if (typeof wreq.createTransport !== 'function') process.exit(1)" # Smoke check native database driver used by Bun (bun:sqlite) RUN bun -e "import { Database } from 'bun:sqlite'; const db = new Database(':memory:'); db.query('SELECT 1 AS ok').get(); db.close(); console.log('bun:sqlite smoke: OK');" diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index 85635ec543..6188ef860e 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -1,5 +1,51 @@ # Third-Party Notices +## wreq-js 3.2.0 native transport + +OmniRoute ships `wreq-js@3.2.0` and its platform-specific native bindings for browser- +fingerprinted HTTP transport. The npm package and all nine binding tarballs are tied by npm SLSA +attestations to signed tag `v3.2.0` and immutable source commit +[`0d52d5fa252841aeef34d4d063b1766a59612bf7`](https://github.com/sqdshguy/wreq-js/commit/0d52d5fa252841aeef34d4d063b1766a59612bf7). + +- Root tarball: + +- npm integrity: + `sha512-dawhEbhvd5hxivKZSvv/mAQGO3mwZYESyctOvIIZ/H3DvQJzUM2UoFQsij0fg7hIClQ/GEQgg+2259UcFwhpMQ==` +- Exact platform, integrity, size, and SHA-256 receipts for all nine native addons: + [`config/release/wreq-js-native-manifest.json`](config/release/wreq-js-native-manifest.json) +- Locked per-target Cargo closure, with runtime and compile-only packages kept separate: + [`config/release/wreq-js-rust-license-inventory.json`](config/release/wreq-js-rust-license-inventory.json) +- Deduplicated license texts and attribution notices for the conservative native runtime closure, + including patched BoringSSL, Unicode ICU4X components, and Mozilla root-certificate data: + [`config/release/wreq-js-rust-notices.md`](config/release/wreq-js-rust-notices.md) + +The native tarballs themselves contain no LICENSE/NOTICE file. The bundled inventory is therefore +shipped beside them. It intentionally over-approximates the locked link-eligible Cargo closure; +exact post-LTO membership cannot be claimed without an upstream artifact SBOM/link map or a +reproducible-build receipt. The Android addon also dynamically requires `libc++_shared.so`, which +is not included in its npm tarball; any artifact that supplies that library needs its separate +LLVM/Apache-with-LLVM-exception notice. + +MIT License + +Copyright (c) 2025 will-work-for-meal +Copyright (c) 2025 Oleksandr Herasymov + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ## codex-chatgpt-web Parts of `open-sse/vendor/codex-chatgpt-web/` are adapted from diff --git a/changelog.d/fixes/v3851-wreq-js-web-cookie-transport.md b/changelog.d/fixes/v3851-wreq-js-web-cookie-transport.md new file mode 100644 index 0000000000..bd01e90798 --- /dev/null +++ b/changelog.d/fixes/v3851-wreq-js-web-cookie-transport.md @@ -0,0 +1 @@ +- **fix(providers):** Claude, Grok, LMArena, Notion, and Perplexity web-cookie transports now use pooled `wreq-js` 3.2 instead of the native sidecar, with all nine supported bindings pinned and audited, and the applicable platform binding plus native-license evidence included in each release artifact ([#12429](https://github.com/diegosouzapw/OmniRoute/pull/12429), supersedes [#11753](https://github.com/diegosouzapw/OmniRoute/pull/11753)). diff --git a/config/quality/.license-allowlist.json b/config/quality/.license-allowlist.json index 06dbba4aa0..f2cca50374 100644 --- a/config/quality/.license-allowlist.json +++ b/config/quality/.license-allowlist.json @@ -74,12 +74,6 @@ "justification": "CC-BY-4.0 applies to the caniuse browser-support data (a dataset, not code). The Creative Commons Attribution license requires attribution when distributing — OmniRoute does not distribute caniuse-lite data directly to end users; it is consumed by browserslist/PostCSS at build time to generate CSS compatibility info. This is a widely accepted pattern in the Node.js ecosystem (caniuse-lite is in millions of projects). Attribution is satisfied by keeping the package in node_modules with its original license file.", "risk": "low", "reviewAt": "v4.0.0" - }, - "tls-client-node": { - "license": "Custom: LICENSE (Apache-2.0 + Commons Clause)", - "justification": "TODO: revisar — tls-client-node uses Apache-2.0 with a 'Commons Clause' addendum that restricts 'Selling' the software (i.e., offering it as a hosted/commercial service whose value derives substantially from tls-client-node). OmniRoute is an open-source proxy; however if deployed as a paid SaaS/hosting service, this restriction could apply. The package is used by grokTlsClient.ts for Grok TLS fingerprinting. RISK: medium — legal review recommended before commercial deployment. Alternatives: consider replacing with a native TLS fingerprinting approach or a truly permissive library.", - "risk": "medium", - "reviewAt": "v3.9.0" } } } diff --git a/config/quality/dependency-allowlist.json b/config/quality/dependency-allowlist.json index e29948160e..21baa98694 100644 --- a/config/quality/dependency-allowlist.json +++ b/config/quality/dependency-allowlist.json @@ -141,7 +141,6 @@ "tailwind-merge", "tailwindcss", "tiktoken", - "tls-client-node", "tsup", "tsx", "turndown", diff --git a/config/quality/file-size-baseline.json b/config/quality/file-size-baseline.json index 0b597185c3..c4e3bd4361 100644 --- a/config/quality/file-size-baseline.json +++ b/config/quality/file-size-baseline.json @@ -1,4 +1,5 @@ { + "_rebaseline_2026_09_02_12429_wreq_migration_suite": "PR #12429 (wreq-js web-cookie transport): new test file tests/unit/tls-client-wreq-migration.test.ts at 1374 lines, above the 1200 new-file testCap. Frozen rather than split: it is the single cohesive regression suite for the transport migration (31 cases covering streaming, fragmented EOF sentinels, proxy isolation, first-byte and hard deadlines, binary responses and cancellation), and the cases share the native-transport harness the file sets up once. Splitting it during a merge would duplicate that harness across files for no coverage gain. Entered at the exact LOC, so it can only ratchet down from here.", "_rebaseline_2026_09_02_12239_chatgpt_web_cleanroom": "PR #12239 (backryun, codex/restore-chatgpt-web-cleanroom) own growth at the two existing chat chokepoints for the clean-room ChatGPT Web transport: src/sse/handlers/chat.ts 2384->2424 (+40); open-sse/handlers/chatCore.ts 5946->5976 (+30). Additive dispatch wiring; the retirement guard is narrowed to the GPL-derived cgpt-web alias rather than removed, so #11754's provenance decision still holds for the old implementation. Same own-growth rationale as _rebaseline_2026_08_20_10531_freebuff_provider.", "_rebaseline_2026_09_02_12412_grok_web_prettier": "PR #12412 (repository Prettier style applied to tests/unit/grok-web.test.ts): the reformat expands the file +277 lines (2436 -> 2713) with an identical parsed AST — no production code, no assertion changes. Cap set to 2985 rather than the exact 2713 on the operator's instruction (2026-09-02): ~10% headroom so routine additions to this suite do not re-trip the gate on formatting alone. Previous cap 2437. This is a deliberate exception to the down-only ratchet for one reformatted test file; every other entry keeps the #12411 tightening.", "_rebaseline_2026_09_02_v3851_merged_growth_basereds": "Base-red drain: the 2026-09-02 merge waves (#12359-#12404, #11461, #11513, #12423) each grew a frozen file at an existing chokepoint, but the rebaseline was computed in the throwaway combined validation worktree and never reached any PR branch, so the growth landed while the caps did not and check-file-size went red on the release tip. Recorded here against the merged state: src/app/api/providers/[id]/models/route.ts 2429->2432 (#12389 gemini-business listing on top of #11461's 2429); src/app/api/v1/models/catalog.ts 2066->2075 (#12381 self-aliased canonical rows + #12403 NUL escape); src/lib/db/core.ts 1740->1745 (#12394 busy_timeout ordering + probe classification); src/sse/handlers/chat.ts 2375->2384 (#12360 breaker result classification + #12365 shadowed-node error); src/sse/services/auth.ts 3420->3427 (#12375 backoffLevel tie-break); open-sse/handlers/imageGeneration.ts 3255->3259 (#11513 uc-image branch + #12423 uc-image id scoping); open-sse/utils/proxyFetch.ts 1261->1271 (#12380 hasAmbientProxyContext()); tests/unit/image-generation-handler.test.ts 2110->2133 (#12362 regression coverage); tests/unit/sse-auth.test.ts 1697->1729 (#12375 regression coverage). No cap is raised beyond the merged LOC; every other entry is untouched.", @@ -228,7 +229,8 @@ "tests/unit/translator-openai-to-kiro.test.ts": 1275, "tests/unit/translator-resp-gemini-to-openai.test.ts": 1234, "tests/unit/usage-service-hardening.test.ts": 1487, - "tests/unit/vscode-token-routes.test.ts": 1267 + "tests/unit/vscode-token-routes.test.ts": 1267, + "tests/unit/tls-client-wreq-migration.test.ts": 1374 }, "_rebaseline_2026_06_09": "Re-baseline consciente pre-release v3.8.19: 9 arquivos cresceram durante o ciclo (features mergeadas: RequestLoggerV2 +281 request-logger rework, stream +101, combo +73, chatCore +45, catalog +32 fable-5/catalog-flag, callLogs +4, accountFallback +2, usageHistory novo 840) + core.ts +7 (fix resetAllDbModuleState, PR 3536). A catraca segue valendo destes valores — proximo crescimento falha. Decisao: encolher (esp. RequestLoggerV2/chatCore) e a issue #3501 ficam para o ciclo seguinte.", "_rebaseline_2026_06_11_phase1f": "Phase 1f (#3501): ProviderDetailPageClient.tsx 4948→4062 (-886 LOC); 3 novos hooks extraídos. useProviderConnections.ts=954 acima do cap=800 — justificado: extração direta do god-component (zero lógica nova), própria redução do cliente supera o custo. useProviderSettings.ts=263 e useProviderModels.ts=154 já abaixo do cap.", diff --git a/config/release/wreq-js-native-manifest.json b/config/release/wreq-js-native-manifest.json new file mode 100644 index 0000000000..83863202b6 --- /dev/null +++ b/config/release/wreq-js-native-manifest.json @@ -0,0 +1,159 @@ +{ + "schemaVersion": 1, + "package": "wreq-js", + "version": "3.2.0", + "license": "MIT", + "source": { + "repository": "https://github.com/sqdshguy/wreq-js", + "commit": "0d52d5fa252841aeef34d4d063b1766a59612bf7", + "signedTag": "v3.2.0", + "signedTagObject": "dfb277d51aa03d8c6ada9a0d78ba00bc8568150b", + "buildWorkflow": "https://github.com/sqdshguy/wreq-js/actions/runs/32649967431/attempts/1", + "attestation": "https://registry.npmjs.org/-/npm/v1/attestations/wreq-js@3.2.0", + "licenseUrl": "https://raw.githubusercontent.com/sqdshguy/wreq-js/0d52d5fa252841aeef34d4d063b1766a59612bf7/LICENSE", + "licenseSha256": "f5e211eaa1c732f23cae866f00c7a0d9f458cbb6e37051170a3f7bb45c2e5d8e" + }, + "npm": { + "tarball": "https://registry.npmjs.org/wreq-js/-/wreq-js-3.2.0.tgz", + "integrity": "sha512-dawhEbhvd5hxivKZSvv/mAQGO3mwZYESyctOvIIZ/H3DvQJzUM2UoFQsij0fg7hIClQ/GEQgg+2259UcFwhpMQ==" + }, + "nativeAddons": [ + { + "target": "android-arm64", + "package": "@wreq-js/binding-android-arm64", + "version": "3.2.0", + "platform": "android", + "arch": "arm64", + "tarball": "https://registry.npmjs.org/@wreq-js/binding-android-arm64/-/binding-android-arm64-3.2.0.tgz", + "integrity": "sha512-PRsy18Z+0fftLeDvFTQwpgdepihRk6oVzdQWt92hEdarI7DexhgDJvvZfDsylMp7GDfsys9sFks8nIAi4n7eKQ==", + "path": "wreq-js.android-arm64.node", + "size": 9746720, + "sha256": "10cfed8b7f8ce5767d74188bcc2c249f9b0102e8ae90b381b85ec53fbd84c59f" + }, + { + "target": "darwin-arm64", + "package": "@wreq-js/binding-darwin-arm64", + "version": "3.2.0", + "platform": "darwin", + "arch": "arm64", + "tarball": "https://registry.npmjs.org/@wreq-js/binding-darwin-arm64/-/binding-darwin-arm64-3.2.0.tgz", + "integrity": "sha512-TGbgqj7YKp6m2p79hyLtTBatKgU8SKEVL5e903KGSeSDKkLbgk8knFoZ2MakhJnlqKZhvLPCNLT7A3AStwIoHQ==", + "path": "wreq-js.darwin-arm64.node", + "size": 7754432, + "sha256": "f426855858e4c661361a93440ed5fd5bd1e4f6926b3b1c0bf8449bdfe35d0936" + }, + { + "target": "darwin-x64", + "package": "@wreq-js/binding-darwin-x64", + "version": "3.2.0", + "platform": "darwin", + "arch": "x64", + "tarball": "https://registry.npmjs.org/@wreq-js/binding-darwin-x64/-/binding-darwin-x64-3.2.0.tgz", + "integrity": "sha512-89JkGsik49nUcQR7HfO6M+Na3whkhAQBghVFWn+vGmz32RzTX+HVy6q7wThjN+XGT+xvn9ZQpzTie3B292S50g==", + "path": "wreq-js.darwin-x64.node", + "size": 8249144, + "sha256": "ef00da7db372d5a71403a17f8067655f7313ae58816150ec4a00680546b35f27" + }, + { + "target": "linux-arm64-gnu", + "package": "@wreq-js/binding-linux-arm64-gnu", + "version": "3.2.0", + "platform": "linux", + "arch": "arm64", + "libc": "gnu", + "tarball": "https://registry.npmjs.org/@wreq-js/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-3.2.0.tgz", + "integrity": "sha512-WXqMK7AtOxMJAdwDpnAdDq0NZqf6wuRucKCQWQSLdSTUyTEuGo2anRkUsZwqvHbLrkWCTXNfl1hAfA+wIk/4kw==", + "path": "wreq-js.linux-arm64-gnu.node", + "size": 8669896, + "sha256": "5a515d02c9693f1440aa88da7a6a09332fb93844f66590e6eb1be582284a96e2" + }, + { + "target": "linux-arm64-musl", + "package": "@wreq-js/binding-linux-arm64-musl", + "version": "3.2.0", + "platform": "linux", + "arch": "arm64", + "libc": "musl", + "tarball": "https://registry.npmjs.org/@wreq-js/binding-linux-arm64-musl/-/binding-linux-arm64-musl-3.2.0.tgz", + "integrity": "sha512-YSMWs3BNBCNhWvIAUHWyp2K/L17qxfaRTl+t97ykOIOIKZSduNYZn/Yn3hTNtpbdfrTmNMG9pltEcbixFKS4xQ==", + "path": "wreq-js.linux-arm64-musl.node", + "size": 8530208, + "sha256": "85dd40b3059b9fb1fc11923e0fca98ab2fff7bfe850aeb4dc18f8812e7125b07" + }, + { + "target": "linux-x64-gnu", + "package": "@wreq-js/binding-linux-x64-gnu", + "version": "3.2.0", + "platform": "linux", + "arch": "x64", + "libc": "gnu", + "tarball": "https://registry.npmjs.org/@wreq-js/binding-linux-x64-gnu/-/binding-linux-x64-gnu-3.2.0.tgz", + "integrity": "sha512-6N7C1uc1qieM23rdKR5k07hfS50hVFExVHzLhHiWbmk9NyqBj0xyj2Mh5ThIrvz/or/6Pe79P8D7UWbl4aJTkw==", + "path": "wreq-js.linux-x64-gnu.node", + "size": 9110176, + "sha256": "32be0fe79325ee55216ac844130997ae24ff3df15570357194a8e7c6ae262743" + }, + { + "target": "linux-x64-musl", + "package": "@wreq-js/binding-linux-x64-musl", + "version": "3.2.0", + "platform": "linux", + "arch": "x64", + "libc": "musl", + "tarball": "https://registry.npmjs.org/@wreq-js/binding-linux-x64-musl/-/binding-linux-x64-musl-3.2.0.tgz", + "integrity": "sha512-0h0xJsmhVlmh+vHs9dYMIp5lpkKGNZrSedkl2Mh9XmR5slBahTcHT7oEEclhV+aNcY3V2Afmmqfil5huL+yDpA==", + "path": "wreq-js.linux-x64-musl.node", + "size": 9036248, + "sha256": "34c43f6694dfa5c749771f14bd19a4d4823707d428bc12d7d141ffa3176dccd6" + }, + { + "target": "win32-arm64-msvc", + "package": "@wreq-js/binding-win32-arm64-msvc", + "version": "3.2.0", + "platform": "win32", + "arch": "arm64", + "tarball": "https://registry.npmjs.org/@wreq-js/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-3.2.0.tgz", + "integrity": "sha512-6bfaVFfbI61s5YLgQL+43uURk/VuOu7TPlUwY1l0Q9yJdWzD+Jpdokgl5cEiY2a0FEAw8Q4LqPI+XZT3YAMnQA==", + "path": "wreq-js.win32-arm64-msvc.node", + "size": 6994432, + "sha256": "c853e10e272f31d3e5bf3e14cf64a3bfb41ef94d428f895cb73a67f0c58c46fa" + }, + { + "target": "win32-x64-msvc", + "package": "@wreq-js/binding-win32-x64-msvc", + "version": "3.2.0", + "platform": "win32", + "arch": "x64", + "tarball": "https://registry.npmjs.org/@wreq-js/binding-win32-x64-msvc/-/binding-win32-x64-msvc-3.2.0.tgz", + "integrity": "sha512-w4aktLElPgBXkWC/v9Ti9np6jBjYOzIyqmzgT41V/zuDq/V+V7s/13f9OzcX5hObH2WOpajo0KeljTJ2aRExNQ==", + "path": "wreq-js.win32-x64-msvc.node", + "size": 8003584, + "sha256": "2659898ee73ab64bb1ec4b4b1dd0c1e1d50f7dc579bad456d8bcad84349b01d4" + } + ], + "rust": { + "cargoTomlSha256": "9dcc37ee9b254a57722402355ae483aff9eeae8dbb1a28e84a57e008ab05a747", + "cargoLockSha256": "b22954960bffe817721539c17c18d2c2fb5084b358ea3e009133b5403b123df3", + "cargoLockPackages": 229, + "normalClosureUnionPackages": 153, + "compileOnlyUnionPackages": 43, + "btlsSys": { + "version": "0.5.6", + "crateChecksum": "9b1b8638a2e1c38a5ae4efa90ae57e643baec35a30d03fc5b399b893adc4954b", + "sourceCommit": "4edbf5d716ba014384569ac5c631cea83827abfc", + "license": "MIT", + "licenseSha256": "2f55c7cce4da9f8334dce14d53e35410f67973510bc9793ac2dafa5e8cddd3c3" + }, + "boringSsl": { + "sourceCommit": "91a66a59b6c1435120ff83e245d7719411294386", + "license": "Apache-2.0", + "licenseSha256": "827c8d8fc207c2392794eef9e00fe246f9f61fdcc132556c275be3dd8c3cd97f", + "modified": true, + "modificationNote": "btls-sys applies its published BoringSSL patch sets; the upstream wreq-js build workflow also adjusts btls-sys build logic on Windows targets." + } + }, + "holds": { + "exactPostLtoSbom": "Published addons contain no cargo-auditable section, link map, CycloneDX/SPDX SBOM, or reproducible-build receipt; the Cargo normal closure is a conservative link-eligible superset.", + "androidRuntime": "The Android addon dynamically requires libc++_shared.so, which is absent from its npm tarball. Audit LLVM/Apache-with-LLVM-exception notices if a release artifact supplies that library." + } +} diff --git a/config/release/wreq-js-rust-license-inventory.json b/config/release/wreq-js-rust-license-inventory.json new file mode 100644 index 0000000000..274865db6b --- /dev/null +++ b/config/release/wreq-js-rust-license-inventory.json @@ -0,0 +1,3111 @@ +{ + "schemaVersion": 1, + "component": { + "name": "wreq-js", + "version": "3.2.0", + "sourceCommit": "0d52d5fa252841aeef34d4d063b1766a59612bf7", + "cargoTomlSha256": "9dcc37ee9b254a57722402355ae483aff9eeae8dbb1a28e84a57e008ab05a747", + "cargoLockSha256": "b22954960bffe817721539c17c18d2c2fb5084b358ea3e009133b5403b123df3" + }, + "evidence": { + "generatedAt": "2026-09-02", + "method": "cargo metadata --locked --format-version 1 --filter-platform for every published target; traverse dep_kinds.kind=null from the root; separate build/proc-macro-only nodes", + "inventorySha256": "761dec510bfe2ac42e02bff1b693ea36fc9057f9d0479112b5b86c484b0733bd", + "classification": "conservative Cargo closure inventory, not an exact post-LTO artifact SBOM" + }, + "targetNormalClosureCounts": { + "aarch64-apple-darwin": 148, + "aarch64-linux-android": 144, + "aarch64-pc-windows-msvc": 149, + "aarch64-unknown-linux-gnu": 144, + "aarch64-unknown-linux-musl": 144, + "x86_64-apple-darwin": 148, + "x86_64-pc-windows-msvc": 149, + "x86_64-unknown-linux-gnu": 144, + "x86_64-unknown-linux-musl": 144 + }, + "normalClosure": { + "uniquePackages": 153, + "unknownLicenses": 0, + "licenseExpressionCounts": { + "(Apache-2.0 OR MIT) AND BSD-3-Clause": 1, + "(MIT OR Apache-2.0) AND Apache-2.0": 1, + "0BSD OR MIT OR Apache-2.0": 1, + "Apache-2.0": 6, + "Apache-2.0 / MIT": 1, + "Apache-2.0 OR MIT": 8, + "BSD-2-Clause OR Apache-2.0 OR MIT": 1, + "BSD-3-Clause": 2, + "BSD-3-Clause AND MIT": 1, + "BSD-3-Clause/MIT": 1, + "CDLA-Permissive-2.0": 1, + "ISC": 1, + "MIT": 25, + "MIT OR Apache-2.0": 79, + "MIT OR Zlib OR Apache-2.0": 1, + "MIT/Apache-2.0": 6, + "Unicode-3.0": 15, + "Unlicense OR MIT": 1, + "Zlib": 1 + }, + "components": [ + { + "name": "adler2", + "version": "2.0.1", + "license": "0BSD OR MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "alloc-no-stdlib", + "version": "2.0.4", + "license": "BSD-3-Clause", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "alloc-stdlib", + "version": "0.2.2", + "license": "BSD-3-Clause", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "allocator-api2", + "version": "0.2.21", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "anyhow", + "version": "1.0.104", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "async-compression", + "version": "0.4.36", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "atomic-waker", + "version": "1.1.2", + "license": "Apache-2.0 OR MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "bitflags", + "version": "2.13.1", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "block-buffer", + "version": "0.10.4", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "brotli", + "version": "8.0.2", + "license": "BSD-3-Clause AND MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "brotli-decompressor", + "version": "5.0.0", + "license": "BSD-3-Clause/MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "btls", + "version": "0.5.6", + "license": "Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "btls-sys", + "version": "0.5.6", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "bytes", + "version": "1.12.1", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "cfg-if", + "version": "1.0.4", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "compression-codecs", + "version": "0.4.35", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "compression-core", + "version": "0.4.31", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "cookie", + "version": "0.18.1", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "core-foundation", + "version": "0.9.4", + "license": "MIT OR Apache-2.0", + "targets": ["aarch64-apple-darwin", "x86_64-apple-darwin"] + }, + { + "name": "core-foundation-sys", + "version": "0.8.7", + "license": "MIT OR Apache-2.0", + "targets": ["aarch64-apple-darwin", "x86_64-apple-darwin"] + }, + { + "name": "cpufeatures", + "version": "0.2.17", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "crc32fast", + "version": "1.5.0", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "crossbeam-channel", + "version": "0.5.15", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "crossbeam-epoch", + "version": "0.9.20", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "crossbeam-utils", + "version": "0.8.21", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "crypto-common", + "version": "0.1.7", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "dashmap", + "version": "6.2.1", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "data-encoding", + "version": "2.9.0", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "deranged", + "version": "0.5.5", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "digest", + "version": "0.10.7", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "either", + "version": "1.15.0", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "encoding_rs", + "version": "0.8.35", + "license": "(Apache-2.0 OR MIT) AND BSD-3-Clause", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "equivalent", + "version": "1.0.2", + "license": "Apache-2.0 OR MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "flate2", + "version": "1.1.9", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "fnv", + "version": "1.0.7", + "license": "Apache-2.0 / MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "foldhash", + "version": "0.2.0", + "license": "Zlib", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "foreign-types", + "version": "0.5.0", + "license": "MIT/Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "foreign-types-shared", + "version": "0.3.1", + "license": "MIT/Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "form_urlencoded", + "version": "1.2.2", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "futures-channel", + "version": "0.3.32", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "futures-core", + "version": "0.3.34", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "futures-sink", + "version": "0.3.34", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "futures-task", + "version": "0.3.34", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "futures-util", + "version": "0.3.34", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "generic-array", + "version": "0.14.7", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "getrandom", + "version": "0.3.4", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "getrandom", + "version": "0.4.2", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "hashbrown", + "version": "0.14.5", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "hashbrown", + "version": "0.16.1", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "hashbrown", + "version": "0.17.1", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "http", + "version": "1.4.0", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "http-body", + "version": "1.0.1", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "http-body-util", + "version": "0.1.5", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "http2", + "version": "0.5.17", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "httparse", + "version": "1.10.1", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "icu_collections", + "version": "2.1.1", + "license": "Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "icu_locale_core", + "version": "2.1.1", + "license": "Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "icu_normalizer", + "version": "2.1.1", + "license": "Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "icu_normalizer_data", + "version": "2.1.1", + "license": "Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "icu_properties", + "version": "2.1.2", + "license": "Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "icu_properties_data", + "version": "2.1.2", + "license": "Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "icu_provider", + "version": "2.1.1", + "license": "Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "idna", + "version": "1.1.0", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "idna_adapter", + "version": "1.2.1", + "license": "Apache-2.0 OR MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "indexmap", + "version": "2.12.1", + "license": "Apache-2.0 OR MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "ipnet", + "version": "2.12.0", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "itoa", + "version": "1.0.17", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "libc", + "version": "0.2.186", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "libloading", + "version": "0.8.9", + "license": "ISC", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "linkme", + "version": "0.3.35", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "litemap", + "version": "0.8.1", + "license": "Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "lock_api", + "version": "0.4.14", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "log", + "version": "0.4.29", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "lru", + "version": "0.18.1", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "memchr", + "version": "2.7.6", + "license": "Unlicense OR MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "mime", + "version": "0.3.17", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "miniz_oxide", + "version": "0.8.9", + "license": "MIT OR Zlib OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "mio", + "version": "1.2.0", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "moka", + "version": "0.12.16", + "license": "(MIT OR Apache-2.0) AND Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "neon", + "version": "1.1.1", + "license": "MIT/Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "num-conv", + "version": "0.1.0", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "once_cell", + "version": "1.21.4", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "parking_lot", + "version": "0.12.5", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "parking_lot_core", + "version": "0.9.12", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "percent-encoding", + "version": "2.3.2", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "pin-project-lite", + "version": "0.2.17", + "license": "Apache-2.0 OR MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "portable-atomic", + "version": "1.13.0", + "license": "Apache-2.0 OR MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "potential_utf", + "version": "0.1.4", + "license": "Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "powerfmt", + "version": "0.2.0", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "ppv-lite86", + "version": "0.2.21", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "rand", + "version": "0.9.2", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "rand_chacha", + "version": "0.9.0", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "rand_core", + "version": "0.9.3", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "rustls-pki-types", + "version": "1.13.2", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "scopeguard", + "version": "1.2.0", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "semver", + "version": "1.0.27", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "send_wrapper", + "version": "0.6.0", + "license": "MIT/Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "serde", + "version": "1.0.229", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "serde_core", + "version": "1.0.229", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "serde_json", + "version": "1.0.151", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "sha1", + "version": "0.10.6", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "simd-adler32", + "version": "0.3.8", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "slab", + "version": "0.4.11", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "smallvec", + "version": "1.15.1", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "socket2", + "version": "0.6.3", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "stable_deref_trait", + "version": "1.2.1", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "sync_wrapper", + "version": "1.0.2", + "license": "Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "system-configuration", + "version": "0.7.0", + "license": "MIT OR Apache-2.0", + "targets": ["aarch64-apple-darwin", "x86_64-apple-darwin"] + }, + { + "name": "system-configuration-sys", + "version": "0.6.0", + "license": "MIT OR Apache-2.0", + "targets": ["aarch64-apple-darwin", "x86_64-apple-darwin"] + }, + { + "name": "tagptr", + "version": "0.2.0", + "license": "MIT/Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "thiserror", + "version": "1.0.69", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "thiserror", + "version": "2.0.17", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "time", + "version": "0.3.44", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "time-core", + "version": "0.1.6", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "tinystr", + "version": "0.8.2", + "license": "Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "tokio", + "version": "1.53.1", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "tokio-btls", + "version": "0.5.6", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "tokio-socks", + "version": "0.5.2", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "tokio-tungstenite", + "version": "0.29.0", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "tokio-util", + "version": "0.7.19", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "tower", + "version": "0.5.3", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "tower-http", + "version": "0.6.8", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "tower-layer", + "version": "0.3.3", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "tower-service", + "version": "0.3.3", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "try-lock", + "version": "0.2.5", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "tungstenite", + "version": "0.29.0", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "typed-builder", + "version": "0.23.2", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "typenum", + "version": "1.19.0", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "url", + "version": "2.5.8", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "utf8_iter", + "version": "1.0.4", + "license": "Apache-2.0 OR MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "uuid", + "version": "1.23.4", + "license": "Apache-2.0 OR MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "want", + "version": "0.3.1", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "webpki-root-certs", + "version": "1.0.9", + "license": "CDLA-Permissive-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "windows-link", + "version": "0.2.1", + "license": "MIT OR Apache-2.0", + "targets": ["aarch64-pc-windows-msvc", "x86_64-pc-windows-msvc"] + }, + { + "name": "windows-registry", + "version": "0.6.1", + "license": "MIT OR Apache-2.0", + "targets": ["aarch64-pc-windows-msvc", "x86_64-pc-windows-msvc"] + }, + { + "name": "windows-result", + "version": "0.4.1", + "license": "MIT OR Apache-2.0", + "targets": ["aarch64-pc-windows-msvc", "x86_64-pc-windows-msvc"] + }, + { + "name": "windows-strings", + "version": "0.5.1", + "license": "MIT OR Apache-2.0", + "targets": ["aarch64-pc-windows-msvc", "x86_64-pc-windows-msvc"] + }, + { + "name": "windows-sys", + "version": "0.61.2", + "license": "MIT OR Apache-2.0", + "targets": ["aarch64-pc-windows-msvc", "x86_64-pc-windows-msvc"] + }, + { + "name": "wreq", + "version": "0.16.0", + "license": "Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "wreq-js", + "version": "3.2.0", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "wreq-proto", + "version": "0.2.5", + "license": "Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "wreq-rt", + "version": "0.2.2-rc.4", + "license": "Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "wreq-util", + "version": "0.2.0", + "license": "Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "writeable", + "version": "0.6.2", + "license": "Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "yoke", + "version": "0.8.1", + "license": "Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "zerocopy", + "version": "0.8.31", + "license": "BSD-2-Clause OR Apache-2.0 OR MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "zerofrom", + "version": "0.1.6", + "license": "Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "zerotrie", + "version": "0.2.3", + "license": "Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "zerovec", + "version": "0.11.5", + "license": "Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "zmij", + "version": "1.0.3", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "zstd", + "version": "0.13.3", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "zstd-safe", + "version": "7.2.4", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "zstd-sys", + "version": "2.0.16+zstd.1.5.7", + "license": "MIT/Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + } + ] + }, + "compileOnlyClosure": { + "uniquePackages": 43, + "description": "Build scripts and proc-macro-only packages; recorded separately and not treated as shipped runtime components.", + "components": [ + { + "name": "aho-corasick", + "version": "1.1.4", + "license": "Unlicense OR MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "bindgen", + "version": "0.72.1", + "license": "BSD-3-Clause", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "cc", + "version": "1.2.51", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "cexpr", + "version": "0.6.0", + "license": "Apache-2.0/MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "clang-sys", + "version": "1.8.1", + "license": "Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "cmake", + "version": "0.1.58", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "displaydoc", + "version": "0.2.5", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "find-msvc-tools", + "version": "0.1.6", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "foreign-types-macros", + "version": "0.2.3", + "license": "MIT/Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "fs_extra", + "version": "1.3.0", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "fslock", + "version": "0.2.1", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "futures-macro", + "version": "0.3.34", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "glob", + "version": "0.3.3", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "itertools", + "version": "0.13.0", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "jobserver", + "version": "0.1.34", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "linkme-impl", + "version": "0.3.35", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "minimal-lexical", + "version": "0.2.1", + "license": "MIT/Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "neon-macros", + "version": "1.1.1", + "license": "MIT/Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "nom", + "version": "7.1.3", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "openssl-macros", + "version": "0.1.1", + "license": "MIT/Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "pkg-config", + "version": "0.3.32", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "proc-macro2", + "version": "1.0.104", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "quote", + "version": "1.0.42", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "regex", + "version": "1.12.2", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "regex-automata", + "version": "0.4.13", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "regex-syntax", + "version": "0.8.8", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "rustc-hash", + "version": "2.1.1", + "license": "Apache-2.0 OR MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "serde_derive", + "version": "1.0.229", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "shlex", + "version": "1.3.0", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "syn", + "version": "2.0.111", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "syn", + "version": "3.0.2", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "synstructure", + "version": "0.13.2", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "thiserror-impl", + "version": "1.0.69", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "thiserror-impl", + "version": "2.0.17", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "time-macros", + "version": "0.2.24", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "tokio-macros", + "version": "2.7.0", + "license": "MIT", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "typed-builder-macro", + "version": "0.23.2", + "license": "MIT OR Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "unicode-ident", + "version": "1.0.22", + "license": "(MIT OR Apache-2.0) AND Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "version_check", + "version": "0.9.5", + "license": "MIT/Apache-2.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "winapi", + "version": "0.3.9", + "license": "MIT/Apache-2.0", + "targets": ["aarch64-pc-windows-msvc", "x86_64-pc-windows-msvc"] + }, + { + "name": "yoke-derive", + "version": "0.8.1", + "license": "Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "zerofrom-derive", + "version": "0.1.6", + "license": "Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + }, + { + "name": "zerovec-derive", + "version": "0.11.2", + "license": "Unicode-3.0", + "targets": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl" + ] + } + ] + }, + "embeddedComponents": [ + { + "name": "BoringSSL", + "sourceCommit": "91a66a59b6c1435120ff83e245d7719411294386", + "via": "btls-sys@0.5.6", + "license": "Apache-2.0", + "licenseSha256": "827c8d8fc207c2392794eef9e00fe246f9f61fdcc132556c275be3dd8c3cd97f", + "modified": true + } + ], + "limitations": [ + "Normal closure means link-eligible in the locked Cargo graph; exact post-LTO membership remains unproven because LTO may eliminate components.", + "Published .node files do not contain cargo-auditable metadata, a link map, an upstream artifact SBOM, or a reproducible-build receipt.", + "Android dynamically requires libc++_shared.so; that library is not present in the npm binding tarball and is outside this inventory." + ] +} diff --git a/config/release/wreq-js-rust-notices.md b/config/release/wreq-js-rust-notices.md new file mode 100644 index 0000000000..eaef11b3bb --- /dev/null +++ b/config/release/wreq-js-rust-notices.md @@ -0,0 +1,9709 @@ +# wreq-js 3.2.0 native dependency notices + +> Generated evidence for OmniRoute release/v3.8.51. Keep this file together with +> `wreq-js-native-manifest.json` and `wreq-js-rust-license-inventory.json`. + +## Scope + +- Source: `sqdshguy/wreq-js` tag `v3.2.0`, commit `0d52d5fa252841aeef34d4d063b1766a59612bf7`. +- Lock: upstream `rust/Cargo.lock` SHA-256 `b22954960bffe817721539c17c18d2c2fb5084b358ea3e009133b5403b123df3`. +- Method: locked `cargo metadata` normal-edge traversal for all nine published targets. The union contains 153 link-eligible packages; build/proc-macro-only packages are inventoried separately and are not represented as shipped runtime components here. +- This bundle intentionally includes the whole conservative normal-closure union, even though release LTO may eliminate some components. It also includes the BoringSSL license nested inside `btls-sys@0.5.6`. +- The nine published binding tarballs omit LICENSE/NOTICE files, so OmniRoute ships this notice bundle beside the addons. + +## Artifact-level limitations + +- The published addons contain no cargo-auditable section, link map, upstream artifact SBOM, or reproducible-build receipt. Exact post-LTO membership remains unproven; the inventory is a conservative superset. +- The Android addon dynamically requires `libc++_shared.so`, which is not inside its npm tarball. If an OmniRoute artifact supplies that library, its LLVM/Apache-with-LLVM-exception notice must be added after inspecting that exact artifact. + +## Component inventory + +| Component | Locked license expression | +| --- | --- | +| `adler2@2.0.1` | `0BSD OR MIT OR Apache-2.0` | +| `alloc-no-stdlib@2.0.4` | `BSD-3-Clause` | +| `alloc-stdlib@0.2.2` | `BSD-3-Clause` | +| `allocator-api2@0.2.21` | `MIT OR Apache-2.0` | +| `anyhow@1.0.104` | `MIT OR Apache-2.0` | +| `async-compression@0.4.36` | `MIT OR Apache-2.0` | +| `atomic-waker@1.1.2` | `Apache-2.0 OR MIT` | +| `bitflags@2.13.1` | `MIT OR Apache-2.0` | +| `block-buffer@0.10.4` | `MIT OR Apache-2.0` | +| `brotli@8.0.2` | `BSD-3-Clause AND MIT` | +| `brotli-decompressor@5.0.0` | `BSD-3-Clause/MIT` | +| `btls@0.5.6` | `Apache-2.0` | +| `btls-sys@0.5.6` | `MIT` | +| `bytes@1.12.1` | `MIT` | +| `cfg-if@1.0.4` | `MIT OR Apache-2.0` | +| `compression-codecs@0.4.35` | `MIT OR Apache-2.0` | +| `compression-core@0.4.31` | `MIT OR Apache-2.0` | +| `cookie@0.18.1` | `MIT OR Apache-2.0` | +| `core-foundation@0.9.4` | `MIT OR Apache-2.0` | +| `core-foundation-sys@0.8.7` | `MIT OR Apache-2.0` | +| `cpufeatures@0.2.17` | `MIT OR Apache-2.0` | +| `crc32fast@1.5.0` | `MIT OR Apache-2.0` | +| `crossbeam-channel@0.5.15` | `MIT OR Apache-2.0` | +| `crossbeam-epoch@0.9.20` | `MIT OR Apache-2.0` | +| `crossbeam-utils@0.8.21` | `MIT OR Apache-2.0` | +| `crypto-common@0.1.7` | `MIT OR Apache-2.0` | +| `dashmap@6.2.1` | `MIT` | +| `data-encoding@2.9.0` | `MIT` | +| `deranged@0.5.5` | `MIT OR Apache-2.0` | +| `digest@0.10.7` | `MIT OR Apache-2.0` | +| `either@1.15.0` | `MIT OR Apache-2.0` | +| `encoding_rs@0.8.35` | `(Apache-2.0 OR MIT) AND BSD-3-Clause` | +| `equivalent@1.0.2` | `Apache-2.0 OR MIT` | +| `flate2@1.1.9` | `MIT OR Apache-2.0` | +| `fnv@1.0.7` | `Apache-2.0 / MIT` | +| `foldhash@0.2.0` | `Zlib` | +| `foreign-types@0.5.0` | `MIT/Apache-2.0` | +| `foreign-types-shared@0.3.1` | `MIT/Apache-2.0` | +| `form_urlencoded@1.2.2` | `MIT OR Apache-2.0` | +| `futures-channel@0.3.32` | `MIT OR Apache-2.0` | +| `futures-core@0.3.34` | `MIT OR Apache-2.0` | +| `futures-sink@0.3.34` | `MIT OR Apache-2.0` | +| `futures-task@0.3.34` | `MIT OR Apache-2.0` | +| `futures-util@0.3.34` | `MIT OR Apache-2.0` | +| `generic-array@0.14.7` | `MIT` | +| `getrandom@0.3.4` | `MIT OR Apache-2.0` | +| `getrandom@0.4.2` | `MIT OR Apache-2.0` | +| `hashbrown@0.14.5` | `MIT OR Apache-2.0` | +| `hashbrown@0.16.1` | `MIT OR Apache-2.0` | +| `hashbrown@0.17.1` | `MIT OR Apache-2.0` | +| `http@1.4.0` | `MIT OR Apache-2.0` | +| `http-body@1.0.1` | `MIT` | +| `http-body-util@0.1.5` | `MIT` | +| `http2@0.5.17` | `MIT` | +| `httparse@1.10.1` | `MIT OR Apache-2.0` | +| `icu_collections@2.1.1` | `Unicode-3.0` | +| `icu_locale_core@2.1.1` | `Unicode-3.0` | +| `icu_normalizer@2.1.1` | `Unicode-3.0` | +| `icu_normalizer_data@2.1.1` | `Unicode-3.0` | +| `icu_properties@2.1.2` | `Unicode-3.0` | +| `icu_properties_data@2.1.2` | `Unicode-3.0` | +| `icu_provider@2.1.1` | `Unicode-3.0` | +| `idna@1.1.0` | `MIT OR Apache-2.0` | +| `idna_adapter@1.2.1` | `Apache-2.0 OR MIT` | +| `indexmap@2.12.1` | `Apache-2.0 OR MIT` | +| `ipnet@2.12.0` | `MIT OR Apache-2.0` | +| `itoa@1.0.17` | `MIT OR Apache-2.0` | +| `libc@0.2.186` | `MIT OR Apache-2.0` | +| `libloading@0.8.9` | `ISC` | +| `linkme@0.3.35` | `MIT OR Apache-2.0` | +| `litemap@0.8.1` | `Unicode-3.0` | +| `lock_api@0.4.14` | `MIT OR Apache-2.0` | +| `log@0.4.29` | `MIT OR Apache-2.0` | +| `lru@0.18.1` | `MIT` | +| `memchr@2.7.6` | `Unlicense OR MIT` | +| `mime@0.3.17` | `MIT OR Apache-2.0` | +| `miniz_oxide@0.8.9` | `MIT OR Zlib OR Apache-2.0` | +| `mio@1.2.0` | `MIT` | +| `moka@0.12.16` | `(MIT OR Apache-2.0) AND Apache-2.0` | +| `neon@1.1.1` | `MIT/Apache-2.0` | +| `num-conv@0.1.0` | `MIT OR Apache-2.0` | +| `once_cell@1.21.4` | `MIT OR Apache-2.0` | +| `parking_lot@0.12.5` | `MIT OR Apache-2.0` | +| `parking_lot_core@0.9.12` | `MIT OR Apache-2.0` | +| `percent-encoding@2.3.2` | `MIT OR Apache-2.0` | +| `pin-project-lite@0.2.17` | `Apache-2.0 OR MIT` | +| `portable-atomic@1.13.0` | `Apache-2.0 OR MIT` | +| `potential_utf@0.1.4` | `Unicode-3.0` | +| `powerfmt@0.2.0` | `MIT OR Apache-2.0` | +| `ppv-lite86@0.2.21` | `MIT OR Apache-2.0` | +| `rand@0.9.2` | `MIT OR Apache-2.0` | +| `rand_chacha@0.9.0` | `MIT OR Apache-2.0` | +| `rand_core@0.9.3` | `MIT OR Apache-2.0` | +| `rustls-pki-types@1.13.2` | `MIT OR Apache-2.0` | +| `scopeguard@1.2.0` | `MIT OR Apache-2.0` | +| `semver@1.0.27` | `MIT OR Apache-2.0` | +| `send_wrapper@0.6.0` | `MIT/Apache-2.0` | +| `serde@1.0.229` | `MIT OR Apache-2.0` | +| `serde_core@1.0.229` | `MIT OR Apache-2.0` | +| `serde_json@1.0.151` | `MIT OR Apache-2.0` | +| `sha1@0.10.6` | `MIT OR Apache-2.0` | +| `simd-adler32@0.3.8` | `MIT` | +| `slab@0.4.11` | `MIT` | +| `smallvec@1.15.1` | `MIT OR Apache-2.0` | +| `socket2@0.6.3` | `MIT OR Apache-2.0` | +| `stable_deref_trait@1.2.1` | `MIT OR Apache-2.0` | +| `sync_wrapper@1.0.2` | `Apache-2.0` | +| `system-configuration@0.7.0` | `MIT OR Apache-2.0` | +| `system-configuration-sys@0.6.0` | `MIT OR Apache-2.0` | +| `tagptr@0.2.0` | `MIT/Apache-2.0` | +| `thiserror@1.0.69` | `MIT OR Apache-2.0` | +| `thiserror@2.0.17` | `MIT OR Apache-2.0` | +| `time@0.3.44` | `MIT OR Apache-2.0` | +| `time-core@0.1.6` | `MIT OR Apache-2.0` | +| `tinystr@0.8.2` | `Unicode-3.0` | +| `tokio@1.53.1` | `MIT` | +| `tokio-btls@0.5.6` | `MIT OR Apache-2.0` | +| `tokio-socks@0.5.2` | `MIT` | +| `tokio-tungstenite@0.29.0` | `MIT` | +| `tokio-util@0.7.19` | `MIT` | +| `tower@0.5.3` | `MIT` | +| `tower-http@0.6.8` | `MIT` | +| `tower-layer@0.3.3` | `MIT` | +| `tower-service@0.3.3` | `MIT` | +| `try-lock@0.2.5` | `MIT` | +| `tungstenite@0.29.0` | `MIT OR Apache-2.0` | +| `typed-builder@0.23.2` | `MIT OR Apache-2.0` | +| `typenum@1.19.0` | `MIT OR Apache-2.0` | +| `url@2.5.8` | `MIT OR Apache-2.0` | +| `utf8_iter@1.0.4` | `Apache-2.0 OR MIT` | +| `uuid@1.23.4` | `Apache-2.0 OR MIT` | +| `want@0.3.1` | `MIT` | +| `webpki-root-certs@1.0.9` | `CDLA-Permissive-2.0` | +| `windows-link@0.2.1` | `MIT OR Apache-2.0` | +| `windows-registry@0.6.1` | `MIT OR Apache-2.0` | +| `windows-result@0.4.1` | `MIT OR Apache-2.0` | +| `windows-strings@0.5.1` | `MIT OR Apache-2.0` | +| `windows-sys@0.61.2` | `MIT OR Apache-2.0` | +| `wreq@0.16.0` | `Apache-2.0` | +| `wreq-js@3.2.0` | `MIT` | +| `wreq-proto@0.2.5` | `Apache-2.0` | +| `wreq-rt@0.2.2-rc.4` | `Apache-2.0` | +| `wreq-util@0.2.0` | `Apache-2.0` | +| `writeable@0.6.2` | `Unicode-3.0` | +| `yoke@0.8.1` | `Unicode-3.0` | +| `zerocopy@0.8.31` | `BSD-2-Clause OR Apache-2.0 OR MIT` | +| `zerofrom@0.1.6` | `Unicode-3.0` | +| `zerotrie@0.2.3` | `Unicode-3.0` | +| `zerovec@0.11.5` | `Unicode-3.0` | +| `zmij@1.0.3` | `MIT` | +| `zstd@0.13.3` | `MIT` | +| `zstd-safe@7.2.4` | `MIT OR Apache-2.0` | +| `zstd-sys@2.0.16+zstd.1.5.7` | `MIT/Apache-2.0` | + +Target membership and compile-only separation are machine-readable in `wreq-js-rust-license-inventory.json`. + +## License-source handling + +- Package-root `LICENSE*`, `COPYING*`, and `NOTICE*` files were collected from the registry sources resolved by the locked Cargo graph and deduplicated by SHA-256. +- `wreq-js@3.2.0` uses the repository-root MIT license at the signed source commit. +- `alloc-stdlib@0.2.2` omitted a license file from its crate archive; its sibling `alloc-no-stdlib@2.0.4` at the same repository commit `6032b6a9b20e03737135c55a0270ccffcc1438ef` supplies the declared BSD-3-Clause text. +- `async-compression@0.4.36`, `compression-codecs@0.4.35`, `compression-core@0.4.31`, and `neon@1.1.1` omitted license files from their crate archives and are covered here under their declared Apache-2.0 option. +- `btls-sys@0.5.6` statically builds a patched BoringSSL. The complete nested BoringSSL license is included with a modification note. + +## Deduplicated license texts + +Each section lists every component/source file covered by that exact text. A component may appear under multiple texts when its declared license is conjunctive or its package ships third-party notices. + +### SHA-256 `000cbb5bea6f21829c8f0d9e1fe87410bd5ef0453412ffc017845982a3e19824` + +Covered sources: + +- `system-configuration-sys@0.6.0:LICENSE-MIT` +- `system-configuration@0.7.0:LICENSE-MIT` + +```text +Copyright (c) 2024 Mullvad VPN AB + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f` + +Covered sources: + +- `memchr@2.7.6:COPYING` + +```text +This project is dual-licensed under the Unlicense and MIT licenses. + +You may use this code under the terms of either license. +``` + +### SHA-256 `0218327e7a480793ffdd4eb792379a9709e5c135c7ba267f709d6f6d4d70af0a` + +Covered sources: + +- `ppv-lite86@0.2.21:LICENSE-APACHE` + +```text + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2019 The CryptoCorrosion Contributors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +### SHA-256 `021f4a01e58372b826203064fac216e15d51e07f7739b8ca33d4b746ec8abb3b` + +Covered sources: + +- `moka@0.12.16:LICENSE-APACHE` + +```text + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2020 - 2026 Tatsuya Kawano + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +### SHA-256 `025436edff4cfcdde17a5811fdea78892d8482efd1abdec5a17872d07a4f2112` + +Covered sources: + +- `flate2@1.1.9:LICENSE-MIT` + +```text +Copyright (c) 2014-2026 Alex Crichton + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `070dbc7dda03a29296f2d58bdb9b7331af90f2abc9f31df22875d1eabaf29852` + +Covered sources: + +- `powerfmt@0.2.0:LICENSE-MIT` + +```text +Copyright (c) 2023 Jacob Pratt et al. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `07919255c7e04793d8ea760d6c2ce32d19f9ff02bdbdde3ce90b1e1880929a9b` + +Covered sources: + +- `mio@1.2.0:LICENSE` + +```text +Copyright (c) 2014 Carl Lerche and other MIO contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` + +### SHA-256 `0a54e647fe54104658b5e563c04c6f9edf251710e47bce692e0bd990a4ddaa39` + +Covered sources: + +- `miniz_oxide@0.8.9:LICENSE-ZLIB.md` + +```text +Copyright 2013-2014 RAD Game Tools and Valve Software +Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC +Copyright (c) 2020 Frommi +Copyright (c) 2017-2024 oyvindln + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. +``` + +### SHA-256 `0b28172679e0009b655da42797c03fd163a3379d5cfa67ba1f1655e974a2a1a9` + +Covered sources: + +- `smallvec@1.15.1:LICENSE-MIT` + +```text +Copyright (c) 2018 The Servo Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594` + +Covered sources: + +- `miniz_oxide@0.8.9:LICENSE-APACHE.md` +- `pin-project-lite@0.2.17:LICENSE-APACHE` +- `portable-atomic@1.13.0:LICENSE-APACHE` +- `sync_wrapper@1.0.2:LICENSE` +- `time-core@0.1.6:LICENSE-Apache` +- `time@0.3.44:LICENSE-Apache` +- `zstd-safe@7.2.4:LICENSE.Apache-2.0` +- `zstd-sys@2.0.16+zstd.1.5.7:LICENSE.Apache-2.0` + +```text + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS +``` + +### SHA-256 `0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f` + +Covered sources: + +- `memchr@2.7.6:LICENSE-MIT` + +```text +The MIT License (MIT) + +Copyright (c) 2015 Andrew Gallant + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` + +### SHA-256 `123a331b5dbf04c30097fa43b8f858bc85df671fe776de498d01f3d6b7c1f69e` + +Covered sources: + +- `libc@0.2.186:LICENSE-MIT` + +```text +Copyright (c) The Rust Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `129e8edef29e9abcd2ebabe252f4ef1b1289cdca356bf0040284a2fbccfb96c8` + +Covered sources: + +- `zstd-safe@7.2.4:LICENSE.Mit` +- `zstd-sys@2.0.16+zstd.1.5.7:LICENSE.Mit` +- `zstd@0.13.3:LICENSE` + +```text +The MIT License (MIT) +Copyright (c) 2016 Alexandre Bury + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `144121bc6a6fc275dbee2d94c52806bbb1c74073f6e76334fb5cc14529c21644` + +Covered sources: + +- `wreq-rt@0.2.2-rc.4:LICENSE` +- `wreq-util@0.2.0:LICENSE` + +```text + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2026 0x676e67 + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +### SHA-256 `1520f0253bb05bbfc841b827fe6440172f0513b4a890f720c9de1665a07c21e8` + +Covered sources: + +- `zerocopy@0.8.31:LICENSE-APACHE` + +```text + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2023 The Fuchsia Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +### SHA-256 `155420c6403d4e0fca34105e3c03fdd6939b64c393c7ec6f95f5b72c5474eab0` + +Covered sources: + +- `powerfmt@0.2.0:LICENSE-Apache` + +```text + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2023 Jacob Pratt et al. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +### SHA-256 `1626f2c950cee975b5809748e288468141d09aa420314c7c9b35e6e62b772b2d` + +Covered sources: + +- `httparse@1.10.1:LICENSE-MIT` + +```text +Copyright (c) 2015-2025 Sean McArthur + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` + +### SHA-256 `16692e8cee4aa06e3913787497eba2d47c42002014136f5da67be6ee640e28a3` + +Covered sources: + +- `dashmap@6.2.1:LICENSE` + +```text +MIT License + +Copyright (c) 2019 Acrimon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `175d33d2e88fc3944f1f54125e886e7232a85380b73dce505e9088fe4e91c576` + +Covered sources: + +- `tagptr@0.2.0:LICENSE-MIT` + +```text +MIT License + +Copyright (c) 2021 Oliver Giersch + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `1d4c38d56650edc2c673cadbec74bec14db1fe8f2f10f4e3477dcbb49563be40` + +Covered sources: + +- `foldhash@0.2.0:LICENSE` + +```text +Copyright (c) 2024 Orson Peters + +This software is provided 'as-is', without any express or implied warranty. In +no event will the authors be held liable for any damages arising from the use of +this software. + +Permission is granted to anyone to use this software for any purpose, including +commercial applications, and to alter it and redistribute it freely, subject to +the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim + that you wrote the original software. If you use this software in a product, + an acknowledgment in the product documentation would be appreciated but is + not required. + +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. +``` + +### SHA-256 `209fbbe0ad52d9235e37badf9cadfe4dbdc87203179c0899e738b39ade42177b` + +Covered sources: + +- `rand@0.9.2:LICENSE-MIT` +- `rand_chacha@0.9.0:LICENSE-MIT` +- `rand_core@0.9.3:LICENSE-MIT` + +```text +Copyright 2018 Developers of the Rand project +Copyright (c) 2014 The Rust Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `20c7855c364d57ea4c97889a5e8d98470a9952dade37bd9248b9a54431670e5e` + +Covered sources: + +- `form_urlencoded@1.2.2:LICENSE-MIT` + +```text +Copyright (c) 2013-2016 The rust-url developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `231c837c45eb53f108fb48929e488965bc4fcc14e9ea21d35f50e6b99d98685b` + +Covered sources: + +- `deranged@0.5.5:LICENSE-MIT` + +```text +Copyright (c) 2024 Jacob Pratt et al. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` + +Covered sources: + +- `adler2@2.0.1:LICENSE-MIT` +- `allocator-api2@0.2.21:LICENSE-MIT` +- `anyhow@1.0.104:LICENSE-MIT` +- `atomic-waker@1.1.2:LICENSE-MIT` +- `itoa@1.0.17:LICENSE-MIT` +- `linkme@0.3.35:LICENSE-MIT` +- `once_cell@1.21.4:LICENSE-MIT` +- `pin-project-lite@0.2.17:LICENSE-MIT` +- `portable-atomic@1.13.0:LICENSE-MIT` +- `semver@1.0.27:LICENSE-MIT` +- `send_wrapper@0.6.0:LICENSE-MIT.txt` +- `serde@1.0.229:LICENSE-MIT` +- `serde_core@1.0.229:LICENSE-MIT` +- `serde_json@1.0.151:LICENSE-MIT` +- `thiserror@1.0.69:LICENSE-MIT` +- `thiserror@2.0.17:LICENSE-MIT` +- `typed-builder@0.23.2:LICENSE-MIT` +- `zmij@1.0.3:LICENSE-MIT` + +```text +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `248378d0a3383c173fb925f17141b88e71580b3ba17ddc6ac3d2a344683232ab` + +Covered sources: + +- `http-body-util@0.1.5:LICENSE` + +```text +Copyright (c) 2019-2026 Sean McArthur & Hyper Contributors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `24fa231567ace7e0cdd96e5b2e649b0445d280710f7018d01ba6411e06aa641e` + +Covered sources: + +- `zerocopy@0.8.31:LICENSE-MIT` + +```text +Copyright 2023 The Fuchsia Authors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `2537228d9a1b44a5dc595241349cae7090b326c8de165aaf89bfddef4a00d0fc` + +Covered sources: + +- `time-core@0.1.6:LICENSE-MIT` +- `time@0.3.44:LICENSE-MIT` + +```text +Copyright (c) Jacob Pratt et al. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `253cd04c6714889df2d32f3f64d669179a1c95c76ac43c40882c52eb06bc3552` + +Covered sources: + +- `tokio-util@0.7.19:LICENSE` +- `tokio@1.53.1:LICENSE` + +```text +MIT License + +Copyright (c) Tokio Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427` + +Covered sources: + +- `futures-channel@0.3.32:LICENSE-APACHE` +- `futures-core@0.3.34:LICENSE-APACHE` +- `futures-sink@0.3.34:LICENSE-APACHE` +- `futures-task@0.3.34:LICENSE-APACHE` +- `futures-util@0.3.34:LICENSE-APACHE` + +```text + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright (c) 2016 Alex Crichton +Copyright (c) 2017 The Tokio Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +### SHA-256 `2773e20df8f4c52a026b5b578c7f2457341f5aa3fb6612fd87e1d2e1bd8f48ad` + +Covered sources: + +- `cookie@0.18.1:LICENSE-APACHE` + +```text + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2017 Sergio Benitez +Copyright 2014 Alex Chricton + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +### SHA-256 `29e9fe5074bd27e0e5d5d110394fbbcd841baee2651a3c4b4560a632702cede4` + +Covered sources: + +- `getrandom@0.3.4:LICENSE-MIT` + +```text +Copyright (c) 2018-2025 The rust-random Project Developers +Copyright (c) 2014 The Rust Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `2f55c7cce4da9f8334dce14d53e35410f67973510bc9793ac2dafa5e8cddd3c3` + +Covered sources: + +- `btls-sys@0.5.6:LICENSE-MIT` + +```text +Copyright (c) 2014 Alex Crichton +Copyright (c) 2020 Ivan Nikulin +Copyright (c) 2025 0x676e67 + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `333ea3aaa3cadb819f4acd9f9153f9feee060a995ca8710f32bc5bd9a4b91734` + +Covered sources: + +- `foreign-types-shared@0.3.1:LICENSE-MIT` +- `foreign-types@0.5.0:LICENSE-MIT` + +```text +Copyright (c) 2017 The foreign-types Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `3521672491a3479422d5fe1aca6645dd2984090f85da6e5205abfb18fb7a6897` + +Covered sources: + +- `crypto-common@0.1.7:LICENSE-MIT` + +```text +Copyright (c) 2021 RustCrypto Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `35242e7a83f69875e6edeff02291e688c97caafe2f8902e4e19b49d3e78b4cab` + +Covered sources: + +- `rand@0.9.2:LICENSE-APACHE` +- `rand_chacha@0.9.0:LICENSE-APACHE` + +```text + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS +``` + +### SHA-256 `36bb253818ac13761081556ff5c457d626da9df1eb4f56194d9ad3926c418a68` + +Covered sources: + +- `typenum@1.19.0:LICENSE` + +```text +MIT OR Apache-2.0 +``` + +### SHA-256 `378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397` + +Covered sources: + +- `cfg-if@1.0.4:LICENSE-MIT` +- `socket2@0.6.3:LICENSE-MIT` + +```text +Copyright (c) 2014 Alex Crichton + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `3c125f249fc6fb19f2415d027a0d9a170860583960ea53d08ea1d2b3f269d153` + +Covered sources: + +- `stable_deref_trait@1.2.1:LICENSE-MIT` + +```text +Copyright (c) 2017 Robert Grosse + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `3c97f5b6ad4e73ad22dc0d1e0c7120579a350df57095120017ddfe5a8669604e` + +Covered sources: + +- `typenum@1.19.0:LICENSE-APACHE` + +```text + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2014 Paho Lurie-Gregg + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +### SHA-256 `3d180008e36922a4e8daec11c34c7af264fed5962d07924aea928c38e8663c94` + +Covered sources: + +- `brotli@8.0.2:LICENSE.MIT` + +```text +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` + +### SHA-256 `3fa4ca83dcc9237839b1bdeb2e6d16bdfb5ec0c5ce42b24694d8bbf0dcbef72c` + +Covered sources: + +- `encoding_rs@0.8.35:LICENSE-MIT` +- `utf8_iter@1.0.4:LICENSE-MIT` + +```text +Copyright Mozilla Foundation + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `4108245a1f2df9d4e94df8abed5b4ba0759bb2f9b40a6b939f1be141077ae50b` + +Covered sources: + +- `miniz_oxide@0.8.9:LICENSE` + +```text +MIT License + +Copyright 2013-2014 RAD Game Tools and Valve Software +Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC +Copyright (c) 2017 Frommi +Copyright (c) 2017-2024 oyvindln + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `4249c8e6c5ebb85f97c77e6457c6fafc1066406eb8f1ef61e796fbdc5ff18482` + +Covered sources: + +- `tower-layer@0.3.3:LICENSE` +- `tower-service@0.3.3:LICENSE` +- `tower@0.5.3:LICENSE` + +```text +Copyright (c) 2019 Tower Contributors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `42a35170233e83e18856792e748de4c1ce4a63b2afce9a370c89ef3fe23f9f2d` + +Covered sources: + +- `simd-adler32@0.3.8:LICENSE.md` + +```text +MIT License + +Copyright (c) [2021] [Marvin Countryman] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `436bc5a105d8e57dcd8778730f3754f7bf39c14d2f530e4cde4bd2d17a83ec3d` + +Covered sources: + +- `uuid@1.23.4:LICENSE-MIT` + +```text +Copyright (c) 2014 The Rust Project Developers +Copyright (c) 2018 Ashley Mannix, Christopher Armstrong, Dylan DPC, Hunar Roop Kahlon + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `45f522cacecb1023856e46df79ca625dfc550c94910078bd8aec6e02880b3d42` + +Covered sources: + +- `bytes@1.12.1:LICENSE` + +```text +Copyright (c) 2018 Carl Lerche + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `45fd05c4865e7c350b98ad7ac50e1b15462d49af4a91e9b0c9dd933dc9a69742` + +Covered sources: + +- `rustls-pki-types@1.13.2:LICENSE-APACHE` + +```text + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2023 Dirkjan Ochtman + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +### SHA-256 `47dc9ff29128ddfb4d6a0435383c9f89120bc374dbcc1dd00b933a0b28aa7865` + +Covered sources: + +- `ipnet@2.12.0:LICENSE-MIT` + +```text +Copyright 2017 Juniper Networks, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `48341f685c87304089aa099b23c386f8bacc519ef555aa7a13e239908907b3fd` + +Covered sources: + +- `zstd-sys@2.0.16+zstd.1.5.7:LICENSE.BSD-3-Clause` + +```text +The auto-generated bindings are under the 3-clause BSD license: + +BSD License + +For Zstandard software + +Copyright (c) 2016-present, Facebook, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` + +### SHA-256 `4cada0bd02ea3692eee6f16400d86c6508bbd3bafb2b65fed0419f36d4f83e8f` + +Covered sources: + +- `ppv-lite86@0.2.21:LICENSE-MIT` + +```text +Copyright (c) 2019 The CryptoCorrosion Contributors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `5049cf464977eff4b4fcfa7988d84e74116956a3eb9d5f1d451b3f828f945233` + +Covered sources: + +- `tower-http@0.6.8:LICENSE` + +```text +Copyright (c) 2019-2021 Tower Contributors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `523a42c25d245dde9c015f882cec7f4555aad883382a6cf19b4b7d9b2cd5419b` + +Covered sources: + +- `getrandom@0.4.2:LICENSE-MIT` + +```text +Copyright (c) 2018-2026 The rust-random Project Developers +Copyright (c) 2014 The Rust Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `5734ed989dfca1f625b40281ee9f4530f91b2411ec01cb748223e7eb87e201ab` + +Covered sources: + +- `crossbeam-channel@0.5.15:LICENSE-MIT` +- `crossbeam-epoch@0.9.20:LICENSE-MIT` +- `crossbeam-utils@0.8.21:LICENSE-MIT` + +```text +The MIT License (MIT) + +Copyright (c) 2019 The Crossbeam Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `61d383b05b87d78f94d2937e2580cce47226d17823c0430fbcad09596537efcf` + +Covered sources: + +- `crc32fast@1.5.0:LICENSE-MIT` + +```text +MIT License + +Copyright (c) 2018 Sam Rijs, Alex Crichton and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3` + +Covered sources: + +- `core-foundation-sys@0.8.7:LICENSE-MIT` +- `core-foundation@0.9.4:LICENSE-MIT` + +```text +Copyright (c) 2012-2013 Mozilla Foundation + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `6226d0632e2e1a80c23597e964da9812ae193c535fe058154afb034e94167aa5` + +Covered sources: + +- `atomic-waker@1.1.2:LICENSE-THIRD-PARTY` + +```text +=============================================================================== + +Copyright (c) 2016 Alex Crichton +Copyright (c) 2017 The Tokio Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +=============================================================================== + +Copyright (c) 2016 Alex Crichton +Copyright (c) 2017 The Tokio Authors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `626223cde56b767d15e0b14edb70d58fec2dd947db3ed9df6a1117c37f8b53fb` + +Covered sources: + +- `wreq-proto@0.2.5:LICENSE` + +```text + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2026 0x676e67 + Copyright (c) 2014-2026 Sean McArthur + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +### SHA-256 `62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a` + +Covered sources: + +- `allocator-api2@0.2.21:LICENSE-APACHE` +- `anyhow@1.0.104:LICENSE-APACHE` +- `itoa@1.0.17:LICENSE-APACHE` +- `libc@0.2.186:LICENSE-APACHE` +- `linkme@0.3.35:LICENSE-APACHE` +- `semver@1.0.27:LICENSE-APACHE` +- `serde@1.0.229:LICENSE-APACHE` +- `serde_core@1.0.229:LICENSE-APACHE` +- `serde_json@1.0.151:LICENSE-APACHE` +- `thiserror@1.0.69:LICENSE-APACHE` +- `thiserror@2.0.17:LICENSE-APACHE` + +```text + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS +``` + +### SHA-256 `6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb` + +Covered sources: + +- `bitflags@2.13.1:LICENSE-MIT` +- `log@0.4.29:LICENSE-MIT` + +```text +Copyright (c) 2014 The Rust Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `65fdb6c76cd61612070c066eec9ecdb30ee74fb27859d0d9af58b9f499fd0c3e` + +Covered sources: + +- `fnv@1.0.7:LICENSE-MIT` + +```text +Copyright (c) 2017 Contributors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd` + +Covered sources: + +- `futures-channel@0.3.32:LICENSE-MIT` +- `futures-core@0.3.34:LICENSE-MIT` +- `futures-sink@0.3.34:LICENSE-MIT` +- `futures-task@0.3.34:LICENSE-MIT` +- `futures-util@0.3.34:LICENSE-MIT` + +```text +Copyright (c) 2016 Alex Crichton +Copyright (c) 2017 The Tokio Authors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `67b987e7a15e32c81f4f06984798a17733dc751efae58296814a62d88a49481a` + +Covered sources: + +- `async-compression@0.4.36:selected Apache-2.0` +- `compression-codecs@0.4.35:selected Apache-2.0` +- `compression-core@0.4.31:selected Apache-2.0` +- `neon@1.1.1:selected Apache-2.0` +- `tokio-btls@0.5.6:LICENSE-APACHE` + +```text + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2016 Tokio contributors +Copyright (c) 2025 0x676e67 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +### SHA-256 `6df43f6f4b5d4587f3d8d71e45532c688fd168afa5fe89d571cb32fa09c4ef51` + +Covered sources: + +- `rand_core@0.9.3:LICENSE-APACHE` + +```text + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. +``` + +### SHA-256 `7365cc8878a1d7ce155a58c4ca09c3d7a6be413efa5334a80ea842912b669349` + +Covered sources: + +- `equivalent@1.0.2:LICENSE-MIT` + +```text +Copyright (c) 2016--2023 + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `7576269ea71f767b99297934c0b2367532690f8c4badc695edf8e04ab6a1e545` + +Covered sources: + +- `either@1.15.0:LICENSE-MIT` + +```text +Copyright (c) 2015 + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `799e9ca9d179295ef372f25d3769cdda7d25bb2668add6a6a1e22d1e4c678b8d` + +Covered sources: + +- `miniz_oxide@0.8.9:LICENSE-MIT.md` + +```text +MIT License + +Copyright 2013-2014 RAD Game Tools and Valve Software +Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC +Copyright (c) 2017 Frommi +Copyright (c) 2017-2024 oyvindln + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `7fe7e5e13e445074314ba0aa12ec2e71132931632876ba27b98a1020cf24eb57` + +Covered sources: + +- `moka@0.12.16:LICENSE-MIT` + +```text +MIT License + +Copyright (c) 2020 - 2026 Tatsuya Kawano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `7fea0ee51a4ca5d5cea7464135fd55e8b09caf3a61da3d451ac8a22af95c033f` + +Covered sources: + +- `tungstenite@0.29.0:LICENSE-MIT` + +```text +Copyright (c) 2017 Alexey Galakhov +Copyright (c) 2016 Jason Housley + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` + +### SHA-256 `827c8d8fc207c2392794eef9e00fe246f9f61fdcc132556c275be3dd8c3cd97f` + +Covered sources: + +- `BoringSSL@91a66a59b6c1435120ff83e245d7719411294386:btls-sys/deps/boringssl/LICENSE` + +> Modification note: `btls-sys@0.5.6` applies its published BoringSSL patch sets, and the wreq-js v3.2.0 build workflow also adjusts btls-sys build logic for Windows targets. The distributed native object is therefore built from a modified Apache-2.0 work. + +```text + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +Licenses for support code +------------------------- + +Parts of the TLS test suite are under the Go license. This code is not included +in BoringSSL (i.e. libcrypto and libssl) when compiled, however, so +distributing code linked against BoringSSL does not trigger this license: + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` + +### SHA-256 `838118388fe5c2e7f1dbbaeed13e1c7f3ebf88be91319c7c1d77c18e987d1a50` + +Covered sources: + +- `encoding_rs@0.8.35:LICENSE-WHATWG` + +```text +Copyright © WHATWG (Apple, Google, Mozilla, Microsoft). + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` + +### SHA-256 `83c1763356e822adde0a2cae748d938a73fdc263849ccff6b27776dff213bd32` + +Covered sources: + +- `zerocopy@0.8.31:LICENSE-BSD` + +```text +Copyright 2019 The Fuchsia Authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` + +### SHA-256 `861399f8c21c042b110517e76dc6b63a2b334276c8cf17412fc3c8908ca8dc17` + +Covered sources: + +- `adler2@2.0.1:LICENSE-0BSD` + +```text +Copyright (C) Jonas Schievink + +Permission to use, copy, modify, and/or distribute this software for +any purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN +AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +``` + +### SHA-256 `87d9feb9238c6bd8e0024fc4733b06cff036f89f36d93b7df1c8a0549bbb7a5b` + +Covered sources: + +- `ipnet@2.12.0:LICENSE-APACHE` + +```text + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2017 Juniper Networks, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +### SHA-256 `8ada45cd9f843acf64e4722ae262c622a2b3b3007c7310ef36ac1061a30f6adb` + +Covered sources: + +- `adler2@2.0.1:LICENSE-APACHE` + +```text + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/LICENSE-2.0 + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +### SHA-256 `8b43ce8accd61e9d370b5ca9e9c4f953279b5c239926c62315b40e24df51b726` + +Covered sources: + +- `idna_adapter@1.2.1:LICENSE-MIT` + +```text +Copyright (c) The rust-url developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `8b62775bacdfa5ae8390519b7cdf7ab7d6c53f008981f1b9abd6135ef745b67e` + +Covered sources: + +- `try-lock@0.2.5:LICENSE` + +```text +Copyright (c) 2018-2023 Sean McArthur +Copyright (c) 2016 Alex Crichton + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` + +### SHA-256 `8b87502eddb2d7fa23d54ed2caf5681ab5fbbdc8eb553e8ade710240842f9097` + +Covered sources: + +- `mime@0.3.17:LICENSE-MIT` + +```text +Copyright (c) 2014 Sean McArthur + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` + +### SHA-256 `8bb1b50b0e5c9399ae33bd35fab2769010fa6c14e8860c729a52295d84896b7a` + +Covered sources: + +- `http@1.4.0:LICENSE-APACHE` + +```text + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2017 http-rs authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +### SHA-256 `8ce0830173fdac609dfb4ea603fdc002c2f4af0dc9b1a005653f5da9cf534b18` + +Covered sources: + +- `slab@0.4.11:LICENSE` + +```text +Copyright (c) 2019 Carl Lerche + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `9117d922e667125508dde62b02c1f57ed22f5ad21eb536aa2e2d99e1c796e639` + +Covered sources: + +- `rustls-pki-types@1.13.2:LICENSE-MIT` + +```text +Copyright (c) 2023 Dirkjan Ochtman + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `92caec58166a8afc9d5054ba03c96c1c351f4e788bbf647ba058ba0318e9078f` + +Covered sources: + +- `wreq@0.16.0:LICENSE` + +```text + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2016 Sean McArthur + Copyright 2026 0x676e67 + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +### SHA-256 `96d741569b18c61043e5ad2b8505b5e4891a27994b732b1da9f86f46be67f59a` + +Covered sources: + +- `want@0.3.1:LICENSE` + +```text +Copyright (c) 2018-2019 Sean McArthur + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` + +### SHA-256 `9e0dfd2dd4173a530e238cb6adb37aa78c34c6bc7444e0e10c1ab5d8881f63ba` + +Covered sources: + +- `digest@0.10.7:LICENSE-MIT` + +```text +Copyright (c) 2017 Artyom Pavlov + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `a0bb5ec9a11d4b34412e0b9867c01f0cc63f5935ab20a087798201b910be5aa1` + +Covered sources: + +- `tokio-socks@0.5.2:LICENSE` + +```text +MIT License + +Copyright (c) 2018 Yilin Chen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `a2b15e1e900414317d0e00d887dd2747d4abd00382c6addeb5daf746bed4b52b` + +Covered sources: + +- `tagptr@0.2.0:LICENSE-APACHE` + +```text +Copyright 2021 Oliver Giersch + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +### SHA-256 `a50b6cbe8a27d28a0d9c58ba30effda2554513d10b70e05707a8edd62cad524e` + +Covered sources: + +- `lru@0.18.1:LICENSE` + +```text +MIT License + +Copyright (c) 2016 Jerome Froelich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2` + +Covered sources: + +- `atomic-waker@1.1.2:LICENSE-APACHE` +- `bitflags@2.13.1:LICENSE-APACHE` +- `cfg-if@1.0.4:LICENSE-APACHE` +- `core-foundation-sys@0.8.7:LICENSE-APACHE` +- `core-foundation@0.9.4:LICENSE-APACHE` +- `crossbeam-channel@0.5.15:LICENSE-APACHE` +- `crossbeam-epoch@0.9.20:LICENSE-APACHE` +- `crossbeam-utils@0.8.21:LICENSE-APACHE` +- `either@1.15.0:LICENSE-APACHE` +- `equivalent@1.0.2:LICENSE-APACHE` +- `flate2@1.1.9:LICENSE-APACHE` +- `fnv@1.0.7:LICENSE-APACHE` +- `form_urlencoded@1.2.2:LICENSE-APACHE` +- `hashbrown@0.14.5:LICENSE-APACHE` +- `hashbrown@0.16.1:LICENSE-APACHE` +- `hashbrown@0.17.1:LICENSE-APACHE` +- `httparse@1.10.1:LICENSE-APACHE` +- `idna@1.1.0:LICENSE-APACHE` +- `idna_adapter@1.2.1:LICENSE-APACHE` +- `indexmap@2.12.1:LICENSE-APACHE` +- `lock_api@0.4.14:LICENSE-APACHE` +- `log@0.4.29:LICENSE-APACHE` +- `mime@0.3.17:LICENSE-APACHE` +- `once_cell@1.21.4:LICENSE-APACHE` +- `parking_lot@0.12.5:LICENSE-APACHE` +- `parking_lot_core@0.9.12:LICENSE-APACHE` +- `percent-encoding@2.3.2:LICENSE-APACHE` +- `scopeguard@1.2.0:LICENSE-APACHE` +- `send_wrapper@0.6.0:LICENSE-APACHE.txt` +- `smallvec@1.15.1:LICENSE-APACHE` +- `socket2@0.6.3:LICENSE-APACHE` +- `stable_deref_trait@1.2.1:LICENSE-APACHE` +- `system-configuration-sys@0.6.0:LICENSE-APACHE` +- `system-configuration@0.7.0:LICENSE-APACHE` +- `tungstenite@0.29.0:LICENSE-APACHE` +- `typed-builder@0.23.2:LICENSE-APACHE` +- `url@2.5.8:LICENSE-APACHE` +- `uuid@1.23.4:LICENSE-APACHE` + +```text + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +### SHA-256 `a77b7cfeaf911ed410ffbe76f0cb2b24ad8a4d94e7ead5727e914425c416cc63` + +Covered sources: + +- `zstd-safe@7.2.4:LICENSE` +- `zstd-sys@2.0.16+zstd.1.5.7:LICENSE` + +```text +MIT or Apache-2.0 +``` + +### SHA-256 `a825bd853ab71619a4923d7b4311221427848070ff44d990da39b0b274c1683f` + +Covered sources: + +- `typenum@1.19.0:LICENSE-MIT` + +```text +The MIT License (MIT) + +Copyright (c) 2014 Paho Lurie-Gregg + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5` + +Covered sources: + +- `block-buffer@0.10.4:LICENSE-APACHE` +- `cpufeatures@0.2.17:LICENSE-APACHE` +- `crypto-common@0.1.7:LICENSE-APACHE` +- `digest@0.10.7:LICENSE-APACHE` +- `sha1@0.10.6:LICENSE-APACHE` + +```text + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +### SHA-256 `aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf` + +Covered sources: + +- `getrandom@0.3.4:LICENSE-APACHE` +- `getrandom@0.4.2:LICENSE-APACHE` + +```text + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +### SHA-256 `ae9baa7beea910273c2f384c2a6b721fb7bd02bda3436074a1072e4ee689f985` + +Covered sources: + +- `cpufeatures@0.2.17:LICENSE-MIT` + +```text +Copyright (c) 2020-2025 The RustCrypto Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `af85fff507d80e6c7ff242acfc4b0a7f5de9a72286bb3c883c782772ca4b4402` + +Covered sources: + +- `num-conv@0.1.0:LICENSE-MIT` + +```text +Copyright (c) 2023 Jacob Pratt + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `b16db96b93b1d7cf7bea533f572091ec6bca3234fbe0a83038be772ff391a44c` + +Covered sources: + +- `crossbeam-channel@0.5.15:LICENSE-THIRD-PARTY` + +```text +=============================================================================== + +matching.go +https://creativecommons.org/licenses/by/3.0/legalcode + +Creative Commons Legal Code + +Attribution 3.0 Unported + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR + DAMAGES RESULTING FROM ITS USE. + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE +COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY +COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS +AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY +BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS +CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND +CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and + other pre-existing works, such as a translation, adaptation, + derivative work, arrangement of music or other alterations of a + literary or artistic work, or phonogram or performance and includes + cinematographic adaptations or any other form in which the Work may be + recast, transformed, or adapted including in any form recognizably + derived from the original, except that a work that constitutes a + Collection will not be considered an Adaptation for the purpose of + this License. For the avoidance of doubt, where the Work is a musical + work, performance or phonogram, the synchronization of the Work in + timed-relation with a moving image ("synching") will be considered an + Adaptation for the purpose of this License. + b. "Collection" means a collection of literary or artistic works, such as + encyclopedias and anthologies, or performances, phonograms or + broadcasts, or other works or subject matter other than works listed + in Section 1(f) below, which, by reason of the selection and + arrangement of their contents, constitute intellectual creations, in + which the Work is included in its entirety in unmodified form along + with one or more other contributions, each constituting separate and + independent works in themselves, which together are assembled into a + collective whole. A work that constitutes a Collection will not be + considered an Adaptation (as defined above) for the purposes of this + License. + c. "Distribute" means to make available to the public the original and + copies of the Work or Adaptation, as appropriate, through sale or + other transfer of ownership. + d. "Licensor" means the individual, individuals, entity or entities that + offer(s) the Work under the terms of this License. + e. "Original Author" means, in the case of a literary or artistic work, + the individual, individuals, entity or entities who created the Work + or if no individual or entity can be identified, the publisher; and in + addition (i) in the case of a performance the actors, singers, + musicians, dancers, and other persons who act, sing, deliver, declaim, + play in, interpret or otherwise perform literary or artistic works or + expressions of folklore; (ii) in the case of a phonogram the producer + being the person or legal entity who first fixes the sounds of a + performance or other sounds; and, (iii) in the case of broadcasts, the + organization that transmits the broadcast. + f. "Work" means the literary and/or artistic work offered under the terms + of this License including without limitation any production in the + literary, scientific and artistic domain, whatever may be the mode or + form of its expression including digital form, such as a book, + pamphlet and other writing; a lecture, address, sermon or other work + of the same nature; a dramatic or dramatico-musical work; a + choreographic work or entertainment in dumb show; a musical + composition with or without words; a cinematographic work to which are + assimilated works expressed by a process analogous to cinematography; + a work of drawing, painting, architecture, sculpture, engraving or + lithography; a photographic work to which are assimilated works + expressed by a process analogous to photography; a work of applied + art; an illustration, map, plan, sketch or three-dimensional work + relative to geography, topography, architecture or science; a + performance; a broadcast; a phonogram; a compilation of data to the + extent it is protected as a copyrightable work; or a work performed by + a variety or circus performer to the extent it is not otherwise + considered a literary or artistic work. + g. "You" means an individual or entity exercising rights under this + License who has not previously violated the terms of this License with + respect to the Work, or who has received express permission from the + Licensor to exercise rights under this License despite a previous + violation. + h. "Publicly Perform" means to perform public recitations of the Work and + to communicate to the public those public recitations, by any means or + process, including by wire or wireless means or public digital + performances; to make available to the public Works in such a way that + members of the public may access these Works from a place and at a + place individually chosen by them; to perform the Work to the public + by any means or process and the communication to the public of the + performances of the Work, including by public digital performance; to + broadcast and rebroadcast the Work by any means including signs, + sounds or images. + i. "Reproduce" means to make copies of the Work by any means including + without limitation by sound or visual recordings and the right of + fixation and reproducing fixations of the Work, including storage of a + protected performance or phonogram in digital form or other electronic + medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, +limit, or restrict any uses free from copyright or rights arising from +limitations or exceptions that are provided for in connection with the +copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, +Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license to +exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more + Collections, and to Reproduce the Work as incorporated in the + Collections; + b. to create and Reproduce Adaptations provided that any such Adaptation, + including any translation in any medium, takes reasonable steps to + clearly label, demarcate or otherwise identify that changes were made + to the original Work. For example, a translation could be marked "The + original work was translated from English to Spanish," or a + modification could indicate "The original work has been modified."; + c. to Distribute and Publicly Perform the Work including as incorporated + in Collections; and, + d. to Distribute and Publicly Perform Adaptations. + e. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme cannot be waived, the Licensor + reserves the exclusive right to collect such royalties for any + exercise by You of the rights granted under this License; + ii. Waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme can be waived, the Licensor waives the + exclusive right to collect such royalties for any exercise by You + of the rights granted under this License; and, + iii. Voluntary License Schemes. The Licensor waives the right to + collect royalties, whether individually or, in the event that the + Licensor is a member of a collecting society that administers + voluntary licensing schemes, via that society, from any exercise + by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now +known or hereafter devised. The above rights include the right to make +such modifications as are technically necessary to exercise the rights in +other media and formats. Subject to Section 8(f), all rights not expressly +granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made +subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms + of this License. You must include a copy of, or the Uniform Resource + Identifier (URI) for, this License with every copy of the Work You + Distribute or Publicly Perform. You may not offer or impose any terms + on the Work that restrict the terms of this License or the ability of + the recipient of the Work to exercise the rights granted to that + recipient under the terms of the License. You may not sublicense the + Work. You must keep intact all notices that refer to this License and + to the disclaimer of warranties with every copy of the Work You + Distribute or Publicly Perform. When You Distribute or Publicly + Perform the Work, You may not impose any effective technological + measures on the Work that restrict the ability of a recipient of the + Work from You to exercise the rights granted to that recipient under + the terms of the License. This Section 4(a) applies to the Work as + incorporated in a Collection, but this does not require the Collection + apart from the Work itself to be made subject to the terms of this + License. If You create a Collection, upon notice from any Licensor You + must, to the extent practicable, remove from the Collection any credit + as required by Section 4(b), as requested. If You create an + Adaptation, upon notice from any Licensor You must, to the extent + practicable, remove from the Adaptation any credit as required by + Section 4(b), as requested. + b. If You Distribute, or Publicly Perform the Work or any Adaptations or + Collections, You must, unless a request has been made pursuant to + Section 4(a), keep intact all copyright notices for the Work and + provide, reasonable to the medium or means You are utilizing: (i) the + name of the Original Author (or pseudonym, if applicable) if supplied, + and/or if the Original Author and/or Licensor designate another party + or parties (e.g., a sponsor institute, publishing entity, journal) for + attribution ("Attribution Parties") in Licensor's copyright notice, + terms of service or by other reasonable means, the name of such party + or parties; (ii) the title of the Work if supplied; (iii) to the + extent reasonably practicable, the URI, if any, that Licensor + specifies to be associated with the Work, unless such URI does not + refer to the copyright notice or licensing information for the Work; + and (iv) , consistent with Section 3(b), in the case of an Adaptation, + a credit identifying the use of the Work in the Adaptation (e.g., + "French translation of the Work by Original Author," or "Screenplay + based on original Work by Original Author"). The credit required by + this Section 4 (b) may be implemented in any reasonable manner; + provided, however, that in the case of a Adaptation or Collection, at + a minimum such credit will appear, if a credit for all contributing + authors of the Adaptation or Collection appears, then as part of these + credits and in a manner at least as prominent as the credits for the + other contributing authors. For the avoidance of doubt, You may only + use the credit required by this Section for the purpose of attribution + in the manner set out above and, by exercising Your rights under this + License, You may not implicitly or explicitly assert or imply any + connection with, sponsorship or endorsement by the Original Author, + Licensor and/or Attribution Parties, as appropriate, of You or Your + use of the Work, without the separate, express prior written + permission of the Original Author, Licensor and/or Attribution + Parties. + c. Except as otherwise agreed in writing by the Licensor or as may be + otherwise permitted by applicable law, if You Reproduce, Distribute or + Publicly Perform the Work either by itself or as part of any + Adaptations or Collections, You must not distort, mutilate, modify or + take other derogatory action in relation to the Work which would be + prejudicial to the Original Author's honor or reputation. Licensor + agrees that in those jurisdictions (e.g. Japan), in which any exercise + of the right granted in Section 3(b) of this License (the right to + make Adaptations) would be deemed to be a distortion, mutilation, + modification or other derogatory action prejudicial to the Original + Author's honor and reputation, the Licensor will waive or not assert, + as appropriate, this Section, to the fullest extent permitted by the + applicable national law, to enable You to reasonably exercise Your + right under Section 3(b) of this License (right to make Adaptations) + but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, +INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, +FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF +LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, +WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION +OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE +LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR +ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES +ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate + automatically upon any breach by You of the terms of this License. + Individuals or entities who have received Adaptations or Collections + from You under this License, however, will not have their licenses + terminated provided such individuals or entities remain in full + compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will + survive any termination of this License. + b. Subject to the above terms and conditions, the license granted here is + perpetual (for the duration of the applicable copyright in the Work). + Notwithstanding the above, Licensor reserves the right to release the + Work under different license terms or to stop distributing the Work at + any time; provided, however that any such election will not serve to + withdraw this License (or any other license that has been, or is + required to be, granted under the terms of this License), and this + License will continue in full force and effect unless terminated as + stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, + the Licensor offers to the recipient a license to the Work on the same + terms and conditions as the license granted to You under this License. + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor + offers to the recipient a license to the original Work on the same + terms and conditions as the license granted to You under this License. + c. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of + the remainder of the terms of this License, and without further action + by the parties to this agreement, such provision shall be reformed to + the minimum extent necessary to make such provision valid and + enforceable. + d. No term or provision of this License shall be deemed waived and no + breach consented to unless such waiver or consent shall be in writing + and signed by the party to be charged with such waiver or consent. + e. This License constitutes the entire agreement between the parties with + respect to the Work licensed here. There are no understandings, + agreements or representations with respect to the Work not specified + here. Licensor shall not be bound by any additional provisions that + may appear in any communication from You. This License may not be + modified without the mutual written agreement of the Licensor and You. + f. The rights granted under, and the subject matter referenced, in this + License were drafted utilizing the terminology of the Berne Convention + for the Protection of Literary and Artistic Works (as amended on + September 28, 1979), the Rome Convention of 1961, the WIPO Copyright + Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 + and the Universal Copyright Convention (as revised on July 24, 1971). + These rights and subject matter take effect in the relevant + jurisdiction in which the License terms are sought to be enforced + according to the corresponding provisions of the implementation of + those treaty provisions in the applicable national law. If the + standard suite of rights granted under applicable copyright law + includes additional rights not granted under this License, such + additional rights are deemed to be included in the License; this + License is not intended to restrict the license of any rights under + applicable law. + + +Creative Commons Notice + + Creative Commons is not a party to this License, and makes no warranty + whatsoever in connection with the Work. Creative Commons will not be + liable to You or any party on any legal theory for any damages + whatsoever, including without limitation any general, special, + incidental or consequential damages arising in connection to this + license. Notwithstanding the foregoing two (2) sentences, if Creative + Commons has expressly identified itself as the Licensor hereunder, it + shall have all rights and obligations of Licensor. + + Except for the limited purpose of indicating to the public that the + Work is licensed under the CCPL, Creative Commons does not authorize + the use by either party of the trademark "Creative Commons" or any + related trademark or logo of Creative Commons without the prior + written consent of Creative Commons. Any permitted use will be in + compliance with Creative Commons' then-current trademark usage + guidelines, as may be published on its website or otherwise made + available upon request from time to time. For the avoidance of doubt, + this trademark restriction does not form part of this License. + + Creative Commons may be contacted at https://creativecommons.org/. + +=============================================================================== + +The Go Programming Language +https://golang.org/LICENSE + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=============================================================================== + +The Rust Programming Language +https://github.com/rust-lang/rust/blob/master/LICENSE-MIT + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +=============================================================================== + +The Rust Programming Language +https://github.com/rust-lang/rust/blob/master/LICENSE-APACHE + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +### SHA-256 `b21623012e6c453d944b0342c515b631cfcbf30704c2621b291526b69c10724d` + +Covered sources: + +- `http2@0.5.17:LICENSE` + +```text +Copyright (c) 2017 h2 authors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `b29f8b01452350c20dd1af16ef83b598fea3053578ccc1c7a0ef40e57be2620f` + +Covered sources: + +- `libloading@0.8.9:LICENSE` + +```text +Copyright © 2015, Simonas Kazlauskas + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without +fee is hereby granted, provided that the above copyright notice and this permission notice appear +in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS +SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. +``` + +### SHA-256 `b38f11f6096706e6de553dabe2a7ed142d59b6fa8c97e290c67496154745cdd5` + +Covered sources: + +- `idna@1.1.0:LICENSE-MIT` +- `percent-encoding@2.3.2:LICENSE-MIT` +- `url@2.5.8:LICENSE-MIT` + +```text +Copyright (c) 2013-2025 The rust-url developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `b40930bbcf80744c86c46a12bc9da056641d722716c378f5659b9e555ef833e1` + +Covered sources: + +- `crc32fast@1.5.0:LICENSE-APACHE` +- `foreign-types-shared@0.3.1:LICENSE-APACHE` +- `foreign-types@0.5.0:LICENSE-APACHE` + +```text + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +### SHA-256 `b4eb00df6e2a4d22518fcaa6a2b4646f249b3a3c9814509b22bd2091f1392ff1` + +Covered sources: + +- `sha1@0.10.6:LICENSE-MIT` + +```text +Copyright (c) 2006-2009 Graydon Hoare +Copyright (c) 2009-2013 Mozilla Foundation +Copyright (c) 2016 Artyom Pavlov + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `b68ad1a3367b825447089e1f8d6829b97f47a89eb78d2f4ebaef4672f5606186` + +Covered sources: + +- `data-encoding@2.9.0:LICENSE` + +```text +The MIT License (MIT) + +Copyright (c) 2015-2020 Julien Cretin +Copyright (c) 2017-2020 Google Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `c0c56f26d9c051cac4d200c34c84e7ae9aaa853e01a982a1df08b09931e518ae` + +Covered sources: + +- `alloc-no-stdlib@2.0.4:LICENSE` +- `alloc-stdlib@0.2.2:repository-root/LICENSE` +- `brotli-decompressor@5.0.0:LICENSE` + +```text +Copyright (c) 2016 Dropbox, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` + +### SHA-256 `c0fd5f9df8d17e13587f8fe403d2326b835e60d532817d0b42ae4aea44209251` + +Covered sources: + +- `num-conv@0.1.0:LICENSE-Apache` + +```text + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2023 Jacob Pratt + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +### SHA-256 `c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b` + +Covered sources: + +- `windows-link@0.2.1:license-apache-2.0` +- `windows-registry@0.6.1:license-apache-2.0` +- `windows-result@0.4.1:license-apache-2.0` +- `windows-strings@0.5.1:license-apache-2.0` +- `windows-sys@0.61.2:license-apache-2.0` + +```text + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) Microsoft Corporation. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +### SHA-256 `c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383` + +Covered sources: + +- `windows-link@0.2.1:license-mit` +- `windows-registry@0.6.1:license-mit` +- `windows-result@0.4.1:license-mit` +- `windows-strings@0.5.1:license-mit` +- `windows-sys@0.61.2:license-mit` + +```text + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +``` + +### SHA-256 `c51bb9b3b2819748d230647763d4ffdceb6a00d349860b2c764ec48ae7489c2f` + +Covered sources: + +- `tokio-btls@0.5.6:LICENSE-MIT` + +```text +Copyright (c) 2016 Tokio contributors +Copyright (c) 2020 Ivan Nikulin +Copyright (c) 2025 0x676e67 + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5` + +Covered sources: + +- `lock_api@0.4.14:LICENSE-MIT` +- `parking_lot@0.12.5:LICENSE-MIT` +- `parking_lot_core@0.9.12:LICENSE-MIT` + +```text +Copyright (c) 2016 The Rust Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `cddabf8adc6ccd6c3e68f5d71eac9fae3094116623cf23a46af0a5fd6b8ee813` + +Covered sources: + +- `http-body@1.0.1:LICENSE` + +```text +Copyright (c) 2019-2024 Sean McArthur & Hyper Contributors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30` + +Covered sources: + +- `encoding_rs@0.8.35:LICENSE-APACHE` +- `utf8_iter@1.0.4:LICENSE-APACHE` + +```text + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +### SHA-256 `d5c22aa3118d240e877ad41c5d9fa232f9c77d757d4aac0c2f943afc0a95e0ef` + +Covered sources: + +- `block-buffer@0.10.4:LICENSE-MIT` + +```text +Copyright (c) 2018-2019 The RustCrypto Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `dc91f8200e4b2a1f9261035d4c18c33c246911a6c0f7b543d75347e61b249cff` + +Covered sources: + +- `http@1.4.0:LICENSE-MIT` + +```text +Copyright (c) 2017 http-rs authors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `e271993808fec50ab29350b39539cdec611a9103f827e0aa26d61da70e2d33f8` + +Covered sources: + +- `webpki-root-certs@1.0.9:LICENSE` + +```text +# Community Data License Agreement - Permissive - Version 2.0 + +This is the Community Data License Agreement - Permissive, Version +2.0 (the "agreement"). Data Provider(s) and Data Recipient(s) agree +as follows: + +## 1. Provision of the Data + +1.1. A Data Recipient may use, modify, and share the Data made +available by Data Provider(s) under this agreement if that Data +Recipient follows the terms of this agreement. + +1.2. This agreement does not impose any restriction on a Data +Recipient's use, modification, or sharing of any portions of the +Data that are in the public domain or that may be used, modified, +or shared under any other legal exception or limitation. + +## 2. Conditions for Sharing Data + +2.1. A Data Recipient may share Data, with or without modifications, so +long as the Data Recipient makes available the text of this agreement +with the shared Data. + +## 3. No Restrictions on Results + +3.1. This agreement does not impose any restriction or obligations +with respect to the use, modification, or sharing of Results. + +## 4. No Warranty; Limitation of Liability + +4.1. All Data Recipients receive the Data subject to the following +terms: + +THE DATA IS PROVIDED ON AN "AS IS" BASIS, WITHOUT REPRESENTATIONS, +WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED +INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +NO DATA PROVIDER SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING +WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE DATA OR RESULTS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +## 5. Definitions + +5.1. "Data" means the material received by a Data Recipient under +this agreement. + +5.2. "Data Provider" means any person who is the source of Data +provided under this agreement and in reliance on a Data Recipient's +agreement to its terms. + +5.3. "Data Recipient" means any person who receives Data directly +or indirectly from a Data Provider and agrees to the terms of this +agreement. + +5.4. "Results" means any outcome obtained by computational analysis +of Data, including for example machine learning models and models' +insights. +``` + +### SHA-256 `eb69613e00e596e13d2f58e820aee10e9d51754b91d7111bc997f1fc90791f66` + +Covered sources: + +- `generic-array@0.14.7:LICENSE` + +```text +The MIT License (MIT) + +Copyright (c) 2015 Bartłomiej Kamiński + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `ecc269ef87fd38a1d98e30bfac9ba964a9dbd9315c3770fed98d4d7cb5882055` + +Covered sources: + +- `indexmap@2.12.1:LICENSE-MIT` + +```text +Copyright (c) 2016--2017 + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `edd65bdd88957a205c47d53fa499eed8865a70320f0f03f6391668cb304ea376` + +Covered sources: + +- `deranged@0.5.5:LICENSE-Apache` + +```text + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2024 Jacob Pratt et al. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +### SHA-256 `eef7770e932a552c42e66ac6b07095b59edf017d730564da20cc33d4fe9fbaec` + +Covered sources: + +- `btls@0.5.6:LICENSE` + +```text +Copyright 2011-2017 Google Inc. + 2013 Jack Lloyd + 2013-2014 Steven Fackler + 2020 Ivan Nikulin +Copyright (c) 2025 0x676e67 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +### SHA-256 `f28420c1906af38be726cd7842798f0194b27c41d6051c0d1e9ee348b8a4a0ea` + +Covered sources: + +- `cookie@0.18.1:LICENSE-MIT` + +```text +Copyright (c) 2017 Sergio Benitez +Copyright (c) 2014 Alex Crichton + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2` + +Covered sources: + +- `icu_collections@2.1.1:LICENSE` +- `icu_locale_core@2.1.1:LICENSE` +- `icu_normalizer@2.1.1:LICENSE` +- `icu_normalizer_data@2.1.1:LICENSE` +- `icu_properties@2.1.2:LICENSE` +- `icu_properties_data@2.1.2:LICENSE` +- `icu_provider@2.1.1:LICENSE` +- `litemap@0.8.1:LICENSE` +- `potential_utf@0.1.4:LICENSE` +- `tinystr@0.8.2:LICENSE` +- `writeable@0.6.2:LICENSE` +- `yoke@0.8.1:LICENSE` +- `zerofrom@0.1.6:LICENSE` +- `zerotrie@0.2.3:LICENSE` +- `zerovec@0.11.5:LICENSE` + +```text +UNICODE LICENSE V3 + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 2020-2024 Unicode, Inc. + +NOTICE TO USER: Carefully read the following legal agreement. BY +DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR +SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT +DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of data files and any associated documentation (the "Data Files") or +software and any associated documentation (the "Software") to deal in the +Data Files or Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, and/or sell +copies of the Data Files or Software, and to permit persons to whom the +Data Files or Software are furnished to do so, provided that either (a) +this copyright and permission notice appear with all copies of the Data +Files or Software, or (b) this copyright and permission notice appear in +associated Documentation. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF +THIRD PARTY RIGHTS. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE +BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA +FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall +not be used in advertising or otherwise to promote the sale, use or other +dealings in these Data Files or Software without prior written +authorization of the copyright holder. + +SPDX-License-Identifier: Unicode-3.0 + +— + +Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. +ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. +``` + +### SHA-256 `f5e211eaa1c732f23cae866f00c7a0d9f458cbb6e37051170a3f7bb45c2e5d8e` + +Covered sources: + +- `wreq-js@3.2.0:repository-root/LICENSE` + +```text +MIT License + +Copyright (c) 2025 will-work-for-meal +Copyright (c) 2025 Oleksandr Herasymov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### SHA-256 `f6d3f84b39d597c19748c6b50a04abe1634edb3c0b15392daa217ec44119f652` + +Covered sources: + +- `moka@0.12.16:NOTICE` + +```text +Additional Notices for Moka + +The majority of the Moka library is dual-licensed under the MIT and Apache 2.0 +licenses. + +However, the following files are an exception and are licensed solely under +the Apache License 2.0: + +- src/common/frequency_sketch.rs +- src/common/timer_wheel.rs + +These files were ported from the Java Caffeine library and are not dual-licensed. + +Please refer to the LICENSE-APACHE file for more details on the Apache License 2.0. +``` + +### SHA-256 `fb77f0a9c53e473abe5103c8632ef9f0f2874d4fb3f17cb2d8c661aab9cee9d7` + +Covered sources: + +- `scopeguard@1.2.0:LICENSE-MIT` + +```text +Copyright (c) 2016-2019 Ulrik Sverdrup "bluss" and scopeguard developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +### SHA-256 `fdd55e2b2da854b0fbdc1e607df7c2ba1e1ebf91ecb77c515511ebeef972bc8f` + +Covered sources: + +- `tokio-tungstenite@0.29.0:LICENSE` + +```text +Copyright (c) 2017 Daniel Abramov +Copyright (c) 2017 Alexey Galakhov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` + +### SHA-256 `ff8f68cb076caf8cefe7a6430d4ac086ce6af2ca8ce2c4e5a2004d4552ef52a2` + +Covered sources: + +- `hashbrown@0.14.5:LICENSE-MIT` +- `hashbrown@0.16.1:LICENSE-MIT` +- `hashbrown@0.17.1:LICENSE-MIT` + +```text +Copyright (c) 2016 Amanieu d'Antras + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + + diff --git a/docs/guides/TROUBLESHOOTING.md b/docs/guides/TROUBLESHOOTING.md index e512afbfee..04303cf851 100644 --- a/docs/guides/TROUBLESHOOTING.md +++ b/docs/guides/TROUBLESHOOTING.md @@ -75,7 +75,9 @@ When you run `npm install -g omniroute`, you may see a wall of warnings like `np The warnings come from stale peer-dependency ranges in third-party packages OmniRoute doesn't control: 1. **`marked-terminal` wants `marked >=1 <16`, found `marked@18`** — works fine in practice; the upstream peer range is just stale. -2. **`deprecated prebuild-install@7.1.3`** — the native-binary fetch helper. Only relevant later if a web-cookie provider reports a missing `tls-client-node` native binary (a separate issue, not caused by this warning). +2. **`deprecated prebuild-install@7.1.3`** — a transitive native-binary fetch helper. It is not + used to install the pinned `wreq-js` transport binding and does not indicate that web-cookie + provider transport setup failed. **No action needed** — the warnings cannot be fully silenced without forking upstream packages. @@ -148,9 +150,9 @@ desktop app, for example: - `resources/app/.build/next/node_modules/playwright-/lib/…/agentParser.js` and `workerProcessEntry.js` — [Playwright](https://playwright.dev), the browser-automation library used for in-app provider login and browser-backed chat. -- `resources/app/.build/next/node_modules/tls-client-node-/bin/tls-client-windows-64-.dll` - — the native binary from `tls-client-node`, used for Cloudflare-tolerant HTTP on some web - providers. +- `resources/app/.build/next/node_modules/@wreq-js/binding-win32--msvc-/wreq-js.win32--msvc.node` + — the pinned `wreq-js` native binding used for browser-fingerprinted HTTP on web-cookie + providers (`` is `x64` or `arm64`). **Why it fires:** the Windows installer is **not yet code-signed**, so an unsigned NSIS installer has zero reputation and behavioral heuristics run at maximum aggression. Combined diff --git a/docs/reference/ENVIRONMENT.md b/docs/reference/ENVIRONMENT.md index 4763b279a2..f6f0abcbbc 100644 --- a/docs/reference/ENVIRONMENT.md +++ b/docs/reference/ENVIRONMENT.md @@ -764,15 +764,15 @@ REQUEST_TIMEOUT_MS (global override) | `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Timeout (ms) for the `validationRead` and `modelsProbe` presets in `src/shared/network/safeOutboundFetch.ts`. Raise for slow endpoints (Cerebras, Cloudflare AI, Groq) to prevent flapping between active/error in the dashboard. Falls back to 8000ms for invalid (<1000) or non-numeric values. | | `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Relay-specific fetch timeout in `open-sse/utils/proxyFetch.ts` (#9158). A hung relay must fail before the client/agent timeout (~30s) so callers see a relay-specific failure instead of a generic upstream timeout. Capped at `29000` so it always fires first. | | `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Shared retry backoff for the direct/relay/proxy retry-once paths in `open-sse/utils/proxyFetch.ts` (#9158). `0` = retry immediately. | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Wire-level timeout for the bogdanfinn/tls-client koffi binding (`claudeTlsClient.ts`). | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | JS-side grace added on top of the wire timeout when the native binding is wedged. | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Wire-level timeout for the bogdanfinn/tls-client koffi binding (`perplexityTlsClient.ts`). | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | JS-side grace added on top of the wire timeout when the native binding is wedged. | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Native wreq-js request timeout (`claudeTlsClient.ts`). | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Absolute JS hard-deadline grace added on top of the native timeout. | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Native wreq-js request timeout (`perplexityTlsClient.ts`). | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Absolute JS hard-deadline grace added on top of the native timeout. | | `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (off) | Appends "You have built-in web search. Answer questions directly using search results." to the caller's system message (`perplexity-web/protocol.ts`). Off by default — Perplexity searches anyway, and the sentence leaks into replies as meta-commentary for coding clients. Set `1`/`true`/`yes`/`on` to restore. | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Wire-level timeout for the bogdanfinn/tls-client koffi binding (`grokTlsClient.ts`). | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | JS-side grace added on top of the wire timeout when the native binding is wedged. | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Wire-level timeout for the bogdanfinn/tls-client koffi binding (`notionTlsClient.ts`); the `notion-web` executor raises it per-request to `180000` for long generations. | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | JS-side grace added on top of the wire timeout when the native binding is wedged. | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Native wreq-js request timeout (`grokTlsClient.ts`). | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Absolute JS hard-deadline grace added on top of the native timeout. | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Native wreq-js request timeout (`notionTlsClient.ts`); `notion-web` raises it per request to `180000` for long generations. | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Absolute JS hard-deadline grace added on top of the native timeout. | | `OMNIROUTE_BROWSER_POOL` | `on` | Shared Playwright browser pool for browser-backed web-cookie chat (`browserPool.ts`); set `off` to disable. | | `WEB_COOKIE_USE_BROWSER` | `0` | Opt a web-cookie chat request into the browser-backed path (`browserBackedChat.ts`); `1` to enable. | | `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Base URL for the Kimi Web (international kimi.ai Connect-RPC) executor (`kimi-web.ts`); override only for mirror/proxy endpoints. | diff --git a/docs/security/STEALTH_GUIDE.md b/docs/security/STEALTH_GUIDE.md index 4181ea7e14..456a558b0c 100644 --- a/docs/security/STEALTH_GUIDE.md +++ b/docs/security/STEALTH_GUIDE.md @@ -1,13 +1,13 @@ --- title: "Stealth Guide" -version: 3.8.40 -lastUpdated: 2026-06-28 +version: 3.8.51 +lastUpdated: 2026-09-02 --- # Stealth Guide -> **Source of truth:** `open-sse/utils/tlsClient.ts`, `open-sse/services/{claudeCodeCCH,claudeCodeFingerprint,claudeCodeObfuscation,claudeCodeCompatible}.ts`, `open-sse/config/cliFingerprints.ts`, `src/mitm/` -> **Last updated:** 2026-06-28 — v3.8.40 +> **Source of truth:** `open-sse/utils/tlsClient.ts`, `open-sse/services/{tlsClientBase,claudeTlsClient,perplexityTlsClient,grokTlsClient,notionTlsClient,lmarenaTlsClient,claudeCodeCCH,claudeCodeFingerprint,claudeCodeObfuscation,claudeCodeCompatible}.ts`, `open-sse/config/cliFingerprints.ts`, `src/mitm/` +> **Last updated:** 2026-09-02 — v3.8.51 > **Audience:** Engineers maintaining provider-specific stealth integrations. OmniRoute integrates with providers whose edges actively fingerprint non-official clients (TLS JA3/JA4, header ordering, JSON body shape, integrity tokens). This page documents the stealth surfaces OmniRoute exposes and where they are implemented. @@ -22,13 +22,56 @@ Stealth features exist so OmniRoute can act as a compatibility layer between use ### `open-sse/utils/tlsClient.ts` — wreq-js (Chrome 124) -Lazy-loaded `wreq-js` session that impersonates **Chrome 124 on macOS**. Used as a generic JA3/JA4 wrapper for upstreams behind Cloudflare. Falls back to native fetch when `wreq-js` is not installed (`available = false`). +Persistent `wreq-js` sessions are created lazily per account scope and resolved proxy. The +process-wide `TlsClient` pools at most 128 sessions that impersonate **Chrome 124 on macOS** for +upstreams behind Cloudflare. `TlsClient.fetch()` fails closed when the native runtime is +unavailable; a caller may explicitly select a fallback outside this wrapper. -- Singleton session: `browser: "chrome_124", os: "macos"` +- Session profile: `browser: "chrome_124", os: "macos"` - Proxy resolution (priority): `HTTPS_PROXY` → `HTTP_PROXY` → `ALL_PROXY` (also lower-case) - Timeout: `TLS_CLIENT_TIMEOUT_MS` (inherits from `FETCH_TIMEOUT_MS`, default 600000) - `wreq-js` Response is fetch-compatible (`headers`, `text()`, `json()`, `clone()`, `body`). +### Web-cookie provider transport — wreq-js 3.2.0 + +`open-sse/services/tlsClientBase.ts` is the shared adapter for the five specialized +web-cookie transports below. Each thin provider wrapper selects a browser/OS profile. The adapter +uses the single wreq runtime loader and transport pool in `open-sse/utils/tlsClient.ts`, keyed by +profile + OS + resolved proxy, while every request uses `cookieMode: "ephemeral"`. Accounts and +requests therefore share transport-level connections, but never a wreq session or cookie jar. + +| Provider | Profile | Emulated OS | Stream EOF policy | +| ---------- | ------------- | ----------- | -------------------------------- | +| Claude | `chrome_146` | Linux | include `[DONE]` | +| Perplexity | `firefox_148` | macOS | include `event: end_of_stream` | +| Grok | `chrome_146` | Linux | exclude `[DONE]` | +| Notion | `chrome_146` | Windows | include `[DONE]` | +| LMArena | `chrome_146` | Windows | no sentinel; close on native EOF | + +- Streaming consumes the native response `ReadableStream` directly; no temp file or sidecar is + created. +- Up to 256 initial bytes are inspected before exposing a stream. SSE providers buffer non-SSE + errors; Grok/LMArena map Cloudflare challenges to `403` and HTML interstitials to `502`. +- The native request timeout remains wrapped by an absolute JS hard deadline. A hang invalidates + and closes only the affected profile/OS/proxy transport before the next request recreates it. +- Proxy resolution priority is per-call `proxyUrl` → request-scoped account/dashboard context → + `HTTPS_PROXY`/`HTTP_PROXY`/`ALL_PROXY` (including lowercase variants). Resolution errors fail + closed instead of leaking a direct connection. LMArena deliberately resolves against `arena.ai`. +- `byteResponse` returns a content-typed `data:` URL without UTF-8 corruption. +- Errors are `TlsClientUnavailableError` (package/addon unavailable), `TlsClientHangError` + (deadline exceeded), and `WreqTransportCapacityError` (the shared session-capacity error code) + when all 128 bounded profile/OS/proxy slots are active or closing. + +The generic `TlsClient` session above remains specialized for persistent browser-backed cookie +state. Both paths reuse one cached wreq module loader and process lifecycle hook; their pools remain +separate because their cookie lifetimes are intentionally different. + +The profiles are supported by the pinned package, but real WAF acceptance can change independently +of local contract tests. Validate fingerprint changes against an explicitly authorized live account +before claiming parity with an upstream browser. + +--- + ## Claude Code Stealth Bundle When `cliCompatMode` is on, OmniRoute reshapes outgoing Claude requests so they are indistinguishable from `claude-cli` traffic. Three modules collaborate: diff --git a/next.config.mjs b/next.config.mjs index c5b9899adb..f4d4622c90 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -349,9 +349,6 @@ const nextConfig = { "keytar", "wreq-js", "zod", - "tls-client-node", - "koffi", - "tough-cookie", "@ngrok/ngrok", "@huggingface/transformers", // The ESM entry imports tiktoken_bg.wasm as a module. Turbopack can compile diff --git a/open-sse/executors/grok-web.ts b/open-sse/executors/grok-web.ts index a99bc2590a..939a86903c 100644 --- a/open-sse/executors/grok-web.ts +++ b/open-sse/executors/grok-web.ts @@ -939,8 +939,8 @@ export class GrokWebExecutor extends BaseExecutor { // Fetch from Grok via TLS-impersonating client (#3180). // Grok sits behind Cloudflare Enterprise which rejects Node's native TLS - // fingerprint even with valid sso+sso-rw cookies. We use tls-client-node - // to send a Chrome-like handshake instead. + // fingerprint even with valid sso+sso-rw cookies. The pinned wreq-js + // transport sends a Chrome-like handshake instead. let tlsResult: TlsFetchResult; try { tlsResult = await tlsFetchGrok(GROK_CHAT_API, { diff --git a/open-sse/executors/lmarena.ts b/open-sse/executors/lmarena.ts index 42bcd9cf7e..8f2c06e670 100644 --- a/open-sse/executors/lmarena.ts +++ b/open-sse/executors/lmarena.ts @@ -2,8 +2,8 @@ * LMArenaExecutor — Arena (formerly LMArena) web-session provider. * * Routes requests through arena.ai create-evaluation with session cookies. - * Upstream sits behind Cloudflare; traffic goes through tls-client-node Chrome - * impersonation (see services/lmarenaTlsClient.ts). + * Upstream sits behind Cloudflare; traffic goes through wreq-js Chrome + * impersonation with isolated ephemeral cookies (see services/lmarenaTlsClient.ts). * * Helpers: open-sse/executors/lmarena/{cookie,models,stream,response}.ts */ @@ -174,7 +174,6 @@ export class LMArenaExecutor extends BaseExecutor { body: JSON.stringify(transformedBody), signal: ctx.signal, stream: ctx.stream, - streamEofSymbol: "__OMNIROUTE_LMARENA_EOF_NEVER__", }); const failed = mapFailedTlsResult({ diff --git a/open-sse/executors/lmarena/models.ts b/open-sse/executors/lmarena/models.ts index fbfe277809..fa8362e1c2 100644 --- a/open-sse/executors/lmarena/models.ts +++ b/open-sse/executors/lmarena/models.ts @@ -6,9 +6,9 @@ export const LMARENA_API_BASE = "https://arena.ai"; export const LMARENA_STREAM_URL = `${LMARENA_API_BASE}/nextjs-api/stream/create-evaluation`; /** * Current Chrome stable UA (header surface). - * TLS JA3 profile is separate: tls-client-node tops out at chrome_146 — see - * LMARENA_PROFILE in lmarenaTlsClient.ts. Headers track the live browser string; - * fingerprint stays at the newest native profile we can actually impersonate. + * TLS JA3/JA4 profile is separate: the provider-tested wreq-js profile is pinned + * to chrome_146 in lmarenaTlsClient.ts while headers track the live browser string. + * Treat that deliberate version skew as a WAF-sensitive compatibility surface. */ export const LMARENA_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36"; diff --git a/open-sse/executors/lmarena/response.ts b/open-sse/executors/lmarena/response.ts index acc86f915a..4bfc8cf59d 100644 --- a/open-sse/executors/lmarena/response.ts +++ b/open-sse/executors/lmarena/response.ts @@ -114,7 +114,7 @@ export function mapTlsUnavailable( return { response: errorResponse( 502, - `Arena TLS impersonation unavailable: ${error.message}. Install/repair tls-client-node native binary.`, + `Arena TLS impersonation unavailable: ${error.message}. Verify the wreq-js 3.2 native binding.`, "upstream_error", "TLS_CLIENT_UNAVAILABLE" ), diff --git a/open-sse/executors/notion-web.ts b/open-sse/executors/notion-web.ts index b53bd69669..a3a9270168 100644 --- a/open-sse/executors/notion-web.ts +++ b/open-sse/executors/notion-web.ts @@ -22,7 +22,7 @@ * chunk — safer than assuming unverified incremental-delta semantics. * * Auth: Cookie-based (token_v2 [+ optional space_id, notion_browser_id, user_id]) - * Method: Browser-TLS impersonation via tls-client-node (Chrome JA3). Plain + * Method: Browser-TLS impersonation via pinned wreq-js (Chrome JA3/JA4). Plain * Node/undici fetch is rejected by Notion's edge with in-band * `temporarily-unavailable` (HTTP 200, empty assistant text) — curl/Schannel * and Chrome work with the same cookie + body. See services/notionTlsClient.ts. @@ -60,10 +60,7 @@ import { messagesForNotionTranscript, type NotionAgentOptions, } from "../services/notionTranscriptBuilder.ts"; -import { - tlsFetchNotion, - TlsClientUnavailableError, -} from "../services/notionTlsClient.ts"; +import { tlsFetchNotion } from "../services/notionTlsClient.ts"; // Re-exported for unit tests that destructure `mod.` on this module. export { @@ -225,7 +222,6 @@ function extractUserIdFromCookie(cookie: string): string { return extractNotionUserIdFromCookie(cookie); } - /** * Notion's undocumented inference API does not return token usage. * Emit a cheap char-based estimate so clients don't see a constant @@ -236,9 +232,7 @@ export function estimateNotionUsage( messages: NotionMessage[] | undefined, content: string ): { prompt_tokens: number; completion_tokens: number; total_tokens: number; estimated: true } { - const promptText = (messages || []) - .map((m) => extractNotionMessageText(m?.content)) - .join("\n"); + const promptText = (messages || []).map((m) => extractNotionMessageText(m?.content)).join("\n"); // ~4 chars/token (English-ish); at least 1 when there is any text. const prompt_tokens = promptText ? Math.max(1, Math.ceil(promptText.length / 4)) : 0; const completion_tokens = content ? Math.max(1, Math.ceil(content.length / 4)) : 0; @@ -393,9 +387,8 @@ function buildNotionExecuteHeaders(opts: { const isCustom = Boolean(opts.agent?.workflowId); // Browser uses /agent/?wfv=chat for custom agents. const agentPathId = (opts.agent?.workflowId || "").replace(/-/g, ""); - const referer = isCustom && agentPathId - ? `${BASE_URL}/agent/${agentPathId}?wfv=chat` - : `${BASE_URL}/ai`; + const referer = + isCustom && agentPathId ? `${BASE_URL}/agent/${agentPathId}?wfv=chat` : `${BASE_URL}/ai`; const reqHeaders: Record = { "Content-Type": "application/json", "User-Agent": USER_AGENT, @@ -453,11 +446,8 @@ export function resolveNotionAgentOptions( "agent_id", ]) || ""; const pageFromPs = - readProviderSpecificString(ps, [ - "contextPageId", - "context_page_id", - "notionContextPageId", - ]) || ""; + readProviderSpecificString(ps, ["contextPageId", "context_page_id", "notionContextPageId"]) || + ""; const readCookie = (name: string): string => { const m = cookie.match(new RegExp(`(?:^|;\\s*)${name}=([^;]+)`, "i")); @@ -477,10 +467,7 @@ export function resolveNotionAgentOptions( readCookie("agent_id") ); const contextPageId = - pageFromPs || - readCookie("context_page_id") || - readCookie("notion_context_page_id") || - ""; + pageFromPs || readCookie("context_page_id") || readCookie("notion_context_page_id") || ""; return { workflowId: workflowId || undefined, @@ -510,44 +497,22 @@ async function sendNotionInferenceRequest(opts: { body: JSON.stringify(reqBody), signal: signal ?? undefined, // Inference can take a while (tool-autoload + LLM first token). - timeoutMs: - Number.parseInt(process.env.OMNIROUTE_NOTION_TLS_TIMEOUT_MS || "", 10) || 180_000, + timeoutMs: Number.parseInt(process.env.OMNIROUTE_NOTION_TLS_TIMEOUT_MS || "", 10) || 180_000, }); status = tlsRes.status; rawText = tlsRes.text ?? ""; } catch (err) { - if (err instanceof TlsClientUnavailableError) { - // Fall back to plain fetch only when the native TLS sidecar is missing — - // better a degraded path than a hard crash on platforms without the binary. - try { - const upstream = await fetch(NOTION_URL, { - method: "POST", - headers: reqHeaders, - body: JSON.stringify(reqBody), - signal: signal ?? undefined, - }); - status = upstream.status; - rawText = await upstream.text().catch(() => ""); - } catch (fallbackErr) { - return { - errorResult: makeErrorResult( - 502, - `Notion fetch failed: ${fallbackErr instanceof Error ? fallbackErr.message : "unknown error"}`, - reqBody, - NOTION_URL - ), - }; - } - } else { - return { - errorResult: makeErrorResult( - 502, - `Notion fetch failed: ${err instanceof Error ? err.message : "unknown error"}`, - reqBody, - NOTION_URL - ), - }; - } + // Fail closed: plain fetch would bypass the resolved proxy and Notion rejects + // undici's fingerprint anyway. A missing native binding is a packaging error, + // not permission to leak a direct request. + return { + errorResult: makeErrorResult( + 502, + `Notion fetch failed: ${err instanceof Error ? err.message : "unknown error"}`, + reqBody, + NOTION_URL + ), + }; } if (status === 401 || status === 403) { @@ -634,8 +599,7 @@ export class NotionWebExecutor extends BaseExecutor { const inboundHeaders = (input.clientHeaders as Record | null | undefined) ?? ((input as { headers?: Record }).headers as - | Record - | undefined); + Record | undefined); const clientThreadId = readClientThreadId(requestBody, inboundHeaders ?? undefined); // Namespace the thread cache PER CALLER (hash of the caller's cookie) AND by custom // agent, so (a) two users of the same Notion space never share a cached thread @@ -738,7 +702,10 @@ export class NotionWebExecutor extends BaseExecutor { // One automatic retry for transient Notion faults — same threadId, never create again if (isFailedAttempt(attempt) && attempt.retryable) { - const delayMs = process.env.NODE_ENV === "test" || process.env.VITEST ? 20 : 700 + Math.floor(Math.random() * 400); + const delayMs = + process.env.NODE_ENV === "test" || process.env.VITEST + ? 20 + : 700 + Math.floor(Math.random() * 400); await new Promise((r) => setTimeout(r, delayMs)); attempt = await runOnce({ createThread: false, threadId }); } diff --git a/open-sse/executors/perplexity-web.ts b/open-sse/executors/perplexity-web.ts index 51f774ea87..6d0dc6d859 100644 --- a/open-sse/executors/perplexity-web.ts +++ b/open-sse/executors/perplexity-web.ts @@ -501,7 +501,7 @@ export class PerplexityWebExecutor extends BaseExecutor { if (isCloudflareChallenge(response.text)) { errMsg = "Cloudflare blocked the request — Perplexity's edge rejected this server's TLS fingerprint " + - "(common on VPS/datacenter IPs). Ensure tls-client-node is installed with its native binary, " + + "(common on VPS/datacenter IPs). Verify the wreq-js 3.2 native binding, " + "or route perplexity-web through a residential proxy."; log?.error?.("PPLX-WEB", "Cloudflare challenge detected — TLS bypass failed"); } else { diff --git a/open-sse/services/__tests__/grokTlsClient.test.ts b/open-sse/services/__tests__/grokTlsClient.test.ts index 86e2efa99c..63a7f2af63 100644 --- a/open-sse/services/__tests__/grokTlsClient.test.ts +++ b/open-sse/services/__tests__/grokTlsClient.test.ts @@ -1,16 +1,17 @@ /** * Regression tests for the proxy-leak fix in grokTlsClient. * - * Bug context (#3180): tlsFetchGrok() built its native tls-client-node - * requestOptions without a `proxyUrl` field, so every grok-web call + * Bug context (#3180): tlsFetchGrok() built its native transport options + * without a `proxyUrl` field, so every grok-web call * egressed with the bare host IP regardless of the dashboard proxy config - * or HTTP_PROXY / HTTPS_PROXY env vars (the koffi-loaded Go binary does not - * consult Go's `http.ProxyFromEnvironment`). + * or HTTP_PROXY / HTTPS_PROXY env vars. Native browser transports require the + * resolved proxy to be passed explicitly. * * These tests pin the resolution-order contract: * 1. Per-call `options.proxyUrl` wins. - * 2. POSIX-standard HTTPS_PROXY / HTTP_PROXY / ALL_PROXY (and lowercase variants). - * 3. Otherwise undefined (no proxy). + * 2. Request-scoped dashboard/account proxy context. + * 3. POSIX-standard HTTPS_PROXY / HTTP_PROXY / ALL_PROXY (and lowercase variants). + * 4. Otherwise undefined (no proxy). * * They also pin that the resolved proxy is actually placed on the * requestOptions object handed to the native binding — the original bug diff --git a/open-sse/services/claudeTlsClient.ts b/open-sse/services/claudeTlsClient.ts index 4ab4746195..9fc19e957f 100644 --- a/open-sse/services/claudeTlsClient.ts +++ b/open-sse/services/claudeTlsClient.ts @@ -2,8 +2,8 @@ * Browser-TLS-impersonating HTTP client for claude.ai. * * Thin re-export over the shared `tlsClientBase.ts` factory - * (`createTlsClientModule`). All provider-agnostic logic (sidecar lifecycle, - * streaming tail-file, proxy resolution, error classes, SSE detection) lives + * (`createTlsClientModule`). All provider-agnostic logic (wreq-js transport + * pooling, direct streaming, proxy resolution, deadlines, SSE detection) lives * in the base module; this file supplies only Claude-specific config and * preserves the original public export surface. */ @@ -24,13 +24,13 @@ const HARD_TIMEOUT_GRACE_MS = export const tlsClientModule = createTlsClientModule({ providerName: "Claude", tlsProfile: `chrome_${CLAUDE_TLS_BROWSER_MAJOR_VERSION}`, + emulationOs: "linux", domain: "https://claude.ai", - tempDirPrefix: "cgpt-stream-", - tailFileVariant: "A", + streamEofPolicy: "include", responseValidation: "sse", exportCloudflareCheck: false, exposeStreamingForTesting: true, - // Claude waits indefinitely for the first SSE byte (original 2-arg waitForContent). + // Claude allows the native/hard request deadline to bound a slow first SSE byte. defaultTimeoutMs: DEFAULT_TIMEOUT_MS, hardTimeoutGraceMs: HARD_TIMEOUT_GRACE_MS, firstByteTimeoutMs: Number.POSITIVE_INFINITY, diff --git a/open-sse/services/claudeTurnstileSolver.ts b/open-sse/services/claudeTurnstileSolver.ts index a9164839a3..51505c20e8 100644 --- a/open-sse/services/claudeTurnstileSolver.ts +++ b/open-sse/services/claudeTurnstileSolver.ts @@ -7,7 +7,7 @@ * 3. Waits for Turnstile challenge to appear * 4. Waits for challenge to be solved (with retry) * 5. Extracts cf_clearance cookie - * 6. Returns fresh cookie for tls-client-node + * 6. Returns a fresh cookie for the isolated wreq-js request */ import type { Browser, Page } from "playwright"; diff --git a/open-sse/services/grokTlsClient.ts b/open-sse/services/grokTlsClient.ts index 00a952dd70..e37d2b170d 100644 --- a/open-sse/services/grokTlsClient.ts +++ b/open-sse/services/grokTlsClient.ts @@ -2,8 +2,8 @@ * Browser-TLS-impersonating HTTP client for grok.com. * * Thin re-export over the shared `tlsClientBase.ts` factory - * (`createTlsClientModule`). All provider-agnostic logic (sidecar lifecycle, - * streaming tail-file, proxy resolution, error classes, Cloudflare challenge + * (`createTlsClientModule`). All provider-agnostic logic (wreq-js transport + * pooling, direct streaming, proxy resolution, deadlines, Cloudflare challenge * detection) lives in the base module; this file supplies only Grok-specific * config and preserves the original public export surface. */ @@ -22,9 +22,9 @@ const HARD_TIMEOUT_GRACE_MS = export const tlsClientModule = createTlsClientModule({ providerName: "Grok", tlsProfile: "chrome_146", + emulationOs: "linux", domain: "https://grok.com", - tempDirPrefix: "grok-stream-", - tailFileVariant: "B1", + streamEofPolicy: "exclude", responseValidation: "cf", exportCloudflareCheck: true, defaultTimeoutMs: DEFAULT_TIMEOUT_MS, diff --git a/open-sse/services/lmarenaTlsClient.ts b/open-sse/services/lmarenaTlsClient.ts index 131acb550e..cc515d3218 100644 --- a/open-sse/services/lmarenaTlsClient.ts +++ b/open-sse/services/lmarenaTlsClient.ts @@ -2,8 +2,8 @@ * Browser-TLS-impersonating HTTP client for arena.ai. * * Thin re-export over the shared `tlsClientBase.ts` factory - * (`createTlsClientModule`). All provider-agnostic logic (sidecar lifecycle, - * streaming tail-file, proxy resolution, error classes, Cloudflare challenge + * (`createTlsClientModule`). All provider-agnostic logic (wreq-js transport + * pooling, direct streaming, proxy resolution, deadlines, Cloudflare challenge * detection) lives in the base module; this file supplies only LMArena-specific * config and preserves the original public export surface. */ @@ -20,11 +20,12 @@ const HARD_TIMEOUT_GRACE_MS = 10_000; export const tlsClientModule = createTlsClientModule({ providerName: "LMArena", tlsProfile: "chrome_146", + emulationOs: "windows", domain: "https://lmarena.ai", // LMArena's proxy resolution domain is hardcoded to arena.ai, not the config domain. proxyDomainOverride: "https://arena.ai", - tempDirPrefix: "LMArena-stream-", - tailFileVariant: "B2", + streamEofPolicy: "none", + streamEofSymbol: "", responseValidation: "cf", exportCloudflareCheck: true, defaultTimeoutMs: DEFAULT_TIMEOUT_MS, diff --git a/open-sse/services/notionTlsClient.ts b/open-sse/services/notionTlsClient.ts index 2dc56e5f35..6c2bd18b73 100644 --- a/open-sse/services/notionTlsClient.ts +++ b/open-sse/services/notionTlsClient.ts @@ -2,8 +2,8 @@ * Browser-TLS-impersonating HTTP client for app.notion.com. * * Thin re-export over the shared `tlsClientBase.ts` factory - * (`createTlsClientModule`). All provider-agnostic logic (sidecar lifecycle, - * streaming tail-file, proxy resolution, error classes, SSE detection, + * (`createTlsClientModule`). All provider-agnostic logic (wreq-js transport + * pooling, direct streaming, proxy resolution, deadlines, SSE detection, * Cloudflare challenge detection) lives in the base module; this file supplies * only Notion-specific config and preserves the original public export surface. */ @@ -22,9 +22,9 @@ const HARD_TIMEOUT_GRACE_MS = export const tlsClientModule = createTlsClientModule({ providerName: "Notion", tlsProfile: "chrome_146", + emulationOs: "windows", domain: "https://app.notion.com", - tempDirPrefix: "pplx-stream-", - tailFileVariant: "A", + streamEofPolicy: "include", responseValidation: "sse", exportCloudflareCheck: true, defaultTimeoutMs: DEFAULT_TIMEOUT_MS, diff --git a/open-sse/services/perplexityTlsClient.ts b/open-sse/services/perplexityTlsClient.ts index bc736476c3..c3c83c8b11 100644 --- a/open-sse/services/perplexityTlsClient.ts +++ b/open-sse/services/perplexityTlsClient.ts @@ -2,8 +2,8 @@ * Browser-TLS-impersonating HTTP client for www.perplexity.ai. * * Thin re-export over the shared `tlsClientBase.ts` factory - * (`createTlsClientModule`). All provider-agnostic logic (sidecar lifecycle, - * streaming tail-file, proxy resolution, error classes, SSE detection, + * (`createTlsClientModule`). All provider-agnostic logic (wreq-js transport + * pooling, direct streaming, proxy resolution, deadlines, SSE detection, * Cloudflare challenge detection) lives in the base module; this file supplies * only Perplexity-specific config and preserves the original public export * surface. @@ -23,9 +23,9 @@ const HARD_TIMEOUT_GRACE_MS = export const tlsClientModule = createTlsClientModule({ providerName: "Perplexity", tlsProfile: "firefox_148", + emulationOs: "macos", domain: "https://www.perplexity.ai", - tempDirPrefix: "pplx-stream-", - tailFileVariant: "A", + streamEofPolicy: "include", responseValidation: "sse", exportCloudflareCheck: true, defaultTimeoutMs: DEFAULT_TIMEOUT_MS, diff --git a/open-sse/services/tlsClientBase.ts b/open-sse/services/tlsClientBase.ts index 11249864f2..d2c92e0b97 100644 --- a/open-sse/services/tlsClientBase.ts +++ b/open-sse/services/tlsClientBase.ts @@ -1,50 +1,46 @@ /** - * Shared TLS client infrastructure — a factory-style base that consolidates - * 6 nearly-identical per-provider TLS client files into one source of truth. + * Shared browser-impersonating HTTP transport for five web-cookie provider wrappers. * - * Each provider file calls `createTlsClientModule(config)` to obtain its - * provider-specific `tlsFetch` and `__setTlsFetchOverrideForTesting` exports. + * Provider wrappers keep their existing `tlsFetch*` APIs while this module owns + * wreq-js loading, transport pooling, proxy selection, deadlines, byte responses, + * SSE/NDJSON validation, EOF handling, and cancellation. * - * TailFile variants: - * A — Uint8Array enqueue, includes EOF symbol, substring-based cleanup - * ChatGPT, Claude, Perplexity, Notion - * B1 — Buffer.from enqueue, excludes EOF symbol, inline drainRemaining loop - * Grok - * B2 — Buffer.from enqueue, excludes EOF symbol, extracted helpers - * LMArena - * - * Response validation: - * sse — checks `looksLikeSse(peek)`, falls back to buffered - * ChatGPT, Claude, Perplexity, Notion - * cf — checks `isCloudflareChallenge(peek)` → 403, HTML → 502 - * Grok, LMArena + * Every wreq request uses an ephemeral cookie scope. Transports are reused process-wide, + * bounded by an LRU pool, and keyed by browser profile, emulated OS, and resolved proxy; + * no cookie jar or session identifier is shared between calls. */ -// --------------------------------------------------------------------------- -// Node imports -// --------------------------------------------------------------------------- -import { tmpdir } from "node:os"; -import { randomUUID } from "node:crypto"; -import { join, dirname } from "node:path"; -import { open, unlink, rmdir, readFile, mkdtemp, stat } from "node:fs/promises"; - -// --------------------------------------------------------------------------- -// Proxy resolution — every provider file imports both of these -// --------------------------------------------------------------------------- import { resolveProxyForRequest } from "../utils/proxyFetch.ts"; +import { + createWreqTransportClient, + WreqRuntimeUnavailableError, + type WreqTransportRuntime, + type WreqTransportRuntimeLoader, +} from "../utils/tlsClient.ts"; import { resolveTlsClientProxyUrl } from "./tlsClientProxy.ts"; -import { buildNativeTlsClientOptions } from "./tlsClientDownloadDir.ts"; -// --------------------------------------------------------------------------- -// Types -// --------------------------------------------------------------------------- +type EmulationOs = "windows" | "macos" | "linux" | "android" | "ios"; + +export type IterableHeaders = Iterable<[string, string]> & { + getSetCookie?: () => string[]; +}; + +export interface ReadableBodyLike { + getReader: () => ReadableStreamDefaultReader; + cancel?: (reason?: unknown) => Promise; +} export interface TlsResponseLike { status: number; - headers: Record; - body: string; + headers: Record | IterableHeaders; + body: string | ReadableBodyLike | null; + text?: () => Promise; + bytes?: () => Promise; } +export type WreqRuntimeLike = WreqTransportRuntime; +export type WreqRuntimeLoader = WreqTransportRuntimeLoader; + export interface TlsFetchResult { status: number; headers: Headers; @@ -64,60 +60,41 @@ export interface TlsFetchOptions { proxyUrl?: string; } -// --------------------------------------------------------------------------- -// Factory config (one instance per provider stub) -// --------------------------------------------------------------------------- - export interface TlsClientConfig { /** Human-readable provider name for logs and error messages. */ providerName: string; - /** TLS profile identifier (e.g. "chrome_146") */ + /** Browser profile identifier, for example `chrome_146` or `firefox_148`. */ tlsProfile: string; - /** Default upstream domain for proxy resolution (e.g. "https://chatgpt.com") */ + /** Operating system paired with the browser profile. */ + emulationOs?: EmulationOs; + /** Default upstream domain used by proxy resolution. */ domain: string; - /** Temp directory prefix (e.g. "cgpt-stream-") */ - tempDirPrefix: string; - /** EOF symbol for streaming (default "[DONE]") */ + /** @deprecated wreq-js streams directly and ignores this compatibility field. */ + tempDirPrefix?: string; + /** Default EOF marker. An empty string disables marker filtering. */ streamEofSymbol?: string; - /** Default timeout in ms (default 60_000) */ + /** Native request timeout in milliseconds. */ defaultTimeoutMs?: number; - /** Hard timeout grace period in ms (default 10_000) */ + /** Additional JavaScript-side hard-timeout grace period. */ hardTimeoutGraceMs?: number; - /** First-byte timeout for waitForContent (default 5_000; ChatGPT uses 30_000) */ + /** Delay after which a late first byte is returned as a buffered response. */ firstByteTimeoutMs?: number; - /** - * TailFile variant: - * "A" — Uint8Array enqueue, includes EOF, substring cleanup - * "B1" — Buffer.from enqueue, excludes EOF, inline drainRemaining - * "B2" — Buffer.from enqueue, excludes EOF, extracted helpers - */ - tailFileVariant: "A" | "B1" | "B2"; - /** - * Response validation mode: - * "sse" — check looksLikeSse → fall back to buffered - * "cf" — check isCloudflareChallenge → 403, HTML → 502, else stream - */ + /** How a detected EOF marker is exposed; `none` disables marker filtering. */ + streamEofPolicy?: "include" | "exclude" | "none"; + /** @deprecated Compatibility alias: `A` includes EOF; `B1`/`B2` exclude it. */ + tailFileVariant?: "A" | "B1" | "B2"; + /** `sse` validates SSE prefixes; `cf` rejects Cloudflare/HTML responses. */ responseValidation: "sse" | "cf"; - /** - * Optional override for proxy resolution domain (e.g., LMArena uses - * "https://arena.ai" hardcoded instead of the config domain). - */ + /** Optional proxy-resolution domain override (LMArena uses arena.ai). */ proxyDomainOverride?: string; - /** - * Whether to export `isCloudflareChallenge` from the provider stub. - * Grok, LMArena, Perplexity, Notion all export it. - */ + /** Whether the provider module exposes the Cloudflare detection helper. */ exportCloudflareCheck: boolean; - /** - * Whether to expose `__tlsFetchStreamingForTesting` (ChatGPT only). - */ + /** Whether to expose the direct-stream dependency-injection seam. */ exposeStreamingForTesting?: boolean; + /** External-runtime seam used by focused tests; production loads wreq-js lazily. */ + wreqRuntimeLoader?: WreqRuntimeLoader; } -// --------------------------------------------------------------------------- -// Error classes -// --------------------------------------------------------------------------- - export class TlsClientUnavailableError extends Error { override name = "TlsClientUnavailableError"; } @@ -126,28 +103,93 @@ export class TlsClientHangError extends Error { override name = "TlsClientHangError"; } -// --------------------------------------------------------------------------- -// Shared helpers (identical across all 6 providers) -// --------------------------------------------------------------------------- - -export function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); -} - export function makeAbortError(signal: AbortSignal): Error { const reason = signal.reason; if (reason instanceof Error) return reason; - const err = new Error(typeof reason === "string" ? reason : "The operation was aborted"); - err.name = "AbortError"; - return err; + const error = new Error(typeof reason === "string" ? reason : "The operation was aborted"); + error.name = "AbortError"; + return error; } -export function toHeaders(raw: Record | null | undefined): Headers { - const h = new Headers(); - for (const [k, vs] of Object.entries(raw || {})) { - for (const v of vs) h.append(k, v); +export function toHeaders( + raw: Record | IterableHeaders | null | undefined +): Headers { + const headers = new Headers(); + if (!raw) return headers; + + const iterator = (raw as Partial)[Symbol.iterator]; + if (typeof iterator === "function") { + const iterable = raw as IterableHeaders; + const setCookies = typeof iterable.getSetCookie === "function" ? iterable.getSetCookie() : []; + for (const [name, value] of iterable) { + if (name.toLowerCase() !== "set-cookie" || setCookies.length === 0) { + headers.append(name, value); + } + } + for (const value of setCookies) headers.append("set-cookie", value); + return headers; } - return h; + + for (const [name, values] of Object.entries(raw)) { + for (const value of values) headers.append(name, value); + } + return headers; +} + +function isReadableBody(body: TlsResponseLike["body"]): body is ReadableBodyLike { + return body !== null && typeof body !== "string" && typeof body.getReader === "function"; +} + +function concatChunks(chunks: Uint8Array[]): Uint8Array { + const length = chunks.reduce((total, chunk) => total + chunk.byteLength, 0); + const combined = new Uint8Array(length); + let offset = 0; + for (const chunk of chunks) { + combined.set(chunk, offset); + offset += chunk.byteLength; + } + return combined; +} + +async function readAllChunks( + reader: ReadableStreamDefaultReader, + initialChunks: Uint8Array[] = [], + readNext: () => Promise> = () => reader.read() +): Promise { + const chunks = [...initialChunks]; + while (true) { + const next = await readNext(); + if (next.done) return concatChunks(chunks); + chunks.push(next.value); + } +} + +async function readTlsResponseText( + response: TlsResponseLike, + onReader?: (reader: ReadableStreamDefaultReader) => void +): Promise { + if (typeof response.body === "string") return response.body; + if (isReadableBody(response.body)) { + const reader = response.body.getReader(); + onReader?.(reader); + return new TextDecoder().decode(await readAllChunks(reader)); + } + if (typeof response.text === "function") return response.text(); + return ""; +} + +async function readTlsResponseBytes( + response: TlsResponseLike, + onReader?: (reader: ReadableStreamDefaultReader) => void +): Promise { + if (isReadableBody(response.body)) { + const reader = response.body.getReader(); + onReader?.(reader); + return readAllChunks(reader); + } + if (typeof response.bytes === "function") return response.bytes(); + if (typeof response.body === "string") return Buffer.from(response.body, "binary"); + return new Uint8Array(); } export async function raceWithTimeout( @@ -155,111 +197,42 @@ export async function raceWithTimeout( timeoutMs: number, signal: AbortSignal | null | undefined ): Promise { - // If no signal, just race with a simple timeout. - if (!signal) { - return await Promise.race([ - promise, - new Promise((_, reject) => { - setTimeout(() => reject(new TlsClientHangError()), timeoutMs); - }), - ]); - } - - // With signal, race against both timeout and abort. return await new Promise((resolve, reject) => { let settled = false; + let timer: ReturnType | undefined; - const done = (fn: () => void) => { - if (!settled) { - settled = true; - fn(); - } + const onAbort = (): void => { + settle(() => reject(makeAbortError(signal!))); + }; + const cleanup = (): void => { + if (timer) clearTimeout(timer); + signal?.removeEventListener("abort", onAbort); + }; + const settle = (complete: () => void): void => { + if (settled) return; + settled = true; + cleanup(); + complete(); }; - const timer = setTimeout(() => { - done(() => reject(new TlsClientHangError())); - }, timeoutMs); - - const onAbort = () => { - done(() => reject(makeAbortError(signal))); - }; - - if (signal.aborted) { + timer = setTimeout( + () => settle(() => reject(new TlsClientHangError())), + Math.max(0, timeoutMs) + ); + if (signal?.aborted) { onAbort(); } else { - signal.addEventListener("abort", onAbort, { once: true }); + signal?.addEventListener("abort", onAbort, { once: true }); } promise.then( - (v) => { - done(() => { - clearTimeout(timer); - signal.removeEventListener("abort", onAbort); - resolve(v); - }); - }, - (e) => { - done(() => { - clearTimeout(timer); - signal.removeEventListener("abort", onAbort); - reject(e); - }); - } + (value) => settle(() => resolve(value)), + (error) => settle(() => reject(error)) ); }); } -/** Read up to N bytes from a file, returning the utf-8 decoded text. */ -export async function readFirstBytes(path: string, n: number): Promise { - const fd = await open(path, "r"); - try { - const buf = Buffer.alloc(n); - const { bytesRead } = await fd.read(buf, 0, n, 0); - return buf.subarray(0, bytesRead).toString("utf8"); - } finally { - await fd.close().catch(() => {}); - } -} - -/** - * Wait for the streaming output file to exist AND contain at least one byte. - * Returns false if the request settles before any bytes arrive (so the caller - * can drain `requestPromise` and surface the real upstream status). Returns - * true as soon as the file has data. - */ -export async function waitForContent( - path: string, - timeoutMs: number, - requestPromise: Promise -): Promise { - let requestSettled = false; - requestPromise.then( - () => { - requestSettled = true; - }, - () => { - requestSettled = true; - } - ); - const start = Date.now(); - while (Date.now() - start < timeoutMs) { - try { - const s = await stat(path); - if (s.size > 0) return true; - } catch { - // file doesn't exist yet - } - if (requestSettled) return false; - await sleep(25); - } - return false; -} - -/** - * Returns true if the peeked response body looks like an SSE stream — i.e., - * begins (after any leading whitespace) with one of the SSE field markers - * (`data:`, `event:`, `id:`, `retry:`) or a comment line (`:`). - */ +/** Return true when a prefix begins with an SSE field or comment marker. */ export function looksLikeSse(text: string): boolean { const trimmed = text.replace(/^[\s\r\n]+/, ""); if (!trimmed) return false; @@ -267,9 +240,7 @@ export function looksLikeSse(text: string): boolean { return /^(data|event|id|retry):/i.test(trimmed); } -/** - * Returns true if the response body is a Cloudflare challenge/interstitial page. - */ +/** Return true when a response prefix is a Cloudflare challenge/interstitial. */ export function isCloudflareChallenge(text: string | null | undefined): boolean { if (!text) return false; return /just a moment|window\._cf_chl_opt|challenges\.cloudflare\.com|attention required|cf-chl/i.test( @@ -277,430 +248,273 @@ export function isCloudflareChallenge(text: string | null | undefined): boolean ); } -// --------------------------------------------------------------------------- -// Temp-path cleanup — two variants -// --------------------------------------------------------------------------- - -/** Variant A: substring-based parent dir extraction (ChatGPT, Claude, Perplexity, Notion) */ -async function cleanupTempPathSubstring(path: string): Promise { - await unlink(path).catch(() => {}); - const dir = path.substring(0, path.lastIndexOf("/")); - await rmdir(dir).catch(() => {}); +function couldBecomeSsePrefix(text: string): boolean { + const trimmed = text.replace(/^[\s\r\n]+/, "").toLowerCase(); + return ["data:", "event:", "id:", "retry:", ":"].some((marker) => marker.startsWith(trimmed)); } -/** Variant B: dirname-based parent dir extraction (Grok, LMArena) */ -async function cleanupTempPathDirname(path: string): Promise { - await unlink(path).catch(() => {}); - await rmdir(dirname(path)).catch(() => {}); +function couldBecomeCloudflareChallenge(text: string): boolean { + const trimmed = text.trimStart().toLowerCase(); + return [ + "just a moment", + "window._cf_chl_opt", + "challenges.cloudflare.com", + "attention required", + "cf-chl", + ].some((marker) => marker.startsWith(trimmed)); } -async function readTextFileIfExists(path: string): Promise { - try { - return await readFile(path, "utf8"); - } catch { - return ""; - } +type EofControlCandidate = "possible" | "matched" | "not-control"; + +function classifyEofControlCandidate(bytes: number[], eofSymbol: string): EofControlCandidate { + const decoded = new TextDecoder().decode(Uint8Array.from(bytes), { stream: true }); + const candidate = decoded.replace(/^[\t\r ]+/, ""); + if (candidate.startsWith(eofSymbol)) return "matched"; + if (eofSymbol.startsWith(candidate)) return "possible"; + + const dataPrefix = "data:"; + const lowerCandidate = candidate.toLowerCase(); + if (dataPrefix.startsWith(lowerCandidate)) return "possible"; + if (!lowerCandidate.startsWith(dataPrefix)) return "not-control"; + + const dataValue = candidate.slice(dataPrefix.length).replace(/^[\t ]+/, ""); + if (dataValue.startsWith(eofSymbol)) return "matched"; + return eofSymbol.startsWith(dataValue) ? "possible" : "not-control"; } -// --------------------------------------------------------------------------- -// TailFile — Variant A -// Uint8Array enqueue, includes EOF symbol, substring cleanup -// Used by: ChatGPT, Claude, Perplexity, Notion -// --------------------------------------------------------------------------- - -function tailFileVariantA( - path: string, +function createEofFilteredStream( + reader: ReadableStreamDefaultReader, + initialChunks: Uint8Array[], eofSymbol: string, - done: Promise, - signal: AbortSignal | null = null, - cleanupPath: string + includeEof: boolean, + readNext: () => Promise>, + onReadError: (error: unknown) => void, + onFinalize: () => void, + signal: AbortSignal | null, + hardDeadlineAt: number ): ReadableStream { + const queued = [...initialChunks]; + const eofBytes = new TextEncoder().encode(eofSymbol); + let controlCandidate: number[] = []; + let atLineStart = true; + let closed = false; + let deadlineTimer: ReturnType | undefined; + let removeAbortListener = (): void => {}; + let lifecycleCleaned = false; + + const cleanupLifecycle = (): void => { + if (lifecycleCleaned) return; + lifecycleCleaned = true; + if (deadlineTimer) clearTimeout(deadlineTimer); + deadlineTimer = undefined; + removeAbortListener(); + removeAbortListener = (): void => {}; + onFinalize(); + }; + + const cancelNativeReader = async (reason: unknown): Promise => { + try { + await reader.cancel(reason); + } catch { + // Native cancellation is best-effort cleanup; preserve the authoritative stream error. + } + }; + + const errorStream = ( + controller: ReadableStreamDefaultController, + error: Error, + notifyReadError: boolean + ): void => { + if (closed) return; + closed = true; + controlCandidate = []; + cleanupLifecycle(); + if (notifyReadError) onReadError(error); + void cancelNativeReader(error); + try { + controller.error(error); + } catch { + // The consumer may have closed the stream concurrently. + } + }; + return new ReadableStream({ - async start(controller) { - const fd = await open(path, "r"); - const buf = Buffer.alloc(64 * 1024); - let offset = 0; - let finished = false; - let aborted = false; - let upstreamError: Error | null = null; - - done.then( - () => { - finished = true; - }, - (err) => { - upstreamError = err instanceof Error ? err : new Error(String(err)); - finished = true; - } - ); - - const onAbort = () => { - aborted = true; - }; + start(controller) { if (signal) { - if (signal.aborted) aborted = true; - else signal.addEventListener("abort", onAbort, { once: true }); + const onAbort = (): void => errorStream(controller, makeAbortError(signal), false); + if (signal.aborted) { + onAbort(); + return; + } + signal.addEventListener("abort", onAbort, { once: true }); + removeAbortListener = (): void => signal.removeEventListener("abort", onAbort); } - let errored = false; - try { - while (!aborted) { - const { bytesRead } = await fd.read(buf, 0, buf.length, offset); - if (bytesRead > 0) { - const chunk = buf.subarray(0, bytesRead); - offset += bytesRead; - const text = chunk.toString("utf8"); - if (text.includes(eofSymbol)) { - const cutAt = text.indexOf(eofSymbol) + eofSymbol.length; - controller.enqueue(new Uint8Array(chunk.subarray(0, cutAt))); - break; - } - controller.enqueue(new Uint8Array(chunk)); - } else if (finished) { - if (upstreamError) { - controller.error(upstreamError); - errored = true; - } - break; - } else { - await sleep(25); - } - } - } catch (err) { - controller.error(err); - errored = true; - } finally { - if (signal) signal.removeEventListener("abort", onAbort); - await fd.close().catch(() => {}); - await cleanupTempPathSubstring(cleanupPath); - if (!errored) controller.close(); + if (Number.isFinite(hardDeadlineAt)) { + deadlineTimer = setTimeout( + () => { + errorStream(controller, new TlsClientHangError(), true); + }, + Math.max(0, hardDeadlineAt - Date.now()) + ); + deadlineTimer.unref?.(); } }, - }); -} - -// --------------------------------------------------------------------------- -// TailFile — Variant B1 -// Buffer.from enqueue, excludes EOF symbol, inline drainRemaining loop -// Used by: Grok -// --------------------------------------------------------------------------- - -function tailFileVariantB1( - path: string, - eofSymbol: string, - done: Promise, - signal: AbortSignal | null = null, - cleanupPath: string -): ReadableStream { - return new ReadableStream({ - async start(controller) { - const fd = await open(path, "r"); - const buf = Buffer.alloc(64 * 1024); - let offset = 0; - let finished = false; - let aborted = false; - let upstreamError: Error | null = null; - - done.then( - () => { - finished = true; - }, - (err) => { - upstreamError = err instanceof Error ? err : new Error(String(err)); - finished = true; - } - ); - - const onAbort = () => { - aborted = true; - }; - if (signal) { - if (signal.aborted) aborted = true; - else signal.addEventListener("abort", onAbort, { once: true }); - } - - let errored = false; - try { - while (!aborted) { - const { bytesRead } = await fd.read(buf, 0, buf.length, offset); - if (bytesRead > 0) { - const chunk = buf.subarray(0, bytesRead); - offset += bytesRead; - const text = chunk.toString("utf8"); - - if (text.includes(eofSymbol)) { - const beforeEof = text.substring(0, text.indexOf(eofSymbol)); - if (beforeEof) { - controller.enqueue(Buffer.from(beforeEof, "utf8")); - } - controller.close(); - return; - } - - controller.enqueue(Buffer.from(chunk)); + async pull(controller) { + while (!closed) { + let chunk = queued.shift(); + if (!chunk) { + let next: ReadableStreamReadResult; + try { + next = await readNext(); + } catch (error) { + if (closed) return; + closed = true; + cleanupLifecycle(); + onReadError(error); + await cancelNativeReader(error); + controller.error(error); + return; } - - if (finished) { - // Request finished — drain any remaining bytes then close. - while (true) { - const { bytesRead } = await fd.read(buf, 0, buf.length, offset); - if (bytesRead === 0) break; - const chunk = buf.subarray(0, bytesRead); - offset += bytesRead; - const text = chunk.toString("utf8"); - - if (text.includes(eofSymbol)) { - const beforeEof = text.substring(0, text.indexOf(eofSymbol)); - if (beforeEof) { - controller.enqueue(Buffer.from(beforeEof, "utf8")); - } - controller.close(); - return; - } - - controller.enqueue(Buffer.from(chunk)); + if (closed) return; + if (next.done) { + if (controlCandidate.length > 0) { + controller.enqueue(Uint8Array.from(controlCandidate)); } - - if (upstreamError && !errored) { - errored = true; - controller.error(upstreamError); - return; - } - + controlCandidate = []; + closed = true; + cleanupLifecycle(); controller.close(); return; } - - await sleep(25); + chunk = next.value; } - } catch (err) { - if (!errored) { - errored = true; - controller.error(err instanceof Error ? err : new Error(String(err))); + + if (eofBytes.byteLength === 0) { + controller.enqueue(chunk); + return; } - } finally { - await fd.close().catch(() => {}); - await cleanupTempPathDirname(cleanupPath); - if (signal) signal.removeEventListener("abort", onAbort); - } - }, - }); -} -// --------------------------------------------------------------------------- -// TailFile — Variant B2 -// Buffer.from enqueue, excludes EOF symbol, extracted helpers -// Used by: LMArena -// --------------------------------------------------------------------------- - -type FileHandle = Awaited>; - -function enqueueChunkMaybeEof( - controller: ReadableStreamDefaultController, - chunk: Buffer, - eofSymbol: string -): boolean { - const text = chunk.toString("utf8"); - if (!text.includes(eofSymbol)) { - controller.enqueue(Buffer.from(chunk)); - return false; - } - const beforeEof = text.substring(0, text.indexOf(eofSymbol)); - if (beforeEof) controller.enqueue(Buffer.from(beforeEof, "utf8")); - controller.close(); - return true; -} - -async function drainRemaining( - fd: FileHandle, - buf: Buffer, - offsetRef: { offset: number }, - controller: ReadableStreamDefaultController, - eofSymbol: string -): Promise<"closed" | "drained"> { - while (true) { - const { bytesRead } = await fd.read(buf, 0, buf.length, offsetRef.offset); - if (bytesRead === 0) return "drained"; - const chunk = buf.subarray(0, bytesRead); - offsetRef.offset += bytesRead; - if (enqueueChunkMaybeEof(controller, chunk, eofSymbol)) return "closed"; - } -} - -function tailFileVariantB2( - path: string, - eofSymbol: string, - done: Promise, - signal: AbortSignal | null = null, - cleanupPath: string -): ReadableStream { - return new ReadableStream({ - async start(controller) { - const fd = await open(path, "r"); - const buf = Buffer.alloc(64 * 1024); - const offsetRef = { offset: 0 }; - let finished = false; - let aborted = false; - let upstreamError: Error | null = null; - let errored = false; - - done.then( - () => { - finished = true; - }, - (err) => { - upstreamError = err instanceof Error ? err : new Error(String(err)); - finished = true; - } - ); - - const onAbort = () => { - aborted = true; - }; - if (signal) { - if (signal.aborted) aborted = true; - else signal.addEventListener("abort", onAbort, { once: true }); - } - - try { - while (!aborted) { - const { bytesRead } = await fd.read(buf, 0, buf.length, offsetRef.offset); - if (bytesRead > 0) { - const chunk = buf.subarray(0, bytesRead); - offsetRef.offset += bytesRead; - if (enqueueChunkMaybeEof(controller, chunk, eofSymbol)) return; - } - - if (!finished) { - await sleep(25); + const output: number[] = []; + let eofReached = false; + for (const byte of chunk) { + if (!atLineStart) { + output.push(byte); + if (byte === 0x0a || byte === 0x0d) atLineStart = true; continue; } - const drained = await drainRemaining(fd, buf, offsetRef, controller, eofSymbol); - if (drained === "closed") return; - if (upstreamError && !errored) { - errored = true; - controller.error(upstreamError); - return; + if (byte === 0x0a || byte === 0x0d) { + for (const candidateByte of controlCandidate) output.push(candidateByte); + controlCandidate = []; + output.push(byte); + continue; } + + controlCandidate.push(byte); + const classification = classifyEofControlCandidate(controlCandidate, eofSymbol); + if (classification === "matched") { + if (includeEof) { + for (const candidateByte of controlCandidate) output.push(candidateByte); + } + controlCandidate = []; + eofReached = true; + break; + } + if (classification === "not-control") { + for (const candidateByte of controlCandidate) output.push(candidateByte); + controlCandidate = []; + atLineStart = false; + } + } + + if (eofReached) { + if (output.length > 0) controller.enqueue(Uint8Array.from(output)); + closed = true; + cleanupLifecycle(); + await cancelNativeReader("TLS stream EOF reached"); controller.close(); return; } - } catch (err) { - if (!errored) { - errored = true; - controller.error(err instanceof Error ? err : new Error(String(err))); + + if (output.length > 0) { + controller.enqueue(Uint8Array.from(output)); + return; } - } finally { - await fd.close().catch(() => {}); - await cleanupTempPathDirname(cleanupPath); - if (signal) signal.removeEventListener("abort", onAbort); } }, + async cancel(reason) { + closed = true; + controlCandidate = []; + cleanupLifecycle(); + await cancelNativeReader(reason); + }, }); } -// --------------------------------------------------------------------------- -// Client lifecycle — TLS client singleton per provider -// --------------------------------------------------------------------------- +export type TlsRequestPromise = Promise & { + invalidateTransport?: () => void; + releaseTransport?: () => void; +}; -/** - * Create a getClient function for a provider stub. - * Uses dynamic `import("tls-client-node")` with `{ runtimeMode: "native" }` - * and `client.start()`, matching the original per-provider lifecycle. - */ +export interface TlsRequestClient { + request: (url: string, options: Record) => TlsRequestPromise; + invalidateTransport?: (options: Record) => void; +} + +/** Create a provider facade over the shared ephemeral-cookie wreq transport pool. */ export function createGetClient(config: { providerName: string; tlsProfile?: string; -}): () => Promise<{ - request: (url: string, opts: Record) => Promise; -}> { - let clientPromise: Promise<{ - request: (url: string, opts: Record) => Promise; - }> | null = null; - let exitHookInstalled = false; + emulationOs?: EmulationOs; + wreqRuntimeLoader?: WreqRuntimeLoader; +}): () => Promise { + const browser = config.tlsProfile ?? "chrome_146"; + const os = config.emulationOs ?? "macos"; + const wreqClient = createWreqTransportClient({ + browser, + os, + runtimeLoader: config.wreqRuntimeLoader, + }); - const installExitHook = (client: { stop: () => Promise }): void => { - if (!exitHookInstalled) { - exitHookInstalled = true; - process.on("exit", () => { - void client.stop(); + const client: TlsRequestClient = { + request(url, options) { + const wreqRequest = wreqClient.request(url, options); + const adapted = wreqRequest.catch((error: unknown) => { + if (!(error instanceof WreqRuntimeUnavailableError)) throw error; + throw new TlsClientUnavailableError( + `wreq-js 3.2.x is not installed or unsupported on this platform — ` + + `cannot start browser transport for ${config.providerName}` + ); + }) as TlsRequestPromise; + Object.defineProperties(adapted, { + invalidateTransport: { + value: () => wreqRequest.invalidateTransport(), + }, + releaseTransport: { + value: () => wreqRequest.releaseTransport(), + }, }); - } + return adapted; + }, }; - return async function getClient(): Promise<{ - request: (url: string, opts: Record) => Promise; - }> { - if (!clientPromise) { - clientPromise = (async () => { - let TLSClientCtor: { - new (config: Record): { - start: () => Promise; - request: (url: string, opts: Record) => Promise; - stop: () => Promise; - }; - }; - try { - // tls-client-node uses a native binary loaded at runtime. - // The dynamic import delays the binary load until first use — no - // point crashing startup on machines where it's not installed. - const mod = await import("tls-client-node"); - TLSClientCtor = mod.TLSClient; - } catch { - throw new TlsClientUnavailableError( - `tls-client-node is not installed — cannot start TLS client for ${config.providerName}` - ); - } - const tlsOptions: Record = { - ...buildNativeTlsClientOptions(), - }; - if (config.tlsProfile) { - tlsOptions.clientIdentifier = config.tlsProfile; - } - const client = new TLSClientCtor(tlsOptions); - // Start the native TLS client binding - await client.start(); - installExitHook(client); - - return client; - })(); - } - return clientPromise; - }; + return async () => client; } -/** - * Resolve the proxy URL for a tls-client request. Per-call value wins; - * falls back to the provider-specific env var and the dashboard proxy config. - */ +/** Resolve a per-call/provider/dashboard proxy for a browser-transport request. */ export function resolveProxyUrl(domain: string, perCall: string | undefined): string | undefined { return resolveTlsClientProxyUrl(domain, perCall, resolveProxyForRequest); } -// --------------------------------------------------------------------------- -// Factory — creates provider-specific tlsFetch + helpers -// --------------------------------------------------------------------------- - -const CLEANUP_VARIANTS = { - A: cleanupTempPathSubstring, - B: cleanupTempPathDirname, -} as const; - -const TAIL_FILE_VARIANTS = { - A: tailFileVariantA, - B1: tailFileVariantB1, - B2: tailFileVariantB2, -} as const; - export interface TlsClientModule { - tlsFetch: (url: string, options: TlsFetchOptions) => Promise; + tlsFetch: (url: string, options?: TlsFetchOptions) => Promise; __setTlsFetchOverrideForTesting: ( fn: ((url: string, options: TlsFetchOptions) => Promise) | null ) => void; isCloudflareChallenge?: (text: string | null | undefined) => boolean; __tlsFetchStreamingForTesting?: ( - client: { request: (url: string, opts: Record) => Promise }, + client: TlsRequestClient, url: string, requestOptions: Record, eofSymbol?: string, @@ -710,57 +524,62 @@ export interface TlsClientModule { ) => Promise; } -/** - * Create a provider-specific TLS client module. - * - * Each provider file calls this once at module level and re-exports - * the returned `tlsFetch` (as e.g. `tlsFetchChatGpt`) and - * `__setTlsFetchOverrideForTesting`. - */ +/** Build one provider-specific facade over the shared wreq-js transport. */ export function createTlsClientModule(config: TlsClientConfig): TlsClientModule { const { providerName, tlsProfile, + emulationOs = "macos", domain, - tempDirPrefix, streamEofSymbol = "[DONE]", defaultTimeoutMs = 60_000, hardTimeoutGraceMs = 10_000, firstByteTimeoutMs = 5_000, - tailFileVariant, responseValidation, proxyDomainOverride, exportCloudflareCheck, + wreqRuntimeLoader, } = config; + const streamEofPolicy = + config.streamEofPolicy ?? (config.tailFileVariant === "A" ? "include" : "exclude"); - const getClient = createGetClient({ providerName, tlsProfile }); - - function resetClientCache(): void { - // The getClient closure holds clientPromise — by design the only - // reference is inside getClient's closure. After a hang we need - // the next call to spawn a fresh binding. We achieve this by - // clearing the local reference; the module-level tlsFetch will - // re-read via getClient which recreates it. - // Since getClient's clientPromise is a closure variable, we - // re-create getClient itself: - Object.assign(localState, { - getClient: createGetClient({ providerName, tlsProfile }), - }); - // Note: this is safe because only tlsFetch calls getClient. - // A concurrent in-flight call holds its own reference. - } - - const localState: { getClient: typeof getClient } = { getClient }; - + const getClient = createGetClient({ + providerName, + tlsProfile, + emulationOs, + wreqRuntimeLoader, + }); let testOverride: ((url: string, options: TlsFetchOptions) => Promise) | null = null; - const tailFileFn = TAIL_FILE_VARIANTS[tailFileVariant]; + const invalidateOnHang = ( + client: TlsRequestClient, + requestOptions: Record, + error: unknown, + request?: TlsRequestPromise | null + ): void => { + if (!(error instanceof TlsClientHangError)) return; + if (request?.invalidateTransport) request.invalidateTransport(); + else client.invalidateTransport?.(requestOptions); + }; - const cleanupFn = tailFileVariant === "A" ? cleanupTempPathSubstring : cleanupTempPathDirname; + const releaseRequest = (request?: TlsRequestPromise | null): void => { + request?.releaseTransport?.(); + }; + + const cancelResponseBody = async ( + body: { cancel: (reason?: unknown) => Promise }, + reason: unknown + ): Promise => { + try { + await body.cancel(reason); + } catch { + // Cleanup must not replace the authoritative timeout, abort, or response classification. + } + }; async function tlsFetchStreaming( - client: { request: (url: string, opts: Record) => Promise }, + client: TlsRequestClient, url: string, requestOptions: Record, eofSymbol: string, @@ -768,157 +587,267 @@ export function createTlsClientModule(config: TlsClientConfig): TlsClientModule hardTimeoutMs: number, firstByteMs: number = firstByteTimeoutMs ): Promise { - const dir = await mkdtemp(join(tmpdir(), tempDirPrefix)); - const path = join(dir, `${randomUUID()}.sse`); + const startedAt = Date.now(); + const hardDeadlineAt = startedAt + hardTimeoutMs; + const firstByteDeadlineAt = Number.isFinite(firstByteMs) + ? startedAt + Math.max(0, firstByteMs) + : Number.POSITIVE_INFINITY; + const remainingHardTimeoutMs = (): number => Math.max(0, hardDeadlineAt - Date.now()); + let reader: ReadableStreamDefaultReader | null = null; + let request: TlsRequestPromise | null = null; + let leaseTransferredToStream = false; - const streamOpts: Record = { - ...requestOptions, - streamOutputPath: path, - streamOutputBlockSize: 1024, - streamOutputEOFSymbol: eofSymbol, - }; - - let resetOnHang = true; - const requestPromise = raceWithTimeout( - client.request(url, streamOpts), - hardTimeoutMs, - signal - ).catch((err: unknown) => { - if (resetOnHang && err instanceof TlsClientHangError) { - resetClientCache(); - resetOnHang = false; + try { + request = client.request(url, requestOptions); + const response = await raceWithTimeout(request, remainingHardTimeoutMs(), signal); + if (!isReadableBody(response.body)) { + const text = await raceWithTimeout( + readTlsResponseText(response), + remainingHardTimeoutMs(), + signal + ); + return { status: response.status, headers: toHeaders(response.headers), text, body: null }; } - throw err; - }); - // Wait for the file to exist AND have at least one byte. - const ready = await waitForContent(path, firstByteMs, requestPromise); - if (!ready) { - const r = await requestPromise.catch( - (e) => ({ status: 502, headers: {}, body: String(e) }) as TlsResponseLike - ); - const fileText = await readTextFileIfExists(path); - await cleanupFn(path); - return { - status: r.status, - headers: toHeaders(r.headers), - text: r.body || fileText, - body: null, + reader = response.body.getReader(); + const activeReader = reader; + const readBeforeHardDeadline = (): Promise> => + raceWithTimeout(activeReader.read(), remainingHardTimeoutMs(), signal); + const initialChunks: Uint8Array[] = []; + const readFirstNonEmptyChunk = async (): Promise> => { + while (true) { + const result = await readBeforeHardDeadline(); + if (result.done || result.value.byteLength > 0) return result; + } }; - } + const firstRead = readFirstNonEmptyChunk(); + let firstResult: ReadableStreamReadResult; + let firstByteTimedOut = Date.now() >= firstByteDeadlineAt; - const peek = await readFirstBytes(path, 256); + if (Number.isFinite(firstByteMs) && !firstByteTimedOut) { + let timer: ReturnType | undefined; + try { + const timed = await Promise.race([ + firstRead.then((result) => ({ kind: "read" as const, result })), + new Promise<{ kind: "timeout" }>((resolve) => { + timer = setTimeout( + () => resolve({ kind: "timeout" }), + Math.max(0, firstByteDeadlineAt - Date.now()) + ); + }), + ]); + if (timed.kind === "timeout") { + firstByteTimedOut = true; + firstResult = await firstRead; + } else { + firstResult = timed.result; + } + } finally { + if (timer) clearTimeout(timer); + } + } else { + firstResult = await firstRead; + } - if (responseValidation === "cf") { - // Cloudflare challenge check - if (isCloudflareChallenge(peek)) { - await cleanupFn(path); + if (!firstResult.done) initialChunks.push(firstResult.value); + if (firstByteTimedOut) { + const bytes = await readAllChunks(activeReader, initialChunks, readBeforeHardDeadline); + return { + status: response.status, + headers: toHeaders(response.headers), + text: new TextDecoder().decode(bytes), + body: null, + }; + } + + let previewBytes = concatChunks(initialChunks).subarray(0, 256); + let preview = new TextDecoder().decode(previewBytes, { stream: true }); + let previewReachedEof = firstResult.done; + while ( + !previewReachedEof && + previewBytes.byteLength < 256 && + ((responseValidation === "sse" && + !looksLikeSse(preview) && + couldBecomeSsePrefix(preview)) || + (responseValidation === "cf" && + !isCloudflareChallenge(preview) && + (preview.trimStart().startsWith("<") || couldBecomeCloudflareChallenge(preview)))) + ) { + const next = await readBeforeHardDeadline(); + if (next.done) { + previewReachedEof = true; + break; + } + initialChunks.push(next.value); + previewBytes = concatChunks(initialChunks).subarray(0, 256); + preview = new TextDecoder().decode(previewBytes, { stream: true }); + } + + if (previewReachedEof && previewBytes.byteLength === 0) { + return { + status: response.status, + headers: toHeaders(response.headers), + text: "", + body: null, + }; + } + + if (responseValidation === "cf" && isCloudflareChallenge(preview)) { + await cancelResponseBody(activeReader, "Cloudflare challenge"); return { status: 403, headers: new Headers({ "Content-Type": "text/html" }), - text: peek, + text: preview, body: null, }; } - // HTML error page check - if (peek.trimStart().startsWith("<")) { - await cleanupFn(path); + + if (responseValidation === "cf" && preview.trimStart().startsWith("<")) { + await cancelResponseBody(activeReader, "HTML response"); return { status: 502, headers: new Headers({ "Content-Type": "text/html" }), - text: peek, + text: preview, body: null, }; } - } else { - // SSE validation — if it doesn't look like SSE, return buffered - if (!looksLikeSse(peek)) { - const r = await requestPromise.catch( - (e) => ({ status: 502, headers: {}, body: String(e) }) as TlsResponseLike - ); - const fileText = await readTextFileIfExists(path); - await cleanupFn(path); + + if (response.status < 200 || response.status >= 300) { + const bytes = await readAllChunks(activeReader, initialChunks, readBeforeHardDeadline); return { - status: r.status, - headers: toHeaders(r.headers), - text: r.body || fileText, + status: response.status, + headers: toHeaders(response.headers), + text: new TextDecoder().decode(bytes), body: null, }; } + + if (responseValidation === "sse" && !looksLikeSse(preview)) { + const bytes = await readAllChunks(activeReader, initialChunks, readBeforeHardDeadline); + return { + status: response.status, + headers: toHeaders(response.headers), + text: new TextDecoder().decode(bytes), + body: null, + }; + } + + const headers = toHeaders(response.headers); + headers.set( + "Content-Type", + responseValidation === "cf" ? "application/x-ndjson" : "text/event-stream" + ); + headers.set("Cache-Control", "no-cache"); + const stream = createEofFilteredStream( + activeReader, + initialChunks, + streamEofPolicy === "none" ? "" : eofSymbol, + streamEofPolicy === "include", + readBeforeHardDeadline, + (error) => invalidateOnHang(client, requestOptions, error, request), + () => releaseRequest(request), + signal, + hardDeadlineAt + ); + leaseTransferredToStream = true; + reader = null; + return { status: 200, headers, text: null, body: stream }; + } catch (error) { + invalidateOnHang(client, requestOptions, error, request); + if (reader) await cancelResponseBody(reader, error); + throw error; + } finally { + if (!leaseTransferredToStream) releaseRequest(request); } - - // Looks valid — create streaming response. - const stream = tailFileFn(path, eofSymbol, requestPromise, signal, path); - - const contentType = responseValidation === "cf" ? "application/x-ndjson" : "text/event-stream"; - - const headers = new Headers({ - "Content-Type": contentType, - "Cache-Control": "no-cache", - }); - return { status: 200, headers, text: null, body: stream }; } async function tlsFetch(url: string, options: TlsFetchOptions = {}): Promise { - // Resolve proxyUrl early so test overrides and the real path both see it. const resolvedProxyUrl = resolveProxyUrl(proxyDomainOverride ?? domain, options.proxyUrl); if (testOverride) return testOverride(url, { ...options, proxyUrl: resolvedProxyUrl }); + if (options.signal?.aborted) throw makeAbortError(options.signal); - if (options.signal?.aborted) { - throw makeAbortError(options.signal); - } - const client = await localState.getClient(); - if (options.signal?.aborted) { - throw makeAbortError(options.signal); - } + const client = await getClient(); + if (options.signal?.aborted) throw makeAbortError(options.signal); const requestOptions: Record = { method: options.method || "GET", headers: options.headers || {}, body: options.body, - tlsClientIdentifier: tlsProfile, timeoutMilliseconds: options.timeoutMs ?? defaultTimeoutMs, - followRedirects: true, - withRandomTLSExtensionOrder: true, proxyUrl: resolvedProxyUrl, + signal: options.signal, }; - - requestOptions.isByteResponse = options.byteResponse === true; + const hardTimeoutMs = (options.timeoutMs ?? defaultTimeoutMs) + hardTimeoutGraceMs; if (options.stream) { - return await tlsFetchStreaming( + return tlsFetchStreaming( client, url, requestOptions, - options.streamEofSymbol || streamEofSymbol, + options.streamEofSymbol ?? streamEofSymbol, options.signal ?? null, - (options.timeoutMs ?? defaultTimeoutMs) + hardTimeoutGraceMs, + hardTimeoutMs, firstByteTimeoutMs ); } - let tlsResponse: TlsResponseLike; + const hardDeadlineAt = Date.now() + hardTimeoutMs; + const remainingHardTimeoutMs = (): number => Math.max(0, hardDeadlineAt - Date.now()); + let response: TlsResponseLike | null = null; + let bodyReader: ReadableStreamDefaultReader | null = null; + let request: TlsRequestPromise | null = null; try { - tlsResponse = await raceWithTimeout( - client.request(url, requestOptions), - (options.timeoutMs ?? defaultTimeoutMs) + hardTimeoutGraceMs, + request = client.request(url, requestOptions); + response = await raceWithTimeout(request, remainingHardTimeoutMs(), options.signal ?? null); + if (options.signal?.aborted) throw makeAbortError(options.signal); + const headers = toHeaders(response.headers); + if (options.byteResponse) { + const bytes = await raceWithTimeout( + readTlsResponseBytes(response, (reader) => { + bodyReader = reader; + }), + remainingHardTimeoutMs(), + options.signal ?? null + ); + bodyReader = null; + const mime = + headers.get("content-type")?.split(";", 1)[0]?.trim() || "application/octet-stream"; + return { + status: response.status, + headers, + text: `data:${mime};base64,${Buffer.from(bytes).toString("base64")}`, + body: null, + }; + } + const text = await raceWithTimeout( + readTlsResponseText(response, (reader) => { + bodyReader = reader; + }), + remainingHardTimeoutMs(), options.signal ?? null ); - } catch (err) { - if (err instanceof TlsClientHangError) { - resetClientCache(); + bodyReader = null; + return { status: response.status, headers, text, body: null }; + } catch (error) { + invalidateOnHang(client, requestOptions, error, request); + if (bodyReader) { + await cancelResponseBody(bodyReader, error); + } else if ( + response && + isReadableBody(response.body) && + typeof response.body.cancel === "function" + ) { + await cancelResponseBody( + response.body as ReadableBodyLike & { + cancel: (reason?: unknown) => Promise; + }, + error + ); } - throw err; + throw error; + } finally { + releaseRequest(request); } - if (options.signal?.aborted) { - throw makeAbortError(options.signal); - } - return { - status: tlsResponse.status, - headers: toHeaders(tlsResponse.headers), - text: tlsResponse.body, - body: null, - }; } const module: TlsClientModule = { @@ -927,11 +856,7 @@ export function createTlsClientModule(config: TlsClientConfig): TlsClientModule testOverride = fn; }, }; - - if (exportCloudflareCheck) { - module.isCloudflareChallenge = isCloudflareChallenge; - } - + if (exportCloudflareCheck) module.isCloudflareChallenge = isCloudflareChallenge; if (config.exposeStreamingForTesting) { module.__tlsFetchStreamingForTesting = ( client, @@ -941,18 +866,8 @@ export function createTlsClientModule(config: TlsClientConfig): TlsClientModule signal = null, hardTimeoutMs = defaultTimeoutMs + hardTimeoutGraceMs, firstByteMs = firstByteTimeoutMs - ): Promise => { - return tlsFetchStreaming( - client, - url, - requestOptions, - eofSymbol, - signal, - hardTimeoutMs, - firstByteMs - ); - }; + ) => + tlsFetchStreaming(client, url, requestOptions, eofSymbol, signal, hardTimeoutMs, firstByteMs); } - return module; } diff --git a/open-sse/services/tlsClientDownloadDir.ts b/open-sse/services/tlsClientDownloadDir.ts deleted file mode 100644 index 4ded7fbf01..0000000000 --- a/open-sse/services/tlsClientDownloadDir.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { join } from "node:path"; -import { resolveDataDir } from "@/lib/dataPaths"; - -/** - * Writable cache directory for tls-client-node's native binary. - * - * Without an explicit `downloadDir`, the library defaults to its own package - * `node_modules/tls-client-node/bin`, which is root-owned on global installs - * and fails with EACCES for normal users (#8579). - */ -export function resolveTlsClientDownloadDir(): string { - return join(resolveDataDir(), "tls-client", "bin"); -} - -export function buildNativeTlsClientOptions(): { - runtimeMode: "native"; - downloadDir: string; -} { - return { - runtimeMode: "native", - downloadDir: resolveTlsClientDownloadDir(), - }; -} diff --git a/open-sse/utils/tlsClient.ts b/open-sse/utils/tlsClient.ts index 7819bdcaf8..25c3e81aee 100644 --- a/open-sse/utils/tlsClient.ts +++ b/open-sse/utils/tlsClient.ts @@ -10,6 +10,367 @@ function loadRuntimeModule(moduleName: string): unknown { return Reflect.apply(runtimeRequire, undefined, [moduleName]); } +export type WreqTransportLike = { + close: () => Promise | void; +}; + +export type WreqTransportResponseLike = { + status: number; + headers: + | Record + | (Iterable<[string, string]> & { + getSetCookie?: () => string[]; + }); + body: + | string + | (Pick, "getReader"> & { + cancel?: (reason?: unknown) => Promise; + }) + | null; + text?: () => Promise; + bytes?: () => Promise; +}; + +export type WreqTransportRuntime = { + createTransport: (options: Record) => Promise; + fetch: (url: string, options: Record) => Promise; +}; + +export type WreqTransportRuntimeLoader = () => Promise; + +export type WreqTransportRequestPromise = Promise & { + /** Close this request's exact transport generation if it is still current. */ + invalidateTransport: () => void; + /** Mark this request complete so its idle transport may be reused or evicted. */ + releaseTransport: () => void; +}; + +export type WreqTransportRequestClient = { + request: (url: string, options: Record) => WreqTransportRequestPromise; +}; + +export class WreqRuntimeUnavailableError extends Error { + override name = "WreqRuntimeUnavailableError"; +} + +export class WreqTransportCapacityError extends Error { + override name = "WreqTransportCapacityError"; + readonly code = "TLS_SESSION_CAPACITY"; +} + +type EmulationOs = "windows" | "macos" | "linux" | "android" | "ios"; + +let wreqRuntimeModule: Record | null = null; +let wreqRuntimeModuleError: unknown; +let wreqRuntimeModuleResolved = false; + +function getWreqRuntimeModule(): Record { + if (!wreqRuntimeModuleResolved) { + wreqRuntimeModuleResolved = true; + try { + wreqRuntimeModule = loadRuntimeModule("wreq-js") as Record; + } catch (error) { + wreqRuntimeModuleError = error; + } + } + if (wreqRuntimeModule) return wreqRuntimeModule; + throw wreqRuntimeModuleError ?? new Error("wreq-js runtime unavailable"); +} + +const TRANSPORT_POOL_KEY = Symbol.for("omniroute.wreqTransportPool.instance"); +const TRANSPORT_POOL_LIFECYCLE_KEY = Symbol.for("omniroute.wreqTransportPool.lifecycle"); +type WreqLifecycleResource = { + closeAll: () => Promise | void; +}; +const transportPoolGlobal = globalThis as typeof globalThis & { + [TRANSPORT_POOL_KEY]?: WreqTransportPool; + [TRANSPORT_POOL_LIFECYCLE_KEY]?: { + pools: Set; + exitHookInstalled: boolean; + }; +}; + +function registerWreqLifecycleResource(resource: WreqLifecycleResource): void { + const lifecycle = transportPoolGlobal[TRANSPORT_POOL_LIFECYCLE_KEY] ?? { + pools: new Set(), + exitHookInstalled: false, + }; + transportPoolGlobal[TRANSPORT_POOL_LIFECYCLE_KEY] = lifecycle; + lifecycle.pools.add(resource); + if (lifecycle.exitHookInstalled) return; + lifecycle.exitHookInstalled = true; + process.once("exit", () => { + for (const registered of lifecycle.pools) { + try { + void registered.closeAll(); + } catch { + // Process shutdown is best effort; every close has already been initiated. + } + } + lifecycle.pools.clear(); + }); +} + +async function closeWreqLifecycleResources(): Promise { + const resources = [...(transportPoolGlobal[TRANSPORT_POOL_LIFECYCLE_KEY]?.pools ?? [])]; + await Promise.allSettled( + resources.map((resource) => Promise.resolve().then(() => resource.closeAll())) + ); +} + +/** Focused-test seam for proving the shared process lifecycle without emitting `exit`. */ +export async function __closeWreqLifecycleResourcesForTesting(): Promise { + await closeWreqLifecycleResources(); +} + +function loadWreqTransportRuntime(): Promise { + try { + const loaded = getWreqRuntimeModule() as Partial; + if (typeof loaded.createTransport !== "function" || typeof loaded.fetch !== "function") { + throw new Error("wreq-js runtime is missing createTransport/fetch"); + } + return Promise.resolve(loaded as WreqTransportRuntime); + } catch (error) { + return Promise.reject(error); + } +} + +type WreqTransportEntry = { + pending: Promise; + transport: WreqTransportLike | null; + activeRequests: number; + lastUsed: number; + closed: boolean; + closing: Promise | null; +}; + +type WreqTransportLease = { + key: string | null; + entry: WreqTransportEntry | null; + released: boolean; + invalidated: boolean; +}; + +class WreqTransportPool { + private runtimePromise: Promise | null = null; + private readonly transports = new Map(); + private readonly pendingCloses = new Set>(); + private readonly maxTransports: number; + private capacityReservations = 0; + private accessSequence = 0; + + constructor( + private readonly runtimeLoader: WreqTransportRuntimeLoader, + maxTransports = 128 + ) { + this.maxTransports = Number.isInteger(maxTransports) && maxTransports > 0 ? maxTransports : 128; + } + + private getRuntime(): Promise { + if (!this.runtimePromise) { + const pending = this.runtimeLoader().catch((error: unknown) => { + if (this.runtimePromise === pending) this.runtimePromise = null; + throw new WreqRuntimeUnavailableError( + error instanceof Error && error.message + ? `wreq-js runtime unavailable: ${error.message}` + : "wreq-js runtime unavailable" + ); + }); + this.runtimePromise = pending; + } + return this.runtimePromise; + } + + private key(browser: string, os: EmulationOs, options: Record): string { + const proxy = typeof options.proxyUrl === "string" ? options.proxyUrl : ""; + return `${browser}\0${os}\0${proxy}`; + } + + private closeEntry(key: string, entry: WreqTransportEntry): Promise { + if (this.transports.get(key) !== entry) return entry.closing ?? Promise.resolve(); + this.transports.delete(key); + if (entry.closed) return entry.closing ?? Promise.resolve(); + entry.closed = true; + let closing: Promise; + try { + closing = entry.transport + ? Promise.resolve(entry.transport.close()).then(() => undefined) + : entry.pending.then((transport) => transport.close()).then(() => undefined); + } catch { + closing = Promise.resolve(); + } + closing = closing + .catch(() => { + // Close is best-effort after eviction; capacity is released by the finalizer below. + }) + .finally(() => { + this.pendingCloses.delete(closing); + }); + entry.closing = closing; + this.pendingCloses.add(closing); + return closing; + } + + private findOldestIdleEntry(): [string, WreqTransportEntry] | undefined { + let candidate: [string, WreqTransportEntry] | undefined; + for (const pair of this.transports) { + const [, entry] = pair; + if (entry.activeRequests > 0) continue; + if (!candidate || entry.lastUsed < candidate[1].lastUsed) candidate = pair; + } + return candidate; + } + + private reserveCapacity(): Promise | null { + const occupied = this.transports.size + this.pendingCloses.size + this.capacityReservations; + this.capacityReservations += 1; + if (occupied < this.maxTransports) return null; + + const candidate = this.findOldestIdleEntry(); + if (!candidate) { + this.capacityReservations -= 1; + throw new WreqTransportCapacityError( + `wreq-js transport capacity exhausted (${this.maxTransports} active proxy/profile keys)` + ); + } + return this.closeEntry(candidate[0], candidate[1]); + } + + private releaseCapacityReservation(): void { + this.capacityReservations = Math.max(0, this.capacityReservations - 1); + } + + private releaseLease(lease: WreqTransportLease): void { + if (lease.released) return; + lease.released = true; + const entry = lease.entry; + if (!entry) return; + entry.activeRequests = Math.max(0, entry.activeRequests - 1); + entry.lastUsed = ++this.accessSequence; + } + + private invalidateLease(lease: WreqTransportLease): void { + if (lease.invalidated) return; + lease.invalidated = true; + if (lease.key && lease.entry) this.closeEntry(lease.key, lease.entry); + this.releaseLease(lease); + } + + async closeAll(): Promise { + const closes = [...this.transports].map(([key, entry]) => this.closeEntry(key, entry)); + await Promise.allSettled([...closes, ...this.pendingCloses]); + } + + client(browser: string, os: EmulationOs): WreqTransportRequestClient { + registerWreqLifecycleResource(this); + return { + request: (url, options) => { + const lease: WreqTransportLease = { + key: null, + entry: null, + released: false, + invalidated: false, + }; + const request = (async () => { + const runtime = await this.getRuntime(); + if (lease.released) throw new Error("wreq-js request lease was released before dispatch"); + + const key = this.key(browser, os, options); + let entry = this.transports.get(key); + if (!entry) { + const capacityWait = this.reserveCapacity(); + try { + if (capacityWait) await capacityWait; + if (lease.released) { + throw new Error("wreq-js request lease was released before dispatch"); + } + entry = this.transports.get(key); + if (!entry) { + const proxy = typeof options.proxyUrl === "string" ? options.proxyUrl : undefined; + const transportOptions: Record = { browser, os }; + if (proxy) transportOptions.proxy = proxy; + let createdEntry: WreqTransportEntry; + const pending = runtime.createTransport(transportOptions).then((transport) => { + createdEntry.transport = transport; + return transport; + }); + entry = { + pending, + transport: null, + activeRequests: 0, + lastUsed: ++this.accessSequence, + closed: false, + closing: null, + }; + createdEntry = entry; + this.transports.set(key, entry); + void pending.catch(() => { + if (this.transports.get(key) === createdEntry) this.transports.delete(key); + createdEntry.closed = true; + }); + } + } finally { + this.releaseCapacityReservation(); + } + } + + lease.key = key; + lease.entry = entry; + entry.activeRequests += 1; + entry.lastUsed = ++this.accessSequence; + + const transport = await entry.pending; + if (lease.released) throw new Error("wreq-js request lease was released before dispatch"); + return runtime.fetch(url, { + method: options.method, + headers: options.headers, + body: options.body, + redirect: "follow", + timeout: options.timeoutMilliseconds, + signal: options.signal, + transport, + cookieMode: "ephemeral", + }); + })() as WreqTransportRequestPromise; + + Object.defineProperties(request, { + invalidateTransport: { + value: () => this.invalidateLease(lease), + }, + releaseTransport: { + value: () => this.releaseLease(lease), + }, + }); + void request.catch(() => this.releaseLease(lease)); + return request; + }, + }; + } +} + +/** + * Build an ephemeral-cookie wreq client backed by the process-wide transport pool. + * Tests that inject a runtime loader receive an isolated pool to avoid cross-test state. + */ +export function createWreqTransportClient(options: { + browser: string; + os: EmulationOs; + runtimeLoader?: WreqTransportRuntimeLoader; + maxTransports?: number; +}): WreqTransportRequestClient { + if (options.runtimeLoader) { + return new WreqTransportPool(options.runtimeLoader, options.maxTransports).client( + options.browser, + options.os + ); + } + const pool = + transportPoolGlobal[TRANSPORT_POOL_KEY] ?? + new WreqTransportPool(loadWreqTransportRuntime, options.maxTransports); + transportPoolGlobal[TRANSPORT_POOL_KEY] = pool; + return pool.client(options.browser, options.os); +} + export type WreqResponse = { status: number; statusText: string; @@ -29,7 +390,7 @@ export type CreateSessionFn = (options: Record) => Promise 0 ? maxSessions : 128; + if (registerLifecycle) registerWreqLifecycleResource(this); } /** Library availability only. Per-session circuit state is enforced inside fetch(). */ @@ -288,10 +654,17 @@ export class TlsClient { } private closeSession(session: WreqSession): Promise { + let closeResult: Promise; + try { + closeResult = Promise.resolve(session.close()).then(() => undefined); + } catch { + closeResult = Promise.resolve(); + } let closing: Promise; - closing = Promise.resolve() - .then(() => session.close()) - .catch(() => {}) + closing = closeResult + .catch(() => { + // A native close failure must not leak the session-capacity slot. + }) .finally(() => { this.pendingCloses.delete(closing); }); @@ -408,7 +781,7 @@ export class TlsClient { return session ? this.closeSession(session) : Promise.resolve(); } - private async closeSessions(): Promise { + async closeAll(): Promise { const pending = [...this.pendingSessions.values()]; this.globalSessionEpoch++; this.pendingSessions.clear(); @@ -615,7 +988,7 @@ export class TlsClient { } async exit(): Promise { - await this.closeSessions(); + await this.closeAll(); } resetCircuit(proxy?: string | null, sessionScope?: string): void { @@ -658,5 +1031,6 @@ const scopedGlobal = globalThis as typeof globalThis & { }; const tlsClient = scopedGlobal[TLS_CLIENT_KEY] ?? new TlsClient(); scopedGlobal[TLS_CLIENT_KEY] = tlsClient; +registerWreqLifecycleResource(tlsClient); export default tlsClient; diff --git a/package-lock.json b/package-lock.json index 31a73d5464..270593d514 100644 --- a/package-lock.json +++ b/package-lock.json @@ -172,8 +172,7 @@ "keytar": "^7.9.0", "onnxruntime-node": "1.24.3", "sqlite-vec": "^0.1.9", - "tls-client-node": "^0.2.0", - "wreq-js": "^3.2.0" + "wreq-js": "3.2.0" } }, "node_modules/@adobe/css-tools": { @@ -26976,17 +26975,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/koffi": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/koffi/-/koffi-2.16.1.tgz", - "integrity": "sha512-0Ie6CfD026dNfWSosDw9dPxPzO9Rlyo0N8m5r05S8YjytIpuilzMFDMY4IDy/8xQsTwpuVinhncD+S8n3bcYZQ==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "funding": { - "url": "https://liberapay.com/Koromix" - } - }, "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", @@ -37392,7 +37380,7 @@ "version": "7.0.27", "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.27.tgz", "integrity": "sha512-I4FZcVFcqCRuT0ph6dCDpPuO4Xgzvh+spkcTr1gK7peIvxWauoloVO0vuy1FQnijT63ss6AsHB6+OIM4aXHbPg==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "tldts-core": "^7.0.27" @@ -37405,28 +37393,9 @@ "version": "7.0.27", "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.27.tgz", "integrity": "sha512-YQ7uPjgWUibIK6DW5lrKujGwUKhLevU4hcGbP5O6TcIUb+oTjJYJVWPS4nZsIHrEEEG6myk/oqAJUEQmpZrHsg==", - "devOptional": true, + "dev": true, "license": "MIT" }, - "node_modules/tls-client-node": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/tls-client-node/-/tls-client-node-0.2.0.tgz", - "integrity": "sha512-0PHJgaGPvMK9ly7xohviOoe8Oxos43IOIdsEhibgku4ce/3/YLhxJTPPKNQZII0PdcOjlfPweB9eRs13mWaWIg==", - "hasInstallScript": true, - "license": "SEE LICENSE IN LICENSE", - "optional": true, - "dependencies": { - "koffi": "^2.8.9", - "tough-cookie": "^6.0.1" - }, - "engines": { - "node": ">=18.17" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/fatihkabakk" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -37493,7 +37462,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz", "integrity": "sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==", - "devOptional": true, + "dev": true, "license": "BSD-3-Clause", "dependencies": { "tldts": "^7.0.5" diff --git a/package.json b/package.json index 4e9f576908..214c6ea22e 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,6 @@ "src/types/", ".env.example", "scripts/build/postinstall.mjs", - "scripts/build/fixTlsClientNodeBinary.mjs", "scripts/build/fixPlaywrightAndroid.mjs", "bin/cli/runtime/", "scripts/postinstall.mjs", @@ -38,6 +37,10 @@ "scripts/build/backendOnlyPages.mjs", "scripts/build/build-tproxy-native.mjs", "scripts/build/native-binary-compat.mjs", + "scripts/build/wreqJsNative.mjs", + "config/release/wreq-js-native-manifest.json", + "config/release/wreq-js-rust-license-inventory.json", + "config/release/wreq-js-rust-notices.md", "scripts/build/build-next-isolated.mjs", "scripts/build/runtime-env.mjs", "scripts/packs/optionalPackManifest.mjs", @@ -362,8 +365,7 @@ "keytar": "^7.9.0", "onnxruntime-node": "1.24.3", "sqlite-vec": "^0.1.9", - "tls-client-node": "^0.2.0", - "wreq-js": "^3.2.0" + "wreq-js": "3.2.0" }, "devDependencies": { "@axe-core/playwright": "^4.13.0", diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c37a4e47a7..66883433a5 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -12,12 +12,10 @@ allowBuilds: core-js: true esbuild: true keytar: true - koffi: true libxmljs2: true onnxruntime-node: true protobufjs: true sharp: true - tls-client-node: true unrs-resolver: true onlyBuiltDependencies: - "@parcel/watcher" @@ -26,11 +24,9 @@ onlyBuiltDependencies: - "core-js" - "esbuild" - "keytar" - - "koffi" - "libxmljs2" - "onnxruntime-node" - "omniroute" - "protobufjs" - "sharp" - - "tls-client-node" - "unrs-resolver" diff --git a/pnpm.json b/pnpm.json index b07b72ab41..9d2741a0be 100644 --- a/pnpm.json +++ b/pnpm.json @@ -6,13 +6,11 @@ "core-js", "esbuild", "keytar", - "koffi", "libxmljs2", "omniroute", "onnxruntime-node", "protobufjs", "sharp", - "tls-client-node", "unrs-resolver" ] } diff --git a/scripts/build/assembleStandalone.mjs b/scripts/build/assembleStandalone.mjs index 33e6835fc1..8cd78d40b3 100644 --- a/scripts/build/assembleStandalone.mjs +++ b/scripts/build/assembleStandalone.mjs @@ -49,6 +49,7 @@ import fs from "node:fs/promises"; import fsSync from "node:fs"; import path from "node:path"; import { colocateLlmlinguaOptionals, SEED_PACKAGES } from "./colocateOptionals.mjs"; +import { WREQ_JS_NATIVE_BINDINGS } from "./wreqJsNative.mjs"; /** * Check whether a path exists (async). @@ -121,6 +122,31 @@ const EXTRA_MODULE_ENTRIES = [ src: ["node_modules", "wreq-js"], dest: ["node_modules", "wreq-js"], }, + ...WREQ_JS_NATIVE_BINDINGS.map((binding) => ({ + label: `${binding.packageName} native binding`, + src: ["node_modules", ...binding.packageName.split("/")], + dest: ["node_modules", ...binding.packageName.split("/")], + })), + { + label: "third-party notices", + src: ["THIRD_PARTY_NOTICES.md"], + dest: ["THIRD_PARTY_NOTICES.md"], + }, + { + label: "wreq-js native provenance manifest", + src: ["config", "release", "wreq-js-native-manifest.json"], + dest: ["config", "release", "wreq-js-native-manifest.json"], + }, + { + label: "wreq-js Rust license inventory", + src: ["config", "release", "wreq-js-rust-license-inventory.json"], + dest: ["config", "release", "wreq-js-rust-license-inventory.json"], + }, + { + label: "wreq-js Rust/native notice bundle", + src: ["config", "release", "wreq-js-rust-notices.md"], + dest: ["config", "release", "wreq-js-rust-notices.md"], + }, { label: "@swc/helpers", src: ["node_modules", "@swc", "helpers"], @@ -557,9 +583,7 @@ function stampServiceWorkerBuildId(resolvedOutDir) { const swDest = path.join(resolvedOutDir, "public", "sw.js"); if (!fsSync.existsSync(swDest)) return; const buildId = - process.env.OMNIROUTE_SW_BUILD_ID || - process.env.SOURCE_VERSION || - String(Date.now()); + process.env.OMNIROUTE_SW_BUILD_ID || process.env.SOURCE_VERSION || String(Date.now()); let sw = fsSync.readFileSync(swDest, "utf8"); sw = sw.replace( /^const CACHE_NAME = "omniroute-pwa-v2";$/m, diff --git a/scripts/build/fixTlsClientNodeBinary.mjs b/scripts/build/fixTlsClientNodeBinary.mjs deleted file mode 100644 index b28849c6bb..0000000000 --- a/scripts/build/fixTlsClientNodeBinary.mjs +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env node - -/** - * tls-client-node postinstall repair (#7802). - * - * tls-client-node's own postinstall.js fetches a platform-specific native - * binary (.so/.dylib/.dll) from the bogdanfinn/tls-client GitHub Releases - * API. That script is blocked by `npm ci --ignore-scripts` (the Dockerfile - * builder stage runs with scripts disabled for supply-chain hygiene) and, - * even when it does run, silently no-ops on a rate-limited/failed GitHub API - * call instead of raising — so `node_modules/tls-client-node/bin/` can end - * up empty with no visible signal until the first live request throws - * TlsClientUnavailableError (claude-web/grok-web/lmarena/ - * perplexity-web all share this transport). - * - * This module: - * 1. Copies an already-fetched root `bin/` into the standalone - * `dist/node_modules/tls-client-node/bin/` bundle (same pattern as - * fixWreqJsBinary), so the published npm package works even though its - * own `files` allowlist never ships the binary. - * 2. When the root `bin/` is empty (--ignore-scripts blocked it, or a - * transient GitHub rate-limit ate the first attempt), retries the - * module's own postinstall.js with exponential backoff instead of - * giving up on the first failure. - * - * Best-effort throughout: a failure here never throws out of postinstall.mjs - * — it only warns, matching the other fix*Binary() steps. The runtime layer - * (perplexityTlsClient.ts and its 4 siblings) already surfaces a clear - * TlsClientUnavailableError pointing at the missing binary, so an operator - * who hits a still-empty bin/ after this repair gets an actionable message - * rather than an opaque crash. - */ - -import { copyFileSync, existsSync, mkdirSync, readdirSync } from "node:fs"; -import { join } from "node:path"; - -const DEFAULT_RETRY_DELAYS_MS = [1_000, 3_000, 8_000]; - -function hasAnyFile(dir) { - if (!existsSync(dir)) return false; - try { - return readdirSync(dir).length > 0; - } catch { - return false; - } -} - -function copyBinDir(sourceDir, destDir) { - mkdirSync(destDir, { recursive: true }); - for (const file of readdirSync(sourceDir)) { - copyFileSync(join(sourceDir, file), join(destDir, file)); - } -} - -async function sleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); -} - -/** - * Re-run tls-client-node's own postinstall.js in-process, retrying with - * backoff when the attempt leaves `bin/` empty (covers transient GitHub API - * rate-limiting — the upstream script itself never throws on failure, it - * only warns, so "still empty after running it" is the only failure signal - * available). - */ -async function downloadWithRetry(rootTlsClientDir, retryDelaysMs, log) { - const postinstallScript = join(rootTlsClientDir, "scripts", "postinstall.js"); - const binDir = join(rootTlsClientDir, "bin"); - if (!existsSync(postinstallScript)) return false; - - for (let attempt = 0; attempt <= retryDelaysMs.length; attempt++) { - if (attempt > 0) { - log( - ` ⏳ tls-client-node native binary still missing — retrying download ` + - `(attempt ${attempt + 1}/${retryDelaysMs.length + 1}) after rate-limit/backoff...` - ); - await sleep(retryDelaysMs[attempt - 1]); - } - - try { - const { execFileSync } = await import("node:child_process"); - execFileSync(process.execPath, [postinstallScript], { - cwd: rootTlsClientDir, - stdio: "pipe", - timeout: 30_000, - }); - } catch (err) { - log(` ⚠️ tls-client-node postinstall attempt failed: ${err.message.split("\n")[0]}`); - } - - if (hasAnyFile(binDir)) return true; - } - - return false; -} - -/** - * @param {object} opts - * @param {string} opts.rootDir - repo root - * @param {(msg: string) => void} [opts.log] - * @param {number[]} [opts.retryDelaysMs] - override for tests (avoid real sleeps) - */ -export async function fixTlsClientNodeBinary({ - rootDir, - log = (m) => console.log(m), - retryDelaysMs = DEFAULT_RETRY_DELAYS_MS, -} = {}) { - const rootTlsClientDir = join(rootDir, "node_modules", "tls-client-node"); - const rootBinDir = join(rootTlsClientDir, "bin"); - const distTlsClientDir = join(rootDir, "dist", "node_modules", "tls-client-node"); - - if (!existsSync(rootTlsClientDir)) return; - - if (!hasAnyFile(rootBinDir)) { - log( - "\n 🔧 tls-client-node native binary missing (blocked by --ignore-scripts or a " + - "failed fetch) — attempting repair...\n" - ); - const recovered = await downloadWithRetry(rootTlsClientDir, retryDelaysMs, log); - if (!recovered) { - console.warn( - "\n ⚠️ Could not fetch tls-client-node's native binary " + - "(GitHub API rate-limited or unreachable after retries)." - ); - console.warn( - " claude-web/grok-web/lmarena/perplexity-web will raise a clear " + - "TlsClientUnavailableError on first use until this is resolved." - ); - console.warn( - ` Manual fix: node ${join(rootTlsClientDir, "scripts", "postinstall.js")}\n` - ); - return; - } - log(" ✅ tls-client-node native binary fetched successfully!\n"); - } - - if (!existsSync(distTlsClientDir) || !hasAnyFile(rootBinDir)) return; - - const distBinDir = join(distTlsClientDir, "bin"); - if (hasAnyFile(distBinDir)) return; - - try { - copyBinDir(rootBinDir, distBinDir); - log(" ✅ tls-client-node native binary copied to standalone dist/node_modules.\n"); - } catch (err) { - console.warn(` ⚠️ Could not copy tls-client-node binary into dist/: ${err.message}`); - } -} diff --git a/scripts/build/hydrateNativeDeps.mjs b/scripts/build/hydrateNativeDeps.mjs index 4b7d4a2f9a..f987c0bec3 100644 --- a/scripts/build/hydrateNativeDeps.mjs +++ b/scripts/build/hydrateNativeDeps.mjs @@ -7,21 +7,26 @@ * matrix leg. Everything except install-machine-forked optional packages is * platform-independent: * - * - Bundled-for-all (verify only): koffi ships every triplet under - * `build/koffi/_`, better-sqlite3 v13 ships Node-API prebuilds for - * 8 platforms, wreq-js ships `rust/wreq-js.-[-libc].node`, and - * onnxruntime-node ships `bin/napi-v6//`. + * - Bundled-for-all (verify only): better-sqlite3 v13 ships Node-API prebuilds + * for 8 platforms, and onnxruntime-node ships `bin/napi-v6//`. * - Install-machine-forked (hydrate): `@img/sharp-*`, `@img/sharp-libvips-*`, - * `@ngrok/ngrok-*` and macOS-only `fsevents` resolve to whichever platform - * ran `npm ci`. The ubuntu-built tree carries the linux forks; each leg - * replaces them with the forks from its OWN `npm ci`d node_modules. + * `@ngrok/ngrok-*`, `@wreq-js/binding-*`, and macOS-only `fsevents` resolve + * to whichever platform ran `npm ci`. The ubuntu-built tree carries the + * linux forks; each leg replaces them with the forks from its OWN install. */ import fs from "node:fs"; import path from "node:path"; +import { resolveWreqJsNativeBinding } from "./wreqJsNative.mjs"; + /** Scope prefixes whose members are install-machine-forked. */ -export const HYDRATED_SCOPES = ["@img/sharp-", "@img/sharp-libvips-", "@ngrok/ngrok-"]; +export const HYDRATED_SCOPES = [ + "@img/sharp-", + "@img/sharp-libvips-", + "@ngrok/ngrok-", + "@wreq-js/binding-", +]; /** Standalone packages that are not forked but must never be platform-forked. */ export const HYDRATED_ROOT_PACKAGES = ["fsevents"]; @@ -33,8 +38,7 @@ export const HYDRATED_ROOT_PACKAGES = ["fsevents"]; export const BUNDLED_EXEMPTIONS = new Set(["onnxruntime-node:darwin-x64"]); function platformTriple(platform, arch) { - // koffi uses underscore triplets; better-sqlite3/wreq-js/onnx use dashes. - return { koffi: `${platform}_${arch}`, dash: `${platform}-${arch}` }; + return { dash: `${platform}-${arch}` }; } function rmrf(target) { @@ -106,9 +110,6 @@ export function verifyBundledNatives({ nodeModulesDir, platform, arch }) { const errors = []; const triple = platformTriple(platform, arch); - const koffiDir = path.join(nodeModulesDir, "koffi", "build", "koffi", triple.koffi); - if (!fs.existsSync(koffiDir)) errors.push(`koffi: missing bundled triplet ${triple.koffi}`); - const sqlitePrebuild = path.join( nodeModulesDir, "better-sqlite3", @@ -118,13 +119,23 @@ export function verifyBundledNatives({ nodeModulesDir, platform, arch }) { if (!fs.existsSync(sqlitePrebuild)) errors.push(`better-sqlite3: missing prebuild ${triple.dash}.node`); - const wreqDir = path.join(nodeModulesDir, "wreq-js", "rust"); - const wreqNames = fs.existsSync(wreqDir) - ? fs - .readdirSync(wreqDir) - .filter((n) => n.startsWith(`wreq-js.${triple.dash}`) && n.endsWith(".node")) - : []; - if (wreqNames.length === 0) errors.push(`wreq-js: missing rust binary for ${triple.dash}`); + const wreqBinding = resolveWreqJsNativeBinding({ + platform, + arch, + libc: platform === "linux" ? "gnu" : undefined, + }); + if (!wreqBinding) { + errors.push(`wreq-js: unsupported target ${triple.dash}`); + } else { + const wreqBinary = path.join( + nodeModulesDir, + ...wreqBinding.packageName.split("/"), + wreqBinding.fileName + ); + if (!fs.existsSync(wreqBinary)) { + errors.push(`wreq-js: missing ${wreqBinding.packageName}/${wreqBinding.fileName}`); + } + } const exempt = BUNDLED_EXEMPTIONS.has(`onnxruntime-node:${triple.dash}`); if (!exempt) { diff --git a/scripts/build/pack-artifact-policy.ts b/scripts/build/pack-artifact-policy.ts index 240b62813b..bbead7311d 100644 --- a/scripts/build/pack-artifact-policy.ts +++ b/scripts/build/pack-artifact-policy.ts @@ -94,6 +94,9 @@ export const PACK_ARTIFACT_ROOT_ALLOWED_EXACT_PATHS: string[] = [ "LICENSE", "README.md", "THIRD_PARTY_NOTICES.md", + "config/release/wreq-js-native-manifest.json", + "config/release/wreq-js-rust-license-inventory.json", + "config/release/wreq-js-rust-notices.md", "bin/aliasResolver.mjs", "bin/chatgpt-web-codex-mcp.mjs", // #7808: ESM loader hook split out of bin/aliasResolver.mjs to silence CodeQL @@ -136,12 +139,10 @@ export const PACK_ARTIFACT_ROOT_ALLOWED_EXACT_PATHS: string[] = [ "scripts/build/build-next-isolated.mjs", "scripts/check/check-supported-node-runtime.ts", "scripts/build/native-binary-compat.mjs", + "scripts/build/wreqJsNative.mjs", "scripts/build/postinstall.mjs", "scripts/build/postinstallSupport.mjs", "scripts/build/colocateOptionals.mjs", - // #7802: imported by scripts/build/postinstall.mjs to repair tls-client-node's - // native binary (claude-web/grok-web/lmarena/perplexity-web transport). - "scripts/build/fixTlsClientNodeBinary.mjs", // #8859: imported by scripts/build/postinstall.mjs to repair playwright-core's // browser resolution on Termux/Android (no glibc, no bundled browsers). "scripts/build/fixPlaywrightAndroid.mjs", @@ -222,13 +223,16 @@ export const PACK_ARTIFACT_REQUIRED_PATHS: string[] = [ // or the CLI fails to boot — list them REQUIRED so a regression is loud. "bin/aliasResolver.mjs", "bin/aliasResolverHook.mjs", + "config/release/wreq-js-native-manifest.json", + "config/release/wreq-js-rust-license-inventory.json", + "config/release/wreq-js-rust-notices.md", "package.json", "scripts/build/native-binary-compat.mjs", "scripts/build/postinstall.mjs", "scripts/build/postinstallSupport.mjs", "scripts/build/colocateOptionals.mjs", - "scripts/build/fixTlsClientNodeBinary.mjs", "scripts/build/runtime-env.mjs", + "scripts/build/wreqJsNative.mjs", // #10382: runtime imports of bin/cli/commands/packs.mjs (optional packs CLI) — // listed REQUIRED so their absence from the tarball fails loudly. "scripts/packs/optionalPackInstaller.mjs", diff --git a/scripts/build/postinstall.mjs b/scripts/build/postinstall.mjs index 629228b433..fc404ce2b1 100644 --- a/scripts/build/postinstall.mjs +++ b/scripts/build/postinstall.mjs @@ -14,8 +14,7 @@ * * Modules repaired: * - better-sqlite3 (SQLite bindings) - * - wreq-js (TLS client for OAuth providers) - * - tls-client-node (TLS client for claude-web/grok-web/lmarena/perplexity-web) + * - wreq-js (TLS client for OAuth and web-cookie providers) * - sql.js (WASM SQLite fallback runtime) * - node-machine-id (local CLI machine-token server runtime) * @@ -26,15 +25,7 @@ * Fixes: https://github.com/diegosouzapw/OmniRoute/issues/7802 */ -import { - copyFileSync, - cpSync, - existsSync, - mkdirSync, - readFileSync, - readdirSync, - writeFileSync, -} from "node:fs"; +import { copyFileSync, cpSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; import { createRequire } from "node:module"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; @@ -42,8 +33,8 @@ import { fileURLToPath } from "node:url"; import { PUBLISHED_BUILD_ARCH, PUBLISHED_BUILD_PLATFORM } from "./native-binary-compat.mjs"; import { hasStandaloneAppBundle, isTermux } from "./postinstallSupport.mjs"; import { colocateLlmlinguaOptionals } from "./colocateOptionals.mjs"; -import { fixTlsClientNodeBinary } from "./fixTlsClientNodeBinary.mjs"; import { fixPlaywrightAndroid } from "./fixPlaywrightAndroid.mjs"; +import { resolveWreqJsNativeBinding, WREQ_JS_VERSION } from "./wreqJsNative.mjs"; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); @@ -262,105 +253,60 @@ async function fixBetterSqliteBinary() { console.warn(""); } -/** - * Fix wreq-js native binary for the standalone dist directory. - * - * wreq-js ships platform-specific .node binaries under rust/. - * The standalone build may only contain Linux binaries from the CI. - * This copies the correct platform binary from the root install. - * - * Fixes: https://github.com/diegosouzapw/OmniRoute/issues/1634 - */ +/** Copy the current wreq-js 3.2 optional binding into the standalone dist tree. */ async function fixWreqJsBinary() { - // wreq-js native module is not loadable in Termux (libgcc path mismatch). - // The runtime already falls back gracefully when wreq-js is unavailable. - if (process.platform === "android" || isTermux()) { - console.log( - " [postinstall] wreq-js: skipped on Termux/Android " + - "(libgcc not available — OAuth TLS fingerprinting will use the fallback path)" - ); - return; - } - - const appWreqDir = join(ROOT, "dist", "node_modules", "wreq-js", "rust"); - const rootWreqDir = join(ROOT, "node_modules", "wreq-js", "rust"); - if (!existsSync(join(ROOT, "dist", "node_modules", "wreq-js"))) { return; } - const binaryName = `wreq-js.${process.platform}-${process.arch}.node`; - const appBinaryPath = join(appWreqDir, binaryName); - const rootBinaryPath = join(rootWreqDir, binaryName); + const runtimePlatform = isTermux() ? "android" : process.platform; + const binding = resolveWreqJsNativeBinding({ + platform: runtimePlatform, + arch: process.arch, + }); + if (!binding) { + console.warn( + ` ⚠️ wreq-js ${WREQ_JS_VERSION} has no native binding for ` + + `${runtimePlatform}-${process.arch}.` + ); + return; + } + + const packageSegments = binding.packageName.split("/"); + const rootBindingDir = join(ROOT, "node_modules", ...packageSegments); + const appBindingDir = join(ROOT, "dist", "node_modules", ...packageSegments); + const rootBinaryPath = join(rootBindingDir, binding.fileName); + const appBinaryPath = join(appBindingDir, binding.fileName); - // Check if the platform binary already exists and loads if (existsSync(appBinaryPath)) { try { process.dlopen({ exports: {} }, appBinaryPath); - return; // Already working + return; } catch (err) { console.warn(` ⚠️ wreq-js binary exists but failed to load: ${err.message}`); } } - console.log(`\n 🔧 Fixing wreq-js binary for ${process.platform}-${process.arch}...`); + console.log(`\n 🔧 Fixing ${binding.packageName} for ${runtimePlatform}-${process.arch}...`); - // Strategy 1: Copy from root node_modules - if (existsSync(rootBinaryPath)) { + if (existsSync(rootBindingDir) && existsSync(rootBinaryPath)) { try { - mkdirSync(appWreqDir, { recursive: true }); - copyFileSync(rootBinaryPath, appBinaryPath); + mkdirSync(dirname(appBindingDir), { recursive: true }); + cpSync(rootBindingDir, appBindingDir, { recursive: true, force: true }); process.dlopen({ exports: {} }, appBinaryPath); - console.log(" ✅ wreq-js native module fixed successfully!\n"); + console.log(` ✅ ${binding.packageName} copied to standalone successfully!\n`); return; } catch (err) { - console.warn(` ⚠️ Copied wreq-js binary failed to load: ${err.message}`); + console.warn(` ⚠️ Copied ${binding.packageName} failed to load: ${err.message}`); } } - // Strategy 2: Copy entire rust/ directory from root (gets all platform binaries) - if (existsSync(rootWreqDir)) { - try { - mkdirSync(appWreqDir, { recursive: true }); - const files = readdirSync(rootWreqDir); - for (const file of files) { - if (file.endsWith(".node")) { - copyFileSync(join(rootWreqDir, file), join(appWreqDir, file)); - } - } - if (existsSync(appBinaryPath)) { - process.dlopen({ exports: {} }, appBinaryPath); - console.log(" ✅ wreq-js native module fixed (full copy) successfully!\n"); - return; - } - } catch (err) { - console.warn(` ⚠️ wreq-js full copy failed: ${err.message}`); - } - } - - // Strategy 3: Rebuild wreq-js inside dist/ - console.log(" 📥 Attempting npm rebuild wreq-js..."); - try { - const { execSync } = await import("node:child_process"); - execSync("npm rebuild wreq-js", { - cwd: join(ROOT, "dist"), - stdio: "inherit", - timeout: 120_000, - }); - if (existsSync(appBinaryPath)) { - process.dlopen({ exports: {} }, appBinaryPath); - console.log(" ✅ wreq-js native module rebuilt successfully!\n"); - return; - } - } catch (err) { - console.warn(` ⚠️ wreq-js rebuild failed: ${err.message}`); - } - console.warn( - `\n ⚠️ Could not fix wreq-js native module for ${process.platform}-${process.arch}.` + `\n ⚠️ Could not install ${binding.packageName}@${WREQ_JS_VERSION} for ` + + `${runtimePlatform}-${process.arch}.` ); - console.warn(" OAuth-based providers (Codex, Cursor, etc.) may not work."); - console.warn(` Manual fix: cd ${join(ROOT, "dist")} && npm install wreq-js --no-save\n`); + console.warn(" Browser-TLS OAuth and web-cookie providers may not work."); + console.warn(` Manual fix: npm install --include=optional wreq-js@${WREQ_JS_VERSION}\n`); } async function ensureSwcHelpers() { @@ -470,7 +416,6 @@ async function ensureStandaloneRuntimePackages() { await verifyDevNativeModules(); await fixBetterSqliteBinary(); await fixWreqJsBinary(); -await fixTlsClientNodeBinary({ rootDir: ROOT }); await fixPlaywrightAndroid({ rootDir: ROOT }); await ensureSwcHelpers(); await ensureStandaloneRuntimePackages(); diff --git a/scripts/build/wreqJsNative.mjs b/scripts/build/wreqJsNative.mjs new file mode 100644 index 0000000000..c032e82871 --- /dev/null +++ b/scripts/build/wreqJsNative.mjs @@ -0,0 +1,131 @@ +import { readFileSync } from "node:fs"; + +/** Exact native binding set published by wreq-js 3.2.0. */ +export const WREQ_JS_VERSION = "3.2.0"; + +export const WREQ_JS_NATIVE_BINDINGS = Object.freeze([ + { + target: "android-arm64", + packageName: "@wreq-js/binding-android-arm64", + fileName: "wreq-js.android-arm64.node", + platform: "android", + arch: "arm64", + }, + { + target: "darwin-arm64", + packageName: "@wreq-js/binding-darwin-arm64", + fileName: "wreq-js.darwin-arm64.node", + platform: "darwin", + arch: "arm64", + }, + { + target: "darwin-x64", + packageName: "@wreq-js/binding-darwin-x64", + fileName: "wreq-js.darwin-x64.node", + platform: "darwin", + arch: "x64", + }, + { + target: "linux-arm64-gnu", + packageName: "@wreq-js/binding-linux-arm64-gnu", + fileName: "wreq-js.linux-arm64-gnu.node", + platform: "linux", + arch: "arm64", + libc: "gnu", + }, + { + target: "linux-arm64-musl", + packageName: "@wreq-js/binding-linux-arm64-musl", + fileName: "wreq-js.linux-arm64-musl.node", + platform: "linux", + arch: "arm64", + libc: "musl", + }, + { + target: "linux-x64-gnu", + packageName: "@wreq-js/binding-linux-x64-gnu", + fileName: "wreq-js.linux-x64-gnu.node", + platform: "linux", + arch: "x64", + libc: "gnu", + }, + { + target: "linux-x64-musl", + packageName: "@wreq-js/binding-linux-x64-musl", + fileName: "wreq-js.linux-x64-musl.node", + platform: "linux", + arch: "x64", + libc: "musl", + }, + { + target: "win32-arm64-msvc", + packageName: "@wreq-js/binding-win32-arm64-msvc", + fileName: "wreq-js.win32-arm64-msvc.node", + platform: "win32", + arch: "arm64", + }, + { + target: "win32-x64-msvc", + packageName: "@wreq-js/binding-win32-x64-msvc", + fileName: "wreq-js.win32-x64-msvc.node", + platform: "win32", + arch: "x64", + }, +]); + +function readSystemLdd() { + const failures = []; + for (const lddPath of ["/usr/bin/ldd", "/bin/ldd"]) { + try { + return readFileSync(lddPath, "utf8"); + } catch (error) { + failures.push(error); + } + } + throw failures[0] ?? new Error("ldd is unavailable"); +} + +/** Detect the C library used by the current Linux runtime. */ +export function detectRuntimeLibc(options = {}) { + const platform = options.platform ?? process.platform; + if (platform !== "linux") return undefined; + const getReport = options.getReport ?? (() => process.report?.getReport()); + const readLdd = options.readLdd ?? readSystemLdd; + let reportError; + try { + const report = getReport(); + if (report?.header?.glibcVersionRuntime) return "gnu"; + if (report?.header) return "musl"; + } catch (error) { + reportError = error; + } + + let lddError; + try { + const ldd = String(readLdd()); + if (/\bmusl\b/i.test(ldd)) return "musl"; + if (/\b(?:glibc|gnu libc|gnu c library)\b/i.test(ldd)) return "gnu"; + lddError = new Error("ldd output did not identify glibc or musl"); + } catch (error) { + lddError = error; + } + + const detail = [reportError, lddError] + .filter((error) => error instanceof Error) + .map((error) => error.message) + .join("; "); + throw new Error(`Unable to detect Linux libc${detail ? `: ${detail}` : ""}`); +} + +/** Resolve the exact package and addon filename wreq-js 3.2.0 loads. */ +export function resolveWreqJsNativeBinding({ platform, arch, libc }) { + const runtimeLibc = platform === "linux" ? (libc ?? detectRuntimeLibc()) : undefined; + return ( + WREQ_JS_NATIVE_BINDINGS.find( + (binding) => + binding.platform === platform && + binding.arch === arch && + (binding.libc === undefined || binding.libc === runtimeLibc) + ) ?? null + ); +} diff --git a/src/lib/providers/validation/webProvidersA.ts b/src/lib/providers/validation/webProvidersA.ts index 5add578089..50b57eecac 100644 --- a/src/lib/providers/validation/webProvidersA.ts +++ b/src/lib/providers/validation/webProvidersA.ts @@ -287,7 +287,7 @@ export async function validateGrokWebProvider({ apiKey, providerSpecificData = { errorDetail = (response.text || "").slice(0, 240); } catch {} - // Detect Cloudflare challenge pages even with a 200 status from tls-client-node + // Detect Cloudflare challenge pages even when the browser transport reports status 200. if (isCloudflareChallenge(errorDetail)) { return { valid: false, @@ -455,7 +455,7 @@ export async function validatePerplexityWebProvider({ apiKey, providerSpecificDa valid: false, error: "Cloudflare is blocking connections from this server's IP (TLS fingerprint rejected). " + - "The session cookie may still be valid — install tls-client-node's native binary or route " + + "The session cookie may still be valid — verify the wreq-js 3.2 native binding or route " + "perplexity-web through a residential proxy.", }; } diff --git a/tests/unit/build/check-licenses.test.ts b/tests/unit/build/check-licenses.test.ts index 6ee28694db..746f9cc9dc 100644 --- a/tests/unit/build/check-licenses.test.ts +++ b/tests/unit/build/check-licenses.test.ts @@ -205,17 +205,17 @@ test("classifyLicense: exception does not apply to different package", () => { assert.equal(result.status, "denied", "exception must be per-package, not per-license"); }); -test("classifyLicense: exception with risk=medium still returns 'exception' (not denied)", () => { +test("classifyLicense: a medium-risk custom exception still returns 'exception'", () => { const allowlist = makeAllowlist({ exceptions: { - "tls-client-node": { - license: "Custom: LICENSE", - justification: "Commons Clause + Apache-2.0. TODO: revisar.", + "custom-runtime": { + license: "Custom: reviewed terms", + justification: "Reviewed custom runtime terms.", risk: "medium", }, }, }); - const result = classifyLicense("tls-client-node@0.2.0", "Custom: LICENSE", allowlist); + const result = classifyLicense("custom-runtime@1.0.0", "Custom: reviewed terms", allowlist); assert.equal(result.status, "exception"); }); @@ -285,13 +285,6 @@ test("loadAllowlist: exceptions entries have required fields", () => { } }); -test("loadAllowlist: tls-client-node exception has risk=medium (Commons Clause)", () => { - const allowlist = loadAllowlist(); - const exc = allowlist.exceptions["tls-client-node"] as any; - assert.ok(exc, "tls-client-node exception must be registered"); - assert.equal(exc.risk, "medium", "tls-client-node is a medium-risk exception (Commons Clause)"); -}); - test("loadAllowlist: LGPL packages have registered exceptions", () => { const allowlist = loadAllowlist(); const lgplPkgs = ["@img/sharp-libvips-linux-x64", "@img/sharp-libvips-linuxmusl-x64"]; @@ -326,12 +319,6 @@ test("integration: classifyLicense passes MIT packages against real allowlist", assert.equal(result.status, "allowed"); }); -test("integration: classifyLicense passes tls-client-node as exception against real allowlist", () => { - const allowlist = loadAllowlist(); - const result = classifyLicense("tls-client-node@0.2.0", "Custom: LICENSE", allowlist); - assert.equal(result.status, "exception"); -}); - test("integration: classifyLicense denies GPL-3.0 against real allowlist", () => { const allowlist = loadAllowlist(); const result = classifyLicense("hypothetical-gpl@1.0.0", "GPL-3.0", allowlist); diff --git a/tests/unit/build/standalone-bundle.test.ts b/tests/unit/build/standalone-bundle.test.ts index 1c8291e443..038779fa22 100644 --- a/tests/unit/build/standalone-bundle.test.ts +++ b/tests/unit/build/standalone-bundle.test.ts @@ -222,6 +222,11 @@ test("hydratePlatformNatives swaps install-machine-forked packages for this leg" '{"name":"@img/sharp-linux-x64"}' ); writeNative(standalone, "node_modules/@img/sharp-linux-x64/lib/index.js", "linux fork"); + writeNative( + standalone, + "node_modules/@wreq-js/binding-linux-x64-gnu/wreq-js.linux-x64-gnu.node", + "linux wreq" + ); writeNative(standalone, "node_modules/fsevents/fsevents.js", "mac only"); // This leg (darwin-arm64) resolved its own forks: different sharp, no fsevents. writeNative( @@ -230,6 +235,11 @@ test("hydratePlatformNatives swaps install-machine-forked packages for this leg" '{"name":"@img/sharp-darwin-arm64"}' ); writeNative(source, "node_modules/@img/sharp-darwin-arm64/lib/index.js", "darwin fork"); + writeNative( + source, + "node_modules/@wreq-js/binding-darwin-arm64/wreq-js.darwin-arm64.node", + "darwin wreq" + ); const result = hydratePlatformNatives({ standaloneNodeModules: path.join(standalone, "node_modules"), @@ -239,9 +249,16 @@ test("hydratePlatformNatives swaps install-machine-forked packages for this leg" // Platform forks ship under different package names, so hydration is // remove(standalone fork) + copy(this leg's fork); `replaced` stays empty // unless the exact same name exists on both sides. - assert.deepEqual(result.copied.sort(), ["@img/sharp-darwin-arm64"]); + assert.deepEqual(result.copied.sort(), [ + "@img/sharp-darwin-arm64", + "@wreq-js/binding-darwin-arm64", + ]); assert.deepEqual(result.replaced, []); - assert.deepEqual(result.removed.sort(), ["@img/sharp-linux-x64", "fsevents"]); + assert.deepEqual(result.removed.sort(), [ + "@img/sharp-linux-x64", + "@wreq-js/binding-linux-x64-gnu", + "fsevents", + ]); assert.ok( fs.existsSync( path.join(standalone, "node_modules", "@img", "sharp-darwin-arm64", "lib", "index.js") @@ -252,6 +269,18 @@ test("hydratePlatformNatives swaps install-machine-forked packages for this leg" !fs.existsSync(path.join(standalone, "node_modules", "@img", "sharp-linux-x64")), "linux fork removed" ); + assert.ok( + fs.existsSync( + path.join( + standalone, + "node_modules", + "@wreq-js", + "binding-darwin-arm64", + "wreq-js.darwin-arm64.node" + ) + ), + "darwin wreq binding copied in" + ); assert.ok( !fs.existsSync(path.join(standalone, "node_modules", "fsevents")), "fsevents dropped on non-matching leg" @@ -266,9 +295,8 @@ test("verifyBundledNatives asserts serviceability and honors the onnx darwin-x64 const root = tmpDir("s8-natives-"); try { const nm = path.join(root, "node_modules"); - writeNative(nm, "koffi/build/koffi/linux_x64/koffi.node", "elf"); writeNative(nm, "better-sqlite3/prebuilds/linux-x64.node", "napi"); - writeNative(nm, "wreq-js/rust/wreq-js.linux-x64-gnu.node", "rust"); + writeNative(nm, "@wreq-js/binding-linux-x64-gnu/wreq-js.linux-x64-gnu.node", "rust"); writeNative(nm, "onnxruntime-node/bin/napi-v6/linux/x64/libonnxruntime.so", "ort"); const good = verifyBundledNatives({ nodeModulesDir: nm, platform: "linux", arch: "x64" }); @@ -278,20 +306,21 @@ test("verifyBundledNatives asserts serviceability and honors the onnx darwin-x64 `expected serviceable: ${(good as { errors?: string[] }).errors?.join("; ")}` ); - const missingKoffi = verifyBundledNatives({ + const missingPlatformNatives = verifyBundledNatives({ nodeModulesDir: nm, platform: "darwin", arch: "arm64", }); - assert.equal(missingKoffi.ok, false); - assert.ok((missingKoffi as { errors: string[] }).errors.some((e) => e.startsWith("koffi:"))); + assert.equal(missingPlatformNatives.ok, false); + assert.ok( + (missingPlatformNatives as { errors: string[] }).errors.some((e) => e.startsWith("wreq-js:")) + ); // darwin-x64 has no onnxruntime-node prebuild at all — the exemption must keep it green // as long as the other bundled natives service that triple. const nm2 = path.join(root, "node_modules2"); - writeNative(nm2, "koffi/build/koffi/darwin_x64/koffi.node", "macho"); writeNative(nm2, "better-sqlite3/prebuilds/darwin-x64.node", "napi"); - writeNative(nm2, "wreq-js/rust/wreq-js.darwin-x64.node", "rust"); + writeNative(nm2, "@wreq-js/binding-darwin-x64/wreq-js.darwin-x64.node", "rust"); const exempted = verifyBundledNatives({ nodeModulesDir: nm2, platform: "darwin", arch: "x64" }); assert.equal( exempted.ok, diff --git a/tests/unit/claude-web-slow-first-byte.test.ts b/tests/unit/claude-web-slow-first-byte.test.ts index 7a67e74151..2d1386db99 100644 --- a/tests/unit/claude-web-slow-first-byte.test.ts +++ b/tests/unit/claude-web-slow-first-byte.test.ts @@ -1,5 +1,4 @@ import assert from "node:assert/strict"; -import { writeFile } from "node:fs/promises"; import test from "node:test"; import { tlsFetchStreaming } from "../../open-sse/services/claudeTlsClient.ts"; @@ -15,19 +14,17 @@ const SSE_BODY = [ test("Claude Web keeps waiting when the first Opus SSE event takes longer than five seconds", async () => { const client = { - request: async (_url: string, options: Record) => { - await new Promise((resolve) => setTimeout(resolve, SLOW_FIRST_BYTE_MS)); - await writeFile(String(options.streamOutputPath), SSE_BODY); - return { - status: 200, - headers: {}, - body: "", - cookies: {}, - text: async () => "", - json: async () => ({}), - bytes: async () => new Uint8Array(), - }; - }, + request: async () => + new Response( + new ReadableStream({ + async pull(controller) { + await new Promise((resolve) => setTimeout(resolve, SLOW_FIRST_BYTE_MS)); + controller.enqueue(new TextEncoder().encode(SSE_BODY)); + controller.close(); + }, + }), + { status: 200, headers: { "content-type": "text/event-stream" } } + ), }; const result = await tlsFetchStreaming( diff --git a/tests/unit/executor-notion-web.test.ts b/tests/unit/executor-notion-web.test.ts index ca2da88ab4..8962f4d086 100644 --- a/tests/unit/executor-notion-web.test.ts +++ b/tests/unit/executor-notion-web.test.ts @@ -9,13 +9,15 @@ import assert from "node:assert/strict"; const mod = await import("../../open-sse/executors/notion-web.ts"); const { getModelsByProviderId } = await import("../../open-sse/config/providerModels.ts"); const { WEB_COOKIE_PROVIDERS } = await import("../../src/shared/constants/providers/web-cookie.ts"); -const { __setTlsFetchOverrideForTesting } = await import( - "../../open-sse/services/notionTlsClient.ts" -); +const { __setTlsFetchOverrideForTesting, TlsClientUnavailableError } = + await import("../../open-sse/services/notionTlsClient.ts"); /** Mock the Chrome-JA3 path used by sendNotionInferenceRequest (not global fetch). */ function installNotionTlsMock( - handler: (url: string, opts: { headers?: Record; body?: string }) => Promise<{ + handler: ( + url: string, + opts: { headers?: Record; body?: string } + ) => Promise<{ status: number; text: string; }> @@ -389,6 +391,42 @@ describe("NotionWebExecutor — upstream translation (mocked TLS fetch)", () => } }); + it("fails closed without plain fetch when the binding is unavailable behind a proxy", async () => { + const executor = new mod.NotionWebExecutor(); + const previousHttpsProxy = process.env.HTTPS_PROXY; + const previousFetch = globalThis.fetch; + let resolvedProxyUrl: string | undefined; + let plainFetchCalls = 0; + process.env.HTTPS_PROXY = "http://account-proxy.test:8080"; + __setTlsFetchOverrideForTesting(async (_url, options) => { + resolvedProxyUrl = options.proxyUrl; + throw new TlsClientUnavailableError("native binding unavailable"); + }); + globalThis.fetch = (async () => { + plainFetchCalls += 1; + return new Response("plain fallback must not run", { status: 200 }); + }) as typeof fetch; + + try { + const result = await executor.execute({ + model: "notion-ai", + body: { messages: [{ role: "user", content: "hi" }] }, + stream: false, + credentials: { apiKey: COOKIE_WITH_SPACE }, + signal: null, + } as never); + + assert.equal(result.response.status, 502); + assert.equal(resolvedProxyUrl, "http://account-proxy.test:8080"); + assert.equal(plainFetchCalls, 0, "plain fetch would bypass the resolved proxy"); + } finally { + __setTlsFetchOverrideForTesting(null); + globalThis.fetch = previousFetch; + if (previousHttpsProxy === undefined) delete process.env.HTTPS_PROXY; + else process.env.HTTPS_PROXY = previousHttpsProxy; + } + }); + it("surfaces nested patch-start temporarily-unavailable as a typed error (not empty-body 502)", async () => { const executor = new mod.NotionWebExecutor(); const restore = installNotionTlsMock(async () => ({ @@ -529,9 +567,7 @@ describe("buildNotionTranscript", () => { }, { role: "user", - content: [ - { type: "text", text: "find icon skill" }, - ] as unknown as string, + content: [{ type: "text", text: "find icon skill" }] as unknown as string, }, ], { spaceId: "s1" } diff --git a/tests/unit/fix-tls-client-node-binary-7802.test.ts b/tests/unit/fix-tls-client-node-binary-7802.test.ts deleted file mode 100644 index 80d735d1cb..0000000000 --- a/tests/unit/fix-tls-client-node-binary-7802.test.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { test } from "node:test"; -import assert from "node:assert/strict"; -import { mkdtempSync, mkdirSync, writeFileSync, existsSync, readdirSync, rmSync } from "node:fs"; -import { tmpdir } from "node:os"; -import { join } from "node:path"; - -import { fixTlsClientNodeBinary } from "../../scripts/build/fixTlsClientNodeBinary.mjs"; - -function makeRoot() { - return mkdtempSync(join(tmpdir(), "fix-tls-client-node-binary-7802-")); -} - -function collectLogs() { - const logs: string[] = []; - return { logs, log: (m: string) => logs.push(m) }; -} - -test("no-ops when node_modules/tls-client-node is absent (module not installed)", async () => { - const rootDir = makeRoot(); - try { - const { logs, log } = collectLogs(); - await fixTlsClientNodeBinary({ rootDir, log }); - assert.deepEqual(logs, []); - } finally { - rmSync(rootDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); - } -}); - -test("copies an already-populated root bin/ into the standalone dist bundle (#7802 item 2)", async () => { - const rootDir = makeRoot(); - try { - const rootBin = join(rootDir, "node_modules", "tls-client-node", "bin"); - mkdirSync(rootBin, { recursive: true }); - writeFileSync(join(rootBin, "tls-client-linux-ubuntu-amd64-1.0.0.so"), "fake-binary"); - - const distTlsClientDir = join(rootDir, "dist", "node_modules", "tls-client-node"); - mkdirSync(distTlsClientDir, { recursive: true }); - - const { log } = collectLogs(); - await fixTlsClientNodeBinary({ rootDir, log }); - - const distBin = join(distTlsClientDir, "bin"); - assert.ok(existsSync(distBin), "dist bin/ should have been created"); - assert.deepEqual(readdirSync(distBin), ["tls-client-linux-ubuntu-amd64-1.0.0.so"]); - } finally { - rmSync(rootDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); - } -}); - -test("retries the download when root bin/ is empty, and stops once a file appears (#7802 item 3)", async () => { - const rootDir = makeRoot(); - try { - const tlsClientDir = join(rootDir, "node_modules", "tls-client-node"); - const rootBin = join(tlsClientDir, "bin"); - mkdirSync(rootBin, { recursive: true }); - - const scriptsDir = join(tlsClientDir, "scripts"); - mkdirSync(scriptsDir, { recursive: true }); - // A postinstall.js stand-in that drops a file into bin/ on its 2nd invocation — - // simulating a first attempt eaten by a GitHub rate-limit and a 2nd that recovers. - writeFileSync( - join(scriptsDir, "postinstall.js"), - `const fs = require("fs"); - const path = require("path"); - const marker = path.join(__dirname, "..", ".attempts"); - const attempts = fs.existsSync(marker) ? Number(fs.readFileSync(marker, "utf8")) : 0; - fs.writeFileSync(marker, String(attempts + 1)); - if (attempts + 1 >= 2) { - fs.writeFileSync(path.join(__dirname, "..", "bin", "tls-client-linux-ubuntu-amd64-1.0.0.so"), "ok"); - }` - ); - - const { logs, log } = collectLogs(); - await fixTlsClientNodeBinary({ rootDir, log, retryDelaysMs: [1, 1, 1] }); - - assert.ok(existsSync(join(rootBin, "tls-client-linux-ubuntu-amd64-1.0.0.so"))); - assert.ok( - logs.some((m) => m.includes("fetched successfully")), - "expected a success log once the retry recovered" - ); - } finally { - rmSync(rootDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); - } -}); - -test("warns without throwing when every retry leaves bin/ empty (still rate-limited)", async () => { - const rootDir = makeRoot(); - try { - const tlsClientDir = join(rootDir, "node_modules", "tls-client-node"); - mkdirSync(join(tlsClientDir, "bin"), { recursive: true }); - const scriptsDir = join(tlsClientDir, "scripts"); - mkdirSync(scriptsDir, { recursive: true }); - // A postinstall.js stand-in that always fails to produce a binary (persistent rate-limit). - writeFileSync(join(scriptsDir, "postinstall.js"), `process.exitCode = 0;`); - - const originalWarn = console.warn; - const warnings: string[] = []; - console.warn = (m: string) => warnings.push(m); - try { - const { log } = collectLogs(); - await assert.doesNotReject(fixTlsClientNodeBinary({ rootDir, log, retryDelaysMs: [1, 1] })); - } finally { - console.warn = originalWarn; - } - - assert.ok( - warnings.some((m) => m.includes("Could not fetch tls-client-node")), - "expected a clear warning pointing at the manual fix, not a silent no-op" - ); - } finally { - rmSync(rootDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); - } -}); diff --git a/tests/unit/pack-artifact-policy.test.ts b/tests/unit/pack-artifact-policy.test.ts index 46f3b42f50..1f9c6bed5f 100644 --- a/tests/unit/pack-artifact-policy.test.ts +++ b/tests/unit/pack-artifact-policy.test.ts @@ -268,6 +268,9 @@ test("findMissingArtifactPaths flags missing root runtime files in the tarball", "bin/mcp-server.mjs", "bin/mcpStdioConsoleGuard.mjs", "bin/nodeRuntimeSupport.mjs", + "config/release/wreq-js-native-manifest.json", + "config/release/wreq-js-rust-license-inventory.json", + "config/release/wreq-js-rust-notices.md", "dist/head-response-guard.cjs", "dist/http-method-guard.cjs", "dist/main-server-timeouts.mjs", @@ -282,9 +285,9 @@ test("findMissingArtifactPaths flags missing root runtime files in the tarball", "dist/tls-options.mjs", "dist/webdav-handler.mjs", "scripts/build/colocateOptionals.mjs", - "scripts/build/fixTlsClientNodeBinary.mjs", "scripts/build/native-binary-compat.mjs", "scripts/build/runtime-env.mjs", + "scripts/build/wreqJsNative.mjs", "scripts/packs/optionalPackInstaller.mjs", "scripts/packs/optionalPackManifest.mjs", "src/shared/utils/nodeRuntimeSupport.ts", diff --git a/tests/unit/probe-7134-claude-web-empty-error-body.test.ts b/tests/unit/probe-7134-claude-web-empty-error-body.test.ts index b62659616a..17ccbff391 100644 --- a/tests/unit/probe-7134-claude-web-empty-error-body.test.ts +++ b/tests/unit/probe-7134-claude-web-empty-error-body.test.ts @@ -1,25 +1,16 @@ import test from "node:test"; import assert from "node:assert/strict"; -import { writeFile } from "node:fs/promises"; // Issue #7134 — claude-web reported "Claude Web API error (400) with no // response body" even when Claude's upstream DID send a real JSON error body. // -// Root cause: tlsFetchStreaming() streams the upstream response to a temp -// file via tls-client-node's `streamOutputPath` mode. For a non-SSE, -// non-2xx response, the native binding resolves with an EMPTY in-memory -// `body` field (it only populates `body` for its non-streaming mode) even -// though the real error bytes were already written to the temp file and -// even peeked (`looksLikeSse`) to decide the response wasn't SSE. The old -// code read the empty `r.body` instead of the file it just peeked, throwing -// away the real upstream error detail. +// The browser transport must peek a requested stream to distinguish SSE from +// an upstream JSON error. Once it decides the response is not SSE, it must +// buffer the same native body stream without discarding the bytes it peeked. // // This test injects a fake `client` (matching the `{ request }` shape -// tlsFetchStreaming already accepts for DI) that reproduces the exact -// tls-client-node contract under `streamOutputPath`: write bytes to the file, -// resolve with an empty `body`. No `--experimental-test-module-mocks` flag -// needed — this exercises the real, unmodified `tlsFetchStreaming` via -// dependency injection instead of module-mocking `tls-client-node`. +// tlsFetchStreaming accepts for DI). No experimental module mocks are needed: +// the test exercises the production wreq response-stream path directly. const { tlsFetchStreaming } = await import("../../open-sse/services/claudeTlsClient.ts"); @@ -33,21 +24,16 @@ const REAL_CLAUDE_ERROR_BODY = JSON.stringify({ function makeFakeClient(status: number, bodyOnFile: string) { return { - request: async (_url: string, opts: Record) => { - const streamOutputPath = opts.streamOutputPath as string; - await writeFile(streamOutputPath, bodyOnFile); - return { - status, - headers: {}, - // tls-client-node does not populate `body` for streamed requests — - // this is the exact defect condition. - body: "", - cookies: {}, - text: async () => "", - json: async () => ({}), - bytes: async () => new Uint8Array(), - }; - }, + request: async () => + new Response( + new ReadableStream({ + start(controller) { + controller.enqueue(new TextEncoder().encode(bodyOnFile)); + controller.close(); + }, + }), + { status } + ), }; } @@ -73,19 +59,11 @@ test("issue #7134: tlsFetchStreaming surfaces the real error body for a non-SSE test("issue #7134: tlsFetchStreaming still uses r.body when the native client DOES populate it", async () => { const client = { - request: async (_url: string, opts: Record) => { - const streamOutputPath = opts.streamOutputPath as string; - await writeFile(streamOutputPath, "{}"); - return { - status: 403, - headers: {}, - body: "populated body from native client", - cookies: {}, - text: async () => "", - json: async () => ({}), - bytes: async () => new Uint8Array(), - }; - }, + request: async () => ({ + status: 403, + headers: {}, + body: "populated body from native client", + }), }; const result = await tlsFetchStreaming( diff --git a/tests/unit/provider-validation-specialty.test.ts b/tests/unit/provider-validation-specialty.test.ts index bc0d1abfac..9cc310fddd 100644 --- a/tests/unit/provider-validation-specialty.test.ts +++ b/tests/unit/provider-validation-specialty.test.ts @@ -2354,7 +2354,7 @@ test("claude-web validator: 500 → Claude.ai unavailable", async () => { test("claude-web validator: TLS client unavailable → clear error", async () => { const { TlsClientUnavailableError } = await import("../../open-sse/services/claudeTlsClient.ts"); __setClaudeTlsFetchOverride(async () => { - throw new TlsClientUnavailableError("tls-client-node not installed"); + throw new TlsClientUnavailableError("wreq-js 3.2 native binding unavailable"); }); const result = await validateProviderApiKey({ @@ -2363,7 +2363,7 @@ test("claude-web validator: TLS client unavailable → clear error", async () => }); assert.equal(result.valid, false); - assert.match(result.error || "", /tls-client-node not installed/i); + assert.match(result.error || "", /wreq-js 3\.2 native binding unavailable/i); __setClaudeTlsFetchOverride(null); }); diff --git a/tests/unit/tls-client-download-dir-8579.test.ts b/tests/unit/tls-client-download-dir-8579.test.ts deleted file mode 100644 index 11795f072a..0000000000 --- a/tests/unit/tls-client-download-dir-8579.test.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { test, afterEach } from "node:test"; -import assert from "node:assert/strict"; -import { mkdtempSync } from "node:fs"; -import { join } from "node:path"; -import { tmpdir } from "node:os"; -import { readFileSync } from "node:fs"; -import { fileURLToPath } from "node:url"; -import { dirname } from "node:path"; - -const __dirname = dirname(fileURLToPath(import.meta.url)); -const ROOT = join(__dirname, "..", ".."); - -const TLS_CLIENT_WRAPPERS = [ - "open-sse/services/claudeTlsClient.ts", - "open-sse/services/grokTlsClient.ts", - "open-sse/services/perplexityTlsClient.ts", - "open-sse/services/lmarenaTlsClient.ts", - "open-sse/services/notionTlsClient.ts", -] as const; - -const originalDataDir = process.env.DATA_DIR; - -afterEach(() => { - if (originalDataDir === undefined) { - delete process.env.DATA_DIR; - } else { - process.env.DATA_DIR = originalDataDir; - } -}); - -test("resolveTlsClientDownloadDir caches native binary under DATA_DIR/tls-client/bin (#8579)", async () => { - const dataDir = mkdtempSync(join(tmpdir(), "omniroute-tls-client-8579-")); - process.env.DATA_DIR = dataDir; - - const { resolveTlsClientDownloadDir } = - await import("../../open-sse/services/tlsClientDownloadDir.ts"); - - assert.equal(resolveTlsClientDownloadDir(), join(dataDir, "tls-client", "bin")); -}); - -test("buildNativeTlsClientOptions passes downloadDir to tls-client-node (#8579)", async () => { - const dataDir = mkdtempSync(join(tmpdir(), "omniroute-tls-client-opts-8579-")); - process.env.DATA_DIR = dataDir; - - const { buildNativeTlsClientOptions } = - await import("../../open-sse/services/tlsClientDownloadDir.ts"); - - const options = buildNativeTlsClientOptions(); - - assert.equal(options.runtimeMode, "native"); - assert.equal(options.downloadDir, join(dataDir, "tls-client", "bin")); -}); - -test("all remaining web-provider tls clients wire downloadDir through buildNativeTlsClientOptions (#8579)", () => { - const base = readFileSync(join(ROOT, "open-sse/services/tlsClientBase.ts"), "utf8"); - assert.match( - base, - /buildNativeTlsClientOptions\(\)/, - "tlsClientBase.ts must pass buildNativeTlsClientOptions() to TLSClient" - ); - assert.doesNotMatch( - base, - /new TLSClient\(\{\s*runtimeMode:\s*"native"\s*\}\)/, - "tlsClientBase.ts must not construct TLSClient without downloadDir" - ); - - for (const relPath of TLS_CLIENT_WRAPPERS) { - const source = readFileSync(join(ROOT, relPath), "utf8"); - assert.match( - source, - /createTlsClientModule\(/, - `${relPath} must go through createTlsClientModule so downloadDir is inherited` - ); - assert.doesNotMatch( - source, - /new TLSClient\(\{\s*runtimeMode:\s*"native"\s*\}\)/, - `${relPath} must not construct TLSClient without downloadDir` - ); - } -}); diff --git a/tests/unit/tls-client-node-docker-binary-7802.test.ts b/tests/unit/tls-client-node-docker-binary-7802.test.ts deleted file mode 100644 index 6aedeaa835..0000000000 --- a/tests/unit/tls-client-node-docker-binary-7802.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { test } from "node:test"; -import assert from "node:assert/strict"; -import { readFileSync } from "node:fs"; -import { fileURLToPath } from "node:url"; -import { dirname, join } from "node:path"; - -const __dirname = dirname(fileURLToPath(import.meta.url)); -const ROOT = join(__dirname, "..", ".."); - -test("Dockerfile's --ignore-scripts npm ci is compensated for tls-client-node's native binary, same as it is for wreq-js and better-sqlite3 (#7802)", () => { - const dockerfile = readFileSync(join(ROOT, "Dockerfile"), "utf8"); - const postinstall = readFileSync(join(ROOT, "scripts/build/postinstall.mjs"), "utf8"); - - assert.match( - dockerfile, - // Flag-order tolerant on purpose: the assertion is about the --ignore-scripts - // PRECONDITION, not the exact flag list. #9185 inserted --include=optional - // (LLMLingua optional deps) and broke the literal pin without touching intent. - /npm ci(?: --[\w-]+(?:=[\w-]+)?)* --ignore-scripts/, - "expected the builder stage to install with --ignore-scripts (precondition of #7802)" - ); - - assert.match( - dockerfile, - /better-sqlite3[\s\S]*node-gyp\.js rebuild/, - "expected an explicit better-sqlite3 rebuild step after --ignore-scripts" - ); - - assert.match( - postinstall, - /fixWreqJsBinary/, - "expected postinstall.mjs to repair wreq-js's native binary" - ); - - const dockerfileHandlesIt = /tls-client-node[\s\S]{0,200}(postinstall|rebuild|download)/i.test( - dockerfile - ); - const postinstallHandlesIt = /tls-client-node/i.test(postinstall); - - assert.ok( - dockerfileHandlesIt || postinstallHandlesIt, - "tls-client-node has no --ignore-scripts compensation in Dockerfile or " + - "scripts/build/postinstall.mjs (unlike better-sqlite3 and wreq-js) — " + - "node_modules/tls-client-node/bin/ is never populated in the official " + - "Docker image, so claude-web/grok-web/lmarena/perplexity-web " + - "all fail with TlsClientUnavailableError at first request (#7802)" - ); -}); diff --git a/tests/unit/tls-client-wreq-migration.test.ts b/tests/unit/tls-client-wreq-migration.test.ts new file mode 100644 index 0000000000..7d0366a434 --- /dev/null +++ b/tests/unit/tls-client-wreq-migration.test.ts @@ -0,0 +1,1373 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import { createTlsClientModule } from "../../open-sse/services/tlsClientBase.ts"; +import { + TlsClient, + createWreqTransportClient, + type WreqTransportResponseLike, +} from "../../open-sse/utils/tlsClient.ts"; + +const encoder = new TextEncoder(); + +type LeaseRequest = Promise & { + invalidateTransport: () => void; + releaseTransport: () => void; +}; + +type TlsUtilsWithLifecycleTestSeam = typeof import("../../open-sse/utils/tlsClient.ts") & { + __closeWreqLifecycleResourcesForTesting?: () => Promise; +}; + +async function waitForCondition(condition: () => boolean): Promise { + for (let attempt = 0; attempt < 50; attempt += 1) { + if (condition()) return; + await new Promise((resolve) => setTimeout(resolve, 1)); + } + assert.fail("condition did not become true"); +} + +test("stream EOF filtering recognizes a sentinel fragmented across native chunks", async () => { + const module = createTlsClientModule({ + providerName: "Test", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "exclude", + responseValidation: "cf", + exportCloudflareCheck: false, + exposeStreamingForTesting: true, + }); + const client = { + async request() { + const chunks = ['{"answer":"ok"}\n[DO', "NE]ignored"]; + return new Response( + new ReadableStream({ + async pull(controller) { + const next = chunks.shift(); + if (next === undefined) { + controller.close(); + return; + } + if (chunks.length === 0) await new Promise((resolve) => setTimeout(resolve, 25)); + controller.enqueue(encoder.encode(next)); + }, + }), + { status: 200 } + ); + }, + }; + + const result = await module.__tlsFetchStreamingForTesting!( + client, + "https://example.test/stream", + { method: "POST" }, + "[DONE]", + null, + 1_000, + 1_000 + ); + + assert.ok(result.body); + assert.equal(await new Response(result.body).text(), '{"answer":"ok"}\n'); +}); + +test("stream EOF filtering recognizes a fragmented sentinel after an isolated CR", async () => { + const module = createTlsClientModule({ + providerName: "Test", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "exclude", + responseValidation: "cf", + exportCloudflareCheck: false, + exposeStreamingForTesting: true, + }); + const client = { + async request() { + const chunks = ['{"answer":"ok"}\r[DO', "NE]ignored"]; + return new Response( + new ReadableStream({ + pull(controller) { + const next = chunks.shift(); + if (next === undefined) controller.close(); + else controller.enqueue(encoder.encode(next)); + }, + }), + { status: 200 } + ); + }, + }; + + const result = await module.__tlsFetchStreamingForTesting!( + client, + "https://example.test/stream", + { method: "POST" }, + "[DONE]", + null, + 1_000, + 1_000 + ); + + assert.ok(result.body); + assert.equal(await new Response(result.body).text(), '{"answer":"ok"}\r'); +}); + +test("wreq transports are isolated by browser, OS, and resolved proxy without a cookie jar", async () => { + const transportOptions: Array> = []; + const transports: Array<{ id: number; close(): Promise }> = []; + const fetchCalls: Array<{ url: string; options: Record }> = []; + const runtime = { + async createTransport(options: Record) { + transportOptions.push(options); + const transport = { id: transports.length + 1, async close() {} }; + transports.push(transport); + return transport; + }, + async fetch(url: string, options: Record) { + fetchCalls.push({ url, options }); + return new Response("ok", { + status: 200, + headers: [["set-cookie", "upstream=one; Path=/"]], + }); + }, + }; + const module = createTlsClientModule({ + providerName: "Test", + tlsProfile: "chrome_146", + emulationOs: "linux", + domain: "https://example.test", + streamEofPolicy: "include", + responseValidation: "sse", + exportCloudflareCheck: false, + wreqRuntimeLoader: async () => runtime, + }); + + const first = await module.tlsFetch("https://example.test/one", { + proxyUrl: "http://proxy-a.test:8080", + }); + const second = await module.tlsFetch("https://example.test/two", { + proxyUrl: "http://proxy-a.test:8080", + }); + await module.tlsFetch("https://example.test/three", { + proxyUrl: "http://proxy-b.test:8080", + }); + + assert.equal(first.text, "ok"); + assert.equal(second.text, "ok"); + assert.deepEqual(transportOptions, [ + { browser: "chrome_146", os: "linux", proxy: "http://proxy-a.test:8080" }, + { browser: "chrome_146", os: "linux", proxy: "http://proxy-b.test:8080" }, + ]); + assert.equal(fetchCalls[0]?.options.transport, transports[0]); + assert.equal(fetchCalls[1]?.options.transport, transports[0]); + assert.equal(fetchCalls[2]?.options.transport, transports[1]); + assert.equal(fetchCalls[0]?.options.cookieMode, "ephemeral"); + assert.equal("session" in (fetchCalls[0]?.options ?? {}), false); + assert.equal("sessionId" in (fetchCalls[0]?.options ?? {}), false); +}); + +test("a stale request lease cannot invalidate a healthy replacement transport", async () => { + const transports: Array<{ id: number; closed: boolean; close(): Promise }> = []; + const fetchTransports: number[] = []; + const runtime = { + async createTransport() { + const transport = { + id: transports.length + 1, + closed: false, + async close() { + this.closed = true; + }, + }; + transports.push(transport); + return transport; + }, + async fetch(url: string, options: Record) { + fetchTransports.push((options.transport as { id: number }).id); + if (url.endsWith("/replacement")) return new Response("healthy"); + return new Promise(() => {}); + }, + }; + const client = createWreqTransportClient({ + browser: "chrome_146", + os: "linux", + runtimeLoader: async () => runtime, + }); + const optionsA = { proxyUrl: "http://shared.proxy.test:8080" }; + const optionsB = { proxyUrl: "http://shared.proxy.test:8080" }; + const requestA = client.request("https://example.test/a", optionsA) as LeaseRequest; + const requestB = client.request("https://example.test/b", optionsB) as LeaseRequest; + + assert.equal(typeof requestA.invalidateTransport, "function"); + assert.equal(typeof requestB.invalidateTransport, "function"); + await waitForCondition(() => fetchTransports.length === 2); + assert.deepEqual(fetchTransports, [1, 1]); + + requestA.invalidateTransport(); + await waitForCondition(() => transports[0]?.closed === true); + + const replacement = client.request("https://example.test/replacement", { + proxyUrl: "http://shared.proxy.test:8080", + }) as LeaseRequest; + const replacementResponse = await replacement; + assert.equal(await new Response(replacementResponse.body).text(), "healthy"); + assert.equal(fetchTransports.at(-1), 2); + assert.equal(transports[1]?.closed, false); + + requestB.invalidateTransport(); + await new Promise((resolve) => setTimeout(resolve, 1)); + assert.equal(transports[1]?.closed, false, "stale generation must not close replacement"); + replacement.releaseTransport(); +}); + +test("the transport pool evicts the least-recently-used idle proxy at its configured cap", async () => { + const transports: Array<{ id: number; closed: boolean; close(): Promise }> = []; + const runtime = { + async createTransport() { + const transport = { + id: transports.length + 1, + closed: false, + async close() { + this.closed = true; + }, + }; + transports.push(transport); + return transport; + }, + async fetch() { + return new Response("ok"); + }, + }; + const client = createWreqTransportClient({ + browser: "chrome_146", + os: "linux", + runtimeLoader: async () => runtime, + maxTransports: 2, + }); + + const request = async (proxyUrl: string): Promise => { + const pending = client.request("https://example.test", { proxyUrl }) as LeaseRequest; + await pending; + pending.releaseTransport(); + }; + + await request("http://proxy-a.test:8080"); + await request("http://proxy-b.test:8080"); + await request("http://proxy-a.test:8080"); + await request("http://proxy-c.test:8080"); + await waitForCondition(() => transports[1]?.closed === true); + + assert.equal(transports.length, 3); + assert.equal(transports[0]?.closed, false, "recently reused proxy A stays pooled"); + assert.equal(transports[1]?.closed, true, "least-recently-used proxy B is evicted"); + assert.equal(transports[2]?.closed, false, "new proxy C stays pooled"); +}); + +test("a closing native transport still consumes capacity until close settles", async () => { + let releaseClose = (): void => {}; + const closeGate = new Promise((resolve) => { + releaseClose = resolve; + }); + const transports: Array<{ id: number; close(): Promise }> = []; + const runtime = { + async createTransport() { + const transport = { + id: transports.length + 1, + async close() { + if (this.id === 1) await closeGate; + }, + }; + transports.push(transport); + return transport; + }, + async fetch() { + return new Response("ok"); + }, + }; + const client = createWreqTransportClient({ + browser: "chrome_146", + os: "linux", + runtimeLoader: async () => runtime, + maxTransports: 1, + }); + + const first = client.request("https://example.test", { + proxyUrl: "http://proxy-a.test:8080", + }) as LeaseRequest; + await first; + first.releaseTransport(); + + const replacement = client.request("https://example.test", { + proxyUrl: "http://proxy-b.test:8080", + }) as LeaseRequest; + const beforeClose = await Promise.race([ + replacement.then(() => "resolved" as const), + new Promise<"pending">((resolve) => setTimeout(() => resolve("pending"), 20)), + ]); + assert.equal(beforeClose, "pending"); + assert.equal(transports.length, 1, "no replacement is created while native close is pending"); + + const overCapacity = client.request("https://example.test", { + proxyUrl: "http://proxy-c.test:8080", + }) as LeaseRequest; + await assert.rejects(overCapacity, (error: unknown) => { + assert.equal((error as Error & { code?: string }).code, "TLS_SESSION_CAPACITY"); + return true; + }); + assert.equal(transports.length, 1); + + releaseClose(); + await replacement; + replacement.releaseTransport(); + assert.equal(transports.length, 2); +}); + +test("first-use fan-out cannot reserve more native transports than the hard cap", async () => { + let created = 0; + const runtime = { + async createTransport() { + created += 1; + return { async close() {} }; + }, + async fetch() { + return new Response("ok"); + }, + }; + const client = createWreqTransportClient({ + browser: "chrome_146", + os: "linux", + runtimeLoader: async () => runtime, + maxTransports: 1, + }); + const requests = [ + client.request("https://example.test/a", { + proxyUrl: "http://proxy-a.test:8080", + }) as LeaseRequest, + client.request("https://example.test/b", { + proxyUrl: "http://proxy-b.test:8080", + }) as LeaseRequest, + ]; + + const results = await Promise.allSettled(requests); + assert.equal(results.filter((result) => result.status === "fulfilled").length, 1); + assert.equal(results.filter((result) => result.status === "rejected").length, 1); + const rejection = results.find((result) => result.status === "rejected"); + assert.equal( + rejection?.status === "rejected" + ? (rejection.reason as Error & { code?: string }).code + : undefined, + "TLS_SESSION_CAPACITY" + ); + assert.equal(created, 1); + requests.forEach((request) => request.releaseTransport()); +}); + +test("one lifecycle cleanup closes persistent sessions and ephemeral transports", async () => { + let sessionClosed = false; + let transportClosed = false; + const persistentClient = Reflect.construct(TlsClient, [ + async () => ({ + async fetch() { + return { + status: 200, + statusText: "OK", + headers: new Headers(), + body: null, + }; + }, + async close() { + sessionClosed = true; + }, + }), + 128, + true, + ]) as TlsClient; + const transportClient = createWreqTransportClient({ + browser: "chrome_146", + os: "linux", + runtimeLoader: async () => ({ + async createTransport() { + return { + async close() { + transportClosed = true; + }, + }; + }, + async fetch() { + return new Response("ok"); + }, + }), + }); + + await persistentClient.fetch("https://example.test", { proxy: null }); + const transportRequest = transportClient.request("https://example.test", {}) as LeaseRequest; + await transportRequest; + transportRequest.releaseTransport(); + + const tlsUtils = + (await import("../../open-sse/utils/tlsClient.ts")) as TlsUtilsWithLifecycleTestSeam; + assert.equal(typeof tlsUtils.__closeWreqLifecycleResourcesForTesting, "function"); + await tlsUtils.__closeWreqLifecycleResourcesForTesting?.(); + + assert.equal(sessionClosed, true); + assert.equal(transportClosed, true); +}); + +test("a synchronous session close error does not consume capacity permanently", async () => { + let sessionsCreated = 0; + const client = new TlsClient(async () => { + sessionsCreated += 1; + return { + async fetch() { + return { + status: 200, + statusText: "OK", + headers: new Headers(), + body: null, + }; + }, + close() { + throw new Error("synchronous native close failure"); + }, + }; + }, 1); + + await client.fetch("https://example.test", { proxy: null }); + await client.exit(); + await client.fetch("https://example.test", { proxy: null }); + + assert.equal(sessionsCreated, 2); + await client.exit(); +}); + +test("wreq response streaming validates a fragmented SSE prefix and filters a fragmented EOF", async () => { + const runtime = { + async createTransport() { + return { async close() {} }; + }, + async fetch() { + const chunks = ["da", 'ta: {"answer":"ok"}\n[D', "ONE]ignored"]; + return new Response( + new ReadableStream({ + pull(controller) { + const next = chunks.shift(); + if (next === undefined) { + controller.close(); + } else { + controller.enqueue(encoder.encode(next)); + } + }, + }), + { status: 200, headers: { "content-type": "text/event-stream" } } + ); + }, + }; + const module = createTlsClientModule({ + providerName: "Test", + tlsProfile: "firefox_148", + emulationOs: "macos", + domain: "https://example.test", + streamEofPolicy: "exclude", + responseValidation: "sse", + exportCloudflareCheck: false, + wreqRuntimeLoader: async () => runtime, + }); + + const result = await module.tlsFetch("https://example.test/stream", { + method: "POST", + stream: true, + streamEofSymbol: "[DONE]", + }); + + assert.ok(result.body, "a valid SSE response must stay streaming"); + assert.equal(result.text, null); + assert.equal(await new Response(result.body).text(), 'data: {"answer":"ok"}\n'); +}); + +test("byteResponse preserves arbitrary bytes as a content-typed data URL", async () => { + const runtime = { + async createTransport() { + return { async close() {} }; + }, + async fetch() { + return { + status: 200, + headers: new Headers({ "content-type": "image/png; charset=binary" }), + body: null, + async bytes() { + return new Uint8Array([0, 255, 1, 254]); + }, + async text(): Promise { + throw new Error("binary response must not be decoded as UTF-8"); + }, + }; + }, + }; + const module = createTlsClientModule({ + providerName: "Test", + tlsProfile: "firefox_148", + domain: "https://example.test", + streamEofPolicy: "include", + responseValidation: "sse", + exportCloudflareCheck: false, + wreqRuntimeLoader: async () => runtime, + }); + + const result = await module.tlsFetch("https://example.test/image", { + byteResponse: true, + }); + + assert.equal(result.text, "data:image/png;base64,AP8B/g=="); +}); + +test("a response that misses the first-byte deadline falls back to a buffered body", async () => { + const runtime = { + async createTransport() { + return { async close() {} }; + }, + async fetch() { + let sent = false; + return new Response( + new ReadableStream({ + async pull(controller) { + if (sent) { + controller.close(); + return; + } + sent = true; + await new Promise((resolve) => setTimeout(resolve, 60)); + controller.enqueue(encoder.encode('data: {"late":true}\n\n[DONE]')); + }, + }), + { status: 200, headers: { "content-type": "text/event-stream" } } + ); + }, + }; + const module = createTlsClientModule({ + providerName: "Test", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "include", + responseValidation: "sse", + exportCloudflareCheck: false, + firstByteTimeoutMs: 10, + wreqRuntimeLoader: async () => runtime, + }); + + const result = await module.tlsFetch("https://example.test/stream", { + stream: true, + timeoutMs: 500, + }); + + assert.equal(result.body, null); + assert.equal(result.text, 'data: {"late":true}\n\n[DONE]'); +}); + +test("an empty native chunk does not satisfy the first-byte deadline", async () => { + const runtime = { + async createTransport() { + return { async close() {} }; + }, + async fetch() { + let pullCount = 0; + return new Response( + new ReadableStream({ + async pull(controller) { + pullCount += 1; + if (pullCount === 1) { + controller.enqueue(new Uint8Array(0)); + return; + } + if (pullCount === 2) { + await new Promise((resolve) => setTimeout(resolve, 60)); + controller.enqueue(encoder.encode('data: {"late":true}\n\n[DONE]')); + return; + } + controller.close(); + }, + }), + { status: 200, headers: { "content-type": "text/event-stream" } } + ); + }, + }; + const module = createTlsClientModule({ + providerName: "Test", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "include", + responseValidation: "sse", + exportCloudflareCheck: false, + firstByteTimeoutMs: 10, + wreqRuntimeLoader: async () => runtime, + }); + + const result = await module.tlsFetch("https://example.test/stream", { + stream: true, + timeoutMs: 500, + }); + + assert.equal(result.body, null); + assert.equal(result.text, 'data: {"late":true}\n\n[DONE]'); +}); + +test("the first-byte deadline includes request and response-header latency", async () => { + const module = createTlsClientModule({ + providerName: "Test", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "include", + responseValidation: "sse", + exportCloudflareCheck: false, + exposeStreamingForTesting: true, + }); + const client = { + async request() { + await new Promise((resolve) => setTimeout(resolve, 40)); + return new Response('data: {"lateHeaders":true}\n\n[DONE]', { + status: 200, + headers: { "content-type": "text/event-stream" }, + }); + }, + }; + + const result = await module.__tlsFetchStreamingForTesting!( + client, + "https://example.test/stream", + { method: "POST" }, + "[DONE]", + null, + 1_000, + 10 + ); + + assert.equal(result.body, null); + assert.equal(result.text, 'data: {"lateHeaders":true}\n\n[DONE]'); +}); + +test("the hard timeout also bounds a wreq body that never produces its first byte", async () => { + const runtime = { + async createTransport() { + return { async close() {} }; + }, + async fetch() { + return new Response( + new ReadableStream({ + pull() { + return new Promise(() => {}); + }, + }), + { status: 200, headers: { "content-type": "text/event-stream" } } + ); + }, + }; + const module = createTlsClientModule({ + providerName: "Test", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "include", + responseValidation: "sse", + exportCloudflareCheck: false, + defaultTimeoutMs: 20, + hardTimeoutGraceMs: 10, + firstByteTimeoutMs: Number.POSITIVE_INFINITY, + wreqRuntimeLoader: async () => runtime, + }); + + const outcome = await Promise.race([ + module.tlsFetch("https://example.test/stream", { stream: true }).then( + () => ({ kind: "resolved" as const }), + (error: unknown) => ({ kind: "rejected" as const, error }) + ), + new Promise<{ kind: "hung" }>((resolve) => setTimeout(() => resolve({ kind: "hung" }), 250)), + ]); + + assert.notEqual(outcome.kind, "hung", "the body read must remain bounded"); + assert.equal(outcome.kind, "rejected"); + if (outcome.kind === "rejected") { + assert.equal((outcome.error as Error).name, "TlsClientHangError"); + } +}); + +test("the hard timeout remains active after streaming headers and the first chunk", async () => { + const runtime = { + async createTransport() { + return { async close() {} }; + }, + async fetch() { + let first = true; + return new Response( + new ReadableStream({ + pull(controller) { + if (first) { + first = false; + controller.enqueue(encoder.encode('data: {"partial":true}\n\n')); + return; + } + return new Promise(() => {}); + }, + }), + { status: 200, headers: { "content-type": "text/event-stream" } } + ); + }, + }; + const module = createTlsClientModule({ + providerName: "Test", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "include", + responseValidation: "sse", + exportCloudflareCheck: false, + defaultTimeoutMs: 300, + hardTimeoutGraceMs: 200, + firstByteTimeoutMs: Number.POSITIVE_INFINITY, + wreqRuntimeLoader: async () => runtime, + }); + + const result = await module.tlsFetch("https://example.test/stream", { stream: true }); + assert.ok(result.body); + const reader = result.body.getReader(); + const first = await reader.read(); + assert.equal(first.done, false); + const outcome = await Promise.race([ + reader.read().then( + () => ({ kind: "resolved" as const }), + (error: unknown) => ({ kind: "rejected" as const, error }) + ), + new Promise<{ kind: "hung" }>((resolve) => setTimeout(() => resolve({ kind: "hung" }), 2_000)), + ]); + + assert.equal(outcome.kind, "rejected"); + if (outcome.kind === "rejected") { + assert.equal((outcome.error as Error).name, "TlsClientHangError"); + } +}); + +test("an empty native stream preserves the upstream error status instead of becoming 200", async () => { + const module = createTlsClientModule({ + providerName: "Test", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "none", + responseValidation: "cf", + exportCloudflareCheck: false, + exposeStreamingForTesting: true, + }); + const client = { + async request() { + return new Response( + new ReadableStream({ + start(controller) { + controller.enqueue(new Uint8Array(0)); + controller.close(); + }, + }), + { status: 403, headers: { "x-upstream": "preserved" } } + ); + }, + }; + + const result = await module.__tlsFetchStreamingForTesting!( + client, + "https://example.test/stream", + { method: "POST" }, + "", + null, + 1_000, + 1_000 + ); + + assert.equal(result.status, 403); + assert.equal(result.headers.get("x-upstream"), "preserved"); + assert.equal(result.text, ""); + assert.equal(result.body, null); +}); + +test("Cloudflare detection peeks across fragmented wreq chunks before exposing a stream", async () => { + const runtime = { + async createTransport() { + return { async close() {} }; + }, + async fetch() { + const chunks = [ + "Ju", + "st a moment...", + ]; + return new Response( + new ReadableStream({ + pull(controller) { + const next = chunks.shift(); + if (next === undefined) controller.close(); + else controller.enqueue(encoder.encode(next)); + }, + }), + { status: 200, headers: { "content-type": "text/html" } } + ); + }, + }; + const module = createTlsClientModule({ + providerName: "Test", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "exclude", + responseValidation: "cf", + exportCloudflareCheck: true, + wreqRuntimeLoader: async () => runtime, + }); + + const result = await module.tlsFetch("https://example.test/stream", { stream: true }); + + assert.equal(result.status, 403); + assert.equal(result.body, null); + assert.match(result.text ?? "", /just a moment/i); +}); + +test("a non-success native response is buffered without rewriting its status to 200", async () => { + const module = createTlsClientModule({ + providerName: "Test", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "none", + responseValidation: "cf", + exportCloudflareCheck: false, + exposeStreamingForTesting: true, + }); + const client = { + async request() { + const chunks = ['{"error":"rate ', 'limited"}']; + return new Response( + new ReadableStream({ + pull(controller) { + const next = chunks.shift(); + if (next === undefined) controller.close(); + else controller.enqueue(encoder.encode(next)); + }, + }), + { status: 429, headers: { "retry-after": "30" } } + ); + }, + }; + + const result = await module.__tlsFetchStreamingForTesting!( + client, + "https://example.test/stream", + { method: "POST" }, + "", + null, + 1_000, + 1_000 + ); + + assert.equal(result.status, 429); + assert.equal(result.headers.get("retry-after"), "30"); + assert.equal(result.text, '{"error":"rate limited"}'); + assert.equal(result.body, null); +}); + +test("a non-success HTML response keeps the generic HTML classification", async () => { + const module = createTlsClientModule({ + providerName: "Test", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "none", + responseValidation: "cf", + exportCloudflareCheck: false, + exposeStreamingForTesting: true, + }); + const client = { + async request() { + return new Response("Service unavailable", { + status: 503, + headers: { "content-type": "text/html" }, + }); + }, + }; + + const result = await module.__tlsFetchStreamingForTesting!( + client, + "https://example.test/stream", + { method: "POST" }, + "", + null, + 1_000, + 1_000 + ); + + assert.equal(result.status, 502); + assert.match(result.text ?? "", /service unavailable/i); + assert.equal(result.body, null); +}); + +test("SSE validation tolerates a UTF-8 BOM fragmented across native chunks", async () => { + const module = createTlsClientModule({ + providerName: "Test", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "exclude", + responseValidation: "sse", + exportCloudflareCheck: false, + exposeStreamingForTesting: true, + }); + const payload = encoder.encode('data: {"answer":"ok"}\n\n[DONE]'); + const chunks = [ + new Uint8Array([0xef]), + new Uint8Array([0xbb]), + new Uint8Array([0xbf, ...payload]), + ]; + const client = { + async request() { + return new Response( + new ReadableStream({ + pull(controller) { + const next = chunks.shift(); + if (next === undefined) controller.close(); + else controller.enqueue(next); + }, + }), + { status: 200, headers: { "content-type": "text/event-stream" } } + ); + }, + }; + + const result = await module.__tlsFetchStreamingForTesting!( + client, + "https://example.test/stream", + { method: "POST" }, + "[DONE]", + null, + 1_000, + 1_000 + ); + + assert.ok(result.body); + assert.equal(await new Response(result.body).text(), 'data: {"answer":"ok"}\n\n'); +}); + +test("EOF filtering ignores a sentinel literal inside an SSE data frame", async () => { + const module = createTlsClientModule({ + providerName: "Test", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "exclude", + responseValidation: "sse", + exportCloudflareCheck: false, + exposeStreamingForTesting: true, + }); + const expected = 'data: {"content":"literal [DONE] survives"}\n\n'; + const client = { + async request() { + return new Response(`${expected}data: [DONE]ignored`, { + status: 200, + headers: { "content-type": "text/event-stream" }, + }); + }, + }; + + const result = await module.__tlsFetchStreamingForTesting!( + client, + "https://example.test/stream", + { method: "POST" }, + "[DONE]", + null, + 1_000, + 1_000 + ); + + assert.ok(result.body); + assert.equal(await new Response(result.body).text(), expected); +}); + +test("the include policy preserves a fragmented Perplexity end_of_stream marker", async () => { + const runtime = { + async createTransport() { + return { async close() {} }; + }, + async fetch() { + const chunks = ['data: {"answer":"ok"}\n\nev', "ent: end_of_", "stream\nignored"]; + return new Response( + new ReadableStream({ + pull(controller) { + const next = chunks.shift(); + if (next === undefined) controller.close(); + else controller.enqueue(encoder.encode(next)); + }, + }), + { status: 200, headers: { "content-type": "text/event-stream" } } + ); + }, + }; + const module = createTlsClientModule({ + providerName: "Perplexity", + tlsProfile: "firefox_148", + emulationOs: "macos", + domain: "https://www.perplexity.ai", + streamEofPolicy: "include", + responseValidation: "sse", + exportCloudflareCheck: true, + wreqRuntimeLoader: async () => runtime, + }); + + const result = await module.tlsFetch("https://www.perplexity.ai/rest/sse/perplexity_ask", { + stream: true, + streamEofSymbol: "event: end_of_stream", + }); + + assert.ok(result.body); + assert.equal( + await new Response(result.body).text(), + 'data: {"answer":"ok"}\n\nevent: end_of_stream' + ); +}); + +test("the no-sentinel policy leaves an LMArena stream untouched through native EOF", async () => { + const payload = '{"text":"[DONE] is data"}\n[DONE]still-data'; + const runtime = { + async createTransport() { + return { async close() {} }; + }, + async fetch() { + return new Response( + new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode(payload)); + controller.close(); + }, + }), + { status: 200, headers: { "content-type": "application/x-ndjson" } } + ); + }, + }; + const module = createTlsClientModule({ + providerName: "LMArena", + tlsProfile: "chrome_146", + emulationOs: "windows", + domain: "https://lmarena.ai", + streamEofPolicy: "none", + responseValidation: "cf", + exportCloudflareCheck: true, + wreqRuntimeLoader: async () => runtime, + }); + + const result = await module.tlsFetch("https://arena.ai/api/stream", { + stream: true, + streamEofSymbol: "[DONE]", + }); + + assert.ok(result.body); + assert.equal(await new Response(result.body).text(), payload); +}); + +test("duplicate response headers and Set-Cookie values survive the adapter", async () => { + const rawHeaders = { + *[Symbol.iterator](): IterableIterator<[string, string]> { + yield ["x-trace", "one"]; + yield ["x-trace", "two"]; + yield ["set-cookie", "collapsed-value-must-not-win"]; + }, + getSetCookie() { + return ["session=one; Path=/; HttpOnly", "affinity=two; Path=/"]; + }, + }; + const runtime = { + async createTransport() { + return { async close() {} }; + }, + async fetch() { + return { status: 202, headers: rawHeaders, body: "accepted" }; + }, + }; + const module = createTlsClientModule({ + providerName: "Headers", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "include", + responseValidation: "sse", + exportCloudflareCheck: false, + wreqRuntimeLoader: async () => runtime, + }); + + const result = await module.tlsFetch("https://example.test/headers"); + + assert.equal(result.status, 202); + assert.equal(result.headers.get("x-trace"), "one, two"); + assert.deepEqual(result.headers.getSetCookie(), [ + "session=one; Path=/; HttpOnly", + "affinity=two; Path=/", + ]); +}); + +test("caller abort errors the exposed stream and cancels the native reader", async () => { + let cancelReason: unknown; + let first = true; + const runtime = { + async createTransport() { + return { async close() {} }; + }, + async fetch() { + return new Response( + new ReadableStream({ + pull(controller) { + if (first) { + first = false; + controller.enqueue(encoder.encode('data: {"partial":true}\n\n')); + return; + } + return new Promise(() => {}); + }, + cancel(reason) { + cancelReason = reason; + }, + }), + { status: 200, headers: { "content-type": "text/event-stream" } } + ); + }, + }; + const module = createTlsClientModule({ + providerName: "Abort", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "include", + responseValidation: "sse", + exportCloudflareCheck: false, + defaultTimeoutMs: 1_000, + hardTimeoutGraceMs: 1_000, + wreqRuntimeLoader: async () => runtime, + }); + const abort = new AbortController(); + const result = await module.tlsFetch("https://example.test/stream", { + stream: true, + signal: abort.signal, + }); + assert.ok(result.body); + const reader = result.body.getReader(); + assert.equal((await reader.read()).done, false); + + abort.abort(); + await assert.rejects(reader.read(), (error: unknown) => (error as Error).name === "AbortError"); + assert.equal((cancelReason as Error).name, "AbortError"); +}); + +test("caller abort cancels a native reader while a non-stream response is buffering", async () => { + let cancelReason: unknown; + let pullCount = 0; + let notifySecondPull!: () => void; + const secondPullStarted = new Promise((resolve) => { + notifySecondPull = resolve; + }); + const runtime = { + async createTransport() { + return { async close() {} }; + }, + async fetch() { + return new Response( + new ReadableStream({ + pull(controller) { + pullCount += 1; + if (pullCount === 1) { + controller.enqueue(encoder.encode("partial")); + return; + } + notifySecondPull(); + return new Promise(() => {}); + }, + cancel(reason) { + cancelReason = reason; + }, + }), + { status: 200 } + ); + }, + }; + const module = createTlsClientModule({ + providerName: "Abort", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "include", + responseValidation: "sse", + exportCloudflareCheck: false, + defaultTimeoutMs: 1_000, + hardTimeoutGraceMs: 1_000, + wreqRuntimeLoader: async () => runtime, + }); + const abort = new AbortController(); + const pending = module.tlsFetch("https://example.test/buffer", { signal: abort.signal }); + + await secondPullStarted; + abort.abort(); + + await assert.rejects(pending, (error: unknown) => (error as Error).name === "AbortError"); + assert.equal((cancelReason as Error | undefined)?.name, "AbortError"); +}); + +test("caller abort cancels an exposed stream even without another consumer read", async () => { + let cancelReason: unknown; + const runtime = { + async createTransport() { + return { async close() {} }; + }, + async fetch() { + return new Response( + new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode('{"partial":true}\n')); + }, + cancel(reason) { + cancelReason = reason; + }, + }), + { status: 200, headers: { "content-type": "application/x-ndjson" } } + ); + }, + }; + const module = createTlsClientModule({ + providerName: "Abort", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "none", + responseValidation: "cf", + exportCloudflareCheck: false, + defaultTimeoutMs: 1_000, + hardTimeoutGraceMs: 1_000, + wreqRuntimeLoader: async () => runtime, + }); + const abort = new AbortController(); + const result = await module.tlsFetch("https://example.test/stream", { + stream: true, + signal: abort.signal, + }); + assert.ok(result.body); + + abort.abort(); + await new Promise((resolve) => setTimeout(resolve, 20)); + + assert.equal((cancelReason as Error | undefined)?.name, "AbortError"); +}); + +test("the absolute hard deadline cancels an exposed stream under consumer backpressure", async () => { + let cancelReason: unknown; + let invalidated = false; + const module = createTlsClientModule({ + providerName: "Deadline", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "none", + responseValidation: "cf", + exportCloudflareCheck: false, + exposeStreamingForTesting: true, + }); + const client = { + async request() { + return new Response( + new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode('{"partial":true}\n')); + }, + cancel(reason) { + cancelReason = reason; + }, + }), + { status: 200 } + ); + }, + invalidateTransport() { + invalidated = true; + }, + }; + + const result = await module.__tlsFetchStreamingForTesting!( + client, + "https://example.test/stream", + { method: "POST" }, + "", + null, + 40, + 1_000 + ); + assert.ok(result.body); + + await new Promise((resolve) => setTimeout(resolve, 80)); + + assert.equal((cancelReason as Error | undefined)?.name, "TlsClientHangError"); + assert.equal(invalidated, true); +}); + +test("consumer cancellation propagates to the native wreq response reader", async () => { + let cancelReason: unknown; + const runtime = { + async createTransport() { + return { async close() {} }; + }, + async fetch() { + return new Response( + new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode('data: {"partial":true}\n\n')); + }, + cancel(reason) { + cancelReason = reason; + }, + }), + { status: 200, headers: { "content-type": "text/event-stream" } } + ); + }, + }; + const module = createTlsClientModule({ + providerName: "Cancel", + tlsProfile: "chrome_146", + domain: "https://example.test", + streamEofPolicy: "include", + responseValidation: "sse", + exportCloudflareCheck: false, + wreqRuntimeLoader: async () => runtime, + }); + const result = await module.tlsFetch("https://example.test/stream", { stream: true }); + assert.ok(result.body); + + await result.body.cancel("consumer stopped"); + + assert.equal(cancelReason, "consumer stopped"); +}); + +test("a hard timeout evicts and closes only the affected pooled transport", async () => { + const created: Array<{ id: number; closed: boolean }> = []; + let requestCount = 0; + const runtime = { + async createTransport() { + const state = { id: created.length + 1, closed: false }; + created.push(state); + return { + async close() { + state.closed = true; + }, + }; + }, + async fetch() { + requestCount += 1; + if (requestCount === 1) return new Promise(() => {}); + return new Response("recovered", { status: 200 }); + }, + }; + const module = createTlsClientModule({ + providerName: "Reset", + tlsProfile: "chrome_146", + emulationOs: "linux", + domain: "https://example.test", + streamEofPolicy: "include", + responseValidation: "sse", + exportCloudflareCheck: false, + defaultTimeoutMs: 10, + hardTimeoutGraceMs: 10, + wreqRuntimeLoader: async () => runtime, + }); + + await assert.rejects( + module.tlsFetch("https://example.test/hang", { proxyUrl: "http://proxy.test:8080" }), + (error: unknown) => (error as Error).name === "TlsClientHangError" + ); + const recovered = await module.tlsFetch("https://example.test/recovered", { + proxyUrl: "http://proxy.test:8080", + timeoutMs: 100, + }); + + assert.equal(recovered.text, "recovered"); + assert.equal(created.length, 2); + assert.equal(created[0]?.closed, true); + assert.equal(created[1]?.closed, false); +}); diff --git a/tests/unit/tls-client-wreq-residue.test.ts b/tests/unit/tls-client-wreq-residue.test.ts new file mode 100644 index 0000000000..67ee8f25fa --- /dev/null +++ b/tests/unit/tls-client-wreq-residue.test.ts @@ -0,0 +1,93 @@ +import assert from "node:assert/strict"; +import { existsSync, readFileSync } from "node:fs"; +import { dirname, join } from "node:path"; +import test from "node:test"; +import { fileURLToPath } from "node:url"; + +const ROOT = join(dirname(fileURLToPath(import.meta.url)), "..", ".."); + +const EXPECTED_BINDINGS = [ + "@wreq-js/binding-android-arm64", + "@wreq-js/binding-darwin-arm64", + "@wreq-js/binding-darwin-x64", + "@wreq-js/binding-linux-arm64-gnu", + "@wreq-js/binding-linux-arm64-musl", + "@wreq-js/binding-linux-x64-gnu", + "@wreq-js/binding-linux-x64-musl", + "@wreq-js/binding-win32-arm64-msvc", + "@wreq-js/binding-win32-x64-msvc", +].sort(); + +test("the distributable pins wreq-js 3.2.0 and carries all nine native lock entries", () => { + const packageJson = JSON.parse(readFileSync(join(ROOT, "package.json"), "utf8")) as { + files: string[]; + optionalDependencies: Record; + }; + assert.equal(packageJson.optionalDependencies["wreq-js"], "3.2.0"); + assert.equal(packageJson.optionalDependencies["tls-client-node"], undefined); + assert.equal(packageJson.files.includes("scripts/build/fixTlsClientNodeBinary.mjs"), false); + + const packageLock = JSON.parse(readFileSync(join(ROOT, "package-lock.json"), "utf8")) as { + packages: Record< + string, + { version?: string; integrity?: string; license?: string; optional?: boolean } + >; + }; + const bindingNames = Object.keys(packageLock.packages) + .filter((key) => key.startsWith("node_modules/@wreq-js/binding-")) + .map((key) => key.slice("node_modules/".length)) + .sort(); + assert.deepEqual(bindingNames, EXPECTED_BINDINGS); + for (const packageName of EXPECTED_BINDINGS) { + const entry = packageLock.packages[`node_modules/${packageName}`]; + assert.equal(entry.version, "3.2.0", `${packageName}: version`); + assert.match(entry.integrity || "", /^sha512-/, `${packageName}: npm integrity`); + assert.equal(entry.license, "MIT", `${packageName}: license`); + assert.equal(entry.optional, true, `${packageName}: optional binding`); + } + + for (const relativePath of [ + "package-lock.json", + "next.config.mjs", + "Dockerfile", + "Dockerfile.bun", + ".trivyignore", + "pnpm.json", + "pnpm-workspace.yaml", + "config/quality/dependency-allowlist.json", + "config/quality/.license-allowlist.json", + "scripts/build/postinstall.mjs", + "scripts/build/pack-artifact-policy.ts", + ]) { + const source = readFileSync(join(ROOT, relativePath), "utf8"); + assert.doesNotMatch( + source, + /tls-client-node/i, + `${relativePath} still references tls-client-node` + ); + assert.doesNotMatch(source, /\bkoffi\b/i, `${relativePath} still references orphaned koffi`); + } + + assert.equal(existsSync(join(ROOT, "open-sse/services/tlsClientDownloadDir.ts")), false); + assert.equal(existsSync(join(ROOT, "scripts/build/fixTlsClientNodeBinary.mjs")), false); + + for (const relativePath of [ + ".env.example", + "docs/reference/ENVIRONMENT.md", + "docs/security/STEALTH_GUIDE.md", + "docs/guides/TROUBLESHOOTING.md", + ]) { + const source = readFileSync(join(ROOT, relativePath), "utf8"); + assert.doesNotMatch(source, /tls-client-node/i, `${relativePath} still names the old sidecar`); + assert.doesNotMatch(source, /\bkoffi\b/i, `${relativePath} still names the old FFI loader`); + } +}); + +test("persistent sessions and ephemeral transports share one wreq runtime loader", () => { + const source = readFileSync(join(ROOT, "open-sse/utils/tlsClient.ts"), "utf8"); + assert.equal( + source.match(/loadRuntimeModule\("wreq-js"\)/g)?.length, + 1, + "wreq-js must be resolved through one cached module loader" + ); +}); diff --git a/tests/unit/tls-profiles-valid-5591.test.mjs b/tests/unit/tls-profiles-valid-5591.test.mjs index 87f2a41e11..3ec158c4b0 100644 --- a/tests/unit/tls-profiles-valid-5591.test.mjs +++ b/tests/unit/tls-profiles-valid-5591.test.mjs @@ -4,13 +4,11 @@ import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; -// #5591 regression guard: every chrome_* TLS impersonation profile referenced in -// the source must be a real wreq-js BrowserProfile. PR #5237 set them to -// "chrome_149", which does not exist in wreq-js 2.3.1 (the union tops out at -// chrome_147) — the native layer then produced a degenerate fingerprint and the -// Codex Responses WebSocket upstream rejected the upgrade ("Invalid JSON body"). -// This test reads the supported set straight from the installed wreq-js type -// definitions, so it stays correct as the dependency is upgraded. +// #5591 regression guard: every TLS impersonation profile referenced in the +// source must be a real BrowserProfile in the pinned wreq-js package. An invalid +// value makes the native layer produce a degenerate fingerprint. Read the +// supported set straight from the installed type definitions so this guard +// moves with an intentional dependency upgrade. const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", ".."); @@ -19,15 +17,24 @@ function supportedProfiles() { path.join(ROOT, "node_modules", "wreq-js", "dist", "wreq-js.d.ts"), "utf8" ); - return new Set([...dts.matchAll(/chrome_(\d+)/g)].map((m) => `chrome_${m[1]}`)); + const union = dts.match(/type BrowserProfile = ([^;]+);/)?.[1] ?? ""; + return new Set([...union.matchAll(/'([^']+)'/g)].map((match) => match[1])); } -// Source files that hand a `browser`/PROFILE value to wreq-js. +const TRANSPORT_PROFILES = { + "open-sse/utils/tlsClient.ts": ["chrome_124", "macos"], + "open-sse/services/claudeTlsClient.ts": ["chrome_146", "linux"], + "open-sse/services/perplexityTlsClient.ts": ["firefox_148", "macos"], + "open-sse/services/grokTlsClient.ts": ["chrome_146", "linux"], + "open-sse/services/notionTlsClient.ts": ["chrome_146", "windows"], + "open-sse/services/lmarenaTlsClient.ts": ["chrome_146", "windows"], +}; + +// Other source files that hand a browser profile directly to wreq-js. const SOURCES = [ "src/app/api/internal/codex-responses-ws/route.ts", "scripts/dev/responses-ws-proxy.mjs", - "open-sse/services/grokTlsClient.ts", - "open-sse/services/claudeTlsClient.ts", + ...Object.keys(TRANSPORT_PROFILES), ]; // Strip comments before scanning — explanatory comments may name the bad @@ -36,16 +43,16 @@ function stripComments(line) { return line.replace(/\/\*.*?\*\//g, "").replace(/\/\/.*$/, ""); } -test("#5591 all configured chrome_* TLS profiles exist in wreq-js", () => { +test("#5591 all configured browser TLS profiles exist in pinned wreq-js", () => { const supported = supportedProfiles(); - assert.ok(supported.size > 0, "expected to parse chrome_* profiles from wreq-js d.ts"); + assert.ok(supported.size > 0, "expected to parse BrowserProfile from wreq-js d.ts"); for (const rel of SOURCES) { const lines = fs.readFileSync(path.join(ROOT, rel), "utf8").split("\n"); lines.forEach((line, i) => { const code = stripComments(line); - for (const m of code.matchAll(/chrome_(\d+)/g)) { - const profile = `chrome_${m[1]}`; + for (const m of code.matchAll(/\b(?:chrome|firefox|edge|opera|safari|okhttp)_[\w.]+/g)) { + const profile = m[0]; assert.ok( supported.has(profile), `${rel}:${i + 1} uses ${profile} which is NOT a wreq-js BrowserProfile ` + @@ -54,4 +61,20 @@ test("#5591 all configured chrome_* TLS profiles exist in wreq-js", () => { } }); } + + for (const [rel, [profile, os]] of Object.entries(TRANSPORT_PROFILES)) { + const source = fs.readFileSync(path.join(ROOT, rel), "utf8"); + assert.ok(supported.has(profile), `${rel} expected unsupported ${profile}`); + + if (rel.endsWith("claudeTlsClient.ts")) { + assert.match(source, /CLAUDE_TLS_BROWSER_MAJOR_VERSION = "146"/); + assert.match(source, /tlsProfile: `chrome_\$\{CLAUDE_TLS_BROWSER_MAJOR_VERSION\}`/); + } else if (rel.endsWith("utils\/tlsClient.ts")) { + assert.match(source, /browser: "chrome_124"/); + assert.match(source, /os: "macos"/); + } else { + assert.match(source, new RegExp(`tlsProfile: ["']${profile}["']`)); + assert.match(source, new RegExp(`emulationOs: ["']${os}["']`)); + } + } }); diff --git a/tests/unit/ui/add-api-key-modal-validation-error-5088.test.tsx b/tests/unit/ui/add-api-key-modal-validation-error-5088.test.tsx index 5c8480b30d..9fed9104ed 100644 --- a/tests/unit/ui/add-api-key-modal-validation-error-5088.test.tsx +++ b/tests/unit/ui/add-api-key-modal-validation-error-5088.test.tsx @@ -18,10 +18,9 @@ vi.mock("next-intl", () => ({ const { default: AddApiKeyModal } = await import("../../../src/app/(dashboard)/dashboard/providers/[id]/components/modals/AddApiKeyModal"); -const TLS_EACCES_ERROR = - "TLS impersonation client failed to start: EACCES: permission denied, mkdir " + - "'/usr/lib/node_modules/omniroute/dist/node_modules/tls-client-node/bin'. " + - "Verify tls-client-node is installed and its native binary downloaded. " + +const TLS_BINDING_ERROR = + "TLS impersonation client failed to start: wreq-js 3.2.x is not installed or unsupported " + + "on this platform. Verify the matching @wreq-js native binding is packaged. " + "(claude-web requires this — without it, Cloudflare blocks every request)"; const containers: Array<{ root: ReturnType; el: HTMLDivElement }> = []; @@ -62,7 +61,7 @@ async function waitFor(fn: () => boolean, timeoutMs = 2000) { beforeEach(() => { vi.clearAllMocks(); - // /api/providers/validate fails with the detailed TLS/EACCES reason; any other + // /api/providers/validate fails with the detailed TLS/binding reason; any other // call (e.g. model lookups) succeeds. vi.stubGlobal( "fetch", @@ -70,7 +69,7 @@ beforeEach(() => { if (String(url).includes("/api/providers/validate")) { return Promise.resolve({ ok: true, - json: () => Promise.resolve({ valid: false, error: TLS_EACCES_ERROR }), + json: () => Promise.resolve({ valid: false, error: TLS_BINDING_ERROR }), } as Response); } return Promise.resolve({ @@ -108,7 +107,7 @@ describe("AddApiKeyModal — surfaces the detailed validation error (#5088)", () }); // The full reason must reach the DOM — a bare "invalid" badge is not enough. - await waitFor(() => el.textContent?.includes("EACCES: permission denied") ?? false); + await waitFor(() => el.textContent?.includes("wreq-js 3.2.x") ?? false); expect(el.textContent).toContain("TLS impersonation client failed to start"); }); }); diff --git a/tests/unit/wreq-native-manifest.test.ts b/tests/unit/wreq-native-manifest.test.ts new file mode 100644 index 0000000000..46d75cea8f --- /dev/null +++ b/tests/unit/wreq-native-manifest.test.ts @@ -0,0 +1,358 @@ +import assert from "node:assert/strict"; +import { createHash } from "node:crypto"; +import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { dirname, join } from "node:path"; +import test from "node:test"; + +import { syncStandaloneExtraModules } from "../../scripts/build/assembleStandalone.mjs"; +import { + PACK_ARTIFACT_REQUIRED_PATHS, + PACK_ARTIFACT_ROOT_ALLOWED_EXACT_PATHS, +} from "../../scripts/build/pack-artifact-policy.ts"; +import { + WREQ_JS_NATIVE_BINDINGS, + resolveWreqJsNativeBinding, +} from "../../scripts/build/wreqJsNative.mjs"; + +const ROOT = process.cwd(); +const MANIFEST_PATH = join(ROOT, "config/release/wreq-js-native-manifest.json"); +const INVENTORY_PATH = join(ROOT, "config/release/wreq-js-rust-license-inventory.json"); +const NATIVE_NOTICES_PATH = join(ROOT, "config/release/wreq-js-rust-notices.md"); + +const RELEASE_EVIDENCE_PATHS = [ + "config/release/wreq-js-native-manifest.json", + "config/release/wreq-js-rust-license-inventory.json", + "config/release/wreq-js-rust-notices.md", +]; + +interface NativeAddon { + target: string; + package: string; + version: string; + platform: string; + arch: string; + libc?: string; + tarball: string; + integrity: string; + path: string; + size: number; + sha256: string; +} + +interface NativeManifest { + package: string; + version: string; + license: string; + source: { commit: string; licenseSha256: string }; + npm: { integrity: string }; + nativeAddons: NativeAddon[]; + rust: { + cargoLockPackages: number; + normalClosureUnionPackages: number; + compileOnlyUnionPackages: number; + boringSsl: { sourceCommit: string; licenseSha256: string; modified: boolean }; + }; +} + +interface CargoComponent { + name: string; + version: string; + license: string; + targets: string[]; +} + +interface RustLicenseInventory { + component: { name: string; version: string; sourceCommit: string }; + targetNormalClosureCounts: Record; + normalClosure: { + uniquePackages: number; + unknownLicenses: number; + licenseExpressionCounts: Record; + components: CargoComponent[]; + }; + compileOnlyClosure: { + uniquePackages: number; + components: CargoComponent[]; + }; + embeddedComponents: Array<{ name: string; sourceCommit: string; modified: boolean }>; + limitations: string[]; +} + +const EXPECTED_BINARY_HASHES: Record = { + "@wreq-js/binding-android-arm64": [ + 9_746_720, + "10cfed8b7f8ce5767d74188bcc2c249f9b0102e8ae90b381b85ec53fbd84c59f", + ], + "@wreq-js/binding-darwin-arm64": [ + 7_754_432, + "f426855858e4c661361a93440ed5fd5bd1e4f6926b3b1c0bf8449bdfe35d0936", + ], + "@wreq-js/binding-darwin-x64": [ + 8_249_144, + "ef00da7db372d5a71403a17f8067655f7313ae58816150ec4a00680546b35f27", + ], + "@wreq-js/binding-linux-arm64-gnu": [ + 8_669_896, + "5a515d02c9693f1440aa88da7a6a09332fb93844f66590e6eb1be582284a96e2", + ], + "@wreq-js/binding-linux-arm64-musl": [ + 8_530_208, + "85dd40b3059b9fb1fc11923e0fca98ab2fff7bfe850aeb4dc18f8812e7125b07", + ], + "@wreq-js/binding-linux-x64-gnu": [ + 9_110_176, + "32be0fe79325ee55216ac844130997ae24ff3df15570357194a8e7c6ae262743", + ], + "@wreq-js/binding-linux-x64-musl": [ + 9_036_248, + "34c43f6694dfa5c749771f14bd19a4d4823707d428bc12d7d141ffa3176dccd6", + ], + "@wreq-js/binding-win32-arm64-msvc": [ + 6_994_432, + "c853e10e272f31d3e5bf3e14cf64a3bfb41ef94d428f895cb73a67f0c58c46fa", + ], + "@wreq-js/binding-win32-x64-msvc": [ + 8_003_584, + "2659898ee73ab64bb1ec4b4b1dd0c1e1d50f7dc579bad456d8bcad84349b01d4", + ], +}; + +test("wreq-js 3.2 manifest pins all nine audited native addons to package-lock", () => { + const manifest = JSON.parse(readFileSync(MANIFEST_PATH, "utf8")) as NativeManifest; + const packageLock = JSON.parse(readFileSync(join(ROOT, "package-lock.json"), "utf8")) as { + packages: Record< + string, + { + version?: string; + integrity?: string; + license?: string; + os?: string[]; + cpu?: string[]; + libc?: string[]; + } + >; + }; + + assert.equal(manifest.package, "wreq-js"); + assert.equal(manifest.version, "3.2.0"); + assert.equal(manifest.license, "MIT"); + assert.equal(manifest.source.commit, "0d52d5fa252841aeef34d4d063b1766a59612bf7"); + assert.equal(manifest.rust.cargoLockPackages, 229); + assert.equal(manifest.rust.boringSsl.modified, true); + assert.equal(manifest.nativeAddons.length, 9); + + assert.deepEqual( + manifest.nativeAddons.map((entry) => entry.package).sort(), + WREQ_JS_NATIVE_BINDINGS.map((entry) => entry.packageName).sort() + ); + + for (const addon of manifest.nativeAddons) { + const helper = WREQ_JS_NATIVE_BINDINGS.find((entry) => entry.packageName === addon.package); + assert.ok(helper, `${addon.package}: build helper entry`); + assert.equal(addon.target, helper.target, `${addon.package}: target`); + assert.equal(addon.path, helper.fileName, `${addon.package}: binary path`); + assert.equal(addon.platform, helper.platform, `${addon.package}: platform`); + assert.equal(addon.arch, helper.arch, `${addon.package}: arch`); + assert.equal(addon.libc, helper.libc, `${addon.package}: libc`); + + const lock = packageLock.packages[`node_modules/${addon.package}`]; + assert.equal(lock.version, addon.version, `${addon.package}: lock version`); + assert.equal(lock.integrity, addon.integrity, `${addon.package}: lock integrity`); + assert.equal(lock.license, "MIT", `${addon.package}: lock license`); + assert.deepEqual(lock.os, [addon.platform], `${addon.package}: lock platform`); + assert.deepEqual(lock.cpu, [addon.arch], `${addon.package}: lock arch`); + if (addon.libc) { + assert.deepEqual( + lock.libc, + [addon.libc === "gnu" ? "glibc" : addon.libc], + `${addon.package}: lock libc` + ); + } + + assert.deepEqual( + [addon.size, addon.sha256], + EXPECTED_BINARY_HASHES[addon.package], + `${addon.package}: audited binary receipt` + ); + assert.match(addon.tarball, /^https:\/\/registry\.npmjs\.org\//); + + const installedBinary = join(ROOT, "node_modules", ...addon.package.split("/"), addon.path); + if (existsSync(installedBinary)) { + const bytes = readFileSync(installedBinary); + assert.equal(bytes.byteLength, addon.size, `${addon.package}: installed byte size`); + assert.equal( + createHash("sha256").update(bytes).digest("hex"), + addon.sha256, + `${addon.package}: installed sha256` + ); + } + } + + const current = resolveWreqJsNativeBinding({ + platform: process.platform === "android" ? "android" : process.platform, + arch: process.arch, + }); + if (current) { + const installedBinary = join( + ROOT, + "node_modules", + ...current.packageName.split("/"), + current.fileName + ); + if (existsSync(installedBinary)) { + const expected = EXPECTED_BINARY_HASHES[current.packageName]; + const bytes = readFileSync(installedBinary); + assert.equal(bytes.byteLength, expected[0], "installed host binding byte size"); + assert.equal( + createHash("sha256").update(bytes).digest("hex"), + expected[1], + "installed host binding sha256" + ); + } + } +}); + +test("Cargo license inventory separates 153 runtime packages from 43 compile-only packages", () => { + const inventory = JSON.parse(readFileSync(INVENTORY_PATH, "utf8")) as RustLicenseInventory; + const notices = readFileSync(NATIVE_NOTICES_PATH, "utf8"); + + assert.equal(inventory.component.name, "wreq-js"); + assert.equal(inventory.component.version, "3.2.0"); + assert.equal(inventory.normalClosure.uniquePackages, 153); + assert.equal(inventory.normalClosure.components.length, 153); + assert.equal( + Object.values(inventory.normalClosure.licenseExpressionCounts).reduce( + (sum, count) => sum + count, + 0 + ), + 153 + ); + assert.equal(inventory.normalClosure.unknownLicenses, 0); + assert.equal(inventory.compileOnlyClosure.uniquePackages, 43); + assert.equal(inventory.compileOnlyClosure.components.length, 43); + + const componentKey = (component: CargoComponent): string => + `${component.name}@${component.version}`; + const normalKeys = new Set(inventory.normalClosure.components.map(componentKey)); + const compileOnlyKeys = new Set(inventory.compileOnlyClosure.components.map(componentKey)); + assert.equal(normalKeys.size, 153); + assert.equal(compileOnlyKeys.size, 43); + assert.deepEqual( + [...normalKeys].filter((key) => compileOnlyKeys.has(key)), + [] + ); + + for (const [target, expected] of Object.entries(inventory.targetNormalClosureCounts)) { + assert.equal( + inventory.normalClosure.components.filter((component) => component.targets.includes(target)) + .length, + expected, + `${target}: normal closure count` + ); + } + + for (const component of inventory.normalClosure.components) { + assert.ok( + notices.includes(`| \`${componentKey(component)}\` | \`${component.license}\` |`), + `${componentKey(component)}: notice inventory row` + ); + } + assert.match(notices, /BoringSSL@91a66a59b6c1435120ff83e245d7719411294386/); + assert.match(notices, /modified Apache-2\.0 work/); + assert.match(notices, /UNICODE LICENSE V3/); + assert.match(notices, /Community Data License Agreement - Permissive - Version 2\.0/); + assert.match(notices, /\s*$/); + assert.equal( + inventory.limitations.some((item) => item.includes("post-LTO")), + true + ); +}); + +test("npm, standalone, Electron, and container assembly carry the wreq license evidence", async () => { + const packageJson = JSON.parse(readFileSync(join(ROOT, "package.json"), "utf8")) as { + files: string[]; + }; + for (const relativePath of RELEASE_EVIDENCE_PATHS) { + assert.equal(packageJson.files.includes(relativePath), true, `${relativePath}: npm files`); + assert.equal( + PACK_ARTIFACT_ROOT_ALLOWED_EXACT_PATHS.includes(relativePath), + true, + `${relativePath}: pack allowlist` + ); + assert.equal( + PACK_ARTIFACT_REQUIRED_PATHS.includes(relativePath), + true, + `${relativePath}: pack required` + ); + } + + const topLevelNotices = readFileSync(join(ROOT, "THIRD_PARTY_NOTICES.md"), "utf8"); + assert.match(topLevelNotices, /^## wreq-js 3\.2\.0 native transport$/m); + assert.match(topLevelNotices, /Copyright \(c\) 2025 will-work-for-meal/); + assert.match(topLevelNotices, /Copyright \(c\) 2025 Oleksandr Herasymov/); + assert.match(topLevelNotices, /wreq-js-rust-notices\.md/); + + const fixtureRoot = mkdtempSync(join(tmpdir(), "omniroute-wreq-notices-source-")); + const outputRoot = mkdtempSync(join(tmpdir(), "omniroute-wreq-notices-output-")); + try { + const copiedPaths = ["THIRD_PARTY_NOTICES.md", ...RELEASE_EVIDENCE_PATHS]; + for (const relativePath of copiedPaths) { + const target = join(fixtureRoot, relativePath); + mkdirSync(dirname(target), { recursive: true }); + writeFileSync(target, `${relativePath}: receipt\n`); + } + const changed = await syncStandaloneExtraModules( + fixtureRoot, + undefined, + { log: () => undefined }, + outputRoot + ); + assert.equal(changed, true); + for (const relativePath of copiedPaths) { + assert.equal( + readFileSync(join(outputRoot, relativePath), "utf8"), + `${relativePath}: receipt\n`, + `${relativePath}: shared standalone/Electron/container assembly` + ); + } + } finally { + rmSync(fixtureRoot, { recursive: true, force: true }); + rmSync(outputRoot, { recursive: true, force: true }); + } +}); + +test("Electron installs the Linux arm64 binding inside the platform matrix job", () => { + const workflow = readFileSync(join(ROOT, ".github/workflows/electron-release.yml"), "utf8"); + const webBuildStart = workflow.indexOf("\n web-build:"); + const buildStart = workflow.indexOf("\n build:"); + const releaseStart = workflow.indexOf("\n release:"); + + assert.ok(webBuildStart >= 0, "web-build job exists"); + assert.ok(buildStart > webBuildStart, "matrix build job follows web-build"); + assert.ok(releaseStart > buildStart, "release job follows matrix build"); + + const webBuildJob = workflow.slice(webBuildStart, buildStart); + const matrixBuildJob = workflow.slice(buildStart, releaseStart); + const bindingStep = "Install Linux arm64 wreq binding for cross-package"; + + assert.doesNotMatch(webBuildJob, new RegExp(bindingStep)); + assert.match( + matrixBuildJob, + new RegExp( + `${bindingStep}[\\s\\S]*?if: matrix\\.platform == 'linux'[\\s\\S]*?@wreq-js/binding-linux-arm64-gnu@3\\.2\\.0` + ) + ); + assert.doesNotMatch(matrixBuildJob, /--package-lock=false/); + assert.match(matrixBuildJob, /git diff --exit-code -- package\.json package-lock\.json/); + assert.match( + matrixBuildJob, + /tests\/unit\/wreq-native-manifest\.test\.ts/, + "the cross-installed binding must be verified against the audited binary manifest" + ); + assert.ok( + matrixBuildJob.indexOf(bindingStep) < + matrixBuildJob.indexOf("Build Next.js standalone (legacy per-leg fallback)"), + "cross-arch binding must exist before either fallback build or shared-bundle hydration" + ); +}); diff --git a/tests/unit/wreq-postinstall-native.test.ts b/tests/unit/wreq-postinstall-native.test.ts new file mode 100644 index 0000000000..e3fb614787 --- /dev/null +++ b/tests/unit/wreq-postinstall-native.test.ts @@ -0,0 +1,89 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import { + WREQ_JS_NATIVE_BINDINGS, + WREQ_JS_VERSION, + detectRuntimeLibc, + resolveWreqJsNativeBinding, +} from "../../scripts/build/wreqJsNative.mjs"; + +test("wreq-js 3.2 resolver covers all nine published native bindings", () => { + assert.equal(WREQ_JS_VERSION, "3.2.0"); + assert.deepEqual(WREQ_JS_NATIVE_BINDINGS.map((binding) => binding.packageName).sort(), [ + "@wreq-js/binding-android-arm64", + "@wreq-js/binding-darwin-arm64", + "@wreq-js/binding-darwin-x64", + "@wreq-js/binding-linux-arm64-gnu", + "@wreq-js/binding-linux-arm64-musl", + "@wreq-js/binding-linux-x64-gnu", + "@wreq-js/binding-linux-x64-musl", + "@wreq-js/binding-win32-arm64-msvc", + "@wreq-js/binding-win32-x64-msvc", + ]); + + assert.equal( + resolveWreqJsNativeBinding({ platform: "darwin", arch: "arm64" })?.fileName, + "wreq-js.darwin-arm64.node" + ); + assert.equal( + resolveWreqJsNativeBinding({ platform: "linux", arch: "arm64", libc: "gnu" })?.packageName, + "@wreq-js/binding-linux-arm64-gnu" + ); + assert.equal( + resolveWreqJsNativeBinding({ platform: "linux", arch: "x64", libc: "musl" })?.fileName, + "wreq-js.linux-x64-musl.node" + ); + assert.equal( + resolveWreqJsNativeBinding({ platform: "win32", arch: "arm64" })?.packageName, + "@wreq-js/binding-win32-arm64-msvc" + ); + assert.equal( + resolveWreqJsNativeBinding({ platform: "android", arch: "arm64" })?.fileName, + "wreq-js.android-arm64.node" + ); + assert.equal(resolveWreqJsNativeBinding({ platform: "freebsd", arch: "x64" }), null); +}); + +test("libc detection falls back to ldd when process.report fails", () => { + assert.equal( + detectRuntimeLibc({ + platform: "linux", + getReport() { + throw new Error("report unavailable"); + }, + readLdd() { + return "musl libc (x86_64) Version 1.2.5"; + }, + }), + "musl" + ); + assert.equal( + detectRuntimeLibc({ + platform: "linux", + getReport() { + throw new Error("report unavailable"); + }, + readLdd() { + return "ldd (GNU libc) 2.39"; + }, + }), + "gnu" + ); +}); + +test("libc detection fails closed when neither report nor ldd is conclusive", () => { + assert.throws( + () => + detectRuntimeLibc({ + platform: "linux", + getReport() { + throw new Error("report unavailable"); + }, + readLdd() { + throw new Error("ldd unavailable"); + }, + }), + /unable to detect linux libc/i + ); +});