diff --git a/.fossa.yml b/.fossa.yml new file mode 100644 index 000000000..d711d82db --- /dev/null +++ b/.fossa.yml @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: 2026 Bernard Ladenthin +# SPDX-License-Identifier: MIT OR Apache-2.0 + +version: 3 +project: + locator: git+github.com/bernardladenthin/java-llama.cpp + +# No fixed revision.branch: preserve the actual PR/main branch and commit. +# No license overrides or scope exclusions: test and runtime findings stay visible. +maven: + scope-exclude: [] diff --git a/.github/actions/finalize-publication/action.yml b/.github/actions/finalize-publication/action.yml new file mode 100644 index 000000000..b6399c9ac --- /dev/null +++ b/.github/actions/finalize-publication/action.yml @@ -0,0 +1,49 @@ +# SPDX-FileCopyrightText: 2026 Bernard Ladenthin +# SPDX-License-Identifier: MIT OR Apache-2.0 + +name: Finalize signed publication +description: Collect, verify and secure the complete signed package before any publication consumer runs. +inputs: + channel: + description: Publication channel (snapshot or release). + required: true + maven-assets: + description: Optional directory containing Maven outputs preserved before a rebuild. + required: false + default: '' +outputs: + complete: + description: True only after the local gate AND the Actions handoff upload succeed. + value: ${{ steps.ready.outputs.complete }} +runs: + using: composite + steps: + - name: Collect signed artifacts + id: collect + shell: bash + env: + CHANNEL: ${{ inputs.channel }} + MAVEN_ASSETS: ${{ inputs.maven-assets }} + run: | + set -euo pipefail + case "$CHANNEL" in snapshot|release) ;; *) echo "::error::Invalid publication channel"; exit 1 ;; esac + args=("signed-${CHANNEL}-assets") + if [ -n "$MAVEN_ASSETS" ]; then args+=(--maven-assets "$MAVEN_ASSETS"); fi + python3 .github/collect-release-assets.py "${args[@]}" + - name: Verify and freeze the complete signed publication + id: preflight + shell: bash + env: + CHANNEL: ${{ inputs.channel }} + run: python3 .github/publication.py prepare "signed-${CHANNEL}-assets" publication-package --channel "$CHANNEL" + - name: Secure the checked publication package + id: handoff + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7 + with: + name: signed-${{ inputs.channel }}-assets + path: publication-package/ + if-no-files-found: error + - name: Release the secured package to independent consumers + id: ready + shell: bash + run: echo 'complete=true' >> "$GITHUB_OUTPUT" diff --git a/.github/actions/install-sccache-windows/action.yml b/.github/actions/install-sccache-windows/action.yml index 01801d57e..c95da0ef6 100644 --- a/.github/actions/install-sccache-windows/action.yml +++ b/.github/actions/install-sccache-windows/action.yml @@ -14,7 +14,7 @@ inputs: version: description: sccache release to install. required: false - default: '0.18.0' + default: '0.19.0' runs: using: composite steps: @@ -30,6 +30,8 @@ runs: # version and arch; a version without a pinned hash is refused (the caller's # continue-on-error then builds without the cache, which is the safe side). $sha256 = @{ + '0.19.0-x86_64' = '28be8c61f6b2c89b9eb2869f6af7f78e6f992e78a8abae0ce855fcc129cbeac1' + '0.19.0-aarch64' = '66d20f1ea5e29f4f309136323635b864e1d8f0a8b587abbc22271bc22d439a5a' '0.18.0-x86_64' = '8965c74d5e8a225244f741e18ad2f3f504f48228dc1bac948fc22761a348363d' '0.18.0-aarch64' = '205d613fa74a9a0525e41a5ace77b1c71907d5bd4a5e668bad79111776829290' }["$env:SCCACHE_VERSION-$arch"] diff --git a/.github/android-consumer-test/README.md b/.github/android-consumer-test/README.md index 3be21c246..c7218b7b4 100644 --- a/.github/android-consumer-test/README.md +++ b/.github/android-consumer-test/README.md @@ -10,7 +10,10 @@ Not a shipped project — it exists so CI proves Android Studio consumption end Two CI jobs drive it (`.github/workflows/publish.yml`): -1. **`package-android-aar`** — `assembleRelease` with R8: validates AAR format, manifest +1. **`package-android-aar`** — `assembleRelease` with R8 for both `-PjllamaBackend=cpu` (the + default) and `-PjllamaBackend=opencl`. The latter declares only the OpenCL dependency and + resolves the CPU AAR transitively, catching duplicate classes between the two AARs. + Validates AAR format, manifest minSdk merge, `jni/{arm64-v8a,x86_64}` packaging, and the shipped consumer ProGuard rules (asserts the APK still carries the binding and, per ABI, `libjllama.so`, ggml's shared libraries and at least one `libggml-cpu-*.so` module). @@ -23,5 +26,5 @@ Two CI jobs drive it (`.github/workflows/publish.yml`): so a local `connectedAndroidTest` against a bare emulator stays green. What the emulator job deliberately does NOT cover: arm64 kernels (real-device ABI — the -example app on hardware covers that) and the Adreno/OpenCL flavor (no OpenCL ICD in the -emulator). +example app on hardware covers that) and Adreno/OpenCL execution (no OpenCL ICD in the +emulator). OpenCL dependency resolution, R8 and APK packaging are covered by the first job. diff --git a/.github/android-consumer-test/app/build.gradle.kts b/.github/android-consumer-test/app/build.gradle.kts index a4548558d..dd7251444 100644 --- a/.github/android-consumer-test/app/build.gradle.kts +++ b/.github/android-consumer-test/app/build.gradle.kts @@ -9,6 +9,8 @@ plugins { // Injected by CI (-PjllamaVersion=) so the fixture always tests // the AAR that was just built and published to mavenLocal. val jllamaVersion: String = providers.gradleProperty("jllamaVersion").get() +val jllamaBackend = providers.gradleProperty("jllamaBackend").orElse("cpu").get() +require(jllamaBackend in listOf("cpu", "opencl")) { "Unknown jllamaBackend: $jllamaBackend" } android { namespace = "net.ladenthin.llama.consumertest" @@ -48,7 +50,9 @@ android { } dependencies { - implementation("net.ladenthin:llama-android:$jllamaVersion") + // The OpenCL case resolves the CPU AAR transitively, exactly as a consumer does. + val artifact = if (jllamaBackend == "opencl") "llama-android-opencl" else "llama-android" + implementation("net.ladenthin:$artifact:$jllamaVersion") // On-emulator instrumentation (test-android-emulator CI job). androidTestImplementation("androidx.test.ext:junit:1.3.0") diff --git a/.github/build.sh b/.github/build.sh index f06bd10eb..14768d4ab 100755 --- a/.github/build.sh +++ b/.github/build.sh @@ -32,9 +32,9 @@ fi # # SCCACHE_DL_VERSION is overridable per-job, so a container that crashes one sccache build can # try another without editing this script (the in-container panic that stalled phase 2 was on -# v0.8.2; v0.18.0 is the latest release and the default). A wrong/unavailable version just fails +# v0.8.2; v0.19.0 is the default). A wrong/unavailable version just fails # the `curl -f` and falls back to an uncached build, so bumping it can never red a build. -SCCACHE_DL_VERSION="${SCCACHE_DL_VERSION:-0.18.0}" +SCCACHE_DL_VERSION="${SCCACHE_DL_VERSION:-0.19.0}" case "$(uname -m)" in x86_64) SCCACHE_DL_ARCH="x86_64" ;; aarch64|arm64) SCCACHE_DL_ARCH="aarch64" ;; @@ -49,6 +49,8 @@ if [ "${USE_CACHE:-true}" = "true" ] && [ -n "${SCCACHE_WEBDAV_TOKEN:-}${SCCACHE # publishes next to the release assets); another SCCACHE_DL_VERSION brings its own through # SCCACHE_DL_SHA256, and without a known hash the fetch is refused rather than trusted. case "${SCCACHE_DL_VERSION}-${SCCACHE_DL_ARCH}" in + 0.19.0-x86_64) SCCACHE_DL_SHA256="${SCCACHE_DL_SHA256:-aa73c7270c997894038c0d8f0d297865f57569e1687883322bc431713d4bb9dd}" ;; + 0.19.0-aarch64) SCCACHE_DL_SHA256="${SCCACHE_DL_SHA256:-3e47fc4a71b1ddd1b4294a0de9d34498922fdf41e3cd0bda5df3954e3d6deb9d}" ;; 0.18.0-x86_64) SCCACHE_DL_SHA256="${SCCACHE_DL_SHA256:-45f1447fbe231e3037bde351ef70677dd212216c8d62ae7ca409fecc4d6acc89}" ;; 0.18.0-aarch64) SCCACHE_DL_SHA256="${SCCACHE_DL_SHA256:-2b3284d5da3b46a47dc4229e75bb7b88ac4aa99c8d754fb7d2f84997e5a4354a}" ;; *) SCCACHE_DL_SHA256="${SCCACHE_DL_SHA256:-}" ;; @@ -127,28 +129,28 @@ if [ "${USE_CACHE:-true}" = "true" ] && command -v sccache >/dev/null 2>&1 \ && [ -n "${SCCACHE_WEBDAV_TOKEN:-}${SCCACHE_GHA_ENABLED:-}" ] \ && sccache_can_wrap_compiler; then LAUNCH="-DCMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache" - # CUDA builds: nvcc through sccache is OPT-IN (SCCACHE_WRAP_NVCC=true), off by default. - # Wrapping nvcc cached the per-arch .cu device passes too, which are the dominant cost of the - # full-arch CUDA job (measured: ~51 min cold -> ~15 min warm with CUDA 13.2). Since the CUDA - # 13.4 toolkit (2026-09-27), sccache 0.18.0 fails on the very first .cu TUs, ten seconds into - # the build, in every job log examined (four of four: runs 37643964068, 37680715063, - # 37831180985, 37925157175): `Missing "cubin" file output` / `Compiler killed by signal 126` - # -- sccache's nvcc command-line parsing, not a compile error. The retry below then rebuilt - # EVERYTHING without a launcher, gcc TUs included (47-80 min depending on the runner). Not - # wrapping nvcc keeps the ~280 gcc objects cached and runs nvcc directly from the start, with - # no wasted first attempt. Re-try the opt-in on a PR run after bumping SCCACHE_DL_VERSION (or - # a CUDA bump); flip the default back once a warm run shows CUDA hits in the stats table. + # CUDA builds: nvcc goes through sccache too (SCCACHE_WRAP_NVCC=false opts out). That caches the + # per-arch .cu device passes, the dominant cost of the full-arch CUDA job (measured: ~51 min cold + # -> ~15 min warm with CUDA 13.2). It was off from 2026-10-09 to 2026-10-25: with CUDA 13.4 and + # sccache 0.18.0 every job failed on the first .cu TUs with `Missing "cubin" file output` / + # `Compiler killed by signal 126`, and the uncached retry rebuilt everything. The cause was ggml's + # default arch list, whose PTX-only `90-virtual` target makes nvcc run a ptxas check pass without + # `-o` (mozilla/sccache#2862, fix PR #2809). The list this project passes since 2026-10-11 + # (`build_cuda_linux.sh`: every arch `-real`, only `121-virtual` PTX-only) does not trigger it: + # measured in nvidia/cuda:13.4.3 with llama.cpp b11815, sccache 0.18.0 builds six ggml-cuda TUs + # with 108/108 hits warm (19 s vs. 243 s), and ggml's list fails exactly as CI did. The "signal + # 126" was sccache reporting an exit code as a signal, fixed in 0.19.0 (mozilla/sccache#2932). # Scoped to CUDA builds (GGML_CUDA in the cmake args): CMAKE_CUDA_COMPILER_LAUNCHER is inert # when CUDA is not an enabled language, but keeping it scoped leaves the CPU/Android jobs' # configure output clean. ggml does not wrap nvcc on its own here: its GGML_CCACHE block only # fires when neither CMAKE_C_COMPILER_LAUNCHER nor CMAKE_CXX_COMPILER_LAUNCHER is set. case " $* " in *" -DGGML_CUDA=1 "* | *" -DGGML_CUDA=ON "* | *" -DGGML_CUDA=on "*) - if [ "${SCCACHE_WRAP_NVCC:-false}" = "true" ]; then + if [ "${SCCACHE_WRAP_NVCC:-true}" = "true" ]; then LAUNCH="$LAUNCH -DCMAKE_CUDA_COMPILER_LAUNCHER=sccache" - echo "build.sh: sccache will also wrap nvcc (CUDA build detected, SCCACHE_WRAP_NVCC=true)" + echo "build.sh: sccache will also wrap nvcc (CUDA build detected; SCCACHE_WRAP_NVCC=false opts out)" else - echo "build.sh: nvcc runs uncached (CUDA build detected, SCCACHE_WRAP_NVCC is not 'true'); sccache wraps the C/C++ TUs only" + echo "build.sh: nvcc runs uncached (CUDA build detected, SCCACHE_WRAP_NVCC=${SCCACHE_WRAP_NVCC}); sccache wraps the C/C++ TUs only" fi ;; esac # ROCm builds: on Linux ggml compiles its ~150 HIP TUs as the CMake language HIP, which the @@ -188,16 +190,22 @@ cmake -Bbuild $LAUNCH $REQUIRE_COMMIT $@ || exit 1 # still fails fast (and is reported) instead of triggering a wasteful uncached rebuild. The # "Compiler not supported" signature additionally covers the CUDA case: if wrapping nvcc breaks # (sccache declining/erroring on the nvcc driver), the retry rebuilds the full-arch CUDA job -# without any launcher rather than redding it. "Compiler killed by signal" covers a second CUDA -# failure mode seen with CUDA 13.3's nvcc: sccache's nvcc wrapping loses an intermediate .ptx file -# for a "-virtual" architecture target (e.g. 75-virtual), so fatbinary aborts with "Could not open -# input file '*.ptx'" and sccache reports the underlying nvcc invocation as killed — an sccache/nvcc -# incompatibility, not a real compile error, so it gets the same uncached-retry treatment. +# without any launcher rather than redding it. "fatbinary fatal" covers a second CUDA failure mode +# seen with CUDA 13.3's nvcc: sccache's nvcc wrapping loses an intermediate .ptx file for a +# "-virtual" architecture target (e.g. 75-virtual), so fatbinary aborts with "Could not open input +# file '*.ptx'" -- an sccache/nvcc incompatibility, not a real compile error, so it gets the same +# uncached-retry treatment. Up to sccache 0.18 that case (and every ordinary nvcc compile error) +# also printed "Compiler killed by signal ", an exit code misreported as a signal; 0.19.0 reports +# the exit code (mozilla/sccache#2932), so a genuine CUDA compile error no longer matches here and +# fails fast instead of costing an uncached rebuild. The pattern stays for an older SCCACHE_DL_VERSION. +# 'Missing "cubin"' is sccache's own error when nvcc's ptxas check pass writes no output +# (mozilla/sccache#2862, a PTX-only target such as ggml's default 90-virtual): with 0.18 it came +# with the "killed by signal" line, with 0.19.0 that line is gone, so it is matched by itself. build_log="$(mktemp 2>/dev/null || echo "/tmp/jllama-build.$$.log")" cmake --build build --config Release -j"${JOBS}" 2>&1 | tee "$build_log" build_rc=${PIPESTATUS[0]} if [ "$build_rc" -ne 0 ]; then - if [ -n "$LAUNCH" ] && grep -qiE 'sccache: error|Server startup failed|cache storage failed|Compiler not supported|Compiler killed by signal' "$build_log"; then + if [ -n "$LAUNCH" ] && grep -qiE 'sccache: error|Server startup failed|cache storage failed|Compiler not supported|Compiler killed by signal|fatbinary fatal|Missing "cubin"' "$build_log"; then echo "build.sh: build failed via an sccache cache error — retrying WITHOUT cache (clean reconfigure)." rm -f "$build_log" rm -rf build && mkdir -p build diff --git a/.github/buildcheck/__init__.py b/.github/buildcheck/__init__.py index add4f0f54..5beaff17b 100644 --- a/.github/buildcheck/__init__.py +++ b/.github/buildcheck/__init__.py @@ -3,10 +3,11 @@ # SPDX-License-Identifier: MIT OR Apache-2.0 """Build checks as a library, so buildcheck/tests can test them. Standard library only. -Two kinds of module live here. workflow.py, releasegate.py, sharedfiles.py, versions.py and -runscripts.py (with their tests and the check-*.py entry points next to this package) are kept -BYTE-IDENTICAL in java-llama.cpp, BitcoinAddressFinder, srcmorph and streambuffer: each repository -lists them in .github/shared-files.sha256, which its `shared-files` job checks (see sharedfiles.py). +Two kinds of module live here. workflow.py, releasegate.py, sharedfiles.py, versions.py, +runscripts.py, releaseassets.py, publication.py and snapshot.py (with their tests and the *.py +entry points next to this package) are kept BYTE-IDENTICAL in java-llama.cpp, +BitcoinAddressFinder, srcmorph and streambuffer: each repository lists them in +.github/shared-files.sha256, which its `shared-files` job checks (see sharedfiles.py). Every other module is the repository's own. Run the tests from the repository root: diff --git a/.github/buildcheck/natives.py b/.github/buildcheck/natives.py index fed6dc129..73eb9fb2c 100644 --- a/.github/buildcheck/natives.py +++ b/.github/buildcheck/natives.py @@ -92,6 +92,11 @@ def module_name(classifier): return "net.ladenthin.llama.natives." + classifier.replace("-", "_") +# Where the natives profile copies llama/legal/natives/ before packaging (CMake writes the natives +# tree next to it, so it is a generated directory); every natives jar includes it. +LEGAL_INCLUDE = "META-INF/third-party/natives/**" + + def pom_execution(row): return f"""\t\t\t\t\t\t\t \t\t\t\t\t\t\t\tnatives-{row['classifier']} @@ -104,6 +109,7 @@ def pom_execution(row): \t\t\t\t\t\t\t\t\t${{project.basedir}}/src/main/natives \t\t\t\t\t\t\t\t\t \t\t\t\t\t\t\t\t\t\tnet/ladenthin/llama/{row['directory']}/** +\t\t\t\t\t\t\t\t\t\t{LEGAL_INCLUDE} \t\t\t\t\t\t\t\t\t \t\t\t\t\t\t\t\t\t \t\t\t\t\t\t\t\t\t\tfalse @@ -186,13 +192,14 @@ def check_pom(natives, pom_text): conf = ex.find("m:configuration", NS) classifier = conf.findtext("m:classifier", namespaces=NS) if conf is not None else None if classifier: - found[classifier] = (conf.findtext("m:includes/m:include", namespaces=NS), + found[classifier] = (tuple(i.text for i in conf.iterfind("m:includes/m:include", NS)), conf.findtext("m:archive/m:manifestEntries/m:Automatic-Module-Name", namespaces=NS)) by_classifier = {r["classifier"]: r for r in natives} failures = compare("llama/pom.xml natives profile", by_classifier, found) for classifier in sorted(set(found) & set(by_classifier)): - want = (f"net/ladenthin/llama/{by_classifier[classifier]['directory']}/**", module_name(classifier)) + want = ((f"net/ladenthin/llama/{by_classifier[classifier]['directory']}/**", LEGAL_INCLUDE), + module_name(classifier)) if found[classifier] != want: failures.append(f"llama/pom.xml: {classifier} has {found[classifier]}, expected {want} " f"(check-natives.py pom prints the executions)") @@ -483,6 +490,14 @@ def version(text): return [f"llama-atmosphere-agent/pom.xml is version {agent}, the reactor {core}: set both to the same version"] +def check_agent_license(root_license_text, agent_license_text): + """The agent folder carries its own LICENSE (it is copied out and run on its own) and its jar + ships that copy, so it must stay the repository's text.""" + if root_license_text == agent_license_text: + return [] + return ["llama-atmosphere-agent/LICENSE differs from LICENSE: copy the repository's LICENSE there"] + + def read(root, path): with open(os.path.join(root, path), encoding="utf-8") as f: return f.read() @@ -503,4 +518,5 @@ def check(root): + check_jbang_example(natives, read(root, JBANG_EXAMPLE), readme) + check_server_example(natives, read(root, SERVER_EXAMPLE), readme) + check_module_readmes(readme, {p: read(root, p) for p in MODULE_READMES}) - + check_agent_version(read(root, "pom.xml"), read(root, "llama-atmosphere-agent/pom.xml"))) + + check_agent_version(read(root, "pom.xml"), read(root, "llama-atmosphere-agent/pom.xml")) + + check_agent_license(read(root, "LICENSE"), read(root, "llama-atmosphere-agent/LICENSE"))) diff --git a/.github/buildcheck/publication.py b/.github/buildcheck/publication.py new file mode 100644 index 000000000..d01bf4602 --- /dev/null +++ b/.github/buildcheck/publication.py @@ -0,0 +1,394 @@ +# SPDX-FileCopyrightText: 2026 Bernard Ladenthin +# SPDX-License-Identifier: MIT OR Apache-2.0 +"""Freeze signed publication bytes once; independent consumers never rebuild them.""" +import argparse +import base64 +import hashlib +import json +import os +from pathlib import Path, PurePosixPath +import re +import shutil +import subprocess +import tempfile +import xml.etree.ElementTree as ET +import zipfile + +from .releaseassets import configuration, projects, signature_gaps, _classifiers, _format, _inside +from .snapshot import GitHub + +PORTAL = "https://central.sonatype.com/api/v1/publisher/upload" +SNAPSHOTS = "https://central.sonatype.com/repository/maven-snapshots/" +DEPLOY_PLUGIN = "3.1.4" +# The name of the shared central-snapshot job; superseded() looks for it in other runs. +CENTRAL_SNAPSHOT_JOB = "Upload checked snapshot artifacts to Maven Central" +# Publication payload in a Central staging directory. Repository metadata and checksums are +# regenerated by the transfer; anything else in a staging directory fails the gate. +PAYLOAD = re.compile(r".+\.(?:pom|jar|aar|json)(?:\.asc)?") +REGENERATED = re.compile(r"maven-metadata[\w.-]*\.xml|.+\.(?:md5|sha1|sha256|sha512)|\.index") +# GitHub renames release assets with other characters; a renamed asset would no longer match +# the publication manifest, and update-snapshot.py would prune it as obsolete. +ASSET_NAME = re.compile(r"[A-Za-z0-9][A-Za-z0-9._-]*") + + +def digest(path): + h = hashlib.sha256() + with path.open("rb") as stream: + for block in iter(lambda: stream.read(1024 * 1024), b""): + h.update(block) + return h.hexdigest() + + +def safe_path(root, name): + p = PurePosixPath(name) + if not name or p.is_absolute() or ".." in p.parts or "\\" in name or ":" in name: + raise ValueError("unsafe publication path: " + name) + target = root / name + if target.is_symlink() or any(parent.is_symlink() for parent in target.parents): + raise ValueError("publication symlink: " + name) + return target + + +def check_ref(version, ref, channel=None): + """A release publishes only from the tag v; a snapshot never from a tag.""" + actual = "snapshot" if version.endswith("-SNAPSHOT") else "release" + if channel is not None and channel != actual: + raise ValueError(f"{channel} publication of {actual} version {version}") + if ref is None: + return actual + tag = ref[len("refs/tags/"):] if ref.startswith("refs/tags/") else None + if actual == "snapshot" and tag is not None: + raise ValueError(f"tag {tag} names SNAPSHOT version {version}; a release tag needs a release version") + if actual == "release" and tag != "v" + version: + raise ValueError(f"release version {version} publishes only from tag v{version}, not {ref}") + return actual + + +def central_name(name, artifact, version): + """Undo a timestamped snapshot name (Gradle writes one even to a local file repository).""" + if not version.endswith("-SNAPSHOT"): + return name + prefix = f"{artifact}-{version[:-len('-SNAPSHOT')]}-" + match = re.fullmatch(re.escape(prefix) + r"\d{8}\.\d{6}-\d+(.*)", name) + return f"{artifact}-{version}{match[1]}" if match else name + + +def expected_central(root, config, modules, *, only_central=True): + names = set() + for _, artifact, version, packaging, reactor in modules: + base = f"{artifact}-{version}" + names.add(base + ".pom") + if packaging != "pom": + names.update(base + suffix + ".jar" for suffix in ("", "-sources", "-javadoc")) + if reactor and config.get("maven", {}).get("cyclonedx", False): + names.add(base + "-cyclonedx.json") + for rule in config.get("files", []): + if only_central and not rule.get("central", False): + continue + for classifier in _classifiers(root, rule.get("classifiers", [""])): + matches = list(root.glob(_format(rule["source"], modules[0][2], classifier))) + if len(matches) != 1: + raise ValueError("missing/ambiguous Central input: " + rule["source"]) + names.add(_format(rule["name"], modules[0][2], classifier) if "name" in rule else matches[0].name) + return names + + +def prepare(root, assets, destination, *, config_path=None, channel=None, ref=None): + """Gate both publishers on exact membership, valid signatures and frozen checksums. + + channel is the one the caller publishes to; ref defaults to GITHUB_REF ("": no ref check). + """ + root, assets, destination = Path(root).resolve(), Path(assets).resolve(), Path(destination).resolve() + if destination.exists(): + raise ValueError("publication destination must not exist") + missing, errors = signature_gaps(assets) + if missing: + raise ValueError("incomplete publication: " + "; ".join(errors)) + config = configuration(root, config_path) + publication = config.get("publication", {}) + modules = projects(root, config.get("maven", {}).get("standalone", [])) + version = modules[0][2] + ref = os.environ.get("GITHUB_REF") if ref is None else ref + channel = check_ref(version, ref or None, channel) + staging = "central-deferred" if channel == "snapshot" else "central-staging" + roots = publication.get("central_roots", ["target/{staging}"]) + central = {} + for item in roots: + folder = _inside(root, item.format(staging=staging)) + if not folder.is_dir(): + raise ValueError("missing Central staging: " + str(folder)) + for path in folder.rglob("*"): + if not path.is_file(): + continue + relative = path.relative_to(folder).as_posix() + safe_path(folder, relative) + if not PAYLOAD.fullmatch(path.name): + if REGENERATED.fullmatch(path.name): + continue # Maven metadata/checksums are regenerated, never mistaken for payload. + raise ValueError("unexpected file in Central staging: " + relative) + parts = PurePosixPath(relative).parts + if len(parts) < 4 or parts[-2] != version: + raise ValueError("unexpected Central coordinates: " + relative) + relative = PurePosixPath(*parts[:-1], central_name(parts[-1], parts[-3], version)).as_posix() + if relative in central and digest(central[relative]) != digest(path): + raise ValueError("conflicting Central input: " + relative) + central[relative] = path + names = [PurePosixPath(relative).name for relative in central] + if len(set(names)) != len(names): + raise ValueError("one file name under two Central coordinates: " + + str(sorted({name for name in names if names.count(name) > 1}))) + expected = expected_central(root, config, modules) + # Each artifact with its own signature, and no signature without its artifact. + wanted = expected | {name + ".asc" for name in expected} + if set(names) != wanted: + raise ValueError("Central membership mismatch; missing=" + str(sorted(wanted - set(names))) + + "; unexpected=" + str(sorted(set(names) - wanted))) + github_expected = expected_central(root, config, modules, only_central=False) + github_actual = {p.name for p in assets.iterdir() if not p.name.endswith(".asc")} + if github_actual != github_expected: + raise ValueError("GitHub membership does not match the release contract; missing=" + + str(sorted(github_expected - github_actual)) + + "; unexpected=" + str(sorted(github_actual - github_expected))) + # Require the Central pair to match GitHub; verify signatures on the frozen copy. + for path in sorted(assets.iterdir()): + if path.is_symlink() or not path.is_file(): + raise ValueError("non-flat publication input: " + str(path)) + if not ASSET_NAME.fullmatch(path.name): + raise ValueError("GitHub would rename release asset: " + path.name) + for relative, path in central.items(): + name = PurePosixPath(relative).name + if not (assets / name).is_file() or digest(assets / name) != digest(path): + raise ValueError("Central/GitHub bytes differ: " + relative) + # Build a temporary package, then promote it locally only after all checks succeed. + destination.parent.mkdir(parents=True, exist_ok=True) + with tempfile.TemporaryDirectory(prefix="publication-", dir=destination.parent) as tmp: + package = Path(tmp) / "package" + (package / "github").mkdir(parents=True) + for path in assets.iterdir(): + shutil.copyfile(path, package / "github" / path.name) + for relative, path in central.items(): + target = safe_path(package / "central", relative) + target.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(path, target) + for path in sorted((package / "github").iterdir()): + if not path.name.endswith(".asc"): + subprocess.run(["gpg", "--batch", "--verify", str(path) + ".asc", str(path)], check=True) + for path in (package / "central").rglob("*"): + if path.is_file() and digest(path) != digest(package / "github" / path.name): + raise ValueError("frozen Central/GitHub files differ: " + path.name) + manifest = {"schema": 1, "version": version, "channel": channel, + "commit": os.environ.get("GITHUB_SHA", ""), "files": {}} + for path in sorted(package.rglob("*")): + if path.is_file(): + manifest["files"][path.relative_to(package).as_posix()] = { + "sha256": digest(path), "size": path.stat().st_size} + (package / "manifest.json").write_text(json.dumps(manifest, indent=2) + "\n") + shutil.move(str(package), destination) + if os.environ.get("GITHUB_OUTPUT"): + with open(os.environ["GITHUB_OUTPUT"], "a") as output: + output.write("complete=true\n") + print(f"Publication ready: {version}; {len(expected)} Central artifacts; all signatures verified") + + +def verify(package): + """Transport integrity check; never regenerate or re-sign publication files.""" + package = Path(package).resolve() + manifest = json.loads((package / "manifest.json").read_text()) + if manifest.get("schema") != 1 or manifest.get("channel") not in ("snapshot", "release"): + raise ValueError("unsupported publication manifest") + if os.environ.get("GITHUB_SHA") and manifest.get("commit") != os.environ["GITHUB_SHA"]: + raise ValueError("publication belongs to a different commit") + actual = {p.relative_to(package).as_posix() for p in package.rglob("*") if p.is_file()} + if actual != set(manifest["files"]) | {"manifest.json"}: + raise ValueError("publication file membership changed") + for relative, info in manifest["files"].items(): + path = safe_path(package, relative) + if not path.is_file() or path.stat().st_size != info["size"] or digest(path) != info["sha256"]: + raise ValueError("publication bytes changed: " + relative) + return manifest + + +def snapshot_pom(package, destination, url=SNAPSHOTS): + """Generate transfer-only deploy-file executions, including all signature extensions. + + Maven handles timestamped snapshot names and metadata in one request per component. + There is no project build, dependency resolution, compilation or signing phase. + """ + manifest = verify(package) + if manifest["channel"] != "snapshot": + raise ValueError("snapshot transfer requires a SNAPSHOT version") + root = ET.Element("project", xmlns="http://maven.apache.org/POM/4.0.0") + def child(parent, name, text): + node = ET.SubElement(parent, name) + node.text = str(text) + return node + for name, value in [("modelVersion", "4.0.0"), ("groupId", "local.publication"), + ("artifactId", "snapshot-transfer"), ("version", "1"), ("packaging", "pom")]: + child(root, name, value) + plugin = ET.SubElement(ET.SubElement(ET.SubElement(root, "build"), "plugins"), "plugin") + child(plugin, "groupId", "org.apache.maven.plugins") + child(plugin, "artifactId", "maven-deploy-plugin") + child(plugin, "version", DEPLOY_PLUGIN) + executions = ET.SubElement(plugin, "executions") + central = Path(package).resolve() / "central" + for i, pom in enumerate(sorted(central.rglob("*.pom"))): + parts = pom.relative_to(central).parts + group, artifact, version = ".".join(parts[:-3]), parts[-3], parts[-2] + xml = ET.parse(pom).getroot() + packaging = xml.findtext("{*}packaging", "jar") + extension = "jar" if packaging == "maven-plugin" else packaging + base = f"{artifact}-{version}" + # A POM-only component has a single unclassified signature. Deploy-file + # treats an empty classifiers parameter as absent, so use that signature + # as the primary artifact and let pomFile attach its signed POM alongside. + transfer_packaging = "pom.asc" if packaging == "pom" else packaging + main = pom.parent / (f"{base}.pom.asc" if packaging == "pom" else f"{base}.{extension}") + if not main.is_file(): + raise ValueError("missing primary Central artifact: " + str(main)) + execution = ET.SubElement(executions, "execution") + child(execution, "id", f"transfer-{i}") + child(execution, "phase", "validate") + child(ET.SubElement(execution, "goals"), "goal", "deploy-file") + config = ET.SubElement(execution, "configuration") + for name, value in [("repositoryId", "central"), ("url", url), ("file", main), + ("pomFile", pom), ("groupId", group), ("artifactId", artifact), + ("version", version), ("packaging", transfer_packaging), ("generatePom", "false")]: + child(config, name, value) + attached = [] + for path in sorted(pom.parent.iterdir()): + if path in (pom, main): + continue + suffix = path.name[len(base):] if path.name.startswith(base) else "" + match = re.fullmatch(r"(?:-(.+))?\.(pom|jar|aar|json)(\.asc)?", suffix) + if not match: + raise ValueError("invalid attached artifact: " + path.name) + classifier = match[1] or "" + kind = match[2] + (match[3] or "") + if "," in str(path): + raise ValueError("comma in Maven transfer path") + attached.append((str(path), classifier, kind)) + if attached: + for name, column in [("files", 0), ("classifiers", 1), ("types", 2)]: + child(config, name, ",".join(item[column] for item in attached)) + ET.ElementTree(root).write(destination, encoding="utf-8", xml_declaration=True) + + +def superseded(repository, sha, run_id, github=None): + """True when one of the 30 most recent dispatched runs transferred the snapshot of a newer commit. + + The central-snapshot jobs of all runs share one concurrency group, so a newer run's transfer + either finished before this check or starts after this transfer: Maven Central serves the + snapshot transferred last as the latest one. Snapshots are published by dispatch only, so the + window of 30 runs reaches back far beyond any transfer still waiting in that group. + """ + gh = github or GitHub() + repo = f"repos/{repository}" + workflow = gh.api("GET", f"{repo}/actions/runs/{run_id}")["workflow_id"] + runs = gh.api("GET", f"{repo}/actions/workflows/{workflow}/runs?event=workflow_dispatch&per_page=30") + for run in runs["workflow_runs"]: + if run["id"] == int(run_id) or run["head_sha"] == sha: + continue + jobs, page = [], 1 + while True: + batch = gh.api("GET", f"{repo}/actions/runs/{run['id']}/jobs?filter=latest&per_page=100&page={page}") + jobs.extend(batch["jobs"]) + if len(batch["jobs"]) < 100: + break + page += 1 + if not any(job["name"] == CENTRAL_SNAPSHOT_JOB and job["conclusion"] == "success" for job in jobs): + continue + if gh.api("GET", f"{repo}/compare/{sha}...{run['head_sha']}")["status"] == "ahead": + print(f"Run {run['id']} already transferred the snapshot of newer commit {run['head_sha']}.") + return True + return False + + +def upload(package, *, skip_superseded=False, github=None): + """Transfer frozen files, accepting Portal upload without validation polling.""" + package = Path(package).resolve() + manifest = verify(package) + if manifest["channel"] == "snapshot": + if skip_superseded and superseded(os.environ["GITHUB_REPOSITORY"], os.environ["GITHUB_SHA"], + os.environ["GITHUB_RUN_ID"], github): + print("Skipping the transfer of this older snapshot.") + return + with tempfile.TemporaryDirectory(prefix="snapshot-transfer-") as tmp: + pom = Path(tmp) / "pom.xml" + snapshot_pom(package, pom) + # credentialScope=id: Maven 3.10 sends a server's credentials only to its declared + # origins, which for the id `central` is repo.maven.apache.org, so the upload to + # central.sonatype.com would go out anonymously (HTTP 401). This is the only upload by + # Maven; the staging deploys run with -DskipUpload=true and need no credentials. + subprocess.run(["mvn", "-B", "--no-transfer-progress", "-Dmaven.repository.credentialScope=id", + "-f", str(pom), "validate"], check=True) + return + with tempfile.TemporaryDirectory(prefix="central-transfer-") as tmp: + bundle = Path(tmp) / "central-bundle.zip" + with zipfile.ZipFile(bundle, "w", zipfile.ZIP_DEFLATED) as archive: + for relative in manifest["files"]: + if not relative.startswith("central/"): + continue + path = package / relative + name = relative[len("central/"):] + hashes = {a: hashlib.new(a) for a in ("md5", "sha1", "sha256", "sha512")} + with path.open("rb") as source, archive.open(name, "w", force_zip64=True) as target: + for block in iter(lambda: source.read(1024 * 1024), b""): + target.write(block) + for h in hashes.values(): + h.update(block) + if not name.endswith(".asc"): + for algorithm, h in hashes.items(): + archive.writestr(name + "." + algorithm, h.hexdigest()) + token = base64.b64encode((os.environ["MAVEN_USERNAME"] + ":" + + os.environ["MAVEN_PASSWORD"]).encode()).decode() + config = Path(tmp) / "curl.conf" + config.touch(mode=0o600) + config.write_text('header = "Authorization: Bearer ' + token + '"\n') + response = subprocess.run(["curl", "--fail-with-body", "--silent", "--show-error", + "--connect-timeout", "30", "--max-time", "1800", "--config", str(config), + "-F", "bundle=@" + str(bundle), PORTAL + "?publishingType=AUTOMATIC"], + text=True, capture_output=True) + if response.returncode: + raise RuntimeError("Central upload failed: " + response.stderr + response.stdout) + deployment = response.stdout.strip().strip('"') + if not re.fullmatch(r"[A-Za-z0-9_-]+", deployment): + raise RuntimeError("Central returned no valid deployment receipt") + print("Central accepted deployment: " + deployment) + print("Validation and publication continue asynchronously at Central; no polling.") + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + commands = parser.add_subparsers(dest="command", required=True) + check_parser = commands.add_parser("check-ref", help="check the project version against GITHUB_REF") + check_parser.add_argument("--channel", choices=("snapshot", "release"), required=True) + check_parser.add_argument("--config", type=Path, help="JSON contract (default: .github/release-assets.json)") + prepare_parser = commands.add_parser("prepare") + prepare_parser.add_argument("assets", type=Path) + prepare_parser.add_argument("package", type=Path) + prepare_parser.add_argument("--channel", choices=("snapshot", "release")) + prepare_parser.add_argument("--config", type=Path, help="JSON contract (default: .github/release-assets.json)") + verify_parser = commands.add_parser("verify") + verify_parser.add_argument("package", type=Path) + verify_parser.add_argument("--export-github", type=Path) + upload_parser = commands.add_parser("upload") + upload_parser.add_argument("package", type=Path) + upload_parser.add_argument("--skip-superseded", action="store_true", + help="skip a snapshot when another run transferred a newer commit") + args = parser.parse_args() + root = Path(__file__).resolve().parents[2] + if args.command == "check-ref": + config = configuration(root, args.config) + version = projects(root, config.get("maven", {}).get("standalone", []))[0][2] + check_ref(version, os.environ["GITHUB_REF"], args.channel) + print(f"Version {version} publishes as {args.channel} from {os.environ['GITHUB_REF']}") + elif args.command == "prepare": + prepare(root, args.assets, args.package, config_path=args.config, channel=args.channel) + elif args.command == "verify": + verify(args.package) + if args.export_github: + if args.export_github.exists(): + raise ValueError("GitHub export destination must not exist") + shutil.copytree(args.package / "github", args.export_github) + else: + upload(args.package, skip_superseded=args.skip_superseded) diff --git a/.github/buildcheck/releaseassets.py b/.github/buildcheck/releaseassets.py new file mode 100644 index 000000000..19c972d13 --- /dev/null +++ b/.github/buildcheck/releaseassets.py @@ -0,0 +1,209 @@ +# SPDX-FileCopyrightText: 2026 Bernard Ladenthin +# +# SPDX-License-Identifier: MIT OR Apache-2.0 +"""Collect signed Maven release assets and explicitly configured extra files. + +No repository names or native/Android layouts live here. See the workspace policy +policies/release-asset-scripts.md for the JSON contract and staging options. +""" + +import csv +import json +import re +import shutil +import xml.etree.ElementTree as ET +from pathlib import Path + + +def _keys(value, allowed, context): + if not isinstance(value, dict) or set(value) - set(allowed): + raise ValueError(f"invalid {context}; allowed keys: {', '.join(allowed)}") + + +def _inside(root, relative): + if not isinstance(relative, str) or not relative or Path(relative).is_absolute(): + raise ValueError(f"expected a repository-relative path: {relative!r}") + path = (root / relative).resolve() + if not path.is_relative_to(root): + raise ValueError(f"path escapes repository: {relative}") + return path + + +def configuration(root, path=None): + """Read the explicit contract; unknown keys fail instead of silently dropping assets. + + The contract is part of the repository: a relative --config is relative to the repository root, + and a path outside the repository is refused. + """ + root = Path(root).resolve() + path = (root / (path if path is not None else ".github/release-assets.json")).resolve() + if not path.is_relative_to(root): + raise ValueError(f"release asset configuration outside the repository: {path}") + config = json.loads(path.read_text()) + _keys(config, ("schema", "maven", "files", "publication"), "release asset configuration") + if type(config.get("schema")) is not int or config["schema"] != 1: + raise ValueError("release asset configuration requires schema: 1") + publication = config.get("publication", {}) + _keys(publication, ("central_roots",), "publication configuration") + if "central_roots" in publication and (not isinstance(publication["central_roots"], list) + or not publication["central_roots"] + or any(not isinstance(path, str) or not path for path in publication["central_roots"])): + raise ValueError("publication.central_roots must be a nonempty list of paths") + maven = config.get("maven", {}) + _keys(maven, ("standalone", "cyclonedx"), "maven configuration") + if not isinstance(maven.get("standalone", []), list): + raise ValueError("maven.standalone must be a list of module paths") + if type(maven.get("cyclonedx", False)) is not bool: + raise ValueError("maven.cyclonedx must be a boolean") + if not isinstance(config.get("files", []), list): + raise ValueError("files must be a list") + for rule in config.get("files", []): + if isinstance(rule, dict) and "central" in rule and type(rule["central"]) is not bool: + raise ValueError("file rule central must be a boolean") + return config + + +def projects(root, standalone=()): + """Discover the reactor recursively, then optional separately published Maven projects.""" + root = Path(root).resolve() + seen, result = set(), [] + + def visit(folder, reactor=True): + folder = folder.resolve() + if not folder.is_relative_to(root) or folder in seen: + raise ValueError(f"invalid or repeated Maven module: {folder}") + seen.add(folder) + pom = ET.parse(folder / "pom.xml").getroot() + artifact = pom.findtext("{*}artifactId") + version = pom.findtext("{*}version") or pom.findtext("{*}parent/{*}version") + packaging = pom.findtext("{*}packaging", "jar") + if (not artifact or not version or not re.fullmatch(r"[\w.-]+", artifact) + or not re.fullmatch(r"[\w.+-]+", version) + or packaging not in ("pom", "jar", "maven-plugin")): + raise ValueError(f"unsupported release coordinates in {folder / 'pom.xml'}") + if result and version != result[0][2]: + raise ValueError(f"release version mismatch in {folder / 'pom.xml'}: {version}") + result.append((folder, artifact, version, packaging, reactor)) + for module in pom.findall("{*}modules/{*}module"): + visit(_inside(root, str(folder.relative_to(root) / (module.text or "").strip())), reactor) + + visit(root) + for module in standalone: + visit(_inside(root, module), reactor=False) + return result + + +def _classifiers(root, spec): + if isinstance(spec, dict): + _keys(spec, ("csv", "column"), "classifier CSV") + if not isinstance(spec.get("column"), str) or not spec["column"]: + raise ValueError("classifier CSV requires a column") + with _inside(root, spec.get("csv")).open() as stream: + rows = csv.DictReader(line for line in stream if line.strip() and not line.lstrip().startswith("#")) + if spec["column"] not in (rows.fieldnames or []): + raise ValueError(f"missing classifier CSV column: {spec['column']}") + spec = [row[spec["column"]] for row in rows] + if (not isinstance(spec, list) or not spec or any(not isinstance(c, str) + or not re.fullmatch(r"[\w.-]*", c) for c in spec) or len(set(spec)) != len(spec)): + raise ValueError("classifiers must be a nonempty list of unique classifier names") + return spec + + +def _format(template, version, classifier): + if not isinstance(template, str) or not template: + raise ValueError("file source/name must be a nonempty string") + try: + return template.format(version=version, classifier=classifier) + except (KeyError, ValueError, IndexError, AttributeError) as error: + raise ValueError(f"invalid release filename template: {template}") from error + + +def file_classifiers(root, index, config_path=None): + """Let packaging loops consume the same classifier list the collector checks.""" + if index < 0: + raise ValueError("file rule index must not be negative") + config = configuration(root, config_path) + try: + item = config.get("files", [])[index] + except IndexError as error: + raise ValueError(f"no file rule at index {index}") from error + _keys(item, ("source", "name", "classifiers", "central"), "file rule") + return _classifiers(Path(root).resolve(), item.get("classifiers", [""])) + + +def collect(root, destination, config_path=None, *, maven_only=False, maven_assets=None): + """Copy available outputs, returning all missing files/signatures. Never hide partial output. + + maven_only stages deploy-signed files before later packaging overwrites target/. + maven_assets reads those staged files by their final names during the final collection. + """ + root, destination = Path(root).resolve(), Path(destination).resolve() + config = configuration(root, config_path) + modules = projects(root, config.get("maven", {}).get("standalone", [])) + version, expected, errors = modules[0][2], [], [] + for folder, artifact, _, packaging, reactor in modules: + base = f"{artifact}-{version}" + outputs = [(folder / "target" / f"{base}.pom", f"{base}.pom")] + if packaging != "pom": + for classifier in ("", "-sources", "-javadoc"): + name = f"{base}{classifier}.jar" + outputs.append((folder / "target" / name, name)) + if reactor and config.get("maven", {}).get("cyclonedx", False): + outputs.append((folder / "target/bom.json", f"{base}-cyclonedx.json")) + for source, name in outputs: + expected.append((Path(maven_assets) / name if maven_assets is not None else source, name)) + + for item in [] if maven_only else config.get("files", []): + _keys(item, ("source", "name", "classifiers", "central"), "file rule") + for classifier in _classifiers(root, item.get("classifiers", [""])): + pattern = _format(item.get("source"), version, classifier) + _inside(root, pattern) + matches = sorted(root.glob(pattern)) + if len(matches) != 1: + errors.append(f"expected one release output matching {pattern}, found {len(matches)}") + continue + source = matches[0] + _inside(root, str(source.relative_to(root))) + name = _format(item["name"], version, classifier) if "name" in item else source.name + expected.append((source, name)) + + names = set() + for source, name in expected: + if (Path(name).name != name or name in (".", "..") or name.endswith(".asc") + or name in names or name + ".asc" in names): + raise ValueError(f"invalid or duplicate release asset filename: {name}") + names.update((name, name + ".asc")) + if destination == source.parent.resolve(): + raise ValueError("asset destination overlaps release inputs") + destination.mkdir(parents=True, exist_ok=True) + if any(destination.iterdir()): + raise ValueError(f"asset destination must be empty: {destination}") + for source, name in expected: + for suffix in ("", ".asc"): + path = Path(str(source) + suffix).resolve() + if not path.is_file() or path.stat().st_size == 0: + shown = path.relative_to(root) if path.is_relative_to(root) else path + errors.append(f"missing or empty release output: {shown.as_posix()}") + continue + shutil.copyfile(path, destination / (name + suffix)) + return errors + + +def signature_gaps(directory): + """Presence/size check for every file type; signing itself verifies cryptographic validity.""" + directory = Path(directory) + files = sorted(directory.iterdir()) if directory.is_dir() else [] + artifacts = [path for path in files if not path.name.endswith(".asc")] + if not artifacts: + return -1, [f"no artifacts in {directory} -- the collection step produced nothing"] + errors = [] + for path in artifacts: + signature = Path(str(path) + ".asc") + if not path.is_file() or path.stat().st_size == 0: + errors.append(f"missing or empty artifact: {path.name}") + elif not signature.is_file() or signature.stat().st_size == 0: + errors.append(f"unsigned: {path.name} has no nonempty detached .asc") + for path in files: + if path.name.endswith(".asc") and not path.with_suffix("").is_file(): + errors.append(f"orphan signature: {path.name}") + return len(errors), errors diff --git a/.github/buildcheck/snapshot.py b/.github/buildcheck/snapshot.py new file mode 100644 index 000000000..253535c0e --- /dev/null +++ b/.github/buildcheck/snapshot.py @@ -0,0 +1,136 @@ +# SPDX-FileCopyrightText: 2026 Bernard Ladenthin +# +# SPDX-License-Identifier: MIT OR Apache-2.0 +"""Update the rolling snapshot without replacing a newer publish or deleting the release. + +The workflow serializes this entire operation with a job concurrency group. The ancestry/run +checks also reject an older build which finishes after a newer build has already published. +An incomplete collection changes nothing: no upload, no tag or notes update, no prune. The first +snapshot starts as a draft, so a failed first upload leaves neither a public release nor a tag. +""" + +import json +import re +import subprocess +from pathlib import Path + +from .releaseassets import signature_gaps + +# GitHub renames release assets with other characters; a renamed asset would be pruned as obsolete. +ASSET_NAME = re.compile(r"[A-Za-z0-9][A-Za-z0-9._-]*") + + +class GitHub: + def command(self, *args): + subprocess.run(["gh", *map(str, args)], check=True) + + def api(self, method, endpoint, payload=None, optional=False): + args = ["gh", "api", "--method", method, endpoint] + if payload is not None: + args += ["--input", "-"] + result = subprocess.run(args, input=json.dumps(payload) if payload is not None else None, + text=True, capture_output=True) + if result.returncode: + if optional and "HTTP 404" in result.stderr: + return None + raise RuntimeError(f"GitHub {method} {endpoint}: {result.stderr.strip()}") + return json.loads(result.stdout) if result.stdout.strip() else None + + +def publish(repository, sha, run_id, attempt, assets_dir, complete, github=None, + *, tag="snapshot", title="Snapshot (latest)"): + """Return False for a superseded run; otherwise upload and update the rolling release.""" + if not re.fullmatch(r"[\w.-]+/[\w.-]+", repository) or not re.fullmatch(r"[0-9a-f]{40}", sha): + raise ValueError("invalid repository or published commit") + if not re.fullmatch(r"[\w][\w.-]*", tag) or ".." in tag or tag.endswith((".", ".lock")): + raise ValueError("invalid rolling release tag") + if re.match(r"v\d", tag): + raise ValueError("a versioned release is never a rolling snapshot: " + tag) + run_id, attempt = int(run_id), int(attempt) + if run_id < 1 or attempt < 1: + raise ValueError("run ID and attempt must be positive") + files = sorted(Path(assets_dir).iterdir()) + if not files or any(not path.is_file() for path in files): + raise ValueError("refusing to update snapshot without a nonempty, flat asset directory") + artifacts = [path for path in files if not path.name.endswith(".asc")] + if not artifacts: + raise ValueError("refusing to update snapshot with signatures but no artifacts") + names = {path.name for path in files} + renamed = sorted(name for name in names if not ASSET_NAME.fullmatch(name)) + if renamed: + raise ValueError("GitHub would rename release assets: " + ", ".join(renamed)) + missing, errors = signature_gaps(assets_dir) + if not complete or missing: + raise ValueError("refusing to update snapshot from an incomplete collection; existing " + "snapshot metadata and assets were retained" + "".join("; " + e for e in errors)) + gh = github or GitHub() + repo = f"repos/{repository}" + ref = gh.api("GET", f"{repo}/git/ref/tags/{tag}", optional=True) + release = gh.api("GET", f"{repo}/releases/tags/{tag}", optional=True) + published = ref["object"] if ref else None + # Annotated tags point to tag objects, not directly to commits. + for _ in range(8): + if not published or published["type"] != "tag": + break + published = gh.api("GET", f"{repo}/git/tags/{published['sha']}")["object"] + if published and published["type"] != "commit": + raise ValueError("snapshot tag does not resolve to a commit") + if published and published["sha"] != sha: + comparison = gh.api("GET", f"{repo}/compare/{published['sha']}...{sha}") + if comparison["status"] == "behind": + print("Snapshot already names a newer commit; skipping this older build.") + return False + if comparison["status"] not in ("ahead", "identical"): + raise ValueError("refusing to replace snapshot with a divergent commit") + if release: + marker = re.search(r"", + release.get("body") or "") + if marker and marker[3] == sha and (int(marker[1]), int(marker[2])) > (run_id, attempt): + print("Snapshot already names a newer run/attempt of this commit; skipping.") + return False + + body = (f"Snapshot from [{sha[:8]}](https://github.com/{repository}/commit/{sha}).\n\n" + f"[Publish run {run_id}, attempt {attempt}]" + f"(https://github.com/{repository}/actions/runs/{run_id}/attempts/{attempt}).\n\n" + f"") + if not release: + # The first snapshot is a draft until its upload is complete: no public release and no tag + # that names this build before its assets are there. A draft a failed run left behind is + # reused (the tag lookup above does not see drafts). + release = next((r for r in gh.api("GET", f"{repo}/releases?per_page=100") or [] + if r.get("draft") and r.get("tag_name") == tag), None) + if not release: + release = gh.api("POST", f"{repo}/releases", { + "tag_name": tag, "target_commitish": sha, "name": title, "prerelease": True, + "draft": True, "body": "Snapshot upload in progress." + }) + gh.command("release", "upload", tag, *files, "--repo", repository, "--clobber") + + if ref: + gh.api("PATCH", f"{repo}/git/refs/tags/{tag}", {"sha": sha, "force": True}) + else: + gh.api("POST", f"{repo}/git/refs", {"ref": f"refs/tags/{tag}", "sha": sha}) + gh.api("PATCH", f"{repo}/releases/{release['id']}", { + "target_commitish": sha, "name": title, "prerelease": True, "draft": False, "body": body + }) + + # Read every page before deleting: deleting while paginating could skip shifted entries. + assets = [] + page = 1 + while True: + batch = gh.api("GET", f"{repo}/releases/{release['id']}/assets?per_page=100&page={page}") + assets.extend(batch) + if len(batch) < 100: + break + page += 1 + failures = [] + for asset in assets: + if asset["name"] not in names: + try: + print(f"Removing obsolete snapshot asset: {asset['name']}") + gh.api("DELETE", f"{repo}/releases/assets/{asset['id']}", optional=True) + except RuntimeError as error: + failures.append(str(error)) + if failures: + raise RuntimeError("; ".join(failures)) + return True diff --git a/.github/buildcheck/tests/test_mirror.py b/.github/buildcheck/tests/test_mirror.py new file mode 100644 index 000000000..3889ec533 --- /dev/null +++ b/.github/buildcheck/tests/test_mirror.py @@ -0,0 +1,163 @@ +# SPDX-FileCopyrightText: 2026 Bernard Ladenthin +# +# SPDX-License-Identifier: MIT OR Apache-2.0 + +import base64 +import json +import os +import shutil +import subprocess +import tempfile +import unittest +from pathlib import Path + +from buildcheck import workflow +from buildcheck.tests.helpers import REPO + + +GIT = shutil.which("git") +BASH = shutil.which("bash") +TOKEN = "mirror-dummy-token-for-tests" +URL = "https://github.com/owner/mirror.git" + + +@unittest.skipUnless(GIT and BASH, "git and bash are required") +class MirrorTest(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.root = Path(self.temp.name) + self.source = self.root / "source" + self.source.mkdir() + self.log = self.root / "calls.jsonl" + self.env = {**os.environ, "GIT_CONFIG_NOSYSTEM": "1", "GIT_CONFIG_GLOBAL": "/dev/null", + "GIT_CONFIG_COUNT": "0", "GIT_TERMINAL_PROMPT": "0", "GITHUB_ACTIONS": "false", + "LLAMA_MIRROR_TOKEN": TOKEN} + self.git("init", "-q", "--object-format=sha1") + self.git("-c", "user.name=Test", "-c", "user.email=test@example.invalid", + "-c", "commit.gpgsign=false", "commit", "--allow-empty", "-qm", "fixture") + self.sha = self.git("rev-parse", "HEAD").strip() + (self.root / "llama").mkdir() + (self.root / "llama/CMakeLists.txt").write_text( + f'set(JLLAMA_GIT_TAG b1)\nset(JLLAMA_GIT_COMMIT "{self.sha}")\n') + scripts = self.root / ".github" + scripts.mkdir() + self.script = scripts / "mirror-llama-source.sh" + shutil.copyfile(Path(REPO) / ".github/mirror-llama-source.sh", self.script) + + # Like checkout v7: credentials in an included file, with a URL-specific header. + credentials = self.root / "checkout-credentials.config" + subprocess.run([GIT, "config", "--file", str(credentials), + "http.https://github.com/.extraheader", "AUTHORIZATION: basic CHECKOUT_DUMMY"], + check=True, env=self.env) + self.git("config", "include.path", str(credentials)) + # A stale exact-URL setting must also be replaced, not appended as a second auth header. + self.git("config", f"http.{URL}.extraheader", "AUTHORIZATION: basic STALE_DUMMY") + self.git("config", f"credential.{URL}.helper", "unused-dummy-helper") + self.config_before = (self.source / ".git/config").read_bytes() + self.credentials_before = credentials.read_bytes() + + # Real Git handles every local operation and the config lookup. Network operations are + # intercepted before Git can run them, so this suite cannot contact or write to GitHub. + fake = self.root / "bin/git" + fake.parent.mkdir() + fake.write_text('''#!/usr/bin/env python3 +import json, os, subprocess, sys +args = sys.argv[1:] +operation = next((value for value in ("ls-remote", "push") if value in args), None) +if operation is None: + raise SystemExit(subprocess.call([os.environ["REAL_GIT"], *args])) +prefix = args[:args.index(operation)] +url = next(value for value in args if value.startswith("https://")) +def config(key): + result = subprocess.run([os.environ["REAL_GIT"], *prefix, "config", "--get-urlmatch", key, url], + text=True, capture_output=True) + return [line for line in result.stdout.splitlines() if line] +with open(os.environ["MIRROR_TEST_LOG"], "a") as log: + log.write(json.dumps({"operation": operation, "args": args, + "headers": config("http.extraheader"), + "helpers": config("credential.helper"), + "prompt": os.environ.get("GIT_TERMINAL_PROMPT")}) + "\\n") +if os.environ.get("MIRROR_TEST_FAIL") == operation: + print("simulated authentication/transport failure", file=sys.stderr) + raise SystemExit(128) +if operation == "ls-remote" and os.environ.get("MIRROR_TEST_EXISTING"): + print(os.environ["MIRROR_TEST_EXISTING"] + "\\trefs/tags/jllama/b1") +''') + fake.chmod(0o755) + self.env.update({"REAL_GIT": GIT, "MIRROR_TEST_LOG": str(self.log), + "PATH": str(fake.parent) + os.pathsep + os.environ["PATH"]}) + + def git(self, *args): + result = subprocess.run([GIT, "-C", str(self.source), *args], env=self.env, + capture_output=True, text=True, check=True) + return result.stdout + + def run_script(self, **environment): + return subprocess.run([BASH, str(self.script), str(self.source), "owner/mirror"], + env={**self.env, **environment}, capture_output=True, text=True) + + def calls(self): + return [json.loads(line) for line in self.log.read_text().splitlines()] if self.log.exists() else [] + + def test_explicit_mirror_token_replaces_inherited_credentials_without_persisting_or_argv_secret(self): + result = self.run_script() + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + calls = self.calls() + self.assertEqual([call["operation"] for call in calls], ["ls-remote", "push"]) + encoded = base64.b64encode(("x-access-token:" + TOKEN).encode()).decode() + for call in calls: + self.assertEqual(call["headers"], ["AUTHORIZATION: basic " + encoded]) + self.assertEqual(call["helpers"], []) + self.assertEqual(call["prompt"], "0") + self.assertNotIn(TOKEN, " ".join(call["args"])) + self.assertNotIn(encoded, " ".join(call["args"])) + self.assertNotIn(TOKEN, result.stdout + result.stderr) + self.assertNotIn(encoded, result.stdout + result.stderr) + self.assertEqual((self.source / ".git/config").read_bytes(), self.config_before) + self.assertEqual((self.root / "checkout-credentials.config").read_bytes(), self.credentials_before) + self.assertEqual(calls[-1]["args"][-1], self.sha + ":refs/tags/jllama/b1") + self.assertNotIn("--force", calls[-1]["args"]) + + def test_existing_matching_tag_needs_no_push(self): + result = self.run_script(MIRROR_TEST_EXISTING=self.sha) + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + self.assertEqual([call["operation"] for call in self.calls()], ["ls-remote"]) + + def test_existing_different_tag_is_never_overwritten(self): + result = self.run_script(MIRROR_TEST_EXISTING="a" * 40) + self.assertNotEqual(result.returncode, 0) + self.assertIn("one number, one commit", result.stderr) + self.assertEqual([call["operation"] for call in self.calls()], ["ls-remote"]) + + def test_failed_remote_read_is_not_treated_as_an_absent_tag(self): + result = self.run_script(MIRROR_TEST_FAIL="ls-remote") + self.assertNotEqual(result.returncode, 0) + self.assertEqual([call["operation"] for call in self.calls()], ["ls-remote"]) + + def test_failed_push_remains_a_failure(self): + result = self.run_script(MIRROR_TEST_FAIL="push") + self.assertNotEqual(result.returncode, 0) + self.assertNotIn("mirror-llama-source: pushed", result.stdout) + + def test_missing_token_and_wrong_source_are_refused_before_any_network_call(self): + result = self.run_script(LLAMA_MIRROR_TOKEN="") + self.assertNotEqual(result.returncode, 0) + self.assertIn("LLAMA_MIRROR_TOKEN is empty", result.stderr) + (self.root / "llama/CMakeLists.txt").write_text( + 'set(JLLAMA_GIT_TAG b1)\nset(JLLAMA_GIT_COMMIT "' + "a" * 40 + '")\n') + result = self.run_script() + self.assertNotEqual(result.returncode, 0) + self.assertEqual(self.calls(), []) + + def test_both_mirror_checkouts_disable_persisted_credentials(self): + jobs = workflow.parse((Path(REPO) / ".github/workflows/publish.yml").read_text()) + checkouts = [step for step in jobs["mirror-llama-source"].steps() + if any("uses: actions/checkout@" in line for line in step)] + self.assertEqual(len(checkouts), 2) + for step in checkouts: + self.assertIn(" persist-credentials: false", step) + + +if __name__ == "__main__": + unittest.main() diff --git a/.github/buildcheck/tests/test_natives.py b/.github/buildcheck/tests/test_natives.py index e442cc125..35c182174 100644 --- a/.github/buildcheck/tests/test_natives.py +++ b/.github/buildcheck/tests/test_natives.py @@ -396,6 +396,8 @@ def test_agent_version(self): def pom(version): return ('4.0.0' f'9{version}') + self.assertEqual(natives.check_agent_license("MIT License\n", "MIT License\n"), []) + self.assertEqual(len(natives.check_agent_license("MIT License\n", "MIT License\nold\n")), 1) self.assertEqual(natives.check_agent_version(pom("5.2.0-SNAPSHOT"), pom("5.2.0-SNAPSHOT")), []) self.assertEqual(natives.check_agent_version(pom("5.2.0"), pom("5.2.0-SNAPSHOT")), ["llama-atmosphere-agent/pom.xml is version 5.2.0-SNAPSHOT, the reactor 5.2.0: " diff --git a/.github/buildcheck/tests/test_publication.py b/.github/buildcheck/tests/test_publication.py new file mode 100644 index 000000000..19162693c --- /dev/null +++ b/.github/buildcheck/tests/test_publication.py @@ -0,0 +1,432 @@ +# SPDX-FileCopyrightText: 2026 Bernard Ladenthin +# SPDX-License-Identifier: MIT OR Apache-2.0 +"""Publication gate and transport invariants; no signing key or remote writes.""" +import base64 +import json +import os +from pathlib import Path +import subprocess +import tempfile +import unittest +from unittest.mock import patch +import xml.etree.ElementTree as ET +import zipfile + +from buildcheck.publication import (CENTRAL_SNAPSHOT_JOB, central_name, check_ref, prepare, snapshot_pom, + superseded, upload, verify) +from buildcheck import workflow +from buildcheck.tests.helpers import REPO + + +class PublicationFixture(unittest.TestCase): + def setUp(self): + self.tmp = tempfile.TemporaryDirectory() + self.addCleanup(self.tmp.cleanup) + self.root = Path(self.tmp.name) + (self.root / '.github').mkdir() + (self.root / '.github/release-assets.json').write_text('{"schema":1}') + self.pom = '4.0.0local.testdemo1-SNAPSHOT' + (self.root / 'pom.xml').write_text(self.pom) + self.assets = self.root / 'assets' + self.assets.mkdir() + self.stage = self.root / 'target/central-deferred/local/test/demo/1-SNAPSHOT' + self.stage.mkdir(parents=True) + for suffix in ['.pom', '.jar', '-sources.jar', '-javadoc.jar']: + name = 'demo-1-SNAPSHOT' + suffix + for extra in ['', '.asc']: + data = self.pom if suffix == '.pom' and not extra else name + extra + (self.assets / (name + extra)).write_text(data) + (self.stage / (name + extra)).write_text(data) + self.package = self.root / 'package' + self.signatures = patch('buildcheck.publication.subprocess.run') + self.run = self.signatures.start() + self.addCleanup(self.signatures.stop) + quiet = patch('builtins.print') + quiet.start() + self.addCleanup(quiet.stop) + + def freeze(self, **kwargs): + # ref="" keeps the runner's GITHUB_REF (a tag on a release run) out of the snapshot fixture. + prepare(self.root, self.assets, self.package, **{"ref": "", **kwargs}) + + def add(self, directory, name, data=None): + for extra in ("", ".asc"): + (directory / (name + extra)).write_text((data or name) + extra) + + def release(self): + """Turn the fixture into version 1.2.3, staged as Maven stages a release.""" + pom = self.pom.replace("1-SNAPSHOT", "1.2.3") + (self.root / "pom.xml").write_text(pom) + stage = self.root / "target/central-staging/local/test/demo/1.2.3" + stage.mkdir(parents=True) + for path in list(self.assets.iterdir()): + path.unlink() + for suffix in [".pom", ".jar", "-sources.jar", "-javadoc.jar"]: + for directory in (self.assets, stage): + self.add(directory, "demo-1.2.3" + suffix, pom if suffix == ".pom" else None) + + +class PublicationTest(PublicationFixture): + def test_freezes_once_and_verifies_every_signature(self): + self.freeze() + self.assertEqual(self.run.call_count, 4) + self.assertEqual(verify(self.package)['channel'], 'snapshot') + (self.assets / 'demo-1-SNAPSHOT.jar').write_text('later rebuild') + self.assertNotEqual((self.package / 'github/demo-1-SNAPSHOT.jar').read_text(), 'later rebuild') + verify(self.package) + + def test_missing_signature_or_wrong_central_bytes_block_both_publishers(self): + sig = self.assets / 'demo-1-SNAPSHOT.jar.asc' + sig.unlink() + with self.assertRaisesRegex(ValueError, 'incomplete'): + self.freeze() + self.assertFalse(self.package.exists()) + sig.write_text('signature') + with self.assertRaisesRegex(ValueError, 'bytes differ'): + self.freeze() + self.assertFalse(self.package.exists()) + + def test_invalid_signature_blocks_package_creation(self): + import subprocess + self.run.side_effect = subprocess.CalledProcessError(1, 'gpg') + with self.assertRaises(subprocess.CalledProcessError): + self.freeze() + self.assertFalse(self.package.exists()) + + def test_transport_tampering_and_extra_files_are_rejected(self): + self.freeze() + unexpected = self.package / 'unexpected.txt' + unexpected.write_text('extra') + with self.assertRaisesRegex(ValueError, 'membership'): + verify(self.package) + unexpected.unlink() + (self.package / 'github/demo-1-SNAPSHOT.jar').write_text('tampered') + with self.assertRaisesRegex(ValueError, 'bytes changed'): + verify(self.package) + + def test_snapshot_transfer_retains_signature_extensions(self): + self.freeze() + target = self.root / 'transfer.xml' + snapshot_pom(self.package, target, 'file:///unused-local-diagnostic') + xml = ET.parse(target).getroot() + config = xml.find('.//{*}configuration') + self.assertIn('jar.asc', config.findtext('{*}types')) + self.assertIn('pom.asc', config.findtext('{*}types')) + self.assertEqual(xml.findtext('.//{*}phase'), 'validate') + self.assertEqual(config.findtext('{*}generatePom'), 'false') + + def test_pom_only_component_transfers_signature_and_pom_together(self): + pom = self.pom.replace('', 'pom') + (self.root / 'pom.xml').write_text(pom) + for directory in (self.assets, self.stage): + for path in directory.iterdir(): + if '.jar' in path.name: + path.unlink() + (directory / 'demo-1-SNAPSHOT.pom').write_text(pom) + self.freeze() + target = self.root / 'pom-transfer.xml' + snapshot_pom(self.package, target) + config = ET.parse(target).getroot().find('.//{*}configuration') + self.assertEqual(config.findtext('{*}packaging'), 'pom.asc') + self.assertTrue(config.findtext('{*}file').endswith('.pom.asc')) + self.assertTrue(config.findtext('{*}pomFile').endswith('.pom')) + self.assertIsNone(config.find('{*}files')) + + def test_publishers_depend_only_on_the_same_checked_handoff(self): + jobs = workflow.parse((Path(REPO) / '.github/workflows/publish.yml').read_text()) + action = (Path(REPO) / '.github/actions/finalize-publication/action.yml').read_text() + self.assertIn('steps.ready.outputs.complete', action) + order = ['id: collect', 'id: preflight', 'id: handoff', 'id: ready'] + self.assertEqual([action.index(item) for item in order], sorted(action.index(item) for item in order)) + self.assertIn('if-no-files-found: error', action) + self.assertNotIn('always()', action) + self.assertNotIn('continue-on-error', action) + for channel in ['snapshot', 'release']: + prep = jobs['publish-' + channel] + self.assertIn('steps.finalize.outputs.complete', prep.text) + self.assertIn('uses: ./.github/actions/finalize-publication', prep.text) + self.assertIn('channel: ' + channel, prep.text) + self.assertNotIn('publication.py prepare', prep.text) + self.assertNotIn('attestations: write', prep.text) + self.assertNotIn('id-token: write', prep.text) + self.assertIn('-DskipUpload=true deploy', prep.text) + self.assertNotIn('publishAllPublicationsToCentralSnapshotsRepository', prep.text) + for consumer in ['central', 'github', 'attest']: + job = jobs[consumer + '-' + channel] + self.assertEqual(job.needs, ['publish-' + channel]) + self.assertIn("needs.publish-" + channel + ".outputs.assets_complete == 'true'", job.text) + self.assertIn('digest-mismatch: error', job.text) + self.assertIn('publication.py upload publication-package', jobs['central-' + channel].text) + self.assertIn('publication.py verify publication-package', jobs['github-' + channel].text) + attest = jobs['attest-' + channel].text + self.assertLess(attest.index('publication.py verify'), attest.index('uses: actions/attest-build-provenance@')) + self.assertIn('subject-path: publication-package/github/*', attest) + self.assertIn('id-token: write', attest) + self.assertIn('attestations: write', attest) + + def test_snapshot_channel_and_ref_must_match_the_version(self): + with self.assertRaisesRegex(ValueError, "release publication of snapshot version"): + self.freeze(channel="release") + with self.assertRaisesRegex(ValueError, "tag v1 names SNAPSHOT version"): + self.freeze(ref="refs/tags/v1") + self.assertFalse(self.package.exists()) + self.freeze(channel="snapshot", ref="refs/heads/main") + self.assertEqual(verify(self.package)["channel"], "snapshot") + + def test_release_publishes_only_from_the_tag_of_its_version(self): + self.release() + for ref in ("refs/heads/main", "refs/tags/v1.2.4", "refs/tags/1.2.3"): + with self.subTest(ref=ref): + with self.assertRaisesRegex(ValueError, "publishes only from tag v1.2.3"): + self.freeze(ref=ref) + with self.assertRaisesRegex(ValueError, "snapshot publication of release version"): + self.freeze(channel="snapshot", ref="refs/tags/v1.2.3") + self.freeze(channel="release", ref="refs/tags/v1.2.3") + self.assertEqual(verify(self.package)["channel"], "release") + + def test_check_ref_without_a_ref_checks_only_the_channel(self): + self.assertEqual(check_ref("1-SNAPSHOT", None), "snapshot") + self.assertEqual(check_ref("1.0", None, "release"), "release") + self.assertEqual(check_ref("1-SNAPSHOT", "refs/pull/7/merge", "snapshot"), "snapshot") + with self.assertRaises(ValueError): + check_ref("1.0", None, "snapshot") + + def test_gradle_timestamped_snapshot_in_a_second_root_matches_the_github_names(self): + (self.root / ".github/release-assets.json").write_text(json.dumps({ + "schema": 1, + "files": [{"source": "mobile/build/mobile-{version}.aar", "central": True}, + {"source": "mobile/build/pom-default.xml", "name": "mobile-{version}.pom", "central": True}, + {"source": "mobile/build/notes-{version}.txt"}], + "publication": {"central_roots": ["target/{staging}", "mobile/build/staging-repo"]}})) + build = self.root / "mobile/build" + build.mkdir(parents=True) + self.add(build, "mobile-1-SNAPSHOT.aar") + self.add(build, "pom-default.xml", "mobile pom") + self.add(build, "notes-1-SNAPSHOT.txt") + for name in ("mobile-1-SNAPSHOT.aar", "mobile-1-SNAPSHOT.pom", "notes-1-SNAPSHOT.txt"): + source = build / ("pom-default.xml" if name.endswith(".pom") else name) + for extra in ("", ".asc"): + (self.assets / (name + extra)).write_bytes(Path(str(source) + extra).read_bytes()) + # What Gradle's maven-publish writes for a SNAPSHOT, even into a file repository. + gradle = self.root / "mobile/build/staging-repo/local/test/mobile/1-SNAPSHOT" + gradle.mkdir(parents=True) + stamp = "mobile-1-20261025.085646-1" + for name, source in ((stamp + ".aar", "mobile-1-SNAPSHOT.aar"), (stamp + ".pom", "pom-default.xml")): + for extra in ("", ".asc"): + (gradle / (name + extra)).write_bytes((build / (source + extra)).read_bytes()) + for checksum in (".md5", ".sha1", ".sha256", ".sha512"): + (gradle / (name + checksum)).write_text("regenerated") + (gradle / "maven-metadata.xml").write_text("") + (gradle.parent / "maven-metadata.xml.sha1").write_text("regenerated") + (self.root / "target/central-deferred/.index").write_text("plugin bookkeeping") + self.freeze() + files = verify(self.package)["files"] + self.assertIn("central/local/test/mobile/1-SNAPSHOT/mobile-1-SNAPSHOT.aar.asc", files) + self.assertIn("central/local/test/mobile/1-SNAPSHOT/mobile-1-SNAPSHOT.pom", files) + self.assertIn("github/notes-1-SNAPSHOT.txt.asc", files) + self.assertFalse(any("notes" in name for name in files if name.startswith("central/"))) + self.assertFalse(any("2026" in name or "metadata" in name or name.endswith(".md5") for name in files)) + + def test_github_only_file_in_central_staging_and_unknown_staging_files_fail(self): + self.add(self.stage, "demo-1-SNAPSHOT-cyclonedx.json") + self.add(self.assets, "demo-1-SNAPSHOT-cyclonedx.json") + with self.assertRaisesRegex(ValueError, "unexpected=.*cyclonedx"): + self.freeze() + for name in ("demo-1-SNAPSHOT-cyclonedx.json", "demo-1-SNAPSHOT-cyclonedx.json.asc"): + (self.stage / name).unlink() + (self.assets / name).unlink() + for name in ("demo-1-SNAPSHOT.module", "demo-1-SNAPSHOT-bundle.zip"): + with self.subTest(name=name): + (self.stage / name).write_text("payload the transfer would not carry") + with self.assertRaisesRegex(ValueError, "unexpected file in Central staging: .*" + name): + self.freeze() + (self.stage / name).unlink() + self.assertFalse(self.package.exists()) + + def test_central_signatures_pair_by_name_not_by_count(self): + # One signature missing and one orphan keep the count; the gate names both. + (self.stage / "demo-1-SNAPSHOT.jar.asc").unlink() + (self.stage / "demo-1-SNAPSHOT-tests.jar.asc").write_text("orphan") + with self.assertRaisesRegex(ValueError, r"missing=\['demo-1-SNAPSHOT.jar.asc'\]; " + r"unexpected=\['demo-1-SNAPSHOT-tests.jar.asc'\]"): + self.freeze() + + def test_github_asset_names_github_would_rename_fail(self): + (self.root / ".github/release-assets.json").write_text(json.dumps( + {"schema": 1, "files": [{"source": "dist/demo {version}.zip"}]})) + (self.root / "dist").mkdir() + self.add(self.root / "dist", "demo 1-SNAPSHOT.zip") + self.add(self.assets, "demo 1-SNAPSHOT.zip") + with self.assertRaisesRegex(ValueError, "GitHub would rename release asset: demo 1-SNAPSHOT.zip"): + self.freeze() + + def test_a_contract_outside_the_repository_is_refused(self): + outside = Path(self.tmp.name).parent / (Path(self.tmp.name).name + "-outside.json") + outside.write_text('{"schema":1}') + self.addCleanup(outside.unlink) + with self.assertRaisesRegex(ValueError, "outside the repository"): + self.freeze(config_path=outside) + with self.assertRaisesRegex(ValueError, "outside the repository"): + self.freeze(config_path="../" + outside.name) + + def test_prepare_reads_the_given_contract(self): + other = self.root / "other.json" + other.write_text(json.dumps({"schema": 1, "files": [{"source": "extra-{version}.txt"}]})) + self.add(self.root, "extra-1-SNAPSHOT.txt") + with self.assertRaisesRegex(ValueError, r"GitHub membership.*missing=\['extra-1-SNAPSHOT.txt'\]"): + self.freeze(config_path=other) + self.add(self.assets, "extra-1-SNAPSHOT.txt") + self.freeze(config_path=other) + self.assertIn("github/extra-1-SNAPSHOT.txt", verify(self.package)["files"]) + + def test_timestamp_names_are_normalized_only_for_their_own_artifact_and_snapshot(self): + self.assertEqual(central_name("app-1.0-20261025.085646-12-sources.jar", "app", "1.0-SNAPSHOT"), + "app-1.0-SNAPSHOT-sources.jar") + self.assertEqual(central_name("app-1.0-SNAPSHOT.jar", "app", "1.0-SNAPSHOT"), "app-1.0-SNAPSHOT.jar") + self.assertEqual(central_name("app-tool-1.0-20261025.085646-1.jar", "app", "1.0-SNAPSHOT"), + "app-tool-1.0-20261025.085646-1.jar") + self.assertEqual(central_name("app-1.0-20261025.085646-1.jar", "app", "1.0"), + "app-1.0-20261025.085646-1.jar") + + +class UploadTest(PublicationFixture): + """The two transfers with the network and Maven replaced; the bytes are the frozen ones.""" + + def setUp(self): + super().setUp() + self.signatures.stop() # upload() runs curl/mvn, each test patches subprocess.run itself + env = patch.dict(os.environ, {"MAVEN_USERNAME": "user", "MAVEN_PASSWORD": "secret", + "GITHUB_REPOSITORY": "owner/repo", "GITHUB_SHA": "", + "GITHUB_RUN_ID": "10"}) + env.start() + self.addCleanup(env.stop) + + def frozen(self, release=False): + with patch("buildcheck.publication.subprocess.run"): + if release: + self.release() + self.freeze(ref="refs/tags/v1.2.3") + else: + self.freeze() + return self.package + + def test_release_bundle_holds_the_frozen_central_files_with_checksums_and_no_credentials_in_argv(self): + package = self.frozen(release=True) + seen = {} + + def curl(args, **kwargs): + seen["config"] = Path(args[args.index("--config") + 1]).read_text() + bundle = next(a for a in args if a.startswith("bundle=@"))[len("bundle=@"):] + with zipfile.ZipFile(bundle) as archive: + seen["names"] = set(archive.namelist()) + seen["jar"] = archive.read("local/test/demo/1.2.3/demo-1.2.3.jar") + seen["args"] = args + return subprocess.CompletedProcess(args, 0, '"deployment-id_1"', "") + + with patch("buildcheck.publication.subprocess.run", side_effect=curl): + upload(package) + self.assertIn("local/test/demo/1.2.3/demo-1.2.3.jar.asc", seen["names"]) + self.assertIn("local/test/demo/1.2.3/demo-1.2.3.jar.sha512", seen["names"]) + self.assertNotIn("local/test/demo/1.2.3/demo-1.2.3.jar.asc.md5", seen["names"]) + self.assertFalse(any(name.startswith("github/") or name == "manifest.json" for name in seen["names"])) + self.assertEqual(seen["jar"], (package / "github/demo-1.2.3.jar").read_bytes()) + token = base64.b64encode(b"user:secret").decode() # the fixture's MAVEN_USERNAME/PASSWORD + self.assertIn("Authorization: Bearer " + token, seen["config"]) + self.assertFalse(any("secret" in arg or token in arg for arg in seen["args"])) + self.assertTrue(seen["args"][-1].endswith("?publishingType=AUTOMATIC")) + + def test_release_upload_without_a_valid_receipt_fails(self): + package = self.frozen(release=True) + for code, out in ((22, "rejected"), (0, "not a receipt!")): + with self.subTest(code=code): + result = subprocess.CompletedProcess([], code, out, "") + with patch("buildcheck.publication.subprocess.run", return_value=result): + with self.assertRaises(RuntimeError): + upload(package) + + def test_snapshot_transfer_runs_maven_on_the_generated_pom(self): + package = self.frozen() + with patch("buildcheck.publication.subprocess.run") as run: + upload(package) + args = run.call_args.args[0] + self.assertEqual((args[0], args[-1]), ("mvn", "validate")) + self.assertTrue(args[args.index("-f") + 1].endswith("pom.xml")) + + def test_snapshot_transfer_skips_only_when_asked_and_superseded(self): + os.environ["GITHUB_SHA"] = "a" * 40 + package = self.frozen() + gh = FakeRuns(newer_published=True) + with patch("buildcheck.publication.subprocess.run") as run: + upload(package, skip_superseded=True, github=gh) + self.assertFalse(run.called) + upload(package, github=gh) + self.assertTrue(run.called) + + +class FakeRuns: + def __init__(self, newer_published=False, status="ahead", job=CENTRAL_SNAPSHOT_JOB, conclusion="success"): + self.newer_published, self.status, self.job, self.conclusion = newer_published, status, job, conclusion + self.calls = [] + + def api(self, method, endpoint, payload=None, optional=False): + self.calls.append(endpoint) + if endpoint.endswith("/actions/runs/10"): + return {"workflow_id": 99} + if "/actions/workflows/99/runs?" in endpoint: + return {"workflow_runs": [{"id": 10, "head_sha": "a" * 40}, {"id": 11, "head_sha": "a" * 40}, + {"id": 12, "head_sha": "b" * 40}]} + if "/actions/runs/12/jobs?" in endpoint: + if endpoint.endswith("page=1"): + return {"jobs": [{"name": f"job {i}", "conclusion": "success"} for i in range(100)]} + return {"jobs": [{"name": self.job, "conclusion": self.conclusion}] if self.newer_published else []} + if "/compare/" in endpoint: + return {"status": self.status} + raise AssertionError(endpoint) + + +class SupersededTest(unittest.TestCase): + def setUp(self): + quiet = patch("builtins.print") + quiet.start() + self.addCleanup(quiet.stop) + + def test_a_newer_commit_transferred_by_another_run_supersedes_this_one(self): + gh = FakeRuns(newer_published=True) + self.assertTrue(superseded("owner/repo", "a" * 40, "10", gh)) + # Its own run and other runs of the same commit are never asked about their jobs. + self.assertFalse(any("/runs/10/jobs" in c or "/runs/11/jobs" in c for c in gh.calls)) + self.assertTrue(any(c.endswith("page=2") for c in gh.calls)) + self.assertTrue(any(c.endswith("/compare/" + "a" * 40 + "..." + "b" * 40) for c in gh.calls)) + + def test_older_divergent_unfinished_or_failed_runs_do_not_supersede(self): + for kwargs in ({"newer_published": True, "status": "behind"}, + {"newer_published": True, "status": "diverged"}, + {"newer_published": False}, + {"newer_published": True, "conclusion": "failure"}, + {"newer_published": True, "job": "Some other job"}): + with self.subTest(**kwargs): + self.assertFalse(superseded("owner/repo", "a" * 40, "10", FakeRuns(**kwargs))) + + +class WorkflowContractTest(unittest.TestCase): + """The shared jobs call the gate the way the code above expects.""" + + def setUp(self): + self.jobs = workflow.parse((Path(REPO) / ".github/workflows/publish.yml").read_text()) + + def test_ref_checks_run_before_anything_is_prepared(self): + for job, channel in (("check-snapshot", "snapshot"), ("check-tag", "release")): + self.assertIn("python3 .github/publication.py check-ref --channel " + channel, self.jobs[job].text) + self.assertIn("persist-credentials: false", self.jobs[job].text) + action = (Path(REPO) / ".github/actions/finalize-publication/action.yml").read_text() + self.assertIn('publication.py prepare "signed-${CHANNEL}-assets" publication-package --channel "$CHANNEL"', + action) + + def test_snapshot_transfers_are_serialized_and_skip_superseded_commits(self): + job = self.jobs["central-snapshot"].text + self.assertIn("name: " + CENTRAL_SNAPSHOT_JOB, job) + self.assertIn("group: central-snapshot-${{ github.repository }}", job) + self.assertIn("cancel-in-progress: false", job) + self.assertIn("actions: read", job) + self.assertIn("python3 .github/publication.py upload publication-package --skip-superseded", job) + self.assertNotIn("--skip-superseded", self.jobs["central-release"].text) diff --git a/.github/buildcheck/tests/test_releaseassets.py b/.github/buildcheck/tests/test_releaseassets.py new file mode 100644 index 000000000..2e5d04aa4 --- /dev/null +++ b/.github/buildcheck/tests/test_releaseassets.py @@ -0,0 +1,289 @@ +# SPDX-FileCopyrightText: 2026 Bernard Ladenthin +# +# SPDX-License-Identifier: MIT OR Apache-2.0 + +import json +import os +import shutil +import subprocess +import sys +import tempfile +import unittest +from pathlib import Path + +from buildcheck.releaseassets import collect, configuration, file_classifiers, projects, signature_gaps +from buildcheck import workflow +from buildcheck.tests.helpers import REPO + + +VERSION = "2.0.0-SNAPSHOT" + + +class ReleaseAssetsTest(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.root = Path(self.temp.name) + self.output = self.root / "assets" + self.config = {"schema": 1, "maven": {"standalone": ["tool"], "cyclonedx": True}, "files": [ + {"source": "app/target/app-{version}-{classifier}.jar", + "classifiers": {"csv": ".github/classifiers.csv", "column": "classifier"}}, + {"source": "mobile/publication/pom.xml", "name": "mobile-{version}.pom"}, + {"source": "mobile/build/mobile-{version}.aar"}, + {"source": "archive/upstream-*-{version}.tar.gz"}]} + self.save_config() + self.write("pom.xml", f""" +parent{VERSION}pom +appplugin""") + self.outputs(".", "parent", "pom") + self.module("app", "jar") + self.module("plugin", "maven-plugin") + self.module("tool", "jar", reactor=False) + self.write(".github/classifiers.csv", "# comment\nclassifier\ncpu-linux\ngpu-linux\n") + for classifier in ("cpu-linux", "gpu-linux"): + self.asset(f"app/target/app-{VERSION}-{classifier}.jar") + self.asset("mobile/publication/pom.xml") + self.asset(f"mobile/build/mobile-{VERSION}.aar") + self.asset(f"archive/upstream-build1-{VERSION}.tar.gz") + + def write(self, name, content="artifact"): + path = self.root / name + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(content) + + def save_config(self): + self.write(".github/release-assets.json", json.dumps(self.config)) + + def asset(self, name): + self.write(name) + self.write(name + ".asc", "signature of " + name) + + def outputs(self, folder, artifact, packaging, reactor=True): + self.asset(f"{folder}/target/{artifact}-{VERSION}.pom") + if packaging != "pom": + for classifier in ("", "-sources", "-javadoc"): + self.asset(f"{folder}/target/{artifact}-{VERSION}{classifier}.jar") + if reactor: + self.asset(f"{folder}/target/bom.json") + + def module(self, name, packaging, reactor=True): + self.write(f"{name}/pom.xml", f""" +{VERSION}{name} +{packaging}""") + self.outputs(name, name, packaging, reactor) + + def test_reactor_plugin_standalone_and_bom_names_match_central(self): + self.assertEqual(collect(self.root, self.output), []) + for artifact in ("app", "plugin", "tool"): + for classifier in ("", "-sources", "-javadoc"): + self.assertTrue((self.output / f"{artifact}-{VERSION}{classifier}.jar.asc").is_file()) + for artifact in ("parent", "app", "plugin"): + self.assertTrue((self.output / f"{artifact}-{VERSION}-cyclonedx.json.asc").is_file()) + self.assertFalse((self.output / "bom.json").exists()) + self.assertFalse((self.output / f"tool-{VERSION}-cyclonedx.json").exists()) + self.assertTrue((self.output / f"mobile-{VERSION}.pom.asc").is_file()) + + def test_new_reactor_module_is_automatic(self): + pom = self.root / "pom.xml" + pom.write_text(pom.read_text().replace("", "new")) + self.module("new", "jar") + self.assertEqual(collect(self.root, self.output), []) + self.assertTrue((self.output / f"new-{VERSION}.jar").is_file()) + + def test_single_library_needs_no_native_android_or_bom_configuration(self): + self.config = {"schema": 1} + self.save_config() + self.write("pom.xml", f"library{VERSION}") + self.outputs(".", "library", "jar") + self.assertEqual(collect(self.root, self.output), []) + self.assertEqual(len(list(self.output.iterdir())), 8) + + def test_missing_artifacts_signatures_boms_and_extras_preserve_available_files(self): + missing = ["app/target/bom.json", f"plugin/target/plugin-{VERSION}.pom.asc", + f"app/target/app-{VERSION}-gpu-linux.jar", f"mobile/build/mobile-{VERSION}.aar"] + for name in missing: + (self.root / name).unlink() + errors = collect(self.root, self.output) + for name in missing: + self.assertTrue(any(name in error for error in errors), errors) + self.assertTrue((self.output / f"app-{VERSION}.jar").is_file()) + + def test_empty_signature_fails(self): + self.write(f"app/target/app-{VERSION}.jar.asc", "") + self.assertTrue(any("missing or empty" in e for e in collect(self.root, self.output))) + + def test_stale_versions_unconfigured_fat_jars_and_plugin_dependencies_are_ignored(self): + for name in ("app/target/app-1.0.0.jar", f"app/target/app-{VERSION}-jar-with-dependencies.jar", + "app/target/spotbugs/third-party.jar"): + self.asset(name) + self.assertEqual(collect(self.root, self.output), []) + self.assertFalse(any("1.0.0" in p.name or "dependencies" in p.name or "third-party" in p.name + for p in self.output.iterdir())) + + def test_nonempty_destination_and_version_mismatch_fail(self): + self.write("assets/stale.jar") + with self.assertRaisesRegex(ValueError, "must be empty"): + collect(self.root, self.output) + (self.output / "stale.jar").unlink() + pom = self.root / "plugin/pom.xml" + pom.write_text(pom.read_text().replace(VERSION, "1.0.0")) + with self.assertRaisesRegex(ValueError, "version mismatch"): + collect(self.root, self.output) + + def test_ambiguous_archive_is_reported(self): + self.asset(f"archive/upstream-build2-{VERSION}.tar.gz") + self.assertTrue(any("found 2" in error for error in collect(self.root, self.output))) + + def test_staged_maven_files_survive_rebuild_and_missing_stage_file_fails_final_collection(self): + stage = self.root / "central-assets" + self.assertEqual(collect(self.root, stage, maven_only=True), []) + original = (stage / f"app-{VERSION}.jar").read_bytes() + self.write(f"app/target/app-{VERSION}.jar", "rebuilt unsigned jar") + self.assertEqual(collect(self.root, self.output, maven_assets=stage), []) + self.assertEqual((self.output / f"app-{VERSION}.jar").read_bytes(), original) + (stage / f"app-{VERSION}-javadoc.jar").unlink() + errors = collect(self.root, self.root / "partial", maven_assets=stage) + self.assertTrue(any("javadoc.jar" in e for e in errors)) + + def test_typo_or_wrong_schema_fails(self): + for config in ({"schema": 2}, {"schema": 1, "filez": []}, + {"schema": 1, "maven": {"cyclonedx": "yes"}}): + with self.subTest(config=config): + self.config = config + self.save_config() + with self.assertRaises(ValueError): + collect(self.root, self.output) + + def test_duplicate_names_traversal_bad_templates_and_empty_classifier_list_fail(self): + for rule in ({"source": "mobile/publication/pom.xml", "name": f"app-{VERSION}.jar"}, + {"source": "../outside.jar"}, {"source": "mobile/{unknown}.jar"}, + {"source": "mobile/build/*.aar", "classifiers": []}, + {"source": "mobile/build/*.aar", "name": "../outside.jar"}): + with self.subTest(rule=rule): + self.config["files"] = [rule] + self.save_config() + with self.assertRaises(ValueError): + collect(self.root, self.output) + self.assertFalse(self.output.exists()) + + def test_repeated_or_outside_module_fails(self): + for module in ("app", "../../outside"): + self.write("pom.xml", f"""parent{VERSION} +app{module}""") + with self.assertRaises(ValueError): + projects(self.root) + + def test_classifier_list_is_shared_with_packaging_loop(self): + self.assertEqual(file_classifiers(self.root, 0), ["cpu-linux", "gpu-linux"]) + self.config["files"][0]["classifiers"] = ["gpu-one", "gpu-two"] + self.save_config() + self.assertEqual(file_classifiers(self.root, 0), ["gpu-one", "gpu-two"]) + with self.assertRaisesRegex(ValueError, "no file rule"): + file_classifiers(self.root, 99) + with self.assertRaisesRegex(ValueError, "must not be negative"): + file_classifiers(self.root, -1) + + def test_current_repository_workflow_passes_collection_result_and_checks_both_uploads(self): + jobs = workflow.parse((Path(REPO) / ".github/workflows/publish.yml").read_text()) + for kind in ("snapshot", "release"): + job = jobs[f"publish-{kind}"].text + self.assertIn("uses: ./.github/actions/finalize-publication", job) + self.assertIn(f"channel: {kind}", job) + self.assertIn("assets_complete: $" + "{{ steps.finalize.outputs.complete }}", job) + self.assertIn(" id: finalize", job) + attach = jobs[f"github-{kind}"].text + self.assertIn(f"python3 .github/publication.py verify publication-package --export-github {kind}-assets", attach) + self.assertNotIn("Fail if anything", attach) + self.assertIn("subject-path: publication-package/github/*", jobs[f"attest-{kind}"].text) + + def test_current_repository_contract_collects_exact_complete_and_partial_fixture(self): + # Exercise this checkout's real POMs and JSON, not just a hand-written generic fixture. + repo = Path(REPO) + config = configuration(repo) + with tempfile.TemporaryDirectory() as temp: + root = Path(temp) + expected = set() + + def copy(relative): + target = root / relative + target.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(repo / relative, target) + + def artifact(relative, name): + path = root / relative + path.parent.mkdir(parents=True, exist_ok=True) + for suffix in ("", ".asc"): + Path(str(path) + suffix).write_text("fixture " + str(relative) + suffix) + expected.add(name + suffix) + + copy(".github/release-assets.json") + modules = projects(repo, config.get("maven", {}).get("standalone", [])) + version = modules[0][2] + for folder, name, _, packaging, reactor in modules: + relative = folder.relative_to(repo) + copy(relative / "pom.xml") + base = f"{name}-{version}" + artifact(relative / "target" / f"{base}.pom", f"{base}.pom") + if packaging != "pom": + for classifier in ("", "-sources", "-javadoc"): + artifact(relative / "target" / f"{base}{classifier}.jar", f"{base}{classifier}.jar") + if reactor and config.get("maven", {}).get("cyclonedx", False): + artifact(relative / "target/bom.json", f"{base}-cyclonedx.json") + for index, rule in enumerate(config.get("files", [])): + if isinstance(rule.get("classifiers"), dict): + copy(rule["classifiers"]["csv"]) + for classifier in file_classifiers(repo, index): + source = rule["source"].format(version=version, classifier=classifier).replace("*", "fixture") + name = rule.get("name", Path(source).name).format(version=version, classifier=classifier) + artifact(source, name) + destination = root / "collected" + self.assertEqual(collect(root, destination), []) + self.assertEqual({p.name for p in destination.iterdir()}, expected) + (destination / next(n for n in expected if n.endswith(".asc"))).unlink() + self.assertNotEqual(signature_gaps(destination)[0], 0) + # An incomplete reactor must still produce an upload directory with available files. + first = modules[0][1] + "-" + version + ".pom" + (root / "target" / first).unlink() + self.assertTrue(collect(root, root / "partial")) + self.assertTrue(any((root / "partial").iterdir())) + + def test_cli_reports_completeness_even_on_failure_and_accepts_parameters(self): + scripts = self.root / ".github" + (scripts / "buildcheck").mkdir() + for name in ("collect-release-assets.py", "buildcheck/releaseassets.py", "buildcheck/__init__.py"): + shutil.copyfile(Path(REPO) / ".github" / name, scripts / name) + cli = [sys.executable, str(scripts / "collect-release-assets.py")] + listing = subprocess.run(cli + ["--list-classifiers", "0"], capture_output=True, text=True) + self.assertEqual(listing.returncode, 0, listing.stderr) + self.assertEqual(listing.stdout.splitlines(), ["cpu-linux", "gpu-linux"]) + for complete in (True, False): + if not complete: + (self.root / f"plugin/target/plugin-{VERSION}.jar").unlink() + output = self.root / f"github-output-{complete}" + destination = self.root / f"collected-{complete}" + result = subprocess.run(cli + [str(destination), "--config", str(scripts / "release-assets.json")], + env={**os.environ, "GITHUB_OUTPUT": str(output)}, + capture_output=True, text=True) + self.assertEqual(result.returncode, 0 if complete else 1, result.stdout + result.stderr) + self.assertEqual(output.read_text(), f"complete={str(complete).lower()}\n") + self.assertTrue((destination / f"app-{VERSION}.jar").is_file()) + + +class SignatureGapsTest(unittest.TestCase): + def test_all_file_types_spaces_empty_orphan_and_missing_signatures(self): + with tempfile.TemporaryDirectory() as temp: + root = Path(temp) + self.assertEqual(signature_gaps(root)[0], -1) + for name in ("file.jar", "mobile.aar", "parent.pom", "bom.json", "source.tar.gz", "with spaces.zip"): + (root / name).write_text("artifact") + (root / (name + ".asc")).write_text("signature") + self.assertEqual(signature_gaps(root), (0, [])) + (root / "bom.json.asc").write_text("") + (root / "source.tar.gz.asc").unlink() + (root / "orphan.jar.asc").write_text("signature") + (root / "file.jar").write_text("") + self.assertEqual(signature_gaps(root)[0], 4) + + +if __name__ == "__main__": + unittest.main() diff --git a/.github/buildcheck/tests/test_snapshot.py b/.github/buildcheck/tests/test_snapshot.py new file mode 100644 index 000000000..b8ab8c833 --- /dev/null +++ b/.github/buildcheck/tests/test_snapshot.py @@ -0,0 +1,264 @@ +# SPDX-FileCopyrightText: 2026 Bernard Ladenthin +# +# SPDX-License-Identifier: MIT OR Apache-2.0 + +import subprocess +import tempfile +import unittest +from pathlib import Path +from unittest.mock import patch + +from buildcheck.snapshot import GitHub, publish +from buildcheck import workflow +from buildcheck.tests.helpers import REPO + + +OLD, NEW = "a" * 40, "b" * 40 + + +class FakeGitHub: + def __init__(self): + self.ref = {"object": {"type": "commit", "sha": OLD}} + self.release = {"id": 7, "body": "Snapshot from old commit"} + self.comparison = "ahead" + self.pages = {1: [{"id": 1, "name": "old.jar"}, {"id": 2, "name": "new.json"}]} + self.calls = [] + self.fail_upload = False + self.fail_deletes = set() + self.tag = "snapshot" + self.drafts = [] + + def api(self, method, endpoint, payload=None, optional=False): + self.calls.append((method, endpoint, payload)) + if method == "DELETE" and int(endpoint.rsplit("/", 1)[1]) in self.fail_deletes: + raise RuntimeError("delete failed") + if method == "GET": + if endpoint.endswith(f"git/ref/tags/{self.tag}"): + return self.ref + if endpoint.endswith(f"releases/tags/{self.tag}"): + return self.release + if "/compare/" in endpoint: + return {"status": self.comparison} + if "/git/tags/" in endpoint: + return {"object": {"type": "commit", "sha": OLD}} + if "/assets?" in endpoint: + return self.pages[int(endpoint.split("&page=")[1])] + if endpoint.endswith("/releases?per_page=100"): + return self.drafts + if method == "POST" and endpoint.endswith("/releases"): + return {"id": 7} + if method == "POST" and endpoint.endswith("/git/refs"): + return {"object": {"type": "commit", "sha": payload["sha"]}} + return {} + + def command(self, *args): + self.calls.append(("upload", args, None)) + if self.fail_upload: + raise subprocess.CalledProcessError(1, "gh release upload") + + +class SnapshotTest(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.assets = Path(self.temp.name) + for name in ("new.json", "new.json.asc"): + (self.assets / name).write_text("artifact") + self.gh = FakeGitHub() + quiet = patch("builtins.print") + quiet.start() + self.addCleanup(quiet.stop) + + def publish(self, **kwargs): + return publish("owner/repo", NEW, kwargs.pop("run_id", 10), kwargs.pop("attempt", 1), + self.assets, kwargs.pop("complete", True), self.gh, **kwargs) + + def test_upload_precedes_tag_notes_and_prune_and_release_itself_survives(self): + self.assertTrue(self.publish()) + calls = self.gh.calls + upload = next(i for i, c in enumerate(calls) if c[0] == "upload") + tag = next(i for i, c in enumerate(calls) if c[0] == "PATCH" and "/git/refs/" in c[1]) + notes = next(c[2] for c in calls if c[0] == "PATCH" and c[1].endswith("/releases/7")) + self.assertLess(upload, tag) + self.assertIn(NEW, notes["body"]) + self.assertIn("/actions/runs/10/attempts/1", notes["body"]) + self.assertEqual(notes["target_commitish"], NEW) + deletes = [c[1] for c in calls if c[0] == "DELETE"] + self.assertEqual(deletes, ["repos/owner/repo/releases/assets/1"]) + + def test_incomplete_collection_changes_nothing(self): + with self.assertRaisesRegex(ValueError, "incomplete collection"): + self.publish(complete=False) + self.assertEqual(self.gh.calls, []) + + def test_missing_signature_also_changes_nothing(self): + (self.assets / "new.json.asc").unlink() + with self.assertRaisesRegex(ValueError, "incomplete collection.*unsigned: new.json"): + self.publish() + self.assertEqual(self.gh.calls, []) + + def test_versioned_release_tag_is_never_a_rolling_snapshot(self): + for tag in ("v1.2.3", "v2"): + with self.subTest(tag=tag): + with self.assertRaisesRegex(ValueError, "versioned release"): + self.publish(tag=tag) + self.assertEqual(self.gh.calls, []) + + def test_names_github_would_rename_are_refused_before_any_change(self): + # GitHub would upload "a b.jar" as "a.b.jar", and the prune would then delete it. + for name in ("a b.jar", "a b.jar.asc"): + (self.assets / name).write_text("artifact") + with self.assertRaisesRegex(ValueError, "rename release assets: a b.jar"): + self.publish() + self.assertEqual(self.gh.calls, []) + + def test_late_finishing_older_commit_cannot_overwrite_newer_snapshot(self): + self.gh.comparison = "behind" + self.assertFalse(self.publish()) + self.assertTrue(all(c[0] == "GET" for c in self.gh.calls)) + + def test_empty_signature_or_orphan_also_prevents_promotion(self): + for name, content in (("new.json.asc", ""), ("orphan.jar.asc", "signature")): + with self.subTest(name=name): + (self.assets / "new.json.asc").write_text("signature") + (self.assets / name).write_text(content) + self.gh.calls.clear() + with self.assertRaisesRegex(ValueError, "incomplete collection"): + self.publish() + self.assertEqual(self.gh.calls, []) + + def test_rolling_tag_and_title_are_parameters(self): + self.gh.tag = "nightly" + self.assertTrue(self.publish(tag="nightly", title="Nightly build")) + upload = next(c for c in self.gh.calls if c[0] == "upload") + self.assertEqual(upload[1][2], "nightly") + notes = next(c[2] for c in self.gh.calls if c[0] == "PATCH" and c[1].endswith("/releases/7")) + self.assertEqual(notes["name"], "Nightly build") + + def test_same_commit_older_run_or_attempt_is_skipped(self): + self.gh.ref["object"]["sha"] = NEW + for run, attempt in ((11, 1), (10, 2)): + self.gh.release["body"] = f"" + self.gh.calls.clear() + self.assertFalse(self.publish()) + self.assertTrue(all(c[0] == "GET" for c in self.gh.calls)) + + def test_new_attempt_of_same_commit_can_replace_old_artifacts(self): + self.gh.ref["object"]["sha"] = NEW + self.gh.release["body"] = f"" + self.assertTrue(self.publish(attempt=2)) + + def test_annotated_tags_are_resolved_before_comparing_commits(self): + self.gh.ref["object"]["type"] = "tag" + self.assertTrue(self.publish()) + self.assertTrue(any("/git/tags/" in c[1] for c in self.gh.calls if c[0] == "GET")) + + def test_creates_missing_tag_and_release_once(self): + self.gh.ref, self.gh.release = None, None + self.assertTrue(self.publish()) + calls = self.gh.calls + self.assertEqual(sum(c[0] == "POST" and c[1].endswith("/git/refs") for c in calls), 1) + created = [c[2] for c in calls if c[0] == "POST" and c[1].endswith("/releases")] + self.assertEqual(len(created), 1) + # A draft without the build's notes until the upload is complete; the tag comes after it. + self.assertTrue(created[0]["draft"]) + self.assertNotIn(NEW, created[0]["body"]) + upload = next(i for i, c in enumerate(calls) if c[0] == "upload") + tag = next(i for i, c in enumerate(calls) if c[0] == "POST" and c[1].endswith("/git/refs")) + self.assertLess(upload, tag) + notes = next(c[2] for c in calls if c[0] == "PATCH" and c[1].endswith("/releases/7")) + self.assertFalse(notes["draft"]) + self.assertIn(NEW, notes["body"]) + + def test_failed_first_upload_leaves_no_tag_and_no_public_release(self): + self.gh.ref, self.gh.release = None, None + self.gh.fail_upload = True + with self.assertRaises(subprocess.CalledProcessError): + self.publish() + self.assertFalse(any(c[0] in ("PATCH", "DELETE") or c[1].endswith("/git/refs") + for c in self.gh.calls if c[0] != "upload")) + created = next(c[2] for c in self.gh.calls if c[0] == "POST" and c[1].endswith("/releases")) + self.assertTrue(created["draft"]) + + def test_a_draft_a_failed_first_upload_left_is_reused(self): + self.gh.ref, self.gh.release = None, None + self.gh.drafts = [{"id": 5, "draft": False, "tag_name": "snapshot"}, + {"id": 6, "draft": True, "tag_name": "other"}, + {"id": 8, "draft": True, "tag_name": "snapshot"}] + self.assertTrue(self.publish()) + self.assertFalse(any(c[0] == "POST" and c[1].endswith("/releases") for c in self.gh.calls)) + notes = next(c[2] for c in self.gh.calls if c[0] == "PATCH" and c[1].endswith("/releases/8")) + self.assertFalse(notes["draft"]) + + def test_reads_all_asset_pages_before_deleting(self): + self.gh.pages = {1: [{"id": i, "name": f"old-{i}.jar"} for i in range(100)], + 2: [{"id": 101, "name": "last-old.jar"}, {"id": 102, "name": "new.json"}]} + self.assertTrue(self.publish()) + calls = self.gh.calls + page2 = next(i for i, c in enumerate(calls) if c[0] == "GET" and "&page=2" in c[1]) + deletion = next(i for i, c in enumerate(calls) if c[0] == "DELETE") + self.assertLess(page2, deletion) + self.assertEqual(sum(c[0] == "DELETE" for c in calls), 101) + + def test_divergent_commit_and_empty_upload_are_refused(self): + self.gh.comparison = "diverged" + with self.assertRaisesRegex(ValueError, "divergent"): + self.publish() + self.assertTrue(all(c[0] == "GET" for c in self.gh.calls)) + for path in self.assets.iterdir(): + path.unlink() + self.gh.calls.clear() + with self.assertRaisesRegex(ValueError, "nonempty"): + self.publish() + self.assertEqual(self.gh.calls, []) + + def test_upload_failure_does_not_move_tag_or_prune(self): + self.gh.fail_upload = True + with self.assertRaises(subprocess.CalledProcessError): + self.publish() + self.assertFalse(any(c[0] in ("PATCH", "DELETE") for c in self.gh.calls)) + + def test_prune_tries_remaining_assets_after_a_deletion_failure(self): + self.gh.pages[1].append({"id": 3, "name": "another-old.jar"}) + self.gh.fail_deletes.add(1) + with self.assertRaisesRegex(RuntimeError, "delete failed"): + self.publish() + self.assertTrue(any(c[0] == "DELETE" and c[1].endswith("/assets/3") for c in self.gh.calls)) + + def test_signature_only_directory_does_not_mutate_snapshot(self): + (self.assets / "new.json").unlink() + with self.assertRaisesRegex(ValueError, "no artifacts"): + self.publish() + self.assertEqual(self.gh.calls, []) + + def test_workflow_serializes_entire_update_and_passes_collection_result(self): + jobs = workflow.parse((Path(REPO) / ".github/workflows/publish.yml").read_text()) + job = jobs["github-snapshot"].text + self.assertIn(" concurrency:\n group: snapshot-release-${{ github.repository }}", job) + self.assertIn(" cancel-in-progress: false", job) + self.assertIn("ASSETS_COMPLETE: ${{ needs.publish-snapshot.outputs.assets_complete }}", job) + self.assertIn("python3 .github/update-snapshot.py snapshot-assets", job) + + def test_optional_api_failure_accepts_only_404_not_authentication_failure(self): + gh = GitHub() + for status in (403, 404): + response = subprocess.CompletedProcess([], 1, "", f"gh: failure (HTTP {status})") + with patch("buildcheck.snapshot.subprocess.run", return_value=response): + if status == 404: + self.assertIsNone(gh.api("GET", "repos/owner/repo/releases/tags/snapshot", optional=True)) + else: + with self.assertRaisesRegex(RuntimeError, "403"): + gh.api("GET", "repos/owner/repo/releases/tags/snapshot", optional=True) + + def test_release_upload_jobs_do_not_persist_checkout_credentials(self): + jobs = workflow.parse((Path(REPO) / ".github/workflows/publish.yml").read_text()) + for name in ("github-snapshot", "github-release"): + checkouts = [step for step in jobs[name].steps() + if any("uses: actions/checkout@" in line for line in step)] + self.assertTrue(checkouts, name) + for step in checkouts: + self.assertIn(" persist-credentials: false", step, name) + + +if __name__ == "__main__": + unittest.main() diff --git a/.github/buildcheck/tests/test_thirdpartylicenses.py b/.github/buildcheck/tests/test_thirdpartylicenses.py new file mode 100644 index 000000000..a4a9d4fbc --- /dev/null +++ b/.github/buildcheck/tests/test_thirdpartylicenses.py @@ -0,0 +1,99 @@ +# SPDX-FileCopyrightText: 2026 Bernard Ladenthin +# +# SPDX-License-Identifier: MIT OR Apache-2.0 +"""collect-third-party-licenses.py: embedded legal files, supplemental notices, completeness.""" + +import importlib.util +import json +import os +import tempfile +import unittest +import zipfile +from pathlib import Path +from unittest.mock import patch + +from buildcheck.tests.helpers import REPO + +_SPEC = importlib.util.spec_from_file_location( + "collect_third_party_licenses", Path(REPO) / ".github/collect-third-party-licenses.py") +licenses = importlib.util.module_from_spec(_SPEC) +_SPEC.loader.exec_module(licenses) + + +class CollectTest(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.root = Path(self.temp.name) + quiet = patch("builtins.print") + quiet.start() + self.addCleanup(quiet.stop) + + def jar(self, name, entries): + path = self.root / "repo" / name + path.parent.mkdir(parents=True, exist_ok=True) + with zipfile.ZipFile(path, "w") as archive: + for entry, data in entries.items(): + archive.writestr(entry, data) + return path + + def classpath(self, *jars): + path = self.root / "classpath.txt" + path.write_text(os.pathsep.join(str(jar) for jar in jars), encoding="utf-8") + return path + + def notices(self, notices): + folder = self.root / "notices" + for notice in notices: + (folder / notice["directory"]).mkdir(parents=True, exist_ok=True) + (folder / notice["directory"] / "LICENSE").write_text("license of " + notice["directory"]) + (folder / "notices.json").write_text(json.dumps({"format": 1, "notices": notices})) + return folder + + def test_embedded_files_are_kept_and_code_named_license_is_not(self): + jar = self.jar("lib-1.0.jar", {"META-INF/LICENSE": "MIT", "a/LICENSE.class": b"\xca\xfe", + "META-INF/NOTICE.txt": "notice"}) + entries = licenses.collect(self.classpath(jar), self.root / "out") + self.assertEqual(entries[0]["legal_files"], ["META-INF/LICENSE", "META-INF/NOTICE.txt"]) + self.assertNotIn("supplemental_files", entries[0]) + + def test_a_jar_without_legal_files_gets_the_supplied_notice_by_base_name(self): + bare = self.jar("lwjgl-opencl-3.3.6-natives-linux.jar", {"x.class": b"\xca\xfe"}) + folder = self.notices([{"directory": "lwjgl-3.3.6", "license": "BSD-3-Clause", + "artifacts": ["lwjgl", "lwjgl-opencl"]}]) + entries = licenses.collect(self.classpath(bare), self.root / "out", folder, require_complete=True) + self.assertEqual(entries[0]["supplemental_files"], ["supplemental/LICENSE"]) + copied = self.root / "out" / entries[0]["directory"] / "supplemental/LICENSE" + self.assertEqual(copied.read_text(), "license of lwjgl-3.3.6") + + def test_embedded_files_win_over_a_supplied_notice(self): + jar = self.jar("lib-1.0.jar", {"META-INF/LICENSE": "MIT"}) + folder = self.notices([{"directory": "lib", "license": "MIT", "artifacts": ["lib"]}]) + entries = licenses.collect(self.classpath(jar), self.root / "out", folder) + self.assertNotIn("supplemental_files", entries[0]) + + def test_require_complete_fails_on_a_jar_without_any_legal_files(self): + bare = self.jar("bare-2.0.jar", {"x.class": b"\xca\xfe"}) + with self.assertRaisesRegex(ValueError, "bare-2.0.jar"): + licenses.collect(self.classpath(bare), self.root / "out", None, require_complete=True) + entries = licenses.collect(self.classpath(bare), self.root / "out2") + self.assertEqual(entries[0]["legal_files"], []) + + def test_malformed_or_ambiguous_notices_fail(self): + folder = self.notices([{"directory": "a", "license": "MIT", "artifacts": ["x"]}, + {"directory": "b", "license": "MIT", "artifacts": ["x"]}]) + with self.assertRaisesRegex(ValueError, "listed twice"): + licenses.supplemental_notices(folder) + (folder / "notices.json").write_text(json.dumps({"format": 1, "notices": [ + {"directory": "missing", "license": "MIT", "artifacts": ["y"]}]})) + with self.assertRaisesRegex(ValueError, "missing or empty"): + licenses.supplemental_notices(folder) + + def test_base_name_strips_version_and_classifier(self): + self.assertEqual(licenses.base_name("lwjgl-opencl-3.3.6-natives-linux.jar"), "lwjgl-opencl") + self.assertEqual(licenses.base_name("jcip-annotations-1.0.jar"), "jcip-annotations") + self.assertEqual(licenses.base_name("plain.jar"), "plain") + + +if __name__ == "__main__": + unittest.main() diff --git a/.github/buildcheck/tests/test_webuilicenses.py b/.github/buildcheck/tests/test_webuilicenses.py new file mode 100644 index 000000000..281c1e2b3 --- /dev/null +++ b/.github/buildcheck/tests/test_webuilicenses.py @@ -0,0 +1,148 @@ +# SPDX-FileCopyrightText: 2026 Bernard Ladenthin +# +# SPDX-License-Identifier: MIT OR Apache-2.0 +"""The WebUI npm license texts: closure over the lockfile, texts from tarballs, the staleness check.""" + +import io +import json +import tarfile +import tempfile +import unittest +from pathlib import Path + +from buildcheck import webuilicenses + + +def tarball(files, root="package"): + data = io.BytesIO() + with tarfile.open(fileobj=data, mode="w:gz") as archive: + for name, content in files.items(): + raw = content.encode("utf-8") + info = tarfile.TarInfo(f"{root}/{name}") + info.size = len(raw) + archive.addfile(info, io.BytesIO(raw)) + return data.getvalue() + + +class WebuiLicensesTest(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.ui = Path(self.temp.name) / "ui" + (self.ui / "src/lib").mkdir(parents=True) + (self.ui / "src/lib/app.ts").write_text( + "import { a } from 'alpha';\nimport type { T } from 'typesonly';\nimport './local';\n") + (self.ui / "src/lib/app.test.ts").write_text("import { t } from 'testonly';\n") + lock = {"packages": { + "": {}, + "node_modules/alpha": {"version": "1.0.0", "license": "MIT", "dependencies": {"beta": "^2"}, + "resolved": "https://registry.npmjs.org/alpha/-/alpha-1.0.0.tgz"}, + "node_modules/beta": {"version": "2.0.0", "license": "ISC", "dependencies": {"@types/x": "*"}, + "resolved": "https://registry.npmjs.org/beta/-/beta-2.0.0.tgz"}, + "node_modules/alpha/node_modules/beta": {"version": "2.0.0", "license": "ISC", + "resolved": "https://registry.npmjs.org/beta/-/beta-2.0.0.tgz"}, + "node_modules/@types/x": {"version": "1.0.0", "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/x/-/x-1.0.0.tgz"}, + "node_modules/typesonly": {"version": "1.0.0", "resolved": "https://registry.npmjs.org/t.tgz"}, + "node_modules/testonly": {"version": "1.0.0", "resolved": "https://registry.npmjs.org/t.tgz"}, + "node_modules/svelte": {"version": "5.0.0", "license": "MIT", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.0.0.tgz"}, + }} + (self.ui / "package-lock.json").write_text(json.dumps(lock)) + self.out = Path(self.temp.name) / "out" + + def test_closure_follows_runtime_imports_and_drops_types_tests_and_duplicates(self): + lock = json.loads((self.ui / "package-lock.json").read_text()) + names = [p["name"] for p in webuilicenses.closure(lock, webuilicenses.imports(self.ui))] + self.assertEqual(names, ["alpha", "beta", "svelte"]) + + def test_generate_writes_the_tarball_texts_and_the_declared_license_of_the_rest(self): + tarballs = { + "https://registry.npmjs.org/alpha/-/alpha-1.0.0.tgz": tarball({"LICENSE": "alpha license", + "lib/LICENSE": "nested"}), + "https://registry.npmjs.org/beta/-/beta-2.0.0.tgz": tarball( + {"package.json": json.dumps({"author": {"name": "Beta Author"}})}), + "https://registry.npmjs.org/svelte/-/svelte-5.0.0.tgz": tarball({"LICENSE.md": "svelte"}, root="svelte"), + } + webuilicenses.generate(self.ui, self.out, fetch=tarballs.__getitem__, workers=1) + text = (self.out / "THIRD-PARTY-LICENSES.txt").read_text(encoding="utf-8") + self.assertIn("alpha@1.0.0 (MIT): LICENSE\n", text) + self.assertIn("alpha license", text) + self.assertNotIn("nested", text) + self.assertIn("License (package.json): ISC", text) + self.assertIn("Author (package.json): Beta Author", text) + self.assertIn("svelte@5.0.0 (MIT): LICENSE.md", text) + # beta ships no license file: the full ISC text follows, once. + isc = (webuilicenses.SPDX_TEXTS / "ISC.txt").read_text(encoding="utf-8").strip() + self.assertIn("License text ISC (for the packages above marked (declared in package.json))", text) + self.assertEqual(text.count(isc.splitlines()[-1]), 1) + self.assertNotIn("License text MIT", text) + self.assertEqual(webuilicenses.check(self.ui, self.out), []) + + def generated(self): + tarballs = { + "https://registry.npmjs.org/alpha/-/alpha-1.0.0.tgz": tarball({"LICENSE": "alpha license"}), + "https://registry.npmjs.org/beta/-/beta-2.0.0.tgz": tarball({"LICENSE": "beta license"}), + "https://registry.npmjs.org/svelte/-/svelte-5.0.0.tgz": tarball({"LICENSE": "svelte"}), + "https://registry.npmjs.org/t.tgz": tarball({"LICENSE": "t"}), + } + webuilicenses.generate(self.ui, self.out, fetch=tarballs.__getitem__, workers=1) + self.assertEqual(webuilicenses.check(self.ui, self.out), []) + + def test_check_reports_a_changed_lockfile(self): + self.generated() + (self.out / "LOCKFILE.sha256").write_text("0" * 64 + " tools/ui/package-lock.json\n") + problems = webuilicenses.check(self.ui, self.out) + self.assertEqual(len(problems), 1) + self.assertIn("webui-licenses.py generate", problems[0]) + + def test_check_reports_a_new_import_of_a_package_the_lockfile_already_had(self): + self.generated() + (self.ui / "src/lib/more.ts").write_text("import { t } from 'testonly';\n") + problems = webuilicenses.check(self.ui, self.out) + self.assertEqual(len(problems), 1) + self.assertIn("1 package(s) the WebUI sources can reach are not in packages.csv (testonly@1.0.0)", + problems[0]) + + def test_check_reports_a_listed_file_without_its_section(self): + self.generated() + path = self.out / "THIRD-PARTY-LICENSES.txt" + path.write_text(path.read_text(encoding="utf-8").replace("beta@2.0.0 (ISC): LICENSE", "beta"), + encoding="utf-8") + self.assertEqual(webuilicenses.check(self.ui, self.out), + ["beta@2.0.0: no section for LICENSE in THIRD-PARTY-LICENSES.txt"]) + + def test_check_reports_a_declared_only_license_without_its_text(self): + tarballs = { + "https://registry.npmjs.org/alpha/-/alpha-1.0.0.tgz": tarball({"LICENSE": "alpha license"}), + "https://registry.npmjs.org/beta/-/beta-2.0.0.tgz": tarball({"index.js": ""}), + "https://registry.npmjs.org/svelte/-/svelte-5.0.0.tgz": tarball({"LICENSE": "svelte"}), + } + webuilicenses.generate(self.ui, self.out, fetch=tarballs.__getitem__, workers=1) + path = self.out / "THIRD-PARTY-LICENSES.txt" + text = path.read_text(encoding="utf-8") + path.write_text(text[:text.index("\n" + "=" * 78 + "\nLicense text ISC")] + "\n", encoding="utf-8") + self.assertEqual(webuilicenses.check(self.ui, self.out), + ["no ISC license text in THIRD-PARTY-LICENSES.txt for the packages that only declare it"]) + + def test_generate_refuses_a_package_without_a_license_file_or_a_declared_license(self): + lock = json.loads((self.ui / "package-lock.json").read_text()) + for key in ("node_modules/beta", "node_modules/alpha/node_modules/beta"): + del lock["packages"][key]["license"] + (self.ui / "package-lock.json").write_text(json.dumps(lock)) + tarballs = { + "https://registry.npmjs.org/alpha/-/alpha-1.0.0.tgz": tarball({"LICENSE": "alpha license"}), + "https://registry.npmjs.org/beta/-/beta-2.0.0.tgz": tarball({"index.js": ""}), + "https://registry.npmjs.org/svelte/-/svelte-5.0.0.tgz": tarball({"LICENSE": "svelte"}), + } + with self.assertRaisesRegex(ValueError, "declares no license: beta@2.0.0"): + webuilicenses.generate(self.ui, self.out, fetch=tarballs.__getitem__, workers=1) + self.assertFalse(self.out.exists()) + + def test_declared_ids_leave_the_operators_out(self): + self.assertEqual(webuilicenses.declared_ids("(MPL-2.0 OR Apache-2.0)"), ["MPL-2.0", "Apache-2.0"]) + self.assertEqual(webuilicenses.declared_ids(""), []) + + +if __name__ == "__main__": + unittest.main() diff --git a/.github/buildcheck/webuilicenses.py b/.github/buildcheck/webuilicenses.py new file mode 100644 index 000000000..f2fd78f5b --- /dev/null +++ b/.github/buildcheck/webuilicenses.py @@ -0,0 +1,241 @@ +# SPDX-FileCopyrightText: 2026 Bernard Ladenthin +# +# SPDX-License-Identifier: MIT OR Apache-2.0 +"""The license texts of the npm packages compiled into the embedded llama.cpp WebUI. + +build-webui bundles llama.cpp's tools/ui with npm and embeds the result in every library natives +jar (webui-generated/ui.cpp), and the bundle strips every legal comment. So the texts travel in +llama/legal/natives/webui-npm/, generated from the pinned tools/ui: + +- `closure()` -- a static upper bound of the packages the bundle can contain: the bare imports + of tools/ui/src (tests, stories and type-only imports left out), closed over the runtime + dependencies package-lock.json records. Upper bound on purpose: shipping a text for a package + that tree-shaking dropped is harmless, missing one is not. +- `generate()` -- each package's own license/notice files, byte for byte from the tarball + package-lock.json names (nothing is executed), concatenated into THIRD-PARTY-LICENSES.txt; a + package without a license file gets its declared SPDX id and the author package.json names, and + the file ends with the full text of every such id (from the repository's LICENSES/), so an MIT + package without a LICENSE file still has its license text in the jar. +- `check()` -- build-webui compares the lockfile it builds with the one the texts came from + (LOCKFILE.sha256), recomputes the closure from the sources it builds (a new import of a package + the lockfile already had changes no hash), and holds packages.csv and the text file to each other: + a section for every package and file it names, the full text of every declared-only license. +""" + +import csv +import hashlib +import io +import json +import os +import re +import tarfile +import urllib.request +from concurrent.futures import ThreadPoolExecutor +from pathlib import Path + +# A file at the tarball root (npm packs `package/`, DefinitelyTyped the package name). +LEGAL = re.compile(r"^[^/]+/(licen[cs]e|copying|notice|unlicense|authors)([.-][^/]*)?$", re.I) +QUOTE, NOT_QUOTE = "['\"]", "[^'\"]" +SPECIFIER = re.compile( + r"(?:import|export)\s" + NOT_QUOTE + r"*?from\s*" + QUOTE + "(" + NOT_QUOTE + "+)" + QUOTE + + r"|import\s*\(\s*" + QUOTE + "(" + NOT_QUOTE + "+)" + QUOTE + r"\s*\)" + + r"|import\s+" + QUOTE + "(" + NOT_QUOTE + "+)" + QUOTE + + r"|@import\s+" + QUOTE + "(" + NOT_QUOTE + "+)" + QUOTE) +TYPE_ONLY = re.compile(r"(?m)^\s*(?:import|export)\s+type\s[^;]*?from\s*" + QUOTE + NOT_QUOTE + "+" + QUOTE) +SKIPPED = re.compile(r"\.(spec|test|stories)\.|/tests?/|\.stories\.svelte$") +# Not imported by name, but part of every bundle the build produces. +IMPLICIT = ("svelte", "@sveltejs/kit", "workbox-window") +DECLARED = "(declared in package.json)" +# The SPDX texts for a package that ships no license file: the repository's REUSE folder. +SPDX_TEXTS = Path(__file__).resolve().parents[2] / "LICENSES" +SPDX_ID = re.compile(r"[A-Za-z0-9][A-Za-z0-9.+-]*") + + +def lockfile_digest(ui): + return hashlib.sha256((Path(ui) / "package-lock.json").read_bytes()).hexdigest() + + +def imports(ui): + """Bare package names imported by tools/ui/src.""" + roots = set(IMPLICIT) + for folder, _, files in os.walk(Path(ui) / "src"): + for name in files: + path = (Path(folder) / name).as_posix() + if (not re.search(r"\.(ts|js|svelte|css|mjs)$", name) or name.endswith(".d.ts") + or SKIPPED.search(path)): + continue + source = TYPE_ONLY.sub("", Path(path).read_text(encoding="utf-8", errors="replace")) + for match in SPECIFIER.finditer(source): + spec = next(group for group in match.groups() if group) + if spec.startswith((".", "/", "$", "virtual:", "node:")): + continue + parts = spec.split("/") + roots.add("/".join(parts[:2]) if spec.startswith("@") else parts[0]) + return roots + + +def closure(lock, roots): + """The lockfile entries reachable from `roots` through dependencies/optionalDependencies.""" + packages = lock["packages"] + + def resolve(name, start): + base = start + while True: + candidate = (base + "/" if base else "") + "node_modules/" + name + if candidate in packages: + return candidate + if not base: + return None + cut = base.rfind("/node_modules/") + base = base[:cut] if cut >= 0 else "" + + seen, stack = {}, [(key, None) for key in (resolve(root, "") for root in sorted(roots)) if key] + while stack: + key, via = stack.pop() + if key in seen: + continue + seen[key] = via + entry = packages[key] + for field in ("dependencies", "optionalDependencies"): + for dependency in sorted(entry.get(field) or {}): + found = resolve(dependency, key) + if found: + stack.append((found, key)) + result, listed = [], set() + for key in sorted(seen): + entry = packages[key] + name, version = key.split("node_modules/")[-1], entry.get("version", "") + # Type declarations are erased by the build: nothing of an @types package reaches the bundle. + if name.startswith("@types/") or (name, version) in listed: + continue + listed.add((name, version)) + result.append({"name": name, "version": version, + "license": entry.get("license") or "", "resolved": entry.get("resolved") or ""}) + return result + + +def _texts(package, fetch): + """The package's own legal files from its registry tarball, or its declared license + author.""" + url = package["resolved"] + if not url.startswith("https://registry.npmjs.org/"): + raise ValueError(f"{package['name']}@{package['version']}: no registry tarball ({url})") + texts, author = [], "" + with tarfile.open(fileobj=io.BytesIO(fetch(url)), mode="r:gz") as archive: + for member in sorted(archive.getmembers(), key=lambda m: m.name): + if member.isfile() and LEGAL.match(member.name): + texts.append((member.name.split("/", 1)[1], archive.extractfile(member).read())) + elif member.isfile() and member.name.count("/") == 1 and member.name.endswith("/package.json"): + meta = json.loads(archive.extractfile(member).read()) + author = meta.get("author") or "" + if isinstance(author, dict): + author = " ".join(str(author[k]) for k in ("name", "email") if author.get(k)) + if not texts: + declared = (f"License (package.json): {package['license'] or 'not declared'}\n" + f"Author (package.json): {author or 'not declared'}\n" + "(The package ships no license file; this is the license and author its " + "package.json declares; its full text is at the end of this file.)\n") + texts.append((DECLARED, declared.encode("utf-8"))) + return texts + + +def declared_ids(expression): + """The SPDX license ids of a package.json license expression (operators left out).""" + return [token for token in SPDX_ID.findall(expression or "") if token not in ("AND", "OR", "WITH")] + + +def _section(title): + return f"\n{'=' * 78}\n{title}\n{'=' * 78}\n" + + +def _spdx_title(spdx_id): + return f"License text {spdx_id} (for the packages above marked {DECLARED})" + + +def generate(ui, out, fetch=None, workers=12): + """Write THIRD-PARTY-LICENSES.txt, packages.csv and LOCKFILE.sha256 into `out`.""" + fetch = fetch or (lambda url: urllib.request.urlopen(url, timeout=120).read()) + ui, out = Path(ui), Path(out) + lock = json.loads((ui / "package-lock.json").read_text(encoding="utf-8")) + packages = closure(lock, imports(ui)) + with ThreadPoolExecutor(workers) as pool: + texts = list(pool.map(lambda package: _texts(package, fetch), packages)) + undeclared = [f"{package['name']}@{package['version']}" for package, files in zip(packages, texts) + if files[0][0] == DECLARED and not declared_ids(package["license"])] + if undeclared: + raise ValueError(f"ships no license file and declares no license: {', '.join(undeclared)}") + fallback = sorted({spdx_id for package, files in zip(packages, texts) if files[0][0] == DECLARED + for spdx_id in declared_ids(package["license"])}) + missing = [spdx_id for spdx_id in fallback if not (SPDX_TEXTS / f"{spdx_id}.txt").is_file()] + if missing: + raise ValueError(f"no text for {', '.join(missing)} in {SPDX_TEXTS}: add the SPDX text there") + out.mkdir(parents=True, exist_ok=True) + body = io.StringIO() + body.write("Licenses of the npm packages the embedded llama.cpp WebUI can contain (an upper bound,\n" + "see .github/buildcheck/webuilicenses.py). Generated; do not edit.\n") + for package, files in zip(packages, texts): + for name, data in files: + body.write(_section(f"{package['name']}@{package['version']} ({package['license']}): {name}")) + body.write(data.decode("utf-8", errors="replace").replace("\r\n", "\n").rstrip("\n") + "\n") + for spdx_id in fallback: + body.write(_section(_spdx_title(spdx_id))) + text = (SPDX_TEXTS / f"{spdx_id}.txt").read_text(encoding="utf-8") + body.write(text.replace("\r\n", "\n").rstrip("\n") + "\n") + (out / "THIRD-PARTY-LICENSES.txt").write_bytes(body.getvalue().encode("utf-8")) + with (out / "packages.csv").open("w", newline="", encoding="utf-8") as stream: + writer = csv.writer(stream, lineterminator="\n") + writer.writerow(["package", "version", "license", "files", "tarball"]) + for package, files in zip(packages, texts): + writer.writerow([package["name"], package["version"], package["license"], + ";".join(name for name, _ in files), package["resolved"]]) + (out / "LOCKFILE.sha256").write_bytes(f"{lockfile_digest(ui)} tools/ui/package-lock.json\n".encode("utf-8")) + return packages + + +def _listed(out): + with (Path(out) / "packages.csv").open(newline="", encoding="utf-8") as stream: + return list(csv.DictReader(stream)) + + +def check_texts(out): + """packages.csv and THIRD-PARTY-LICENSES.txt describe each other: one section per listed file.""" + text = (Path(out) / "THIRD-PARTY-LICENSES.txt").read_text(encoding="utf-8") + problems, needed = [], set() + for row in _listed(out): + package = f"{row['package']}@{row['version']}" + files = [name for name in row["files"].split(";") if name] + if not files: + problems.append(f"{package}: packages.csv names no license file") + for name in files: + if _section(f"{package} ({row['license']}): {name}") not in text: + problems.append(f"{package}: no section for {name} in THIRD-PARTY-LICENSES.txt") + if name == DECLARED: + ids = declared_ids(row["license"]) + needed.update(ids) + if not ids: + problems.append(f"{package}: ships no license file and declares no license") + for spdx_id in sorted(needed): + if _section(_spdx_title(spdx_id)) not in text: + problems.append(f"no {spdx_id} license text in THIRD-PARTY-LICENSES.txt for the packages " + "that only declare it") + return problems + + +def check(ui, out): + """[] when the texts in `out` cover this tools/ui: its lockfile, its imports, every listed file.""" + regenerate = ("run `python3 .github/webui-licenses.py generate /tools/ui " + "llama/legal/natives/webui-npm` and commit the result") + recorded = (Path(out) / "LOCKFILE.sha256").read_text(encoding="utf-8").split()[0] + actual = lockfile_digest(ui) + problems = [] + if recorded != actual: + problems.append(f"tools/ui/package-lock.json is {actual}, the WebUI license texts were generated " + f"from {recorded}: {regenerate}") + # A new import of a package the lockfile already had changes no hash. + lock = json.loads((Path(ui) / "package-lock.json").read_text(encoding="utf-8")) + listed = {(row["package"], row["version"]) for row in _listed(out)} + absent = [f"{package['name']}@{package['version']}" for package in closure(lock, imports(ui)) + if (package["name"], package["version"]) not in listed] + if absent: + problems.append(f"{len(absent)} package(s) the WebUI sources can reach are not in packages.csv " + f"({', '.join(absent[:10])}{', ...' if len(absent) > 10 else ''}): {regenerate}") + return problems + check_texts(out) diff --git a/.github/collect-release-assets.py b/.github/collect-release-assets.py new file mode 100644 index 000000000..88de5b8a3 --- /dev/null +++ b/.github/collect-release-assets.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2026 Bernard Ladenthin +# +# SPDX-License-Identifier: MIT OR Apache-2.0 +"""Collect assets using the repository's explicit release-assets.json contract.""" + +import argparse +import os +import sys +import xml.etree.ElementTree as ET +from pathlib import Path + +from buildcheck.releaseassets import collect, file_classifiers + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("destination", nargs="?") + parser.add_argument("--config", help="JSON contract (default: .github/release-assets.json)") + parser.add_argument("--maven-only", action="store_true", help="stage signed Maven files before a rebuild") + parser.add_argument("--maven-assets", help="read Maven files from a previous staging directory") + parser.add_argument("--list-classifiers", type=int, metavar="RULE", help="print classifiers of a file rule (zero based)") + args = parser.parse_args() + if args.list_classifiers is None and args.destination is None: + parser.error("destination is required unless --list-classifiers is used") + errors = [] + try: + root = Path(__file__).resolve().parent.parent + if args.list_classifiers is not None: + if args.list_classifiers < 0: + raise ValueError("file rule index must not be negative") + print("\n".join(file_classifiers(root, args.list_classifiers, args.config))) + return 0 + errors = collect(root, args.destination, args.config, + maven_only=args.maven_only, maven_assets=args.maven_assets) + except (ValueError, OSError, ET.ParseError) as error: + errors.append(str(error)) + for error in errors: + print(f"::error::{error}") + if not errors: + print(f"Collected {len(list(Path(args.destination).iterdir()))} release files including signatures.") + if os.environ.get("GITHUB_OUTPUT"): + with open(os.environ["GITHUB_OUTPUT"], "a") as output: + output.write(f"complete={'false' if errors else 'true'}\n") + return 1 if errors else 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/.github/collect-third-party-licenses.py b/.github/collect-third-party-licenses.py new file mode 100644 index 000000000..77fb0960b --- /dev/null +++ b/.github/collect-third-party-licenses.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2026 Bernard Ladenthin +# SPDX-License-Identifier: MIT OR Apache-2.0 +"""Preserve legal files from resolved runtime JARs without filename collisions. + +Input is maven-dependency-plugin:build-classpath output on this operating system. +This performs no license approvals, downloads, source rewriting or file filtering +by license type. Archives without legal files remain visible in inventory.json. + +A JAR that carries no legal files of its own gets the texts a repository supplies for it +(--supplemental: a directory with notices.json naming, per notice directory, the JAR base +names it covers -- the file name without version, classifier and extension). With +--require-complete a JAR that has neither fails the run, so a new dependency without +legal files cannot reach a fat jar unnoticed. +""" +import argparse +import hashlib +import json +import os +from pathlib import Path, PurePosixPath +import re +import shutil +import zipfile + + +def legal_file(name): + path = PurePosixPath(name) + if path.is_absolute() or ".." in path.parts or "\\" in name or any(":" in part for part in path.parts): + raise ValueError("Unsafe archive entry: " + name) + if name.endswith("/"): + return False + lower = path.name.lower() + # A provider's LICENSE.class is executable code, not a license document. + if path.suffix.lower() in {".class", ".java", ".kt", ".png", ".jpg", ".gif", ".jar"}: + return False + return (any(part.lower() in {"licenses", "licences"} for part in path.parts) + or re.fullmatch(r"(?:licen[sc]e|notice|copying|copyright)(?:[-_.].*)?", lower) is not None) + + +def base_name(jar_name): + """`lwjgl-opencl-3.3.6-natives-linux.jar` -> `lwjgl-opencl`: everything before the version.""" + match = re.match(r"(.+?)-\d", jar_name) + return match.group(1) if match else jar_name[:-len(".jar")] + + +def supplemental_notices(directory): + """Map JAR base name -> notice directory, from /notices.json.""" + if directory is None: + return {} + config = json.loads((directory / "notices.json").read_text(encoding="utf-8")) + if set(config) - {"format", "notices"} or config.get("format") != 1: + raise ValueError("notices.json needs {\"format\": 1, \"notices\": [...]}") + result = {} + for notice in config["notices"]: + if set(notice) - {"directory", "artifacts", "license"} or not notice.get("artifacts"): + raise ValueError("a notice needs directory, artifacts and license: " + json.dumps(notice)) + folder = directory / notice["directory"] + if not folder.is_dir() or not any(path.is_file() for path in folder.rglob("*")): + raise ValueError("notice directory missing or empty: " + str(folder)) + for artifact in notice["artifacts"]: + if artifact in result: + raise ValueError("JAR base name listed twice in notices.json: " + artifact) + result[artifact] = folder + return result + + +def collect(classpath, output, supplemental=None, require_complete=False): + marker = output / ".generated-by-collect-third-party-licenses" + if output.is_symlink(): + raise ValueError("Output must not be a symlink") + if output.exists(): + if not marker.is_file(): + raise ValueError("Refusing to replace an output directory without our marker") + shutil.rmtree(output) + notices = supplemental_notices(supplemental) + output.mkdir(parents=True) + marker.write_text("Generated runtime dependency license inventory.\n", encoding="utf-8") + entries = [] + used = set() + for item in sorted(set(classpath.read_text(encoding="utf-8").strip().split(os.pathsep))): + if not item: + continue + source = Path(item) + if not source.is_file() or source.suffix.lower() != ".jar": + raise ValueError("Classpath entry is not a readable JAR: " + item) + with source.open("rb") as stream: + hasher = hashlib.sha256() + for block in iter(lambda: stream.read(1024 * 1024), b""): + hasher.update(block) + digest = hasher.hexdigest() + # The filename preserves classifiers; the digest also distinguishes equal + # filenames from different groups or different bytes of a snapshot. + directory = re.sub(r"[^a-zA-Z0-9._-]", "_", source.name) + "-" + digest[:16] + files = [] + with zipfile.ZipFile(source) as archive: + for info in sorted(archive.infolist(), key=lambda entry: entry.filename): + if not legal_file(info.filename): + continue + destination = output / directory / info.filename + destination.parent.mkdir(parents=True, exist_ok=True) + data = archive.read(info) + if destination.exists() and destination.read_bytes() != data: + raise ValueError("Conflicting duplicate entry: " + info.filename) + destination.write_bytes(data) + files.append(info.filename) + entry = {"artifact": source.name, "sha256": digest, "directory": directory, "legal_files": files} + folder = notices.get(base_name(source.name)) + if not files and folder is not None: + supplied = [] + for path in sorted(p for p in folder.rglob("*") if p.is_file()): + relative = "supplemental/" + path.relative_to(folder).as_posix() + destination = output / directory / relative + destination.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(path, destination) + supplied.append(relative) + entry["supplemental_files"] = supplied + used.add(base_name(source.name)) + entries.append(entry) + (output / "inventory.json").write_text( + json.dumps({"format": 1, "scope": "runtime", "artifacts": entries}, indent=2) + "\n", + encoding="utf-8") + missing = [entry["artifact"] for entry in entries + if not entry["legal_files"] and not entry.get("supplemental_files")] + supplied = sum(bool(entry.get("supplemental_files")) for entry in entries) + print(f"Runtime legal inventory: {len(entries)} JARs, {supplied} with supplemental notices, " + f"{len(missing)} without any legal files") + stale = sorted(set(notices) - used) + for name in stale: + print(f"Note: notices.json covers {name}, which no runtime JAR without its own legal files needs") + if require_complete and missing: + raise ValueError("JARs without legal files and without a supplemental notice: " + ", ".join(missing)) + return entries + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--classpath", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + parser.add_argument("--supplemental", type=Path, help="directory with notices.json and the notice texts") + parser.add_argument("--require-complete", action="store_true", + help="fail when a JAR has neither legal files nor a supplemental notice") + args = parser.parse_args() + try: + collect(args.classpath, args.output, args.supplemental, args.require_complete) + except (ValueError, OSError) as error: + print(f"::error::{error}") + return 1 + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/.github/mirror-llama-source.sh b/.github/mirror-llama-source.sh index 258c94b49..e4572f368 100755 --- a/.github/mirror-llama-source.sh +++ b/.github/mirror-llama-source.sh @@ -36,6 +36,9 @@ fail() { } [ -n "${LLAMA_MIRROR_TOKEN:-}" ] || fail "LLAMA_MIRROR_TOKEN is empty -- the release job needs that secret to push to $MIRROR" +[[ "$MIRROR" =~ ^[A-Za-z0-9-]+/[A-Za-z0-9_.-]+$ ]] \ + && [ "${MIRROR##*/}" != "." ] && [ "${MIRROR##*/}" != ".." ] \ + || fail "mirror must be a GitHub owner/repository name" [ -d "$SRC/.git" ] || fail "$SRC is not a git checkout" TAG=$(grep -oE '^set\(JLLAMA_GIT_TAG[[:space:]]+b[0-9]+\)' "$CMAKELISTS" | grep -oE 'b[0-9]+' | head -1) @@ -51,11 +54,21 @@ COUNT=$(git -C "$SRC" rev-list --count HEAD) MIRROR_URL="https://github.com/$MIRROR.git" REF="refs/tags/jllama/$TAG" -# The token travels in a header, never in a URL (a URL ends up in process listings and error text). -AUTH="AUTHORIZATION: basic $(printf '%s' "x-access-token:$LLAMA_MIRROR_TOKEN" | base64 -w0)" -echo "::add-mask::${AUTH#AUTHORIZATION: basic }" +# Match only this mirror URL, replacing any inherited checkout header for it. Pass the header +# through the environment, not argv or a persistent Git config. Requires Git >= 2.31. +JLLAMA_MIRROR_AUTH_HEADER="AUTHORIZATION: basic $(printf '%s' "x-access-token:$LLAMA_MIRROR_TOKEN" | base64 -w0)" +export JLLAMA_MIRROR_AUTH_HEADER +if [ "${GITHUB_ACTIONS:-}" = "true" ]; then + echo "::add-mask::${JLLAMA_MIRROR_AUTH_HEADER#AUTHORIZATION: basic }" +fi +mirror_git() { + GIT_TERMINAL_PROMPT=0 git -C "$SRC" \ + -c "credential.$MIRROR_URL.helper=" \ + -c "http.$MIRROR_URL.extraheader=" \ + --config-env="http.$MIRROR_URL.extraheader=JLLAMA_MIRROR_AUTH_HEADER" "$@" +} -EXISTING=$(git -c "http.extraheader=$AUTH" ls-remote --tags "$MIRROR_URL" "$REF" | cut -f1 || true) +EXISTING=$(mirror_git ls-remote --tags "$MIRROR_URL" "$REF" | cut -f1) if [ -n "$EXISTING" ]; then if [ "$EXISTING" = "$HEAD_COMMIT" ]; then echo "mirror-llama-source: $MIRROR already has $REF = $HEAD_COMMIT; nothing to push" @@ -63,5 +76,5 @@ if [ -n "$EXISTING" ]; then fi fail "$MIRROR has $REF = $EXISTING, but $TAG is $HEAD_COMMIT here -- one number, one commit; resolve by hand" fi -git -C "$SRC" -c "http.extraheader=$AUTH" push "$MIRROR_URL" "$HEAD_COMMIT:$REF" +mirror_git push "$MIRROR_URL" "$HEAD_COMMIT:$REF" echo "mirror-llama-source: pushed $HEAD_COMMIT to $MIRROR as $REF" diff --git a/.github/publication.py b/.github/publication.py new file mode 100644 index 000000000..a1dd8cf1d --- /dev/null +++ b/.github/publication.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2026 Bernard Ladenthin +# SPDX-License-Identifier: MIT OR Apache-2.0 +"""Prepare, verify or upload a signed publication without rebuilding its files.""" +import subprocess +import sys +from buildcheck.publication import main + +if __name__ == "__main__": + try: + main() + except (ValueError, OSError, RuntimeError, KeyError, subprocess.CalledProcessError) as error: + print(f"::error::{error}") + sys.exit(1) diff --git a/.github/release-assets.json b/.github/release-assets.json new file mode 100644 index 000000000..d87467094 --- /dev/null +++ b/.github/release-assets.json @@ -0,0 +1,65 @@ +{ + "schema": 1, + "maven": { + "standalone": [ + "llama-atmosphere-agent" + ], + "cyclonedx": true + }, + "files": [ + { + "source": "llama/target/llama-{version}-{classifier}.jar", + "classifiers": { + "csv": ".github/natives.csv", + "column": "classifier" + }, + "central": true + }, + { + "source": "llama-source-archive/llama.cpp-*-jllama-{version}-src.tar.gz" + }, + { + "source": "llama-android/build/aar/llama-android-{version}.aar", + "central": true + }, + { + "source": "llama-android/build/publications/llamaAndroid/pom-default.xml", + "name": "llama-android-{version}.pom", + "central": true + }, + { + "source": "llama-android/build/distributions/llama-android-{version}-{classifier}.jar", + "name": "llama-android-{version}-{classifier}.jar", + "classifiers": [ + "sources", + "javadoc" + ], + "central": true + }, + { + "source": "llama-android/build/aar/llama-android-opencl-{version}.aar", + "central": true + }, + { + "source": "llama-android/build/publications/llamaAndroidOpencl/pom-default.xml", + "name": "llama-android-opencl-{version}.pom", + "central": true + }, + { + "source": "llama-android/build/distributions/llama-android-{version}-{classifier}.jar", + "name": "llama-android-opencl-{version}-{classifier}.jar", + "classifiers": [ + "sources", + "javadoc" + ], + "central": true + } + ], + "publication": { + "central_roots": [ + "target/{staging}", + "llama-atmosphere-agent/target/{staging}", + "llama-android/build/staging-repo" + ] + } +} diff --git a/.github/release-assets.json.license b/.github/release-assets.json.license new file mode 100644 index 000000000..eca5b047c --- /dev/null +++ b/.github/release-assets.json.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2026 Bernard Ladenthin + +SPDX-License-Identifier: MIT OR Apache-2.0 diff --git a/.github/release-gate-exemptions.txt b/.github/release-gate-exemptions.txt index 58738963e..db592a802 100644 --- a/.github/release-gate-exemptions.txt +++ b/.github/release-gate-exemptions.txt @@ -11,10 +11,14 @@ publish-release: a publish job itself check-snapshot: publish-snapshot's own precondition (the version is a SNAPSHOT) check-tag: publish-release's own precondition (the version matches the tag) github-snapshot: runs after publishing; attaches the signed Maven artifacts to the rolling snapshot release -github-release-signed: runs after publishing; attaches the signed Maven artifacts to the tag release +github-release: runs after publishing; attaches the signed Maven artifacts to the tag release verify-signing-key: red by design where the secret is withheld (forks, other contributors' branches); the publish jobs sign with the same key and fail on it themselves verify-signing-key-gradle: same as verify-signing-key, for the Gradle/BouncyCastle signing path test-java-llama-langchain4j-integration: validation only; a cold model cache degrades it to self-skips (CLAUDE.md, LangChain4j integration) build-android-llmservice: an app, not a library release; a Compose/AGP pin must not block a release (CLAUDE.md, Android app "LLM Service") test-android-llmservice: the emulator UI test of that app, optional for the same reason mirror-llama-source: runs after publish-release; pushes the pinned llama.cpp commit to the mirror fork +central-snapshot: Independent post-preflight Central transfer; must not gate the GitHub publication path. +central-release: Independent post-preflight Central transfer; must not gate the GitHub publication path. +attest-snapshot: Independent provenance after the secured handoff; cannot gate either publication consumer. +attest-release: Independent provenance after the secured handoff; cannot gate either publication consumer. diff --git a/.github/shared-files.sha256 b/.github/shared-files.sha256 index b926b18fd..59645e7d0 100644 --- a/.github/shared-files.sha256 +++ b/.github/shared-files.sha256 @@ -11,7 +11,7 @@ # job of a workflow (kept identical inside otherwise different workflows); an entry ending in `?repo` # for a file or job identical up to the repository's name (hashed with that name replaced by # `{repo}`); `sha256sum -c` reads the plain file entries only. -9ad21ea42bced35498c6fcaa533d9ba448af042497f923e60646a77cfbe0fc5f .github/buildcheck/__init__.py +59b253ed6d8813ed64b304089d04c5ced106669a38b37bbc643a3751f1fc4a1c .github/buildcheck/__init__.py 3d1a9f2e93709941261a9655bc19bf50d5becefd8f6a6c2f5564096a757996bb .github/buildcheck/workflow.py 5a70eee1bb8af180edfd2a4bae61be61fac15b409f5df6a8bb9869425d7fc381 .github/buildcheck/releasegate.py ff2aaec95e53916ea340a0a291bf0f57e0011522aedb486622b1fb1cac136865 .github/buildcheck/sharedfiles.py @@ -50,18 +50,41 @@ e8f444ef851bd134330f1505f52b4b0970ef9a62dd76e4c25829241814ba5c73 .github/ISSUE_ 2de09a4aa4b2bf2f9199c603806c6b6b65c254adbc35a6b5d184652f7022e69f .mvn/jvm.config 71ec85b7a30e80b18a9ab1fac0199cc50d68548e6f00dd116ab0f904ad63aa50 .mvn/jvm.config.license a4f42a0bfa9b14ca937675052b990e5f1dda238d762f9d0268ac282cd7030c0d .github/workflows/publish.yml#verify-signing-key-gradle -6e2ae11dad0616f66bbb2b6e6556f580bb987fd911d7132aa6bee2bfc7cc7b52 .java-version +64aeb9975f234becd55bb4635e6e2f2da7a6b7bf0a896f0c07763bdfbfb31420 .java-version 71ec85b7a30e80b18a9ab1fac0199cc50d68548e6f00dd116ab0f904ad63aa50 .java-version.license 48cf852de627f1b11f402e408af907ce3e9ec926f6ba11720467645117e92e3a .github/workflows/claude.yml 362d1d169821b8954dc305dac36b8e2437acdbe2921ac42e9887a215663fa666 .github/workflows/claude-code-review.yml d4371cbcd6c5511e9b712599bbadc7b4c2437f3107f5d706a9adccdda24c2c44 .github/workflows/scorecard.yml 480afc0c1e41f3997b195d7297750b43599ba71a7471657aa32bfc9662b6fd30 .github/workflows/reuse.yml 93aedaf67af1c4d63b2502107a51f2f454f2b3b4bc5f2fe892561e12363e57a9 .github/workflows/osv-scanner.yml -ed4231dc5b4ba9357a06974cb61e92b60e3eaac9a293810087efb2933e0cac82 .github/workflows/codeql.yml +2dc51e7f4873bc923d0149c12f1eb1e2752805147f89b359aa7a68e632d48c9c .github/workflows/codeql.yml c9e757f2d0a2f456a08791697a94161c776d9b008a8aa75890da4133c81a99e9 .github/dependabot.yml c38151495be64cedc3f11c23b88ffc53f4e0f9d2ce5c0aaaa42b14e4af7e13ec llama/lombok.config f26d05f25a154b84d8f281bb92857811749e2225cdbc167362de930c48b532d1 .github/workflows/publish.yml#startgate e3dde66089fd568f03caeefee86ea36a9f6eb7f47e5dc6d053e0e5784fd7a208 .github/workflows/publish.yml#shared-files 3ef45f189f4419e0d4087f572b3c1b6085c0fe39ac7979b07deb2e882f7ffe8c .github/workflows/publish.yml#verify-signing-key -09230b04c5f14bdda50a0c862152ff197a656cbc3fd0d110899c5f8150f8aa9a .github/workflows/publish.yml#check-snapshot -51e987d59efd9887b43e345edc0e0f3db21686879e3ca6ea9f0fdbc493d37121 .github/workflows/publish.yml#check-tag +216fe05041f385c2d60f168302cd7a11d29069eae6ef51c855c82771f750ea92 .github/workflows/publish.yml#check-snapshot +6fc44f69d3549f4f248b8612d596a877c491a0d497916e5d9ffeb67c51769804 .github/workflows/publish.yml#check-tag +e8d3ef1a4d034abc82fc416a66a1a0765239161beaae7b508c373059e79e5606 .github/buildcheck/releaseassets.py +7f8c715af79007e851d337b1dac600ff93d14f7f831c46e41300e5441e0f0fa5 .github/buildcheck/snapshot.py +894465632ecdb87c587cd7e18d6fc14f6ac4fa77490154b77188cb4dfc425700 .github/buildcheck/tests/test_releaseassets.py +6479634aaa6f2b18341760477c6dfb2f5bc82fdc08f1a32aa8a431f1138628b5 .github/buildcheck/tests/test_snapshot.py +bf43c70a38ea1db6a92b35b8e97bb442d2fddcd5b3401919976ac139348e2a0e .github/collect-release-assets.py +930cd6f5ec26cb037acbcc65d43a01905056cbf9f51b618fd841b1373f4125f7 .github/update-snapshot.py +71ec85b7a30e80b18a9ab1fac0199cc50d68548e6f00dd116ab0f904ad63aa50 .github/release-assets.json.license +408aec023edac2aa8769d70166ffffa54233ec825862abfc70cec05b39834fbf .github/workflows/publish.yml#github-snapshot +cda6313687d98ad4b9f10ffe9b917656310bca0286fc0349b663dcc8fe24615a docs/dependency-license-review.md +8c7e4771f4543aebecbec1013ff091196c5abe475e1c7bc90738244d9c5a02d2 .fossa.yml?repo +675abf347248393ab656ccba51d76b9172ec77fc9a2f25a17161dd733569f7d4 .github/collect-third-party-licenses.py +63a83d9e2f3da55aeae0b20ef0a8c48da0114aef34bd1e3eaba5e427ca541024 .github/buildcheck/tests/test_thirdpartylicenses.py +4e3c1b33c1960b8fc8c5bb892b8c7861eb71deb50b989edcf83202838e786a0d .github/buildcheck/publication.py +9180fac217c75b3e11f67e244b9171f447d2c21665b1802574b57b97019f7173 .github/publication.py +792b1259417593f198260a469e518cce7faeafeb20cab037c9be00590ce83133 .github/buildcheck/tests/test_publication.py +a6f9fadc79d16eff8ab56b76f313ac9433326e360ba7969d8607c49cf4bafc49 docs/publication-preflight.md +aa9989fd22438c3f7cb427ae6bcd6f3b87a9ef014e7d24c2ee9bdc179a137928 .github/workflows/publish.yml#central-snapshot +2180d438fb840a1ca7015cdb95f28c25641c0b151679d95767c4b4393794e4f1 .github/workflows/publish.yml#central-release +8f96d48502f487a311d5cc01dadedc92fe4a88f565e01f05ddbd1ba839bfe70e .github/workflows/dependency-submission.yml +38f493414ec975a0c89d8836aa3825dd2d77677220bce5fa1c041a19ab85e4cc .github/actions/finalize-publication/action.yml +f90bda93c5ce115e571d61028808121dbbe65e75771eb853027402486fabd4e1 .github/workflows/publish.yml#github-release +ad9631c57b868851a6acbc08f47bc790d3b69a587c51cb7429d657e63c5fd23b .github/workflows/publish.yml#attest-snapshot +481c8112f38f5aede30905702033e2dccf9c807a6eb167cefd167f15738e9a84 .github/workflows/publish.yml#attest-release diff --git a/.github/update-snapshot.py b/.github/update-snapshot.py new file mode 100644 index 000000000..03dcd4571 --- /dev/null +++ b/.github/update-snapshot.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2026 Bernard Ladenthin +# +# SPDX-License-Identifier: MIT OR Apache-2.0 +"""Usage: update-snapshot.py ; requires the serialized github-snapshot job.""" + +import argparse +import os +import subprocess +import sys + +from buildcheck.snapshot import publish + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("directory") + parser.add_argument("--tag", default="snapshot") + parser.add_argument("--title", default="Snapshot (latest)") + args = parser.parse_args() + try: + publish(os.environ["GITHUB_REPOSITORY"], os.environ["GITHUB_SHA"], + os.environ["GITHUB_RUN_ID"], os.environ["GITHUB_RUN_ATTEMPT"], args.directory, + os.environ.get("ASSETS_COMPLETE") == "true", tag=args.tag, title=args.title) + return 0 + except (ValueError, OSError, RuntimeError, KeyError, subprocess.CalledProcessError) as error: + print(f"::error::{error}") + return 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/.github/webui-licenses.py b/.github/webui-licenses.py new file mode 100644 index 000000000..65c6a2618 --- /dev/null +++ b/.github/webui-licenses.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2026 Bernard Ladenthin +# +# SPDX-License-Identifier: MIT OR Apache-2.0 +"""Generate or check the license texts of the npm packages in the embedded WebUI. + + webui-licenses.py generate /tools/ui llama/legal/natives/webui-npm + webui-licenses.py check /tools/ui llama/legal/natives/webui-npm [--warn-only] +""" + +import argparse +import sys + +from buildcheck.webuilicenses import check, generate + + +def main(): + parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument("command", choices=("generate", "check")) + parser.add_argument("ui", help="llama.cpp's tools/ui directory at the pinned commit") + parser.add_argument("out", help="llama/legal/natives/webui-npm") + parser.add_argument("--warn-only", action="store_true", help="report a stale list as a warning") + args = parser.parse_args() + if args.command == "generate": + packages = generate(args.ui, args.out) + print(f"{len(packages)} packages written to {args.out}") + return 0 + problems = check(args.ui, args.out) + for problem in problems: + print(f"::{'warning' if args.warn_only else 'error'}::{problem}") + if not problems: + print("WebUI license texts match tools/ui/package-lock.json") + return 1 if problems and not args.warn_only else 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index da8c6aded..ee8ef7028 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -19,12 +19,8 @@ jobs: security-events: write steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - # Two JDKs, as in every job that builds a whole reactor: a module with a Java floor above - # .java-version (java-llama.cpp's llama-ffm, Java 22) builds through maven-toolchains-plugin, - # and setup-java writes a toolchains.xml entry per JDK it installs; the second step keeps - # JAVA_HOME on .java-version. Harmless in a repository without such a module. Shared file. - - uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 - with: { java-version: '25', distribution: temurin } + # The build JDK comes from the shared .java-version. Production and test + # bytecode releases remain explicitly configured in the Maven POMs. - uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 with: { java-version-file: .java-version, distribution: temurin } - uses: github/codeql-action/init@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4 diff --git a/.github/workflows/dependency-submission.yml b/.github/workflows/dependency-submission.yml new file mode 100644 index 000000000..eac48078f --- /dev/null +++ b/.github/workflows/dependency-submission.yml @@ -0,0 +1,33 @@ +# SPDX-FileCopyrightText: 2026 Bernard Ladenthin +# SPDX-License-Identifier: MIT OR Apache-2.0 + +name: Maven Dependency Submission +on: + # The graph GitHub shows is the default branch's. Other branches (Dependabot's among them, whose + # pushes get a read-only token) would only fail or add snapshots nobody reads. + push: + branches: [ main ] + workflow_dispatch: +permissions: + contents: read +jobs: + submit: + name: Submit Maven dependencies with the build JDK + runs-on: ubuntu-latest + # The dependency-submission API requires contents:write. This workflow runs on + # repository pushes, never on pull_request or pull_request_target events. + permissions: + contents: write + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + persist-credentials: false + - uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 + with: + distribution: temurin + java-version-file: .java-version + cache: maven + # Same action revision as GitHub's automatic Maven submission, with explicit JDK setup. + - uses: actions/maven-dependency-submission-action@1f666f7ac2ab7b72cd5e22eaf7f23c8a581db1db + with: + maven-args: -Denforcer.skip=true -DskipTests diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 7d9148aa1..5e83c1bd2 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -448,8 +448,8 @@ jobs: # llama-ffm: the C API of libjllama (jllama_api.h) through the Java 22+ Foreign Function and # Memory API, no JNI. Reuses the Linux x86_64 natives artifact and the cached models like the # langchain4j integration job (lib.path, no second loading path); Maven runs on the JDK of - # .java-version and compiles, tests and documents this module with the JDK 25 toolchain the first - # setup-java step registers. Gates both publish jobs: the module ships on Maven Central. + # .java-version (25), which compiles, tests and documents the module for its Java 22 target. + # Gates both publish jobs: the module ships on Maven Central. # --------------------------------------------------------------------------- test-java-llama-ffm: @@ -467,15 +467,7 @@ jobs: name: natives-cpu-linux-x86-64 path: ${{ github.workspace }}/llama/src/main/natives/net/ladenthin/llama/ - uses: ./.github/actions/restore-models - # A second JDK next to the one of .java-version: llama-ffm (the C API through the Java 22+ FFM - # API) has a Java floor of its own and builds through maven-toolchains-plugin; setup-java writes - # a toolchains.xml entry for every JDK it installs, and the step that follows keeps JAVA_HOME on - # the workflow's JDK. Version: the current LTS above the floor (not .java-version, which is a - # shared file of the four repositories). - - uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 - with: - distribution: 'temurin' - java-version: '25' + # Build with the shared JDK; llama-ffm retains its Java 22 bytecode target. - uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 with: distribution: 'temurin' @@ -670,6 +662,13 @@ jobs: node-version: '24' cache: npm cache-dependency-path: llamacpp-ui/tools/ui/package-lock.json + # The bundle strips every legal comment, so the texts of its npm packages travel in + # llama/legal/natives/webui-npm/ (every natives jar carries them). They were generated from one + # package-lock.json; a llama.cpp bump that changes it must regenerate them before a release. + - name: Check the WebUI license texts against this package-lock.json + run: > + python3 .github/webui-licenses.py check llamacpp-ui/tools/ui llama/legal/natives/webui-npm + ${{ !startsWith(github.ref, 'refs/tags/v') && '--warn-only' || '' }} - name: Build WebUI (Svelte/Vite) working-directory: llamacpp-ui/tools/ui env: @@ -744,10 +743,11 @@ jobs: # knob, but CI no longer sets it. The first-run sccache debug diagnostics (SCCACHE_LOG / # SCCACHE_ERROR_LOG / RUST_BACKTRACE) were dropped now that caching is confirmed; build.sh still # prints the `sccache --show-stats` hit table at the end of every run. Inert without DEPOT_TOKEN - # (fork PRs) or use_cache=false. + # (fork PRs) or use_cache=false. SCCACHE_WRAP_NVCC=false in this env keeps nvcc uncached (build.sh); + # the wrapper forwards it into the container only because DOCKCROSS_ARGS names it. env: SCCACHE_WEBDAV_TOKEN: ${{ secrets.DEPOT_TOKEN }} - DOCKCROSS_ARGS: "-e SCCACHE_WEBDAV_ENDPOINT -e SCCACHE_WEBDAV_TOKEN -e USE_CACHE" + DOCKCROSS_ARGS: "-e SCCACHE_WEBDAV_ENDPOINT -e SCCACHE_WEBDAV_TOKEN -e USE_CACHE -e SCCACHE_WRAP_NVCC" steps: - name: Free up disk space # The GPU toolkit this job installs runs to several GB on top of the llama.cpp build tree; @@ -899,7 +899,7 @@ jobs: mvn -q --no-transfer-progress -f llama/pom.xml compile .github/build.sh "-DBUILD_TESTING=ON -DFETCHCONTENT_SOURCE_DIR_LLAMA.CPP=$RUNNER_TEMP/llama-src" - name: Run C++ unit tests - run: ctest --test-dir llama/build --output-on-failure + run: ctest --test-dir llama/build --no-tests=error --output-on-failure crosscompile-linux-aarch64: name: Build manylinux_2_28 aarch64 (CPU variants) @@ -990,7 +990,7 @@ jobs: mvn --no-transfer-progress -f llama/pom.xml compile .github/build.sh "-DGGML_NATIVE=OFF -DGGML_OPENMP=OFF -DBUILD_TESTING=ON -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=s390x -DCMAKE_C_COMPILER=s390x-linux-gnu-gcc -DCMAKE_CXX_COMPILER=s390x-linux-gnu-g++ -DCMAKE_CROSSCOMPILING_EMULATOR=/usr/bin/qemu-s390x-static -DOS_NAME=Linux -DOS_ARCH=s390x" - name: Run C++ unit tests under qemu-s390x (big-endian gate) - run: ctest --test-dir llama/build --output-on-failure + run: ctest --test-dir llama/build --no-tests=error --output-on-failure - name: Upload artifacts uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7 with: @@ -1231,6 +1231,7 @@ jobs: shell: bash run: | set -euo pipefail + # Consume full unzip output: grep -q can SIGPIPE unzip under pipefail. VERSION=$(mvn -q -DforceStdout help:evaluate -Dexpression=project.version | tail -n1) for flavor in llama-android llama-android-opencl; do AAR="llama-android/build/aar/${flavor}-${VERSION}.aar" @@ -1246,7 +1247,7 @@ jobs: ENTRIES="AndroidManifest.xml classes.jar proguard.txt R.txt" for abi in $ABIS; do for lib in $LIBS; do ENTRIES="$ENTRIES jni/$abi/$lib"; done; done for entry in $ENTRIES; do - unzip -l "$AAR" | grep -q "${entry}$" || { echo "::error::$AAR is missing $entry"; exit 1; } + unzip -l "$AAR" | grep "${entry}$" > /dev/null || { echo "::error::$AAR is missing $entry"; exit 1; } done if [ "$flavor" = "llama-android" ]; then for abi in $ABIS; do @@ -1255,16 +1256,29 @@ jobs: echo "$AAR: $n CPU module(s) for $abi" done else - if unzip -l "$AAR" | grep -q "jni/.*/libjllama.so$"; then + if unzip -l "$AAR" | grep "jni/.*/libjllama.so$" > /dev/null; then echo "::error::$AAR carries a second libjllama.so -- the OpenCL AAR must hold its module only"; exit 1 fi fi - unzip -p "$AAR" AndroidManifest.xml | grep -q 'android:minSdkVersion="28"' \ + unzip -p "$AAR" AndroidManifest.xml | grep 'android:minSdkVersion="28"' > /dev/null \ || { echo "::error::$AAR manifest lost minSdkVersion 28"; exit 1; } + # Both AARs merge into the OpenCL consumer. AGP requires unique library + # namespaces, including for native-only add-ons with an empty classes.jar. + MANIFEST_PACKAGE="net.ladenthin.llama.android" + if [ "$flavor" = "llama-android-opencl" ]; then MANIFEST_PACKAGE="$MANIFEST_PACKAGE.opencl"; fi + unzip -p "$AAR" AndroidManifest.xml | grep -F "package=\"$MANIFEST_PACKAGE\"" > /dev/null \ + || { echo "::error::$AAR manifest has the wrong namespace (expected $MANIFEST_PACKAGE)"; exit 1; } unzip -p "$AAR" classes.jar > /tmp/aar-classes.jar - unzip -l /tmp/aar-classes.jar | grep -q "net/ladenthin/llama/LlamaModel.class" \ - || { echo "::error::$AAR classes.jar lost LlamaModel"; exit 1; } - if unzip -l /tmp/aar-classes.jar | grep -qE "module-info\.class|net/ladenthin/llama/(Linux|Mac|Windows)/"; then + if [ "$flavor" = "llama-android" ]; then + unzip -l /tmp/aar-classes.jar | grep "net/ladenthin/llama/LlamaModel.class" > /dev/null \ + || { echo "::error::$AAR classes.jar lost LlamaModel"; exit 1; } + elif unzip -Z -1 /tmp/aar-classes.jar | grep '\.class$' > /dev/null; then + echo "::error::$AAR duplicates Java classes from its CPU AAR dependency"; exit 1 + fi + # The license texts of the code in its .so files (llama/legal/natives/), at a path of its own. + unzip -l /tmp/aar-classes.jar | grep "META-INF/third-party/$flavor/natives/llama.cpp/LICENSE" > /dev/null \ + || { echo "::error::$AAR classes.jar lacks the natives license texts (llama/legal/natives)"; exit 1; } + if unzip -l /tmp/aar-classes.jar | grep -E "module-info\.class|net/ladenthin/llama/(Linux|Mac|Windows)/" > /dev/null; then echo "::error::$AAR classes.jar carries module-info or desktop native resources"; exit 1 fi # The libraries themselves (bionic-only DT_NEEDED + libOpenCL.so for the OpenCL @@ -1277,25 +1291,32 @@ jobs: done - name: Android libraries -- dependency allowlist + 16 KB page alignment (buildcheck/nativedeps.py) run: python3 .github/verify-native-deps.py stage - - name: AGP consumer smoke test (R8 release build from mavenLocal) + - name: AGP consumer smoke tests (CPU and additive OpenCL, R8 release builds) shell: bash run: | set -euo pipefail + # Consume full unzip output: grep -q can SIGPIPE unzip under pipefail. VERSION=$(mvn -q -DforceStdout help:evaluate -Dexpression=project.version | tail -n1) - gradle -p .github/android-consumer-test assembleRelease "-PjllamaVersion=${VERSION}" - APK=.github/android-consumer-test/app/build/outputs/apk/release/app-release.apk - test -f "$APK" - for abi in arm64-v8a x86_64; do - for lib in libjllama.so libggml.so libggml-base.so; do - unzip -l "$APK" | grep -q "lib/$abi/$lib" \ - || { echo "::error::consumer APK is missing lib/$abi/$lib"; exit 1; } + for backend in cpu opencl; do + gradle -p .github/android-consumer-test assembleRelease "-PjllamaVersion=${VERSION}" "-PjllamaBackend=$backend" + APK=.github/android-consumer-test/app/build/outputs/apk/release/app-release.apk + test -f "$APK" + for abi in arm64-v8a x86_64; do + for lib in libjllama.so libggml.so libggml-base.so; do + unzip -l "$APK" | grep "lib/$abi/$lib" > /dev/null \ + || { echo "::error::$backend consumer APK is missing lib/$abi/$lib"; exit 1; } + done + unzip -l "$APK" | grep "lib/$abi/libggml-cpu-.*\.so" > /dev/null \ + || { echo "::error::$backend consumer APK has no CPU backend module under lib/$abi/"; exit 1; } done - unzip -l "$APK" | grep -q "lib/$abi/libggml-cpu-.*\.so" \ - || { echo "::error::consumer APK has no CPU backend module under lib/$abi/"; exit 1; } + if [ "$backend" = opencl ]; then + unzip -l "$APK" | grep 'lib/arm64-v8a/libggml-opencl.so' > /dev/null \ + || { echo "::error::OpenCL consumer APK lost its additive module"; exit 1; } + fi + # The AAR's consumer proguard.txt must have carried the binding through R8. + unzip -p "$APK" "classes*.dex" | grep -a "Lnet/ladenthin/llama/LlamaModel;" > /dev/null \ + || { echo "::error::R8 stripped net.ladenthin.llama.LlamaModel — consumer proguard rules broken"; exit 1; } done - # The AAR's consumer proguard.txt must have carried the binding through R8. - unzip -p "$APK" "classes*.dex" | grep -aq "Lnet/ladenthin/llama/LlamaModel;" \ - || { echo "::error::R8 stripped net.ladenthin.llama.LlamaModel — consumer proguard rules broken"; exit 1; } - name: Upload AARs uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7 with: @@ -1687,7 +1708,7 @@ jobs: mvn --no-transfer-progress -f llama/pom.xml compile .github/build.sh -DGGML_METAL=OFF -DGGML_NATIVE=OFF -DBUILD_TESTING=ON - name: Run C++ unit tests - run: ctest --test-dir llama/build --output-on-failure + run: ctest --test-dir llama/build --no-tests=error --output-on-failure - name: Upload artifacts uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7 with: @@ -1725,7 +1746,7 @@ jobs: mvn --no-transfer-progress -f llama/pom.xml compile .github/build.sh -DLLAMA_METAL_EMBED_LIBRARY=ON -DBUILD_TESTING=ON - name: Run C++ unit tests - run: ctest --test-dir llama/build --output-on-failure + run: ctest --test-dir llama/build --no-tests=error --output-on-failure - name: Upload artifacts uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7 with: @@ -1757,7 +1778,7 @@ jobs: run: | .github\build.bat -G "Visual Studio 18 2026" -A "x64" -DGGML_OPENMP=OFF -DOS_NAME=Windows -DOS_ARCH=x86_64 -DBUILD_TESTING=ON - name: Run C++ unit tests - run: ctest --test-dir llama/build --output-on-failure + run: ctest --test-dir llama/build -C Release --no-tests=error --output-on-failure - name: Upload artifacts uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7 with: @@ -2687,7 +2708,7 @@ jobs: - name: Verify llama.cpp patches are applied run: .github/verify-patches-applied.sh - name: Run C++ unit tests - run: ctest --test-dir llama/build --output-on-failure + run: ctest --test-dir llama/build --no-tests=error --output-on-failure test-cpp-linux-aarch64: name: C++ Tests Ubuntu 24.04 aarch64 @@ -2720,7 +2741,7 @@ jobs: - name: Verify llama.cpp patches are applied run: .github/verify-patches-applied.sh - name: Run C++ unit tests - run: ctest --test-dir llama/build --output-on-failure + run: ctest --test-dir llama/build --no-tests=error --output-on-failure test-cpp-windows-x86_64: name: C++ Tests Windows 2025 x86_64 (clang) @@ -2752,7 +2773,7 @@ jobs: shell: bash run: .github/verify-patches-applied.sh - name: Run C++ unit tests - run: ctest --test-dir llama/build --output-on-failure + run: ctest --test-dir llama/build -C Release --no-tests=error --output-on-failure # The static arm64 build with the C++ suite: the shipped arm64 artifact is modular (see # build-windows-arm64), where jllama_test cannot link the CPU and RPC backends it calls directly, @@ -2779,7 +2800,7 @@ jobs: shell: bash run: .github/verify-patches-applied.sh - name: Run C++ unit tests - run: ctest --test-dir llama/build --output-on-failure + run: ctest --test-dir llama/build -C Release --no-tests=error --output-on-failure build-macos-arm64-metal-15: name: Build and Test macOS 15 arm64 (Metal) @@ -2812,7 +2833,7 @@ jobs: mvn --no-transfer-progress -f llama/pom.xml compile .github/build.sh -DLLAMA_METAL_EMBED_LIBRARY=ON -DGGML_NATIVE=OFF -DBUILD_TESTING=ON - name: Run C++ unit tests - run: ctest --test-dir llama/build --output-on-failure + run: ctest --test-dir llama/build --no-tests=error --output-on-failure - name: Upload artifacts uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7 with: @@ -3215,15 +3236,7 @@ jobs: - name: Verify native runtime dependencies and the Windows signatures run: | python3 .github/verify-native-deps.py ${{ env.SIGN_WINDOWS == 'true' && '--require-signed' || '' }} llama/src/main/natives - # A second JDK next to the one of .java-version: llama-ffm (the C API through the Java 22+ FFM - # API) has a Java floor of its own and builds through maven-toolchains-plugin; setup-java writes - # a toolchains.xml entry for every JDK it installs, and the step that follows keeps JAVA_HOME on - # the workflow's JDK. Version: the current LTS above the floor (not .java-version, which is a - # shared file of the four repositories). - - uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 - with: - distribution: 'temurin' - java-version: '25' + # Build with the shared JDK; llama-ffm retains its Java 22 bytecode target. - uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 with: distribution: 'temurin' @@ -3345,7 +3358,9 @@ jobs: - { target: linux-x86-64, runner: ubuntu-latest } - { target: linux-aarch64, runner: ubuntu-24.04-arm } - { target: windows-x86-64, runner: windows-2025-vs2026 } - - { target: windows-aarch64, runner: windows-11-arm } + # Temurin publishes no JDK 25 for Windows on arm64 (its 21 is the newest there), so this + # row takes Microsoft's build of the same .java-version. JDK 21 only if that one goes too. + - { target: windows-aarch64, runner: windows-11-arm, jdk: microsoft } runs-on: ${{ matrix.runner }} steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 @@ -3361,7 +3376,7 @@ jobs: - uses: ./.github/actions/restore-models - uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 with: - distribution: 'temurin' + distribution: ${{ matrix.jdk || 'temurin' }} java-version-file: .java-version # The Java 8 floor, re-checked on the jars a consumer downloads: the set holds the jars the # `package` job checked plus the runtime dependencies a consumer resolves with them. The @@ -3387,6 +3402,15 @@ jobs: - name: Run the RPC smoke test (two JVMs) if: runner.os == 'Linux' run: .github/smoke-rpc.sh smoke "models/${DRAFT_MODEL_NAME}" + - name: Install Java 8 for the core runtime compatibility check + if: matrix.target == 'linux-x86-64' + uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 + with: + distribution: temurin + java-version: '8' + - name: Run the same published core and natives on Java 8 + if: matrix.target == 'linux-x86-64' + run: .github/smoke-test-natives.sh smoke "models/${DRAFT_MODEL_NAME}" - name: Upload server logs if: failure() uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7 @@ -3511,19 +3535,16 @@ jobs: needs: [package] runs-on: ubuntu-latest permissions: - contents: write + contents: read steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - - uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 - with: { java-version-file: .java-version, distribution: temurin } + with: + persist-credentials: false - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8 with: { name: jacoco-report, path: target/site/jacoco/ } continue-on-error: true - # Submits the dependency graph to GitHub. Informational: it says nothing about whether the - # artifacts are correct, but it sits in the `report` job, which the release path needs -- so - # without this flag a third-party action having a bad day can block a publish. - - uses: advanced-security/maven-dependency-submission-action@a64327a7329c9939cf675e458452febe1894a70c # v6 - continue-on-error: true + # The dependency graph is submitted by dependency-submission.yml (on pushes to main, with the + # JDK of .java-version), not here: this job gates the release path and needs no write access. - name: Coveralls uses: coverallsapp/github-action@8d6379e14d29928660c4ba802d8e85393440b329 # v2 with: @@ -3546,8 +3567,15 @@ jobs: (github.event_name == 'push' && github.ref == 'refs/heads/main') || (github.event_name == 'workflow_dispatch' && !startsWith(github.ref, 'refs/tags/v')) steps: - - name: Confirm snapshot ref - run: echo "Confirmed on snapshot ref ${{ github.ref }}" + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + persist-credentials: false + # Every project version ends in -SNAPSHOT before anything is published to the snapshot channel. + # Only then: a push publishes nothing, and main carries the release version for the commit + # a release is tagged on. + - name: Require a SNAPSHOT version + if: inputs.publish_to_central + run: python3 .github/publication.py check-ref --channel snapshot check-tag: name: "Check: v* tag" @@ -3555,64 +3583,64 @@ jobs: runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/v') steps: - - name: Confirm tag ref - run: echo "Confirmed on tag ${{ github.ref }}" + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + persist-credentials: false + # The tag names exactly the project version (v1.2.3 for 1.2.3), which is no SNAPSHOT. + - name: Require the release version the tag names + run: python3 .github/publication.py check-ref --channel release publish-snapshot: - name: Publish Snapshot to Central - needs: [check-snapshot, crosscompile-linux-x86_64-cuda, test-source-archive, crosscompile-android-aarch64-opencl, package-android-aar, test-android-emulator, code-style, test-java-llama-langchain4j, test-java-llama-kotlin, test-java-llama-ffm, test-java-llama-atmosphere-agent, test-java-llama-atmosphere-agent-integration, smoke-natives, smoke-natives-macos, smoke-agent-linux, vmlens, shared-files] + name: Prepare and verify signed snapshot artifacts + needs: + - check-snapshot + - crosscompile-linux-x86_64-cuda + - test-source-archive + - crosscompile-android-aarch64-opencl + - package-android-aar + - test-android-emulator + - code-style + - test-java-llama-langchain4j + - test-java-llama-kotlin + - test-java-llama-ffm + - test-java-llama-atmosphere-agent + - test-java-llama-atmosphere-agent-integration + - smoke-natives + - smoke-natives-macos + - smoke-agent-linux + - vmlens + - shared-files if: needs.check-snapshot.result == 'success' && inputs.publish_to_central runs-on: ubuntu-latest + outputs: + assets_complete: ${{ steps.finalize.outputs.complete }} environment: maven-central permissions: - contents: write - id-token: write - attestations: write + contents: read steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - # Every shipped native build uploads `natives-`. Downloaded UNMERGED (one - # subdirectory per artifact) on purpose: merge-native-artifacts.sh checks that each artifact - # holds exactly the /// directory its name promises and that no path is - # claimed twice, then merges. `merge-multiple: true` would silently overwrite -- and can - # byte-level interleave -- two artifacts with the same path, which is how a corrupt macOS - # dylib shipped; the test-only macOS builds (macos-26-metal, macos-15-no-metal) are named - # outside the glob for that reason. - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8 with: - pattern: "natives-*" + pattern: natives-* path: ${{ github.workspace }}/native-artifacts/ - name: Merge native libraries into the natives tree (checked per artifact) run: | bash .github/merge-native-artifacts.sh \ "${{ github.workspace }}/native-artifacts" \ "${{ github.workspace }}/llama/src/main/natives/net/ladenthin/llama/" - # The same check package ran, over the tree this job deploys: the dependency allowlists and, - # with the `sign_windows` switch, every Windows DLL signed. - name: Verify native runtime dependencies and the Windows signatures run: | python3 .github/verify-native-deps.py ${{ env.SIGN_WINDOWS == 'true' && '--require-signed' || '' }} llama/src/main/natives - # A second JDK next to the one of .java-version: llama-ffm (the C API through the Java 22+ FFM - # API) has a Java floor of its own and builds through maven-toolchains-plugin; setup-java writes - # a toolchains.xml entry for every JDK it installs, and the step that follows keeps JAVA_HOME on - # the workflow's JDK. Version: the current LTS above the floor (not .java-version, which is a - # shared file of the four repositories). - - uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 - with: - distribution: 'temurin' - java-version: '25' - name: Set up Maven Central Repository uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 with: java-version-file: .java-version - distribution: 'temurin' + distribution: temurin server-id: central server-username: MAVEN_USERNAME server-password: MAVEN_PASSWORD gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} gpg-passphrase: MAVEN_GPG_PASSPHRASE - # The patched llama.cpp source this build was compiled from (archive-llama-source, proven - # buildable by test-source-archive), signed with the release key setup-java just imported -- - # the same key and passphrase name as every Maven file -- and collected below next to them. - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8 with: name: llama-cpp-source @@ -3634,313 +3662,122 @@ jobs: VERSION=$(mvn -q -DforceStdout help:evaluate -Dexpression=project.version | tail -n1) echo "Resolved project version: $VERSION" case "$VERSION" in - *-SNAPSHOT) echo "OK: -SNAPSHOT version, continuing snapshot deploy." ;; + *-SNAPSHOT) echo "OK: -SNAPSHOT version, continuing local snapshot staging." ;; *) echo "::error::Refusing to publish non-SNAPSHOT version '$VERSION' from the snapshot job. Snapshot publishing requires a -SNAPSHOT version; releases go through the v* tag path."; exit 1 ;; esac - # One reactor deploy publishes all six Maven artifacts at the same version: - # net.ladenthin:llama-parent (the pom), :llama (the classes jar + natives jars), - # :llama-langchain4j, :llama-kotlin, :llama-ffm and :llama-platform (a pom). The `release` profile (GPG + Central - # Publishing) is inherited from the parent, so every module — including the - # parent pom — is signed. The Android AARs are published by the separate - # Gradle step below (Maven cannot deploy aar). - # Informational only (nothing depends on it): logs the effective POM with the same - # profile set as the deploy below, so the resolved central-publishing configuration - # (waitUntil/waitMaxTime etc.) is visible for debugging. - name: Show effective POM (debug) - run: mvn --batch-mode --no-transfer-progress -P release,natives help:effective-pom - # -Dmaven.repository.credentialScope=id: Maven 3.10 (on the runners since 2026-10) sends a server's - # credentials only to its declared origins, and for the id `central` that is repo.maven.apache.org -- - # an upload to central.sonatype.com then goes out anonymously and fails with HTTP 401. - # Restores id-only matching; replace with setup-java's `mvn-server-repository-origins: - # central:https://central.sonatype.com` once a release of setup-java ships that input. - - name: Publish snapshot (reactor - parent + llama + llama-langchain4j + llama-kotlin + llama-platform) - run: mvn --batch-mode --no-transfer-progress -Dmaven.repository.credentialScope=id -P release,natives -Dmaven.test.skip=true deploy + run: mvn --batch-mode --no-transfer-progress -P release,natives -DskipUpload=true help:effective-pom + - name: Stage snapshot (reactor - parent + llama + llama-langchain4j + llama-kotlin + llama-ffm + llama-platform) + run: mvn --batch-mode --no-transfer-progress -P release,natives -Dmaven.test.skip=true -DskipUpload=true deploy env: - MAVEN_USERNAME: ${{ secrets.CENTRAL_USERNAME }} - MAVEN_PASSWORD: ${{ secrets.CENTRAL_TOKEN }} MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - # The agent's thin jar + pom (not a reactor module, so a deploy of its own). It resolves the - # core and the natives jars llama-platform names from the local repository, where the reactor - # deploy above has just installed them; check-natives.py holds its version to the reactor's. - # -Dmaven.repository.credentialScope=id: see the first deploy step of this file (Maven 3.10). - - name: Publish snapshot (llama-atmosphere-agent) - run: mvn --batch-mode --no-transfer-progress -Dmaven.repository.credentialScope=id -f llama-atmosphere-agent/pom.xml -P release -Dmaven.test.skip=true deploy + - name: Stage snapshot (llama-atmosphere-agent) + run: mvn --batch-mode --no-transfer-progress -f llama-atmosphere-agent/pom.xml -P release -Dmaven.test.skip=true -DskipUpload=true deploy env: - MAVEN_USERNAME: ${{ secrets.CENTRAL_USERNAME }} - MAVEN_PASSWORD: ${{ secrets.CENTRAL_TOKEN }} MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - # Android AARs (llama-android, llama-android-opencl): assembled and published by - # the plain-Gradle build in llama-android/ — Maven cannot deploy - # aar. Natives are already on disk from the artifact - # downloads above; the core jar was just built by the reactor deploy. - uses: gradle/actions/setup-gradle@3f5f9adaf7d9fecd50b5935e54106014257a94e6 # v6 with: gradle-version: ${{ env.GRADLE_VERSION }} - - name: Publish Android AAR snapshots (llama-android + llama-android-opencl) + - name: Stage signed Android AARs locally run: | # every .so of the natives tree: the library, ggml, the CPU modules; the one OpenCL module mkdir -p llama-android/natives/cpu/arm64-v8a llama-android/natives/cpu/x86_64 llama-android/natives/opencl/arm64-v8a cp llama/src/main/natives/net/ladenthin/llama/Linux-Android/aarch64/cpu/*.so llama-android/natives/cpu/arm64-v8a/ cp llama/src/main/natives/net/ladenthin/llama/Linux-Android/x86_64/cpu/*.so llama-android/natives/cpu/x86_64/ cp llama/src/main/natives/net/ladenthin/llama/Linux-Android/aarch64/opencl/*.so llama-android/natives/opencl/arm64-v8a/ - gradle -p llama-android publishAllPublicationsToCentralSnapshotsRepository + gradle -p llama-android publishAllPublicationsToStagingRepository env: - CENTRAL_USERNAME: ${{ secrets.CENTRAL_USERNAME }} - CENTRAL_PASSWORD: ${{ secrets.CENTRAL_TOKEN }} MAVEN_GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} MAVEN_GPG_KEY_ID: ${{ secrets.GPG_KEY_ID }} - # Runs even when the deploy step failed: a Central publish-poll timeout reds the - # job *after* the bundle was uploaded (and typically published server-side), while - # the signed jars and poms + .asc files already exist in target/ (signing happens at - # verify). Collecting on failure lets the github-snapshot job still attach them. - - name: Collect signed artifacts - if: ${{ !cancelled() }} - run: | - mkdir -p signed-snapshot-assets - # The signed llama.cpp source archive (see "Sign the llama.cpp source archive" above). - cp llama-source-archive/*.tar.gz llama-source-archive/*.tar.gz.asc signed-snapshot-assets/ - # Every Maven artifact Central gets, with its .asc: the jars of every jar module and the - # pom of every module -- maven-gpg writes target/-.pom next to its - # .pom.asc, also for the pom-only modules (`.` is llama-parent, llama-platform is the one - # consumers are told to depend on and used to be absent from the release entirely). - for m in . llama llama-langchain4j llama-kotlin llama-platform llama-atmosphere-agent; do - cp "$m"/target/*.jar signed-snapshot-assets/ 2>/dev/null || true - cp "$m"/target/*.jar.asc signed-snapshot-assets/ 2>/dev/null || true - cp "$m"/target/*.pom signed-snapshot-assets/ 2>/dev/null || true - cp "$m"/target/*.pom.asc signed-snapshot-assets/ 2>/dev/null || true - done - # The two AARs, as Central names them: Gradle signs the AAR next to itself - # (build/aar/*.aar.asc -- the signature was always there, it was never copied), each - # publication's pom as build/publications//pom-default.xml(.asc), and the - # sources/javadoc jars the two publications share under build/distributions/. - for aar in llama-android/build/aar/*.aar; do - [ -e "$aar" ] || continue - base="$(basename "$aar" .aar)" - case "$base" in - llama-android-opencl-*) pub=llamaAndroidOpencl; v="${base#llama-android-opencl-}" ;; - *) pub=llamaAndroid; v="${base#llama-android-}" ;; - esac - cp "$aar" signed-snapshot-assets/ 2>/dev/null || true - cp "$aar.asc" signed-snapshot-assets/ 2>/dev/null || true - cp "llama-android/build/publications/$pub/pom-default.xml" "signed-snapshot-assets/$base.pom" 2>/dev/null || true - cp "llama-android/build/publications/$pub/pom-default.xml.asc" "signed-snapshot-assets/$base.pom.asc" 2>/dev/null || true - for c in sources javadoc; do - cp "llama-android/build/distributions/llama-android-$v-$c.jar" "signed-snapshot-assets/$base-$c.jar" 2>/dev/null || true - cp "llama-android/build/distributions/llama-android-$v-$c.jar.asc" "signed-snapshot-assets/$base-$c.jar.asc" 2>/dev/null || true - done - done - # The same provenance statement over the files Central and the GitHub release get (jars, - # poms, AARs, each next to its .asc). A consumer with the Central file in hand verifies it - # with `gh attestation verify --owner bernardladenthin `. - - name: Attest build provenance of the published artifacts - if: ${{ !cancelled() }} - uses: actions/attest-build-provenance@4d101475d8b20a2381f78447822ac1eab6504dd8 # v4 - with: - subject-path: | - signed-snapshot-assets/*.jar - signed-snapshot-assets/*.pom - signed-snapshot-assets/*.aar - signed-snapshot-assets/*.tar.gz - - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7 - if: ${{ !cancelled() }} + - name: Finalize and secure the signed publication + id: finalize + uses: ./.github/actions/finalize-publication with: - name: signed-snapshot-assets - path: signed-snapshot-assets/ + channel: snapshot github-snapshot: name: Update Snapshot Pre-release on GitHub - needs: [publish-snapshot] - # Also runs when publish-snapshot FAILED (not when skipped/cancelled): a Central - # publish-poll timeout reds that job after the artifacts were already uploaded — - # the GitHub pre-release assets must not be lost in that case. - if: ${{ !cancelled() && (needs.publish-snapshot.result == 'success' || needs.publish-snapshot.result == 'failure') }} + needs: + - publish-snapshot + if: ${{ !cancelled() && needs.publish-snapshot.outputs.assets_complete == 'true' }} runs-on: ubuntu-latest - # Nothing is signed here: the assets are the Maven artifacts with the detached .asc that - # maven-gpg wrote at deploy (classes jar, natives jars, poms, sources, javadoc, the AARs). No - # fat jar: the project ships nothing a consumer could not get from Maven Central (CLAUDE.md, - # "Modular natives"). + concurrency: + group: snapshot-release-${{ github.repository }} + cancel-in-progress: false permissions: contents: write steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + persist-credentials: false - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8 with: name: signed-snapshot-assets - path: snapshot-assets/ - - name: Report unsigned assets (does not block the upload) - # Deliberately NON-blocking, and deliberately BEFORE the upload. Both attach jobs run even - # when their publish job failed, because a Central publish-poll timeout must not cost the - # GitHub assets: if Central is unreachable these are the ONLY way to get the artifacts at - # all. Refusing to attach on a signing failure would defeat exactly that. So annotate here, - # upload regardless, and fail the job afterwards. Assets always land; an unsigned release is - # still loudly red rather than quietly wrong. - # See workspace/policies/fat-jar-release-assets.md, "Attach first, then go red". - id: signatures - run: | - set -uo pipefail - dir="snapshot-assets" - # Every attachable artifact type, not only jars: with '*.jar' alone the AARs were attached - # unsigned for months and nothing counted them, so the job reported success. - # '*.tar.gz' is the llama.cpp source archive (archive-llama-source), signed by the publish job. - artifacts=$(find "$dir" -maxdepth 1 \( -name '*.jar' -o -name '*.aar' -o -name '*.pom' -o -name '*.tar.gz' \) | sort) - if [ -z "$artifacts" ]; then - echo "::error::no artifacts in $dir -- the collection step produced nothing" - echo "missing=-1" >> "$GITHUB_OUTPUT" - exit 0 - fi - missing=0 - for artifact in $artifacts; do - if [ ! -e "$artifact.asc" ]; then - echo "::error::unsigned: $(basename "$artifact") has no detached .asc" - missing=$((missing + 1)) - fi - done - echo "missing=$missing" >> "$GITHUB_OUTPUT" - [ "$missing" -eq 0 ] && echo "all $(echo "$artifacts" | wc -l) artifact(s) signed" - exit 0 - - name: Update snapshot pre-release + path: publication-package/ + digest-mismatch: error + - name: Verify transport integrity and export checked GitHub files + run: python3 .github/publication.py verify publication-package --export-github snapshot-assets + - name: Update snapshot assets, source tag and notes env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh release view snapshot --repo ${{ github.repository }} 2>/dev/null \ - || gh release create snapshot \ - --repo ${{ github.repository }} \ - --prerelease \ - --title "Snapshot (latest)" \ - --notes "Latest snapshot build from the main branch." - gh release upload snapshot snapshot-assets/* \ - --repo ${{ github.repository }} \ - --clobber - - name: Remove the assets this run did not upload - # `snapshot` is a rolling "latest" pre-release, and `gh release upload --clobber` replaces - # same-named assets but never removes any other, so every asset of every past version stayed - # forever: 208 on java-llama.cpp (109 of them from 5.0.x, 43 in shapes that no longer exist), - # and SpotBugs plugin jars an old collect step attached in 2026-05 on three repositories. A - # non-current asset on this release is noise by definition. The keep-set is what this run - # uploaded -- the files in the asset directory -- never a version pattern, which would have to - # be re-taught at every classifier added or dropped (how the stale shapes arose). AFTER the - # upload on purpose: a failed upload must not leave the release emptier than it was. And only - # here: a versioned v* release is history, github-release never deletes anything. Every - # deletion is printed by name, so the job log is the audit trail. - # - # Asset by asset, never the release. The first form of this job (2026-05-07) deleted the whole - # `snapshot` release with its tag and recreated it; on 2026-05-10 the runs of several main - # pushes minutes apart deleted it under each other, and every job of each burst but the last - # failed in that step with its artifacts present. The job then went with the Central - # migration and came back as `view || create` + `upload --clobber` without any cleanup, which - # is how the backlog grew (workspace/policies/fat-jar-release-assets.md has the runs). Hence - # three guards: an empty upload is refused (every asset would count as stale; the download - # and upload steps above fail first, the guard keeps it so), an asset that is already gone - # counts as removed (two overlapping dispatches may both pick it), and a failed deletion is - # reported and the rest still tried -- the assets of this upload are on the release either - # way, so this is "attach first, then red" like the signature check. - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - set -euo pipefail - keep="$(ls -1 snapshot-assets | sort)" - if [ -z "$keep" ]; then - echo "::error::refusing to prune: this run uploaded nothing, so every asset of the release would count as stale" - exit 1 - fi - list_assets() { - gh release view snapshot --repo ${{ github.repository }} --json assets --jq '.assets[].name' | sort - } - current="$(list_assets)" - stale="$(comm -13 <(printf '%s\n' "$keep") <(printf '%s\n' "$current"))" - if [ -z "$stale" ]; then - echo "nothing to remove: the release holds exactly the $(printf '%s\n' "$keep" | wc -l) asset(s) of this upload" - exit 0 - fi - echo "removing $(printf '%s\n' "$stale" | wc -l) asset(s) that are not part of this upload:" - failed=0 - while IFS= read -r name; do - [ -n "$name" ] || continue - echo " deleting $name" - if gh release delete-asset snapshot "$name" --repo ${{ github.repository }} --yes; then - continue - fi - if ! remaining="$(list_assets)"; then - echo "::error::could not delete $name, and could not re-read the release to tell whether it is gone" - failed=$((failed + 1)) - elif printf '%s\n' "$remaining" | grep -qxF -- "$name"; then - echo "::error::could not delete $name" - failed=$((failed + 1)) - else - echo " $name was already gone" - fi - done <<< "$stale" - if [ "$failed" -ne 0 ]; then - echo "::error::$failed asset(s) could not be removed; the $(printf '%s\n' "$keep" | wc -l) asset(s) of this upload are on the release" - exit 1 - fi - echo "kept the $(printf '%s\n' "$keep" | wc -l) asset(s) of this upload" - - name: Fail if anything was attached unsigned - # After the upload on purpose: the assets must exist even when the signature does not. - if: ${{ always() && steps.signatures.outputs.missing != '0' }} - run: | - echo "::error::${{ steps.signatures.outputs.missing }} asset(s) attached without a signature (-1 means none were collected at all)" - exit 1 + ASSETS_COMPLETE: ${{ needs.publish-snapshot.outputs.assets_complete }} + run: python3 .github/update-snapshot.py snapshot-assets publish-release: - name: Publish Release to Central + name: Prepare and verify signed release artifacts if: needs.check-tag.result == 'success' && inputs.publish_to_central - needs: [check-tag, crosscompile-linux-x86_64-cuda, test-source-archive, crosscompile-android-aarch64-opencl, package-android-aar, test-android-emulator, code-style, test-java-llama-langchain4j, test-java-llama-kotlin, test-java-llama-ffm, test-java-llama-atmosphere-agent, test-java-llama-atmosphere-agent-integration, smoke-natives, smoke-natives-macos, smoke-agent-linux, vmlens, shared-files] + needs: + - check-tag + - crosscompile-linux-x86_64-cuda + - test-source-archive + - crosscompile-android-aarch64-opencl + - package-android-aar + - test-android-emulator + - code-style + - test-java-llama-langchain4j + - test-java-llama-kotlin + - test-java-llama-ffm + - test-java-llama-atmosphere-agent + - test-java-llama-atmosphere-agent-integration + - smoke-natives + - smoke-natives-macos + - smoke-agent-linux + - vmlens + - shared-files runs-on: ubuntu-latest + outputs: + assets_complete: ${{ steps.finalize.outputs.complete }} environment: maven-central permissions: - contents: write - id-token: write - attestations: write + contents: read steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - # Every shipped native build uploads `natives-`. Downloaded UNMERGED (one - # subdirectory per artifact) on purpose: merge-native-artifacts.sh checks that each artifact - # holds exactly the /// directory its name promises and that no path is - # claimed twice, then merges. `merge-multiple: true` would silently overwrite -- and can - # byte-level interleave -- two artifacts with the same path, which is how a corrupt macOS - # dylib shipped; the test-only macOS builds (macos-26-metal, macos-15-no-metal) are named - # outside the glob for that reason. - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8 with: - pattern: "natives-*" + pattern: natives-* path: ${{ github.workspace }}/native-artifacts/ - name: Merge native libraries into the natives tree (checked per artifact) run: | bash .github/merge-native-artifacts.sh \ "${{ github.workspace }}/native-artifacts" \ "${{ github.workspace }}/llama/src/main/natives/net/ladenthin/llama/" - # The same check package ran, over the tree this job deploys: the dependency allowlists and, - # with the `sign_windows` switch, every Windows DLL signed. - name: Verify native runtime dependencies and the Windows signatures run: | python3 .github/verify-native-deps.py ${{ env.SIGN_WINDOWS == 'true' && '--require-signed' || '' }} llama/src/main/natives - name: Warn when the release ships unsigned Windows DLLs if: env.SIGN_WINDOWS != 'true' run: echo "::warning::This release is deployed without the sign_windows switch -- its Windows DLLs carry no Authenticode signature (jllama-build.txt says signed=no)." - # A second JDK next to the one of .java-version: llama-ffm (the C API through the Java 22+ FFM - # API) has a Java floor of its own and builds through maven-toolchains-plugin; setup-java writes - # a toolchains.xml entry for every JDK it installs, and the step that follows keeps JAVA_HOME on - # the workflow's JDK. Version: the current LTS above the floor (not .java-version, which is a - # shared file of the four repositories). - - uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 - with: - distribution: 'temurin' - java-version: '25' - name: Set up Maven Central Repository uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 with: java-version-file: .java-version - distribution: 'temurin' + distribution: temurin server-id: central server-username: MAVEN_USERNAME server-password: MAVEN_PASSWORD gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} gpg-passphrase: MAVEN_GPG_PASSPHRASE - # The patched llama.cpp source this build was compiled from (archive-llama-source, proven - # buildable by test-source-archive), signed with the release key setup-java just imported -- - # the same key and passphrase name as every Maven file -- and collected below next to them. - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8 with: name: llama-cpp-source @@ -3956,43 +3793,20 @@ jobs: printf '%s' "$MAVEN_GPG_PASSPHRASE" | gpg --batch --yes --pinentry-mode loopback --passphrase-fd 0 --detach-sign --armor "$f" gpg --batch --verify "$f.asc" "$f" done - # One reactor deploy publishes all six Maven artifacts at the same version: - # net.ladenthin:llama-parent (the pom), :llama (the classes jar + natives jars), - # :llama-langchain4j, :llama-kotlin, :llama-ffm and :llama-platform (a pom). The `release` profile (GPG + Central Publishing) is inherited - # from the parent, so every module — including the parent pom — is signed. - # Informational only (nothing depends on it): logs the effective POM with the same - # profile set as the deploy below, so the resolved central-publishing configuration - # (waitUntil/waitMaxTime etc.) is visible for debugging. - name: Show effective POM (debug) - run: mvn --batch-mode --no-transfer-progress -P release,natives help:effective-pom - # -Dmaven.repository.credentialScope=id: see the first deploy step of this file (Maven 3.10). - - name: Publish release (reactor - parent + llama + llama-langchain4j + llama-kotlin + llama-platform) - run: mvn --batch-mode --no-transfer-progress -Dmaven.repository.credentialScope=id -P release,natives -Dmaven.test.skip=true deploy + run: mvn --batch-mode --no-transfer-progress -P release,natives -DskipUpload=true help:effective-pom + - name: Stage release (reactor - parent + llama + llama-langchain4j + llama-kotlin + llama-ffm + llama-platform) + run: mvn --batch-mode --no-transfer-progress -P release,natives -Dmaven.test.skip=true -DskipUpload=true deploy env: - MAVEN_USERNAME: ${{ secrets.CENTRAL_USERNAME }} - MAVEN_PASSWORD: ${{ secrets.CENTRAL_TOKEN }} MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - # The agent's thin jar + pom (not a reactor module, so a deploy of its own). It resolves the - # core and the natives jars llama-platform names from the local repository, where the reactor - # deploy above has just installed them; check-natives.py holds its version to the reactor's. - # -Dmaven.repository.credentialScope=id: see the first deploy step of this file (Maven 3.10). - - name: Publish release (llama-atmosphere-agent) - run: mvn --batch-mode --no-transfer-progress -Dmaven.repository.credentialScope=id -f llama-atmosphere-agent/pom.xml -P release -Dmaven.test.skip=true deploy + - name: Stage release (llama-atmosphere-agent) + run: mvn --batch-mode --no-transfer-progress -f llama-atmosphere-agent/pom.xml -P release -Dmaven.test.skip=true -DskipUpload=true deploy env: - MAVEN_USERNAME: ${{ secrets.CENTRAL_USERNAME }} - MAVEN_PASSWORD: ${{ secrets.CENTRAL_TOKEN }} MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - # Android AARs (llama-android, llama-android-opencl): Maven cannot deploy - # aar, so the plain-Gradle build signs + publishes them - # into a local Maven-layout staging repo, which is zipped into a Central - # Portal bundle and uploaded via the Publisher API (publishingType=AUTOMATIC: - # the deployment publishes as soon as portal validation passes). Natives are - # already on disk from the artifact downloads above; the core jar was just - # built by the reactor deploy. - uses: gradle/actions/setup-gradle@3f5f9adaf7d9fecd50b5935e54106014257a94e6 # v6 with: gradle-version: ${{ env.GRADLE_VERSION }} - - name: Publish Android AAR release bundle to Central Portal + - name: Stage signed Android AARs locally shell: bash run: | set -euo pipefail @@ -4002,138 +3816,39 @@ jobs: cp llama/src/main/natives/net/ladenthin/llama/Linux-Android/x86_64/cpu/*.so llama-android/natives/cpu/x86_64/ cp llama/src/main/natives/net/ladenthin/llama/Linux-Android/aarch64/opencl/*.so llama-android/natives/opencl/arm64-v8a/ gradle -p llama-android publishAllPublicationsToStagingRepository - VERSION=$(mvn -q -DforceStdout help:evaluate -Dexpression=project.version | tail -n1) - ( cd llama-android/build/staging-repo && zip -r -q ../central-bundle.zip net -x "*maven-metadata*" ) - TOKEN=$(printf "%s:%s" "$CENTRAL_USERNAME" "$CENTRAL_PASSWORD" | base64 -w0) - curl --fail-with-body -X POST \ - -H "Authorization: Bearer $TOKEN" \ - -F "bundle=@llama-android/build/central-bundle.zip" \ - "https://central.sonatype.com/api/v1/publisher/upload?publishingType=AUTOMATIC&name=llama-android-$VERSION" env: - CENTRAL_USERNAME: ${{ secrets.CENTRAL_USERNAME }} - CENTRAL_PASSWORD: ${{ secrets.CENTRAL_TOKEN }} MAVEN_GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} MAVEN_GPG_KEY_ID: ${{ secrets.GPG_KEY_ID }} - # Runs even when the deploy step failed: a Central publish-poll timeout reds the - # job *after* the bundle was uploaded (and typically published server-side), while - # the signed jars and poms + .asc files already exist in target/ (signing happens at - # verify). Collecting on failure lets the github-release-signed job still attach them. - - name: Collect signed artifacts - if: ${{ !cancelled() }} - run: | - mkdir -p signed-release-assets - # The signed llama.cpp source archive (see "Sign the llama.cpp source archive" above). - cp llama-source-archive/*.tar.gz llama-source-archive/*.tar.gz.asc signed-release-assets/ - # Every Maven artifact Central gets, with its .asc: the jars of every jar module and the - # pom of every module -- maven-gpg writes target/-.pom next to its - # .pom.asc, also for the pom-only modules (`.` is llama-parent, llama-platform is the one - # consumers are told to depend on and used to be absent from the release entirely). - for m in . llama llama-langchain4j llama-kotlin llama-platform llama-atmosphere-agent; do - cp "$m"/target/*.jar signed-release-assets/ 2>/dev/null || true - cp "$m"/target/*.jar.asc signed-release-assets/ 2>/dev/null || true - cp "$m"/target/*.pom signed-release-assets/ 2>/dev/null || true - cp "$m"/target/*.pom.asc signed-release-assets/ 2>/dev/null || true - done - # The two AARs, as Central names them: Gradle signs the AAR next to itself - # (build/aar/*.aar.asc -- the signature was always there, it was never copied), each - # publication's pom as build/publications//pom-default.xml(.asc), and the - # sources/javadoc jars the two publications share under build/distributions/. - for aar in llama-android/build/aar/*.aar; do - [ -e "$aar" ] || continue - base="$(basename "$aar" .aar)" - case "$base" in - llama-android-opencl-*) pub=llamaAndroidOpencl; v="${base#llama-android-opencl-}" ;; - *) pub=llamaAndroid; v="${base#llama-android-}" ;; - esac - cp "$aar" signed-release-assets/ 2>/dev/null || true - cp "$aar.asc" signed-release-assets/ 2>/dev/null || true - cp "llama-android/build/publications/$pub/pom-default.xml" "signed-release-assets/$base.pom" 2>/dev/null || true - cp "llama-android/build/publications/$pub/pom-default.xml.asc" "signed-release-assets/$base.pom.asc" 2>/dev/null || true - for c in sources javadoc; do - cp "llama-android/build/distributions/llama-android-$v-$c.jar" "signed-release-assets/$base-$c.jar" 2>/dev/null || true - cp "llama-android/build/distributions/llama-android-$v-$c.jar.asc" "signed-release-assets/$base-$c.jar.asc" 2>/dev/null || true - done - done - # The same provenance statement over the files Central and the GitHub release get (jars, - # poms, AARs, each next to its .asc). A consumer with the Central file in hand verifies it - # with `gh attestation verify --owner bernardladenthin `. - - name: Attest build provenance of the published artifacts - if: ${{ !cancelled() }} - uses: actions/attest-build-provenance@4d101475d8b20a2381f78447822ac1eab6504dd8 # v4 + - name: Finalize and secure the signed publication + id: finalize + uses: ./.github/actions/finalize-publication with: - subject-path: | - signed-release-assets/*.jar - signed-release-assets/*.pom - signed-release-assets/*.aar - signed-release-assets/*.tar.gz - - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7 - if: ${{ !cancelled() }} - with: - name: signed-release-assets - path: signed-release-assets/ + channel: release - github-release-signed: - name: Attach Signed Binaries to GitHub Release - needs: [publish-release] - # Also runs when publish-release FAILED (not when skipped/cancelled): a Central - # publish-poll timeout reds that job after the artifacts were already uploaded — - # the GitHub release assets must not be lost in that case. - if: ${{ !cancelled() && (needs.publish-release.result == 'success' || needs.publish-release.result == 'failure') }} + github-release: + name: Attach Binaries to GitHub Release + needs: + - publish-release + if: ${{ !cancelled() && needs.publish-release.outputs.assets_complete == 'true' }} runs-on: ubuntu-latest - # Nothing is signed here: the assets are the Maven artifacts with the detached .asc that - # maven-gpg wrote at deploy (classes jar, natives jars, poms, sources, javadoc, the AARs). No - # fat jar: the project ships nothing a consumer could not get from Maven Central (CLAUDE.md, - # "Modular natives"). permissions: contents: write steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + persist-credentials: false - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8 with: name: signed-release-assets - path: release-assets/ - - name: Report unsigned assets (does not block the upload) - # Deliberately NON-blocking, and deliberately BEFORE the upload. Both attach jobs run even - # when their publish job failed, because a Central publish-poll timeout must not cost the - # GitHub assets: if Central is unreachable these are the ONLY way to get the artifacts at - # all. Refusing to attach on a signing failure would defeat exactly that. So annotate here, - # upload regardless, and fail the job afterwards. Assets always land; an unsigned release is - # still loudly red rather than quietly wrong. - # See workspace/policies/fat-jar-release-assets.md, "Attach first, then go red". - id: signatures - run: | - set -uo pipefail - dir="release-assets" - # Every attachable artifact type, not only jars: with '*.jar' alone the AARs were attached - # unsigned for months and nothing counted them, so the job reported success. - # '*.tar.gz' is the llama.cpp source archive (archive-llama-source), signed by the publish job. - artifacts=$(find "$dir" -maxdepth 1 \( -name '*.jar' -o -name '*.aar' -o -name '*.pom' -o -name '*.tar.gz' \) | sort) - if [ -z "$artifacts" ]; then - echo "::error::no artifacts in $dir -- the collection step produced nothing" - echo "missing=-1" >> "$GITHUB_OUTPUT" - exit 0 - fi - missing=0 - for artifact in $artifacts; do - if [ ! -e "$artifact.asc" ]; then - echo "::error::unsigned: $(basename "$artifact") has no detached .asc" - missing=$((missing + 1)) - fi - done - echo "missing=$missing" >> "$GITHUB_OUTPUT" - [ "$missing" -eq 0 ] && echo "all $(echo "$artifacts" | wc -l) artifact(s) signed" - exit 0 + path: publication-package/ + digest-mismatch: error + - name: Verify transport integrity and export checked GitHub files + run: python3 .github/publication.py verify publication-package --export-github release-assets - name: Upload release assets uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3 with: files: release-assets/* - - name: Fail if anything was attached unsigned - # After the upload on purpose: the assets must exist even when the signature does not. - if: ${{ always() && steps.signatures.outputs.missing != '0' }} - run: | - echo "::error::${{ steps.signatures.outputs.missing }} asset(s) attached without a signature (-1 means none were collected at all)" - exit 1 mirror-llama-source: name: Mirror the pinned llama.cpp commit to bernardladenthin/llama.cpp @@ -4152,6 +3867,8 @@ jobs: contents: read steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + persist-credentials: false - name: Resolve pinned llama.cpp tag from CMakeLists.txt id: tag shell: bash @@ -4170,6 +3887,7 @@ jobs: - name: Checkout llama.cpp at the pinned commit (full history, the push needs it) uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: + persist-credentials: false repository: ggml-org/llama.cpp ref: ${{ steps.tag.outputs.ref }} path: llama-src @@ -4179,3 +3897,124 @@ jobs: env: LLAMA_MIRROR_TOKEN: ${{ secrets.LLAMA_MIRROR_TOKEN }} run: bash .github/mirror-llama-source.sh llama-src bernardladenthin/llama.cpp + + central-snapshot: + name: Upload checked snapshot artifacts to Maven Central + needs: + - publish-snapshot + if: ${{ !cancelled() && needs.publish-snapshot.outputs.assets_complete == 'true' }} + runs-on: ubuntu-latest + environment: maven-central + # One transfer at a time; an older commit finishing late is skipped (publication.py superseded). + concurrency: + group: central-snapshot-${{ github.repository }} + cancel-in-progress: false + permissions: + contents: read + actions: read + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + persist-credentials: false + - uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 + with: + java-version-file: .java-version + distribution: temurin + server-id: central + server-username: MAVEN_USERNAME + server-password: MAVEN_PASSWORD + - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8 + with: + name: signed-snapshot-assets + path: publication-package/ + digest-mismatch: error + - name: Transfer frozen artifacts (no rebuild, signing or validation polling) + run: python3 .github/publication.py upload publication-package --skip-superseded + env: + GH_TOKEN: ${{ github.token }} + MAVEN_USERNAME: ${{ secrets.CENTRAL_USERNAME }} + MAVEN_PASSWORD: ${{ secrets.CENTRAL_TOKEN }} + + central-release: + name: Upload checked release artifacts to Maven Central + needs: + - publish-release + if: ${{ !cancelled() && needs.publish-release.outputs.assets_complete == 'true' }} + runs-on: ubuntu-latest + environment: maven-central + permissions: + contents: read + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + persist-credentials: false + - uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 + with: + java-version-file: .java-version + distribution: temurin + server-id: central + server-username: MAVEN_USERNAME + server-password: MAVEN_PASSWORD + - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8 + with: + name: signed-release-assets + path: publication-package/ + digest-mismatch: error + - name: Transfer frozen artifacts (no rebuild, signing or validation polling) + run: python3 .github/publication.py upload publication-package + env: + MAVEN_USERNAME: ${{ secrets.CENTRAL_USERNAME }} + MAVEN_PASSWORD: ${{ secrets.CENTRAL_TOKEN }} + + attest-snapshot: + name: Attest the checked snapshot publication + needs: + - publish-snapshot + if: ${{ !cancelled() && needs.publish-snapshot.outputs.assets_complete == 'true' }} + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + attestations: write + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + persist-credentials: false + - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8 + with: + name: signed-snapshot-assets + path: publication-package/ + digest-mismatch: error + - name: Verify the secured package before attesting + run: python3 .github/publication.py verify publication-package + - name: Attest the frozen artifacts and detached signatures + uses: actions/attest-build-provenance@4d101475d8b20a2381f78447822ac1eab6504dd8 # v4 + with: + subject-path: publication-package/github/* + + + attest-release: + name: Attest the checked release publication + needs: + - publish-release + if: ${{ !cancelled() && needs.publish-release.outputs.assets_complete == 'true' }} + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + attestations: write + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + persist-credentials: false + - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8 + with: + name: signed-release-assets + path: publication-package/ + digest-mismatch: error + - name: Verify the secured package before attesting + run: python3 .github/publication.py verify publication-package + - name: Attest the frozen artifacts and detached signatures + uses: actions/attest-build-provenance@4d101475d8b20a2381f78447822ac1eab6504dd8 # v4 + with: + subject-path: publication-package/github/* diff --git a/.github/workflows/sonarqube.yml b/.github/workflows/sonarqube.yml index 1aff21792..a9346ebd0 100644 --- a/.github/workflows/sonarqube.yml +++ b/.github/workflows/sonarqube.yml @@ -17,7 +17,7 @@ jobs: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: Set up JDK 21 + - name: Set up build JDK from .java-version uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 with: java-version-file: .java-version diff --git a/.java-version b/.java-version index aabe6ec39..7273c0fa8 100644 --- a/.java-version +++ b/.java-version @@ -1 +1 @@ -21 +25 diff --git a/CHANGELOG.md b/CHANGELOG.md index 461a6b2e1..c23e23364 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -136,7 +136,7 @@ the first two items break every existing consumer at upgrade. fails the stream through `onError`. ### Added -- **llama.cpp b11827** (from b11639, in ten steps: b11760, b11761, b11799, b11800, b11803, b11809, b11814, b11815, b11820, b11827). What the +- **llama.cpp b11881** (from b11639, in eleven steps: b11760, b11761, b11799, b11800, b11803, b11809, b11814, b11815, b11820, b11827, b11881). What the range brings to a consumer: `POST /tts` (llama.cpp b11781, #26603, speech from a TTS-capable model through the embedded server) and the realtime transcription WebSocket `/v1/realtime` (b11780, #30636), both served by `NativeServer` -- classic and attach mode -- and not by the Java transport or `LlamaModel` yet; a @@ -167,7 +167,18 @@ the first two items break every existing consumer at upgrade. mat-vec kernels on the Intel XMX engines for short batches (#29864, `GGML_SYCL_ENABLE_XMX_ESIMD`), an OpenCL depthwise `CONV_2D_DW` (#30900), the MiniCPM-OCR 1.0 projector (#30979), a DFlash drafter fix for qwen4exp (#30927) and fewer graph inputs for glm5-next (#30932) -- nothing here changed. - Two patches dropped (`0016`, `0019`), `0007` refreshed. + The b11881 step (2026-10-25, 54 commits; upstream had not tagged the number yet, so the pin names the + commit `fa3645feb`): llama.cpp's server entry point is one function per role now (#31113), which + `NativeServer` does not show -- `0006` and `0007` were rewritten onto it, and attach mode registers + upstream's own route table instead of a copy; JSON nested more than 128 levels deep (tools, tool-call + arguments, `chat_template_kwargs`, `json_schema`, the `/v1/systemone` body) is refused as an invalid + request instead of overflowing the stack of the thread that walks it (#30242); `-hf` downloads of one file + from several processes are serialized by a lock shared with the hf CLI (#29312); DeepSeek V4.1 Flash + (#31086), Soprano TTS in mtmd (#28607, not tried with `TextToSpeech` here), a `MUL_MAT_ID` index of -1 + that skips the slot (#26631), `-sm tensor` refused for architectures with MoE amax rescaling (#31081), + jinja's `select`/`selectattr` arguments (#31059), Nemotron-3.5-Embed tokenization (#30974) and an + overflow in `ggml_time_us` (#30969). + Two patches dropped (`0016`, `0019`), `0006` rewritten, `0007` refreshed and rewritten. - **`RouterModel.Status.INCOMPLETE`** (llama.cpp b11714): a router download that never finished is listed as `"incomplete"` without a worker; it was `UNKNOWN` here. - **`/v1/messages` passes `id_slot` through and merges `extra_params`** like upstream (llama.cpp b11756 and @@ -696,6 +707,36 @@ the first two items break every existing consumer at upgrade. backend filter had changed loaded a second copy of the library, or extracted a second module set, and replaced the build info while the JVM kept using the first library. A further call now loads nothing and names a property changed since the load once on stderr; a failed attempt is retried. +- **CI: sccache 0.19.0, and the Linux CUDA job caches nvcc again.** `SCCACHE_DL_VERSION` and the Windows + install action move to 0.19.0 (SHA-256 pins as mozilla publishes them, checked against the downloads), + which reports a failing compiler's exit code instead of "Compiler killed by signal " -- a fix this + project contributed (mozilla/sccache#2932). nvcc goes through sccache by default again + (`SCCACHE_WRAP_NVCC=false` opts out): the CUDA 13.4 failures that made it opt-in on 2026-10-09 came from + ggml's default arch list (`90-virtual`, mozilla/sccache#2862), which this project stopped building on + 2026-10-11; measured with that list, sccache caches the device passes (108/108 hits warm). `build.sh`'s + uncached-retry pattern matches `fatbinary fatal` and `Missing "cubin"` instead of relying on the old + signal line, and the CUDA job forwards `SCCACHE_WRAP_NVCC` into its container, so the opt-out works. +- **The natives jars and the Android AARs carry the license texts of the code compiled into them.** + `llama/legal/natives/` (index `NOTICE.md`): java-llama.cpp's own license, llama.cpp/ggml and every + library it vendors or derives code from, BoringSSL, the GPU vendors' header libraries (CCCL, HIP, + oneDNN, Vulkan/SPIR-V, OpenCL, OpenVINO) and the npm packages of the embedded WebUI, each taken + from its upstream byte for byte. Every natives jar has them under `META-INF/third-party/natives/`, + the AARs inside `classes.jar`; before, none of the 23 natives jars carried any license text. + `build-webui` checks the WebUI list against the pinned `package-lock.json`. The agent folder + carries its own `LICENSE` and `THIRD_PARTY.md` (it is copied out and run on its own). +- **CI: the Windows C++ test jobs run their tests.** `ctest` ran without `-C Release` against the + multi-config build trees of `test-cpp-windows-x86_64`, `test-cpp-windows-arm64` and the MSVC + build-and-test job, found no test and exited 0, so none of the C++ suite ever ran on Windows. Every + `ctest` step also passes `--no-tests=error` now. +- **CI: a publication is checked against its tag and staged exactly before anything is uploaded.** + `check-tag` refuses a release whose version is not the tag's (`v`, no `-SNAPSHOT`), + `check-snapshot` a snapshot dispatch of a release version, and the gate repeats both. Unknown files + in a Central staging directory fail the gate instead of being left out, signatures pair by name, + and the Android AARs' snapshot names, which Gradle writes timestamped even into a local repository, + are mapped back to `-SNAPSHOT` (without that the first snapshot after the merge would have failed + the gate). Central snapshot transfers are serialized and skip a commit another run already + superseded. The `windows-aarch64` smoke row runs on Microsoft's build of JDK 25, since Temurin + publishes none for Windows on arm64. - **CI: both ROCm jobs and the Windows plain-clang CPU job compile through sccache again.** On Windows, CMake's runtime-library flags for plain clang carry `-Xclang -flto-visibility-public-std`, which sccache refuses, so every TU of `build-windows-x86_64` and of the ROCm module (TheRock's clang, ~150 @@ -953,6 +994,22 @@ the first two items break every existing consumer at upgrade. changed meaning accordingly (see Added). ### Fixed + +- **Embedded RPC peer setup respects loopback binding and can be stopped.** A protocol-v8 + `COMM_INIT` request no longer opens a wildcard listener behind `RpcServer.startLocal`. + Stop interrupts a missing peer or an incomplete capability handshake in either rank and frees + the sockets for restart. Listener/connection waits observe cancellation; stop no longer opens + repeated wake-up connections that can themselves block behind a full accept backlog. + Six model-free C-API regression scenarios cover binding, shutdown, normal setup and port reuse. +- **The Android OpenCL AAR no longer duplicates its CPU AAR dependency's Java classes.** + Its `classes.jar` is empty; the CPU AAR supplies the API. Both dependency graphs now pass + through the CI R8 consumer build, including the OpenCL POM's transitive CPU dependency. +- **GitHub snapshot and release downloads include `llama-ffm` and the reactor's CycloneDX JSONs.** + Artifact collection follows the reactor POMs and native classifier list, reports missing outputs + and signatures, and includes the JSONs in provenance attestations. +- **The rolling snapshot's source tag and notes follow the uploaded build.** Updates are serialized; + older commits/runs cannot overwrite a newer snapshot, and an incomplete artifact collection changes + nothing: no upload, no prune, no move of the source tag. - **`jllama_rpc_server_stop()` (C API, `llama-ffm`) is for the serve calls in progress when it is made.** It waited for the count of serves to reach zero and reset the stop request only then, so a serve that took over right after the one it targeted had ended (a restart from another thread, which diff --git a/CLAUDE.md b/CLAUDE.md index 08b9cd62b..22add579d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,7 +6,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co Java bindings for [llama.cpp](https://github.com/ggerganov/llama.cpp) via JNI, providing a high-level API for LLM inference in Java. The Java layer communicates with a native C++ library through JNI. -Current llama.cpp pinned version: **b11827** +Current llama.cpp pinned version: **b11881** ## Natives jars: library jars and GPU module jars (`.github/natives.csv`) @@ -93,7 +93,7 @@ it or is checked against it: | Place | Relation to the list | |---|---| | `llama/CMakeLists.txt` | names the backend directory (`JLLAMA_BACKEND`: GGML flag → name; `metal` = Apple + `GGML_METAL`), writes to `src/main/natives/net/ladenthin/llama////`, and -- through `cmake/jllama-build-info.cmake` -- writes `jllama-build.txt` and `jllama-sbom.json` there (plus `jllama-files.txt` on the modular platforms and in a module-only build); the build file's `classifier=` is derived from the directory and must equal the row's | -| `llama/pom.xml` `natives` profile | one `maven-jar-plugin` execution per row, **generated**: `python3 .github/check-natives.py pom` prints them | +| `llama/pom.xml` `natives` profile | one `maven-jar-plugin` execution per row, **generated**: `python3 .github/check-natives.py pom` prints them; each also includes `META-INF/third-party/natives/**`, the license texts of `llama/legal/natives/` that the `natives-legal` execution copies next to the natives tree (`NOTICE.md` there is the index; the WebUI's npm texts come from `.github/webui-licenses.py`, which `build-webui` checks against the pinned `package-lock.json`) | | `llama-platform/pom.xml` | depends on the rows with `platform=yes` | | `publish.yml` build jobs | each uploads its tree as artifact `natives-`; `package` waits for every one of them (transitively) | | `LlamaLoader.LIBRARY_BACKENDS` / `MODULE_BACKENDS` | must name every backend directory of their kind | @@ -182,7 +182,8 @@ built against, probed per backend) and `signed` (`no` until the signature step e component's pedigree. `merge-native-artifacts.sh` requires every key and the BOM of every artifact; `LlamaModel.getJllamaBuildInfo()` returns the map, `Diagnose` prints one line per directory, and `docs/patches.md` -- generated by `check-patches.py --render`, held current by `code-style` -- is the -page the `patches=` ids point at. The `package` and publish jobs additionally attest build provenance +page the `patches=` ids point at. The `package` job and `attest-snapshot` / `attest-release` (every +file of the signed publication, see "Signed publication") additionally attest build provenance through `actions/attest-build-provenance` (Sigstore): `gh attestation verify --owner bernardladenthin ` proves a natives jar, a jar, a pom or an AAR came out of this workflow at a given commit, which the `.asc` alone cannot (it proves the key, not the build). The reactor's `cyclonedx-maven-plugin` @@ -213,7 +214,7 @@ measurements behind the Windows step are in `docs/handover/local-agent-report-b1 a `llama-common`/`cpp-httplib` that came out shared (one more file to ship). On the static platforms (macOS, s390x) all of it stays inside `libjllama`. **Every ggml default llama.cpp's own CMakeLists changes before its `add_subdirectory(ggml)` is repeated** -- `GGML_LLAMAFILE_DEFAULT` - and `GGML_CUDA_GRAPHS_DEFAULT` at b11827 (unchanged since b11639) -- because adding ggml first skips that block; re-check with + and `GGML_CUDA_GRAPHS_DEFAULT` at b11881 (unchanged since b11639) -- because adding ggml first skips that block; re-check with `grep -n _DEFAULT CMakeLists.txt` at the new tag on every bump. The second one was missing once: ggml's own default for CUDA graphs is OFF, and a CUDA module built without it lost two thirds of its token generation (265.6 -> 88.8 tg128 on an RTX 3070, prompt processing -20%; Vulkan, which @@ -327,7 +328,9 @@ measurements behind the Windows step are in `docs/handover/local-agent-report-b1 On a Ryzen 7 5800H (Zen 3; upstream's b11476 Windows binaries, Qwen3-0.6B Q4_K_M, 8 threads): `haswell` 313 t/s pp512 and 14.3 t/s tg128, the plain `x64` module 30.0 and 8.8 -- a baseline-only build would be unusable for prompt processing, and the 14 x86 modules together are ~20 MB. The gain - on AVX-512/AMX hardware is unmeasured (`TODO.md`). The module-only path was verified locally with + on AVX-512/AMX hardware was measured on 2026-10-11 (Granite Rapids, Zen 4, Graviton 4: + `sapphirerapids` +148 % prompt processing over `haswell`, `zen4` +35 %; + [`docs/benchmarks/cpu-backend-modules.md`](docs/benchmarks/cpu-backend-modules.md)). The module-only path was verified locally with a real `libggml-opencl.so` (OpenCL headers + ICD loader staged in the sandbox): put next to the modular CPU library by the loader, ggml registered the OpenCL backend with the ICD loader on `LD_LIBRARY_PATH` ("3 backend(s) registered") and silently ran on the CPU without it; with @@ -356,6 +359,9 @@ shapes this repo writes and rejects anything else loudly. | `sharedfiles.py` | `check-shared-files.py` (`shared-files`) | the files kept byte-identical across the four sibling repos | | `versions.py` | `check-versions.py` (`shared-files`) | **warns** where a Maven dependency or plugin is used in another version than in a sibling repo | | `runscripts.py` | `check-run-scripts.py` (`shared-files`) | every `run:` script of the workflows and composite actions that runs in bash parses (`bash -n`) | +| `releaseassets.py` | `collect-release-assets.py` (`finalize-publication`) | collects the signed outputs `.github/release-assets.json` names, reports every missing file or signature | +| `publication.py` | `publication.py` (`check-snapshot`, `check-tag`, `finalize-publication`, the six consumers) | version against ref and channel, the gate that freezes the signed publication, its transport check and the two Central transfers (see "Signed publication") | +| `snapshot.py` | `update-snapshot.py` (`github-snapshot`) | the rolling `snapshot` pre-release: no older commit or run over a newer one, prune only after a complete upload | **The release gate.** A job nothing waits for can go red while a release still ships — the natives builds `package` once forgot to wait for, and the aarch64 fat jars that were signed and attached @@ -368,8 +374,9 @@ name). Introducing it found `vmlens` gating nothing in all four repos; it now ga srcmorph and streambuffer are listed with their SHA-256 in each repo's **`.github/shared-files.sha256`** (`sha256sum` format). An entry can also name **one job of a workflow**, `.github/workflows/publish.yml#startgate`: `startgate`, `shared-files`, `verify-signing-key`, -`check-snapshot` and `check-tag` are identical in all four `publish.yml` files (plus -`verify-signing-key-gradle`, `github-snapshot` and `github-release` in the three Maven-only ones), and +`verify-signing-key-gradle`, `check-snapshot`, `check-tag` and the six publication consumers +(`github-snapshot`, `github-release`, `central-snapshot`, `central-release`, `attest-snapshot`, +`attest-release`, see "Signed publication") are identical in all four `publish.yml` files, and such an entry hashes just that job -- so a job kept identical by convention is now checked like a file, without moving it into a reusable workflow (no check name or `needs:` changes). An entry ending in `?repo` covers a file or job identical up to the repository's name (hashed with the name replaced @@ -438,7 +445,8 @@ repository name (`?repo` entries, see `sharedfiles.py`), `SUPPORT.md` and `ISSUE -- one header, so a file can be shared byte for byte -- except the third-party ones annotated in `REUSE.toml` (the generated dockcross wrappers, the JNI headers). -**Composite actions (`.github/actions/`, this repo only).** `restore-models` (restore the shared GGUF +**Composite actions (`.github/actions/`).** `finalize-publication` is shared by the four repositories +(see "Signed publication"); the others are this repo's own: `restore-models` (restore the shared GGUF cache + `validate-models.sh`; the one place a job gets its models — 16 call sites) and `install-sccache-windows` (10 call sites; the caller keeps `if:` and `continue-on-error`), `build-core` (parent + `llama`, optionally more modules, built without tests/checks/javadoc/signing, @@ -532,6 +540,13 @@ inference against the **shipped** natives artifact (`test-java-windows-x86_64` t for Linux: a successful load proves little, since in the Windows measurement every crash came *after* a load that reported the right device count. +**`ctest` runs with `--no-tests=error`, and with `-C Release` on Windows.** The Windows jobs configure +with a multi-config generator (Visual Studio, Ninja Multi-Config), where `gtest_discover_tests` +registers the tests per configuration; a `ctest` without `-C` found none there, printed `No tests +were found!!!` and exited 0. That is how the three Windows C++ jobs passed while running nothing, +until 2026-10-25 (found in the review of PR #559, run 40185148270). `--no-tests=error` turns such +an empty run red in every job. + **Consequence for a new job:** if the configuration you ship can build `jllama_test`, run `ctest` in the same job. If it cannot, add a `test-cpp-` job that builds the default static library with `-DBUILD_TESTING=ON`, and make sure the artifact itself is exercised by a @@ -595,16 +610,19 @@ and the Windows redist components at `https://developer.download.nvidia.com/comp The CUDA artifact must ship kernels for **every supported GPU generation**, so the default build — and every CI build — compiles the **full `CMAKE_CUDA_ARCHITECTURES` set** that ggml/llama.cpp selects. nvcc recompiles each `.cu` kernel once per architecture, which is the -dominant cost of the CUDA job. **nvcc through `sccache` is opt-in since CUDA 13.4** -(`SCCACHE_WRAP_NVCC=true`: `build.sh` then adds `-DCMAKE_CUDA_COMPILER_LAUNCHER=sccache` when it -detects `GGML_CUDA` in the cmake args) and **off by default** -- the rollout item 2 below has the -measurements. With CUDA 13.2 it cached the per-arch `.cu` device passes over Depot alongside the -gcc C/C++ TUs (~51 min cold, ~15 min warm); with CUDA 13.4 and sccache 0.18.0 it fails on the first -`.cu` TUs of every run examined (`Missing "cubin" file output`, `Compiler killed by signal 126`), and -the retry that follows rebuilds everything without any launcher, gcc TUs included (47-80 min -depending on the runner). Today the gcc TUs are cached and nvcc runs directly: CI keeps the **full -arch set on every run** (release-safe everywhere) at roughly the cold nvcc cost, never a reduced -arch set. +dominant cost of the CUDA job. **nvcc goes through `sccache` again since 2026-10-25** (`build.sh` adds +`-DCMAKE_CUDA_COMPILER_LAUNCHER=sccache` when it detects `GGML_CUDA` in the cmake args; +`SCCACHE_WRAP_NVCC=false` opts out), so the per-arch `.cu` device passes cache over Depot alongside +the gcc C/C++ TUs -- with CUDA 13.2 that was ~51 min cold, ~15 min warm. From 2026-10-09 to 2026-10-25 +it was off: with CUDA 13.4 and sccache 0.18.0 every run failed on the first `.cu` TUs (`Missing "cubin" +file output`, `Compiler killed by signal 126`) and the uncached retry rebuilt everything. The trigger +was ggml's default arch list, whose PTX-only `90-virtual` makes nvcc run a ptxas check pass without +`-o` (mozilla/sccache#2862, fix PR #2809); the list this project passes since 2026-10-11 (every arch +`-real`, only `121-virtual` PTX-only) does not hit it -- measured in `nvidia/cuda:13.4.3` with b11815: +108/108 hits warm with sccache 0.18.0, while ggml's list fails as CI did. The "signal 126" was sccache +printing an exit code as a signal, fixed in 0.19.0 (mozilla/sccache#2932), which is the pinned version +now. Either way CI keeps the **full arch set on every run** (release-safe everywhere), never a +reduced arch set; the cache is what makes it affordable. `CUDA_FAST_BUILD` remains as a **local-dev** single-arch knob (CI no longer sets it). `build_cuda_linux.sh` honors it — default **off** (full arch set, release-safe): @@ -626,10 +644,10 @@ the full arch set**. The script default is **off** (full) so any *local/manual* release-safe, and **CI no longer sets `CUDA_FAST_BUILD` at all** — the `crosscompile-linux-x86_64-cuda` job always builds the full set on PR / push / dispatch / publish, so every artifact (not just the ones that reach Central) runs on every GPU generation. The full-arch CI cost is paid by the job -itself since CUDA 13.4 (nvcc uncached, see above); the sccache-over-Depot cache still covers the gcc -TUs, and `SCCACHE_WRAP_NVCC=true` re-enables the nvcc launcher (gated behind the same probe; -`build.sh`'s mid-build retry treats an sccache `Compiler not supported` / `Compiler killed by signal` -failure like any other cache error and rebuilds the job without any launcher rather than redding it). +on a cold cache; warm, the sccache-over-Depot cache covers the nvcc device passes and the gcc TUs +(the launcher is gated behind the same probe, and `build.sh`'s mid-build retry treats an sccache +`Compiler not supported` / `fatbinary fatal` failure like any other cache error and rebuilds the job +without any launcher rather than redding it). **Measured with CUDA 13.2:** a warm run in the manylinux_2_28 container hit **100%** on CUDA / CUBIN / device-code (139 CUDA hits, 99.86% overall, 3 misses) and cut the job from **~51 min cold to ~15 min warm**. `build.sh` prints `sccache --show-stats` at the end of every run so the hit table stays visible. @@ -725,8 +743,8 @@ run through the full model-backed Java suite (`test-java-windows-x86_64-msvc`, a proves the sources compile with MSVC -- but nothing ships from it, because a second static CPU library next to the clang one would only be a second CPU library, and clang's is the faster one. -**Why plain clang.** Only plain clang produces all 14 x86 CPU variants (TODO.md "CPU variants", -measured: clang is +5.6% on prompt processing and equal on generation against `cl.exe`, static +**Why plain clang.** Only plain clang produces all 14 x86 CPU variants (measured in the +`GGML_OPENMP=OFF` table below: clang is +5.6% on prompt processing and equal on generation against `cl.exe`, static against static), and upstream's own `win-cpu` release uses the same LLVM toolchain. The Visual Studio generator ignores `CMAKE_{C,CXX}_COMPILER_LAUNCHER`, so only Ninja Multi-Config can front `cl.exe` with sccache over Depot WebDAV, which is why the GPU module jobs use Ninja + `cl.exe`. All @@ -790,10 +808,10 @@ measured and wrong:** `libggml-base.so` -- the first file `LlamaLoader` loads -- `UnsatisfiedLinkError: The native library of backend 'cpu' could not be loaded`, which reads like a packaging defect and is a missing distro package (measured 2026-10-11 on an EC2 Ubuntu AMI, fixed by installing `libgomp1`). Every shipped Linux file also needs `libstdc++.so.6` and `libgcc_s.so.1`, so -a distroless or musl image cannot run the jar at all. Whether to make the Linux jar self-contained -the way the Android build already is (`GGML_OPENMP=OFF` plus `-static-libstdc++`) is an open decision -in `TODO.md`: the cost is the ~6% above, the gain is a jar that stops depending on the base image. The remaining unknown is a machine with many more -cores than the 8 measured here (`TODO.md`). +a distroless or musl image cannot run the jar at all. Of making the Linux jar self-contained the way +the Android build is (`GGML_OPENMP=OFF` plus `-static-libstdc++`), the OpenMP half is done (the +paragraph above) and the C++ runtime half declined, since every JVM that can load the library brings +`libstdc++`/`libgcc_s` itself. Unmeasured: a machine with many more cores than the 8 measured here. **GPU runtime libraries are NOT bundled.** A GPU natives jar ships only its backend module (`ggml-cuda.dll`, `ggml-vulkan.dll`, ...; see "Modular natives"). The consumer's driver/toolkit must supply the runtime: CUDA needs the @@ -818,7 +836,7 @@ Windows-specific wiring (the rest is the natives-jar wiring, see "Natives jars" (`OpenCL.lib`), then delegates to `build.bat` with `-DOpenCL_INCLUDE_DIR`/`-DOpenCL_LIBRARY` (the Windows analogue of `build_opencl_android.sh`). 3. **`.github/workflows/publish.yml`** — build jobs (all `windows-2025-vs2026`, `ilammy/msvc-dev-cmd@v1`, - sccache v0.18.0 zip + Depot WebDAV), each uploading `natives-`: + sccache v0.19.0 zip + Depot WebDAV), each uploading `natives-`: - `build-windows-x86_64` — **modular CPU, plain clang** (`-DJLLAMA_BACKEND_DL=ON -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++`; no `-DBUILD_TESTING` -- `test-cpp-windows-x86_64` builds the static library with the tests, same compiler). @@ -847,7 +865,7 @@ ignores compiler launchers. **The plain-clang jobs cache because of `llama/cmake/msvc-runtime-gnu-clang.cmake`.** sccache refuses any TU carrying an `-Xclang` argument it does not know (`Can't handle UnknownFlag arguments with --Xclang`; 0.18.0, and `main` on 2026-10-22), and CMake's `Platform/Windows-Clang.cmake` implements +-Xclang`; 0.18.0 and 0.19.0), and CMake's `Platform/Windows-Clang.cmake` implements `CMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded` (the hybrid CRT every Windows job sets) for clang with the GNU front end as `-Xclang -flto-visibility-public-std -D_MT -Xclang --dependent-lib=libcmt` -- and `-flto-visibility-public-std` is the one sccache does not know (`--dependent-lib` and llama.cpp's own @@ -1128,21 +1146,30 @@ unlaunched. with the `linux-x86-64` set (see "Local coding agent"). `publish-snapshot` / `publish-release` `need` all three (a matrix job is done when every row is; -fail-loud gating). `github-snapshot` / `github-release-signed` then attach the Maven artifacts with -the `.asc` maven-gpg wrote at deploy -- the classes jar, every natives jar, every module's pom -(`llama-parent` and `llama-platform` included: maven-gpg writes `target/-.pom` -next to its `.pom.asc`, also for a pom-only module), sources, javadoc, the agent's thin jar, and the -two AARs with the `.aar.asc` Gradle writes next to them, their poms +fail-loud gating). They stage and sign every Central artifact locally, and `finalize-publication` +collects and freezes the publication (see "Signed publication"): the classes jar, every natives jar, +every module's pom (`llama-parent` and `llama-platform` included: maven-gpg writes +`target/-.pom` next to its `.pom.asc`, also for a pom-only module), each reactor +module's CycloneDX JSON, sources, javadoc, the agent's thin jar, the signed llama.cpp source archive, +and the two AARs with the `.aar.asc` Gradle writes next to them, their poms (`build/publications//pom-default.xml`) and their sources/javadoc jars -(`build/distributions/`) -- and nothing is signed or assembled in those jobs any more (no -`sign-fatjars.sh`, no `environment:`; `verify-signing-key` still proves the key, and the publish jobs -sign with it). Until 2026-10-12 the collect steps copied jars and bare AARs only: every pom was -missing, `llama-platform` was absent entirely, the AARs went out unsigned and the `*.jar`-only -signature check never noticed. The check counts jars, AARs and poms now, and `github-snapshot` ends -by deleting every asset of the `snapshot` pre-release the run did not upload, each printed by name -(`gh release upload --clobber` never removed anything: 208 assets, 109 of them from 5.0.x). The -prune refuses an empty upload, treats an asset that is already gone as removed and fails only after -trying every deletion; a versioned release is never pruned. Why it prunes asset by asset instead of +(`build/distributions/`). `github-snapshot` / `github-release` attach exactly those files and sign or +assemble nothing (no `sign-fatjars.sh`, no `environment:`). Until 2026-10-12 the collect steps copied +jars and bare AARs only: every pom was missing, `llama-platform` was absent entirely, the AARs went out +unsigned and the `*.jar`-only signature check never noticed. `collect-release-assets.py` is shared +across all four Java repositories; its local `.github/release-assets.json` declares the native/Android +extras. It discovers all reactor modules from their POMs and all native classifiers from +`natives.csv`, includes `llama-ffm`, renames each `target/bom.json` to its Central name and reports +missing outputs/signatures. After a complete upload, `github-snapshot` deletes every asset of the +`snapshot` pre-release the run did not upload, each printed by name (`gh release upload --clobber` +never removed anything: 208 assets, 109 of them from 5.0.x). The prune refuses an empty upload, +treats an asset that is already gone as removed and fails only after trying every deletion; a +versioned release (`v...`) is refused as a rolling tag, so it is never pruned. An incomplete +collection never reaches the job (the gate fails first), and `update-snapshot.py` itself refuses one +before any change. The whole snapshot update is serialized; `update-snapshot.py` rejects late older +commits/runs, and updates the source tag and notes to the uploaded commit and run after a complete +upload; the first snapshot of a repository is a draft until then, so a failed first upload leaves +neither a public pre-release nor a tag. Why it prunes asset by asset instead of deleting and recreating the release -- the job's first form, which failed in every burst of main pushes in May 2026 -- is recorded in `workspace/policies/fat-jar-release-assets.md`, "The `snapshot` pre-release holds exactly the current upload". @@ -1197,7 +1224,7 @@ needs no extra step here, `build-webui` re-reads the tag and rebuilds the matchi ships no UI): ```bash # needs node/npm + network for the asset build; the embed step is plain cmake -P -git clone --depth 1 --branch b11827 https://github.com/ggml-org/llama.cpp /tmp/lc +git clone --depth 1 --branch b11881 https://github.com/ggml-org/llama.cpp /tmp/lc ( cd /tmp/lc/tools/ui && npm ci && npm run build ) mkdir -p webui-generated /tmp/ui-gen cmake -DUI_SOURCE_DIR=/tmp/lc/tools/ui -DUI_BINARY_DIR=/tmp/ui-gen \ @@ -1237,7 +1264,7 @@ cache lives in **Depot Cache** over sccache's **WebDAV** backend: - `SCCACHE_WEBDAV_TOKEN: ${{ secrets.DEPOT_TOKEN }}` — a Depot **organization** token, stored as the repo secret **`DEPOT_TOKEN`**. -Because `sccache` is **content-addressed** and llama.cpp is pinned (`JLLAMA_GIT_TAG b11827`), the +Because `sccache` is **content-addressed** and llama.cpp is pinned (`JLLAMA_GIT_TAG b11881`), the ~280 upstream object files are byte-identical every run, so a warm cache recompiles only the *changed* files. Depot's cache is **shared across all branches** (unlike GitHub's per-branch `actions/cache`), so every branch builds incrementally; a `b` version bump @@ -1306,8 +1333,9 @@ v0.16.0 + the probe this is no longer a risk.) Job-by-job status: warm cache 277/278 hits (99.64%), 1m46s build time. Since the CPU variants it runs in the manylinux_2_28 image the CUDA job already used (gcc-toolset-14), with the same env. 2. `crosscompile-linux-x86_64-cuda` (via `build_cuda_linux.sh`, which execs `build.sh`) — - ✅ **green, full-arch always; the gcc TUs cache, nvcc has been uncached since CUDA 13.4** (the - paragraph at the end of this item). With CUDA 13.2 `build.sh` also wrapped nvcc + ✅ **green, full-arch always; the gcc TUs cache, and the nvcc device passes do again since + 2026-10-25 (sccache 0.19.0)** -- uncached from 2026-10-09 to 2026-10-25 (the paragraph at the end + of this item). With CUDA 13.2 `build.sh` also wrapped nvcc (`-DCMAKE_CUDA_COMPILER_LAUNCHER=sccache`, scoped to CUDA builds), so both the gcc C/C++ TUs (134 model files + ggml + httplib) **and** the per-arch `.cu` device passes cached over Depot. CI dropped the single-arch validation shortcut (`CUDA_FAST_BUILD`/`CUDA_ARCH` removed from the @@ -1334,16 +1362,21 @@ v0.16.0 + the probe this is no longer a risk.) Job-by-job status: -Bbuild` now also passes `-DGGML_CCACHE=OFF`, so a genuinely uncached build is guaranteed regardless of what's left on `PATH`. This fallback now falls back to a real, green `-O3` build like every other sccache/nvcc incompatibility instead of redding the job. **CUDA 13.4 with sccache 0.18.0: a third - failure shape, and the reason nvcc wrapping is opt-in now (`SCCACHE_WRAP_NVCC=true`).** + failure shape, and why nvcc wrapping was opt-in from 2026-10-09 to 2026-10-25.** `sccache: caused by: Missing "cubin" file output` followed by `sccache: Compiler killed by signal 126`, on the first `.cu` TUs ten seconds into the build, in **every** CUDA job log examined since the 13.4 bump of 2026-09-27 -- runs 37643964068 and 37831180985 (2026-10-07/08), 37680715063 (the b11476 bump) and 37925157175 (#492, 2026-10-09). Each fell back to the uncached retry, which took 47 to 80 minutes depending on the runner (job totals of 54 to 93 min; none came near the warm ~15 min), so the launcher never paid anything back and the retry threw the gcc cache away with it. - `build.sh` therefore wraps nvcc only when `SCCACHE_WRAP_NVCC=true` (the CUDA job does not set it) - and keeps the gcc TUs cached. To re-test: bump `SCCACHE_DL_VERSION`, set the variable on the CUDA - job for one PR run, and flip the default back once a warm run shows CUDA hits in the stats table. + `build.sh` then wrapped nvcc only with `SCCACHE_WRAP_NVCC=true`. **Resolved 2026-10-25:** the + failure needs a PTX-only `compute_90`/`compute_120` target (ggml's default list, `90-virtual`; the + cause is mozilla/sccache#2862, fix PR #2809), which this project's own list (since 2026-10-11, see + "Upgrading CUDA Version") no longer has -- measured locally: 108/108 hits warm with sccache 0.18.0. + The "signal 126" was an exit code printed as a signal (mozilla/sccache#2932, fixed in 0.19.0, as is + the same misreport for every ordinary nvcc compile error, which used to trigger this retry too). So + nvcc is wrapped by default again with sccache 0.19.0; `SCCACHE_WRAP_NVCC=false` opts out. The first + warm run's stats table is the check that it pays back. 3. `crosscompile-linux-aarch64` — ✅ **enabled**, a **native `ubuntu-24.04-arm` build** inside the pypa manylinux_2_28 aarch64 image (`MANYLINUX_ARGS` forwards the env like `DOCKCROSS_ARGS`): `build.sh` self-fetches the aarch64 static-musl sccache in the container (the fetch block in @@ -1360,7 +1393,7 @@ kept per job on purpose, since at workflow level the token would reach every job running third-party actions — and, for dockcross, `DOCKCROSS_ARGS: "-e SCCACHE_WEBDAV_ENDPOINT -e SCCACHE_WEBDAV_TOKEN -e USE_CACHE"` — the dockcross wrapper only forwards host env it is explicitly told to via `-e`. The fetched sccache -version is the `SCCACHE_DL_VERSION` knob in `build.sh` (default **0.18.0**; overridable per-job +version is the `SCCACHE_DL_VERSION` knob in `build.sh` (default **0.19.0**; overridable per-job to try a different build against a container that crashed another). **Windows** is handled separately (the Visual Studio generator ignores `CMAKE_*_COMPILER_LAUNCHER`): see "Windows native classifiers" below — the **default** Windows CPU JAR now uses the **Ninja @@ -1483,11 +1516,11 @@ Current patches: | `0001-win32-arg-parse-embed-guard.patch` | Windows JNI regression from llama.cpp **#24779** (introduced b9739): on Windows `common_params_parse` re-derived argv from the **process** command line (`GetCommandLineW`) and adopted it, so an embedded/JNI caller (`java.exe`) lost its `--model …` args → "Failed to parse model parameters". b9789 narrowed the unconditional override to a **count-guard** (`if (static_cast(utf8.buf.size()) == argc) { argv = utf8.ptrs.data(); }`), but that is exactly the variant the project already found breaks its Windows server-integration tests (when the embedded argv length coincides with `java.exe`'s). The patch carries the **complete upstream change** (so it can be submitted to llama.cpp verbatim and then dropped here): **(1)** `common_params_parse` parses **exactly the argv it is given** (no `GetCommandLineW` magic) and a new `common_params_parse_main()` wrapper holds the UTF-8 recovery for the standalone tools' `main()` (`common/arg.{cpp,h}`); **(2)** the **~34 standalone `main()` call sites** (every `common_params_parse(argc, argv, …)` across `tools/*`, `examples/*` and the `tests/*` programs) flip to `common_params_parse_main()`; **(3)** a `tests/test-arg-parser.cpp` regression case pins that `common_params_parse` honors a caller-supplied argv. The embedded caller (`jllama.cpp`) keeps calling `common_params_parse` and is never overridden. **Our subproject build compiles only the `arg.{cpp,h}` core** — `LLAMA_BUILD_TOOLS`/`LLAMA_BUILD_TESTS` are OFF for a FetchContent subproject — so the flips + test are applied-but-not-compiled here; they were validated via a one-off `-DLLAMA_BUILD_TOOLS=ON -DLLAMA_BUILD_TESTS=ON` build (the new test compiles and its asserts pass; `test-arg-parser`'s only red there is the live `ggml.ai` download check, which is sandbox-network, not the patch). Because it spans **35 files** it must be refreshed on every llama.cpp bump (the applier fails loud). **Refreshed at the b10679 bump:** upstream rewrote `tests/test-save-load-state.cpp`'s `main()` to take a `--models DIR` option, which it strips itself into a `filtered_argv` before calling `common_params_parse(fargc, filtered_argv.data(), …)`. That call site therefore stopped qualifying for the `_main()` flip — by this patch's own rule a caller that builds its own argv must use `common_params_parse` directly, so its argv is kept — and the hunk was **dropped** rather than refreshed (37 → 36 files). Caveat for whoever submits this upstream: that `main()` now filters a possibly-mojibake Windows argv *before* any UTF-8 recovery, so the fully correct upstream form there is recover-then-filter, not a one-line flip. It is out of scope for the downstream carry because `LLAMA_BUILD_TESTS` is OFF here, so the file is never compiled. **Refreshed the same way at the b11236 bump:** upstream #29426 rewrote `tests/test-recurrent-state-rollback.cpp`'s `main()` into the identical `--models DIR` / `filtered_argv` shape, so that hunk was dropped too (36 → 35 files); the same recover-then-filter caveat applies to it. **Still required at b10679, verified rather than assumed:** `common_params_parse` in pristine `b10679:common/arg.cpp` still carries the `#ifdef _WIN32` count-guarded `argv = utf8.ptrs.data()` override, and `common_params_parse_main` appears nowhere in `b10679:common/arg.h` — upstream has not adopted the fix. The upstream-facing write-up, including a standalone reproducer that makes llama.cpp's own `test-arg-parser` fail on unmodified `master`, lives in [docs/upstream-investigation-win32-argv-substitution.md](docs/upstream-investigation-win32-argv-substitution.md). **Reported upstream as [ggml-org/llama.cpp#26416](https://github.com/ggml-org/llama.cpp/issues/26416)** (2026-08-01, label `bug-unconfirmed`, first bad commit `508a475`); the issue asks which of the two directions the maintainers prefer before a PR is opened, so this patch stays downstream until they answer. **Refreshed at the b11612 bump:** #30023 (`a17e94d22`, "tests : consolidate context state tests into test-llama-context") deleted `tests/test-state-restore-fragmented.cpp`, so its hunk was dropped (36 → 35 `diff --git` headers); the consolidated `tests/test-llama-context.cpp` has the `--models DIR` / `filtered_argv` `main()` shape, so by this patch's own rule it keeps calling `common_params_parse` directly and gets no flip. Still required, verified at pristine b11612: `common/arg.cpp:1288` carries the count-guarded `argv = utf8.ptrs.data()` override and `common/arg.h` has no `common_params_parse_main`. | | `0002-server-preserve-caller-load-progress-callback.patch` | Load-progress-callback regression introduced in llama.cpp **b9789**: `server_context::load_model` (`tools/server/server-context.cpp`) now **unconditionally** installs the server's own load-progress reporter on `params_base.load_progress_callback` immediately before `common_init_from_params`, clobbering any callback the embedding caller already set. libjllama's `LoadProgressCallback` feature wires `common_params.load_progress_callback` to a JNI trampoline *before* calling `load_model`, so the bump silently killed it — `LoadProgressCallbackTest` saw zero progress updates and the abort-on-`false` path never threw. The patch guards the assignment with `if (params_base.load_progress_callback == nullptr)`, so the server installs its own reporter **only when the caller hasn't** — a caller-supplied callback survives and fires during load. Standalone `llama-server` (no caller callback, so the field is null) is unaffected. Same JNI-vs-standalone divergence class as `0001`. **The guard is `== nullptr || == load_progress_callback`, and the second disjunct must never be dropped:** `load_progress_text` is a **local** of `load_model()`, and upstream re-assigns both fields on every call so the `user_data` always points at the current frame. `load_model()` runs a **second** time when resuming from the sleeping state (`--sleep-idle-seconds`), and by then `params_base` holds *our own* callback from the first load — a bare nullptr check skips the re-assignment and leaves `user_data` pointing into a **dead stack frame**, which segfaults inside `load_progress_callback()` on the first request after an idle window. That was a latent defect in this patch from the day it was written; only a second `load_model()` can reach it, and nothing exercised sleep until `IdleSleepWakeIntegrationTest` was added. | | `0003-pr22393-server-add-slot-prompt-similarity-getter-setter.patch` | **Upstream-PR carry** of [ggml-org/llama.cpp#22393](https://github.com/ggml-org/llama.cpp/pull/22393) ("server : add slot_prompt_similarity getter/setter"). Purely additive: adds `server_context::get_slot_prompt_similarity()` / `set_slot_prompt_similarity(float)` (`tools/server/server-context.{cpp,h}`) so an embedding/JNI caller can query and tune the slot-selection threshold at runtime without reloading the model. Verbatim copy of the PR, which **upstream closed without merging** (rejected as exposing unsafe internal state — see the patch header). Carried permanently; it will not be droppable via a version bump. | -| `0007-server-attach-http-frontend.patch` | **Adds `llama_server_attach(argc, argv, server_context&)`** so the `NativeServer` *attach mode* can serve an **already-loaded `LlamaModel`** over the upstream HTTP frontend — no second model load, no `start_loop()`; the LlamaModel's worker keeps driving the shared `server_context` and the HTTP routes post tasks to its queue (the queue is the synchronization point). Mechanically: (1) extracts the **pure core route table** (`health` … `slots`) out of `llama_server()` into `static void llama_server_register_common_routes(ctx_http, routes)` (shared, so the two entry points cannot drift on the core endpoint set). **Scope note (narrowed at the b10154 bump):** the helper deliberately carries **only** the stable, state-independent route table — **not** the resumable-streaming routes (their handlers differ between router / non-router), the GCP-compat shim, or the experimental **CORS-proxy / MCP-server / built-in-tools** wiring. b10154 (upstream MCP-server support) moved the streaming routes into the middle of that block and coupled tools/CORS to a per-call `server_mcp mcp_mgr` lifecycle, so the earlier contiguous "route-table + CORS-proxy + tools" extraction is no longer possible; `llama_server()` keeps all of that inline, **byte-identical to upstream b10154** (only the route-table block is factored out). (2) adds `llama_server_attach`, which parses only the HTTP-side argv via `common_params_parse`, starts the stream-session GC + `server_http_context`, registers the common route table, the **non-router** resumable-streaming handlers (upstream b10154 paths `/v1/stream` GET/DEL + `/v1/streams/lookup` POST), the GCP-compat shim, and **403 "disabled" stubs for `/cors-proxy` + `/tools`** (attach mode does not wire the experimental CORS-proxy / MCP / built-in-tools host — those belong to a full `llama-server`, not an embedded model), marks ready immediately (model already loaded), and blocks on the HTTP thread until `llama_server_request_shutdown()` — never calling `common_init()`, backend init, `ctx_server.terminate()` or `llama_backend_free()` (the embedding caller owns those). Applies after `0001`+`0006` (same file); closes the "NativeServer — reuse an already-loaded LlamaModel" TODO. Upstream-submittable ("server: let embedding callers attach the HTTP frontend to an existing server_context"). **Refreshed at the b10519 bump:** upstream #26347 dropped the API key from the `/models` + `/v1/models` public-endpoint set and deleted the two trailing `// public endpoint (no API key check)` comments on those route registrations. Those two lines sit inside this patch's route-table removal block, so `git apply` failed ("patch does not apply", `server.cpp:258`) at **every** tag from b10519 on; the fix was to drop the now-wrong comment from all four affected lines (2 on the `-` side, 2 in the extracted helper on the `+` side), keeping the helper byte-identical to the block it replaces. **This is the invariant to re-check on every bump:** the `+` side of `llama_server_register_common_routes()` must stay a verbatim copy of the route table it factors out of `llama_server()`. **Refreshed at the b11104 bump** (upstream #28690, multi-address `--host`): `server_http_context` lost its single `thread` and `listening_address` members in favour of `join()` and a `listening_addresses` vector, one listener thread per bound address. The patch still *applied* cleanly there — only its own `+` lines named the removed members — so the applier could not see it; `llama_server_attach` now logs every address and blocks in `ctx_http.join()`, exactly as upstream's `llama_server()` does. **Refreshed at the b11361 bump** (#29818 adds `POST /v1/systemone` to the route table: one line, added on both sides so the helper stays verbatim) **and at b11401** (#29895 adds a `server_child &` overload of `llama_server()` beside the declarations and a `server_child child;` at the top of the argv entry point, the context of `0007`'s first two hunks; only context moved, the `+`/`-` lines are unchanged). **Changed in 5.2.x, not a refresh: `llama_server_attach(argc, argv, server_context &, server_routes &)` serves the caller's `server_routes`** (`jllama_context::routes`, the one the model load builds) **instead of constructing one on its own frame.** `server_routes`' constructor registers a sleeping-state callback on the model's task queue, `server_queue::on_sleeping_state` only appends, so the frame-local object left a callback into freed memory behind when the attach returned, and the model's next idle sleep (`--sleep-idle-seconds`) ran it -- undefined behaviour, found at the b11361 bump and pinned by `NativeServerAttachSleepIntegrationTest` (model-backed, CI). Consequence: the route handlers read the **model's** params, so the endpoint toggles (`--metrics`, `--props`, `--slots`), `--slot-save-path`, the slot count and the sampling defaults are `ModelParameters` now (`enableMetricsEndpoint()` & co., added for that), and the attach argv configures the HTTP side only. **Refreshed at the b11799 bump:** #26603 (`POST /tts`, b11781) and #30636 (the WebSocket `/v1/realtime`, b11780, registered with `ctx_http.ws()`, no `ex_wrapper`) joined the route table between the transcription and the Anthropic routes, so the removal block and the `+` side of `llama_server_register_common_routes()` both gained the two lines and attach mode serves them too; the helper stays the verbatim copy of the block it replaces, checked by script when the patch was regenerated. | +| `0007-server-attach-http-frontend.patch` | **Adds `llama_server_attach(argc, argv, server_context &, server_routes &)`** so the `NativeServer` *attach mode* can serve an **already-loaded `LlamaModel`** over the upstream HTTP frontend — no second model load, no `start_loop()`; the LlamaModel's worker keeps driving the shared `server_context` and the HTTP routes post tasks to its queue (the queue is the synchronization point). Since b11881 (upstream #31113) it adds **only** `llama_server_attach`, which parses only the HTTP-side argv via `common_params_parse`, starts the stream-session GC + `server_http_context`, registers **upstream's own** `server_register_routes()` (the route table plus the GCP-compat shim) and `server_register_stream_routes()` with the instance (non-router) handlers -- exactly what `server_run_instance()` registers, so attach mode cannot drift from upstream's endpoint set -- and **403 "disabled" stubs for `/cors-proxy` + `/tools`** (attach mode does not wire the experimental CORS-proxy / MCP / built-in-tools host — those belong to a full `llama-server`, not an embedded model), marks ready immediately (model already loaded), and blocks on the HTTP thread until `llama_server_request_shutdown()` — never calling `common_init()`, backend init, `ctx_server.terminate()` or `llama_backend_free()` (the embedding caller owns those). Applies after `0001`+`0006` (same file); closes the "NativeServer — reuse an already-loaded LlamaModel" TODO. Upstream-submittable ("server: let embedding callers attach the HTTP frontend to an existing server_context"). **Refreshed at the b10519 bump:** upstream #26347 dropped the API key from the `/models` + `/v1/models` public-endpoint set and deleted the two trailing `// public endpoint (no API key check)` comments on those route registrations. Those two lines sit inside this patch's route-table removal block, so `git apply` failed ("patch does not apply", `server.cpp:258`) at **every** tag from b10519 on; the fix was to drop the now-wrong comment from all four affected lines (2 on the `-` side, 2 in the extracted helper on the `+` side), keeping the helper byte-identical to the block it replaces. (Until b11881 that was **the invariant to re-check on every bump**: the `+` side of the patch's own `llama_server_register_common_routes()` had to stay a verbatim copy of the route table it factored out of `llama_server()`.) **Refreshed at the b11104 bump** (upstream #28690, multi-address `--host`): `server_http_context` lost its single `thread` and `listening_address` members in favour of `join()` and a `listening_addresses` vector, one listener thread per bound address. The patch still *applied* cleanly there — only its own `+` lines named the removed members — so the applier could not see it; `llama_server_attach` now logs every address and blocks in `ctx_http.join()`, exactly as upstream's `llama_server()` does. **Refreshed at the b11361 bump** (#29818 adds `POST /v1/systemone` to the route table: one line, added on both sides so the helper stays verbatim) **and at b11401** (#29895 adds a `server_child &` overload of `llama_server()` beside the declarations and a `server_child child;` at the top of the argv entry point, the context of `0007`'s first two hunks; only context moved, the `+`/`-` lines are unchanged). **Changed in 5.2.x, not a refresh: `llama_server_attach(argc, argv, server_context &, server_routes &)` serves the caller's `server_routes`** (`jllama_context::routes`, the one the model load builds) **instead of constructing one on its own frame.** `server_routes`' constructor registers a sleeping-state callback on the model's task queue, `server_queue::on_sleeping_state` only appends, so the frame-local object left a callback into freed memory behind when the attach returned, and the model's next idle sleep (`--sleep-idle-seconds`) ran it -- undefined behaviour, found at the b11361 bump and pinned by `NativeServerAttachSleepIntegrationTest` (model-backed, CI). Consequence: the route handlers read the **model's** params, so the endpoint toggles (`--metrics`, `--props`, `--slots`), `--slot-save-path`, the slot count and the sampling defaults are `ModelParameters` now (`enableMetricsEndpoint()` & co., added for that), and the attach argv configures the HTTP side only. **Refreshed at the b11799 bump:** #26603 (`POST /tts`, b11781) and #30636 (the WebSocket `/v1/realtime`, b11780, registered with `ctx_http.ws()`, no `ex_wrapper`) joined the route table between the transcription and the Anthropic routes, so the removal block and the `+` side of `llama_server_register_common_routes()` both gained the two lines and attach mode serves them too; the helper stays the verbatim copy of the block it replaces, checked by script when the patch was regenerated. **Rewritten at the b11881 bump** (#31113, "server: refactor server entrypoint"): upstream split `llama_server()` into one function per role and factored the route table out itself (`server_register_routes`, which also registers the GCP shim, and `server_register_stream_routes`), so the patch's helper, its removal block and the verbatim-copy invariant are gone; the patch now adds the declaration and `llama_server_attach()` (2 hunks instead of 4), and attach mode serves the same endpoints as before. | | `0008-server-models-worker-cmd-override.patch` | **Makes router mode usable in-JVM.** The router (`server-models.cpp`) spawns each model worker by re-executing its own binary (`get_server_exec_path()` = `/proc/self/exe` & friends) — inside a JVM that binary is `java`, not a llama-server, so embedded router workers could never start. The patch adds env `LLAMA_SERVER_WORKER_CMD` (whitespace-split; read in `server_model_meta::update_args`) which replaces only the leading binary-path token of the rendered worker args, letting an embedding host relaunch workers through its own bootstrap — e.g. `java -cp app.jar net.ladenthin.llama.server.NativeServer` (each worker is then a fresh JVM running the classic single-model `NativeServer`). Exposed in Java as `NativeServer.setWorkerCommand(String...)` (JNI `setenv`); exercised by `RouterModeIntegrationTest` (Linux CI). Upstream-submittable (also useful for containerized/wrapped deployments). **Refreshed at the b11429 bump:** #29987 (untagged `4d60b4d08`, the commit before b11429) moved `server_model_meta::update_args` and changed the function after it (`update_caps(const common_params &)`), the hunk's trailing context; the `+` lines are unchanged. Since b11401 (#29895) a worker is a router *child* whose stdout carries the state commands, which is why `LlamaLoader` prints its two diagnostic lines to stderr (a JVM worker's early `System.out` line tripped the router until 2026-10-09, `e9758054`). | -| `0006-server-embed-native-server-jni.patch` | **Makes `server.cpp`'s `llama_server` embeddable in the JVM** so the `NativeServer` JNI bridge can run the full upstream HTTP server (WebUI included) inside `libjllama` — see "Two server modes" below. b9870 already exposes `int llama_server(int, char**)` (non-static; no `main` in the file), so the patch only adds embedded-mode support: (1) a `g_llama_server_embedded` flag + `llama_server_set_embedded()` / `llama_server_request_shutdown()` (declared in the committed `src/main/cpp/native_server_bridge.h`); (2) skips installing the process-wide SIGINT/SIGTERM handlers when embedded (they would hijack the JVM's); (3) in embedded mode parses the **forwarded** argv via `common_params_parse` instead of `common_params_parse_main` (whose `GetCommandLineW` recovery would pick up `java.exe`'s command line — the same Windows class of bug `0001` fixes). `llama_server_request_shutdown()` mirrors the SIGTERM path (invokes the installed `shutdown_handler` → `ctx_server.terminate()` unblocks `start_loop()`), giving JNI an out-of-band stop since `ctx_server` is loop-local. **The handler is guarded, and both guards are load-bearing:** upstream's `shutdown_handler` lambdas capture `llama_server()`'s locals (`ctx_http`, `models_routes`, `mcp_mgr`, `ctx_server`) by reference and are never cleared, while `native_server.cpp` signals *repeatedly* until the worker reports it finished (a stop issued before the handler is installed, or before `start_loop()` begins, would otherwise be lost). A request landing after `llama_server()` returned therefore ran the lambda over destroyed objects — a `SIGSEGV` in `server_http_context::stop()` in `RouterModeIntegrationTest.tearDown` (run 36485159455), with router mode's `clean_up()` (unloading workers) making the window wide. The patch (1) takes `g_shutdown_handler_mutex` for every read, write and invocation of the handler (the caller is on another thread) and (2) declares a `llama_server_shutdown_handler_reset` **after** the captured locals, so the handler is cleared before any of them is destroyed; because invocation holds the same lock, that reset waits for an invocation in progress. `0007`'s `llama_server_attach` carries the same guard. Runnable guard: `src/test/cpp/test_native_server_shutdown.cpp`. Applies **after `0001`** (which flips this call site to `common_params_parse_main`), so its context is the post-`0001` tree; regenerate against `0001`+source on a bump. Only touches `tools/server/server.cpp`. | +| `0006-server-embed-native-server-jni.patch` | **Makes `server.cpp`'s `llama_server` embeddable in the JVM** so the `NativeServer` JNI bridge can run the full upstream HTTP server (WebUI included) inside `libjllama` — see "Two server modes" below. b9870 already exposes `int llama_server(int, char**)` (non-static; no `main` in the file), so the patch only adds embedded-mode support: (1) a `g_llama_server_embedded` flag + `llama_server_set_embedded()` / `llama_server_request_shutdown()` (declared in the committed `src/main/cpp/native_server_bridge.h`); (2) skips installing the process-wide SIGINT/SIGTERM handlers when embedded (they would hijack the JVM's); (3) in embedded mode parses the **forwarded** argv via `common_params_parse` instead of `common_params_parse_main` (whose `GetCommandLineW` recovery would pick up `java.exe`'s command line — the same Windows class of bug `0001` fixes). `llama_server_request_shutdown()` mirrors the SIGTERM path (invokes the installed `shutdown_handler` → `ctx_server.terminate()` unblocks `start_loop()`), giving JNI an out-of-band stop since `ctx_server` is loop-local. **The handler is guarded, and both guards are load-bearing:** upstream's `shutdown_handler` lambdas capture `llama_server()`'s locals (`ctx_http`, `models_routes`, `mcp_mgr`, `ctx_server`) by reference and are never cleared, while `native_server.cpp` signals *repeatedly* until the worker reports it finished (a stop issued before the handler is installed, or before `start_loop()` begins, would otherwise be lost). A request landing after `llama_server()` returned therefore ran the lambda over destroyed objects — a `SIGSEGV` in `server_http_context::stop()` in `RouterModeIntegrationTest.tearDown` (run 36485159455), with router mode's `clean_up()` (unloading workers) making the window wide. The patch (1) takes `g_shutdown_handler_mutex` for every read, write and invocation of the handler (the caller is on another thread) and (2) declares a `llama_server_shutdown_handler_reset` **after** the captured locals, so the handler is cleared before any of them is destroyed; because invocation holds the same lock, that reset waits for an invocation in progress. `0007`'s `llama_server_attach` carries the same guard. Runnable guard: `src/test/cpp/test_native_server_shutdown.cpp`. Applies **after `0001`** (which flips this call site to `common_params_parse_main`), so its context is the post-`0001` tree; regenerate against `0001`+source on a bump. Only touches `tools/server/server.cpp`. **Refreshed at the b11881 bump** (#31113): `llama_server()` now dispatches through `server_run()` to `server_run_router` / `server_run_instance` / `server_run_download`, and upstream added its own `server_run_opts::install_signal_handlers` switch (off for llama-cli). The embedded mode clears that switch instead of guarding the `sigaction` block, and the reset object sits in the two role functions that install a handler, declared after the last local the handler captures -- `models_routes` in the router (declared after `ctx_http` there), `ctx_http` in the instance; the forwarded-argv parse, the mutex and `llama_server_request_shutdown()` are unchanged. | | `0014-common-log-callback-sink.patch` | **Gives `common_log` a callback sink: `common_log_set_callback(log, cb, user_data)` (`common/log.{h,cpp}`).** This is what `LlamaModel.setLogger` hooks. Before it, the Java logger was a `llama_log_set()` callback, which has two holes, both found while chasing `slot print_timing` lines interleaving with the Atmosphere agent's streamed answer: **(a)** every model load runs `common_init()`, which re-points `llama_log_set()` at `common_log_default_callback` (`common.cpp:394`), so `setLogger(…)` *before* `new LlamaModel(…)` silently lost the callback; **(b)** the server's own `SRV_*`/`SLT_*` macros are `LOG_INF` and write straight into `common_log`, which `llama_log_set()` never carried, so the per-request `slot …`/`srv …` lines could not be routed to Java at all (the reason `LlamaModelTest#testLogText/JSON` sat `@Disabled` for years). `common_log` upstream offers file, colors, prefix, timestamps, verbosity and JSONL but no hook. The patch adds one: while a callback is set, the worker thread hands every entry to it **instead of** printing to stdout/stderr (a `--log-file` still receives them); the callback gets the bare formatted message (no prefix/timestamp/colors) with the `ggml_log_callback` signature; swapping the callback pauses the worker first, so queued entries reach the *previous* sink (which is what makes `setLogger(format, null)` a synchronous drain). With the sink, `common_init()`'s `llama_log_set()` reset is harmless — it points at the default callback that feeds `common_log`, i.e. exactly the path into the sink — so the ordering problem (a) disappears without any re-install logic, and the `srv`/`slot` lines (b) arrive because they are `common_log` entries. `jllama.cpp`'s `setLogger` therefore sets `common_log_set_callback(common_log_main(), trampoline)` **plus** `llama_log_set(common_log_default_callback)` (so llama/ggml lines feed `common_log` even before the first load). Two consequences to know: the callback runs on `common_log`'s **worker thread**, a plain `std::thread` llama.cpp re-creates on every pause/resume and never attaches to the JVM — the trampoline attaches it **once per worker thread** as a daemon, named `jllama-log-worker`, and a `thread_local` guard detaches it when the thread exits (`get_jni_env_attaching`; `common_log::pause()` joins the worker, a normal exit on which TLS destructors run, and `JNI_OnUnload` pauses it before anything else). Until 5.2.x it attached and detached per line, which created a `java.lang.Thread` object per log line (13 lines of a failed load, 13 `Thread` objects -- `LlamaLoggerTest` pins the single attach now). Each call runs inside a `PushLocalFrame`/`PopLocalFrame` pair, because a thread that stays attached and has no Java frame would otherwise accumulate local references, `setLogger` must call `common_log_set_callback` **outside** `g_log_mutex`, because the pause joins the worker, which needs that mutex to read the callback, and `setLogger` callers are serialized by a **separate** `g_set_logger_mutex`: two unserialized swaps race on the worker's `std::thread` (one joins it while the other assigns a fresh thread over the still-joinable object = `std::terminate`, the whole JVM), which `LlamaLoggerTest#concurrentSetLoggerCallsDoNotRaceOnTheLogWorker` reproduced before the mutex existed. Two caveats the Javadoc carries: a caller must not hold a lock the *previous* callback needs (the drain runs it on the worker while the caller waits), and the verbosity threshold is process-wide and reset by **every** load (`common_params_parse` ends with `common_log_set_verbosity_thold(params.verbosity)`, default 3), so a load without `-lv` puts it back to 3 — a review assumed the opposite, and `LlamaLoggerTest#verbosityThresholdIsProcessWideAndEveryLoadSetsIt` now pins the measured behaviour. And the verbosity threshold applies *before* the sink: at the default (`3`) the Java logger sees errors, warnings and the server's INFO lines, while llama/ggml INFO lines (`common_log_get_verbosity` maps them to TRACE = 4) arrive only from `setLogVerbosity(4)` on — the same filtering the console gets, and a behaviour change for consumers who captured the unfiltered `llama_log_set()` stream before. **Runnable guards:** `src/test/cpp/test_common_log_callback.cpp` (6 tests over a private `common_log_init()` instance: delivery, bare text under prefix+timestamps, clear, swap-drains-to-old-sink, file kept, levels pass through) links the function on every platform, so a bump that drops the patch reds `C++ Tests` at link time; `LlamaLoggerTest` (model-free, needs only `libjllama`: a logger set before a deliberately failing load on a non-GGUF file sees the `srv … loading model` INFO line and llama's ERROR line, in TEXT and JSON) and the re-enabled `LlamaModelTest#testLogText/testLogJSON` plus `#testLoggerSetBeforeLoadSurvivesTheLoad` (vocab-only load) cover the Java side. Upstream-submittable ("common : add a callback sink to common_log for embedding hosts"); **not yet filed upstream**. Touches only `common/log.{h,cpp}`, which no other patch touches. **Refreshed at the b11401 bump** (#29895 adds a `colors` member next to the sink's members and a `get_colors()` next to `set_callback()`; only context moved, the `+`/`-` lines are unchanged, and upstream still has no hook -- it added `common_log_get_colors` only). **Refreshed at the b11612 bump** (`common_log_set_stdo()`, a stdout/stderr on-off switch stored as a `stdo` member right where the sink's members sit, and `print_entry()` now prints to the console only `if (stdo)`): three hunks of `common/log.cpp` lost their context and were regenerated; the sink keeps precedence -- `if (callback) { callback(...) } else if (stdo) { e.print(); }` -- so a sink still replaces the console and `set_stdo(false)` without a sink still silences it. Still no hook upstream (`common/log.h` names only `common_log_default_callback`). **On a bump, check whether upstream added a hook of its own (grep `callback` in `common/log.h`) and, if so, DROP this patch and port `setLogger` to theirs rather than refreshing it.** | -| `0015-rpc-embeddable-client-and-stoppable-server.patch` | **Makes ggml-rpc usable inside a JVM** (see "RPC backend" below). Upstream treats every client-side RPC problem as `GGML_ABORT` — a malformed endpoint, a server that is not running, a failed handshake — which in a JVM kills the application over a typo in `--rpc`. **(1)** The *registration* path reports failure instead: `rpc_dispatcher::start()` returns `false`, `try_get_dispatcher()` `nullptr`, `ggml_backend_rpc_get_device_count()` `0`, `ggml_backend_rpc_add_server()` `nullptr`, and `add_rpc_devices()` (`common/arg.cpp`) throws `std::invalid_argument` naming the server where it used to register `nullptr` and silently run without it. Every path *after* registration keeps the original contract through `get_dispatcher()`, which still aborts — a server that vanishes mid-inference stays fatal (TODO). **(2)** `add_server()`'s cache hit is re-checked (a stopped server used to pass registration and abort on the first tensor upload), and `ggml_backend_rpc_get_device_memory()` of a gone server returns 0/0 instead of aborting — RPC devices stay in ggml's process-wide registry forever, and `common_init()` queries the memory of **every** registered device at `-lv 4`, so a stopped server would otherwise take down an unrelated later load. **(3)** The server becomes stoppable: `ggml_backend_rpc_stop_server()` (disconnects the client being served, wakes `accept()` with a loopback connection — the one portable way) and `ggml_backend_rpc_server_listening()`; the loop now reaches its cleanup and frees its backends on every early return, but deliberately **not** `rpc_transport_shutdown()`, whose `WSACleanup()` would invalidate every other RPC socket in the process. **(4)** transport: `MSG_NOSIGNAL`/`SO_NOSIGPIPE`, `socket_t::shutdown()`, and the fds `connect()`/`create_server()`/`accept()` leaked on their error paths are closed. Touches `ggml/include/ggml-rpc.h`, `ggml/src/ggml-rpc/{ggml-rpc.cpp,transport.cpp,transport.h}` and one function in `common/arg.cpp` (`add_rpc_devices`, away from `0001`'s `common_params_parse` hunks). **Runnable guard: `src/test/cpp/test_rpc.cpp`** — links both new functions (a bump that drops the patch fails `C++ Tests` at link time on every platform) and drives registration, stop and the memory query over loopback. Upstream-submittable; **not yet filed upstream**. On a bump, check whether upstream grew its own stop function or non-aborting registration (grep `stop_server` / `GGML_ABORT("Failed to connect` in `ggml-rpc.cpp`). **Refreshed at the b11450 bump** (#26610, `-sm tensor` over RPC, ~800 lines in `ggml-rpc.cpp`, protocol 7 → 8): three hunks lost their context -- new dispatcher members beside `start()`, and new `get_proc_address` names before `return NULL` (the two new names now sit after `ggml_backend_comm_allreduce_tensor`); the `+`/`-` lines are unchanged. The server-to-server comm #26610 adds (a listener on `0.0.0.0`, an `accept()` a stop does not wake) is on file in `TODO.md`. **Refreshed at the b11558 bump** (#29544 turns `GGML_RPC_DEBUG` into a verbosity level 0-3: one `ggml-rpc/log.h` with `LOG_ERROR`/`LOG_WARN`/`LOG_INFO` and `LOG_DBG`/`LOG_DBG2`/`LOG_DBG3`, every `GGML_LOG_*`, `printf` and `fprintf(stderr)` of the backend routed through it, and `transport_name()` where `shutdown()` goes in `transport.h`): 12 of the 24 hunks lost their context and were regenerated against the new text; the changes are the same, and the patch's own five error lines (the HELLO handshake in `negotiate_hello`, four in `rpc_dispatcher::start()`) use `LOG_ERROR` now like the code around them (`LOG_ERROR` is `GGML_LOG_ERROR`). One consequence outside the patch: the server's `Accepted client connection` line is `LOG_INFO` through ggml's log callback now (stderr by default, a `setLogger` sink at verbosity 4), no longer `printf` to stdout; `smoke-rpc.sh` captures both streams into `rpc-server.log`, so its grep is unaffected. | +| `0015-rpc-embeddable-client-and-stoppable-server.patch` | **Makes ggml-rpc embeddable.** Registration/HELLO failures report an ordinary error instead of aborting; cached registrations are rechecked; memory queries of a gone server return 0/0. Post-registration device loss remains fatal upstream. **Stoppable server:** the main listener and COMM_INIT peer listener poll cancellation every 50 ms; outgoing peer connects/retries also observe stop, and the main client plus all live peer sockets are shut down under one mutex before blocked caps I/O can survive stop (on Windows `shutdown()` also calls `CancelIoEx`: shutdown alone does not wake a `recv()` blocked in another thread there, which the first run of the Windows C++ suites found, 40195444689). Peers are tracked weakly so COMM_FREE still releases them immediately. No wake-up TCP connection can fill the main accept backlog. **COMM_INIT keeps the configured bind address:** a loopback server cannot open a wildcard peer listener. TCP errors close descriptors and do not raise SIGPIPE; stop leaves shared Winsock state alive. **Runnable guards:** `src/test/cpp/test_rpc.cpp` (registration, math, stop) and `src/test/cpp/test_rpc_comm.cpp` (protocol-v8 C-API subprocesses: loopback/network binding, absent peer, both stalled caps handshakes, successful setup, port cleanup and restart). No model/GPU/external network; deadlines make regressions fail instead of hang. Touches `common/arg.cpp`, `ggml/include/ggml-rpc.h` and `ggml/src/ggml-rpc/{ggml-rpc.cpp,transport.cpp,transport.h}`. **Drop-check on every bump:** inspect registration, COMM_INIT binding, cancellable socket waits and peer tracking; remove hunks only after upstream implements the same contracts. Upstream-submittable; nothing filed before the release. | | `0017-ggml-cpu-x86-prefetch-byte-offset-and-msvc-type.patch` | **Makes `GGML_CPU_ALL_VARIANTS=ON` buildable with plain clang on Windows, and fixes a prefetch address that is wrong everywhere.** The four `_mm_prefetch` calls in `ggml/src/ggml-cpu/arch/x86/quants.c` (the SSSE3-without-AVX branch of `ggml_vec_dot_q4_0_q8_0`, and the only `_mm_prefetch` calls in the whole ggml tree) carry two independent defects; both are fixed by routing the address through one new `static inline` helper in the new header `ggml/src/ggml-cpu/arch/x86/prefetch.h`, which is included relatively, so **no CMake change is needed**. **(1) Type -- fatal only on a current clang:** MSVC declares the intrinsic as `void _mm_prefetch(char const *, int)`; clang's own `xmmintrin.h` defines a casting macro but only `#ifndef _MSC_VER`, so on a `*-windows-msvc` target clang leaves the declaration to Microsoft and a typed pointer is `-Wincompatible-pointer-types`. **clang 22 promoted that to an error by default** ([llvm-project #157364](https://github.com/llvm/llvm-project/pull/157364); the [22.1.0 release notes](https://releases.llvm.org/22.1.0/tools/clang/docs/ReleaseNotes.html) add that `-Wno-error=incompatible-pointer-types` downgrades it) -- *not* clang 16, which promoted only `-Wincompatible-FUNCTION-pointer-types`; an earlier version of this row said otherwise. Measured on the real file at `-msse4.2`, unpatched → patched: clang **20.1.8** 4 warnings → 0/0, clang **22.1.3** 4 errors → 0/0, clang **23.1.3** 4 errors → 0/0. Plain clang is exactly what `cmake/x64-windows-llvm.cmake` selects -- and plain clang is the only way to get all **14** CPU variants, because `clang-cl` makes CMake's `MSVC` true and the `if (NOT MSVC)` block in `ggml/src/CMakeLists.txt` then drops `zen4`, `cooperlake`, `sapphirerapids`, `ivybridge` and `piledriver`. **(2) Arithmetic:** `&x[ib] + sizeof(block_q4_0)` adds `sizeof()` *elements*, not bytes -- +324 and +1156 instead of +18 and +34 (the sizes `ggml-common.h` pins by `static_assert`), and +648 instead of +36 for the `2 *` pair. That half is wrong on every platform, including where the call compiles. **Measured:** no throughput difference (see the test-table row), so this is a correctness and portability fix, not a performance one. **Upstream-submittable and meant to be submitted.** **Why upstream's own build is green is measured, not an open question:** their `windows-cpu` release job builds exactly this with plain clang, `GGML_CPU_ALL_VARIANTS=ON` and no suppressing flag (`CMAKE_ARGS` carries only build-target toggles), and ships `ggml-cpu-sse42.dll` -- because the `windows-2025-vs2026` image has **LLVM 20.1.8** on `PATH`, where these are warnings. That is narrower than it looks: the same image also ships **clang 22.1.3** inside Visual Studio 2026 (`VC/Tools/Llvm/x64`), which *fails* on the unpatched file -- upstream reaches the working compiler only because `C:\Program Files/LLVM/bin` comes first on `PATH`. It is **not** a header difference: all three MSVC toolsets on that image (14.29.30133, 14.44.35207, 14.51.36231) declare it identically as `extern void _mm_prefetch(char const*_A, int _Sel);` -- that was the first hypothesis, and a one-off probe workflow (deleted again once it had answered) disproved it by printing the declaration from each toolset on the image. So this patch is **ahead of** upstream rather than diverging: their build breaks the moment the image ships a clang that makes the diagnostic fatal, and until then they compile four warnings and a prefetch address 18x/34x too far. **Runnable guard: `src/test/cpp/test_prefetch.cpp`.** On a bump, run `git grep -n _mm_prefetch ggml/src/ggml-cpu/arch/x86/quants.c` at the new tag -- a **locator, not a verdict**: it returns **four** hits at every tag, because the calls exist either way (b11639: lines 846, 847, 864, 865). Read them; the fix is upstream's only when the cast to a byte pointer happens **before** the addition, since `(const char *)(&x[ib] + sizeof(...))` casts the whole expression, silences the compiler and keeps the wrong address. Only then **drop this patch rather than refreshing it**. | | `0018-ggml-amx-free-the-aligned-buffer.patch` | **The AMX weight buffer is freed with `free()` but allocated with `_aligned_malloc()` on Windows -- `STATUS_HEAP_CORRUPTION` (0xC0000374) the moment a model is unloaded.** `ggml_backend_amx_buffer_type_alloc_buffer()` (`ggml/src/ggml-cpu/amx/amx.cpp`) allocates with `ggml_aligned_malloc()`, which is `_aligned_malloc()` under `_MSC_VER` (plain clang on a `*-windows-msvc` target defines it too); `ggml_backend_amx_buffer_free_buffer()` called `free()` on it. Fine on Linux (`posix_memalign` + `free`), fatal on Windows, and only there. The patch frees with `ggml_aligned_free(buffer->context, buffer->size)`, exactly what `ggml_backend_cpu_buffer_free_buffer()` does; on Linux that is `free()`, so nothing changes there. **Reached by** the `sapphirerapids` CPU module (the only variant built with `AMX_TILE AMX_INT8`, which `ggml_backend_load_best` picks on Sapphire/Emerald/Granite Rapids; `ggml_amx_init()` is `return true` on `_WIN32`) and a model whose weights have AMX kernels (Q4_0, Q4_1, Q8_0, Q4_K, Q5_K, Q6_K, IQ4_XS -- i.e. every CI model). **Found by the second full run of the modular natives** (38069595101): `Java Tests Windows 2025 x86_64 (clang)` landed on an `Intel(R) Xeon(R) 6973P-C` runner (Granite Rapids), loaded `ggml-cpu-sapphirerapids.dll`, ran `GrammarExample`'s two generations fine and died with exit code -1073740940 at `LlamaModel.close()`; the first run (38065017595) had the same job green on an AMD EPYC 7763 (no AVX-512, `haswell`). **The Windows runners are a CPU lottery**, so which CPU module a Windows job exercises differs per run; before the modular natives the Windows jar was a static Haswell-level build and this code never ran. **Of the six callers of `ggml_aligned_malloc` in the tree this was the only mismatched pair** (`ggml-backend.cpp`, `ggml-cpu.c` twice, `ggml-openvino.cpp`, `ggml-zdnn.cpp` and `ggml.c` all pair correctly), and `ggml-backend.cpp:2464` is the line the fix copies. **Reproduced deliberately rather than waiting for the lottery again**: on a rented Granite Rapids machine, one CPU module staged at a time with the same model and the DLLs CI itself built, `sapphirerapids` crashed **6 of 6** runs -- including at **one** thread, which rules out a data race -- while `cooperlake`, `icelake` and `haswell` were clean 6 of 6, and on Linux with the same CPU all six exit 0 with byte-identical output. The crash lands *after* the inference prints its timings, in cleanup: the signature of a heap corrupted earlier and detected at `free`. With the patch applied the same matrix on the same machine is **clean in all twelve runs**. **The guard is a configure-time check, not a `jllama_test` case**: the AMX code exists only in that one variant of a `GGML_CPU_ALL_VARIANTS` build and executes only on AMX hardware, which the static test build, the local agent's Zen 3 and the cloud sandboxes lack -- so **`llama/cmake/check-aligned-free-pairing.cmake`** fails the configure on **every** platform when a ggml source calls `ggml_aligned_malloc` and never `ggml_aligned_free` (verified red against the unpatched source, naming `amx.cpp`, and green with this patch). A run-time test cannot replace it: without an AMX CPU there is nothing to observe, which is exactly how this shipped. What exercises it: the Windows x86-64 Java test job and the `windows-x86-64` smoke row whenever GitHub hands them an Intel AMX runner; the patch itself is held by `check-patches.py`, applies at b11639, and the patched file compiles with the variant's flags (GCC 13, `-mamx-tile -mamx-int8 -mavx512vnni ...`). Upstream master still carried the `free()` on 2026-10-10; **not yet filed upstream** (nothing before the release). **Drop-check on every bump, note the inversion:** `grep -n "free(buffer->context)" ggml/src/ggml-cpu/amx/amx.cpp` at the new tag -- a **hit** means the bare `free()` is still there and the patch is still needed; **gone** means upstream fixed it, drop the patch. Measured at b11639 (`a0e6dc738`): one hit, line 46. | | `0020-ggml-alloc-validate-leafs-before-reusing-an-allocation.patch` | **An `--embedding` model that is asked to generate crashes the process in `ggml_gallocr_alloc_graph`** (SIGSEGV on Linux, 0xC0000005 with both Windows toolchains), since upstream #30445 (`cb55ffe6e`, "graph: skip the LM head for pooled embeddings", b11574..b11612). `ggml_gallocr_alloc_graph()` assigns every tensor by **position** from the graph it was reserved with, and `ggml_gallocr_needs_realloc()` validates every node and every node's sources but of the **leafs only the count**. Since #30445 the LM head is expanded by `build_logits()` *after* `build_pooling()`, so an embeddings context reserves a graph that expands `t_embd` first and `t_logits` second, while a generation step on it (the server calls `llama_set_embeddings(ctx, false)` for a slot that samples) expands only `t_logits`, whose first source is `output.weight`: same node and leaf counts, every leaf after it shifted by one. An input leaf then lands on the slot of a weight (`buffer_id -1`) and, with the asserts compiled out, `ggml_vbuffer_tensor_alloc()` indexes `galloc->buffers[-1]`; a leaf landing on another input's slot is not size-checked either. The patch validates the leafs exactly as the nodes are validated, so an invalid leaf makes the allocator reserve again (one buffer) or return false, on which `ggml_backend_sched` reserves the graph itself. **Found by** Publish run 38648257387 (2026-10-14, the first full run since b11558): `ErrorHandlingTest` loads its model with `enableEmbedding()` and posts an infill request to it -- its first test in JUnit's order -- and the fork died in all three Java test jobs (`ggml_gallocr_alloc_graph <- ggml_backend_sched_alloc_graph <- llama_context::process_ubatch <- decode <- server_context_impl::update_slots`). **Reproduced locally without a downloaded model** (a random 2-layer llama GGUF with FIM tokens, context 128): infill crashes with `--embedding` and works without; a debug print showed leaf 31 `out_ids` arriving at a slot with no allocation; reverting `cb55ffe6e` makes it pass, and so does this patch -- with greedy sampling the `--embedding` model then returns the same tokens as the model without, run after run. Upstream master (`a0e6dc738`) still lacks the check; **not yet filed upstream**. **Runnable guard: `src/test/cpp/test_gallocr_leafs.cpp`** (two graphs with the same counts and the leafs swapped). **Drop-check on every bump:** read `ggml_gallocr_needs_realloc()` in `ggml/src/ggml-alloc.c` at the new tag -- once it walks `graph->leafs` itself, drop this patch rather than refreshing it. | @@ -1544,7 +1577,8 @@ used to exist only transiently in each build job's `_deps/`. Two jobs of `publis `unknown`. - The publish jobs sign the archive with the release key (`gpg --detach-sign --armor`, the key `setup-java` imported, the same passphrase name as maven-gpg) and collect it next to the Maven - artifacts; the attestation covers `*.tar.gz`, and the attach jobs' unsigned-asset check counts it. + artifacts: a GitHub-only file of the signed publication, so the gate verifies its signature and + `attest-*` covers it (see "Signed publication"). A consumer rebuilds a release with `cmake -B build -DFETCHCONTENT_SOURCE_DIR_LLAMA.CPP=`. - **`mirror-llama-source`** (after a successful `publish-release`, exempt from the release gate like the attach jobs; `.github/mirror-llama-source.sh`): pushes the pristine pinned commit to the fork @@ -1555,6 +1589,12 @@ used to exist only transiently in each build job's `_deps/`. Two jobs of `publis selected. The patches stay files in this repository, never fork commits: the review surface is the patch file. + Both mirror-job checkouts set `persist-credentials: false`. The script passes the mirror token + through Git's `--config-env`, scoped to the exact mirror URL, and clears inherited headers/helpers + for that URL; a failed remote lookup fails the job. Tests in `test_mirror.py` use dummy credentials + with real Git configuration resolution and intercepted network calls. Cross-repo policy: + [`../workspace/policies/git-checkout-credentials.md`](../workspace/policies/git-checkout-credentials.md). + ## The C API: `jllama_api.h` over the engine (layer B) [`docs/c-api.md`](docs/c-api.md) is the consumer-facing page; this is the layout. Three files @@ -2033,9 +2073,9 @@ Built libraries are placed in `src/main/natives/net/ladenthin/llama/{OS}/{ARCH}/ ### Building the native library for local Java tests -**The JDK must be one whose `javac` accepts `-XDaddTypeAnnotationsToSymbol` -- Temurin 21 (what CI -uses, `distribution: temurin`), not Oracle JDK 21.** `llama/pom.xml` passes that flag because -NullAway's JSpecify mode needs it below JDK 22; on Oracle JDK 21.0.9 `mvn compile` dies in an +**Use Temurin 25 from `.java-version` for builds; the core still targets Java 8.** +The compiler must accept the configured `-XDaddTypeAnnotationsToSymbol` flag. Historically, +Temurin 21 accepted it while Oracle JDK 21 did not. NullAway's JSpecify mode needs it below JDK 22; on Oracle JDK 21.0.9 `mvn compile` dies in an Error Prone `IllegalStateException` naming exactly that flag, while Temurin 21.0.12.1 compiles the same tree (measured, `docs/handover/local-agent-report-b11538-windows.md`, deliverable 1). Check `mvn -version` before blaming anything else. @@ -2294,7 +2334,7 @@ If the local check passes (`BUILD SUCCESS`), the `mvn package` job in 2. **`common_json` converts to `std::string` implicitly**, so it binds happily to a `const nlohmann::json &` parameter (via nlohmann's string-constructible converting constructor) and then throws `json::type_error 302` at runtime. Never declare a project helper as taking `nlohmann::json` when callers pass the `json` alias — `require_json_field_impl` is a template for exactly this reason. Other differences to know: no `get_ref`/`array_t`/`type_name()`; a braced list in *value* position does not build an array (write `json::array({...})`); `at(key)` needs an explicit `.get()`; errors are `common_json_error`; and `get()` is limited to the types explicitly specialised in `common/json.cpp`. `log_helpers.hpp` and `train_engine.cpp` keep their own `nlohmann::json` alias — they never touch the server's `json`. - Uses `nlohmann/json` for JSON deserialization of parameters in the two files named above; everything on the server path uses `common_json`. -- The upstream server library (`server-context.cpp`, `server-queue.cpp`, `server-task.cpp`, `server-schema.cpp`, `server-models.cpp`, and — since b9829 — `server-stream.cpp`) is compiled directly into `jllama` via CMake — there is no hand-ported `server.hpp` fork. **`server-stream.cpp` is mandatory, not optional:** it defines the resumable-streaming SSE replay buffer (`g_stream_sessions`, `stream_session_attach_pipe`, `stream_aware_should_stop`, `stream_conv_id_from_headers`, the `stream_pipe_*` types) that `server-context.cpp` / `server-http.cpp` / `server-models.cpp` now `#include "server-stream.h"` and call, so omitting it fails the link with undefined references. It is platform-neutral (threads + std mutex/condvar, no `subprocess.h`/`posix_spawn_*`), so it builds on Android too and sits outside the `server-models.cpp` Android guard. `jllama` wires its own JNI routes and never calls `g_stream_sessions.start_gc()` (only the excluded standalone `server.cpp` `main()` does), so its GC thread stays dormant. **Phase 2:** the upstream HTTP transport (`tools/server/server-http.cpp`) is compiled into `jllama` too, and `jllama` links upstream's `cpp-httplib` static target (`vendor/cpp-httplib/`) instead of compiling `httplib.cpp` a second time (it did until 6.0.0, without SSL -- see "HTTPS: BoringSSL, statically" for what that cost), so the OpenAI-compatible server can be driven natively from JNI *inside* `libjllama` — no separate `llama-server` executable (a JNI shared library loads anywhere a JVM runs, which a standalone binary does not). `server-http.cpp` does `#include "ui.h"` (the WebUI asset table that `tools/ui`/`llama-ui` normally generates); since the Svelte WebUI is not shipped, `src/main/cpp/webui_stub/ui.h` supplies the upstream **empty-asset** interface and leaves `LLAMA_UI_HAS_ASSETS` undefined (all static-asset-serving blocks compile out). `` already resolves through `llama-common` — since upstream #27304 (b10488) not from a `PUBLIC ../vendor` include dir of its own but transitively, via the `vendor::nlohmann` / `vendor::sheredom` INTERFACE targets it links PUBLIC, each of which exports the `vendor/` root -- and that root comes **before** the FetchContent `json-src` include dir on every `jllama` compile line (measured in `flags.make`), so even our own `#include ` in `log_helpers.hpp` / `train_engine.cpp` compiles against upstream's **vendored** copy: one copy per TU. Since b11556 that copy is 3.12.0 plus upstream's `json-deep-nesting.patch` (nlohmann/json#5387, applied by `scripts/sync_vendor.py`), so the FetchContent `v3.12.0` is no longer byte-identical to it and is effectively unused (`TODO.md`). **HTTPS is on**: the `cpp-httplib` target carries `CPPHTTPLIB_OPENSSL_SUPPORT` as a PUBLIC define whenever an SSL library is configured, and BoringSSL is linked statically on every desktop platform, so `server-http.cpp` serves TLS with `--ssl-key-file`/`--ssl-cert-file` and `common/download.cpp` fetches `https://` URLs (not on Android and s390x, where `LLAMA_OPENSSL=OFF`). **`server.cpp`, `server-tools.cpp` and `server-mcp.cpp` are now compiled in too** (on non-Android — they pull in `subprocess.h`/`posix_spawn_*`, so they share `server-models.cpp`'s Android guard): b9870 exposes `server.cpp`'s entry as `int llama_server(int, char**)` (no `main` in the file), and `patches/0006` makes it embeddable (no process signal handlers, forwarded-argv parse, out-of-band shutdown). **`server-mcp.cpp` is new in b10154** (upstream MCP-server support): both `server.cpp` (`llama_server`'s `mcp_mgr` lifecycle) and `server-tools.cpp` (`tools.setup(..., mcp_mgr)` / `server_mcp::call_tool`) reference `server_mcp`, so it **must** be in the `target_sources` list or the link fails with undefined `server_mcp::{start,shutdown,call_tool,list_tools,~server_mcp}` — **latent on Linux** (a shared object tolerates undefined symbols) but a **hard link error on macOS/ld64 and Windows/MSVC**. It is compiled into `jllama` and — on non-Android — into `jllama_test` too, together with `server.cpp`, `server-tools.cpp` and `server-http.cpp` (and the linked `cpp-httplib` target), so `test_native_server_shutdown.cpp` can drive the real `llama_server()`. The `NativeServer` JNI bridge (`src/main/cpp/native_server.cpp`) calls `llama_server` on a worker thread, so the **full** upstream server — WebUI and all — runs inside `libjllama`. See "Two server modes" below. +- The upstream server library (`server-context.cpp`, `server-queue.cpp`, `server-task.cpp`, `server-schema.cpp`, `server-models.cpp`, and — since b9829 — `server-stream.cpp`) is compiled directly into `jllama` via CMake — there is no hand-ported `server.hpp` fork. **`server-stream.cpp` is mandatory, not optional:** it defines the resumable-streaming SSE replay buffer (`g_stream_sessions`, `stream_session_attach_pipe`, `stream_aware_should_stop`, `stream_conv_id_from_headers`, the `stream_pipe_*` types) that `server-context.cpp` / `server-http.cpp` / `server-models.cpp` now `#include "server-stream.h"` and call, so omitting it fails the link with undefined references. It is platform-neutral (threads + std mutex/condvar, no `subprocess.h`/`posix_spawn_*`), so it builds on Android too and sits outside the `server-models.cpp` Android guard. `jllama` wires its own JNI routes and never calls `g_stream_sessions.start_gc()` (only the excluded standalone `server.cpp` `main()` does), so its GC thread stays dormant. **Phase 2:** the upstream HTTP transport (`tools/server/server-http.cpp`) is compiled into `jllama` too, and `jllama` links upstream's `cpp-httplib` static target (`vendor/cpp-httplib/`) instead of compiling `httplib.cpp` a second time (it did until 6.0.0, without SSL -- see "HTTPS: BoringSSL, statically" for what that cost), so the OpenAI-compatible server can be driven natively from JNI *inside* `libjllama` — no separate `llama-server` executable (a JNI shared library loads anywhere a JVM runs, which a standalone binary does not). `server-http.cpp` does `#include "ui.h"` (the WebUI asset table that `tools/ui`/`llama-ui` normally generates); since the Svelte WebUI is not shipped, `src/main/cpp/webui_stub/ui.h` supplies the upstream **empty-asset** interface and leaves `LLAMA_UI_HAS_ASSETS` undefined (all static-asset-serving blocks compile out). `` already resolves through `llama-common` — since upstream #27304 (b10488) not from a `PUBLIC ../vendor` include dir of its own but transitively, via the `vendor::nlohmann` / `vendor::sheredom` INTERFACE targets it links PUBLIC, each of which exports the `vendor/` root -- and that root came **before** the then FetchContent `json-src` include dir on every `jllama` compile line (measured in `flags.make`), so even our own `#include ` in `log_helpers.hpp` / `train_engine.cpp` compiles against upstream's **vendored** copy: one copy per TU. Since b11556 that copy is 3.12.0 plus upstream's `json-deep-nesting.patch` (nlohmann/json#5387, applied by `scripts/sync_vendor.py`), so the FetchContent `v3.12.0` was not even the same code; it is gone, and `llama/CMakeLists.txt` ("json: upstream's vendored copy, and only that one") guards that upstream's copy is there. **HTTPS is on**: the `cpp-httplib` target carries `CPPHTTPLIB_OPENSSL_SUPPORT` as a PUBLIC define whenever an SSL library is configured, and BoringSSL is linked statically on every desktop platform, so `server-http.cpp` serves TLS with `--ssl-key-file`/`--ssl-cert-file` and `common/download.cpp` fetches `https://` URLs (not on Android and s390x, where `LLAMA_OPENSSL=OFF`). **`server.cpp`, `server-tools.cpp` and `server-mcp.cpp` are now compiled in too** (on non-Android — they pull in `subprocess.h`/`posix_spawn_*`, so they share `server-models.cpp`'s Android guard): b9870 exposes `server.cpp`'s entry as `int llama_server(int, char**)` (no `main` in the file), and `patches/0006` makes it embeddable (no process signal handlers, forwarded-argv parse, out-of-band shutdown). **`server-mcp.cpp` is new in b10154** (upstream MCP-server support): both `server.cpp` (`llama_server`'s `mcp_mgr` lifecycle) and `server-tools.cpp` (`tools.setup(..., mcp_mgr)` / `server_mcp::call_tool`) reference `server_mcp`, so it **must** be in the `target_sources` list or the link fails with undefined `server_mcp::{start,shutdown,call_tool,list_tools,~server_mcp}` — **latent on Linux** (a shared object tolerates undefined symbols) but a **hard link error on macOS/ld64 and Windows/MSVC**. It is compiled into `jllama` and — on non-Android — into `jllama_test` too, together with `server.cpp`, `server-tools.cpp` and `server-http.cpp` (and the linked `cpp-httplib` target), so `test_native_server_shutdown.cpp` can drive the real `llama_server()`. The `NativeServer` JNI bridge (`src/main/cpp/native_server.cpp`) calls `llama_server` on a worker thread, so the **full** upstream server — WebUI and all — runs inside `libjllama`. See "Two server modes" below. ### Two server modes (`OpenAiCompatServer` vs `NativeServer`) @@ -2692,16 +2732,18 @@ ctest --test-dir build --output-on-failure -R "ResultsToJson" | `src/test/cpp/test_model_flags.cpp` | 4 | **The contract between the Java CLI-flag registries and llama.cpp's server argument parser.** CMake reads `ModelFlag.java` + `ModelOption.java` (`cmake/extract-java-wire-names.cmake` → a generated header of `{name, contract}` pairs), and this file asserts every `SERVER_PARSER` name is in `common_params_parser_init(params, LLAMA_EXAMPLE_SERVER).options`. It exists because **no Java test can catch this class**: `ModelFlagTest`/`ModelParametersExtendedTest` pin the *string mapping* (`hasKey("--mlock")`), never that llama.cpp still accepts the string, so they stay green forever while the flag is dead — and `common_params_parse` treats an unregistered option as a hard error, so the affected builder method makes the model **unloadable**, not merely ineffective. **A grep over `arg.cpp` is not a substitute**: `--grp-attn-n`/`-w` are present there at every pinned tag but `set_examples()`-scoped to `LLAMA_EXAMPLE_COMPLETION`/`PASSKEY`, so the server parser rejects them exactly like a deleted flag — only the real option table sees that. `--vocab-only` is the one exemption, and it declares itself `CliContract.PROJECT_PSEUDO` on its own constant rather than appearing in a list inside this file; the test asserts such a name is **still unknown** to the parser (an exemption upstream later registers would be hiding a real check) and that the exempt set is non-empty. | | `src/test/cpp/test_wire_contracts.cpp` | 6 | **The same contract for the two quieter surfaces.** `RequestField` against `server_schema::make_llama_cmpl_schema(...)` (5 tests) and `TrainingField` against `jllama_train::config_keys()` (1 test). Both receivers *silently ignore* an unknown key — the schema skips it, `train_engine.cpp` reads with `j.value(key, default)` and falls back — so a dead field produces no error anywhere and every string-mapping test keeps passing. `OAI_LAYER`-declared keys (consumed by `oaicompat_*_params_parse` before the schema) are exempt from the schema check, and are checked **both** ways: still unknown to the schema (the inverted check), and read by at least one upstream reader-shaped site (the configure-time sweep — this is what caught `chat_template`, a key a public builder wrote and nothing read). See [`docs/history/parameter-wire-surface.md`](docs/history/parameter-wire-surface.md). | | `src/test/cpp/test_rpc.cpp` | 28 | **The runnable guard for `patches/0015` and for `rpc_support.hpp`.** The device-selection rules (pure, literal inputs: `--rpc` endpoints accumulate across repeated options, an explicit `--device`/`-dev` is never overridden, stale RPC devices are replaced by the local GPUs chosen the way llama.cpp's default does — duplicates by device id dropped, iGPUs only without a discrete GPU, `none` on a CPU-only host). Then the **real** ggml-rpc client and server over loopback, no model: a `mul_mat` graph computed on the RPC backend equals the local CPU result; `ggml_backend_rpc_stop_server()` ends the server, frees the port and disconnects a client that is still connected; an unreachable or malformed endpoint is `nullptr`/`std::invalid_argument` instead of an abort; a registered server that went away is re-checked on the next registration; its device reports 0/0 memory instead of aborting; and a stale server is kept out of a later load that did not ask for it. The loopback server picks a free port from a range so parallel jobs do not collide, and serves the **CPU** by name — a served GPU that lacks an op aborts the server (see the RPC section). Also: server devices chosen by name (case-insensitive, deduplicated), an unknown name listing the available devices, and a registered RPC device refused; the mmproj device pinned the way clip would choose it minus the stale server; and `exclude_stale_devices()`, the params-level guard for TTS and the trainer. | -| `src/test/cpp/test_c_api.cpp` | 51 | **The C API (`jllama_api.h`, layer B) without a JVM.** Writes a tiny random two-layer llama GGUF with the GPT-2 byte tokenizer (the public `gguf` API, like `test_kolibri1.cpp`), loads it through `jllama_model_load` and drives the shipped contract: version and build info, null-argument refusal with a message, a missing model failing to load, the load-progress callback (reported, and a `false` return aborts the load), a chat completion that is an OpenAI `chat.completion` object, an invalid request answered as the caller's fault (`JLLAMA_STATUS_INVALID_REQUEST`), streaming until `stop` with the task released afterwards ("Task not found" on the next receive), a released task gone, and the log callback seeing the server's lines with a null set flushing synchronously. Hermetic, so it runs in every `C++ Tests` job without `restore-models`; the output of a random model is noise, the contract is what is asserted. Two things the fixture does on purpose: the output rows of every non-ASCII and special token are scaled to almost nothing, because a byte above 0x7F is an incomplete UTF-8 piece the server holds back rather than streams (a random model that emits only those sends no partial chunk at all), and the task id is checked `>= 0` -- the server numbers its tasks from zero. Then every other `LlamaModel` operation in turn (the meta, raw and OAI completions, raw streaming, the streamed OAI completion (`text_completion` chunks with one id, probabilities, `usage` on the last), the template, tokenize/detokenize, metrics, slots, LoRA, configure, the refusals of a model loaded without `--embedding`/`--reranking`/FIM tokens, the grammar conversion, a Q8_0 quantisation that loads again, several prompts in one request and several completions of one (`"n"` > 1) refused on the blocking, raw and streamed paths while a token array stays one prompt, and every OpenAI answer and chunk carrying a `chatcmpl-` id and the model name, one id per stream), then the other engines: the embedded server in router mode and attached to the model (which still answers after the server stopped), the RPC server over loopback, text to speech refusing missing models, and a fine-tuning run over the random F32 model that writes a GGUF -- which is why `tts_engine.cpp`, `train_engine.cpp` and `native_server_engine.cpp` are in `jllama_test`'s source list. Four model-free cases (`CApiStatic`) run before any load. `CApiSlotFiles` loads the random model with `--slot-save-path`: a saved slot file lands under that directory by its name and restores, and a name with a directory part, `..`, an absolute path or nothing is `JLLAMA_STATUS_INVALID_REQUEST` with nothing written (red before F251: the name was the path, relative to the working directory); a model without the directory refuses save and restore with `JLLAMA_STATUS_ERROR`. Four `CApiRpc` cases pin `jllama_rpc_server_stop()` around the bind and the next serve: a stop issued before ggml binds the socket -- from the serving thread through the test seam `jllama::rpc::set_serve_hook_for_testing()` (`rpc_support.hpp`, not exported), or from another thread while the serve is held in that seam, where the stop must not return before the serve has -- ends the serve instead of being lost (patches/0015 clears ggml's stop flag at the bind; red before F241), a stop while nothing serves does not stop the next serve, and a stop does not reach a serve started while it waits for the one it is for (the stop seam `set_stop_hook_for_testing()` starts the next serve once the stop is recorded; red before F271: the stop waited 30 s for the newcomer and ended it too). Two `CApiFim` cases load the same random model with FIM tokens (`write_tiny_llama_gguf(prefix, true)`): a raw completion with `input_prefix`/`input_suffix`, blocking and streamed, evaluates exactly the prompt `jllama_infill` builds from the same fields, and one of the two fields alone is refused naming the other (red before F246: the completion path completed the empty prompt and dropped both). Two more `CApi` cases pin `messages` on the raw paths: blocking and streamed, the request evaluates exactly the tokens of a completion of the prompt `jllama_apply_template` renders from them (an empty `prompt` beside them counts as none), and a non-empty `prompt` or the infill fields beside them are refused (red before F247: the field was ignored). Two more: the chat fields the raw paths cannot apply beside `messages` (`response_format`, `tools`, `tool_choice`, `parallel_tool_calls`, `top_logprobs`, `thinking_budget_tokens`) are refused by name on both raw paths, and `CApiTemplateStops` loads the random model with an end-of-generation byte of its own (`write_tiny_llama_gguf(prefix, false, 4)`) and a template upstream adds the stop string `` to, which a grammar forces: the raw paths stop there as the chat path does, also beside a `stop` of the request (red before F248: dropped, `stop_type` `eos` and the string in `content`). And `CApiReasoningBudget` loads it with a template that opens a `` block in its generation prompt: a raw completion with `messages` and `reasoning_budget_tokens` 1 completes the forced `` and then the chat path's answer, blocking and streamed, while an output-format grammar beside it still runs (the generation prompt the budget is primed with is left out there); a template without thinking tags leaves the request unchanged (red before F249: the tags were dropped and the budget did nothing). A third case loads the random model with ``, `` and `` as control tokens (`write_tiny_llama_gguf(prefix, false, 4, special)`): the forced end tag reads as text in the raw content, blocking and streamed, and a request's own `preserved_tokens` stays in force beside the template's (red before F250: the session's preserved tokens were not taken over, and the special end tag was an empty piece). A fourth, without `messages`, names the tags in the request with a logit bias that makes the model write the start tag: a budget of zero forces the end tag after each one, and a `reasoning_budget_message` before it (red before F252: without the message the budget forced nothing). Four cases pin the raw multimodal prompt: `CApiVision` loads the random model with a random llava-style vision projector the shared fixture writes too (`write_tiny_mmproj_gguf()`, `--mmproj`) and finds the server's `media_marker` in the model meta; a raw completion whose `prompt` is upstream's `{"prompt_string": "......", "multimodal_data": [""]}` evaluates the text tokens plus the image's four patch embeddings on the blocking, streamed and OpenAI paths (red before F258: refused as if the model had no projector), while markers that do not match the images, data that is not base64, no data and an image at the very end (an abort of the process in `update_slots`) are refused, and the same object on the model without a projector is the caller's fault. `CApiVocabOnly` loads the random model with `--vocab-only`: the meta, tokenize and detokenize calls answer, and a parameterized case per other C function on a model (22 instances: every completion, chat and stream path, the template, embeddings, rerank, infill, metrics, slots, LoRA, configure, systemone, the attached server) is `JLLAMA_STATUS_ERROR` with "`jllama_` is not available in vocab-only mode" (red before F266: a `SIGSEGV` in `llama_vocab::token_bos()` or a wait that never ended). | +| `src/test/cpp/test_rpc_comm.cpp` | 6 | **`patches/0015`'s COMM_INIT and stop contract over real TCP, protocol v8.** Each scenario runs the C API's RPC server in a fresh subprocess with a deadline, so a regression fails instead of hanging the runner: a loopback server opens no wildcard peer listener and a network bind stays an explicit opt-in; a stop with no peer closes both listeners and lets the port be bound again; a stop interrupts a stalled capability handshake of rank 0 and of rank 1; and a successful peer setup still works and stops. No model, GPU or external network. | +| `src/test/cpp/test_c_api.cpp` | 52 | **The C API (`jllama_api.h`, layer B) without a JVM.** Writes a tiny random two-layer llama GGUF with the GPT-2 byte tokenizer (the public `gguf` API, like `test_kolibri1.cpp`), loads it through `jllama_model_load` and drives the shipped contract: version and build info, null-argument refusal with a message, a missing model failing to load, the load-progress callback (reported, and a `false` return aborts the load), a chat completion that is an OpenAI `chat.completion` object, an invalid request answered as the caller's fault (`JLLAMA_STATUS_INVALID_REQUEST`), streaming until `stop` with the task released afterwards ("Task not found" on the next receive), a released task gone, and the log callback seeing the server's lines with a null set flushing synchronously. Hermetic, so it runs in every `C++ Tests` job without `restore-models`; the output of a random model is noise, the contract is what is asserted. Two things the fixture does on purpose: the output rows of every non-ASCII and special token are scaled to almost nothing, because a byte above 0x7F is an incomplete UTF-8 piece the server holds back rather than streams (a random model that emits only those sends no partial chunk at all), and the task id is checked `>= 0` -- the server numbers its tasks from zero. Then every other `LlamaModel` operation in turn (the meta, raw and OAI completions, raw streaming, the streamed OAI completion (`text_completion` chunks with one id, probabilities, `usage` on the last), the template, tokenize/detokenize, metrics, slots, LoRA, configure, the refusals of a model loaded without `--embedding`/`--reranking`/FIM tokens, the grammar conversion, a Q8_0 quantisation that loads again, several prompts in one request and several completions of one (`"n"` > 1) refused on the blocking, raw and streamed paths while a token array stays one prompt, and every OpenAI answer and chunk carrying a `chatcmpl-` id and the model name, one id per stream), then the other engines: the embedded server in router mode and attached to the model (which still answers after the server stopped), the RPC server over loopback, text to speech refusing missing models, and a fine-tuning run over the random F32 model that writes a GGUF -- which is why `tts_engine.cpp`, `train_engine.cpp` and `native_server_engine.cpp` are in `jllama_test`'s source list. Four model-free cases (`CApiStatic`) run before any load. `CApiSlotFiles` loads the random model with `--slot-save-path`: a saved slot file lands under that directory by its name and restores, and a name with a directory part, `..`, an absolute path or nothing is `JLLAMA_STATUS_INVALID_REQUEST` with nothing written (red before F251: the name was the path, relative to the working directory); a model without the directory refuses save and restore with `JLLAMA_STATUS_ERROR`. Four `CApiRpc` cases pin `jllama_rpc_server_stop()` around the bind and the next serve: a stop issued before ggml binds the socket -- from the serving thread through the test seam `jllama::rpc::set_serve_hook_for_testing()` (`rpc_support.hpp`, not exported), or from another thread while the serve is held in that seam, where the stop must not return before the serve has -- ends the serve instead of being lost (patches/0015 clears ggml's stop flag at the bind; red before F241), a stop while nothing serves does not stop the next serve, and a stop does not reach a serve started while it waits for the one it is for (the stop seam `set_stop_hook_for_testing()` starts the next serve once the stop is recorded; red before F271: the stop waited 30 s for the newcomer and ended it too). Two `CApiFim` cases load the same random model with FIM tokens (`write_tiny_llama_gguf(prefix, true)`): a raw completion with `input_prefix`/`input_suffix`, blocking and streamed, evaluates exactly the prompt `jllama_infill` builds from the same fields, and one of the two fields alone is refused naming the other (red before F246: the completion path completed the empty prompt and dropped both). Two more `CApi` cases pin `messages` on the raw paths: blocking and streamed, the request evaluates exactly the tokens of a completion of the prompt `jllama_apply_template` renders from them (an empty `prompt` beside them counts as none), and a non-empty `prompt` or the infill fields beside them are refused (red before F247: the field was ignored). Two more: the chat fields the raw paths cannot apply beside `messages` (`response_format`, `tools`, `tool_choice`, `parallel_tool_calls`, `top_logprobs`, `thinking_budget_tokens`) are refused by name on both raw paths, and `CApiTemplateStops` loads the random model with an end-of-generation byte of its own (`write_tiny_llama_gguf(prefix, false, 4)`) and a template upstream adds the stop string `` to, which a grammar forces: the raw paths stop there as the chat path does, also beside a `stop` of the request (red before F248: dropped, `stop_type` `eos` and the string in `content`). And `CApiReasoningBudget` loads it with a template that opens a `` block in its generation prompt: a raw completion with `messages` and `reasoning_budget_tokens` 1 completes the forced `` and then the chat path's answer, blocking and streamed, while an output-format grammar beside it still runs (the generation prompt the budget is primed with is left out there); a template without thinking tags leaves the request unchanged (red before F249: the tags were dropped and the budget did nothing). A third case loads the random model with ``, `` and `` as control tokens (`write_tiny_llama_gguf(prefix, false, 4, special)`): the forced end tag reads as text in the raw content, blocking and streamed, and a request's own `preserved_tokens` stays in force beside the template's (red before F250: the session's preserved tokens were not taken over, and the special end tag was an empty piece). A fourth, without `messages`, names the tags in the request with a logit bias that makes the model write the start tag: a budget of zero forces the end tag after each one, and a `reasoning_budget_message` before it (red before F252: without the message the budget forced nothing). Four cases pin the raw multimodal prompt: `CApiVision` loads the random model with a random llava-style vision projector the shared fixture writes too (`write_tiny_mmproj_gguf()`, `--mmproj`) and finds the server's `media_marker` in the model meta; a raw completion whose `prompt` is upstream's `{"prompt_string": "......", "multimodal_data": [""]}` evaluates the text tokens plus the image's four patch embeddings on the blocking, streamed and OpenAI paths (red before F258: refused as if the model had no projector), while markers that do not match the images, data that is not base64, no data and an image at the very end (an abort of the process in `update_slots`) are refused, and the same object on the model without a projector is the caller's fault. `CApiVocabOnly` loads the random model with `--vocab-only`: the meta, tokenize and detokenize calls answer, and a parameterized case per other C function on a model (22 instances: every completion, chat and stream path, the template, embeddings, rerank, infill, metrics, slots, LoRA, configure, systemone, the attached server) is `JLLAMA_STATUS_ERROR` with "`jllama_` is not available in vocab-only mode" (red before F266: a `SIGSEGV` in `llama_vocab::token_bos()` or a wait that never ended). | | `src/test/cpp/test_native_server_shutdown.cpp` | 3 | **The runnable guard for the shutdown-handler guard in `patches/0006`/`0007`.** Runs the real `llama_server()` in router mode over an empty `--models-dir` on an ephemeral loopback port (no model, no worker) and stops it the way `native_server.cpp` does. Pins a clean stop (exit code 0), that `llama_server_request_shutdown()` **after** the server returned is a no-op (the deterministic form of the CI `SIGSEGV` — it crashed every run before the fix), and that requests hammered from another thread while the server tears down are safe (5 rounds). Compiled on non-Android only, like `server.cpp` itself. | | `src/test/cpp/test_gallocr_leafs.cpp` | 1 | **The runnable guard for `patches/0020`.** Two graphs with the same two nodes in the same order (`n1 = add(x, x)`, `n2 = mul(w, n1)`) and only the leafs moved: one expands `n1` before `n2` and meets the input first, the other expands only `n2`, whose first source is the weight -- the shape of the llama.cpp case, where every node and node source still matches its slot, so the old check passed it. Reserved with the first, the second must get an allocation for the input inside the allocator's buffer and compute the right product on it. No model, every platform. **Verified both ways:** with the fix removed from the source tree the test dies with SIGSEGV (rc 139); a first version that swapped the operands of one `add` passed without the fix, because a swapped *node source* was already caught -- a guard has to move only the leafs. | | `src/test/cpp/test_lora_cache.cpp` | 5 | **The runnable guard for `patches/0021`.** Writes a random llama model (the shared `tiny_llama_gguf.hpp`, also used by `test_c_api.cpp`) and a random LoRA adapter on K, V and the FFN output of every layer, loads them with one slot and `--cache-ram 0`, and answers the same prompt greedily. After `jllama_set_lora_adapters` (scale 1 -> 0 and back) and after a request with its own adapters, the warm slot must answer exactly like an emptied one. One case guards the others against passing vacuously: the adapter changes the answer, and a repeated request reuses the cache (`timings.cache_n > 0`; not `tokens_cached`, which counts every token the slot holds and is positive after any request). After each adapter change the next request must take nothing from the cache (`timings.cache_n == 0`), so those three cases are red without the patch whether or not the random model happens to answer differently. **Verified both ways:** without the patch 3 of 4 red (the warm slot answered from the old scales), with it 4 of 4 green in three runs; no model, every platform. A second fixture (`LoraCacheFreshSlot`: two slots, `--slot-save-path`) saves slot 0 (by its file name inside that directory) after a request and restores it into the never-used slot 1, whose request must take all of the prompt but at most two tokens from it and answer like slot 0 -- red before the `init()` hunk (`Expected: (prompt_n) <= (2), actual: 77 vs 2`), green with it (F240). | -**Current total: 664 tests (all passing).** +**Current total: 671 tests** (`TEST`/`TEST_F`/`TEST_P` definitions; ctest counts 692 cases, because +the parameterized `CApiVocabOnly` case expands to 22 instances). #### Upstream source location (in CMake build tree) -llama.cpp is fetched via CMake FetchContent, pinned to `JLLAMA_GIT_TAG b11827`. +llama.cpp is fetched via CMake FetchContent, pinned to `JLLAMA_GIT_TAG b11881`. **GoogleTest** is a separate `BUILD_TESTING`-only FetchContent (`GIT_TAG v1.18.0`), used solely by the `jllama_test` C++ unit-test binary — not by the shipped library, and not coupled to the @@ -2866,7 +2908,7 @@ EXPECT_FALSE(j.contains("stop_type")); // filtered out ## Key Constraints -- **Java 8+** runtime required. Built with JDK 21 targeting bytecode 1.8 for broad compatibility. +- **Java 8+** runtime required. Built with JDK 25 targeting bytecode 1.8 for broad compatibility. - Native memory allocated by llama.cpp is not GC-managed — always use `LlamaModel` in try-with-resources or call `close()` explicitly. - The `server.hpp` file is adapted from llama.cpp upstream — minimize modifications to ease future upgrades. - Platform-specific native libraries must be pre-built and placed under `src/main/natives/` before packaging for distribution (CI does this; see "Natives jars"). @@ -3067,7 +3109,7 @@ file shows `cmake -B build` / `src/main/...` / `mvn compile` at the root, read i **Version bump:** the child modules declare **no `` of their own** — their *project* version is inherited from the parent. But each child still hardcodes the parent version inside its `` pointer (Maven requires a literal there — there is **no `${revision}`/CI-friendly -versioning** here), so a version change must be applied to **all five poms in lockstep**: +versioning** here), so a version change must be applied to **all six poms in lockstep**: - `pom.xml` (root) — `` - `llama/pom.xml` — `` @@ -3084,8 +3126,8 @@ root (it updates the parent and every child `` reference at once). Chang `` leaves the children pointing at a non-existent parent and **fails the reactor build** (`Could not find artifact net.ladenthin:llama-parent:pom:X.Y.Z`). -`versions:set` only rewrites the **poms**. The **two README files** that carry hardcoded -release-version dependency snippets must be bumped **manually and in the same commit** — miss either +`versions:set` only rewrites the **poms**. Hardcoded release-version dependency snippets in the +README files and examples listed below must be bumped **manually and in the same commit** — miss one and the published docs point consumers at the previous release. (The `llama-langchain4j/README.md` snippet was exactly the one forgotten on the `5.0.4 → 5.0.5` bump; it is listed here so it is not missed again.) @@ -3094,9 +3136,7 @@ missed again.) `` template), and the `llama-langchain4j` snippet. The Maven Central **badge** auto-pulls the latest released version, so leave it. The **`-SNAPSHOT` line** in the "Snapshot builds" section documents the snapshot channel — set it to the *next* dev version, not the release. - (The per-classifier snippets were **deduplicated** to a single canonical + template pair, so the - release version now appears in only ~4 spots here, not ~20 — the runtime details live once in the - classifier table.) + Update the runnable server, agent and native-download examples as well as dependency snippets. - **`examples/jbang/Chat.java`** — the version in its `//DEPS` lines; `check-natives.py` holds it to the README install snippet's version, so forgetting it fails `code-style`. - **`llama-langchain4j/README.md`** — its own `` snippet. @@ -3155,17 +3195,10 @@ the "Java 22+ over the C API" item of the delivery roadmap (TODO.md item 10), de `Automatic-Module-Name: net.ladenthin.llama.ffm`. The compiler runs `-Xlint:all -Werror` minus `restricted` (every FFM call is one) and `classfile` (the core's checker-qual annotations are provided scope there and absent here). Surefire passes `--enable-native-access=ALL-UNNAMED`. -- **Toolchain.** The reactor builds with the JDK of `.java-version` (21, a shared file of the four - repositories). The profile `toolchain-jdk22` (active on a JDK below 22) runs `maven-toolchains-plugin` - with `[22,)`, so the compiler, surefire and javadoc of this module use - a JDK 22+ from `~/.m2/toolchains.xml` while Maven itself stays on 21; on a JDK 22+ the profile is - inactive. **Every job that runs Maven over the whole reactor therefore registers a second JDK**: - `package`, `publish-snapshot`, `publish-release` and the module's own `test-java-llama-ffm` each - have a `setup-java` step with `java-version: '25'` (the current LTS above the floor) **before** the - `.java-version` one -- setup-java writes a `toolchains.xml` entry per installed JDK and the last - step keeps `JAVA_HOME` on 21. `build-core` (`-pl llama -am`) never reaches the module and stays as it - is. Locally: unpack a Temurin 22+ (the Adoptium GitHub releases are reachable where - `api.adoptium.net` is not) and write the entry by hand. +- **Toolchain.** The reactor uses JDK 25 from the shared `.java-version`. The core still targets + Java 8, this optional module targets Java 22, and test release settings remain unchanged. + CI needs one JDK installation. The `toolchain-jdk22` profile remains a local fallback for + Maven running below JDK 22, selecting a registered JDK 22+ from `~/.m2/toolchains.xml`. - **CI**: `test-java-llama-ffm` (`needs: [crosscompile-linux-x86_64, verify-model-cache]`) downloads the Linux x86-64 natives, restores the models, builds the core, runs `mvn -f llama-ffm/pom.xml verify` with `lib.path` and the draft model, and fails when `FfmLlamaModelIntegrationTest` skipped @@ -3267,7 +3300,7 @@ certificate and the secrets exist. `overwrite: true` upload per Windows row of `natives.csv`, the job waits for every job that uploads one of them, and it carries no job-level `if:` (the chain rule above; a step-level gate is what it uses). -- **What the owner does, in order** (TODO.md item 11 and "Code-sign the Windows DLLs" carry the +- **What the owner does, in order** (TODO.md, delivery roadmap, item 11 carries the details and the prices): delete the Azure Trusted Signing account; SSL.com's IV validation; the IV code-signing certificate enrolled in eSigner; the TOTP secret and the credential id from the eSigner settings; the four secrets into the `maven-central` environment; a dispatch with @@ -3352,12 +3385,13 @@ the recommended path (README "Importing in Android", Option 1): desktop. Both carry a `minSdkVersion 28` manifest (AGP enforces the floor on consumers), and consumer R8/ProGuard rules (`consumer-proguard.txt` → `proguard.txt` in the AAR; keeps `net.ladenthin.llama.**` for the JNI `FindClass`/Jackson reflection surface). The AAR's - `classes.jar` is the **byte-identical Maven-built classes jar** minus `module-info.class` (D8 + CPU AAR's `classes.jar` is the **byte-identical Maven-built classes jar** minus `module-info.class` (D8 rejects it) — it carries no natives, which ship as separate natives jars; on Android `LlamaLoader` resolves via `System.loadLibrary("jllama")`, which finds the AAR-installed `.so` — no loader change was needed. `registerAarTask` copies `**/*.so` only (the `jllama-*.txt` lists are desktop loader input) and fails loud on the flavor's defining library per ABI; the CI job validates the - full set. Built by the **standalone plain-Gradle build** in `llama-android/` + full set. The additive OpenCL AAR has an empty `classes.jar`: its CPU AAR dependency already + supplies the Java API, and duplicating it breaks D8/R8. Built by the **standalone plain-Gradle build** in `llama-android/` (see "Repository layout" for why it is not a Maven module); the POM mirrors the core's compile-scope deps (jackson/slf4j-api/jspecify/checker-qual, versions parsed from `llama/pom.xml` — deliberately NOT the SLF4J binding, which is the JVM-only runtime dependency). @@ -3396,8 +3430,9 @@ own; the AAR job additionally asserts the AAR's `jni/` library is the staged one `package-android-aar` (needs both Android native jobs) builds the core jar, stages the natives, assembles both AARs, validates structure (entries, minSdk, classes.jar content, 16 KB alignment), publishes to mavenLocal, and runs the **AGP consumer smoke test** — the minimal app fixture in -`.github/android-consumer-test/` resolves the AAR from mavenLocal and runs a full R8 -`assembleRelease` on the runner's preinstalled Android SDK (this is what actually validates +`.github/android-consumer-test/` resolves each AAR from mavenLocal (`jllamaBackend=cpu` and +`jllamaBackend=opencl`, the latter with its transitive CPU AAR) and runs a full R8 +`assembleRelease` for each on the runner's preinstalled Android SDK (this is what actually validates AGP/Android Studio consumption). **On-device runtime IS now CI-covered** via `test-android-emulator`: a KVM-accelerated x86_64 emulator (API 30) runs the fixture's `connectedDebugAndroidTest` — `System.loadLibrary` from the AAR's `jni/x86_64`, on-device @@ -3406,10 +3441,13 @@ AGP/Android Studio consumption). **On-device runtime IS now CI-covered** via publish `needs:` graphs) since PR #298, after running flake-free through the PR's validation cycle. arm64 kernels + the Adreno/OpenCL flavor remain out of emulator scope — the planned example app covers those on hardware. -Both publish jobs `need` these jobs (fail-loud release gating) and publish the AARs via Gradle: -snapshots to the Central snapshots repo (`publishAllPublicationsToCentralSnapshotsRepository`), -releases as a signed Central Portal bundle upload (staging repo → zip → Publisher API). -`llama-kotlin` rides the normal reactor `mvn -P release deploy`. +Both publish jobs `need` these jobs (fail-loud release gating) and stage the signed AARs with +Gradle into `llama-android/build/staging-repo` (`publishAllPublicationsToStagingRepository`, a file +repository), a Central root of `.github/release-assets.json`; `central-snapshot` / `central-release` +transfer them with the rest of the frozen publication (see "Signed publication"). For a snapshot +Gradle writes timestamped names there (`llama-android---.aar`, also into a +file repository), which the gate maps back to `-SNAPSHOT`. `llama-kotlin` rides the reactor's +staged deploy. ## Local coding agent with Atmosphere (`llama-atmosphere-agent/`, standalone) @@ -3465,3 +3503,34 @@ pinned defensively because of it — see that file), and merge-discipline guidan Open TODOs for this repo live in [`TODO.md`](TODO.md). Cross-repo status tracking lives in [`../workspace/crossrepostatus.md`](../workspace/crossrepostatus.md). + +## Signed publication: one gate, three independent consumers + +Shared byte for byte by the four Java repositories (`.github/shared-files.sha256`); the full text is +[`docs/publication-preflight.md`](docs/publication-preflight.md), the JSON contract and the sync rules +[`../workspace/policies/release-asset-scripts.md`](../workspace/policies/release-asset-scripts.md). + +- **`check-snapshot` / `check-tag`** run `publication.py check-ref`: a release publishes only from the + tag `v` of a non-SNAPSHOT version, a snapshot only a `-SNAPSHOT` version and never from a + tag (the snapshot check only when the run publishes: `main` carries the release version for the + commit a release is tagged on). +- **`publish-snapshot` / `publish-release`** build and sign everything, stage the Central files + locally (`-DskipUpload=true deploy`, here plus the Gradle staging repository of the AARs) and end in + the composite action `finalize-publication`: `collect-release-assets.py`, then + `publication.py prepare --channel `, the one gate. It checks the version against the + channel and `GITHUB_REF`, exact membership of the Central staging (every artifact with its own + signature, no orphan, no unknown file; Maven metadata and checksums are ignored, Gradle's + timestamped snapshot names are mapped back to `-SNAPSHOT`) and of the GitHub files against the + contract, names GitHub would rename, byte equality of each Central file with its GitHub twin, and + every signature with `gpg --verify`. It freezes `central/`, `github/` and `manifest.json` + (commit, version, channel, size and SHA-256 per file), and only after the Actions upload of that + package does the job output `assets_complete=true`. +- **The consumers** each `need` only that job and that output, never each other: + `github-snapshot` / `github-release` (attach the `github/` files; the rolling `snapshot` + pre-release through `update-snapshot.py`), `central-snapshot` / `central-release` + (`publication.py upload`: the release as one Portal bundle with `publishingType=AUTOMATIC`, no + validation polling; the snapshot through `maven-deploy-plugin:deploy-file`, serialized by a + concurrency group and skipped when another run already transferred a newer commit), and + `attest-snapshot` / `attest-release` (Sigstore over `github/*`). Each verifies the manifest after + the download; none rebuilds or re-signs. A failed Central transfer leaves the GitHub release and + the attestation in place, and the other way round. diff --git a/LICENSES/BSD-2-Clause.txt b/LICENSES/BSD-2-Clause.txt new file mode 100644 index 000000000..5f662b354 --- /dev/null +++ b/LICENSES/BSD-2-Clause.txt @@ -0,0 +1,9 @@ +Copyright (c) + +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. + +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. diff --git a/LICENSES/BSD-3-Clause.txt b/LICENSES/BSD-3-Clause.txt new file mode 100644 index 000000000..ea890afbc --- /dev/null +++ b/LICENSES/BSD-3-Clause.txt @@ -0,0 +1,11 @@ +Copyright (c) . + +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. diff --git a/LICENSES/ISC.txt b/LICENSES/ISC.txt new file mode 100644 index 000000000..e80998f07 --- /dev/null +++ b/LICENSES/ISC.txt @@ -0,0 +1,7 @@ +ISC License + +Copyright + +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. diff --git a/LICENSES/LicenseRef-public-domain.txt b/LICENSES/LicenseRef-public-domain.txt new file mode 100644 index 000000000..bfe223c7e --- /dev/null +++ b/LICENSES/LicenseRef-public-domain.txt @@ -0,0 +1 @@ +This work is dedicated to the public domain by its author; no rights are reserved. diff --git a/LICENSES/MIT-0.txt b/LICENSES/MIT-0.txt new file mode 100644 index 000000000..a4e9dc906 --- /dev/null +++ b/LICENSES/MIT-0.txt @@ -0,0 +1,16 @@ +MIT No Attribution + +Copyright + +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. + +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/LICENSES/MPL-2.0.txt b/LICENSES/MPL-2.0.txt new file mode 100644 index 000000000..ee6256cdb --- /dev/null +++ b/LICENSES/MPL-2.0.txt @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at https://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/LICENSES/Unicode-3.0.txt b/LICENSES/Unicode-3.0.txt new file mode 100644 index 000000000..11f2842a3 --- /dev/null +++ b/LICENSES/Unicode-3.0.txt @@ -0,0 +1,39 @@ +UNICODE LICENSE V3 + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 1991-2023 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. diff --git a/LICENSES/Unlicense.txt b/LICENSES/Unlicense.txt new file mode 100644 index 000000000..cde4ac698 --- /dev/null +++ b/LICENSES/Unlicense.txt @@ -0,0 +1,10 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means. + +In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law. + +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 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. + +For more information, please refer to diff --git a/README.md b/README.md index 8b3c08460..632678a26 100644 --- a/README.md +++ b/README.md @@ -7,11 +7,12 @@ **AI:** [![Claude](https://img.shields.io/badge/Claude-D97757?logo=claude&logoColor=fff)](#) +[![CodeRabbit Pull Request Reviews](https://img.shields.io/coderabbit/prs/github/bernardladenthin/java-llama.cpp?utm_source=oss&utm_medium=github&utm_campaign=bernardladenthin%2Fjava-llama.cpp&labelColor=171717&color=FF570A&label=CodeRabbit+Reviews)](https://coderabbit.ai) **Build:** ![Java 8+](https://img.shields.io/badge/Java-8%2B-informational) ![Platform](https://img.shields.io/badge/Platform-Linux%20%7C%20macOS%20%7C%20Windows%20%7C%20Android-lightgrey) -[![llama.cpp b11827](https://img.shields.io/badge/llama.cpp-%23b11827-informational)](https://github.com/ggml-org/llama.cpp/releases/tag/b11827) +[![llama.cpp b11881](https://img.shields.io/badge/llama.cpp-%23b11881-informational)](https://github.com/ggml-org/llama.cpp/releases/tag/b11881) [![JPMS](https://img.shields.io/badge/JPMS-modular%20JAR-25A162)](https://openjdk.org/projects/jigsaw/) ![JUnit](https://img.shields.io/badge/tested%20with-JUnit6-25A162) [![JSpecify](https://img.shields.io/badge/JSpecify-1.0.1%20%40NullMarked-25A162)](https://jspecify.dev) @@ -1332,6 +1333,9 @@ server, and this library's `RpcServer` works for any llama.cpp client. > opt-in for another interface and logs a warning. Across machines, use a trusted network or a > tunnel (SSH, WireGuard). +Peer listeners used by tensor-split RPC inherit that same bind address. Stopping the server +also interrupts peer setup when the other server is absent or has not completed its handshake. + What to know: - **An unreachable server fails the load** with a `LlamaException` naming it, instead of reaching @@ -1819,12 +1823,13 @@ files flat next to it, if you use one) and start the JVM with desktop platform.) A signed DLL is also what lets such a policy allow the files by publisher instead of by hash. -### Contributors: build with Temurin 21, not Oracle JDK 21 +### Contributors: build with Temurin 25 -`llama/pom.xml` passes `-XDaddTypeAnnotationsToSymbol=true` to `javac` (NullAway's JSpecify mode -needs it below JDK 22). **Oracle JDK 21 rejects that flag**: `mvn compile` dies in an Error Prone -`IllegalStateException` naming it (measured on 21.0.9). Eclipse Temurin 21, which CI uses, compiles -the same tree; `mvn -version` shows which JDK Maven runs on. +CI and `.java-version` use Temurin 25. This is the build JDK, not the runtime floor: +the core still compiles with `--release 8`, and other modules retain their declared targets. +`mvn -version` shows the JDK Maven actually uses. Historically, Oracle JDK 21 rejected the +`-XDaddTypeAnnotationsToSymbol=true` flag required by NullAway below JDK 22; Temurin 21 +accepted it. That older-JDK incident does not require raising any bytecode target. ### Contributors: do not upgrade jqwik past 1.9.3 diff --git a/REUSE.toml b/REUSE.toml index 87f23ded6..194bbe0ce 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -140,6 +140,203 @@ path = [ SPDX-FileCopyrightText = "1996-2023 Oracle and/or its affiliates" SPDX-License-Identifier = "GPL-2.0-only WITH Classpath-exception-2.0" +# The license texts of the third-party code compiled into the natives (llama/legal/natives/, +# copied into every natives jar; NOTICE.md there is the index). Each folder holds texts taken byte +# for byte from its upstream, which its SOURCE.txt names. + +[[annotations]] +path = "llama/legal/natives/java-llama.cpp/**" +precedence = "override" +SPDX-FileCopyrightText = "2026 Bernard Ladenthin " +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "llama/legal/natives/llama.cpp/**" +precedence = "override" +SPDX-FileCopyrightText = "2023-2026 The ggml authors" +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "llama/legal/natives/nlohmann-json/**" +precedence = "override" +SPDX-FileCopyrightText = "2013-2025 Niels Lohmann" +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "llama/legal/natives/cpp-httplib/**" +precedence = "override" +SPDX-FileCopyrightText = "2017 yhirose" +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "llama/legal/natives/boringssl/**" +precedence = "override" +SPDX-FileCopyrightText = "The BoringSSL Authors" +SPDX-License-Identifier = "Apache-2.0 AND BSD-3-Clause" + +[[annotations]] +path = "llama/legal/natives/xxhash/**" +precedence = "override" +SPDX-FileCopyrightText = "Yann Collet" +SPDX-License-Identifier = "BSD-2-Clause" + +[[annotations]] +path = "llama/legal/natives/sha256-jb55/**" +precedence = "override" +SPDX-FileCopyrightText = "William Casarin" +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "llama/legal/natives/rotate-bits/**" +precedence = "override" +SPDX-FileCopyrightText = "2021 William Casarin " +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "llama/legal/natives/sha1-clibs/**" +precedence = "override" +SPDX-FileCopyrightText = "Steve Reid" +SPDX-License-Identifier = "LicenseRef-public-domain" + +[[annotations]] +path = "llama/legal/natives/stb_image/**" +precedence = "override" +SPDX-FileCopyrightText = "2017 Sean Barrett" +SPDX-License-Identifier = "MIT OR Unlicense" + +[[annotations]] +path = "llama/legal/natives/miniaudio/**" +precedence = "override" +SPDX-FileCopyrightText = "David Reid" +SPDX-License-Identifier = "Unlicense OR MIT-0" + +[[annotations]] +path = "llama/legal/natives/sheredom-subprocess/**" +precedence = "override" +SPDX-FileCopyrightText = "Neil Henning" +SPDX-License-Identifier = "Unlicense" + +[[annotations]] +path = "llama/legal/natives/base64-hpp/**" +precedence = "override" +SPDX-FileCopyrightText = "base64.hpp authors" +SPDX-License-Identifier = "Unlicense" + +[[annotations]] +path = "llama/legal/natives/llamafile-sgemm/**" +precedence = "override" +SPDX-FileCopyrightText = "2023 Mozilla Foundation" +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "llama/legal/natives/arm-optimized-routines/**" +precedence = "override" +SPDX-FileCopyrightText = "1999-2022 Arm Limited" +SPDX-License-Identifier = "MIT OR Apache-2.0 WITH LLVM-exception" + +[[annotations]] +path = "llama/legal/natives/yarn/**" +precedence = "override" +SPDX-FileCopyrightText = "The YaRN authors" +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "llama/legal/natives/ggllm.cpp/**" +precedence = "override" +SPDX-FileCopyrightText = "2023 cmp-nct" +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "llama/legal/natives/pillow/**" +precedence = "override" +SPDX-FileCopyrightText = "1997-2011 Secret Labs AB; 1995-2011 Fredrik Lundh and contributors" +SPDX-License-Identifier = "MIT-CMU" + +[[annotations]] +path = "llama/legal/natives/openvino/**" +precedence = "override" +SPDX-FileCopyrightText = "Intel Corporation" +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "llama/legal/natives/unicode/**" +precedence = "override" +SPDX-FileCopyrightText = "Unicode, Inc." +SPDX-License-Identifier = "Unicode-3.0" + +[[annotations]] +path = "llama/legal/natives/webui-big-integer/**" +precedence = "override" +SPDX-FileCopyrightText = "Peter Olson" +SPDX-License-Identifier = "Unlicense" + +[[annotations]] +path = "llama/legal/natives/webui-decimal.js/**" +precedence = "override" +SPDX-FileCopyrightText = "Michael Mclaughlin" +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "llama/legal/natives/webui-nerdamer-prime/**" +precedence = "override" +SPDX-FileCopyrightText = "The nerdamer authors" +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "llama/legal/natives/cccl/**" +precedence = "override" +SPDX-FileCopyrightText = "NVIDIA Corporation" +SPDX-License-Identifier = "Apache-2.0 WITH LLVM-exception AND Apache-2.0 AND BSD-3-Clause" + +[[annotations]] +path = "llama/legal/natives/hip/**" +precedence = "override" +SPDX-FileCopyrightText = "Advanced Micro Devices, Inc." +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "llama/legal/natives/onednn/**" +precedence = "override" +SPDX-FileCopyrightText = "2016-2025 Intel Corporation" +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "llama/legal/natives/vulkan-headers/**" +precedence = "override" +SPDX-FileCopyrightText = "The Khronos Group Inc." +SPDX-License-Identifier = "Apache-2.0 OR MIT" + +[[annotations]] +path = "llama/legal/natives/spirv-headers/**" +precedence = "override" +SPDX-FileCopyrightText = "2015-2024 The Khronos Group Inc." +SPDX-License-Identifier = "MIT AND MIT-Khronos-old" + +[[annotations]] +path = "llama/legal/natives/opencl-headers/**" +precedence = "override" +SPDX-FileCopyrightText = "The Khronos Group Inc." +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "llama/legal/natives/opencl-clhpp/**" +precedence = "override" +SPDX-FileCopyrightText = "The Khronos Group Inc." +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "llama/legal/natives/webui-npm/THIRD-PARTY-LICENSES.txt" +precedence = "override" +SPDX-FileCopyrightText = "The authors of the npm packages it names" +SPDX-License-Identifier = "MIT AND ISC AND BSD-3-Clause AND BSD-2-Clause AND Apache-2.0 AND Unlicense AND MPL-2.0" + +# Generated or written here: provenance notes, the package list and the lockfile digest. +[[annotations]] +path = ["llama/legal/natives/**/SOURCE.txt", "llama/legal/natives/webui-npm/packages.csv", "llama/legal/natives/webui-npm/LOCKFILE.sha256"] +precedence = "override" +SPDX-FileCopyrightText = "2026 Bernard Ladenthin " +SPDX-License-Identifier = "MIT OR Apache-2.0" + # The issue/PR templates are kept byte-identical in java-llama.cpp, BitcoinAddressFinder, srcmorph # and streambuffer (.github/shared-files.sha256) and carry the license of the other shared files. # Last in this file on purpose: of several matching annotations the last one applies. diff --git a/THIRD_PARTY.md b/THIRD_PARTY.md new file mode 100644 index 000000000..d2cfa406e --- /dev/null +++ b/THIRD_PARTY.md @@ -0,0 +1,41 @@ + + +# Third-party license and attribution notes + +The core is MIT. JMH/JCStress, Lincheck, JUnit and jqwik are test dependencies. +Logback is used by test tools; the core runtime binder is SLF4J Simple. +The standalone atmosphere agent has additional runtime dependencies (Jetty EE10, Atmosphere, JLine, +the ACP SDK); its folder carries its own `LICENSE` and `THIRD_PARTY.md`. +The natives jars and the Android AARs contain compiled third-party code: llama.cpp/ggml and what it +vendors, BoringSSL, the GPU vendors' header libraries and the npm packages of the embedded WebUI. +Their license texts travel with them (see below; `llama/legal/natives/NOTICE.md` is the index). + +## Review evidence + +See [the dependency license review](docs/dependency-license-review.md) in the source repository +for exact-version evidence and remaining decisions. This inventory is not an approval of all +licenses found by a scanner. Test-tool redistribution requires a separate review. + +For unchanged Maven components, source is available from +`https://repo.maven.apache.org/maven2////` +as `--sources.jar`; POMs and upstream source repositories provide provenance. +Preserve copyright, license and NOTICE files when redistributing dependencies. + +java-llama.cpp ships no fat JAR, and Maven resolves every dependency as an artifact of its own, +with its own legal files. Each JAR built from a module's classes (and the CPU AAR, whose +`classes.jar` is the core's) carries this file and `LICENSE` under +`META-INF/third-party/net.ladenthin//`. Every natives JAR carries +`llama/legal/natives/` under `META-INF/third-party/natives/` (the AARs inside their `classes.jar`, +under `META-INF/third-party//natives/`): java-llama.cpp's own `LICENSE`, the texts of +every component compiled into a natives directory, each from its upstream byte for byte (its +`SOURCE.txt` says where), and the npm package texts of the WebUI (`webui-npm/`, generated by +`.github/webui-licenses.py` from the pinned `tools/ui/package-lock.json`, which `build-webui` +checks). A jar carries the texts of every kind of natives directory; `NOTICE.md` says which +component is in which. +`.github/collect-third-party-licenses.py`, which collects dependency legal files into the runnable +fat JARs of BitcoinAddressFinder and srcmorph, is kept here byte-identical with them but not run. +This source-location statement does not clear unknown proprietary or historical Git findings. diff --git a/TODO.md b/TODO.md index e729416d1..88ccb066e 100644 --- a/TODO.md +++ b/TODO.md @@ -6,476 +6,137 @@ SPDX-License-Identifier: MIT # TODO — java-llama.cpp -Open work items for this repo. Cross-cutting tracking lives in +Open work items and the decisions that constrain them. Cross-cutting tracking lives in [`../workspace/crossrepostatus.md`](../workspace/crossrepostatus.md); items here are jllama-specific or are this repo's slice of a cross-cutting initiative. **Completed work is not recorded here.** It lives in git history and in `crossrepostatus.md`; a finished item is deleted from this file rather than annotated, -so everything below is genuinely still open. - -## Delivery roadmap -- the master list (work top to bottom; 2026-10-15) - -The plan behind this section was written on 2026-10-15 after a read-only review of the loader, the -CMake build, the natives jars, the publish pipeline and the three consumers (srcmorph, the server -example, the agent). **This section is the master for that work: items are done in this order, each -item is deleted here when it lands, and a reason is written here when an item is deliberately -skipped or re-ordered.** The code-signing items are the one exception by the owner's decision: they -stay open at the end until everything else runs (see "Code-sign the Windows DLLs" below). - -**What the review established, so nobody re-derives it.** The "ship a small Java artefact and let -the user put the DLLs next to it" model already exists since the modular natives (6.0.0): -`net.ladenthin:llama` is classes only, every native build is its own classifier jar holding exactly -one directory, that directory has the same layout as upstream's own release zips (`GGML_BACKEND_DL`, -one CPU library set plus one `ggml-` module per GPU jar, additive), a jar is a zip, and -`net.ladenthin.llama.lib.path` loads such a directory without extracting anything. What is missing -is not a new artefact type but (A) the directory as a *tested contract* -- the `lib.path` branch is a -bare `System.load` that reads neither `jllama-extras.txt` nor `jllama-build.txt`, so on Windows the -modular layout almost certainly fails from a user directory (`jllama.dll` imports `ggml.dll`, which -Windows does not search next to the DLL), and only Linux CI uses the branch; (B) a *clean* native -library: `jllama` exports JNI only on Windows and leaks every statically linked llama/common/mtmd -symbol on Linux/macOS with no header contract, and nothing of what this project adds is callable -without a JVM; (C) *verifiable* delivery: the `.asc` proves the key, not the build -- no provenance -attestation, no SBOM, every workflow action pinned to a moving tag, llama.cpp fetched by tag name -once upstream has tagged it, and `jllama-build.txt` naming neither the patches nor the commit that -are the whole point of "we ship more than upstream". A separate "embedded llama.cpp" library with -its own C ABI was considered and rejected in favour of **two layers in one natives directory**: -upstream's own `llama.h`/`mtmd.h`/`ggml.h` as shared libraries from the patched source (layer A, the -drop-in surface, patches there stay upstream-shaped and are submitted without waiting), and a -`jllama_*` C API in `jllama` for everything upstream will never offer (layer B, with JNI as a thin -shell over it). Not done, on purpose: zip/tarball release assets of the raw libraries (the jar is the -zip), fat jars, a Maven plugin for embedding, `GGML_BACKEND_PATH` as a documented second search path. - -### 2. The natives directory as a first-class contract (A) - -*(Landed 2026-10-15: `LlamaLoader.loadFromDirectory` for `lib.path` and `java.library.path` with the -jar branch's logic, the fresh-JVM `NativeLibraryLoadSmokeTest` on every Java test job, round 3 of -every smoke row and the macOS smoke, README "Natives outside Maven", the stale lines. Items 1 and 2 -of this roadmap are done; the contract text stays in README and CLAUDE.md.)* - -### 3. Hard pinning (C.2) -- four repos - -*(Landed 2026-10-15: every `uses:` of the four repositories pinned to a commit SHA with the tag in a -comment, Dependabot keeps them current; `JLLAMA_REQUIRE_COMMIT` under GitHub Actions refuses a -llama.cpp fetch by tag name and the commit stays set after the tag exists; googletest by commit; the -sccache archives (Linux and Windows) against pinned SHA-256s; the CUDA redist archives against -NVIDIA's own manifest, the OpenVINO archives and the Vulkan arm64 installer against the checksum -each vendor publishes next to the file.)* Still open, each with the reason: - -- [ ] **Pin the vendor checksums into `publish.yml`** (`OPENVINO_LINUX_SHA256`, `OPENVINO_WINDOWS_SHA256`, - `VULKAN_SDK_SHA256`; `CUDA_REDIST_MANIFEST` is pinned to `13.4.3` since the first run printed - it): the steps verify against the vendor's published value when the variable is empty and print - both values in full; the session that wrote them could not reach `developer.download.nvidia.com`, - `storage.openvinotoolkit.org` or `sdk.lunarg.com` (proxy 403), so a Publish run is where the - values are read off the log and pinned. Until then a swapped archive on the vendor host would - pass; a truncated or wrong download does not. **What the first full run (38808518362) taught, - all three Windows steps red on their install:** `Invoke-WebRequest` returns an octet-stream - `.sha256` as `byte[]`, and `-split` on a byte array stringifies the bytes in decimal, so the - OpenVINO step compared against `53` (ASCII `'5'`, the hash's first character) -- the published - files are fetched with `curl.exe` as text now, like the Linux job; LunarG's checksum endpoint is - `sdk/sha///.txt`, not `sdk/sha256/` (404), and a failed fetch now names the - measured hash so it can be pinned after a check on a trusted machine instead of costing another - run; and the CUDA archive names come from the manifest (`relative_path`) instead of upstream's - hand-written list, whose `cuda_crt 13.4.59` was not the `cuda_crt` the newest manifest hashes. -- [ ] **The oneAPI installers have no checksum endpoint** Intel publishes next to the files (since the b11800 - bump both SYCL jobs take upstream's: Deep Learning Essentials 2026.1.4 and oneDNN 2026.0.2 for Linux - and Windows, `ONEAPI_DLE_URL` / `ONEAPI_ONEDNN_URL` in `publish.yml`); pinning needs one download of - each installer on a machine that can reach `registrationcenter-download.intel.com`, then `sha256sum` / - `Get-FileHash` into a check like the Vulkan one. The Level Zero debs and SDK zip come from a GitHub - release and could be hashed the same way. -- [ ] **ROCm wheels come from a moving index** (`stable.repo.amd.com/rocm/whl-next/`, version-pinned - with `==` but not hashed): `pip install --require-hashes` needs a requirements file with the - hash of every wheel of `rocm[libraries,devel]`, which only a machine that can download the - multi-GB wheel set can write (`pip download` + `pip hash`). Upstream's `release.yml` has the - same gap. -- [ ] BoringSSL stays on upstream's pin (`BORINGSSL_VERSION` in `vendor/cpp-httplib/CMakeLists.txt`, - a tag name): a commit pin there is upstream's change to make; recorded, not worked around. - -### 4. Export hygiene (B.1) - -*(Landed 2026-10-15: hidden visibility for `jllama`'s own units, a version script on ELF and an -exported-symbols list on macOS keeping every statically linked symbol local, and -`verify-native-deps.py` holding the export set of every `jllama` library to `JNI_OnLoad`, -`JNI_OnUnload`, `Java_*`, `jllama_*` -- measured 14,220 -> 47 exports on Linux.)* - -### 5. Layer A: upstream's C API shipped next to `jllama` (B.A) - -(Landed 2026-10-15: `llama` and `mtmd` are shared libraries next to `libjllama` in every -`JLLAMA_BACKEND_DL` build, `llama-common` static inside it, `c_abi` -- a plain-C program over the -shared `llama` -- the first `ctest` of the modular jobs; CLAUDE.md "Modular natives". Still open: -macOS and s390x stay static, the C program loads a model only where `JLLAMA_C_ABI_MODEL` is set -- -no CI job sets it yet, so the model-backed half of that test is unmeasured.) - -### 6. Source archive and mirror -- independence from upstream's repository - -(Landed 2026-10-15: `archive-llama-source` + `test-source-archive` + the signed -`llama.cpp-b-jllama--src.tar.gz` asset, `mirror-llama-source` after a release, -`JLLAMA_GIT_REPOSITORY`; CLAUDE.md "Source archive and mirror". **Owner: create the -`LLAMA_MIRROR_TOKEN` secret (contents:write on `bernardladenthin/llama.cpp`) in the `maven-central` -environment before the next release -- the mirror job fails loud without it.** The first real run -of both jobs is still pending.) - -### 7. Layer B: the `jllama_*` C API (B.2 spike, then B.3 slice by slice) - -(The spike landed 2026-10-15: `src/main/cpp/jllama_api.{h,cpp}` over `jllama_engine.{hpp,cpp}` -with `jllama_api_version`, `jllama_build_info`, `jllama_last_error`, `jllama_string_free`, -`jllama_model_load`/`_free`, `jllama_chat_completions`, the streaming trio, `jllama_task_release`, -`jllama_set_log_callback`; the eight matching JNI entry points call it; `test_c_api.cpp` (gtest, -hermetic over a tiny random GGUF the test writes, so no `restore-models` was needed) and the plain-C -`c_abi` compile of the header; the header ships in every natives directory; `docs/c-api.md`; -CLAUDE.md "The C API". The version is the library's (`jllama_api_version()` returns the pom -version), which closes the contract bullet.) - -(The `LlamaModel` and `LlamaQuantizer` half landed 2026-10-15: model meta, raw and OpenAI -completions, infill, raw streaming and the chat-template variant, apply-template, embed/embeddings, -rerank, tokenize/detokenize in both forms, metrics, slot save/restore/erase, LoRA get/set, configure, -systemone, the grammar conversion and the quantizer -- each an engine function, a `jllama_*` -function, a `test_c_api.cpp` case and a JNI shell; `jllama.cpp` carries no server logic any more.) - -(And the rest the same day: `jllama_server_*` over a new `native_server_engine.{hpp,cpp}` (classic, -attach, router's worker command; not on Android), `jllama_rpc_server_*`, `jllama_tts_*`, -`jllama_finetune` -- every native entry point of the Java API is a shell over the C API now, and -`test_c_api.cpp` drives each engine without a JVM, the trainer included.) -(The Windows import library landed 2026-10-15: `jllama.lib`, the linker's own import library of -`jllama.dll`, goes into the natives directory and is named in `jllama-files.txt`, so it ships in -the Windows library jars next to the header; `docs/c-api.md` shows the link line. Unverified on a -Windows machine in this session -- the first Publish run's `merge-native-artifacts.sh` ("names -'', which the build did not produce") is where a wrong import-library name would show.) - -(Java 22+ over the C API without JNI is item 10 below -- decided 2026-10-15 as a module of its own.) - -### 8. Release builds without the shared compiler cache (C.3) - -(Landed 2026-10-15: `publish.yml`'s workflow-level `USE_CACHE` is `false` on every `v*` tag ref, -whatever the dispatch input says, so each natives build of a release compiles every object itself -and the `Install sccache` steps are skipped; snapshots and PR builds keep the cache.) - -- [ ] Open measurement: whether a cached and an uncached build of the same commit give the same - natives hashes -- if yes, a reproducibility job is the cheaper permanent check and the tag - rule above can go back to the cache. - -### 9. The 6.0.0 release (decided 2026-10-15: 6.0.0, not 5.2.0) - -The next release carries every breaking change since 5.1.0 (the natives split, the logging binding, -the port, the floors, the renamed and removed builder methods -- the list in "The release: 6.0.0" -under "Open -- jllama-specific", which stays the detailed reference), so semantic versioning says -**6.0.0**, and the owner decided so on 2026-10-15. What this item does, in order: - -*(Landed 2026-10-15: `main` is `6.0.0-SNAPSHOT` in the five reactor poms, the agent pom and every -hand-maintained snippet -- every consumer-facing "5.2.0" now reads 6.0.0, since that number was never -published; srcmorph's pin and the cross-repo status follow; CHANGELOG `[Unreleased]` opens with -"Upgrading from 5.1" and carries the roadmap work of items 2 to 8, which it did not before.)* -- [ ] The release itself is the owner's: the `v6.0.0` tag after a green Publish run, then the - `main` bump to the next `-SNAPSHOT` (`../workspace/workflows/release-process.md`). - -### 10. Layer B for Java 22+: `llama-ffm`, the C API without JNI (decided 2026-10-15) - -A reactor module of its own, `net.ladenthin:llama-ffm`, Java floor 22 (the FFM API is final -there), hand-written `java.lang.foreign` bindings over `jllama_api.h` -- every `jllama_*` function -a `MethodHandle`, JSON strings in and out, the callbacks as upcall stubs -- behind a small public -API (`FfmLlamaModel`, `FfmNativeServer`, `FfmRpcServer`, `FfmTextToSpeech`). It loads the natives -through the core's `LlamaLoader` (same jars, same `lib.path`, same build check) and finds the -symbols with `SymbolLookup.loaderLookup()`, so there is no second loading path. The core stays -Java 8; CI builds the module with a JDK 25 toolchain next to the `.java-version` JDK -(`maven-toolchains-plugin`, a second `setup-java` step in its test job and in the publish jobs). -Not for Android (no FFM there). - -*(Landed 2026-10-15: the module with `JllamaNative`, `FfmLlamaModel`, `FfmTaskStream`, -`FfmNativeServer`, `FfmRpcServer`, `FfmTextToSpeech`, `Jllama`; `JllamaNativeTest` and -`FfmLlamaModelIntegrationTest` (23 tests, green locally with Temurin 25 over the modular build and -a tiny random GGUF); the `toolchain-jdk22` profile; `test-java-llama-ffm` plus the JDK 25 step in -`package` and both publish jobs; `versions.POMS` in the four repositories; README, CLAUDE.md "Java -22+ without JNI", `docs/c-api.md`, `llama-ffm/README.md`. First CI run pending.)* - -### 11. Deferred by the owner until everything above runs: the Windows code signature (C.4, C.5) - -**Decided 2026-10-15: SSL.com IV certificate + eSigner, Windows only, one switch.** Authenticode -over every DLL of every Windows natives jar, signed by the job `sign-windows-natives` with jsign -against SSL.com's cloud HSM, `signed=yes` in `jllama-build.txt` afterwards, and a -`verify-native-deps.py` check that every PE of a signed run carries a signature; `jarsigner` only on a -consumer's request (fat jars break it). **The macOS half is dropped by the owner's decision** (no -Apple Developer Program): the dylib stays ad-hoc signed by the linker, verified by -`smoke-natives-macos`, with the `.asc` and the Sigstore attestation as its provenance. - -**Azure Trusted Signing was decided first and is a dead end (same day):** Microsoft's identity -validation takes no individual in Germany (country not supported), the organisation form needs a -registered business, and the signing account created for it costs 9.99 USD/month for nothing -- -**delete it**. SignPath Foundation (free for open source) was declined because the publisher on the -signature would read "SignPath Foundation", not the owner; Certum's open-source certificate needs a -card reader a GitHub runner cannot drive. SSL.com's IV certificate (~129 USD/year) in eSigner -(~15-20 USD/month, **metered per signature**) is the one a private person in Germany can obtain and -a Linux runner can use. - -**One switch, snapshot and release alike:** the `workflow_dispatch` input `sign_windows`, next to -`publish_to_central` -- the pipeline is identical at that point, a release is both switches on, and -a run without the switch ships `signed=no` as before (`publish-release` warns). The secrets are -exactly the four SSL.com names its own action documents (`ES_USERNAME`, `ES_PASSWORD`, `CREDENTIAL_ID`, -`ES_TOTP_SECRET`), in the `maven-central` environment next to the GPG key: **the TOTP secret lets -whoever holds it sign in the owner's name**, so it reaches one job, only on the explicit switch, -only under that environment's rules -- never a step of `package`, which runs on every pull request. - -*(The code side landed 2026-10-15: `.github/sign-windows-natives.sh` (jsign 7.2 pinned by SHA-256, -`--storetype ESIGNER`, every `Windows/*/*/*.dll`, `signed=yes` afterwards; measured with a real DLL -and dummy credentials: the options are accepted and the run fails at SSL.com's authentication), the -job `sign-windows-natives` (environment `maven-central` only when signing, else the unprotected -`unsigned`; re-uploads the ten Windows artifacts with `overwrite: true`, `check-natives.py` holds -the uploads to the Windows rows of `natives.csv`), `package` waiting for it -- the job runs on every -run and is never `if:`-skipped, because GitHub applies a skip to the whole dependency chain behind -the skipped job past any condition in between, which is how run 38870889665 (attempt 2) ended -"success" with every job behind `package` skipped; `check-natives.py` refuses a job-level `if:` on -it now --, `--require-signed` in `package` and both publish -jobs whenever `SIGN_WINDOWS` is on, `pe_signed()` + `signature_violations()` in -`verify-native-deps.py` with unit tests; CLAUDE.md "Code signing of the Windows DLLs", README. -Unexercised until the certificate exists.)* - -- [ ] **Owner:** delete the Azure Trusted Signing account (9.99 USD/month, unusable). -- [ ] **Owner:** SSL.com IV validation (identity documents; days), the IV code-signing certificate - enrolled in eSigner, the eSigner TOTP secret and the credential id (both in the eSigner - settings of the order), eSigner's per-signature quota read against **35 DLLs per signed run** - (20 in `cpu-windows-x86-64`, 7 in `cpu-windows-aarch64`, one in each of the 8 Windows module - jars); then the four secrets into the `maven-central` environment (`ES_USERNAME`, `ES_PASSWORD`, - `CREDENTIAL_ID`, `ES_TOTP_SECRET`; optionally the repository variable `ES_ENDPOINT` = - `https://cs-try.ssl.com` for one sandbox run first -- its test certificate is not trusted by - Windows, so that run proves the pipeline, not the signature). -- [ ] First signed run: a dispatch on `main` with `sign_windows` and without `publish_to_central`; - read the publisher off a `jllama.dll` unpacked from the run's `llama-smoke-windows-x86-64` set - (`Get-AuthenticodeSignature`, or `signtool verify /pa /v`), confirm the Windows smoke rows ran - the signed sets and that `verify-native-deps.py` in `package` ran with `--require-signed`; then - the same with `publish_to_central` for the first signed snapshot. - -## Where the modular natives stand - -**The goal was exchangeable native libraries built with LLVM, replacing the fat jars. As of -2026-10-12 that is implemented and proven -- on real hardware and through the whole pipeline.** Two -consecutive `workflow_dispatch` runs on `main` finished **completely green** (67 jobs, 0 red): runs -**38186841655** and **38218935644**, both through `Package JARs`, all six smoke jobs, both GPG checks, -`Publish Snapshot to Central` and the GitHub pre-release. Before those, nothing behind `package` had -ever run with modular natives. - -This section stays because a Publish run costs hours and "what is this run supposed to show" has to -be answerable before starting one -- but that question now has an answer for the state as shipped. - -**Done and proven.** 8 library jars plus 15 additive GPU module jars, each holding one ggml backend -module; `jllama-build.txt` pinning a module to its library's llama.cpp tag before anything is -extracted; the extraction directory keyed by build *and* module set, reused across starts. Windows -x86-64 is built with **plain clang**, which is what yields all 14 CPU variants (`clang-cl` loses 5 of -them to ggml's `if (NOT MSVC)` block). All 14 x86 modules were measured on one Granite Rapids machine -and 6 of 8 aarch64 ones on a Graviton 4 -- before that, no module had ever been *chosen* on hardware -the project could inspect. - -**What stuck after the first runs, and where it went** (kept so it is not re-derived): the library -jar was not self-contained (`libgomp` missing on slim images) -- Linux builds with `GGML_OPENMP=OFF` -now and `verify-native-deps.py` holds the absence, while `libstdc++`/`libgcc_s` stay dynamic on -purpose (CLAUDE.md "Windows natives", the Linux OpenMP paragraph); CUDA aborted the JVM on an old -driver -- the explicit `CMAKE_CUDA_ARCHITECTURES` fixed it (T4 measured); OpenVINO on a CPU-only host -took over and ran 172x slower -- it is opt-in (`LlamaLoader.OPT_IN_BACKENDS`); nothing behind -`package` had ever run -- it has, in the two green runs above; and the shipped diagnostic entry point -is `net.ladenthin.llama.Diagnose`. The rounds that got there follow. - -### Round 0 found one defect, and it was mine - -Run 38146809329 (cancelled after the first failures) went red in **four Android jobs**, with one root -cause: `Package + Validate Android AARs` failed, and the three jobs that need the AAR followed. - -``` -Property not found in ../llama/pom.xml - -- keep the AAR pom dependencies in lockstep with the core -``` - -`llama-android/build.gradle.kts` mirrors the core's dependency versions into the AAR pom by **parsing -`llama/pom.xml`**, and the Jackson advisory fix moved `jackson.version` into the **parent** pom (where -it belongs: the parent now imports `jackson-bom` so `llama-langchain4j` cannot pull an older -`jackson-core` transitively). The Gradle build looked only in the core pom. - -**That check working is the good news.** It is fail-loud by design, with a message naming exactly the -invariant it protects, and it caught a cross-build reference that no Maven gate sees -- the same -"reference not updated after a move" class as the stale `spotbugs-exclude.xml`, the PIT -`targetClasses` and the `CMakeLists.txt` OSInfo repairs. **Fixed by teaching the parser Maven's own -inheritance** (core pom, then parent) rather than by restoring a duplicate `jackson.version`, which -would drift the next time one of them is bumped. **Not verifiable locally** -- no Gradle on this -machine -- but the XML lookup it performs was reproduced against both poms: the property is absent -from the core and present in the parent at 2.22.3. - -**What this says about round 0 itself:** it reached `Package + Validate Android AARs`, so the stages -before it ran. The Android jobs sit *beside* `package` rather than behind it, so this failure says -nothing yet about the smoke sets, `smoke-natives-jars.sh` or the three merged changes -- those still -need a run. - -**The fix itself left a fragment, and the re-dispatch found it.** Run 38148401395 (`workflow_dispatch` -on `main` at `989534d5`, the first commit carrying the fix) went red in the same three Android jobs, -this time in `Assemble AARs + publish to mavenLocal`, i.e. before Gradle reached the pom parser at -all: the rewrite of `coreProperty()` kept the old function's tail -- a `?: error(...)` and a `}` -- -at file level two lines below the new closing brace, which is a Kotlin script compilation error -(`build.gradle.kts:118:9: Expecting an element`). Fixed by deleting the two lines (bump session, -2026-10-11) and verified both ways, because the sandbox *does* have Gradle (`/opt/gradle`, 8.14.3): -the unfixed script fails with exactly that message, the fixed one configures. **`gradle --offline -q -help` in `llama-android/` is the minimum check for any change to that script** -- it needs no natives, -no network and no Android SDK, and it catches everything the AAR job can fail on before -`Assemble AARs`. When run 38148401395 was last read, 32 jobs were green, 16 still running and only -the three Android ones red, so the questions behind `package` were still open; the dispatch after -this fix is the one to read for them. - -### Round 0, run 38164077038: `package` reached, and the opt-in decision had a loose end - -**What it answered, and it is the first time any of it has been answered:** all **54** build jobs -green, both ROCm among them (Windows 3:08 h, Linux 2:57 h -- they *are* the three-hour pipeline; every -other job was done inside an hour), and **`verify-native-deps.py`: 99 native libraries checked, 0 -violations.** So the SYCL run path is clean, and the Linux jars no longer declare `libgomp.so.1` -without anything noticing. - -**What it found:** `smoke-natives-jars.sh` failed with -`classpath: the loader did not put the openvino module jar of Linux/x86_64 in place` -- a consequence -of making `openvino` opt-in, which I should have foreseen when I added `OPT_IN_BACKENDS`: that script -asserts the loader line names **every** GPU module of the platform, read from `natives.csv`, and the -list had no way to say that one of them is deliberately left out. The loader even printed the reason -("is on the classpath but not used: it is opt-in"); nothing read it. - -Fixed by declaring it where every consumer already looks: an **`optin` column in `natives.csv`**. -`check-natives.py` now holds `LlamaLoader.OPT_IN_BACKENDS` to that column in both directions, the -model-backed smoke rows stop expecting an opt-in module (bash and PowerShell), and -`smoke-natives-jars.sh` names every module through the property instead -- which makes it **the only -place in CI that loads an opt-in module at all**, so the mechanism is exercised rather than merely -respected. 122 buildcheck tests, four of them new; both module lists and the property construction -were simulated against the real CSV locally. - -**Still unanswered, and only a run can answer it:** everything behind `smoke-natives-jars.sh` -- -the five smoke sets, the four `smoke-natives` rows with the RPC smoke on aarch64, the macOS smoke and -the agent smoke were all **skipped**, as they were in every run before. Two emulator jobs stayed red -in this run by construction (their fix landed afterwards, #526). - -### Hand-over from the bump session, 2026-10-11 - -What that session did: the b11538-to-b11556 bump (#513 -- every patch re-verified, two history rows, -the nlohmann finding recorded below under "The FetchContent nlohmann/json is shadowed"), the two-line -Gradle fix above, and a read-only check of the 2026-10 plan (the 12-point table that followed the -Windows measurement report) against `main`. Result of that check, so it is not redone: **9 of the 12 -points are on `main`** -- the publish dispatch, b11535 and beyond, the macOS OpenSSL defect, the -Windows CPU variants, the attach-mode sleep callback, the test-count floor, the agent's approval gate, -400 for invalid requests, and all of point 11 (the router worker's stdout line went to stderr on -2026-10-09, `e9758054`). Open from that table: **the release with its migration section** (new entry -under "Open" below), **the upstream submissions** (policy: after the release; inventory below) and the -two owner-only items of point 12 (license compliance, the RPC upstream issues). Every finding of the -Windows report -- D1 preload order, D1b hybrid CRT, D3 UTF-8 path, D4 registry logging, D5 keyed -extraction directory, D6 reuse across starts, E1/E3 manylinux_2_28 -- is implemented; the Windows -two-process measurement of D5 is round 2, item 5. Nothing else from that plan is missing from this -file. - -## The next batch, in the order it should be done - -Assembled 2026-10-11 after the libgomp / CUDA-arch / OpenVINO changes landed. The constraint that -shapes it: **a Publish run costs hours**, so work is grouped by what one run can answer, and anything -that needs no run is done before the run starts. - -**Round 0 -- one Publish run on the current `main`, nothing added.** *(Started 2026-10-11 as run -38146809329, `workflow_dispatch` on `main` at `df5e1ba` -- which also carries the b11538-to-b11556 -bump that landed just before it, so the run answers three questions rather than two. They stay -separable in the output: a packaging or smoke failure is not a flag failure, and a bump failure shows -up as a compile or patch error. Cancelled on the Android AAR defect above; re-dispatched as run -38148401395 at `989534d5`, which failed the same three jobs on the fragment that fix left behind. -**The run to read is the first dispatch after that fragment is gone.**)* It is the first run that can -reach everything behind `package`, *and* the first that exercises the three changes just merged. Those -two questions are separable in the output (a packaging or smoke failure is not a flag failure), so -they share a run rather than costing two. What it must show: -`package` green; `verify-native-deps.py` happy over all 23 jars **with `libgomp` gone from the Linux -ones** (the allowlist now fails if it is back); the smoke sets assembled; `smoke-natives-jars.sh` -loading all 23 jars on classpath **and** module path; the four `smoke-natives` rows with their loader -line, HTTPS round and -- new -- the RPC smoke on **aarch64**; `smoke-natives-macos`; -`smoke-agent-linux`. Plus two numbers to read off rather than assume: **what the explicit CUDA arch -list costs** in job time and module size, and whether the Windows x86-64 rows drew an AMX runner (the -host-CPU line says so). - -**Round 1 -- things that need no run, done while round 0 is in flight.** None of these touch the same -files as each other, so they can go in one branch: -1. ~~**The shipped diagnostic entry point**~~ **done 2026-10-11**: `net.ladenthin.llama.Diagnose` - (the main class) plus `loader.DiagnosticReport` (the half only the loader can answer). The split - is not tidiness: every platform and classpath fact is a package-private member of `LlamaLoader`, - and **Java access is per package, not per module** -- so that half has to live in the loader's - package, while the main class cannot, because that package is deliberately not exported and a - consumer on the module path could not run a main there. The architecture rule allows exactly this - direction (`Api -> Loader`, never back), which is also why the pinned-version constant (`value`) - and the load itself (`LlamaModel`) are read on the `Diagnose` side. - It prints the pinned tag, the JVM, `os.name`/`os.arch` and what `OSInfo` derives from them, every - set `net.ladenthin.llama.*` property, each natives directory of the platform **with the llama.cpp - tag of its `jllama-build.txt`** (which is how a mismatched set becomes visible at all) and, on a - failed load, the operating system's own reason. 9 tests, no natives and no model needed. - **Two defects of its own, both found by running it rather than by reading it, and both the same - mistake:** it composed the property name from `LlamaSystemProperties.PREFIX`, which carries **no** - trailing dot, and so read `net.ladenthin.llamabackend` -- a name nothing sets, so a filter that - was in effect was reported as unset; and `namedBy` compared case-insensitively while - `LlamaLoader.selectModules` compares with `equals` and **fails loud** on an unknown name, so - `OpenVino` would have been reported as an enabled module while the load throws on it. Both are now - read through the loader's own accessor and matched by the loader's own comparison, each with a - red/green test. The rule they both broke: **a diagnostic may not be kinder, or differently spelled, - than the code it describes.** -2. ~~**README: the GPU jars' real requirements**~~ **done 2026-10-11**: the two `cuda13` rows name the - driver requirement, the two `openvino` rows say they are opt-in and name the OpenCL ICD loader the - OpenVINO archive does not ship, and an `[!IMPORTANT]` block carries the measured detail -- the - CUDA abort (`ggml_abort`, not catchable, and reached even with `-ngl 0`), the 17x/172x OpenVINO - regression that is the reason for the opt-in, and Vulkan as the one backend that behaves as - designed. The existing note's sentence "simply registers none" now names its two exceptions - instead of stating the rule as if it held. **The README did not mention the OpenVINO opt-in at - all**, so a consumer adding that jar would have seen nothing happen and no reason why. -3. ~~**`TestConstantsTest` / `TestModelPaths` parity**~~ **done 2026-10-11, and the premise was - mostly outdated**: `llama-langchain4j`'s test file had grown since that line was written and - already covered nine of the core's ten cases, including the reactor-root branch non-vacuously - (it resolves `llama-langchain4j/pom.xml`, which exists only when looked up from the parent, so a - pass proves the second branch ran) and the "no test may read a model property without the - resolver" source rule. The one genuine gap was `fromProperty`: only the **unset** case was - tested, so a set property that bypassed the resolver would have been invisible -- which is - exactly the failure the resolver exists for, and the one that stayed hidden in the core for - hundreds of builds because a class-level assumption records no test entries. One test added. - -**Round 2 -- ~~needs round 0 to have produced artifacts~~ DONE 2026-10-12.** All three were measured -against the **published** snapshot jars (`20261012.035453-12`) rather than a build tree, so the -numbers are what a consumer resolving from Maven gets. Written up in -[`docs/benchmarks/gpu-module-jars.md`](docs/benchmarks/gpu-module-jars.md) and the new -[`docs/benchmarks/native-loading.md`](docs/benchmarks/native-loading.md); the account-specific record -is in the private workspace. Two AWS boots, **under 0.08 USD together**, both terminated and four -regions swept afterwards. -4. ~~**A `g4dn` run proving a T4 works** with the new arch list~~ -- **done, and the abort is gone.** - Same AMI, same driver 595.91.07, same Tesla T4; only the module changed. **Three exit-134 aborts - became three clean runs**, including `-ngl 0`, which was the most absurd of them since no layer was - on the GPU. The GPU gives **20.6x prompt processing and 7.0x generation** over the CPU baseline on - that machine. `cuobjdump` on the published module confirms native code for `sm_75`, `sm_80`, - `sm_86`, `sm_89`, `sm_90`, `sm_100`, `sm_120a` and `sm_121a` plus PTX for `sm_121a` -- so Turing, - A100 and Hopper no longer depend on the driver and anything newer than Blackwell still has a - fallback. The `a` suffixes are upstream's own rewrite of every `12x` architecture, not a defect in - the list this project passes. **The README's figures were corrected with it**: the CUDA paragraph - described the pre-fix state, and OpenVINO's cost was understated (see item 6). -5. ~~**The Windows extraction-reuse measurement**~~ -- **done, all four documented properties - confirmed.** Extracting 18 files / 39 MB costs **~810 ms per JVM start** (cold ~2175 ms against - warm ~1365 ms) and the reuse removes it -- per start, so also per surefire fork. The directory key - visibly carries the module set (`...-11b5000` against `...-11b5000-mf39ba978`). Two JVMs of one - build run concurrently without interfering. And the sharpest case: with an `RpcServer` holding the - library and the directory backdated past `STALE_EXTRACTION_AGE`, a sweeper left **exactly the five - files that JVM still had open** -- the library, the two pre-loaded ggml libraries, the one CPU - module ggml kept, and `ggml-rpc` -- while the 13 it had scored and closed went and were - re-extracted on the next start. The server kept running throughout. -6. ~~**The slim-image / distroless load test**~~ -- **done.** The published Linux jar declares only - what a JVM brings with it (`libc`, `libm`, `libdl`, `libpthread`, `libstdc++`, `libgcc_s`, run path - `$ORIGIN`, `GLIBC_2.27` at most) -- **`libgomp.so.1` is gone from the artifact**, not only from the - allowlist. `net.ladenthin.llama.Diagnose` from the published jars loads in - `gcr.io/distroless/java21-debian12` and `eclipse-temurin:21-jre`, and is refused by - `eclipse-temurin:21-jre-alpine` **by name**: `No native library found for os.name=Linux-Musl`. - That last row is not a defect -- musl was never a shipped platform -- and it was in the matrix on - purpose, because a measurement that only admits successes cannot show where the boundary is. - **Also measured, and it corrects this file and the README:** OpenVINO on an Intel Sapphire Rapids - instance costs **21.7x prompt processing and 336x generation** against the baseline of the same - machine (481.3/33.6 down to 22.2/**0.1**), not the 17x/172x recorded from the earlier machine. - Without an OpenCL ICD the module does not open at all (2 backends, full CPU speed); with - `ocl-icd-libopencl1` it registers a third and collapses. And with the jar on the classpath but - `net.ladenthin.llama.backend` unset the loader says `is on the classpath but not used` and the - machine runs at full speed -- **the only hardware proof the opt-in decision has**, since CI has no - Intel accelerator and nothing happening there proves nothing. - distroless Java, drop the classes jar plus the Linux library jar in, and load. This is the check - that CI *structurally cannot* do, because it runs on full runners -- and it is the direct - verification of what round 0's dependency check only implies. - -**Deliberately not in the next batch**, with the reason: `cuda13-windows-aarch64` (a new build job -- -worth doing, but it belongs in a run of its own so a toolchain failure is unambiguous); the Android -Vulkan module (same); code signing (needs the owner's identity validation first); and the upstream -submissions (policy: not before the release). +so entries below describe remaining work or an explicit deferral policy. + +## Release 6.0.0 — prerequisites + +- [ ] Merge the fixes on `refactor/shared-release-checks` and obtain a complete green Publish + run for the resulting release candidate, including packaging, classpath/module-path and + macOS smokes, Android CPU + additive OpenCL consumers, FFM, source-archive and integration + jobs. The latest completed snapshot run, + [39922567350](https://github.com/bernardladenthin/java-llama.cpp/actions/runs/39922567350), + is green on `fb6b693a`; it predates this branch's packaging and Git-credential fixes. Every + Publish run of the branch before `e49411d0` was cancelled by the next push; run + [40195444689](https://github.com/bernardladenthin/java-llama.cpp/actions/runs/40195444689) was + the first to run the Windows C++ suites at all (`ctest -C Release`, before 0 tests) and found the + Windows RPC stop hanging (fixed in `0015`) and a port collision on the aarch64 runner (fixed in + the tests); the rest of that run has to be read once it completes. Merge PR #559 together with + its siblings (BitcoinAddressFinder #397, streambuffer #191, srcmorph #238; workspace #61 before + BroomCabinet #88, whose links point into it). +- [ ] **Owner:** turn off GitHub's "Automatic dependency submission" (repository settings, Code + security) after the merge. The generated run fails on every push (it has no JDK 22+ toolchain); + `dependency-submission.yml` (JDK 25, `push` on `main`) replaces it. A bot token cannot change + the setting (403). +- [ ] **After the merge, before the tag: read the first snapshot dispatch on `main`** with + `publish_to_central`. What only a real run shows: `update-snapshot.py` moving the `snapshot` tag + through the REST API with the workflow token, the Android AARs' timestamped Gradle names mapped + back to `-SNAPSHOT` by the gate, `central-snapshot` skipping itself for a superseded commit, and + the transfer of the frozen publication. The unit tests drive all of it against fakes only. +- [ ] Strip `-SNAPSHOT` from **all six reactor poms and the standalone agent pom** in one release + commit. Follow [docs/RELEASE.md](docs/RELEASE.md) for dependency snippets, JBang and the server + example; keep the existing "Upgrading from 5.1" list current for any further breaking change. +- [ ] Set the CHANGELOG release heading/date and footer links, and update `SECURITY.md`'s + supported line from `5.x` to `6.x` as part of that release commit. +- [ ] Verify the mirror credential and destination access described in roadmap item 6 below. +- [ ] **Owner: the open points of the natives license texts** (`llama/legal/natives/`, in every + natives jar since 2026-10-25): whether the oneMKL SYCL headers compiled into the two SYCL + modules need Intel's Simplified Software License text (it ships only in Intel's installer); the + provenance of the DRY sampler in `src/llama-sampler.cpp` (upstream treats it as an MIT + contribution by its author; KoboldCpp, where it came from, is AGPL-3.0); the third-party logos + the WebUI embeds (trademarks, no license text). The WebUI package list is an upper bound + (imports + lockfile); an exact list from the bundle would need a plugin in upstream's build. +- [ ] **Owner:** tag/dispatch `v6.0.0` using the + [workspace release procedure](../workspace/workflows/release-process.md). Check the reactor, + standalone agent and both Android publications after upload. Android Central validation + polling remains deliberately outside the build gate (see `docs/RELEASE.md`). +- [ ] After publication: bump `main` to the next `-SNAPSHOT` in all seven poms and carry out the + upstream submissions queued below. +- [ ] After publication: srcmorph (#238) builds against `llama:6.0.0` from Central; its Build, + plugin IT, code style, CodeQL and SonarQube jobs are red until then, and a local srcmorph + build stops at its license collector against a llama snapshot older than the natives license + texts. Re-run its checks once the release is on Central. +- [ ] At the tag: read `check-tag` (`publication.py check-ref` on `v6.0.0`) and `central-release` + (one Portal bundle, `AUTOMATIC`) in the release run; neither has run on a real tag yet. + +## Delivery roadmap — remaining work + +The remaining items retain the numbering of the 2026-10-15 roadmap referenced by `CLAUDE.md`. +Done and therefore deleted here, while comments in the code still name them by number: **1** the +provenance record (`jllama-build.txt` keys, `jllama-sbom.json`, `docs/patches.md`; CLAUDE.md, +"Modular natives"), **2** the natives directory as a tested contract (`lib.path`; CLAUDE.md, "Native +Library Resolution"), **4** export hygiene (the export lists; CLAUDE.md, "Natives jars"), **7** layer +B, the `jllama_*` C API (CLAUDE.md, "The C API"; `docs/c-api.md`), **9** the decision for 6.0.0 +(section "Release 6.0.0" above) and **10** `llama-ffm` (CLAUDE.md, "Java 22+ without JNI"). +Windows code signing stays deferred by the owner's decision. Vendor hash pinning and the +measurements below remain open hardening/coverage work; they do not establish a runtime defect. + +### 3. Hard pinning (C.2) — four repos + +- [ ] **Pin the vendor checksums into `publish.yml`** (`OPENVINO_LINUX_SHA256`, + `OPENVINO_WINDOWS_SHA256`, `VULKAN_SDK_SHA256`). The fallback verifies downloads against + vendor-hosted checksums, but an archive and checksum replaced together would still pass. + Obtain the values from a trusted download or the successful Publish logs and verify them + before pinning. `CUDA_REDIST_MANIFEST` is already version-pinned. +- [ ] **Hash the oneAPI installers and Level Zero downloads.** Both SYCL jobs use versioned + `ONEAPI_DLE_URL` / `ONEAPI_ONEDNN_URL` installers (Deep Learning Essentials 2026.1.4 and + oneDNN 2026.0.2). Download them on a machine that can reach Intel, then add pinned SHA-256 + checks; do the same for the Level Zero debs and SDK zip. +- [ ] **Hash the ROCm wheels.** `stable.repo.amd.com/rocm/whl-next/` is a moving index; versions + are constrained with `==`, but hashes are absent. Generate a complete hash-pinned + requirements file for `rocm[libraries,devel]` using `pip download` / `pip hash`, then use + `pip install --require-hashes`. +- [ ] BoringSSL's tag pin (`BORINGSSL_VERSION` in upstream's + `vendor/cpp-httplib/CMakeLists.txt`) remains an upstream follow-up; no downstream override. + +### 5. Layer A: model-backed plain-C smoke (B.A) + +- [ ] Set `JLLAMA_C_ABI_MODEL` in a suitable CI job and exercise the model-backed half of + `c_abi`. The existing plain-C compile/smoke runs without a model; Java/C++/FFM inference + coverage does not exercise this particular consumer. macOS and s390x remain static builds. + +### 6. Release mirror — destination credential and first real push + +- [ ] **Owner:** verify/provision `LLAMA_MIRROR_TOKEN` with contents-write access to + `bernardladenthin/llama.cpp` in the `maven-central` environment before the release. + Its current availability cannot be inferred from a snapshot run: `mirror-llama-source` + is release-only and was skipped in run 39922567350. The credential-selection fix is on + this branch; tests with temporary repositories do not prove real destination access. +- [ ] Check the first actual `mirror-llama-source` release run and the immutable upstream tag + it creates. Source-archive creation and `test-source-archive` are already CI-covered. + +### 8. Cached/uncached reproducibility measurement (C.3) + +- [ ] Compare native hashes from cached and uncached builds of the same commit before considering + a reproducibility job as a replacement for disabling the shared cache on release tags. + The release-tag cache bypass is already implemented. + +### 11. Windows code signature — deferred by the owner (C.4, C.5) + +The signing implementation and `--require-signed` checks exist. A successful +`sign-windows-natives` job without the `sign_windows` switch is an unsigned pass-through and +does not prove Authenticode signing. The owner selected SSL.com IV + eSigner; macOS remains +ad-hoc signed with GPG/Sigstore provenance, without an Apple Developer subscription. + +- [ ] **Owner:** delete the unusable Azure Trusted Signing account (9.99 USD/month at the time + of the decision; individual identity validation was unavailable for Germany). +- [ ] **Owner:** obtain the SSL.com IV certificate, enroll it in eSigner and verify the quota + against **35 DLL signatures per run**. Configure `ES_USERNAME`, `ES_PASSWORD`, + `CREDENTIAL_ID`, `ES_TOTP_SECRET` in `maven-central`; keep the TOTP secret scoped to the + signing job. Recheck pricing before ordering (the original estimate was ~129 USD/year + for the certificate plus ~15–20 USD/month, metered, for eSigner). +- [ ] Dispatch a first signed run on `main` with `sign_windows` and without + `publish_to_central`. Verify the publisher on an unpacked `jllama.dll` with + `Get-AuthenticodeSignature` / `signtool verify /pa /v`, signed Windows smoke artifacts and + `package`'s `--require-signed` check; then verify a signed snapshot publication. + `ES_ENDPOINT=https://cs-try.ssl.com` can prove the sandbox flow, but its certificate is + not trusted by Windows. Unsigned delivery remains possible under the existing owner decision. ## What still has to be measured @@ -484,105 +145,17 @@ Kept as a list because each entry names the machine it needs -- the harness is | what | needs | why it cannot wait for CI | |---|---|---| -| ~~the cost of `GGML_OPENMP=OFF`~~ | ~~16-vCPU Linux~~ | **done 2026-10-11: no measurable cost** | -| ~~re-baseline the module tables at the current pin~~ | — | **done 2026-10-12 at b11558 on 64 cores**, and the suspicion behind it was **refuted**: #30270 changes nothing measurable ([`docs/benchmarks/upstream-f16c-30270.md`](docs/benchmarks/upstream-f16c-30270.md)), so the baseline moved with the machine size, not with the pin | -| ~~Does a self-contained jar load on a slim/distroless image?~~ | — | **done 2026-10-12**: distroless and `temurin:21-jre` load, `temurin:21-jre-alpine` is refused by name (`os.name=Linux-Musl`) -- see [`docs/benchmarks/native-loading.md`](docs/benchmarks/native-loading.md) | -| ~~Does `75-real 80-real 90-real` make a T4 work?~~ | — | **done 2026-10-12: yes.** Three `exit 134` aborts became three clean runs on the same AMI, driver and GPU | -| ~~Windows extraction reuse~~ | — | **done 2026-10-12 locally**, no rented machine needed: ~810 ms saved per start, and a sweep leaves exactly the five files a running JVM still holds | -| ~~the `sapphirerapids` vs `haswell` gap at high core counts~~ | — | **done 2026-10-12: the ranking reverses.** At 64 threads `haswell` leads token generation at 192.6 while `sapphirerapids` is last at 181.8 -- and ggml picks the latter | -| **OpenVINO on an Intel GPU/NPU** | hardware nobody rents | the 21.7x/336x figures are the CPU-plugin fallback only, so nothing is known about the hardware the jar is actually for | -| the two **SME** aarch64 modules | not rentable anywhere | — | +| **OpenVINO on an Intel GPU/NPU** | suitable Intel device, unavailable to these sessions | the 21.7x/336x figures are CPU-plugin fallback only; they do not prove GPU/NPU execution | +| the two **SME** aarch64 modules | Linux aarch64 with SME, absent from current CI/cloud machines | macOS's static Metal library does not exercise these modules | ## Open — jllama-specific -### Open points from the bug hunt of 2026-10-16 … 19 (details: `BUGHUNT-FOUND.md`) - -Everything the bug hunt left open, so nothing is lost when the session ends. The ledger entry -named in each item holds the analysis, the upstream references (b11639) and the reproduction; -delete an item here when it is done. - -**Open suspicions without a finding id**: none left -- the last ones, numbered (1) to (16) while they -were open (comments and ledger entries still cite those numbers), were fixed as F181 to F186 on -2026-10-20. The local measurement run of that brief -(`BUGHUNT-MEASUREMENTS.md`, M1 … M10, Windows) confirmed all of them with the real models and found -four more, fixed as F187 … F190. It left limits that are decided and documented, recorded here so -they are not rediscovered: - -- **`--lora-scaled` / `--control-vector-scaled` cannot carry an absolute Windows path** (F187). - Upstream reads `FNAME:SCALE,...` and `string_split` splits on *every* colon, so `X:\a.gguf:1.0` - is three parts. `ModelParameters` refuses such a path with the reason and the two ways out (a - relative path, or load unscaled and call `LlamaModel.setLoraAdapter`). A candidate for the upstream - inventory below (split on the last colon); nothing to do downstream. -- **The embedded `OpenAiCompatServer(LlamaModel, config)` reports the model's loaded name, not - `config.getModelId()`** (F189). An already-loaded model cannot take `--alias` any more; the Javadoc - of `OpenAiServerConfig.getModelId()` tells an embedding caller to load with - `ModelParameters.setAlias(…)`. Rewriting the `model` field of every answer was rejected (it would - claim something the engine did not do, and attach-mode `NativeServer` could not follow it). -- **`OpenAiCompatServer` cannot unload a model**: an Ollama `/api/generate` with `keep_alive: 0` - and no prompt gets the "load" answer (F205), the model stays resident (one model per server). - Ollama itself unloads there and answers `done_reason "unload"`; this server does not claim an - unload it did not do. - -### Open points from the branch review of 2026-10-20/21 (details: `BUGHUNT-FOUND.md`) - -The review of the bug-hunt branch confirmed its findings; the fixes are F213 … F267 and the dated -addenda in the ledger (F250 … F267 closed every open point of this list on 2026-10-21, before -6.0.0, by the owner's decision). What is still open, or what the reviewers raised outside the -findings' scope, is listed here; the ledger entry in brackets holds the analysis. Delete an item when -it is done. - -**Anthropic Messages** -- **Upstream candidate:** `stop_reason` `stop_sequence` for a matched stop word (F221); recorded in - the upstream inventory ("Upstream submissions", last bullet) for the day after the release. - -**Decided deviations, recorded so they are not rediscovered** (no action): unknown part types inside -a Responses `message` are not refused, because the same branch carries assistant `output_text` / -`refusal` parts (F224); upstream's stricter Responses role checks are not adopted (F228); a boolean or -string rerank `top_n` and one outside the `int` range keep every result, where upstream converts -`true` to 1 and wraps the cast (F230); a `documents` of the wrong type stays `400` rather than -falling back to `texts` (F231); `chat_template_kwargs` keeps its string fallback, because a string -literal is a valid kwarg value while a tool schema must be an object (F233); a stop issued before -the serving thread has entered `jllama_rpc_server_serve` cannot be told from "nothing running" and -stays a no-op -- callers repeat the stop until the serve returns, as `RpcServer` does (F241). - -**Tests** -- **The model-backed rerank tests were not run locally** (no reranker model in the sandbox): - `OpenAiServerRerankIntegrationTest` covers F230 … F232 end to end only in CI, and F177's caveat that - its end-to-end case had not run locally can go once a CI run with the jina reranker shows it green. -- **Proven only by the first CI run with the real models** (the closing pass ran each touched class - against the random two-layer test model, whose 128-token context and missing special tokens cannot - carry them): the text assertion F250 added to - `ChatAdvancedTest#testReasoningBudgetBesideMessagesInCompleteAndGenerateForcesTheEndTag` can - only be red with Qwen3, whose `` is a special token -- the C++ case - `CApiReasoningBudget.ARawCompletionWithMessagesRendersTheTemplatesSpecialTagsAsText` pins the - behaviour on every platform; `ChatScenarioTest#testChatCompleteMultiTurnThreeTurns` and the - `Session` tests ran locally only with a 4096-token variant of the test model; - `MultimodalIntegrationTest#imageBytesAffectTheAnswer` needs SmolVLM; and whether - `llama-atmosphere-agent` and `llama-langchain4j` ever send `OpenAiCompatServer` a `tool_choice` - object of a type other than `function` or a number as a string (F254, F253 refuse both now) -- - their sources send string `tool_choice` values only, their integration jobs are the proof. -- **`ErrorHandlingTest#testSaveSlotWithoutSlotSavePathIsRefused` is not hermetic** (F251): it checks - that `slot.bin` is absent from the working directory, so a file left there by a run of an older - library fails it. Deterministic against the fixed library; a temporary working directory, or - asserting the native answer alone, would make it independent of what lies around. -- **A custom `OpenAiBackend` without `mediaMarker()` answers `/api/generate` with images `500`** - (F259): the default method throws `UnsupportedOperationException`, which the route does not map to - `501` as `countTokens` is. `LlamaModelBackend` implements it, so the shipped backend is not - affected; a `501` with the reason would match the other optional capabilities. - -### After the llama.cpp bump to b11800 (2026-10-21): what the range offers and is not wired yet - -The bump itself is done (b11639 -> b11760 -> b11761 -> b11799 -> b11800, b11803 on 2026-10-21: Flint, SenseNova -U1 and a jinja fix, nothing to wire; b11809 on 2026-10-22: LoRA on prism.hadamard folded weights, an OpenCL -ARGMAX kernel, nothing to wire; b11814 on 2026-10-22: the `tokenizer.ggml.clean_spaces` key and the Pixtral -pre-tokenizer change, nothing to wire; b11815 on 2026-10-22: a SYCL CONV_2D layout fix, nothing to wire; b11820 on 2026-10-22: typed rerank items, `OpenAiCompatServer` reads their text and refuses images; b11827 on 2026-10-22: SYCL XMX mat-vec, OpenCL depthwise conv, MiniCPM-OCR, the `--mlock` split-buffer fix, nothing to wire; patches `0016` and `0019` dropped, `0007` refreshed; -`docs/history/llama-cpp-breaking-changes.md` has the rows). Five things the range brings that this -library does not expose, each a decision rather than an omission: +### Deferred API features from the b11800–b11827 range - **Server-side TTS through `LlamaModel` / the Java transport.** `POST /tts` (b11781, #26603) runs `SERVER_TASK_TYPE_TTS` on a chat model loaded with a TTS mmproj and streams `server_task_result_tts` chunks (`audio`, `sample_rate`, `final`; WAV or PCM per `out_type`). `NativeServer` serves it already (classic and - attach mode, the route is in `0007`'s common table). A `LlamaModel.tts(...)` over the C API and a + attach mode, the route is in upstream's `server_register_routes()`, which `0007` registers). A `LlamaModel.tts(...)` over the C API and a `/v1/audio/speech`-shaped route on `OpenAiCompatServer` would make it reachable without the native frontend; `TextToSpeech` (its own context over `mtmd_helper::gen_audio`) stays the one-shot path. Not before the release. @@ -607,297 +180,9 @@ library does not expose, each a decision rather than an omission: configure time), `tools/server/server-connect.cpp` is compiled because `server.cpp` references it, and the flag answers with upstream's "not available" message. No plan to bundle a binary. -**The SYCL jobs follow upstream's installers since this bump** (owner's ask, 2026-10-21): Deep Learning -Essentials 2026.1.4 + oneDNN 2026.0.2 offline installers on both OSes (upstream since b11654, #30131), pinned by -URL under `KEEP IN SYNC WITH UPSTREAM`, instead of Intel's unpinned apt packages (Linux) and the 2025.3.3 bundle -(Windows); and the Level Zero loader/SDK upstream's jobs have carried since #21597 / #29273. **That last part is -a change to the shipped modules, not only to the toolchain:** the modules built so far never found a Level Zero -loader (the package job of run 38870889665 listed none among their imports), so from this bump on -`libggml-sycl.so` imports `libze_loader.so.1` and `ggml-sycl.dll` imports `ze_loader.dll` (Intel's GPU driver -ships both) and both carry ggml-sycl's Level Zero allocation path; and the Windows module moves from the oneAPI -2025.3 runtime (`sycl8.dll`, `mkl_sycl_blas.5.dll`) to 2026.1 (`sycl9.dll`, `mkl_sycl_blas.6.dll`). CHANGELOG -and the README classifier table say so. **Unverified here** -- Intel's download host answers this sandbox with -403, and no job runs locally -- so the first Publish run proves it; what to read there: both installers download -and install silently, `setvars.sh` / `setvars.bat` exist, the configure prints `Level Zero loader found` and no -`oneDNN not found` FATAL_ERROR, and the package job's dependency lines show `libze_loader.so.1` / `ze_loader.dll` -and `sycl9.dll` (`verify-native-deps.py` holds a GPU directory to a denylist only, so a vendor loader passes). The OpenSSL half of upstream's change (b11676, #30456: the -Linux job builds against `libssl-dev`) does not apply: the SYCL jars are module-only builds without -cpp-httplib, and a shipped `libjllama` must not import a dynamic `libssl` anyway. - -### The release: 6.0.0, with an "Upgrading from 5.1" section (decided 2026-10-15; roadmap item 9) - -**Nothing has been published since 5.1.0 on 2026-08-29.** `pom.xml` is `6.0.0-SNAPSHOT`, and -`CHANGELOG.md`'s `[Unreleased]` holds six weeks of work no consumer can get from Central: the modular -natives, the Windows generation speed-up, the Linux and Windows CPU variants, RPC, the agent, -Kolibri-1, the bump to b11556. It also holds changes that break every existing consumer at upgrade, -and the changelog states each one where it happened rather than in the one place a reader upgrading -from 5.1 would look: - -- the **natives split** -- `net.ladenthin:llama` is the classes jar only, the natives are classifier - jars collected by `llama-platform` (`pom`), the fat jars are gone -- so a 5.1 - `` on `net.ladenthin:llama` resolves to a jar without natives and fails at the first - load with `UnsatisfiedLinkError`; -- `slf4j-simple` instead of `logback-classic` as the shipped binding; the ROCm jars on ROCm 10; the - `LazyMode` rename and the `enableFlashAttn()` rework; twelve dead builder methods removed; - both servers on port 9931 (llama.cpp's new default; `OpenAiServerConfig` moved from 8080 on - 2026-10-21); slot files named inside `--slot-save-path`; the floors Windows 10, macOS 15 and - glibc 2.28. - -Semantic versioning says that is **6.0.0**, not 5.2.0, and the owner decided so on 2026-10-15; the -timing of the tag stays the owner's. What the release needs, in order: - -1. **Round 0 green through `package` and the smokes** -- the modular natives have never passed the - stages that assemble and launch the published jars (top of this file); a release before that - ships jars CI has not loaded, which the smoke jobs exist to prevent. -2. ~~**An "Upgrading from 5.1" section at the top of the release's changelog entry**~~ -- **done** - (`CHANGELOG.md`, `[Unreleased]`, "Upgrading from 5.1", 18 items, completed 2026-10-21 with the - closing pass): the dependency change, the logging binding, the port, the floors, the renamed and - removed builder methods, the requests refused instead of dropped, the slot file names, the loader - and the stream envelope -- one place, written for someone who reads nothing else. The - `[Unreleased]` bullets stay as the record. Keep it current until the tag: a breaking change that - lands later needs its item there too. -3. **The version in every place the bump touches**: `mvn versions:set` for the five reactor poms, - then by hand the two READMEs' snippets, `examples/jbang/Chat.java`, `examples/server/pom.xml`, - `llama-atmosphere-agent/pom.xml` and its READMEs, the Android and Kotlin READMEs (CLAUDE.md - "Version bump" lists them; `check-natives.py` fails on the ones it can see), the supported-versions - table of `SECURITY.md` (it names `5.x` as the supported line), then the CHANGELOG heading and - footer links, which `../workspace/workflows/release-process.md` names as the most-missed step. -4. After the release: the upstream submissions (policy, below) and the `main` bump back to a - `-SNAPSHOT` of the next version. - -The longer this waits, the longer the migration section gets and the more snapshot-only behaviour -consumers discover on their own. - -### ~~`package` is red: the Linux SYCL module ships the build host's oneAPI paths~~ -- fixed 2026-10-11 - -The next violation behind the OpenVINO one, and only visible once that was out of the way -- the -merge check runs before `verify-native-deps.py`, so `package` had never got this far. Run -38149667195, `Package JARs`: **99 native libraries checked, 1 violation**. - -``` -Linux/x86_64/sycl/libggml-sycl.so needs ['libggml-base.so'] next to it -but its run path is '$ORIGIN:/opt/intel/oneapi/mkl/2026.1/lib:/opt/intel/oneapi/tbb/2023.1/lib/intel64/gcc4.8' -``` - -**What made the decision easy was counting the siblings**: of the 36 Linux libraries, **35 carry -exactly `$ORIGIN`** -- including CUDA, ROCm, OpenVINO and Vulkan, every one of which needs a vendor -runtime just as much and finds it through the consumer's own environment. SYCL is the **one -outlier**, so the thing to repair was the artifact, not the rule. - -**Why the obvious CMake fix is not one:** `llama/CMakeLists.txt` already sets -`INSTALL_RPATH "$ORIGIN"` with `BUILD_WITH_INSTALL_RPATH` on the module target. oneAPI's MKL and TBB -targets hand the **linker** their install paths as `-Wl,-rpath`, and a target property cannot remove a -flag the linker was given. So the Linux SYCL job now normalises the shipped file with `patchelf ---set-rpath '$ORIGIN'` and **fails if the result is not exactly that** -- a job failure at the source -instead of a surprise two jobs later. - -Shipping `/opt/intel/oneapi/mkl/2026.1/lib` to a consumer is build-host leakage of exactly the class -`verify-native-deps.py` was written to catch (the Homebrew `openssl@3` dylib that shipped in 5.0.6). - -**And the check's message was wrong, not merely vague.** It reported this as *"it would be looked up -on the system instead"* -- the reason for a run path with **no** `$ORIGIN`, while here `$ORIGIN` was -present and first. It sent a reader looking for something that was not the problem, which is the same -defect as the `sdkmanager` step's "dl.google.com broken". The two cases are now separate messages, -with four unit tests (red against the old wording, green against the new). - -### ~~`package` is red: the Windows OpenVINO module jar fails the merge check~~ -- done - -**Done 2026-10-11 (`7870923f`, "Unblock package").** The cause was vcpkg, not the build and not the -check: with its toolchain file in use, vcpkg's app-local deployment put `OpenCL.dll` next to the -linked module in the link step itself, and `merge-native-artifacts.sh` requires a module jar to hold -exactly its module and the two `jllama-*.txt` lists. The job now passes `VCPKG_APPLOCAL_DEPS=OFF`; the -check was deliberately not relaxed (a GPU module whose runtime is absent does not load and the model -runs on the CPU modules -- the documented, smoke-tested behaviour of every other backend). Whether -`package` then goes green end to end is what round 0 shows; it had not been reached when this was -written. The original entry follows. - -**This blocks every release and was untracked until 2026-10-11.** `Package JARs` fails with - - artifact 'natives-openvino-windows-x86-64' is a module jar: - Windows/x86_64/openvino/ must hold ggml-openvino.dll (named in jllama-files.txt) - -so `merge-native-artifacts.sh` rejects the artifact before anything is packaged. Because the smoke -jobs `need: package`, all of them **skip** rather than fail -- which is why the run reads as "3 -failures" and the Java test jobs look green: nothing downstream of `package` ran at all. Seen on run -38112603436; the check itself came with `4f811a23` on `main`, so this is **pre-existing**, not a -consequence of the AMX work on the branch. - -What to find out first: whether the Windows OpenVINO build produces a differently named module (the -other GPU jobs write `ggml-.dll`, and `JLLAMA_MODULE_ONLY` writes `$` into -`jllama-files.txt`, so a target name mismatch would show exactly like this) or produces nothing and -the upload's `if-no-files-found: error` did not catch it. The two GPG jobs red in the same run are -**unrelated and expected** on a branch: they need the `maven-central` environment secret. - -### ~~Four defects in the published artefact set~~ -- found and fixed 2026-10-12 - -The first snapshot the green pipeline published was compared against `natives.csv` and against Maven -Central. **Central was complete and correct**; the **GitHub release** was not, and the three gaps were -all in one collect step that copied `*.jar`, `*.jar.asc` and `*.aar` only: - -1. **no `*.pom` at all**, so `llama-platform` -- a pom-packaging module, the artifact consumers are - told to depend on -- was absent from the release entirely; -2. **the AARs were attached unsigned**, while Central had `aar.asc` for both; -3. **the signature check globbed `*.jar` only**, which is why the job reported success while - attaching something unsigned -- the check had exactly the hole the collect step had; -4. **`gh release upload --clobber` never removes anything**, so the rolling `snapshot` release had - grown to **208 assets**: 109 from versions 5.0.0-5.0.7, 43 in shapes that no longer exist - (`msvc-windows`, `all-*-jar-with-dependencies`) and three SpotBugs plugin jars an old collect step - had swept in during 2026-05/06 -- the same three are still on srcmorph's and streambuffer's - releases. - -Fixed in #529 and #531 and **verified on the live release** after run 38218935644: **208 -> 98 -assets**, every one of them `5.2.0-SNAPSHOT`, **49 artefacts with 49 `.asc`** (1:1, nothing unsigned), -**23 of 23** natives jars against the list, and `llama-platform-5.2.0-SNAPSHOT.pom` present. The -prune computes its keep-set from what the run actually uploaded rather than from a version pattern -- -a pattern is what produced the 43 stale shapes -- deletes **after** the upload, runs only on the -rolling release (a `v*` release is history) and prints every deletion by name. - -**Still to do in the siblings:** item 4 applies to BitcoinAddressFinder, srcmorph and streambuffer -too; all three accumulate, and two carry the same SpotBugs jars. `publish.yml#github-snapshot` and -`#github-release` are *shared jobs* there (byte-identical, hashed in `shared-files.sha256`), so a -change lands in all three plus `check-shared-files.py --write` in each. jllama's copies are not in its -own manifest and already diverge. - -### Three measured gaps between "the jar is on the classpath" and "it works" (2026-10-11) - -All from the first runs in which a GPU module jar was ever *used* rather than placed, and from -loading the Linux jar on an image that is not Amazon Linux. Numbers and method: -[`docs/benchmarks/gpu-module-jars.md`](docs/benchmarks/gpu-module-jars.md). - -1. ~~**The Linux CPU jar needs `libgomp.so.1`.**~~ **Done:** `llama/CMakeLists.txt` forces `GGML_OPENMP=OFF` for Linux (non-Android), `verify-native-deps.py` enforces the absence, a unit test says why widening the allowlist again defeats it, and **only** OpenMP is touched -- `libstdc++`/`libgcc_s` stay dynamic because HotSpot links them anyway. **Still to verify in CI:** that the Linux jars come out with no `NEEDED libgomp` (the `package` job's own check now fails if they do) and one re-measurement in the gcc-toolset-14 image. The original entry follows. - **The Linux CPU jar needs `libgomp.so.1`, and a plain Ubuntu server image does not have it.** - **Measured 2026-10-11, and the decision is no longer a trade-off: turning OpenMP off costs - nothing.** Upstream b11538 built twice on one 16-vCPU machine with identical flags except - `GGML_OPENMP`, benchmarked with `llama-bench` (3 repetitions): token generation is *slightly - faster* without it at 4, 8 and 16 threads (+0.9 %, +0.8 %, +0.7 %) and prompt processing is lower - by 0.4-2.1 %, all inside the error bars -- and `libggml-base.so` loses its `NEEDED libgomp`. The - ~6 % figure quoted below does not reproduce; it was one sample already flagged as inside its own - spread. Table in [`docs/benchmarks/cpu-backend-modules.md`](docs/benchmarks/cpu-backend-modules.md). - **Remaining work is the change itself**, not the decision: add `GGML_OPENMP=OFF` and - `-static-libstdc++ -static-libgcc` to the Linux (and s390x) builds, extend - `verify-native-deps.py`'s allowlist so the *absence* of `libgomp`/`libstdc++`/`libgcc_s` is what - the check enforces, and re-measure once in CI's own gcc-toolset-14 image. - **Why `libgomp` was a dependency at all, since this reads like a regression and is not one:** GCC's - `-fopenmp` links `-lgomp` *dynamically*, so it was always a runtime requirement -- it simply never - surfaced because every probe before this ran on Amazon Linux 2023, which ships it. It has nothing - to do with `-static-libstdc++`, which does not cover libgomp. - **And upstream is not one answer but three, per platform** (checked in their `release.yml` at - b11538): **Android `GGML_OPENMP=OFF`** (no `libomp` on devices -- what this project already does), - **Windows `GGML_OPENMP=ON` plus `GGML_OPENMP_FETCH=ON`** (they fetch and *bundle* LLVM's libomp), - and **Linux unset**, i.e. ON against the distro's libgomp. Upstream's Linux choice is right for - upstream's deployment -- a zip onto a developer's distro, where libgomp comes with the toolchain -- - and wrong for ours: a Maven dependency landing in whatever container the consumer runs, where the - usual slim Java images have none. So there are **three** options here, not two: (a) - `GGML_OPENMP=OFF`, measured to cost nothing and *removing* a file; (b) `GGML_OPENMP_FETCH=ON`, - upstream parity on Windows' pattern, keeping OpenMP and *adding* a bundled `libomp.so`; (c) leave - it and document the requirement. **(a) is the recommendation** -- the measurement says OpenMP buys - nothing on Linux, and (a) is the only one that makes the directory smaller. Deviating from upstream - here is the same shape of decision this project already took twice: Windows OpenMP off (measured - 1.9x/2.7x *faster* without) and the ROCm `GPU_TARGETS` going further than upstream's. - The original wording follows for the record: - `libggml-base.so` -- the first file the loader loads -- declares it, so the *whole* jar dies with - `UnsatisfiedLinkError: The native library of backend 'cpu' could not be loaded`, which reads like - a packaging defect. Every shipped Linux file also needs `libstdc++.so.6` and `libgcc_s.so.1`, so - distroless and musl images cannot run it at all. **Decision needed:** make the Linux jar - self-contained the way the Android build already is (`GGML_OPENMP=OFF` plus `-static-libstdc++`), - at a measured cost of ~6% on token generation on 8 threads -- or keep the dependency and document - it in the README. That 6% is one sample inside its own spread; re-measure it on the rented - machines before deciding, which is cheap now that the harness exists. - -2. ~~**`cuda13` does not fall back when the driver is too old.**~~ **Fixed and verified on the - same hardware (2026-10-12).** Both CUDA jobs pass an explicit `CMAKE_CUDA_ARCHITECTURES` that - makes `75 80 86 89 90 100 120 121` **real**, so Turing, A100 and Hopper ship native code - instead of PTX; `121-virtual` keeps a JIT fallback for anything newer. Re-measured with the - **same AMI, the same driver 595.91.07 and the same Tesla T4 -- only the module changed**: - **three `exit 134` aborts became three clean runs** (including `-ngl 0`, the most absurd of - them since no layer was on the GPU), and the GPU gives **20.6x prompt processing / 7.0x - generation** over the CPU baseline. `cuobjdump` on the published jar confirms cubins for - `sm_75 sm_80 sm_86 sm_89 sm_90 sm_100 sm_120a sm_121a` plus PTX for `sm_121a`; the `a` - suffixes are upstream's own rewrite of every `12x` architecture, not a defect in our list. - Numbers and method: [`docs/benchmarks/gpu-module-jars.md`](docs/benchmarks/gpu-module-jars.md). - **`cuda13` does not fall back when the driver is too old -- it aborts the JVM.** On a Tesla T4 - with driver 595.91.07 the module opened, ggml enumerated the GPU and offloaded 29/29 layers, and - then `ggml_abort` killed the process: `the provided PTX was compiled with an unsupported - toolchain`. Turing, A100 and Hopper ship as **PTX only** (`75-virtual 80-virtual 90-virtual` in - ggml's default set; native cubins exist for `86`, `89` and Blackwell), so they depend entirely on - the driver JIT-compiling CUDA 13.4 PTX. `abort()` cannot be caught from Java. **And there is no - safe configuration: `-ngl 0` aborts as well** (0/29 layers offloaded, same exit 134) -- having the - module on the classpath is enough, because the backend registers and llama.cpp uses the device - during setup whatever the layer count says; the only escape is leaving the jar off the classpath or - `-Dnet.ladenthin.llama.backend=cpu`. By contrast the Vulkan module on the same machine behaved - exactly as designed: skipped for want of an ICD, throughput identical to the CPU baseline. - **Two candidate - fixes:** document a minimum driver version for the `cuda13` jars, and/or pass an explicit - `CMAKE_CUDA_ARCHITECTURES` adding `75-real 80-real 90-real` so the common datacenter GPUs need no - JIT -- at the price of binary size, the module already being 154 MB. - **The gap is upstream's design, not a mistake, and that is exactly why deviating is justified - here.** ggml's own comment states the policy: build *virtual* architectures "to cover all features - needed for best performance" and *real* ones "for the most commonly used GPUs" -- and the real ones - it picks are `86` (RTX 3000), `89` (RTX 4000) and consumer Blackwell. Upstream passes no - `CMAKE_CUDA_ARCHITECTURES` at all and says so in a comment, so their CUDA binaries have the - identical gap: a T4, A100 or H100 user of upstream's zip hits the same JIT path and the same abort - on an older driver. **But their users and ours are the opposite population.** Upstream ships a zip - to someone with an RTX card; this project ships a Maven dependency into server applications, which - run on T4, A100, L4 and H100 -- precisely the GPUs upstream leaves as PTX. For us the "most - commonly used GPUs" are the datacenter ones. - **Cost, so the decision is informed:** nvcc compiles every `.cu` once per *real* architecture, so - going from three real (86, 89, Blackwell) to six roughly doubles the device-compile half of a job - that already takes 47-80 minutes uncached, and the module grows from 154 MB by roughly the same - proportion. `100-real` (datacenter Blackwell, B200) would be a seventh and is rarer. There is no - way to have both the small jar and no JIT dependency; the question is only which one the consumer - should pay for. - -3. ~~**`openvino` takes over silently and is 172x slower.**~~ **Done, and re-measured on Intel - hardware (2026-10-12): the cost was understated.** `openvino` is in - `LlamaLoader.OPT_IN_BACKENDS` and declared by the `optin` column of `natives.csv`, so its jar - does nothing until `net.ladenthin.llama.backend` names it. On an `m7i.xlarge` (Sapphire - Rapids, no accelerator) the real figures are **21.7x slower prompt processing and 336x - slower generation** -- 481.3/33.6 down to 22.2/**0.1** tokens per second, about ten seconds - per token -- not the 17x/172x first recorded. Two things that run settled which the earlier - one could not: **without an OpenCL ICD the module does not open at all** (2 backends, full - CPU speed; `ocl-icd-libopencl1` is what changes the answer), and **with the jar on the - classpath and the property unset the loader leaves it out** and the machine runs at full - speed -- the only hardware proof the opt-in decision has, since CI has no Intel accelerator - and nothing happening there proves nothing. The README carries the corrected numbers. - **`openvino` on a host without an Intel accelerator is 172x slower, and takes over silently.** - Same CPU library, same machine: `cpu` only 490.4 pp / 34.5 tg, with the OpenVINO module present - 29.4 / **0.2** -- five seconds per token, over 27000 log lines mentioning OpenVINO. Its CPU plugin - contributes a *device*, so llama.cpp prefers it; this is the case the "a module whose vendor - runtime is missing is skipped" rule does not cover. It additionally needs **`libOpenCL.so.1`**, - which the OpenVINO archive does **not** contain and Ubuntu does not install by default - (`ocl-icd-libopencl1`) -- without it the module silently never opens, so a user can follow - OpenVINO's own instructions and still get nothing. That dependency is documented for Windows only, - where the OS supplies the loader. **Decision needed:** make the OpenVINO module **opt-in** instead - of additive, or document in the README that the jar needs an Intel GPU/NPU plus an ICD loader and - must otherwise stay off the classpath. - - -4. ~~**The loader's exception does not name the missing library.**~~ **Fixed.** It used to end in - "see the messages above" and print the `dlopen` reason to `System.err` separately, so a consumer - with only the stack trace could not tell "library missing from the jar" from "library present, one - `DT_NEEDED` dependency absent" -- and the second is the case that happens. The reason is now - carried into the thrown message, the way the Android branch of the same method already did it, - and `LlamaLoaderTest` pins both halves: a failed load records a reason, and a file that is simply - absent does not (so no stale message is reported as a load failure). - -5. **A shipped diagnostic entry point, for the support cost rather than for a feature.** Today a - consumer whose load fails opens an issue; the answer is almost always one of a handful of things - this project can already determine -- which platform the JVM reports, which natives jars are on the - classpath, which library backend and modules the loader selected, which `DT_NEEDED` dependency is - absent, which CPU module ggml picked and what the backend registry ended up holding. A - `net.ladenthin.llama.Diagnose` main printing exactly that turns a support thread into a paste. - The pieces exist: `NativeLoadSmoke` does the load half in CI, `JNI_OnLoad` already logs the - registry and devices at INFO, `buildcheck/nativedeps.py` parses ELF/PE/Mach-O (the Java side would - need only the `DT_NEEDED` list, or can simply report the `dlopen` reason that item 4 now carries). - Cheap, and it is the one item on this list that pays off per *user* rather than per release. - ### Modular natives -- follow-ups -Every platform a GPU can join ships modular since 6.0.0 (CLAUDE.md "Modular natives": `JLLAMA_BACKEND_DL` -library jars, `JLLAMA_MODULE_ONLY` GPU module jars, no fat jars). What is still open: - -1. **GPU modules on real hardware.** The 12 module-only jobs are build-only in CI; what no session can - see is a module *registering a device* out of the published jars: `cuda13-windows-x86-64` and +1. **Windows GPU modules on real hardware.** Verify device registration from the published jars: `cuda13-windows-x86-64` and `vulkan-windows-x86-64` next to `cpu-windows-x86-64` on the local agent's machine (RTX 3070 + AMD iGPU), the loader line naming both, llama.cpp listing the devices once each (`device_id` dedup), all layers offloaded, and the tg128 of the CUDA module against the 265.6 the static build measured @@ -906,29 +191,10 @@ library jars, `JLLAMA_MODULE_ONLY` GPU module jars, no fat jars). What is still across the set of loaded modules (`Vulkan0` was the NVIDIA GPU with CUDA loaded, the AMD iGPU without), so any device setting must go by name, never by index -- worth a README sentence once measured. -2. ~~**Benchmark on AVX-512/VNNI/AMX hardware**~~ **-- done 2026-10-11, see - [`docs/benchmarks/cpu-backend-modules.md`](docs/benchmarks/cpu-backend-modules.md).** All 14 x86 - modules now have numbers from one Granite Rapids machine (the first on which every level loads), - plus a Zen 4 machine and the Graviton 4 run. **AMX is worth +148 % on prompt processing** over the - Haswell baseline, and the plain `x64` module is **66x** slower than the chosen one, not the 10.4x - the Zen 3 figure suggested. The finding that outgrew the item: on all three machines - `ggml_backend_load_best` gives up **10-11 % of token generation** by picking the richest module, - and on aarch64 it also gives up 27 % of prompt processing -- it scores by feature level, not by - measured throughput. That belongs upstream (see "Upstream submissions"), not in a downstream - override. The original wording follows for the record: - **Benchmark on AVX-512/VNNI/AMX hardware** (Sapphire Rapids, Zen 4/5, Core Ultra). The Zen 3 - measurement could only show the floor: the plain x86-64 module is 10.4x slower at prompt - processing (313 -> 30 t/s, Qwen3-0.6B Q4_K_M) and 1.6x at generation than `haswell`, which is what - the single-level build was. The gain upwards (`zen4` BF16, `sapphirerapids` AMX) is unmeasured. -3. **Unsigned binaries.** Upstream ships its DLLs unsigned, and so do we; on a WDAC/AppLocker-managed - client, loading unsigned DLLs from `%TEMP%` is blocked. The README's troubleshooting section now - says so and names the way out (`net.ladenthin.llama.lib.path` to an allow-listed directory). The - project's GPG key cannot sign them: Windows checks Authenticode signatures (an X.509 code-signing - certificate, `signtool`/`osslsigncode`), not OpenPGP. **Owner's decision**, not scheduled: a - code-signing certificate (decided since: an SSL.com IV certificate in eSigner, see roadmap item - 11; Azure Trusted Signing takes no individual in Germany) plus a signing step over every `.dll` - before `package`. -4. **CUDA for Windows arm64 (`cuda13-windows-aarch64`) -- upstream builds it, we do not.** Their + Also check whether CUDA, Vulkan and OpenCL deduplicate the same NVIDIA GPU by `device_id` + and which backend wins. Linux CUDA on a Tesla T4 has already been measured; see + [the GPU module measurements](docs/benchmarks/gpu-module-jars.md). +2. **CUDA for Windows arm64 (`cuda13-windows-aarch64`) -- upstream builds it, we do not.** Their `windows-cuda` job is a matrix over `x64` and `arm64`, the latter through `cmake/arm64-windows-msvc-cuda` plus the arm64 `cudart`/`cublas` redistributables. This project has `cuda13-windows-x86-64` only. The arm64 Windows toolchain already exists here (the `cpu` and @@ -938,97 +204,34 @@ library jars, `JLLAMA_MODULE_ONLY` GPU module jars, no fat jars). What is still than fewer" policy that governs the ROCm targets applies. **Not** a gap: Linux aarch64 CUDA (Jetson, Grace-Hopper) -- upstream does not build that either, so it would be new ground. -5. **A Vulkan module for Android** (`vulkan-android-aarch64`, upstream ships none either): `JNI_OnLoad` +3. **A Vulkan module for Android** (`vulkan-android-aarch64`, upstream ships none either): `JNI_OnLoad` already tries `libggml-vulkan.so` by soname, so it is one more module-only dockcross job plus the natives-jar wiring and an AAR flavor -- if anyone asks. -6. **Addressed on 2026-10-22, the CI number still to read** (CLAUDE.md "sccache on every Windows - Ninja job" and "CI build cache"): the Windows ROCm job caches through - `llama/cmake/msvc-runtime-gnu-clang.cmake`, the Linux one through `CMAKE_HIP_COMPILER_LAUNCHER` in - `build.sh`; measured locally with one GPU target, 325 s -> 25 s and 310 s -> 10 s warm. **Open:** the - two jobs' build steps in the second run after the merge (the first fills the cache), with all 23 / 27 - targets, and the cache size that adds on Depot. A llama.cpp bump that touches the headers every HIP TU - includes (`common.cuh`, `ggml.h`, ...) is still a cold build -- 6 of the 17 bumps from b11558 to b11815 - did, 11 touched none of them. The history follows: - **The Windows ROCm job is the pipeline's critical path, and it builds uncached.** **Measured in run - 38149667195: both ROCm jobs were still compiling after 2 h 23 min**, with every other build job - finished (50 of 56 green) and `Package JARs` not started -- so everything behind `package`, which - is the whole point of a round-0 run, waits on them. The dllimport flood above sits in the same job - but is not the cause: 23 GPU targets' kernels are. Suppressing the warnings makes the log readable, - not the build faster. - The original entry follows: - **The Windows ROCm job is the pipeline's critical path, and it builds uncached.** Run 38069595101 - (the second full run of the modular natives): 4:15 h for its build step, against 2:00 h for the - Linux ROCm job and 1:41 h for the Windows CUDA job; every other Windows build is under 20 min. Of - its 158 ninja steps ~140 are HIP TUs, each compiled for the 23 `GPU_TARGETS`; on Windows upstream - compiles them as C++ with TheRock's clang, a plain clang, so they go through sccache -- and sccache - 0.18.0 refuses every one of them for the `-Xclang` that CMake puts on any plain-clang Windows TU - (CLAUDE.md "sccache on every Windows Ninja job"; the job's stats table: 67 requests, all - non-cacheable, 0 compilations). What would shorten it: a sccache that accepts `-Xclang` -- re-test - on every `SCCACHE_DL_VERSION` bump, the stats table in the job summary answers at once, and do it - on a branch with one dispatched run, because `build.bat`'s unconditional retry turns a sccache that - accepts the flag but mishandles the 23-target `--offload-arch` compile into a second 4 h build -- - or fewer `GPU_TARGETS`, against the policy of building every target TheRock builds (CLAUDE.md - "Additional GPU-backend natives"). - -### The FetchContent nlohmann/json is shadowed by upstream's vendored copy - -Measured at the b11556 bump (`llama/build/CMakeFiles/jllama.dir/flags.make`): `llama.cpp-src/vendor/nlohmann/..` -is include dir number 7 on every `jllama` compile line and the FetchContent `json-src/include` number 12, so -`log_helpers.hpp` and `train_engine.cpp` -- the two project TUs that `#include ` directly -- -compile against upstream's **vendored** copy, as every upstream TU does. That is the good case (one copy per -TU, no ODR mix), and it became visible because b11556 (#30253) applies `vendor/nlohmann/json-deep-nesting.patch` -to that copy, so it is no longer byte-identical to the `v3.12.0` our `FetchContent_Declare(json ...)` fetches. -The FetchContent copy is therefore dead weight: a clone per fresh build directory, a `nlohmann_json` link on -`jllama` and `jllama_test`, and a tag (`v3.12.0`) that looks like something to keep in sync. **To do:** drop -the FetchContent block and the two `nlohmann_json` links, include the vendored copy through `llama-common`'s -interface (what already happens), and keep one guard: a configure-time check that exactly one `nlohmann/json.hpp` -is on `jllama`'s include path, so a future upstream move of the vendor directory cannot silently flip the order -back. Not done in the bump PR on purpose -- a bump changes the pin, nothing else. - -### sccache and `-Xclang`: worked around here, one flag upstream - -**No longer waiting.** Until 2026-10-22 this entry read "nothing to do but watch": sccache refuses any -TU carrying an `-Xclang` argument it does not know, CMake's `Platform/Windows-Clang.cmake` puts -`-Xclang -flto-visibility-public-std -D_MT -Xclang --dependent-lib=libcmt` on every plain-clang Windows -TU (`CMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded`), and so `build-windows-x86_64` (719 of 720 requests -non-cacheable at b11538) and `build-windows-x86_64-rocm` (the pipeline's critical path, 2:40-4:15 h) -cached nothing. `llama/cmake/msvc-runtime-gnu-clang.cmake` now maps that runtime selection to the -driver flag `-fms-runtime-lib=static`, which hands cc1 the same flags without `-Xclang`; measured and -explained in CLAUDE.md "sccache on every Windows Ninja job". - -**What the four issues this entry listed actually are, read in sccache's source** (`main` and v0.18.0, -2026-10-22): sccache knows `--dependent-lib` (PR #1500, which was exactly "-Xclang on Windows CMake") -and `-fno-pch-timestamp` (#1721); the one flag of the sequence it does not know is -**`-flto-visibility-public-std`**, and no issue or PR names it. #1122 (generic pass-through) has been -quiet since 2022, #1603 and #2522 are other flags, and #2717 is a PR (for `-fno-cxx-modules`), not an -issue. sccache adds `-Xclang` flags one PR at a time. - -**Optional upstream follow-up:** a one-line PR adding `flag!("-flto-visibility-public-std", -PassThroughFlag)` to `src/compiler/clang.rs` with a test of CMake's full sequence. It would let a -plain-clang Windows build cache without this project's override; nothing here depends on it. - -### CUDA job: nvcc through sccache (`SCCACHE_WRAP_NVCC`, off since the second failure) - -**Checked 2026-10-12: there is nothing to bump to.** `SCCACHE_DL_VERSION` is 0.18.0 and that is the -newest release (2026-09-14). The `-Xclang` refusal that also costs the plain-clang Windows jobs their -cache is tracked in open sccache issues (#1603, #2522, #2717, #1122), none merged. So the -re-test recipe below is still the right one -- it just cannot be run yet. Re-check on the next -sccache release rather than on a schedule. - -- Run 37680715063 (b11476 bump) and run 37925157175 (#492, 2026-10-09): the Linux CUDA build logged - `sccache: caused by: Missing "cubin" file output` and `sccache: Compiler killed by signal 126` on - the first three `.cu` TUs, one minute into the build, and `build.sh`'s retry rebuilt everything - without any launcher (green; 86 min in total the second time, longer than a cold build). Not the - CUDA 13.3 `-virtual` `.ptx` failure, and not a storage error (the gcc probe passed and the gcc TUs - were being served): sccache 0.18.0 and CUDA 13.4's nvcc disagree on the device-compile command - line, in every job log examined since the 13.4 bump of 2026-09-27 (also runs 37643964068 and - 37831180985; the retry alone takes 47-80 min depending on the runner, and no job came near the warm - ~15 min). Since the second confirmed occurrence `build.sh` - wraps nvcc only with `SCCACHE_WRAP_NVCC=true` (CLAUDE.md "Fast local CUDA builds"), so the gcc TUs - stay cached and nvcc runs directly from the start. **Open:** re-test the opt-in with a newer - sccache (bump `SCCACHE_DL_VERSION` on a branch, set the variable on the CUDA job for one PR run, - look for CUDA hits in the stats table) and flip the default back when a warm run shows them -- the - win was ~51 -> ~15 min with CUDA 13.2. +4. **Measure warm ROCm CI cache performance.** Read the second run's build timings and cache + size for both ROCm jobs with the full GPU target lists. Local single-target measurements already + exist in CLAUDE.md ("sccache on every Windows Ninja job" / "CI build cache"); the implemented + Windows runtime-flag workaround and Linux HIP launcher no longer need implementation work. + +### sccache — optional upstream and nvcc follow-ups + +- **After the release:** propose support for `-Xclang -flto-visibility-public-std` in sccache + (`src/compiler/clang.rs`, `PassThroughFlag`, with a test of CMake's full sequence). The Windows + workaround in `llama/cmake/msvc-runtime-gnu-clang.cmake` already permits caching; see CLAUDE.md + "sccache on every Windows Ninja job". This is independent of the nvcc issue below. +- **nvcc caching is on again (2026-10-25), the CI number is still to read.** The 0.18.0 failures + (`Missing "cubin"` / `Compiler killed by signal 126`) came from ggml's default arch list + (`90-virtual`, mozilla/sccache#2862), which this project no longer builds since 2026-10-11; the + signal line was an exit code printed as a signal, fixed in sccache 0.19.0 (#2932), the pinned + version now. **Open:** the Linux CUDA job's build step in the second run after the change (the + first fills the cache): CUDA hits in its `### sccache statistics` table and the time against + ~100 min today. If it fails or does not hit, `SCCACHE_WRAP_NVCC=false` on the job switches it off + again. The Windows CUDA job does not wrap nvcc at all (`build.bat`); whether 0.19.0 parses its + command line (#2470, fixed by #2811 since 0.18.0) is a separate, untested question. +- **Windows CPU jobs hit the cache only partly** (about 54 % in the last warm runs read), while the + Linux jobs are near 100 %. Not investigated: compare the cache keys of two runs of the same commit + (`SCCACHE_LOG=debug` on one job) before assuming a non-deterministic flag. +- **Upstream sccache, open on their side:** mozilla/sccache#2809 (the `-virtual` arch fix, not ours) + and #2788 (`--offload-compress` in preprocessor cache mode; a nudge after the release). ### RPC backend — follow-ups @@ -1059,25 +262,20 @@ sccache release rather than on a schedule. tunnel. Only worth doing if it lands upstream. - **RDMA transport** (`GGML_RPC_RDMA`) as its own classifier, since it needs `libibverbs` at runtime. - **Several clients at once.** Upstream's server serves one connection at a time. -- **Server-to-server comm (`-sm tensor`, llama.cpp b11450) widens what a client can make the server do.** - #26610 lets a client tell two RPC servers to form a pair (`RPC_CMD_COMM_INIT`): the rank-0 server - then *listens on `0.0.0.0`* on a port the client names (`socket_t::create_server("0.0.0.0", port)` - in `rpc_server::comm_init`) and blocks in `accept()` until the rank-1 server connects. Two - consequences for the in-JVM `RpcServer`: (1) `startLocal` binds loopback only, but a local client can - still open a listener on every interface; (2) `close()` cannot end that wait -- - `ggml_backend_rpc_stop_server()` shuts down the *client* socket and wakes the *main* listener, not - the comm listener -- so if the peer never connects, the server thread and `close()` hang. Not - reproduced; found reading the diff at the bump. Fix candidates for `0015`: bind the comm listener to - the server's own host and register it with the stop machinery so a stop also wakes it. +- **Edges of `0015`'s stoppable server, from the review of 2026-10-25 (none seen in CI).** + `wait_socket()` waits with `WSAPoll`, which before Windows 10 2004 does not report a refused + non-blocking connect, so a peer connect there waits for the stop instead of failing; checking + `SO_ERROR` while the wait times out would close that. An `accept()` error other than "would block" + ends the serve loop, as it does upstream (a retry on `ECONNABORTED`/`EMFILE` would keep it alive). + `test_rpc_comm.cpp` takes ports from `free_port()` (bind to 0, close, reuse), which another process + can take in between; a bind failure there is a flaky test, not a defect. Each needs a Windows + build to verify and belongs into the upstream submission of `0015`. ### Atmosphere coding agent (`llama-atmosphere-agent/`) — follow-ups -The headless loop is verified, including the model-backed CI job (run 35600558852: tool call -answered, read→write→read loop changed the file). Still open: - - **Tool rounds across REPL turns ride as a note, not as `tool_calls` messages -- and that cannot change on this Atmosphere.** The earlier entry here asked to keep the full `ChatMessage` list - (incl. `tool_calls`/`tool`) per turn; measured against `atmosphere-ai` 4.0.72, that is impossible: + (incl. `tool_calls`/`tool`) per turn; the recorded measurement used `atmosphere-ai` 4.0.72: `AbstractAgentRuntime.assembleMessages` rebuilds every history entry as `new ChatMessage(h.role(), h.content())` (checked in the bytecode), so the tool-call array and the tool-call id never leave the framework. What ships instead: `AgentSession.toolNote` carries each @@ -1104,13 +302,13 @@ The `OpenAiCompatServer` surface itself is shipped (routes, protocol translation round-trips — see CLAUDE.md "Two server modes"). **Owner priority: the native-transport `NativeServer` comes first; Java-transport-only items below are deliberately deprioritized.** -- **Streaming raw-completion remainder:** (a) streaming `POST /v1/completions` is DONE; remaining are - (b) token-streaming Ollama `/api/generate` (translate `text_completion` chunks to NDJSON, mirroring - the chat→Ollama translator) and (c) Continue's native `POST /completion` route in the llama.cpp-native +- **Streaming raw-completion remainder:** token-streaming Ollama `/api/generate` (translate + `text_completion` chunks to NDJSON, mirroring the chat→Ollama translator) and Continue's native + `POST /completion` route in the llama.cpp-native streaming shape (`{"content":…,"stop":…}` per chunk). Java-only server wiring. -- **Future *output* modalities (audio / image) — design note, not yet actionable.** llama.cpp's server - produces text (plus embeddings/rerank) only; the integration points are isolated (a new - `OpenAiBackend.stream*` primitive + `OpenAiSseFormatter.*Chunk` per modality). Two future hooks: +- **Future *output* modalities (audio / image) — design note, not yet actionable.** The Java + transport's integration points are isolated (a new `OpenAiBackend.stream*` primitive + + `OpenAiSseFormatter.*Chunk` per modality). Two future hooks: the existing `TextToSpeech` (Qwen3-TTS since llama.cpp b10270 — OuteTTS no longer exists upstream) behind an `/v1/audio/speech`-style route; proxying image/audio generation to an external model. Keep chunk formatters modality-neutral. @@ -1126,119 +324,13 @@ round-trips — see CLAUDE.md "Two server modes"). **Owner priority: the native- Responses client) at a running server, since round-trips confirm wire shapes but not each client's parser. -### Code-sign the Windows DLLs (SSL.com IV + eSigner -- decided 2026-10-15, roadmap item 11) - -**What.** An **IV (individual validation) code-signing certificate from SSL.com, held in eSigner**, -SSL.com's cloud HSM: CI signs Windows PE files over HTTPS without a hardware token, with jsign on -the Linux runner. Prices at the time of the decision, to be re-read before ordering: the IV -certificate ~129 USD/year, eSigner ~15-20 USD/month, **metered per signature** -- and a signed run -signs 35 files (`jllama.dll`, `llama.dll`, `mtmd.dll`, `ggml.dll`, `ggml-base.dll`, `ggml-rpc.dll` -and the 14 `ggml-cpu-.dll` of the x86-64 jar, the 7 of the arm64 jar, one module per -Windows GPU jar), so the quota is read against that. The traditional alternative -- an OV/EV -certificate -- is several hundred euros a year **and** has required a hardware token since 2023, -which a GitHub runner cannot use, so it is not a real option for this pipeline. - -**Azure Trusted Signing was the first decision of that day and fell on the same day:** Microsoft's -identity validation offers no path for an individual in Germany (the country is not in the list for -individual validation), the organisation form requires a registered business, and the signing -account created in the meantime costs 9.99 USD/month -- it is to be deleted. The paragraphs below -record what was learned about it, because the question "why not Azure" will come back. - -**Why it is worth considering here specifically.** This project's DLLs are **extracted from a jar -into a temp directory at run time and loaded with `System.load`**, which is exactly the shape -antivirus and EDR products treat as suspicious: an unsigned native library appearing in `%TEMP%` and -being loaded by `java.exe`. A signature does not silence a SmartScreen installer prompt (there is no -installer), but it is what lets an enterprise allowlist the files by publisher instead of by hash, -and it removes the "unknown publisher" class of false positive that a consumer cannot debug. There -is no evidence of a user hitting this yet -- so this is prevention, not a fix, which is why it is a -decision rather than a task. - -**The gatekeeper of Trusted Signing, measured:** it requires **identity validation**, and for an -**individual** the form accepts only a list of countries that does not include Germany; an -organisation needs a verifiable legal entity. That was found by trying, after the account had been -paid for -- which is the lesson: **validate the identity path before paying for anything**, with -any provider. SSL.com's IV validation is the path that exists for a private person in Germany. - -**How it hooks into GitHub.** jsign (`--storetype ESIGNER`) in a job of its own, -`sign-windows-natives`, between the Windows build jobs and `package`: it downloads the Windows -natives artifacts, signs every DLL, flips `signed=` and re-uploads the artifacts under their names, -so `package` merges signed files. Note what that touches on our side: signing **modifies the -files**, so it happens before `merge-native-artifacts.sh` and `package-smoke-sets.sh` -- both -compare files byte for byte -- and the signature must survive the jar round trip (it does; a PE -signature is part of the file). Signing *after* packaging would mean re-writing jars and -re-checking them, which is strictly worse. **Why the secrets are dangerous and how that is held:** -eSigner authenticates with username, password, credential id and the **TOTP secret** -- whoever can -read those four from a workflow can sign in the owner's name, and a GitHub secret is readable by -any workflow of the repository. So they live in the `maven-central` environment (the GPG key's -rules apply), reach exactly one job, and that job runs only on an explicit dispatch with the -`sign_windows` switch -- never on a push, a pull request or inside `package`. - -**What it does not cover.** Linux has no equivalent and needs none. **macOS is a separate purchase -and a separate problem**: a Developer ID certificate (Apple Developer Program, ~99 USD/year) plus -notarisation, and the dylib is already ad-hoc signed by the linker -- which is what -`smoke-natives-macos` verifies with `codesign --verify --strict` after a corrupt dylib shipped in -three releases. The two decisions were not bundled, and the macOS one is **no** (2026-10-15): the -dylib ships ad-hoc signed, with the `.asc` and the Sigstore attestation as its provenance. - ### License compliance gate (owner's decision) -The FSFE REUSE check is green on every run. A FOSSA-style *dependency-license* gate (the scanner -whose "17 issues found" status once posted on PRs #248/#298; it posts nothing on `main` today) was -never set up deliberately. Whether the project wants one, with which policy, is the owner's call; -nothing here blocks on it. - -### ~~Drop patch `0012` at the first bump that carries #29677~~ -- done at the b11632 bump - -**Done at b11632** (the first number carrying the fix is b11626, `df18bee11`; the bump went to master's head of the day, b11632, pinned through `JLLAMA_GIT_COMMIT` ahead of the tag). The applier fired as predicted in reverse: `0012` does **not** apply at `df18bee11` (upstream's line sits inside the block the patch replaces), so the drop was forced, not silent. The guard went with it -- see the `0012` note in `docs/history/dropped-llama-patches.md` for why no replacement exists. The text below is the plan as it stood, kept for the reasoning. - -**The drop-check of `0012` fires at the first bump to a tag that contains `df18bee11` -- not at b11612, and not at b11617 either** (checked: no tag up to b11618 carries it; b11617 still divides by `split_sum` unguarded at `src/llama-model.cpp:1648`). On 2026-10-14 upstream -merged [ggml-org/llama.cpp#29677](https://github.com/ggml-org/llama.cpp/pull/29677), commit -[`df18bee11`](https://github.com/ggml-org/llama.cpp/commit/df18bee11e96557b07aa7b12db0976f3c7ac9165) -("model: split layers evenly when no device reports free memory"), one line in `load_tensors()`: - -```cpp -splits[i] = split_sum != 0.0f ? splits[i] / split_sum : float(i + 1) / n_devices(); -``` - -That is the even-split fallback `patches/0012` carries in `llama_model_splits_normalize()`, 15 commits -**after** b11612 (`10da8c463`) on master -- at b11612 `src/llama-model.cpp:1648` is still the bare -`splits[i] /= split_sum` (measured on the pristine tag), so the patch is still carried at this pin and -applies unchanged. The PR touches `src/llama-model.cpp` only: no warning, no diagnostic on the device -lookup, **no test**. - -**The rule for the bump that crosses it:** - -1. `git grep -n split_sum src/llama-model.cpp` at the new tag. The guarded line is there → **drop - `0012`, do not refresh it.** The applier will not say so: `0012` applies *next to* upstream's line - (its hunks lift the two blocks out of `load_tensors()` and touch other lines), so it keeps applying - cleanly -- the `0010` case, "still applies, no longer needed". Delete the patch file; its `CLAUDE.md` - row moves to `docs/history/dropped-llama-patches.md` with the note below. -2. What goes with it, deliberately: the `LLAMA_LOG_WARN` naming the cause, the bounds check in - `llama_model_splits_select_device()` whose message names layer, index and split points (upstream keeps - `devices.at()`, so a malformed split still reads `"vector"`), and the never-compiled upstream - `tests/test-model-split.cpp`. None of that is worth a patch on its own. One thing upstream's line does - **not** cover, for the record: a NaN weight (`-ts nan,1` -- `std::stof` accepts it, `NaN != 0.0f` is - true) still produces NaN split points and the bare `"vector"`; `0012`'s message named it. If that ever - matters it is a separate upstream issue, not a reason to keep the patch. -3. **The guard `src/test/cpp/test_model_split.cpp` cannot stay as it is.** It links - `llama_model_splits_normalize` and `llama_model_splits_select_device`, which exist only through the - patch -- without it `jllama_test` fails to link on every platform. That was the design (a dropped - patch reds `C++ Tests`), and at the drop it works against us; and upstream shipped no test the guard - could be re-pointed at. So the guard is replaced by one over upstream's contract, like `0010` / `0011`: - - **Preferred: an end-to-end test through the real load path**, the only public route to the fixed - line. The backend-independent trigger the `0012` row documents is `--tensor-split 1,-1`, which needs - **two** devices: two loopback RPC servers serving the CPU (`test_rpc.cpp`'s `loopback_server`) - register two GPU-type devices; load a tiny GGUF written with the `gguf` API (as `test_kolibri1.cpp` - does) with `tensor_split = {1, -1}` and every layer offloaded. At an unfixed tag the load fails - (`std::out_of_range` from `devices.at()`, the bare `"vector"` in the log); at a fixed one it loads - with the layers split evenly. That pins upstream's line on every platform in `C++ Tests` without a - patch. **Verify first** that two `ggml_backend_rpc_start_server` instances coexist in one process - (`0015`'s stop mechanism is global state); if they cannot, this option is out. - - **Otherwise the guard goes with the patch**, and the drop note says why no unit-level guard is - possible (the line sits inside a member function with no seam). Do **not** keep a refactor-only - residue of `0012` just so the test keeps linking: that is a patch to refresh on every bump for a line - upstream owns, the exact thing the drop rule exists to avoid. -4. `patches/0012`'s header and `test_model_split.cpp`'s header carry the same pointer to this section. +The FSFE REUSE check is green on every run. FOSSA analyses the dependencies against the policy the +four Maven repositories share (`.fossa.yml`; rules and the version-specific decisions in +[`docs/dependency-license-review.md`](docs/dependency-license-review.md)), and its "License +Compliance" check reports open findings as review requests, not approvals. Which of them block a +release, and which get a documented component decision in FOSSA, is the owner's call. ### Upstream submissions -- not before the release (policy) @@ -1258,89 +350,39 @@ three different subsystems and a combined report gets triaged as one. | 3 | `ggml-rpc: the client answers every supports_op with true` | the RPC section of `CLAUDE.md`: a served device that lacks an op **aborts the server**. Reproduced on the macOS CI runners' paravirtual Metal GPU, which has no `MUL_MAT` and took the first run down; it is why every test here serves `CPU` by name | upstream's own TODO comment admits it. Should the client forward the query to the server, or should `rpc-server -d` refuse a device whose op set it cannot report? | | 4 | `windows-rocm: 83,362 compiler warnings, against 9 on linux-rocm` | the table below in this section (714,345 log lines against 2,455; the per-class counts; all of them in `ggml/src/ggml-cuda/*.cu`) | the cause is the language, not the arch count: HIP sources are compiled as plain C++ on Windows (`CXX_IS_HIPCC` on `WIN32`) and as HIP on Linux. Fix the warnings, or the C++-on-Windows choice? Their own `windows-rocm` job pays the identical cost | -#### ~~A fifth: the ARM fp16 conversion~~ -- MERGED as llama.cpp#30505 (b11761), patch 0019 dropped - -**Done 2026-10-14, merged 2026-10-20.** [ggml-org/llama.cpp#30505](https://github.com/ggml-org/llama.cpp/pull/30505), -one commit, `+13/-3` in `ggml/src/ggml-cpu/simd-mappings.h`, merged as `119f68d7d` = **b11761** (the code lines -as submitted, the comments shortened by the maintainers). Carried downstream until then as -`llama/patches/0019-ggml-cpu-select-the-neon-fp32-to-fp16-conversion.patch`, dropped at the b11761 bump -(`docs/history/dropped-llama-patches.md`); the full measurement record is -[`docs/benchmarks/arm-fp16-conversion.md`](docs/benchmarks/arm-fp16-conversion.md). - -**Rebased the same day, at the maintainer's request, and the rebase changed the change.** `#30343` -(`685f70894`) landed 26 minutes before that request and takes back half of `#30270`: F16C keeps -`fp32->fp16` and `fp16->fp32` goes back on the lookup table, because clang lowers the intrinsic into -the live accumulator register of the quantized dot products and serialises the loop (45-65 % slower -Q8_0/Q4_0 `MUL_MAT_ID`, measured by its author). Two consequences, both measured here with `clang -E` -before anything was pushed: the guard's `FP16_TO_FP32` half would have **fired on every x86 F16C -build**, so it carries `&& !defined(__F16C__)` with the issue link on the condition line; and the -F16C *move* was dropped from the PR, since the block is now a documented exception rather than a -stray placement. A third thing fell out of it -- the guard's position is no longer merely the better -of two, because directly after the `#elif` chain it does not build at all on x86+F16C (#30343 leaves -the F16C selection *below* the lookup-table declarations). The downstream patch is the rebased diff -byte for byte and applies at the pin **and** on master. - -What remains to do here is the **drop-check on every llama.cpp bump**, which the patch header states --- and whose output must be **read, not tested**: - -```bash -git show :ggml/src/ggml-cpu/simd-mappings.h \ - | sed -n '/^#if defined(__ARM_NEON)/,/^#elif/p' | grep -n GGML_CPU_FP32_TO_FP16 -``` - -Nothing printed means the patch is still needed; one line means the PR merged and the patch is -**dropped rather than refreshed**. The loose form of that grep over the whole file returns **three** -hits at every tag so far (`__POWER9_VECTOR__`, `__riscv_zfhmin`, the out-of-chain `__F16C__` block), -two of them with the NEON line's own indentation -- run as `grep -q` at b11639 it answered "upstream -merged it, drop the patch" while `git apply --check` of the patch was clean. That contradiction is -the whole lesson, and it now stands in each patch header and in `CLAUDE.md`. +#### Submission rules and remaining patches **Two rules for the day.** State the measurement and ask the question; do not propose the fix for 1-3, because each is a design decision in code this project does not own. And say plainly what was done downstream instead (the opt-in, the non-aborting registration, the `-w` on `ggml-hip`), so a maintainer can see what a merged change would let this project delete. -A fifth report is **not** for llama.cpp: sccache refuses every TU carrying an `-Xclang` argument it -does not know, and CMake's runtime-library selection puts `-Xclang -flto-visibility-public-std` on -every plain-clang Windows TU. Worked around here since 2026-10-22 -(`llama/cmake/msvc-runtime-gnu-clang.cmake`); the upstream side is a one-flag PR to sccache, see -"sccache and `-Xclang`" above. - -There are **twelve** patches today (`0001`-`0003`, `0006`-`0008`, `0014`-`0019`). Each +There are **twelve** patches today (`0001`–`0003`, `0006`–`0008`, `0014`, `0015`, +`0017`, `0018`, `0020`, `0021`). Each accepted upstream change deletes a patch from the bump checklist once the pin is bumped past it. - **Submittable as they are** (self-contained, no jllama specifics): `0001` (Windows arg-parse embed guard, already reported as ggml-org/llama.cpp#26416 with the reproducer in `docs/upstream-investigation-win32-argv-substitution.md`; the maintainers have not picked a direction), `0002` (preserve the caller's load-progress callback), `0006` (embeddable - `llama_server`), `0007` (`llama_server_attach`), `0008` (`LLAMA_SERVER_WORKER_CMD`), ~~`0012`~~ (zero - split-sum guard -- **fixed upstream independently on 2026-10-14 by #29677**, nothing left to submit; - dropped at the first bump that carries #29677, see the section right above), `0014` (`common_log_set_callback`), `0015` + `llama_server`), `0007` (`llama_server_attach`), `0008` (`LLAMA_SERVER_WORKER_CMD`), `0014` (`common_log_set_callback`), `0015` (non-aborting RPC registration, stoppable server, transport fixes), `0017` (x86 prefetch helper), **`0018`** (the AMX buffer released with `free()` instead of `ggml_aligned_free` -- one line, with the 6/6-against-0/6 measurement in its header and a configure-time guard that is red without it; the clearest submission of the set, since the defect reproduces on any AMX machine and the fix - copies the line `ggml-backend.cpp` already has). + copies the line `ggml-backend.cpp` already has), `0020` (validate leaf allocations before + reusing a graph allocation), `0021` (invalidate the slot prompt cache when server LoRA adapters + change; both hunks have independent drop-checks in `CLAUDE.md`). - **Permanent:** `0003` carries upstream PR #22393, which upstream closed without merging. -- **Temporary carry, not a submission:** `0016` (Kolibri-1). Upstream will add the architecture itself - ([ggml-org/llama.cpp#29922](https://github.com/ggml-org/llama.cpp/issues/29922)). Drop it on the - first bump whose tag registers `kolibri1` (`git grep -n kolibri src/llama-arch.cpp`) and keep - `src/test/cpp/test_kolibri1.cpp`: its numerical comparisons must stay green (red there is a finding - about upstream, not a test to adjust), its GGUF-format rows follow upstream's converter -- a red row - means the published GGUFs of that dialect stop loading without the patch, which is decided - deliberately (a small compatibility patch, or a note that those files must be reconverted). Open - verification gaps: no run of the real 78B model (60 GB of shards need more than the 63 GB of RAM - the measuring machine had) and no GPU backend. - **Two upstream-only defects worth an issue on that day, no patch here:** a lost RPC server mid-inference still aborts the process (the ggml backend interface has no error return for a lost device), and ggml-rpc's client answers every `supports_op` with `true`, so a served device without - an op aborts the server (both under "RPC backend" above). And sccache 0.18.0 refuses any TU that - carries an `-Xclang` argument, which on Windows every plain-clang TU does -- CMake's runtime-library - selection puts it there -- so no plain-clang Windows build caches at all (CLAUDE.md "Windows - natives"); that one is an sccache issue, if none is open. + an op aborts the server (both under "RPC backend" above). The separate sccache flag proposal is + listed under "sccache — optional upstream and nvcc follow-ups"; the local workaround already + permits plain-clang Windows caching. - **A fourth, measured 2026-10-11 and again 2026-10-12: the Windows HIP build produces 83,362 - compiler warnings, and the Linux one produces 9.** The dllimport note below was the first - symptom; the full measurement came from run 38172107721, where the Windows ROCm job's log was + compiler warnings, and the Linux one produces 9.** The full measurement came from run + 38172107721, where the Windows ROCm job's log was **714,345 lines with 83,362 warning messages** against **2,455 lines and 9 warnings** in the Linux ROCm job -- the same upstream sources, the same TheRock clang, the same 23 GPU targets. It is **60x larger than the next biggest job of that run** and carries **98.5%** of all the warnings its @@ -1367,25 +409,6 @@ accepted upstream change deletes a patch from the bump checklist once the pin is where it is legible. **Worth an upstream issue with this table** -- the fix is theirs (either the warnings or the C++-on-Windows choice), and their own `windows-rocm` job pays the same cost. -- **The original dllimport note, which is one of the eight classes above: `ggml.h`'s `dllimport` - form reaches the HIP *device* pass.** `GGML_API` expands to `__declspec(dllimport) extern` for a consumer of a shared - ggml on `_WIN32`, and HIP compiles every translation unit once per GPU architecture for the amdgcn - **device** target, which has no DLL storage class -- so clang reports - `__declspec attribute 'dllimport' is not supported` for each `GGML_API` declaration, times the 23 - Windows GPU targets. Counted in run 38149667195: **at least 1,374,762 warning lines** in the Windows - ROCm job, against 0 in the CUDA job and 8 in the SYCL one. That is a **floor rather than a total**, - and how it was found is worth keeping: two counts of the same log disagreed, with the *narrower* - pattern returning more matches than the broader one read later -- impossible unless the log was - still growing, which it was, because the job had not finished. A count off a running job is a - snapshot; say so or re-count at the end. Nothing is broken (the attribute applies on the - host pass and is meaningless on the device one), but it makes the log of the pipeline's - **critical-path, uncached** job unreadable for a real error and large enough that GitHub truncates - it. Suppressed downstream on the `ggml-hip` target only (`-Wno-ignored-attributes`, Windows only -- - see `llama/CMakeLists.txt`), which is a mitigation rather than the fix: **the fix belongs in - `ggml.h`**, where a device pass should not see the dllimport form at all. Upstream's own - `windows-rocm` job has the identical flood, so this is an issue to file with the counts, not a - patch -- a change to the `GGML_API` macro touches every consumer of ggml and is theirs to make. - - **A third, measured 2026-10-11: `ggml_backend_load_best` picks a slower CPU module than one it rejects.** On a Graviton 4 it selects `armv8.6_2` (198.0 t/s pp512) while `armv8.2_2` reaches **271.4** on the same machine and model -- the SVE/SVE2/i8mm paths losing to plain DOTPROD+FP16 -- @@ -1408,130 +431,48 @@ accepted upstream change deletes a patch from the bump checklist once the pin is of `tools/server/server-task.cpp` plus an assertion in `test_compat_anthropic.py`; downstream `AnthropicApiSupport` corrects it meanwhile. Small enough for a PR, so draft it then. -(`0009`, `0010`, `0011` and `0013` are gone -- upstream fixed each defect itself -- and recorded in -`docs/history/dropped-llama-patches.md`.) +Dropped-patch decisions, including `0012`, `0016` and `0019`, live in +[docs/history/dropped-llama-patches.md](docs/history/dropped-llama-patches.md). ### llama.cpp upstream feature exposure (queued, deferred by policy) -These are JNI plumbing items for upstream API additions. Policy: add only after a real user request — they are mostly relevant to specific model families or specialized workflows. - -- **Three upstream flags found by the b10878 flag audit, deliberately NOT implemented there.** The - audit that produced `test_model_flags.cpp` swept every option `common/arg.cpp` registers for - `LLAMA_EXAMPLE_SERVER` against what the Java layer emits (now `args.ModelFlag` + `args.ModelOption`; - at the time of the audit, the string literals in `ModelParameters`). Beyond the seven dead - flags it retired, it found ten option groups upstream had added since b10456 that the Java API - does not expose. Seven were already covered (`--kv-unified-per-slot`, `--mmproj-device`/`-mmdev`, - `--video-fps`, `--video-timestamp-interval`, `--video-ffmpeg-dir`, `--lazy-mode`/`-lzm`, - `--n-cpu-ffn`/`-ncffn`). These three are the remainder, left out of the correction PR on purpose - — it was a *fix* for an unloadable-model bug, and adding surface would have widened it: - - - **`--log-jsonl` / `--no-log-jsonl`** (a positive/negative flag pair, so it would fit `ModelFlag` - directly). The only one of the three with real consumer value, but it is **not a free addition**: - it flips `common_log_set_jsonl(common_log_main(), …)`, i.e. the process-wide llama.cpp logger, - whose console output (and, since `patches/0014`, the sink `LlamaModel.setLogger` hooks) it would - reformat. The project already has its own JSON logging at the Java level — the `args.LogFormat` - enum plus `log_helpers.hpp`'s `format_log_as_json` — so the two would overlap and could contradict - each other on the same stream. Deciding which layer owns the format is a **feature decision**, not a correctness fix, - and needs its own change with its own tests. - - **`--spec-synth-len` and `--spec-synth-rates`** — a documented non-goal, not deferred work. The - reasoning lives in its own entry below (**"deliberately NOT exposed, and this should stay that - way"**); it is not repeated here. - - Nothing is broken by leaving these out: `NativeServer` forwards raw llama-server argv verbatim, so - all three remain reachable that way. The gap is only in the typed `ModelParameters` surface. - -- **Request-key exposure, measured rather than guessed.** With `parameters.RequestField` in place the - gap is countable instead of arguable. The Java layer writes **57** request keys (47 checked against - llama.cpp's completion-request schema, 10 consumed by the OpenAI layer ahead of it); upstream's - schema declares **68** primary fields, and **22** of those nothing here writes: `logprobs`, `lora`, - `response_fields`, `return_progress`, `n`, `echo`, `max_tokens`/`max_completion_tokens`, the - `reasoning_*` family, `grammar_lazy`/`grammar_triggers`, `preserved_tokens`, `chat_format`, - `parse_tool_calls`, `adaptive_target`/`adaptive_decay` and `backend_sampling`. Same policy as the - flags above — add on a real request, not speculatively — but the list is no longer something a - future audit has to rediscover: re-derive it by diffing `RequestField.values()` against the field - table `src/test/cpp/test_wire_contracts.cpp` already walks. (Counts are from the b10883 pin; the - two numbers move independently, so re-measure rather than trusting them after a bump.) - -- **Video input (`ContentPart.videoFile(...)`).** `mtmd` has had an end-to-end video path since - llama.cpp **b9562** (#24269) — `mtmd_helper_video_init_params` was already present at the previous - pin, b10456. What **b10647** (#24318, commit `f29551215`) added is the surfacing: a fourth - `mtmd_helper_init_opt` parameter on the bitmap/tokenize helpers and the CLI flags `--video-fps`, - `--video-timestamp-interval`, `--video-ffmpeg-dir`. Older notes cite b10649 for all of it because - that was the *bump step* that carried it; b10647 is the tag that introduced it, and the video path - itself is older still. - - **The three flags are now exposed** as `ModelParameters.setVideoFps` / - `setVideoTimestampInterval` / `setVideoFfmpegDir`. They were initially refused at the b10649 bump - as "inert without a way to submit a video"; a later audit showed that reasoning was wrong on two - counts. First, they are not inert: `server_context::load_model` copies them into its own - `init_opt` when the projector loads, and that `init_opt` is what `server-context.cpp` passes to - `process_mtmd_prompt` on the task path this binding uses — so they take effect for any media the - caller attaches. Second, video decoding is genuinely compiled in: `MTMD_VIDEO` defaults to `ON` - (it needs only `LLAMA_SUBPROCESS`, also `ON`), and the shipped `libjllama.so` carries the ffmpeg - invocation strings. `setVideoFfmpegDir` is the one that matters most, because upstream otherwise - looks the binaries up on `PATH`, which a JVM process frequently does not have them on. - - What is still missing is the content part. Upstream's wire type is - `{"type":"input_video","input_video":{"data":""}}` (`video_url` with a `url` is accepted as - an alias), handled in `oaicompat_chat_params_parse` and gated on - `allow_video = mtmd_helper_support_video(mctx)`. Since b11803 it goes through the same - `handle_media(out_files, url, media_path)` as `image_url` (the `accept_base64_uri = false` of the - first version is gone), so raw base64, a `data:video/mp4;base64,...` URI and an HTTP(S) URL are all - taken; `ContentPart.videoFile(Path)` can emit the `data:` form the image factories build. - - (An earlier draft of this entry suggested smuggling video through - `ContentPart.imageBytes(bytes, "video/mp4")`, on the reasoning that `mtmd_helper_bitmap_init_from_buf` - sniffs the container. That is plausible — the `image_url` branch does pass - `accept_base64_uri = true` and does not validate the MIME string — but it is **untested here** and - additionally gated on `allow_image`, so it is not documented as a supported route.) - - Remaining work: the factory, a bytes overload, and an integration test. Note the runtime cost: - upstream **shells out to `ffmpeg`/`ffprobe`**, so a consumer needs those binaries, which makes the - feature untestable on a CI runner without them. - -- **`--spec-synth-len` / `--spec-synth-rates` — deliberately NOT exposed, and this should stay that - way.** Added in b10649. Upstream's own help text marks both **"(benchmarking only)"**: they - synthesise fake per-position acceptance probabilities so the speculative-decoding harness can be - measured without a real draft model. They are an instrument for benchmarking llama.cpp itself, not a - knob for an application, and exposing them as library API would invite callers to "tune" numbers - that fabricate rather than measure acceptance. Anyone who genuinely wants them already has them: - `NativeServer` forwards raw llama-server argv verbatim. - - **This is the single record for these two flags.** The b10878 flag audit (entry above) swept them up - again as "upstream options the Java API does not expose" and briefly carried its own copy of the - reasoning; that copy is now a pointer here. An audit re-finding them is expected and is not a signal - to reopen the decision — the audit answers "is this name reachable from Java", which is a different - question from "should it be". - -- **Expose `--spec-draft-backend-sampling` toggle via `ModelParameters.setSpecDraftBackendSampling(boolean)`.** Added in b9437 (env `LLAMA_ARG_SPEC_DRAFT_BACKEND_SAMPLING`). Backend sampling for the speculative draft is enabled by default upstream but auto-disabled on `LLAMA_SPLIT_MODE_TENSOR` setups; an explicit Java-side setter lets callers force-disable it for benchmarking or for backends with sampler bugs. Speculative-decoding power users. - -- **Expose runtime reasoning control via `InferenceParameters.setReasoningControl(boolean)` + `LlamaModel.endReasoning(...)`.** (F252, 2026-10-21, added the budget's tag fields to the builder but deliberately not `reasoning_control`: the flag only arms the sampler for the `reasoning_end` action below, so a setter without that action would do nothing. Both land together or not at all.) Added in b9444–b9490: new `common_params_sampling::reasoning_control` flag arms the budget sampler so reasoning can be ended at runtime, and new `common_sampler_reasoning_budget_force(common_sampler *)` triggers the end-of-thinking token injection on the next sample. Upstream also adds a `POST /v1/chat/completions/control` server endpoint accepting `{"id": "...", "action": "reasoning_end"}`. Java mapping would be: (a) `InferenceParameters.setReasoningControl(boolean)` arms the sampler on the inference run, (b) a new `LlamaModel.endReasoning(int slotId)` (or per-streaming-task-id) JNI method calls the upstream `common_sampler_reasoning_budget_force` against the slot's sampler. Useful for interactive UIs that want a "skip thinking and answer now" button. Relevant only for reasoning-trained models (DeepSeek-R1, Qwen3-Thinking, GPT-OSS-Reasoner, etc.). - -- **Expose `llama_context_params::n_outputs_max` via `ModelParameters.setMaxOutputs(int)`.** Added in b9444–b9490 (default `-1` = derived from `n_batch`). Caps the number of output slots allocated per context; relevant for memory-constrained setups that always run with `logits_all=false` and want to prevent over-allocation when `n_batch` is large. Trivial JNI plumbing (one `cparams` field passthrough); add when a user reports OOM on context creation tied to output slot pre-allocation. - -- **Expose Multi-Token Prediction toggle via `ModelParameters.setMtp(boolean)`.** Existed since the Qwen3.5 MTP work; b9444–b9490 extends it to Step-3.5. CLI flags `--mtp`/`--no-mtp` (env `LLAMA_ARG_MTP`) control whether the draft head runs alongside the main model for accelerated decoding. Java setter would route to `common_params_speculative::type = COMMON_SPECULATIVE_TYPE_DRAFT_MTP`. Relevant only for MTP-trained models. - -- **Expose `llama_vocab::get_suppress_tokens()` via `LlamaModel.getSuppressTokens()`.** Added in b9490–b9495 alongside the new `tokenizer.ggml.suppress_tokens` GGUF key and the `LLM_KV_TOKENIZER_SUPPRESS_TOKENS` constant. When a GGUF declares this array, upstream stores it on `llama_vocab::impl::suppress_tokens` and exposes it via the new `llama_vocab::get_suppress_tokens()` accessor. The bias is **applied automatically** inside the model forward graph — the Gemma4 Unified graph (`src/models/gemma4.cpp`) reads the list and adds a `-INFINITY` logit bias to those token IDs via a new `llm_graph_input_logits_bias` input so the model cannot emit them (used to block `` / `` placeholders). A Java mirror would be `public int[] getSuppressTokens()` on `LlamaModel`: a read-only inspector returning the suppression list for debugging or for callers running their own sampling who want to replicate the same bias. Value is low (the bias is auto-applied, Java callers cannot change it; java-llama.cpp does not expose custom logit-bias hooks at this level); cost is trivial (one JNI passthrough + a `getSuppressTokens()` Java method). - -### Feature backlog from similar projects - -The consolidated investigation lives in -[`docs/feature-investigation-similar-projects.md`](docs/feature-investigation-similar-projects.md) -(18 candidates across the 5 pure-Java sibling runtimes + llamacpp4j, with effort sizing). Everything -high-value from it has shipped, the jbang one-file example (`examples/jbang/Chat.java`) included. -Further per-repo findings in the doc can be pulled on demand; none is prioritized. - -### The ROCm Windows job runs with a CRT strategy that was never measured - -**Recovered from the session transcript on 2026-10-11; it had been stated repeatedly and recorded -nowhere.** The hybrid-CRT change reaches the ROCm Windows build through its plain-clang branch, and -that branch applies because the job compiles with HIP's own clang (`lib/llvm/bin/clang.exe` under -driver, so CMake's `MSVC` is false there. Before the change that job had **no** branch and therefore -the dynamic CRT; it now gets the hybrid one (`-fms-runtime-lib=static` plus -`/nodefaultlib:libucrt.lib`). That may be an improvement (fewer dependencies) or it may break the -link, and it is exactly the `/MT`-against-`/MD` mixture across library boundaries that the comment in -`CMakeLists.txt` warns about for SYCL and OpenVINO: **ROCm's device libraries may be built against -the dynamic CRT.** +Add typed API surface only after a real user request. Raw native-server argv already reaches +upstream options; absence of a Java builder method alone does not make a release blocker. + +- **JSONL logging:** decide whether the process-wide upstream logger or Java's `args.LogFormat` + owns the format before exposing `--log-jsonl` / `--no-log-jsonl`; the callback sink is shared. +- **Request-key coverage:** re-derive remaining gaps by comparing `RequestField.values()` and + the current upstream schema walked by `test_wire_contracts.cpp`. The old b10883 counts are not + a current API inventory; expose additional fields on demand. +- **Video input (`ContentPart.videoFile(...)` / bytes overload):** the three video configuration + flags are exposed, but the typed content part and its integration test remain. Emit upstream's + `input_video` wire shape with base64/data URI/URL as supported by the current parser. Do not + advertise the untested `imageBytes(..., "video/mp4")` workaround. A real test needs video-capable + model/projector fixtures and `ffmpeg`/`ffprobe` on the runner, because upstream invokes them. +- **`--spec-synth-len` / `--spec-synth-rates`: deliberately not exposed.** They synthesize fake + acceptance probabilities for upstream benchmarks. Keep them out of application builder API; + they remain reachable through raw `NativeServer` argv. +- **Draft backend sampling:** consider + `ModelParameters.setSpecDraftBackendSampling(boolean)` for speculative-decoding users who + need to disable `--spec-draft-backend-sampling` explicitly. +- **Runtime reasoning control:** `InferenceParameters.setReasoningControl(boolean)` and a + corresponding `LlamaModel.endReasoning(...)` action must land together. The flag only arms the + sampler; the action needs access to the running slot/task. The existing reasoning budget/tag + fields do not implement this runtime control (F252). +- **Output-slot allocation:** consider a `ModelParameters.setMaxOutputs(int)` mapping for + `llama_context_params::n_outputs_max` when a consumer needs the memory limit. +- **Multi-Token Prediction:** consider `ModelParameters.setMtp(boolean)` for MTP-trained models, + following upstream's current speculative-decoding configuration. +- **Suppressed-token inspection:** consider `LlamaModel.getSuppressTokens()` as a read-only + view of the model's `tokenizer.ggml.suppress_tokens`. Upstream already applies the bias; + this would expose diagnostics, not fix inference behaviour. + +### ROCm Windows — real Radeon runtime verification + +The ROCm Windows build uses HIP's clang as a plain C++ compiler, so it takes the hybrid CRT path +(`-fms-runtime-lib=static` plus `/nodefaultlib:libucrt.lib`). Linking succeeds; runtime behaviour +still needs measurement across the `/MT`/`/MD` library boundary, because **ROCm's device libraries +may use the dynamic CRT**. The same class of boundary is why CMake treats SYCL/OpenVINO separately. The job has been **green** since, so the link holds. What is unmeasured is the **runtime** behaviour of the resulting module on an actual Radeon GPU -- and that cannot be rented (see the rented-hardware @@ -1540,80 +481,21 @@ ROCm anyway. So this needs a real Radeon machine, or a deliberate decision to sh of a green link plus `verify-native-deps.py`'s dependency allowlist. Do not quietly treat "the job is green" as the measurement. -### Needs a machine the sessions do not have - -Everything here is implemented or decided; what is missing is hardware or a model the cloud sessions -cannot reach. **Most of it is rentable** -- see -[`docs/rented-hardware-test-plan.md`](docs/rented-hardware-test-plan.md) for the queue, the -invariants and what rented hardware explicitly cannot answer. The items that stay with a developer -machine are the **interactive agent** (console behaviour needs a human at a real terminal) and a real -**arm64 Android device**. - -- **The GPU module jars on a GPU**: item 1 of "Modular natives -- follow-ups" above (CUDA + Vulkan - modules next to the Windows CPU jar, devices, offload, the CUDA graphs re-measurement). -- **Extraction reuse on Windows**: a second JVM start of the same build must copy nothing (no - `[jllama] extracted` lines), a running JVM's locked DLLs must survive another build's cleanup, and - the start must not block on them. -- **On-device Android**: the AAR + Kotlin facade are exercised on the x86_64 emulator in CI - (`test-android-emulator`) and the LLM Service app (`android-llmservice/`) is the example app, built - and UI-tested there too; what no session has is a real arm64 device, and the Adreno/OpenCL flavor - needs one. Nothing to write, only to run. -- **AVX-512/AMX hardware** (Sapphire Rapids, Zen 4/5, Core Ultra): item 2 of "Modular natives" above. - Partly answered since: a Cascade Lake machine (`avx512f` + `avx512_vnni`, no AMX) picks - `cascadelake` and loads cleanly, which lifted the modules ever *chosen* anywhere from six to eight. - AMX itself was that **suspected defect** and is now a found and fixed one (`patches/0018`, proven on - a rented Granite Rapids machine and verified there with the patch -- see the rented-hardware section - below; it is additionally backed by a GCC compile of the patched file with the variant's own - flags, `-mamx-tile -mamx-int8 -mavx512vnni`). What stays open is the original question, the *throughput* gain of `sapphirerapids` and - `zen4` over `haswell`, which needs the same hardware but no longer blocks anything. -- **Kolibri-1 on the real 78B model: done, `patches/0016` holds.** Measured 2026-10-11 on a rented - 16-vCPU / 123 GB instance, both published dialects fetched from Hugging Face on the machine at - 80-94 MB/s. **Both load and both answer correctly** through a chat turn on the model's own template: - `content` `"Berlin."` for a German question and `"51"` for 17x3, the chain of thought in - `reasoning_content`, `finish_reason` `stop`. Generation 13.4 t/s for Q4_K_M (44 GB) and 14.6 for - Q3_K_S (31 GB). **The strongest single piece of evidence is the tokenizer**: both dialects produce - the *same* token ids (`[452 22090 493 1678 2459 5513 46]`) and round-trip to the input sentence, so - mapping `kolibri1` to the Qwen2 pre-tokenizer is demonstrated rather than assumed -- and a broken - router would not have produced two correct answers in two quantizations. What is still unverified is - **GPU backends** (the patch's own caveat) -- the first run of this measurement was wrong in a way - worth keeping on file: it used a raw completion at temperature 0.0, which loops on an instruct model - regardless, and read `chatCompleteText`, which returns only `content` and is therefore *empty* when a - reasoning model spends its budget inside the thinking block. Both failures looked like the patch. -- **`TestConstantsTest.theShippedModelConstantsGoThroughTheResolver` is vacuous when the fixture is - absent.** Mutating `MODEL_PATH = resolveModelPath("models/…")` to the bare literal leaves the test - green with `models/` empty, and only goes red once the GGUF actually exists. In CI that is the - normal case (`validate-models.sh` hard-fails first), so residual risk is low — but the two - `src/test/resources/...` constants resolve from the module basedir either way, so their wrapper is - undetectable **even in CI**. Fix: assert the wiring structurally rather than by value — reflect - over the `String` constants and require each `models/…`-shaped one to equal - `resolveModelPath(literal)` against a `@TempDir` fixture planted at the reactor root, so the - assertion does not depend on a real model being present. - -### Test-coverage debt found during the b10649 review (PR #403) - -Each item below was verified against pristine upstream tags and is real, but none is a regression -introduced by the version bump — they were deferred to keep that PR landable. (The seven dead CLI -flags, the `acquire`/`release` context-guard unit tests, the `OSInfo` alias test and the dead -`Java8CompatibilityHelper` from the original list are done.) - -- ~~**`LlamaLoader`'s jar-extraction internals are tested only through directory fixtures.**~~ - **Closed 2026-10-11 as not worth a test, after looking for the branch it would cover.** The premise - was that a jar behaves differently from a directory somewhere in the loader. It does, in exactly - **one** place -- `extractionKey`, which takes a `jar:!/` URL apart by hand to read the - entry's CRC-32 and size out of the central directory (deliberately not through a - `JarURLConnection`, which would hold the jar open in the JVM's jar cache) -- and that place **is** - already tested in `LlamaLoaderTest`, against a real jar built by the test and against a jar that - does not exist. Everywhere else there is no branch of ours to cover: `extractFile` and - `resourceMatchesFile` read a resource only as a stream (`getResourceAsStream`), so the - jar-versus-directory difference lives inside the JDK's class loader. A unit test for it would have - to add a settable class loader to `LlamaLoader` -- `classLoader()` is hardcoded to the loader's own, - by design -- i.e. new mutable static API in production code to exercise a path where the only thing - under test would be the JDK. CI loads all 23 natives jars for real anyway - (`smoke-natives-jars.sh`, on the classpath **and** the module path), which is the coverage that - matters. Recorded with the reasoning so this is not reopened as an oversight. - -- **`ContentPart.videoFile(...)` — see the video-input entry above** for the wire shape upstream - expects (`input_video`; raw base64, a `data:` URI or an HTTP(S) URL, as for images since b11803). +### Hardware and test-fixture coverage + +- **Real arm64 Android / Adreno OpenCL device:** run the AAR + Kotlin facade and LLM Service app + on-device. The x86_64 emulator and app UI jobs already run in CI. +- **Kolibri-1 on GPU:** CPU inference and both published GGUF dialects were measured on the real + 78B model; GPU inference remains unmeasured. `0016` was dropped when upstream added Kolibri-1; + see the retained history and numerical guard, not the former patch, for the current contract. +- **Structural test-constant wiring:** `TestConstantsTest.theShippedModelConstantsGoThroughTheResolver` + now skips explicitly when the fixture layout cannot distinguish a missing resolver wrapper. + The `src/test/resources/...` constants are indistinguishable by value even in CI. Consider a + structural check of the wrapper calls; the resolver itself already has a hermetic fixture test. +- **Windows module measurements:** see "Modular natives -- follow-ups"; the remaining Intel + GPU/NPU and Linux SME measurements are in "What still has to be measured". +- **Interactive agent:** real console/terminal behaviour needs a person at a terminal; model-backed + headless integration coverage does not replace that check. ## Open — cross-cutting (slice for this repo) @@ -1621,64 +503,32 @@ flags, the `acquire`/`release` context-guard unit tests, the `OSInfo` alias test - **`@VisibleForTesting` audit.** No usages currently. Walk the production tree for package-private/protected methods or fields that exist purely so tests can reach them, and either annotate (`com.google.common.annotations.VisibleForTesting`) or move into the test source tree. -- **Null-safety refinement.** JSpecify + NullAway are now enforced at compile time in **strict JSpecify mode** with the extra options `CheckOptionalEmptiness`, `AcknowledgeRestrictiveAnnotations`, `AcknowledgeAndroidRecent`, `AssertsEnabled` (see `pom.xml`); `@NullMarked` on the three packages via `package-info.java`; JDK module exports in `.mvn/jvm.config`. The legacy `org.jetbrains.annotations` dep has been removed; all nullability annotations are JSpecify. Public-API methods that may legitimately have no value use `Optional` rather than `@Nullable T` (`ChatResponse.getFirstMessage`, `ChatMessage.getParts`, `ChatRequest.buildToolsJson`). Open follow-up: review remaining unannotated public API surfaces for places where `@Nullable` would be more precise than the implicit non-null default. +- **Null-safety refinement.** Review remaining public API surfaces for places where `@Nullable` is more precise than the `@NullMarked` default, respecting the existing `Optional` policy and strict JSpecify/NullAway checks. -- **Drop the project-wide `OPM_OVERLY_PERMISSIVE_METHOD` suppression in - `spotbugs-exclude.xml`** once the package-architecture refactor lands - (see [`../workspace/crossrepostatus.md`](../workspace/crossrepostatus.md) - under "Affects BAF + jllama (multi-package repos)"). The single-root - package today makes every "method called only by same-package callers - → could be package-private" finding correct-but-unstable; once layers - split, cross-layer calls will need public. Snapshot at suppression - (`07109cc`): 25 sites. The same rule is suppressed in BAF - (`52c8c95`) for identical reasons. +- **Review the project-wide `OPM_OVERLY_PERMISSIVE_METHOD` suppression in + `llama/spotbugs-exclude.xml`.** The package layers now exist. Recheck the findings against the + current public API before removing the suppression; align with BitcoinAddressFinder and the + workspace's "OPM scope-tightening" policy. The former "single-root package" premise is stale. -- **Additional ArchUnit rules to consider** — the full **`layeredArchitecture()`** rule and a **per-module banned-import** rule (`jacksonBannedFromContractsAndLoader` — Jackson kept out of `args`/`callback`/`exception`/`loader`) are now DONE. Still open: more per-module banned-imports if useful, public-API-surface constraints (no public mutable static state, etc.). Partial progress: `7b6667d` covers the "no public field that is not final" sub-rule. +- **Additional ArchUnit rules to consider:** further per-module import restrictions and public-API constraints if useful. Existing layer, Jackson-import and non-final-public-field rules already cover those cases. - **Cross-repo code-quality TODOs** — see [`../workspace/policies/code-quality-todos.md`](../workspace/policies/code-quality-todos.md) for the canonical `@VisibleForTesting` design-fit review, package hierarchy review, and class/method naming review. This repo has no `@VisibleForTesting` usages today; package and naming reviews remain open. ## GPU backends on rented hardware -**AWS blocks this outright on a new account: the G-instance vCPU quota is 0.** A `g4dn.xlarge` -launch (Tesla T4, ~0.21 USD/h, so cents for a probe) is refused with -`VcpuLimitExceeded ... your current vCPU limit of 0`, and raising it is a support request the -account owner has to file -- the probe package (CPU + `cuda13` + `vulkan` module jars, 169 MB) and -the driver-equipped AMI (`Deep Learning Base OSS Nvidia Driver GPU AMI (Amazon Linux 2023)`) are -otherwise ready, so this is a one-line unblock once the quota exists. Cost was never the obstacle. - -**Which GPU backends are reachable on rented hardware at all, measured 2026-10-11:** - -| backend | rentable | how | -|---|---|---| -| `cuda13` | yes | G instances (T4 / A10G / L4 / L40S). A T4 proves as much as an H100 for "the module loads and computes", so the **P** buckets (V100/A100/H100) are deliberately not requested | -| `vulkan` | yes | the same NVIDIA cards -- the driver supplies `vulkan-1` / `libvulkan.so.1` | -| `opencl` | yes | the same cards -- NVIDIA ships an ICD | -| `openvino` | **yes, with no GPU at all** | OpenVINO has a CPU plugin, so an `m7i`/`m8i` can load `libggml-openvino.so`. Currently build-only; this is the cheapest open coverage gap | -| `rocm` | **no** | `g4ad` (Radeon Pro V520) is **gone from every region checked** (us-east-1, us-east-2, us-west-2, eu-central-1) and was AWS's only AMD GPU; ROCm never officially supported Navi 12 either. Stays build-only | -| `sycl` (GPU) | **no** | AWS has no discrete Intel GPU. Intel's CPU OpenCL runtime covers part of it | -| `metal` | **no** | EC2 Mac exists but bills a 24-hour minimum, and macOS ships the backend inside the library anyway | - -**Spot cannot be stopped**, only terminated, so a persistent switch-off-in-between machine needs the -**On-Demand** G quota (`L-DB2E81BA`), not the Spot one. Measured spot price for `g4dn.xlarge` on -2026-10-11: **0.2925 USD/h**; On-Demand is roughly 0.53. A stopped instance costs only its EBS -volume (40 GB gp3 ~ 3 EUR/month), and starts in ~40 s with the toolchain and models still on it -- -against 10 to 15 minutes for the boot-from-scratch probes used so far. - -**`SME` is not rentable anywhere, and an Apple instance does not help.** AWS does offer -`mac-m4.metal` / `mac-m4pro.metal` / `mac-m4max.metal`, and Apple M4 does have SME -- but macOS -ships **one static library** (`metal-macos-aarch64`, Metal compiled in), not the aarch64 CPU module -set, so `armv9.2_1`/`armv9.2_2` cannot even be loaded there. They would need **Linux aarch64 with -SME**, which Graviton 4 lacks and no current instance provides. EC2 Mac also bills a **24-hour -minimum** (dedicated host), so it is the expensive way to answer nothing. - - -## Handed over from the modular-natives session (2026-10-11) +Use [docs/rented-hardware-test-plan.md](docs/rented-hardware-test-plan.md) and +[the EC2 harness](docs/benchmarks/ec2-harness.md) for new probes. Recheck current region capacity, +GPU vCPU quotas and prices before launching; the old quota-0 failure predates successful T4 +measurements and is not evidence that GPU testing is currently blocked. -Appended on `local/cpu-module-isolation-test` by the session that shipped the modular natives -(#504 to #506) and watched their two full runs (38065017595, 38069595101); merged as #507 with one -`0018` patch and the `check-aligned-free-pairing.cmake` guard. What is still open from it: +| remaining target | hardware needed | +|---|---| +| Windows CUDA/Vulkan/OpenCL coexistence and throughput | real Windows GPU host (RTX 3070 + AMD iGPU target in the local handover) | +| ROCm runtime, including Windows CRT behaviour | actual supported Radeon/Instinct GPU; the retired AWS g4ad is not evidence for current ROCm support | +| OpenVINO GPU/NPU and SYCL GPU execution | suitable Intel GPU/NPU host; CPU fallback does not prove GPU execution | +| `armv9.2_1` / `armv9.2_2` CPU modules | Linux aarch64 with SME; Graviton 4 lacks it, and macOS's static Metal library does not exercise these modules | -### Open from that session, recorded nowhere else +## Other open verification and maintenance - **WER minidumps are switched on but unproven.** #506 makes the Windows test step set `Disabled=0` / `DontShowUI=1` under both WER keys next to the `LocalDumps\java.exe` entry @@ -1688,79 +538,16 @@ Appended on `local/cpu-module-isolation-test` by the session that shipped the mo `sun.misc.Unsafe`, or `jshell` writing to address 0) on a branch run, then look for the dump in the artifact -- and if none appears, replace the WER route with `procdump -ma -e` around the surefire run. -- ~~**The emulator package pre-install is unproven.**~~ **Diagnosed and fixed 2026-10-11: it never - worked, and it reported the wrong cause.** The step calls `sdkmanager` bare, but it is **not on - `PATH`** on the hosted runner -- the SDK sits at `$ANDROID_HOME` with the command under - `cmdline-tools//bin`. So every run failed four times with `sdkmanager: command not found`, - slept 20+40+60 seconds between attempts, and then printed - `the Android emulator package could not be installed in 4 attempts (dl.google.com download or - archive broken)` -- a cause that had nothing to do with it. **The step therefore converted a job - that was only occasionally flaky into one that is always red** (runs 38146809329, 38148401395, - 38149667195), and the misleading message is what kept that invisible: a reader sees a download - problem at Google and waits for it to pass. - Fixed in two steps, and the first one was wrong in a way the second could only find *because* it - was wrong. The first (#519) kept the two failure modes apart -- "not found" says it is a - runner-image change and not a download problem -- and resolved the command with - `find "$root/cmdline-tools" -maxdepth 2`. Run 38164077038 then reported, in one line, - `sdkmanager not found -- looked ... ANDROID_HOME='/usr/local/lib/android/sdk'`: the directory is - there, and the file sits at `cmdline-tools/latest/bin/sdkmanager`, which is **three** levels below - `cmdline-tools` -- the search stopped at the `bin` directory. An off-by-one, mine; what the - message rewrite bought was seeing it at a glance instead of suspecting Google again. - The second (#526) drops the find for the three known layouts in order (`cmdline-tools/latest/bin`, - `cmdline-tools//bin`, the old `tools/bin`), guards the outer loop so a later root cannot - overwrite the found path, and -- the part the first version lacked -- **lists what is actually - under each root** when nothing is found, because naming only the places searched leaves three - causes (missing directory, missing version subdirectory, missing file) behind one message. - Validated against five faked layouts locally, including the failure case. **Still to verify in CI** - -- the emulator jobs have not been green since the step was added, so the thing it was built to - guard against (the corrupt archive of run 38069595101) also remains unproven. - One trap worth keeping for whoever tests such a step locally: on this Windows checkout `chmod +x` - does not stick on a plain file (`ls -l` still shows `rw-r--r--`), so `[ -x ]` answers *false* and - every probe "failed" until the fixtures were given a `#!/bin/sh` line. The first run of that probe - reported all five layouts broken, including the one that demonstrably works in CI -- the harness, - not the logic. -- **Maven plugins without a pinned version, and no `requirePluginVersions` enforcer rule** (all - four repos; raised 2026-10-01, never answered). `clean`, `resources`, `install`, `deploy`, `site` - and in places `compiler`/`jar` run at whatever version the Maven on the runner defaults to, which - differs between CI and a local build (the parent's `` here covers the plugins - more than one module uses, not these). `check-versions.py` would then also compare them across - the siblings. One pull request per repo, warnings-only until all four have landed. -- ~~**`SECURITY.md` and `CONTRIBUTING.md` are the two per-repo files never compared.**~~ **Compared - on 2026-10-21 (with the repository name replaced by `{repo}`, as a `?repo` entry hashes): no two - of the four are equal, so no `?repo` entry is possible, and they differ for content, not for - wording alone.** `SECURITY.md`: the supported-versions table and the scope are per repository by - nature (`5.x` and the JNI layer here, `1.x` and the OpenCL kernels in BitcoinAddressFinder, the - `1.2.x` reactor line in srcmorph, one class in streambuffer); the shared part -- the private - advisory form, the mail address, 14 days to acknowledge, 30 to a remediation timeline, a 90-day - embargo -- says the same in four wordings. `CONTRIBUTING.md`: build commands, prerequisites and test - policy are per repository (CMake and natives here, the LMDB switch in BitcoinAddressFinder, PIT and - jcstress in streambuffer, the reactor in srcmorph); the PR workflow, the commit convention and the - conduct and licence paragraphs are shared in substance, again in different words. Making the shared - part byte-identical would need a split into a shared file and a per-repository one, which GitHub - does not read (it shows one `SECURITY.md` / `CONTRIBUTING.md`); a shared-files entry is therefore - not proposed. The comparison found this repository's copies stale and they were corrected - (Java 8 floor, JUnit Jupiter, the `llama/` paths, the hand-written `jllama.h`); the `5.x` row of - `SECURITY.md` changes with the release (release item 3 above). -- **SonarCloud reported "1 new issue" on #486 and nobody looked.** The sandbox's proxy answers 403 - for sonarcloud.io, so the finding was never read; the quality gate has passed since, so it is - low, but it is unread. -- **The local-agent assignment of 2026-10-10 exists only in the session, not in `docs/handover/`.** - Its deliverables map onto "Modular natives -- follow-ups" item 1 (the module jars on the RTX 3070 - + iGPU, throughput against 265.6 / 88.8 / 243.7, `--device` names across module sets, the - filter's negative paths), the first two "Needs a machine" bullets (extraction reuse, stale - cleanup against a running JVM) and the Kolibri bullet; the agent was asked to write - `docs/handover/local-agent-report-5.2.0-modular-windows.md` on a branch - `local/modular-natives-windows-report`. One question in it is not in item 1 yet: NVIDIA's and - AMD's drivers ship OpenCL ICDs, so CUDA, Vulkan **and** OpenCL may each see the same RTX 3070 -- - whether llama.cpp folds the three into one device by `device_id` and which backend wins is - unmeasured. The input it waits for is the first green `llama-smoke-windows-x86-64` artifact. -- **REUSE attribution is probably wrong in two places, and changing it needs the owner's word.** - `REUSE.toml` credits the generated dockcross wrappers (`.github/dockcross/dockcross-*`) to the - original fork author and the owner, while they are output of the dockcross project; and about 35 - Java files plus the documentation block still name the fork author, which a `git blame` pass - would have to confirm or refute file by file. Raised 2026-10-01; no attribution is removed - without an explicit decision. -- **srcmorph's smoke tests a fat jar it never ships** (its thin Central jars are launched by no job, - its 15 classifier fat jars are checked structurally only). Whether srcmorph follows jllama -- thin - jar plus `jbang --deps`, smoke on the consumer's classpath -- is the owner's decision and is - recorded in srcmorph's `TODO.md` and the workspace fat-jar policy, not here. +- **Maven plugin policy:** the default release lifecycle plugins (`clean`, `resources`, + `install`, `deploy`, `compiler`, `jar`) are pinned in this reactor. Still open across the four + repositories: an explicit `site` version where that lifecycle is used and an enforcer + `requirePluginVersions` rule, initially warnings-only while aligning the repositories. +- **"Claude Code Review" fails on every pull request run** in all four Java repositories + (`is_error: true` in the action's result, the review is never posted). Not investigated: the + token/secret, the account's quota and the pinned action version are the candidates. +- **Unread SonarCloud finding:** inspect the "1 new issue" reported on #486. The quality gate + subsequently passed, but that does not identify or explain the finding; the sandbox proxy + previously blocked access to sonarcloud.io. +- **REUSE attribution review:** check the remaining Java/documentation attribution to the original + fork author with `git blame`, file by file. Attribution is not removed without an explicit owner + decision. The generated dockcross wrappers already carry dockcross's own copyright attribution. diff --git a/docs/RELEASE.md b/docs/RELEASE.md index c2ca71b03..7dcad1456 100644 --- a/docs/RELEASE.md +++ b/docs/RELEASE.md @@ -1,16 +1,16 @@ # Release Process The maintainer-facing release procedure is **centralized in the workspace repo**: -[`../workspace/workflows/release-process.md`](../workspace/workflows/release-process.md). +[`../../workspace/workflows/release-process.md`](../../workspace/workflows/release-process.md). java-llama.cpp is a **Maven reactor**, so two repo-specific points extend the canonical procedure. -## Reactor version bump (all four poms) +## Reactor version bump (all six poms) The root `pom.xml` is the parent (`net.ladenthin:llama-parent`); the `llama/`, -`llama-langchain4j/`, and `llama-kotlin/` modules inherit its version **but hardcode it in their +`llama-langchain4j/`, `llama-kotlin/`, `llama-ffm/`, and `llama-platform/` modules inherit its version **but hardcode it in their ``** (there is no `${revision}` single-sourcing). A version change — the release -strip in Step 1 and the post-release bump in Step 3 — must touch **all four poms in lockstep**, or +strip in Step 1 and the post-release bump in Step 3 — must touch **all six poms in lockstep**, or the reactor build fails with `Could not find artifact net.ladenthin:llama-parent:pom:{VERSION}`. (The `llama-android/` Gradle build needs no edit — it parses the root pom's version.) Use: @@ -33,10 +33,45 @@ Besides the root `README.md`, the `llama-langchain4j/README.md` `## Dependency` `{VERSION}` in Step 1 — they are not covered by the root-README edits and drift silently otherwise (the release examples stay at `{VERSION}` on the Step 3 snapshot bump). -One reactor `mvn -P release deploy` signs and publishes the parent pom, `llama`, -`llama-langchain4j`, and `llama-kotlin` together at the same version. The **Android AARs** -(`llama-android`, `llama-android-opencl`) are published by the `publish-release` job's separate -Gradle step (signed Central Portal bundle upload) — no manual action, but they appear as their own -deployment named `llama-android-{VERSION}` in the Central Portal UI. The agent -(`net.ladenthin:llama-atmosphere-agent`) is likewise its own deployment, from the step after the -reactor deploy. +Also update the dependency examples in `llama-ffm/README.md`, the JBang commands in +`llama-atmosphere-agent/README.md` and `examples/jbang/Chat.java`, and the `` in +`examples/server/pom.xml`. Historical version references describing migrations stay historical. + +One reactor `mvn -P release,natives deploy` signs and publishes the parent pom, `llama`, +`llama-langchain4j`, `llama-kotlin`, `llama-ffm`, and `llama-platform` together at the same version, +including the reactor modules' CycloneDX JSON artifacts. CI assembles and checks the complete +native tree before activating `natives`; a local one-platform build must not deploy that profile. +The **Android AARs** (`llama-android`, `llama-android-opencl`) are signed and staged locally +by Gradle in the preparation job. The standalone agent (`net.ladenthin:llama-atmosphere-agent`) +is staged locally too. The Central consumer combines all these frozen outputs into one Portal +bundle. It waits for upload acceptance only, with no asynchronous validation polling. + +## GitHub assets and the rolling snapshot + +`.github/collect-release-assets.py` is shared with the three sibling Maven repositories. It +reads `.github/release-assets.json`, discovers the reactor from `pom.xml`, then adds the configured +standalone agent, classifiers in `natives.csv`, Android publications and signed llama.cpp source +archive. The shared interface is documented in +[`../../workspace/policies/release-asset-scripts.md`](../../workspace/policies/release-asset-scripts.md). It copies each artifact and signature, naming `target/bom.json` as +`--cyclonedx.json`, as Central does. Missing outputs fail the publish job; +incomplete collections are not published. A complete checked package is secured before any +Central transfer, so Central failures cannot hide signed GitHub artifacts. + +The `github-snapshot` job serializes the complete upload/update/prune operation. +`.github/update-snapshot.py` refuses an older commit or an older run/attempt of the same commit. +After a complete upload it moves the `snapshot` tag to that build's commit, updates the release +notes with the commit and workflow run, and removes obsolete assets. An incomplete collection +keeps the existing tag, notes and other assets. The release itself is retained throughout; +versioned releases are never pruned. + +## Publication gate and upload jobs + +The `publish-snapshot` / `publish-release` jobs now prepare locally with `skipUpload=true`, +finish all signing and extra packaging, and verify the complete frozen publication. +The shared `.github/actions/finalize-publication` action collects, verifies and secures the +Actions handoff before emitting readiness. The `central-*`, `github-*` and `attest-*` jobs +independently consume that handoff, identically to the three sibling Maven repositories. +Attestation verifies the package and covers all frozen GitHub assets and detached signatures. +None of these consumers rebuilds or signs files. Portal upload acceptance is enough; +validation and automatic publication happen asynchronously. See +[the shared publication policy](publication-preflight.md). diff --git a/docs/benchmarks/gpu-module-jars.md b/docs/benchmarks/gpu-module-jars.md index 706d842a6..d3443cf81 100644 --- a/docs/benchmarks/gpu-module-jars.md +++ b/docs/benchmarks/gpu-module-jars.md @@ -139,9 +139,10 @@ driver 595.91.07 could not. module does not open); a *present but too old* driver aborts the process. For a library that is loaded inside someone else's JVM this is the worst possible outcome, and it cannot be caught downstream. -* **Two candidate fixes**, both for the owner to weigh (`TODO.md`): document a minimum driver version - for the `cuda13` jars, and/or pass an explicit arch list adding `75-real 80-real 90-real` so the - common datacenter GPUs do not depend on JIT at all. The second costs binary size — the module is +* **Two candidate fixes** were weighed: document a minimum driver version for the `cuda13` jars, + and/or pass an explicit arch list adding `75-real 80-real 90-real` so the common datacenter GPUs + do not depend on JIT at all. The second was taken: both CUDA builds pass such a list (CLAUDE.md, + "Upgrading CUDA Version"). The second costs binary size — the module is already 154 MB — and is exactly the trade-off upstream made the other way. ## 2 · `openvino` on a CPU-only host: it loads, takes over, and is 172× slower @@ -208,11 +209,11 @@ Two things this settles that the earlier run could not: ### What to do about it -Recorded in `TODO.md` as the owner's call, with a recommendation: **make the OpenVINO module opt-in** -rather than additive. The premise of additive module jars is "a module that cannot help is skipped, -one that can help is used" — OpenVINO satisfies neither on a CPU-only host. Failing that, the README -needs to say that the jar requires an Intel GPU/NPU *and* an OpenCL ICD loader, and that it must not -be on the classpath otherwise. +Decided as recommended: **the OpenVINO module is opt-in** rather than additive +(`LlamaLoader.OPT_IN_BACKENDS`, the `optin` column of `natives.csv`). The premise of additive module +jars is "a module that cannot help is skipped, one that can help is used" — OpenVINO satisfies +neither on a CPU-only host. The README says that the jar needs an Intel GPU/NPU *and* an OpenCL ICD +loader. ## What these runs did *not* test diff --git a/docs/c-api.md b/docs/c-api.md index 9bb1d8803..810ac1c54 100644 --- a/docs/c-api.md +++ b/docs/c-api.md @@ -161,6 +161,10 @@ if (jllama_chat_completions_stream_request(model, request, &task) == JLLAMA_STAT and the model still answering after the server stopped, the RPC server serving the CPU over loopback and stopped, text to speech refusing missing models, and a fine-tuning run over the random F32 model that writes a GGUF. +- `src/test/cpp/test_rpc_comm.cpp`: protocol-v8 TCP clients drive the C API with CPU only, + without a model. Six subprocess scenarios hold loopback/network binding, stop with no peer, + both incomplete peer capability handshakes, successful setup and reuse of the released ports. + Test deadlines turn blocked shutdown into a failure without leaving threads in the test runner. - `src/test/c/test_c_abi.c` (the ctest `c_abi` of every modular build job): plain C11 linking the shipped `libjllama` and `libllama`; it compiles the header as C and resolves `jllama_api_version` and `jllama_build_info` through the library's exports, next to its layer-A checks. diff --git a/docs/dependency-license-review.md b/docs/dependency-license-review.md new file mode 100644 index 000000000..080a883ce --- /dev/null +++ b/docs/dependency-license-review.md @@ -0,0 +1,74 @@ + + +# Dependency license review and distribution + +## Scope and review rules + +The Maven repositories share FOSSA policy 85127 (Standard Bundle Distribution). A flagged +license is a review request. Repository configuration does not grant a license or approve a +FOSSA finding. Decisions below are version-specific evidence, not organization-wide exceptions. + +1. Analyze the actual commit and branch. Never label a PR scan as main. FOSSA's default/tracked + branch is a server setting; `.fossa.yml` does not repair that setting. After changing it, + analyze current main and verify the recorded commit. Streambuffer's previous May 7 master + revision is not evidence for its current dependencies. +2. Keep test dependencies visible. Do not hide GPL/LGPL findings by excluding tests globally. + Internal execution and redistribution of benchmark/test JARs are separate use cases. +3. Inspect original source headers as well as inherited POM licenses. A permissive POM does + not erase another license inside the same component. Record the exact version and file. +4. Preserve dependency license/notice files under artifact-specific paths in fat JARs, since + unpacking all dependencies into one directory can overwrite identically named legal files. +5. Include attribution and license texts missing from upstream binaries before distribution. + Full dependency/source provenance must remain available; bundled notices are not a statement + that every file of an upstream package has been legally cleared. +6. Enter a documented component/version decision in FOSSA only after its usage and notices + have been checked. Broad approval of GPL, AGPL, LGPL or proprietary findings is not appropriate. + +## Verified evidence (2026-10-24) + +| Component | Evidence and decision boundary | +|---|---| +| JMH 1.37, JCStress 0.16 | Parent POMs and binary LICENSE explicitly include GPL v2 with Classpath exception. Review these exact versions for internal test/benchmark use; do not treat two exception aliases as independent obligations or approve arbitrary GPL-only code. | +| JUnit Jupiter 6.1.3, jqwik 1.9.3 | EPL-2.0; test scope. Preserve license notices if distributing these tools. | +| Lincheck 3.7 | POM declares MPL-2.0, but source files `org/jetbrains/kotlinx/lincheck/strategy/managed/MemoryLocation.kt` and `MemoryTracker.kt` explicitly say LGPL-3.0-or-later. The LGPL finding is real; never override the entire component to MPL-only. Internal test use is the reviewed boundary; redistribution requires further review. | +| Logback Classic 1.6.5 | Source headers of `AsyncAppender.java` and `BasicConfigurator.java` explicitly allow EPL-2.0 OR LGPL-2.1. Use the EPL-2.0 alternative for these unchanged components where that grant applies. The extra EPL-1.0 finding still requires its exact matched file; do not silently overwrite it. | +| Jetty EE10 12.1.14 | Parent declares EPL-2.0 and Apache-2.0. Verify the applicable grant and notices of the actual files before recording an alternative-license selection. Used by the separate jllama agent, not the core. | +| JeroMQ 0.6.0 | POM declares MPL-2.0. Runtime in BAF; preserve notices and provide the exact upstream source location for unchanged covered code. | +| jsr305 3.0.2 | POM declares Apache-2.0 but `javax/annotation/concurrent/{GuardedBy,Immutable,NotThreadSafe,ThreadSafe}.java` contain CC-BY-2.5. The attribution finding is valid. | +| jcip-annotations 1.0 | Original sources explicitly contain CC-BY-2.5 and Brian Goetz/Tim Peierls attribution. Source republication must retain the notice. | +| Bouncy Castle provider 1.86 | Source `org/bouncycastle/LICENSE.java` contains the permissive Bouncy Castle copyright/permission/warranty text. Preserve it; a custom FOSSA license name alone does not imply a usage prohibition. | + +Source archives are obtainable at `https://repo.maven.apache.org/maven2/` using the component's +Maven coordinates and exact version (`-sources.jar`). Keep the POM and source archive together +as evidence. A new version requires checking again. + +## Outstanding service decisions + +FOSSA issue approvals/license corrections are SaaS settings, not Git settings. These branches +record evidence and distribution changes; they do not claim that server-side approvals have +been applied. Inspect exact file matches for the historical Git/proprietary findings and the +remaining Logback EPL-1.0 finding. Historical revisions are not changed by deleting current files. + +Keep repository-specific assessments in that repository's `THIRD_PARTY.md`, including +affected files, evidence, review status and the current decision. A LicenseRef identifier +alone does not establish permission or scanner approval. + +## Releasing + +Review `THIRD_PARTY.md` per repository, the resolved runtime graph, and the produced archive. +For fat JARs inspect `META-INF/third-party/dependencies/inventory.json` and compare +copied legal entries with the original JAR bytes. The collector reads the resolved runtime +classpath, preserves classifiers and distinguishes equal filenames by content hash. +It never treats a `LICENSE.class` bytecode file as a text license. BAF's assembly profile and +the srcmorph CLI run it before packaging; Python 3.8+ is needed on that build host. +No network requests or approvals are made. A JAR with no legal entries of its own gets the +upstream texts the repository commits for it (`--supplemental third-party-notices`: `notices.json` +maps JAR base names to folders, `SOURCES.tsv` records each text's source URL and SHA-256; listed as +`supplemental_files` in the inventory), and `--require-complete` fails the build when a runtime JAR +has neither. This check does not replace source-availability obligations. java-llama.cpp's natives +jars carry the texts of the code compiled into them (`llama/legal/natives/`, `NOTICE.md` is the +index), so a fat jar bundling them needs no supplement for them. diff --git a/docs/history/llama-cpp-breaking-changes.md b/docs/history/llama-cpp-breaking-changes.md index 846beb5cc..ea8dcb05d 100644 --- a/docs/history/llama-cpp-breaking-changes.md +++ b/docs/history/llama-cpp-breaking-changes.md @@ -915,3 +915,5 @@ Used during `llama.cpp` version bumps: when upgrading, scan this file from the r | b11815–b11820 | patches | **All 12 apply unchanged** (the fail-loud applier on a fresh build directory at `d77256999`; `jllama-build-info` lists 0001, 0002, 0003, 0006, 0007, 0008, 0014, 0015, 0017, 0018, 0020, 0021; `check-patches.py`: 12 patches, 88 hunks, 0 problems). Two patch-target files are in the range, `tools/server/server-context.{cpp,h}` (`0002`, `0003`, `0021`); the commit touches only the rerank route there (the lambda body replaced by a call, `handle_rerank_impl` added after `handle_embeddings_impl`, one declaration in the header) plus one comment line inside `handle_embeddings_impl`, away from every hunk. Drop-checks re-read at b11820: `0002` -- `params_base.load_progress_callback = load_progress_callback;` still unguarded at `server-context.cpp:1283`; `0003` -- no `get_slot_prompt_similarity` in `server-context.{cpp,h}`; `0021` -- the `else` branch of the per-request LoRA block still takes `params_base.lora_adapters` without the clear (line 1939), and `init()` still leaves `slot.lora` empty. The other patch-target files are not in the range, so the b11815 answers stand. | | b11820–b11827 | `ggml/src/ggml-sycl/` (`common.hpp`, `esimd.hpp`, `fusion.cpp`, `ggml-sycl.cpp`, `mmvq.{cpp,hpp}`), `ggml/src/ggml-opencl/` (`CMakeLists.txt`, `ggml-opencl.cpp`, `kernels/conv2_dw.cl`), `src/llama-model.cpp`, `src/llama-memory-hybrid-idx.cpp`, `src/models/{qwen4exp,glm5-next,clef}.cpp`, `tools/mtmd/{clip-impl.h,clip.cpp,mtmd-image.h,mtmd.cpp}`, `conversion/`, `gguf-py/`, `tests/test-backend-ops.cpp`, `docs/backend/SYCL.md` (7 commits, `970b51ce7` = b11827, 2026-10-22 .. 2026-10-23) | **No source change here.** SYCL multi-column mat-vec on the Intel XMX engines (#29864): ESIMD DPAS kernels for reordered Q2_K..Q6_K and Q8_0 weights up to `GGML_SYCL_XMX_MAX_COLS` (default 80) activation columns -- speculative decoding and short prompt batches -- plus a fused gate/up GLU kernel up to `GGML_SYCL_XMX_GLU_MAX_COLS` (default 16), switched by `GGML_SYCL_ENABLE_XMX_ESIMD` (default 1); compiled in where `icpx` finds `` (`GGML_SYCL_MMVQ_HAS_XMX` in `common.hpp`), i.e. in both SYCL module jars, whose DLE 2026.1.4 toolchain is unchanged. OpenCL `CONV_2D_DW` (#30900, F32 and F16 kernels in `conv2_dw.cl`, added to the embedded kernel list -- the three OpenCL module jars). `--mlock` (`36cbf415f`, "Fix !30793"): the buffers holding the tensors are locked one by one, so the parts of a split host buffer -- since #30449 a CUDA pinned host buffer above 4 GB is a multi-buffer without a base, which the old check skipped -- are locked too, and a no-alloc load locks nothing. DFlash drafters on qwen4exp (#30927) read each layer input as the mean of its hyper-connection streams, built only for the layers `embeddings_layer_inp` asks for; glm5-next's k-pool inputs are one 1-D tensor instead of a 2-D one with views (#30932). MiniCPM-OCR 1.0 (#30979): projector `minicpm_ocr_1_0`, the MiniCPM-V preprocessor with the slice aligned to `patch_size * n_merge`; `tools/mtmd/mtmd.h` and `mtmd-helper.h` are not in the range, the two changed headers are internal. `clef.cpp` includes ``. Nothing in `common/`, `include/`, `tools/server/`, the root `CMakeLists.txt` (`GGML_LLAMAFILE_DEFAULT` / `GGML_CUDA_GRAPHS_DEFAULT` unchanged) or upstream's `.github/`; the server request-field set, its bounds and the response keys are identical (`tools/server/` is not in the range). **Verified at b11827**: `jllama` and `jllama_test` built from the pin in a fresh tree, `ctest` **686/686** (665 `TEST` macros), `NativeLibraryLoadSmokeTest` 7/7 against the b11827 library. | | b11820–b11827 | patches | **All 12 apply unchanged** (the fail-loud applier on a fresh build directory at `970b51ce7`; `jllama-build-info` lists 0001, 0002, 0003, 0006, 0007, 0008, 0014, 0015, 0017, 0018, 0020, 0021; `check-patches.py`: 12 patches, 88 hunks, 0 problems). No patch-target file is in the range (the intersection of the 48 paths the patches touch with `git diff --name-only b11820..b11827`, 23 files, is empty), so the drop-check answers of the b11820 row stand. Across b11815..b11827 the root `CMakeLists.txt`, `.github/`, `vendor/`, `ggml/CMakeLists.txt`, `ggml/src/CMakeLists.txt`, `tools/server/CMakeLists.txt` and `tools/mtmd/CMakeLists.txt` are unchanged, so every `KEEP IN SYNC WITH UPSTREAM` pin of `publish.yml` stays (ROCm 10.0.0, Vulkan 1.4.357.0, DLE 2026.1.4 + oneDNN 2026.0.2 + Level Zero 1.33.1, CCCL v3.4.3, OpenVINO 2026.4.1, BoringSSL 0.20261020.0). | +| b11827–b11881 | `tools/server/server.cpp`, `tools/server/server-common.{cpp,h}`, `tools/server/server-models.{cpp,h}`, `tools/server/server-context.{cpp,h}`, `tools/server/server-decision.cpp`, `tools/server/server-task.h`, `common/{arg.cpp,chat.{cpp,h},download.{cpp,h},file-lock.{cpp,h},hf-cache.{cpp,h},json-schema.cpp,jinja/value.cpp,speculative.{cpp,h},common.cpp,parsers/deepseek.cpp}`, `src/` (new `models/deepseek41.cpp`, `llama-kv-cache-dsv4.*`, `llama-vocab.*`, `models/dflash.cpp`), `tools/mtmd/` (new `models/soprano.cpp`, `mtmd-helper-gen.cpp`, `mtmd.h`), `ggml/include/ggml.h`, `ggml/src/ggml.c`, `ggml/src/ggml-rpc/transport.cpp`, the GPU backends, `vendor/cpp-httplib/CMakeLists.txt` (LibreSSL only), `tools/ui/` (54 commits, `fa3645feb` = b11881, 2026-10-22 .. 2026-10-25; **not tagged upstream at the time of the bump**, pinned through `JLLAMA_GIT_COMMIT`) | **No project source change; two patches rewritten (next row).** #31113 ("server: refactor server entrypoint") split `llama_server()` into `server_run()` and one function per role (`server_run_router`, `server_run_instance`, `server_run_download`), added `server_run_opts` (`install_signal_handlers`, `resolve_model`; llama-cli's overload clears both), factored the route table out as `server_register_routes()` (with the GCP shim) and `server_register_stream_routes()`, and moved `server_child` from `server-models.{cpp,h}` to `server_role` in `server-common.{cpp,h}` (same environment variables, same stdin/stdout protocol); the `server_state` enum moved from `server-context.h` to `server-common.h`. Nothing in `src/main/cpp` names any of them. #30242: JSON nested more than 128 levels is refused before it is walked -- `common_chat_templates_apply`'s inputs (tools, tool-call arguments, `chat_template_kwargs`, `json_schema`), the `json_schema` of `/completion` and the `/v1/systemone` body -- with `std::invalid_argument`, which every entry point here already maps to `InvalidRequestException`. #29312: `-hf` downloads take a lock shared with the hf CLI (`common/file-lock.cpp`, compiled into llama-common by upstream's own list), `common_download_file_single` and `hf_cache::finalize_file` gained defaulted parameters; not called here. Additive only in the reviewed headers: `common_chat_msg::extra_json` (DeepSeek V4.1 templates), `mtmd_audio_stream_get_n_rows[_flushed]`, `MTMD_GEN_AUDIO_TYPE_SOPRANO` (`tts_engine.cpp` accepts every type but `NONE`), `ggml_prec_get_acc/src`, `server_task_result_cmpl_partial::audio_commit_drained`. `include/llama.h`, `common/common.h`, `tools/mtmd/mtmd-helper.h`, `server-schema.cpp` and `server-task.cpp` are not in the range, so the server request-field set, its bounds and the response keys are identical. No option of `common/arg.cpp` changed (the 50 lines route the HF snapshot finalisation through the cancellable lock). The root `CMakeLists.txt` is unchanged (`GGML_LLAMAFILE_DEFAULT` / `GGML_CUDA_GRAPHS_DEFAULT` the same), and so is upstream's `release.yml`, so every `KEEP IN SYNC WITH UPSTREAM` pin of `publish.yml` stays; `vendor/cpp-httplib` moved LibreSSL to 4.4.0, BoringSSL (what this project builds) is unchanged. **Verified at b11881**: `jllama` and `jllama_test` built from the pin (configure: `llama.cpp b11881 is fetched by commit fa3645feb…`, `pin check: fetched commit count 11881 = b11881`, no compiler warning), `ctest` **692/692**, `NativeLibraryLoadSmokeTest`, `LlamaLoggerTest`, `RpcServerTest` and `BackendLoadTest` 32/32 against the b11881 library. | +| b11827–b11881 | patches | **`0006` and `0007` rewritten, the other ten apply unchanged** (the fail-loud applier on a fresh tree at `fa3645feb`; `check-patches.py`: 12 patches, 94 hunks, 0 problems). Six patch-target files are in the range: `common/arg.cpp` (`0001`, `0015`; the HF-lock change is away from both), `ggml/src/ggml-rpc/transport.cpp` (`0015`; #30399 adds an RDMA bounds check, and RDMA is off here), `tools/server/server-context.{cpp,h}` (`0002`, `0003`, `0021`; #30864 and #30994 touch the rerank template and the realtime route, the `server_state` enum moved out of the header), `tools/server/server-models.cpp` (`0008`; `server_child` moved out, `update_args` unchanged) and `tools/server/server.cpp` (`0001`, `0006`, `0007`), where #31113 broke `0006` and `0007`. **`0006`:** the embedded mode clears upstream's new `server_run_opts::install_signal_handlers` instead of guarding the `sigaction` block, and the `llama_server_shutdown_handler_reset` moved into the two role functions that install a handler, declared after the last local the handler captures -- `models_routes` in the router (declared after `ctx_http` there, so a reset next to `ctx_http` would have run after `models_routes` was destroyed) and `ctx_http` in the instance; the forwarded-argv parse, the mutex and `llama_server_request_shutdown()` are unchanged. **`0007`:** upstream now has the route table as a function of its own, so the patch's `llama_server_register_common_routes()` and its removal block are gone (4 hunks to 2) and `llama_server_attach()` registers `server_register_routes()` plus `server_register_stream_routes()` with the instance handlers, exactly what `server_run_instance()` registers; the verbatim-copy invariant of the b10519 row no longer exists. Guards: `NativeServerShutdown` (3, the real `llama_server()` in router mode), `CApiServer.TheEmbeddedServerStartsInRouterModeAndStops` and `CApi.TheAttachedServerServesTheModelAndLeavesItUsable` green. Drop-checks re-read at `fa3645feb`: `0001` -- `argv = utf8.ptrs.data();` still at `common/arg.cpp:1296`, no `common_params_parse_main`; `0002` -- `params_base.load_progress_callback = load_progress_callback;` unguarded at `server-context.cpp:1286`; `0003` -- no `slot_prompt_similarity` in `server-context.h`; `0008` -- no `LLAMA_SERVER_WORKER_CMD` upstream; `0014` -- `common/log.h` names only `common_log_default_callback`; `0015` -- `GGML_ABORT("Failed to connect to %s\n"` at `ggml-rpc.cpp:650`; `0017` -- the four `_mm_prefetch(&x[ib] + sizeof(...))` calls at `quants.c:846/847/864/865`; `0018` -- `free(buffer->context);` at `amx.cpp:46`; `0020` -- `ggml_gallocr_needs_realloc()` compares the leaf count only; `0021` -- the `else` branch at `server-context.cpp:1942` still takes `params_base.lora_adapters` without the clear. | diff --git a/docs/patches.md b/docs/patches.md index 022084899..f32a4389f 100644 --- a/docs/patches.md +++ b/docs/patches.md @@ -25,11 +25,11 @@ match a binary to this page. | 0001 | [`0001-win32-arg-parse-embed-guard.patch`](#0001-win32-arg-parse-embed-guardpatch) | common: parse exactly the argv an embedding caller passes (no GetCommandLineW override) | 35 | 36 | | 0002 | [`0002-server-preserve-caller-load-progress-callback.patch`](#0002-server-preserve-caller-load-progress-callbackpatch) | server: keep a load-progress callback the embedding caller installed | 1 | 1 | | 0003 | [`0003-pr22393-server-add-slot-prompt-similarity-getter-setter.patch`](#0003-pr22393-server-add-slot-prompt-similarity-getter-setterpatch) | Upstream PR: ggml-org/llama.cpp#22393 — "server : add slot_prompt_similarity getter/setter" | 2 | 2 | -| 0006 | [`0006-server-embed-native-server-jni.patch`](#0006-server-embed-native-server-jnipatch) | server: make llama_server() embeddable in a host process (no signal handlers, forwarded argv, stoppable) | 1 | 6 | -| 0007 | [`0007-server-attach-http-frontend.patch`](#0007-server-attach-http-frontendpatch) | server: let an embedding host attach the HTTP frontend to an already-loaded server_context | 1 | 4 | +| 0006 | [`0006-server-embed-native-server-jni.patch`](#0006-server-embed-native-server-jnipatch) | server: make llama_server() embeddable in a host process (no signal handlers, forwarded argv, stoppable) | 1 | 8 | +| 0007 | [`0007-server-attach-http-frontend.patch`](#0007-server-attach-http-frontendpatch) | server: let an embedding host attach the HTTP frontend to an already-loaded server_context | 1 | 2 | | 0008 | [`0008-server-models-worker-cmd-override.patch`](#0008-server-models-worker-cmd-overridepatch) | server: let the router spawn its model workers through a host-supplied command (LLAMA_SERVER_WORKER_CMD) | 1 | 1 | | 0014 | [`0014-common-log-callback-sink.patch`](#0014-common-log-callback-sinkpatch) | common: add a callback sink to common_log (common_log_set_callback) | 2 | 6 | -| 0015 | [`0015-rpc-embeddable-client-and-stoppable-server.patch`](#0015-rpc-embeddable-client-and-stoppable-serverpatch) | ggml-rpc: let an embedding host register servers and stop its own server safely | 5 | 24 | +| 0015 | [`0015-rpc-embeddable-client-and-stoppable-server.patch`](#0015-rpc-embeddable-client-and-stoppable-serverpatch) | ggml-rpc: let an embedding host register servers and stop its own server safely | 5 | 30 | | 0017 | [`0017-ggml-cpu-x86-prefetch-byte-offset-and-msvc-type.patch`](#0017-ggml-cpu-x86-prefetch-byte-offset-and-msvc-typepatch) | ggml-cpu(x86): byte-wise prefetch address, and a type clang accepts on MSVC targets | 2 | 4 | | 0018 | [`0018-ggml-amx-free-the-aligned-buffer.patch`](#0018-ggml-amx-free-the-aligned-bufferpatch) | ggml-cpu(amx): free the AMX weight buffer with ggml_aligned_free(), not free() | 1 | 1 | | 0020 | [`0020-ggml-alloc-validate-leafs-before-reusing-an-allocation.patch`](#0020-ggml-alloc-validate-leafs-before-reusing-an-allocationpatch) | ggml-alloc : validate the leafs before reusing a graph's allocation | 1 | 1 | @@ -121,6 +121,13 @@ hijack the JVM's), common_params_parse instead of common_params_parse_main for t it captures are destroyed -- a request landing after llama_server() returned used to run the lambda over destroyed objects (SIGSEGV in server_http_context::stop(), seen in router mode). Runnable guard: src/test/cpp/test_native_server_shutdown.cpp. Applies after 0001. + +Refreshed at b11881: #31113 split llama_server() into one function per role (server_run_router, +server_run_instance, server_run_download) and added server_run_opts. The embedded mode now clears +server_run_opts::install_signal_handlers (upstream's own switch, which llama-cli uses) instead of +guarding the sigaction block, and each role function that installs a shutdown handler declares the +reset after the last local its handler captures: models_routes in the router, ctx_http in the +instance. ``` ## 0007-server-attach-http-frontend.patch @@ -135,18 +142,18 @@ server: let an embedding host attach the HTTP frontend to an already-loaded serv Adds llama_server_attach(argc, argv, server_context &, server_routes &), which serves a model the host has already loaded over the upstream HTTP frontend: no second model load, no start_loop() -- the host's worker keeps driving the shared server_context and the HTTP routes post tasks to its -queue. The stable route table is factored out of llama_server() into -llama_server_register_common_routes(), byte-identical to the block it replaces (the invariant to -re-check on every bump); the attach entry point registers it plus the non-router resumable-streaming -handlers and the GCP shim, answers /cors-proxy and /tools with 403 (the MCP/tools host belongs to a -full llama-server), marks ready immediately and blocks in ctx_http.join() until +queue. The attach entry point registers upstream's own server_register_routes() (the route table and +the GCP shim) plus the instance (non-router) resumable-streaming handlers through +server_register_stream_routes(), exactly what server_run_instance() registers, so the two entry +points cannot drift on the endpoint set; it answers /cors-proxy and /tools with 403 (the MCP/tools +host belongs to a full llama-server), marks ready immediately and blocks in ctx_http.join() until llama_server_request_shutdown(). It serves the caller's server_routes rather than a frame-local one: server_routes' constructor registers a sleeping-state callback on the model's task queue that outlives the attach call. Applies after 0001 and 0006. -Refreshed at b11799: POST /tts (b11781, #26603) and the WebSocket /v1/realtime (b11780, #30636) joined -the route table between the transcription and the Anthropic routes; both are in the removed block and -in the helper, so attach mode serves them too. +Refreshed at b11881: #31113 factored the route table out of llama_server() itself +(server_register_routes, server_register_stream_routes), so the patch no longer extracts a copy of +it -- the helper this patch used to add, and the "verbatim copy" invariant it had to keep, are gone. ``` ## 0008-server-models-worker-cmd-override.patch @@ -232,20 +239,34 @@ JVM) cannot use ggml-rpc as it is: 3. ggml_backend_rpc_start_server() cannot be stopped: while(true) around accept(). Two new entry points, both also exposed through get_proc_address: - - ggml_backend_rpc_stop_server() disconnects the client being served and wakes accept() - with a loopback connection (the one portable way to interrupt it). The loop then - releases its backends; it used to never reach that code. + - ggml_backend_rpc_stop_server() disconnects the client and every live peer socket. + Listener accept and outgoing peer connect poll cancellation at 50 ms intervals; no + wake-up connection can fill the listen backlog and block the stopping thread. The + loop releases its backends when it ends. - ggml_backend_rpc_server_listening() tells the host whether the socket was bound. The transport stays initialised on the way out, because WSACleanup() would invalidate every other RPC socket in the process. 4. transport: no SIGPIPE when the peer went away (MSG_NOSIGNAL / SO_NOSIGPIPE), a - socket_t::shutdown(), and the file descriptors that connect()/create_server()/accept() + socket_t::shutdown() (on Windows also CancelIoEx: shutdown alone does not wake a recv + blocked in another thread there), and the file descriptors that connect()/create_server()/accept() leaked on their error paths are closed. Upstream-submittable; not filed upstream yet. The runnable guard is src/test/cpp/test_rpc.cpp: it links both new functions and exercises the registration and -stop paths over loopback. +stop paths over loopback. test_rpc_comm.cpp drives protocol-v8 COMM_INIT through the C +API: loopback/network binding, missing peer, stalled caps handshakes in both ranks, +normal peer setup, socket cleanup and restart. Subprocess deadlines bound failures. + +5. COMM_INIT preserves the configured server bind address instead of opening a wildcard + listener for a loopback-only server. Peer sockets are weakly registered before any + caps I/O, under the same mutex as stop; stop also catches a peer accepted/connected + concurrently. Normal COMM_FREE/disconnect still frees them immediately. The rank-1 + retry loop checks cancellation too. The former main-listener wake-up connection is + removed: repeated C-API stops while the peer was absent filled its backlog. + +Drop-check on each upstream bump: inspect comm_init, the stoppable accept/connect +paths and stop_server. Drop upstream-fixed hunks instead of mechanically refreshing them. ``` ## 0017-ggml-cpu-x86-prefetch-byte-offset-and-msvc-type.patch diff --git a/docs/publication-preflight.md b/docs/publication-preflight.md new file mode 100644 index 000000000..0d378b857 --- /dev/null +++ b/docs/publication-preflight.md @@ -0,0 +1,130 @@ + + +# Signed publication preflight and independent uploads + +## Invariants + +Build and sign every intended output locally. Complete the native, classifier and Android +checks applicable to those outputs. Before any publication-package upload, collect the exact +repository contract and run one complete local gate. Missing files, invalid signatures, +version mismatches or differing Central/GitHub bytes must fail before either publisher runs. +A release publishes only from the tag `v` of a non-SNAPSHOT version; a snapshot only a +`-SNAPSHOT` version, and never from a tag. + +After the gate, neither publisher compiles, packages nor signs artifacts again. Both use the +same frozen package from GitHub Actions. The Central, GitHub Release and provenance attestation jobs depend only on +that secured handoff, never on each other's success. A Central outage must not hide the GitHub files. +Internal compiler caches, test reports and native-build intermediates are not publication packages. + +## Preparation + +Maven's Central publishing plugin 0.12.0 supports `-DskipUpload=true deploy`: it stages signed +release files under `target/central-staging` or snapshots under `target/central-deferred`, +without a remote upload. This is different from `skipPublishing`, which omits artifacts. +Gradle publications are similarly written to their local staging repository first. + +Preserve the signed Maven files before any later fat-jar rebuild can overwrite `target/`: + +```bash +python3 .github/collect-release-assets.py central-assets --maven-only +# Build and sign additional GitHub-only variants. +``` + +Finish both publication channels with the shared, checksummed composite action: + +```yaml +- name: Finalize and secure the signed publication + id: finalize + uses: ./.github/actions/finalize-publication + with: + channel: release # snapshot for the rolling snapshot + maven-assets: central-assets # omit when no outputs need preserving +``` + +The action collects the exact contract, calls `publication.py prepare --channel `, and +uploads the frozen `publication-package/` as `signed-release-assets` or `signed-snapshot-assets`. +The preparation job exports `assets_complete: ${{ steps.finalize.outputs.complete }}`. + +The ref is checked twice. `check-snapshot` and `check-tag` run `publication.py check-ref --channel +` after the build and test jobs (they need `report`) and before anything is staged, +signed or published (`check-snapshot` only on a run that publishes: `main` carries the release +version for the commit a release is tagged on). `prepare` repeats the check against +`GITHUB_REF` and refuses a channel the version does not have. + +The gate checks exact file membership, nonempty artifacts/signatures, cryptographic GPG +verification, and byte equality between Central staging and the corresponding GitHub files. +Central signatures pair by name: every artifact has its own `.asc`, and no `.asc` lacks its +artifact. GitHub renames release assets with characters outside `[A-Za-z0-9._-]` (or a leading +dot), so such a name fails the gate rather than reaching a release under another name. +It freezes `central/` in Maven layout, `github/` as flat release files, and a `manifest.json` +with commit, version, channel, file sizes and SHA-256. The composite's `complete=true` output +is emitted only after both the local gate and the Actions handoff upload succeed. A failed +collection, gate or handoff upload cannot release a consumer. No incomplete publication package +is attached to a release. + +## Repository configuration + +`.github/release-assets.json` remains the source of truth. File rules can set `central: true` +for additional Central publications/classifiers. The default is false, so runnable fat jars +and source archives do not accidentally become Central artifacts. Maven reactor outputs, +configured standalone Maven projects and enabled reactor BOMs are always Central outputs. + +Optional `publication.central_roots` lists repository-relative staging directories. The default +is `["target/{staging}"]`; `{staging}` becomes `central-staging` or `central-deferred` according +to the project version. This supports separate Maven or Gradle staging without repository names +in the shared implementation. Unexpected or missing Central members fail the gate. + +In a staging directory the gate reads `.pom`, `.jar`, `.aar` and `.json` files and their `.asc`. +Repository metadata (`maven-metadata*.xml`), checksums (`.md5`, `.sha1`, `.sha256`, `.sha512`) and +the Central plugin's `.index` are regenerated by the transfer and ignored; any other file fails the +gate instead of silently staying behind. Gradle writes a SNAPSHOT with a timestamp even into a file +repository (`app-1.0-20261025.085646-1.aar` under `1.0-SNAPSHOT/`); the gate maps such a name back +to `app-1.0-SNAPSHOT.aar`, the name the GitHub file and the Maven transfer use. + +`python3 .github/publication.py prepare --config ` reads another contract +inside the repository (a path outside it is refused), as `collect-release-assets.py --config` does. + +## Independent consumers + +```bash +python3 .github/publication.py verify publication-package --export-github release-assets +python3 .github/publication.py upload publication-package +``` + +Each consumer verifies the complete handoff manifest after download. This is a transport +integrity check, not a second build/signing pass. GitHub publishes only the exported `github/` +files; transport manifests and Central repository directories are not release attachments. + +All four repositories use identical `central-snapshot`, `central-release`, `github-snapshot`, +`github-release`, `attest-snapshot` and `attest-release` jobs, tracked as shared workflow fragments. +Each needs only the matching preparation job and requires its successful handoff output. + +The attestation job verifies the downloaded manifest first, then attests every frozen file in +`publication-package/github/*`, including detached signatures and configured BOMs. It alone among +the finalization/attestation jobs requests `id-token: write` and `attestations: write`; it needs no +signing key. Attestation failure remains visible but cannot prevent either publisher from running. +Existing producer-specific attestations for native build outputs remain applicable independently. + +For releases, the Central consumer forms a Portal bundle from the frozen Central files with +checksums and requests automatic publication. It waits only for HTTP upload acceptance and +records the deployment ID. There is no validation/publication polling. The Maven profiles also +use `autoPublish=true` and `waitUntil=uploaded` for manual deployments. + +For snapshots, a transfer-only Maven POM invokes pinned `maven-deploy-plugin:3.1.4:deploy-file` +executions during `validate`. The `central-snapshot` jobs of all runs share one concurrency group, +and `upload --skip-superseded` skips the transfer when one of the 30 most recent dispatched runs +already transferred the snapshot of a newer commit (one that descends from this run's); Central serves the snapshot +transferred last as the latest. The job reads the runs with `actions: read` and nothing else. +Maven maintains snapshot timestamps and metadata; signatures are +transferred in the same component request with their proper extensions. There are no source +build phases. For a POM-only component its signature is the primary transfer artifact and the +signed POM is supplied through `pomFile`, avoiding an empty-classifier parameter edge case. + +Local gate failures stop both publication paths. Authentication or transfer failures remain +visible in the affected upload job, but never gate the other publisher. Slow Portal processing +does not fail the build. Upload acceptance is not a claim of successful Central validation; +inspect the recorded deployment in Portal if later processing fails. Re-running a transfer +uses the same frozen package. A network-interrupted GitHub release update is not atomic. diff --git a/docs/rpc-comm-init-regression.md b/docs/rpc-comm-init-regression.md new file mode 100644 index 000000000..b4928921c --- /dev/null +++ b/docs/rpc-comm-init-regression.md @@ -0,0 +1,76 @@ + + +# RPC COMM_INIT: red/green regression record + +Verified on Linux x86-64, 2026-10-24, at llama.cpp b11827 (`970b51ce7`), using the real +C API shared by JNI and FFM. All scenarios use CPU, local TCP sockets and no model download. + +## The defect + +The old `0015` patch stopped the main listener/client but did not track a COMM_INIT peer. +Rank 0 listened on `0.0.0.0` even when the main server bound `127.0.0.1`. With no peer it +blocked in accept; with an incomplete peer it blocked reading transport capabilities. +Rank 1 could likewise block waiting for capabilities. Repeated C-API stop calls also opened +wake-up connections to the unserved main listener and could themselves block behind its backlog. + +## Same tests, before and after the fix + +`llama/src/test/cpp/test_rpc_comm.cpp` was added to `jllama_test` before changing product code. +The red run used the original `0015` from parent commit `672a9238`. The green run uses its +replacement from this change; the six scenarios are the same. + +| scenario | old patch | fixed patch | +|---|---|---| +| local server rejects a peer connection to a second loopback address | fails: wildcard listener | passes | +| network bind remains an explicit opt-in | passes | passes | +| stop without a peer, free both ports, restart on both | fails: stop/serve deadline | passes | +| stop during rank-0 capability handshake | fails: stop/serve deadline | passes | +| stop during rank-1 capability handshake | fails: stop/serve deadline | passes | +| successful peer setup still works, stops and permits restart | passes | passes | + +Red: **4 failed, 2 passed** (15.4 seconds). Green: **6 passed** (0.57 seconds). +The focused suite including existing RPC/C-API cases passed **36/36** (1.33 seconds). +The full C++ suite also passed **692/692** tests. All six new scenarios additionally passed +ten consecutive repetitions each (60 executions). +Times are observations from this host, not timing guarantees. + +Each scenario re-executes a fresh GoogleTest subprocess, has bounded I/O and a watchdog, +and bounds stop/serve completion to five seconds. A broken shutdown fails the child without +leaving live threads in the parent. The test never supplies a recovery peer to make stop pass. +It observes listener readiness through existing debug logs; active bind probes were removed +because they can race the listener and occupy its port. Every readiness timeout is a failure. +The two address-isolation cases explicitly skip if the host cannot bind `127.0.0.2`; the four +shutdown/normal-setup cases still run. There were **no skips** in the recorded Linux run. + +## Fix and maintenance + +- The peer listener inherits the configured main-server bind address. +- Main/peer accept and outgoing peer connect support cancellation through short socket polls + (`poll` on POSIX, `WSAPoll` on Windows); accepted/connected sockets return to blocking I/O. +- Peer sockets are weakly registered under the stop mutex before capability I/O. Stop shuts + them down together with the main client, including peers that race with stop. +- Normal COMM_FREE/disconnect releases peers immediately; the registry does not own them. +- The rank-1 retry loop observes stop. Main-listener wake-up connections are removed. +- Shared transport initialization remains alive so stopping one server does not invalidate + other RPC clients in the process. + +The change is carried in `llama/patches/0015-rpc-embeddable-client-and-stoppable-server.patch`. +All twelve repository patches were applied together to a pristine upstream pin, through the +normal CMake patch applier. No downloaded build tree is the sole copy of the fix. + +## Running the regression cases + +After configuring the native build as described in the project's build instructions: + +```bash +cmake --build llama/build --target jllama_test -j 4 +ctest --test-dir llama/build -R '^RpcComm\.' --output-on-failure --timeout 30 +``` + +The CMake source list includes these cases in the existing C++ CI jobs. Windows/macOS +runtime results are still required from CI; this local result proves Linux behaviour. +This is model-free coverage of RPC setup/shutdown, not a distributed tensor-inference benchmark. diff --git a/docs/upgrade/llama-cpp-version-bump.md b/docs/upgrade/llama-cpp-version-bump.md index 93bdd8e79..5b5e5ed5a 100644 --- a/docs/upgrade/llama-cpp-version-bump.md +++ b/docs/upgrade/llama-cpp-version-bump.md @@ -146,6 +146,19 @@ for each: --- +## License texts on a bump + +`llama/legal/natives/` holds the license texts of everything compiled into the natives, taken from +the pinned commit. On a bump: regenerate the WebUI's npm texts (`build-webui` warns on a changed +`tools/ui/package-lock.json` and fails on a release tag), + +```bash +python3 .github/webui-licenses.py generate /tools/ui llama/legal/natives/webui-npm +``` + +and compare `LICENSE`, `licenses/` and `vendor/` of the new pin with the folders there (a new +vendored library needs its text and a row in `NOTICE.md`). + ## Applying a bump Once you have the `b -> b` step, apply it exactly as diff --git a/llama-android/README.md b/llama-android/README.md index 9293cd19f..a7e0b696e 100644 --- a/llama-android/README.md +++ b/llama-android/README.md @@ -63,10 +63,16 @@ unmaintained). It is intentionally *not* a Maven reactor module, but it stays ve the reactor: `build.gradle.kts` parses the version (and the mirrored dependency versions) out of the Maven poms at configure time, so `mvn versions:set` remains the single bump point. -The AAR's `classes.jar` repackages the **byte-identical Maven-built core classes** (no +The CPU AAR's `classes.jar` repackages the **byte-identical Maven-built core classes** (no recompilation) minus `module-info.class`; the Android `.so` files ship under `jni//` -instead of as Java resources (the desktop natives jars carry `jllama-files.txt` / -`jllama-build.txt` lists for the JVM loader, which an AAR does not need and does not contain). +instead of as Java resources. The OpenCL AAR has an empty `classes.jar`; its API comes through +the CPU AAR dependency, so the two artifacts introduce no duplicate Java classes. The desktop natives jars carry `jllama-files.txt` / +`jllama-build.txt` lists for the JVM loader, which an AAR does not need and does not contain. + +The shared manifest template is expanded with a distinct package for each AAR: +`net.ladenthin.llama.android` for CPU and `net.ladenthin.llama.android.opencl` for OpenCL. +AGP requires unique library namespaces when the two AARs are consumed together; these +manifest packages do not change the Java API package `net.ladenthin.llama`. ### Building locally diff --git a/llama-android/build.gradle.kts b/llama-android/build.gradle.kts index ee06c4680..690e95cfa 100644 --- a/llama-android/build.gradle.kts +++ b/llama-android/build.gradle.kts @@ -142,6 +142,21 @@ val coreClassesJar = tasks.register("coreClassesJar") { exclude("module-info.class") exclude("META-INF/maven/**") } + // The license texts of the code compiled into the .so files under jni/ (llama/legal/natives/, + // NOTICE.md there). A path of this artifact's own: AGP merges the java resources of every + // classes.jar into the APK and fails on two equal paths, and the OpenCL AAR carries the same set. + from("../llama/legal/natives") { into("META-INF/third-party/llama-android/natives") } +} + +// The additive OpenCL AAR gets its Java API through the CPU AAR dependency. A second copy +// of these classes would make D8/R8 reject that dependency graph as duplicate definitions. +val moduleClassesJar = tasks.register("moduleClassesJar") { + description = "Class-free classes.jar for the native-only OpenCL add-on (its license texts only)." + archiveBaseName.set("module-classes-payload") + destinationDirectory.set(layout.buildDirectory.dir("intermediates")) + isPreserveFileTimestamps = false + isReproducibleFileOrder = true + from("../llama/legal/natives") { into("META-INF/third-party/llama-android-opencl/natives") } } // AGP-built AARs always carry an R.txt (empty for resource-less libraries). @@ -181,12 +196,14 @@ val javadocJar = tasks.register("javadocJar") { fun registerAarTask( taskName: String, artifactBase: String, + manifestPackage: String, nativesSubdir: String, requiredAbis: List, - requiredLibrary: String + requiredLibrary: String, + classesJar: TaskProvider ) = tasks.register(taskName) { - description = "Assembles $artifactBase-$reactorVersion.aar from the core classes and natives/$nativesSubdir." + description = "Assembles $artifactBase-$reactorVersion.aar with natives/$nativesSubdir." archiveBaseName.set(artifactBase) archiveVersion.set(reactorVersion) archiveExtension.set("aar") @@ -194,6 +211,7 @@ fun registerAarTask( isPreserveFileTimestamps = false isReproducibleFileOrder = true val nativesDir = file("natives/$nativesSubdir") + inputs.property("manifestPackage", manifestPackage) doFirst { // Fail-loud per ABI: a missing staging copy must never silently produce an // AAR that lacks an advertised ABI (emulator/x86_64 consumers would crash @@ -209,8 +227,13 @@ fun registerAarTask( } } } - from("src/main/AndroidManifest.xml") - from(coreClassesJar) { rename { "classes.jar" } } + // Plain-Gradle AARs declare their namespace through the manifest package. + // CPU and additive OpenCL are consumed together, so AGP requires distinct + // packages even though OpenCL has no Java classes or Android resources. + from("src/main/AndroidManifest.xml") { + expand(mapOf("aarPackage" to manifestPackage)) + } + from(classesJar) { rename { "classes.jar" } } from("consumer-proguard.txt") { rename { "proguard.txt" } } from(generateRTxt) // Only the libraries: the jllama-build.txt / jllama-files.txt lists a natives artifact @@ -226,8 +249,8 @@ fun registerAarTask( // The OpenCL flavor stays arm64-only (Adreno = Qualcomm ARM hardware) and holds the // OpenCL backend module alone -- libjllama.so and the CPU modules come from the CPU AAR // it depends on, so an app's jni/arm64-v8a/ ends up with both sets side by side. -val aarCpu = registerAarTask("aarCpu", "llama-android", "cpu", listOf("arm64-v8a", "x86_64"), "libjllama.so") -val aarOpencl = registerAarTask("aarOpencl", "llama-android-opencl", "opencl", listOf("arm64-v8a"), "libggml-opencl.so") +val aarCpu = registerAarTask("aarCpu", "llama-android", "net.ladenthin.llama.android", "cpu", listOf("arm64-v8a", "x86_64"), "libjllama.so", coreClassesJar) +val aarOpencl = registerAarTask("aarOpencl", "llama-android-opencl", "net.ladenthin.llama.android.opencl", "opencl", listOf("arm64-v8a"), "libggml-opencl.so", moduleClassesJar) // --------------------------------------------------------------------------- // Publishing: POM aar + mirrored core dependencies. diff --git a/llama-android/src/main/AndroidManifest.xml b/llama-android/src/main/AndroidManifest.xml index 31ce33cc1..6db3304e0 100644 --- a/llama-android/src/main/AndroidManifest.xml +++ b/llama-android/src/main/AndroidManifest.xml @@ -9,8 +9,10 @@ weak-symbol gate for posix_spawn used by the upstream mtmd helper — see CLAUDE.md "Android minimum API level"); AGP enforces it against every consuming app at merge time, so an app with a lower minSdk fails its build instead of crashing at runtime. + +The plain-Gradle AAR tasks expand aarPackage to a distinct namespace per artifact. --> + package="${aarPackage}"> diff --git a/llama-atmosphere-agent/LICENSE b/llama-atmosphere-agent/LICENSE new file mode 100644 index 000000000..500bc4ab7 --- /dev/null +++ b/llama-atmosphere-agent/LICENSE @@ -0,0 +1,10 @@ +MIT License + +Copyright (c) 2026 Bernard Ladenthin +Copyright (c) 2023-2025 Konstantin Herud + +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/llama-atmosphere-agent/THIRD_PARTY.md b/llama-atmosphere-agent/THIRD_PARTY.md new file mode 100644 index 000000000..96b4af8d2 --- /dev/null +++ b/llama-atmosphere-agent/THIRD_PARTY.md @@ -0,0 +1,25 @@ + + +# Third-party license and attribution notes: llama-atmosphere-agent + +The agent is MIT (`LICENSE` next to this file, the same text as the repository's). It ships as a +thin jar; Maven resolves every runtime dependency as an artifact of its own, with its own legal +files: + +| Dependency | License | +|---|---| +| `net.ladenthin:llama` and the natives jars `llama-platform` names | MIT; their own `THIRD_PARTY.md` and the notices of the compiled llama.cpp code travel in those jars | +| Atmosphere (`org.atmosphere:atmosphere-ai`) | Apache-2.0 | +| Jetty EE10 (`org.eclipse.jetty.ee10:*`) | EPL-2.0 OR Apache-2.0 | +| JLine (`org.jline:jline`) | BSD-3-Clause | +| Agent Client Protocol SDK (`com.agentclientprotocol:acp-*`) | Apache-2.0 | +| Jackson, JSpecify | Apache-2.0 | +| SLF4J Simple | MIT | + +The repository's `THIRD_PARTY.md` and `docs/dependency-license-review.md` hold the review evidence. +This folder is meant to be copied out and run on its own, which is why it carries both files +itself; `check-natives.py` holds `LICENSE` byte-identical to the repository's. diff --git a/llama-atmosphere-agent/pom.xml b/llama-atmosphere-agent/pom.xml index 7fe5077cc..2d9a76dfe 100644 --- a/llama-atmosphere-agent/pom.xml +++ b/llama-atmosphere-agent/pom.xml @@ -219,6 +219,21 @@ SPDX-License-Identifier: MIT + + + ${project.basedir}/src/main/resources + + + + ${project.basedir} + META-INF/third-party/net.ladenthin/${project.artifactId} + + LICENSE + THIRD_PARTY.md + + + toolchain-jdk22 diff --git a/llama-kotlin/pom.xml b/llama-kotlin/pom.xml index 7d947cc6a..78bfacada 100644 --- a/llama-kotlin/pom.xml +++ b/llama-kotlin/pom.xml @@ -111,6 +111,19 @@ SPDX-License-Identifier: MIT + + + ${project.basedir}/src/main/resources + + + ${project.basedir}/.. + META-INF/third-party/net.ladenthin/${project.artifactId} + + LICENSE + THIRD_PARTY.md + + + diff --git a/llama-langchain4j/pom.xml b/llama-langchain4j/pom.xml index 9a046648a..cfe3224b9 100644 --- a/llama-langchain4j/pom.xml +++ b/llama-langchain4j/pom.xml @@ -96,6 +96,19 @@ SPDX-License-Identifier: MIT + + + ${project.basedir}/src/main/resources + + + ${project.basedir}/.. + META-INF/third-party/net.ladenthin/${project.artifactId} + + LICENSE + THIRD_PARTY.md + + + org.apache.maven.plugins diff --git a/llama/CMakeLists.txt b/llama/CMakeLists.txt index 28cea3b96..b3722ca9f 100644 --- a/llama/CMakeLists.txt +++ b/llama/CMakeLists.txt @@ -356,8 +356,8 @@ endif() # hash, every other consumer keeps the number, and the pin check after FetchContent_MakeAvailable # asserts that the fetched commit's count IS the number. Clear it once the tag exists; # `llama-next-version.sh` says when, and `llama-next-version.sh --resolve b` prints the hash. -set(JLLAMA_GIT_TAG b11827) -set(JLLAMA_GIT_COMMIT "970b51ce7c9ba5fff0726c5e9994f1c2f0e4eedc") # the commit b11827 names; kept after the tag exists +set(JLLAMA_GIT_TAG b11881) +set(JLLAMA_GIT_COMMIT "fa3645feb5f47cbb30df5e6d031c22543d43d240") # the commit b11881 names (not tagged upstream yet); kept after the tag exists if(NOT JLLAMA_GIT_TAG MATCHES "^b[0-9]+$") message(FATAL_ERROR "JLLAMA_GIT_TAG must be a llama.cpp release number b, got '${JLLAMA_GIT_TAG}'") endif() @@ -551,8 +551,8 @@ if(JLLAMA_BACKEND_DL) # `set(GGML_*_DEFAULT ...)` there ("change the default for these ggml options") must be # repeated here, because adding ggml first skips that block entirely. Re-check on every bump # with `grep -n _DEFAULT CMakeLists.txt` at the new tag. Missing GGML_CUDA_GRAPHS_DEFAULT cost a - # CUDA module built this way two thirds of its token generation (measured, TODO.md "GPU - # backends as modules"): ggml's own default is OFF, llama.cpp turns it ON for itself. + # CUDA module built this way two thirds of its token generation (measured, + # docs/handover/local-agent-report-b11538-windows.md, finding B): ggml's own default is OFF, llama.cpp turns it ON for itself. set(GGML_LLAMAFILE_DEFAULT ON) set(GGML_CUDA_GRAPHS_DEFAULT ON) add_subdirectory(${llama.cpp_SOURCE_DIR}/ggml ${llama.cpp_BINARY_DIR}/ggml) @@ -1367,6 +1367,7 @@ if(BUILD_TESTING) src/test/cpp/test_model_flags.cpp src/test/cpp/test_wire_contracts.cpp src/test/cpp/test_rpc.cpp + src/test/cpp/test_rpc_comm.cpp src/test/cpp/test_gallocr_leafs.cpp src/test/cpp/test_lora_cache.cpp ${llama.cpp_SOURCE_DIR}/tools/server/server-common.cpp diff --git a/llama/cmake/jllama-build-info.cmake b/llama/cmake/jllama-build-info.cmake index 1a857dc50..10f200269 100644 --- a/llama/cmake/jllama-build-info.cmake +++ b/llama/cmake/jllama-build-info.cmake @@ -15,7 +15,7 @@ # `patches.sha256` (one hash over the patch set: " \n" per patch, # in name order -- the same lines the patch applier's stamp carries), `compiler` # and `toolkit` (the vendor SDK a GPU module was built against), and `signed` -# (`no` until the signing step exists -- TODO.md, delivery roadmap, item 9). +# (`no` unless the signing job ran -- TODO.md, delivery roadmap, item 11). # jllama-sbom.json a CycloneDX 1.5 bill of materials of the same facts: the natives jar as the # component, llama.cpp with every carried patch as its pedigree, BoringSSL, # CCCL and the vendor toolkit as components. diff --git a/llama/legal/natives/NOTICE.md b/llama/legal/natives/NOTICE.md new file mode 100644 index 000000000..2c5d5f542 --- /dev/null +++ b/llama/legal/natives/NOTICE.md @@ -0,0 +1,67 @@ + + +# Third-party code in the java-llama.cpp natives + +Every natives jar of `net.ladenthin:llama` (and the two Android AARs) carries this directory under +`META-INF/third-party/natives/` (the AARs under `META-INF/third-party//natives/` inside +their `classes.jar`). It holds the license texts of everything compiled into the native libraries: +java-llama.cpp's own code (`java-llama.cpp/`), llama.cpp/ggml at the pinned commit (`llama.cpp/`) and +the code llama.cpp vendors or derives from other projects, BoringSSL, the GPU vendors' header +libraries compiled into a backend module, and the npm packages of the embedded WebUI +(`webui-npm/`, generated by `.github/webui-licenses.py`). Each folder's `SOURCE.txt` names where +its text was taken from, byte for byte. A jar carries the texts of every kind of natives +directory; the table says which component is in which. + +Runtimes that are only loaded at run time and not shipped (the CUDA, ROCm, oneAPI, Level Zero, +OpenCL ICD and OpenVINO runtimes, the system C/C++ libraries) are listed for completeness; their +texts are not needed here. + +| Component | Version | Compiled into | SPDX | Texts | Source | +|---|---|---|---|---|---| +| llama.cpp (ggml / llama / mtmd / llama-common / tools/server / CPU+Metal+GPU kernels / WebUI own code) | b11881 fa3645feb5f47cbb30df5e6d031c22543d43d240 | all 23 jars + both AARs | MIT | `llama.cpp` | https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/LICENSE | +| nlohmann/json | 3.12.0 + vendor/nlohmann/json-deep-nesting.patch | library jars | MIT | `nlohmann-json` | https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/licenses/LICENSE-jsonhpp | +| cpp-httplib | v0.62.0 | library jars | MIT | `cpp-httplib` | https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/vendor/cpp-httplib/LICENSE | +| BoringSSL (ssl + crypto; static; OPENSSL_NO_ASM) | 0.20261020.0 = d3bf4795ad5b79d646cddf2fec687da5b9b502db | library jars except cpu-android-* and cpu-linux-s390x | Apache-2.0 | `boringssl` | https://boringssl.googlesource.com/boringssl/+/refs/tags/0.20261020.0/LICENSE | +| BoringSSL third_party/fiat (fiat-crypto) | 6ccc6638716d4632304baf1adbb5c47c3a12ea6f | same as BoringSSL | Apache-2.0 (BoringSSL ships the Apache variant of MIT/Apache/BSD-1) | `boringssl/third_party-fiat` | https://boringssl.googlesource.com/boringssl/+/refs/tags/0.20261020.0/third_party/fiat/LICENSE | +| BoringSSL Go-licensed TLS test code | n/a | not compiled (stated in BoringSSL LICENSE) | BSD-3-Clause | `(not shipped)` | - | +| xxHash | 9f465f1ea932d6ad9a26cd77496311ffa544cd68 | library jars (mtmd) | BSD-2-Clause | `xxhash` | https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/vendor/hash/xxhash/LICENSE | +| sha256.c (jb55) | 5e637272c13f200872d55ff579f7e2ab6c3f252f | library jars (mtmd) | MIT (file header also says public domain / Igor Pavlov) | `sha256-jb55` | https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/vendor/hash/sha256/LICENSE | +| rotate-bits.h | 27e784942f67db44abf2115c6638e735b579acd1 | library jars (mtmd) | MIT | `rotate-bits` | https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/vendor/hash/rotate-bits/LICENSE.md | +| sha1.c (Steve Reid / clibs) | e1e2536fcf6a8f9703be8c85d58724b408552287 | library jars (mtmd) | LicenseRef-public-domain | `sha1-clibs` | vendor/hash/sha1/sha1.c lines 1-4 | +| stb_image | 2.30 | library jars (mtmd) | MIT OR Unlicense | `stb_image` | vendor/stb/stb_image.h lines 7948-7988 | +| miniaudio (incl. dr_wav/dr_mp3/dr_flac) | 0.11.25 (9634bedb5b5a2ca38c1ee7108a9358a4e233f14d) | library jars (mtmd) | Unlicense OR MIT-0 | `miniaudio` | vendor/miniaudio/miniaudio.h lines 95816-95864 | +| sheredom/subprocess.h | 0dccaa9aa176dd6d7ef8afeca3c18d6e80a32795 | library jars (mtmd-helper + common; server.cpp/-models/-tools/-mcp on non-Android) | Unlicense | `sheredom-subprocess` | vendor/sheredom/subprocess.h lines 1-31 | +| common/base64.hpp | in tree | library jars (llama-common) | Unlicense | `base64-hpp` | common/base64.hpp lines 1-26 | +| llamafile sgemm (Mozilla Foundation) | in tree | library jars (CPU backend modules / static CPU code) | MIT | `llamafile-sgemm` | ggml/src/ggml-cpu/llamafile/sgemm.cpp lines 1-21 | +| Arm Optimized Routines (derived exp/silu routines) | derived; original snapshot unknown | all library jars (NEON / AVX2 / AVX-512 / VXE paths of ggml-cpu/vec.h) (snapshot) | MIT OR Apache-2.0 WITH LLVM-exception | `arm-optimized-routines` | https://github.com/ARM-software/optimized-routines/blob/0b5e3775c6c04761a2ecda8218eb45958c28be02/LICENSE | +| YaRN rope_yarn | derived | library jars + cuda13 + rocm + opencl modules (explicit notices); vulkan/sycl implement it without notice | MIT | `yarn` | https://github.com/jquesnelle/yarn/blob/995db5b575e75230b3384d658f8b944c9662f775/LICENSE | +| ggllm.cpp BPE tokenizer | derived | library jars (libllama) | MIT | `ggllm.cpp` | https://github.com/cmp-nct/ggllm.cpp/blob/0dc65eb735f90f82143ead9dedb66e73fa25d114/LICENSE | +| Pillow Resample.c | derived | library jars (mtmd) | MIT-CMU | `pillow` | https://github.com/python-pillow/Pillow/blob/923a595a2466414c019c1318cc634d84c167e9ad/LICENSE | +| OpenVINO exp_ps_sve | derived | cpu-linux-aarch64 + cpu-android-aarch64 (SVE CPU variants only) (whether a snippet needs it) | Apache-2.0 | `openvino` | https://github.com/openvinotoolkit/openvino/blob/2026.4.1/LICENSE | +| Unicode Character Database derived tables | generated by scripts/gen-unicode-data.py | library jars (libllama src/unicode-data.cpp) (yes) | Unicode-3.0 | `unicode` | https://www.unicode.org/license.txt | +| KoboldCpp DRY sampler port | ported | library jars (libllama) (confirm provenance) | upstream treats as MIT contribution by original author pi6am; KoboldCpp is AGPL-3.0 | `(not shipped)` | - | +| WebUI vendored big-integer | in tree | library jars (embedded ui.cpp) | Unlicense | `webui-big-integer` | tools/ui/src/lib/vendors/big-integer/LICENSE | +| WebUI vendored decimal.js | in tree | library jars (embedded ui.cpp) | MIT | `webui-decimal.js` | tools/ui/src/lib/vendors/decimal.js/LICENCE.md | +| WebUI vendored nerdamer-prime | in tree | library jars (embedded ui.cpp) | MIT | `webui-nerdamer-prime` | tools/ui/src/lib/vendors/nerdamer-prime/LICENSE | +| WebUI npm bundle (JS + CSS incl. KaTeX fonts + workbox) | tools/ui/package-lock.json at b11881 | library jars (every library build job downloads webui-generated) (upper bound (tree-shaking / server-only deps)) | 337 pkgs: MIT 271, ISC 43, BSD-3-Clause 9, Apache-2.0 5, BSD-2-Clause 2, MPL-2.0 OR Apache-2.0 1, Unlicense 1, 5 without field (MIT files); 19 MIT packages ship no license file, the MIT text follows them | `webui-npm` | webui-npm/packages.csv | +| WebUI third-party logos (huggingface.ico / exa.ico / context7.png / github-*.png) | - | library jars (yes) | trademarks (no license file) | `(not shipped)` | tools/ui/static | +| CCCL (CUB / Thrust / libcu++ headers) | v3.4.3 | cuda13-linux-x86-64 + cuda13-windows-x86-64 | Apache-2.0 WITH LLVM-exception AND Apache-2.0 AND BSD-3-Clause (CUB) | `cccl` | https://github.com/NVIDIA/cccl/blob/v3.4.3/LICENSE | +| CUDA Toolkit headers / libdevice | CUDA 13.4 | cuda13 modules (yes) | LicenseRef-NVIDIA-CUDA-EULA | `(not shipped)` | - | +| HIP headers (hip_runtime / cooperative groups) | ROCm TheRock 10.0 | rocm-linux-x86-64 + rocm-windows-x86-64 (inline header code only) | MIT | `hip` | https://github.com/ROCm/rocm-systems/blob/therock-10.0/projects/hip/LICENSE.md | +| rocBLAS / hipBLAS / ROCm device libs | ROCm 10.0 | dynamic (rocBLAS/hipBLAS) / LLVM-exception bitcode | MIT / Apache-2.0 WITH LLVM-exception | `(not shipped)` | - | +| oneDNN C++ API headers | installer 2026.0.2 (assumed v3.11) | sycl-linux-x86-64 + sycl-windows-x86-64 (version mapping; THIRD-PARTY-PROGRAMS kept for reference only) | Apache-2.0 | `onednn` | https://github.com/uxlfoundation/oneDNN/blob/v3.11/LICENSE | +| oneMKL SYCL BLAS headers | Deep Learning Essentials 2026.1.4 | sycl modules (yes) | LicenseRef-Intel-Simplified-Software-License | `(not shipped)` | (text ships only in the Intel installer) | +| DPC++ SYCL headers + dpct helpers (LLVM-derived) | DLE 2026.1.4 | sycl modules | Apache-2.0 WITH LLVM-exception | `(not shipped)` | - | +| Level Zero headers | 1.33.1 | sycl modules (yes) | MIT | `(not shipped)` | - | +| Vulkan-Headers (vulkan.hpp) | SDK 1.4.350.0 (Windows); Ubuntu libvulkan-dev (Linux) | vulkan-{linux;windows}-{x86-64;aarch64} (Linux header version differs) | Apache-2.0 OR MIT | `vulkan-headers` | https://github.com/KhronosGroup/Vulkan-Headers/blob/vulkan-sdk-1.4.350.0/LICENSE.md | +| SPIRV-Headers (spirv.hpp) | SDK 1.4.350.0 / Ubuntu spirv-headers | vulkan modules | MIT-style Khronos | `spirv-headers` | https://github.com/KhronosGroup/SPIRV-Headers/blob/vulkan-sdk-1.4.350.0/LICENSE | +| OpenCL-Headers | v2026.05.29 (opencl jars); vcpkg / Ubuntu (openvino jars) | opencl-android-aarch64 + opencl-windows-{x86-64;aarch64} + openvino modules | Apache-2.0 | `opencl-headers` | https://github.com/KhronosGroup/OpenCL-Headers/blob/v2026.05.29/LICENSE | +| OpenCL-ICD-Loader | v2026.05.29 | linked dynamically only; device/driver provides it; not shipped | Apache-2.0 | `(not shipped)` | - | +| OpenCL-CLHPP (CL/opencl.hpp via OpenVINO ocl.hpp) | vcpkg opencl port (Windows) / Ubuntu opencl-clhpp-headers (Linux) | openvino modules (version) | Apache-2.0 | `opencl-clhpp` | https://github.com/KhronosGroup/OpenCL-CLHPP/blob/v2026.05.29/LICENSE.txt | +| OpenVINO runtime headers + ggml-openvino Intel Apache-2.0 files | 2026.4.1 | openvino-linux-x86-64 + openvino-windows-x86-64 | Apache-2.0 | `openvino` | https://github.com/openvinotoolkit/openvino/blob/2026.4.1/LICENSE | +| Static libc++ / compiler-rt (Android); system C/C++ runtimes elsewhere | toolchain | Android libraries | Apache-2.0 WITH LLVM-exception / runtime exceptions | `(not shipped)` | - | +| java-llama.cpp (JNI layer, C API, patches) | this release | all 23 jars + both AARs | MIT | `java-llama.cpp` | https://github.com/bernardladenthin/java-llama.cpp | diff --git a/llama/legal/natives/arm-optimized-routines/LICENSE b/llama/legal/natives/arm-optimized-routines/LICENSE new file mode 100644 index 000000000..20a4b7717 --- /dev/null +++ b/llama/legal/natives/arm-optimized-routines/LICENSE @@ -0,0 +1,249 @@ +MIT OR Apache-2.0 WITH LLVM-exception +===================================== + + +MIT License +----------- + +Copyright (c) 1999-2022, Arm Limited. + +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. + + +Apache-2.0 WITH LLVM-exception +------------------------------ + + 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. + + +--- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. diff --git a/llama/legal/natives/arm-optimized-routines/SOURCE.txt b/llama/legal/natives/arm-optimized-routines/SOURCE.txt new file mode 100644 index 000000000..4d4b38606 --- /dev/null +++ b/llama/legal/natives/arm-optimized-routines/SOURCE.txt @@ -0,0 +1 @@ +LICENSE: https://github.com/ARM-software/optimized-routines/blob/0b5e3775c6c04761a2ecda8218eb45958c28be02/LICENSE diff --git a/llama/legal/natives/base64-hpp/SOURCE.txt b/llama/legal/natives/base64-hpp/SOURCE.txt new file mode 100644 index 000000000..dae694b3a --- /dev/null +++ b/llama/legal/natives/base64-hpp/SOURCE.txt @@ -0,0 +1 @@ +base64.hpp-LICENSE.txt: verbatim lines 1-26 of https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/common/base64.hpp diff --git a/llama/legal/natives/base64-hpp/base64.hpp-LICENSE.txt b/llama/legal/natives/base64-hpp/base64.hpp-LICENSE.txt new file mode 100644 index 000000000..7c4c3c05d --- /dev/null +++ b/llama/legal/natives/base64-hpp/base64.hpp-LICENSE.txt @@ -0,0 +1,26 @@ +/* +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +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 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. + +For more information, please refer to +*/ diff --git a/llama/legal/natives/boringssl/LICENSE b/llama/legal/natives/boringssl/LICENSE new file mode 100644 index 000000000..37a5b7439 --- /dev/null +++ b/llama/legal/natives/boringssl/LICENSE @@ -0,0 +1,238 @@ + + 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. diff --git a/llama/legal/natives/boringssl/SOURCE.txt b/llama/legal/natives/boringssl/SOURCE.txt new file mode 100644 index 000000000..0fee5748b --- /dev/null +++ b/llama/legal/natives/boringssl/SOURCE.txt @@ -0,0 +1,2 @@ +LICENSE: https://boringssl.googlesource.com/boringssl/+/refs/tags/0.20261020.0/LICENSE (commit d3bf4795ad5b79d646cddf2fec687da5b9b502db) +third_party-fiat/{LICENSE,AUTHORS,METADATA}: https://boringssl.googlesource.com/boringssl/+/refs/tags/0.20261020.0/third_party/fiat/ (fiat-crypto 6ccc6638716d4632304baf1adbb5c47c3a12ea6f, compiled into libcrypto) diff --git a/llama/legal/natives/boringssl/third_party-fiat/AUTHORS b/llama/legal/natives/boringssl/third_party-fiat/AUTHORS new file mode 100644 index 000000000..b67f8f97c --- /dev/null +++ b/llama/legal/natives/boringssl/third_party-fiat/AUTHORS @@ -0,0 +1,17 @@ +# This is the official list of fiat-crypto authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS files. +# See the latter for an explanation. + +# Names should be added to this file as one of +# Organization's name +# Individual's name +# Individual's name +# See CONTRIBUTORS for the meaning of multiple email addresses. + +# Please keep the list sorted. + +Andres Erbsen +Google Inc. +Jade Philipoom +Massachusetts Institute of Technology +Zoe Paraskevopoulou \ No newline at end of file diff --git a/llama/legal/natives/boringssl/third_party-fiat/LICENSE b/llama/legal/natives/boringssl/third_party-fiat/LICENSE new file mode 100644 index 000000000..3bc4b882e --- /dev/null +++ b/llama/legal/natives/boringssl/third_party-fiat/LICENSE @@ -0,0 +1,15 @@ +The Apache License, Version 2.0 (Apache-2.0) + +Copyright 2015-2020 the fiat-crypto authors (see the AUTHORS file) + +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. diff --git a/llama/legal/natives/boringssl/third_party-fiat/METADATA b/llama/legal/natives/boringssl/third_party-fiat/METADATA new file mode 100644 index 000000000..a3a55c9d6 --- /dev/null +++ b/llama/legal/natives/boringssl/third_party-fiat/METADATA @@ -0,0 +1,13 @@ +name: "fiat" +description: "Fiat-Crypto: Synthesizing Correct-by-Construction Code for Cryptographic Primitives." + +third_party { + url { + type: GIT + value: "https://github.com/mit-plv/fiat-crypto" + } + version: "6ccc6638716d4632304baf1adbb5c47c3a12ea6f" + last_upgrade_date { year: 2022 month: 3 day: 22 } + + local_modifications: "Files renamed to .h for BoringSSL integration. LICENSE file is LICENSE-APACHE from upstream." +} diff --git a/llama/legal/natives/cccl/LICENSE b/llama/legal/natives/cccl/LICENSE new file mode 100644 index 000000000..30823296e --- /dev/null +++ b/llama/legal/natives/cccl/LICENSE @@ -0,0 +1,410 @@ +============================================================================== +Thrust is under the Apache Licence v2.0, with some specific exceptions listed below +libcu++ is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + 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. + + +============================================================================== +Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): +============================================================================== +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + +============================================================================== +Software from third parties included in the LLVM Project: +============================================================================== +The LLVM Project contains third party software which is under different license +terms. All such code will be identified clearly using at least one of two +mechanisms: +1) It will be in a separate directory tree with its own `LICENSE.txt` or + `LICENSE` file at the top containing the specific license and restrictions + which apply to that software, or +2) It will contain specific license and restriction terms at the top of every + file. + +============================================================================== +Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): +============================================================================== + +The libc++ library is dual licensed under both the University of Illinois +"BSD-Like" license and the MIT license. As a user of this code you may choose +to use it under either license. As a contributor, you agree to allow your code +to be used under both. + +Full text of the relevant licenses is included below. + +============================================================================== + +University of Illinois/NCSA +Open Source License + +Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT + +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +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: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +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 +CONTRIBUTORS 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 WITH THE +SOFTWARE. + +============================================================================== + +Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT + +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. + +================================================================================ +Some portions of Thrust may be licensed under other compatible open-source +licenses. Any divergence from the Apache 2 license will be noted in the source +code where applicable. +Portions under other terms include, but are not limited to: +================================================================================ + +Various C++ utility classes in Thrust are based on the Boost Iterator, Tuple, +System, and Random Number libraries, which are provided under the Boost Software +License: + + Boost Software License - Version 1.0 - August 17th, 2003 + + Permission is hereby granted, free of charge, to any person or organization + obtaining a copy of the software and accompanying documentation covered by + this license (the "Software") to use, reproduce, display, distribute, + execute, and transmit the Software, and to prepare derivative works of the + Software, and to permit third-parties to whom the Software is furnished to + do so, all subject to the following: + + The copyright notices in the Software and this entire statement, including + the above license grant, this restriction and the following disclaimer, + must be included in all copies of the Software, in whole or in part, and + all derivative works of the Software, unless such copies or derivative + works are solely in the form of machine-executable object code generated by + a source language processor. + + 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT + SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + +================================================================================ + +Portions of the thrust::complex implementation are derived from FreeBSD with the +following terms: + +================================================================================ + + + 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[1] unmodified, 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. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + +[1] Individual copyright notices from the original authors are included in + the relevant source files. + +============================================================================== +CUB's source code is released under the BSD 3-Clause license: +============================================================================== +Copyright (c) 2010-2011, Duane Merrill. All rights reserved. +Copyright (c) 2011-2023, NVIDIA CORPORATION. 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 the NVIDIA CORPORATION 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 NVIDIA CORPORATION 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. diff --git a/llama/legal/natives/cccl/SOURCE.txt b/llama/legal/natives/cccl/SOURCE.txt new file mode 100644 index 000000000..097bee00b --- /dev/null +++ b/llama/legal/natives/cccl/SOURCE.txt @@ -0,0 +1 @@ +LICENSE: https://github.com/NVIDIA/cccl/blob/v3.4.3/LICENSE diff --git a/llama/legal/natives/cpp-httplib/LICENSE b/llama/legal/natives/cpp-httplib/LICENSE new file mode 100644 index 000000000..3e5ed359a --- /dev/null +++ b/llama/legal/natives/cpp-httplib/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2017 yhirose + +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/llama/legal/natives/cpp-httplib/SOURCE.txt b/llama/legal/natives/cpp-httplib/SOURCE.txt new file mode 100644 index 000000000..1df2b9e98 --- /dev/null +++ b/llama/legal/natives/cpp-httplib/SOURCE.txt @@ -0,0 +1 @@ +LICENSE: https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/vendor/cpp-httplib/LICENSE (cpp-httplib v0.62.0) diff --git a/llama/legal/natives/ggllm.cpp/LICENSE b/llama/legal/natives/ggllm.cpp/LICENSE new file mode 100644 index 000000000..68f6a806a --- /dev/null +++ b/llama/legal/natives/ggllm.cpp/LICENSE @@ -0,0 +1,23 @@ +MIT License + +Copyright (c) 2023 https://github.com/cmp-nct + +This project includes work that is Copyright (c) 2023 by Georgi Gerganov + +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/llama/legal/natives/ggllm.cpp/SOURCE.txt b/llama/legal/natives/ggllm.cpp/SOURCE.txt new file mode 100644 index 000000000..b6088b8cb --- /dev/null +++ b/llama/legal/natives/ggllm.cpp/SOURCE.txt @@ -0,0 +1 @@ +LICENSE: https://github.com/cmp-nct/ggllm.cpp/blob/0dc65eb735f90f82143ead9dedb66e73fa25d114/LICENSE diff --git a/llama/legal/natives/hip/LICENSE.md b/llama/legal/natives/hip/LICENSE.md new file mode 100644 index 000000000..4d43ac870 --- /dev/null +++ b/llama/legal/natives/hip/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (C) Advanced Micro Devices, 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. diff --git a/llama/legal/natives/hip/SOURCE.txt b/llama/legal/natives/hip/SOURCE.txt new file mode 100644 index 000000000..bc751286e --- /dev/null +++ b/llama/legal/natives/hip/SOURCE.txt @@ -0,0 +1,2 @@ +LICENSE.md: https://github.com/ROCm/rocm-systems/blob/therock-10.0/projects/hip/LICENSE.md +projects/clr/LICENSE.md at the same tag is byte-identical (checked), so only this copy is kept. diff --git a/llama/legal/natives/java-llama.cpp/LICENSE b/llama/legal/natives/java-llama.cpp/LICENSE new file mode 100644 index 000000000..500bc4ab7 --- /dev/null +++ b/llama/legal/natives/java-llama.cpp/LICENSE @@ -0,0 +1,10 @@ +MIT License + +Copyright (c) 2026 Bernard Ladenthin +Copyright (c) 2023-2025 Konstantin Herud + +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/llama/legal/natives/llama.cpp/LICENSE b/llama/legal/natives/llama.cpp/LICENSE new file mode 100644 index 000000000..e7dca554b --- /dev/null +++ b/llama/legal/natives/llama.cpp/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023-2026 The ggml 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. diff --git a/llama/legal/natives/llama.cpp/SOURCE.txt b/llama/legal/natives/llama.cpp/SOURCE.txt new file mode 100644 index 000000000..93bc35c12 --- /dev/null +++ b/llama/legal/natives/llama.cpp/SOURCE.txt @@ -0,0 +1 @@ +LICENSE: https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/LICENSE diff --git a/llama/legal/natives/llamafile-sgemm/SOURCE.txt b/llama/legal/natives/llamafile-sgemm/SOURCE.txt new file mode 100644 index 000000000..ffa3ec23f --- /dev/null +++ b/llama/legal/natives/llamafile-sgemm/SOURCE.txt @@ -0,0 +1 @@ +sgemm.cpp-LICENSE.txt: verbatim lines 1-21 of https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/ggml/src/ggml-cpu/llamafile/sgemm.cpp diff --git a/llama/legal/natives/llamafile-sgemm/sgemm.cpp-LICENSE.txt b/llama/legal/natives/llamafile-sgemm/sgemm.cpp-LICENSE.txt new file mode 100644 index 000000000..261a2260b --- /dev/null +++ b/llama/legal/natives/llamafile-sgemm/sgemm.cpp-LICENSE.txt @@ -0,0 +1,21 @@ +// Copyright 2024 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. diff --git a/llama/legal/natives/miniaudio/SOURCE.txt b/llama/legal/natives/miniaudio/SOURCE.txt new file mode 100644 index 000000000..0d90e1a83 --- /dev/null +++ b/llama/legal/natives/miniaudio/SOURCE.txt @@ -0,0 +1 @@ +miniaudio.h-LICENSE.txt: verbatim lines 95816-95864 of https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/vendor/miniaudio/miniaudio.h diff --git a/llama/legal/natives/miniaudio/miniaudio.h-LICENSE.txt b/llama/legal/natives/miniaudio/miniaudio.h-LICENSE.txt new file mode 100644 index 000000000..fa02d2220 --- /dev/null +++ b/llama/legal/natives/miniaudio/miniaudio.h-LICENSE.txt @@ -0,0 +1,49 @@ +/* +This software is available as a choice of the following licenses. Choose +whichever you prefer. + +=============================================================================== +ALTERNATIVE 1 - Public Domain (www.unlicense.org) +=============================================================================== +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. + +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. + +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 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. + +For more information, please refer to + +=============================================================================== +ALTERNATIVE 2 - MIT No Attribution +=============================================================================== +Copyright 2026 David Reid + +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. + +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/llama/legal/natives/nlohmann-json/LICENSE-jsonhpp b/llama/legal/natives/nlohmann-json/LICENSE-jsonhpp new file mode 100644 index 000000000..b5a10275c --- /dev/null +++ b/llama/legal/natives/nlohmann-json/LICENSE-jsonhpp @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2013-2025 Niels Lohmann + +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/llama/legal/natives/nlohmann-json/SOURCE.txt b/llama/legal/natives/nlohmann-json/SOURCE.txt new file mode 100644 index 000000000..a820f15ba --- /dev/null +++ b/llama/legal/natives/nlohmann-json/SOURCE.txt @@ -0,0 +1 @@ +LICENSE-jsonhpp: https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/licenses/LICENSE-jsonhpp (json.hpp 3.12.0 vendored at vendor/nlohmann) diff --git a/llama/legal/natives/onednn/LICENSE b/llama/legal/natives/onednn/LICENSE new file mode 100644 index 000000000..4de7f5cf1 --- /dev/null +++ b/llama/legal/natives/onednn/LICENSE @@ -0,0 +1,207 @@ + 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 + + ============================================================================ + + Copyright 2016-2025 Intel Corporation + Copyright 2018 YANDEX LLC + Copyright 2019-2025 FUJITSU LIMITED + Copyright 2020-2025 Arm Ltd. and affiliates + Copyright 2020-2025 Codeplay Software Limited + Copyright 2021 Alanna Tempest + Copyright 2022-2023 IBM Corporation + Copyright 2023 KNS Group LLC (YADRO) + + 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. + + This distribution includes third party software ("third party programs"). + This third party software, even if included with the distribution of + the Intel software, may be governed by separate license terms, including + without limitation, third party license terms, other Intel software license + terms, and open source software license terms. These separate license terms + govern your use of the third party programs as set forth in the + "THIRD-PARTY-PROGRAMS" file. diff --git a/llama/legal/natives/onednn/SOURCE.txt b/llama/legal/natives/onednn/SOURCE.txt new file mode 100644 index 000000000..de4014d5b --- /dev/null +++ b/llama/legal/natives/onednn/SOURCE.txt @@ -0,0 +1,2 @@ +LICENSE: https://github.com/uxlfoundation/oneDNN/blob/v3.11/LICENSE +THIRD-PARTY-PROGRAMS: https://github.com/uxlfoundation/oneDNN/blob/v3.11/THIRD-PARTY-PROGRAMS diff --git a/llama/legal/natives/onednn/THIRD-PARTY-PROGRAMS b/llama/legal/natives/onednn/THIRD-PARTY-PROGRAMS new file mode 100644 index 000000000..f71ef6aa7 --- /dev/null +++ b/llama/legal/natives/onednn/THIRD-PARTY-PROGRAMS @@ -0,0 +1,845 @@ +oneAPI Deep Neural Network Library (oneDNN) Third Party Programs File + +This file contains the list of third party software ("third party programs") +contained in the Intel software and their required notices and/or license +terms. This third party software, even if included with the distribution of +the Intel software, may be governed by separate license terms, including +without limitation, third party license terms, other Intel software license +terms, and open source software license terms. These separate license terms +govern your use of the third party programs as set forth in in the +"THIRD-PARTY-PROGRAMS" file. + +Third party programs and their corresponding required notices and/or license +terms are listed below. + +-------------------------------------------------------------------------------- +1. XByak (third_party/xbyak/) +Copyright (c) 2007 MITSUNARI Shigeo +All rights reserved. + +3-Clause BSD License + +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 the copyright owner 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. + + +ソースコード形式かバイナリ形式か、変更するかしないかを問わず、以下の条件を満た +す場合に限り、再頒布および使用が許可されます。 + +ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、および下記免責条項 +を含めること。 +バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著作 +権表示、本条件一覧、および下記免責条項を含めること。 +書面による特別の許可なしに、本ソフトウェアから派生した製品の宣伝または販売促進 +に、著作権者の名前またはコントリビューターの名前を使用してはならない。 +本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」提供さ +れており、明示黙示を問わず、商業的な使用可能性、および特定の目的に対する適合性 +に関する暗黙の保証も含め、またそれに限定されない、いかなる保証もありません。 +著作権者もコントリビューターも、事由のいかんを問わず、 損害発生の原因いかんを +問わず、かつ責任の根拠が契約であるか厳格責任であるか(過失その他の)不法行為で +あるかを問わず、仮にそのような損害が発生する可能性を知らされていたとしても、 +本ソフトウェアの使用によって発生した(代替品または代用サービスの調達、使用の +喪失、データの喪失、利益の喪失、業務の中断も含め、またそれに限定されない)直接 +損害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害について、 +一切責任を負わないものとします。 + +-------------------------------------------------------------------------------- +2. Googletest (third_party/gtest/) +Copyright 2005, Google Inc. +Copyright 2006, Google Inc. +Copyright 2007, Google Inc. +Copyright 2008, Google Inc. +Copyright 2015, Google Inc. +All rights reserved. + +3-Clause BSD License + +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. + +-------------------------------------------------------------------------------- +3. Instrumentation and Tracing Technology API (third_party/ittnotify/) +Copyright (c) 2011, Intel Corporation. All rights reserved. +Copyright (c) 2005-2014 Intel Corporation. All rights reserved. + +3-Clause BSD License + +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 Intel Corporation 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. + +-------------------------------------------------------------------------------- +4. CMake (cmake/FindOpenCL.cmake, cmake/FindBLAS.cmake, cmake/FindACL.cmake) +CMake - Cross Platform Makefile Generator +Copyright 2000-2020 Kitware, Inc. and Contributors +All rights reserved. + +3-Clause BSD License + +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 Kitware, Inc. nor the names of 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. + +------------------------------------------------------------------------------ +5. spdlog (third_party/spdlog/) + +The MIT License (MIT) +Copyright (c) 2016 Gabi Melman. + +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. + +-- NOTE: Third party dependency used by this software -- +This software depends on the fmt lib (MIT License), +and users must comply to its license: + https://raw.githubusercontent.com/fmtlib/fmt/master/LICENSE + +------------------------------------------------------------------------------ + +The following individuals and institutions are among the Contributors: + +* Aaron C. Meadows +* Adriaan de Groot +* Aleksey Avdeev +* Alexander Neundorf +* Alexander Smorkalov +* Alexey Sokolov +* Alex Merry +* Alex Turbov +* Andreas Pakulat +* Andreas Schneider +* André Rigland Brodtkorb +* Axel Huebl, Helmholtz-Zentrum Dresden - Rossendorf +* Benjamin Eikel +* Bjoern Ricks +* Brad Hards +* Christopher Harvey +* Christoph Grüninger +* Clement Creusot +* Daniel Blezek +* Daniel Pfeifer +* Enrico Scholz +* Eran Ifrah +* Esben Mose Hansen, Ange Optimization ApS +* Geoffrey Viola +* Google Inc +* Gregor Jasny +* Helio Chissini de Castro +* Ilya Lavrenov +* Insight Software Consortium +* Jan Woetzel +* Julien Schueller +* Kelly Thompson +* Konstantin Podsvirov +* Laurent Montel +* Mario Bensi +* Martin Gräßlin +* Mathieu Malaterre +* Matthaeus G. Chajdas +* Matthias Kretz +* Matthias Maennich +* Michael Hirsch, Ph.D. +* Michael Stürmer +* Miguel A. Figueroa-Villanueva +* Mike Jackson +* Mike McQuaid +* Nicolas Bock +* Nicolas Despres +* Nikita Krupen'ko +* NVIDIA Corporation +* OpenGamma Ltd. +* Patrick Stotko +* Per Øyvind Karlsen +* Peter Collingbourne +* Petr Gotthard +* Philip Lowman +* Philippe Proulx +* Raffi Enficiaud, Max Planck Society +* Raumfeld +* Roger Leigh +* Rolf Eike Beer +* Roman Donchenko +* Roman Kharitonov +* Ruslan Baratov +* Sebastian Holtermann +* Stephen Kelly +* Sylvain Joubert +* The Qt Company Ltd. +* Thomas Sondergaard +* Tobias Hunger +* Todd Gamblin +* Tristan Carel +* University of Dundee +* Vadim Zhukov +* Will Dicharry + +See version control history for details of individual contributions. + +The above copyright and license notice applies to distributions of +CMake in source and binary form. Third-party software packages supplied +with CMake under compatible licenses provide their own copyright notices +documented in corresponding subdirectories or source files. + +------------------------------------------------------------------------------ + +CMake was initially developed by Kitware with the following sponsorship: + + * National Library of Medicine at the National Institutes of Health + as part of the Insight Segmentation and Registration Toolkit (ITK). + + * US National Labs (Los Alamos, Livermore, Sandia) ASC Parallel + Visualization Initiative. + + * National Alliance for Medical Image Computing (NAMIC) is funded by the + National Institutes of Health through the NIH Roadmap for Medical Research, + Grant U54 EB005149. + + * Kitware, Inc. + +-------------------------------------------------------------------------------- +6. Xbyak_aarch64 (third_party/xbyak_aarch64/) +Copyright 2019-2020 FUJITSU LIMITED + +Apache License, Version 2.0 + +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. + + + 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 + +-------------------------------------------------------------------------------- +7. Boost C++ Libraries (src/common/primitive_hashing.hpp) +Copyright 2005-2014 Daniel James. + +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +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, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +-------------------------------------------------------------------------------- +8. Intel(R) Graphics Compute Runtime for oneAPI Level Zero and OpenCL(TM) +Driver (src/gpu/jit/ngen/npack/{elf_structs,hash}.hpp) +Copyright (c) 2018 Intel Corporation + +Intel(R) Graphics Compiler (src/gpu/jit/ngen/npack/neo_structs.hpp) +Copyright (c) 2019 Intel Corporation + +oneAPI Level Zero (third_party/level_zero/) +Copyright (C) 2019-2021 Intel Corporation + +Doxyrest toolkit (doc/doxyrest/) +Copyright (c) 2016, Tibbo Technology Inc +Copyright (c) 2016, Vladimir Gladkov +Copyright (c) 2016, Doxyrest maintainers + +sphinx-copybutton (doc\sphinx\_static\doxyrest_code_copy_button.js) +Copyright (c) 2018 Chris Holdgraf + +MIT License + +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. + +-------------------------------------------------------------------------------- +9. Sphinx (doc/sphinx/conf.py) +Copyright (c) 2007-2021 by the Sphinx team (see AUTHORS file). +All rights reserved. + +2-Clause BSD License + +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 +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. + +-------------------------------------------------------------------------------- +10. Intel(R) Metrics Discovery Application Programming Interface (third_party/mdapi/) +MIT License + +Copyright (c) 2019, Intel 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. + +-------------------------------------------------------------------------------- +11. Xbyak_riscv (third_party/xbyak_riscv/) + +Copyright (c) 2007 MITSUNARI Shigeo +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 the copyright owner 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. + +-------------------------------------------------------------------------------- +12. Khronos OpenCL Headers (third_party/opencl/) +Copyright (c) 2008 The Khronos Group Inc. + +Apache License, Version 2.0 + +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. + + + 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 + +-------------------------------------------------------------------------------- diff --git a/llama/legal/natives/opencl-clhpp/LICENSE.txt b/llama/legal/natives/opencl-clhpp/LICENSE.txt new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/llama/legal/natives/opencl-clhpp/LICENSE.txt @@ -0,0 +1,202 @@ + + 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. diff --git a/llama/legal/natives/opencl-clhpp/SOURCE.txt b/llama/legal/natives/opencl-clhpp/SOURCE.txt new file mode 100644 index 000000000..00450ad2b --- /dev/null +++ b/llama/legal/natives/opencl-clhpp/SOURCE.txt @@ -0,0 +1 @@ +LICENSE.txt: https://github.com/KhronosGroup/OpenCL-CLHPP/blob/v2026.05.29/LICENSE.txt diff --git a/llama/legal/natives/opencl-headers/LICENSE b/llama/legal/natives/opencl-headers/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/llama/legal/natives/opencl-headers/LICENSE @@ -0,0 +1,202 @@ + + 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. diff --git a/llama/legal/natives/opencl-headers/SOURCE.txt b/llama/legal/natives/opencl-headers/SOURCE.txt new file mode 100644 index 000000000..19f8b0fc6 --- /dev/null +++ b/llama/legal/natives/opencl-headers/SOURCE.txt @@ -0,0 +1 @@ +LICENSE: https://github.com/KhronosGroup/OpenCL-Headers/blob/v2026.05.29/LICENSE diff --git a/llama/legal/natives/openvino/LICENSE b/llama/legal/natives/openvino/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/llama/legal/natives/openvino/LICENSE @@ -0,0 +1,201 @@ + 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. diff --git a/llama/legal/natives/openvino/SOURCE.txt b/llama/legal/natives/openvino/SOURCE.txt new file mode 100644 index 000000000..561bed174 --- /dev/null +++ b/llama/legal/natives/openvino/SOURCE.txt @@ -0,0 +1 @@ +LICENSE: https://github.com/openvinotoolkit/openvino/blob/2026.4.1/LICENSE diff --git a/llama/legal/natives/pillow/LICENSE b/llama/legal/natives/pillow/LICENSE new file mode 100644 index 000000000..c011511a4 --- /dev/null +++ b/llama/legal/natives/pillow/LICENSE @@ -0,0 +1,30 @@ +The Python Imaging Library (PIL) is + + Copyright © 1997-2011 by Secret Labs AB + Copyright © 1995-2011 by Fredrik Lundh and contributors + +Pillow is the friendly PIL fork. It is + + Copyright © 2010 by Jeffrey 'Alex' Clark and contributors + +Like PIL, Pillow is licensed under the open source MIT-CMU License: + +By obtaining, using, and/or copying this software and/or its associated +documentation, you agree that you have read, understood, and will comply +with the following terms and conditions: + +Permission to use, copy, modify and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appears in all copies, and that +both that copyright notice and this permission notice appear in supporting +documentation, and that the name of Secret Labs AB or the author not be +used in advertising or publicity pertaining to distribution of the software +without specific, written prior permission. + +SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS +SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR 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 THIS SOFTWARE. diff --git a/llama/legal/natives/pillow/SOURCE.txt b/llama/legal/natives/pillow/SOURCE.txt new file mode 100644 index 000000000..21e1d4e8b --- /dev/null +++ b/llama/legal/natives/pillow/SOURCE.txt @@ -0,0 +1 @@ +LICENSE: https://github.com/python-pillow/Pillow/blob/923a595a2466414c019c1318cc634d84c167e9ad/LICENSE diff --git a/llama/legal/natives/rotate-bits/LICENSE.md b/llama/legal/natives/rotate-bits/LICENSE.md new file mode 100644 index 000000000..4a07c57f2 --- /dev/null +++ b/llama/legal/natives/rotate-bits/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 William Casarin + +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/llama/legal/natives/rotate-bits/SOURCE.txt b/llama/legal/natives/rotate-bits/SOURCE.txt new file mode 100644 index 000000000..b8f24b556 --- /dev/null +++ b/llama/legal/natives/rotate-bits/SOURCE.txt @@ -0,0 +1 @@ +LICENSE.md: https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/vendor/hash/rotate-bits/LICENSE.md (jb55/rotate-bits.h@27e784942f67db44abf2115c6638e735b579acd1) diff --git a/llama/legal/natives/sha1-clibs/SOURCE.txt b/llama/legal/natives/sha1-clibs/SOURCE.txt new file mode 100644 index 000000000..be5053a43 --- /dev/null +++ b/llama/legal/natives/sha1-clibs/SOURCE.txt @@ -0,0 +1 @@ +sha1.c-header.txt: verbatim lines 1-4 of https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/vendor/hash/sha1/sha1.c diff --git a/llama/legal/natives/sha1-clibs/sha1.c-header.txt b/llama/legal/natives/sha1-clibs/sha1.c-header.txt new file mode 100644 index 000000000..5635a12b9 --- /dev/null +++ b/llama/legal/natives/sha1-clibs/sha1.c-header.txt @@ -0,0 +1,4 @@ +/* +SHA-1 in C +By Steve Reid +100% Public Domain diff --git a/llama/legal/natives/sha256-jb55/LICENSE b/llama/legal/natives/sha256-jb55/LICENSE new file mode 100644 index 000000000..950b19483 --- /dev/null +++ b/llama/legal/natives/sha256-jb55/LICENSE @@ -0,0 +1 @@ +2010-06-11 : Igor Pavlov : Public domain diff --git a/llama/legal/natives/sha256-jb55/SOURCE.txt b/llama/legal/natives/sha256-jb55/SOURCE.txt new file mode 100644 index 000000000..cf0964853 --- /dev/null +++ b/llama/legal/natives/sha256-jb55/SOURCE.txt @@ -0,0 +1,2 @@ +LICENSE: https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/vendor/hash/sha256/LICENSE (jb55/sha256.c@5e637272c13f200872d55ff579f7e2ab6c3f252f) +sha256.c-header.txt: verbatim lines 1-3 of https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/vendor/hash/sha256/sha256.c diff --git a/llama/legal/natives/sha256-jb55/sha256.c-header.txt b/llama/legal/natives/sha256-jb55/sha256.c-header.txt new file mode 100644 index 000000000..a750d748e --- /dev/null +++ b/llama/legal/natives/sha256-jb55/sha256.c-header.txt @@ -0,0 +1,3 @@ +/* Crypto/Sha256.c -- SHA-256 Hash +2010-06-11 : Igor Pavlov : Public domain +This code is based on public domain code from Wei Dai's Crypto++ library. */ diff --git a/llama/legal/natives/sheredom-subprocess/SOURCE.txt b/llama/legal/natives/sheredom-subprocess/SOURCE.txt new file mode 100644 index 000000000..4b550b181 --- /dev/null +++ b/llama/legal/natives/sheredom-subprocess/SOURCE.txt @@ -0,0 +1 @@ +subprocess.h-LICENSE.txt: verbatim lines 1-31 of https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/vendor/sheredom/subprocess.h diff --git a/llama/legal/natives/sheredom-subprocess/subprocess.h-LICENSE.txt b/llama/legal/natives/sheredom-subprocess/subprocess.h-LICENSE.txt new file mode 100644 index 000000000..3ee4e1a7d --- /dev/null +++ b/llama/legal/natives/sheredom-subprocess/subprocess.h-LICENSE.txt @@ -0,0 +1,31 @@ +/* + The latest version of this library is available on GitHub; + https://github.com/sheredom/subprocess.h +*/ + +/* + This is free and unencumbered software released into the public domain. + + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any + means. + + In jurisdictions that recognize copyright laws, the author or authors + of this software dedicate any and all copyright interest in the + software to the public domain. We make this dedication for the benefit + of the public at large and to the detriment of our heirs and + successors. We intend this dedication to be an overt act of + relinquishment in perpetuity of all present and future rights to this + software under copyright law. + + 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 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. + + For more information, please refer to +*/ diff --git a/llama/legal/natives/spirv-headers/LICENSE b/llama/legal/natives/spirv-headers/LICENSE new file mode 100644 index 000000000..a63e9c620 --- /dev/null +++ b/llama/legal/natives/spirv-headers/LICENSE @@ -0,0 +1,502 @@ +Files: All files except for those called out below. +Copyright (c) 2015-2024 The Khronos Group Inc. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and/or associated documentation files (the +"Materials"), to deal in the Materials without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Materials, and to +permit persons to whom the Materials are 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 Materials. + +MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS +KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS +SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT + https://www.khronos.org/registry/ + +THE MATERIALS 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. +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 +MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. + +--- + +Files: include/spirv/spir-v.xml +Copyright (c) 2015-2024 The Khronos Group Inc. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and/or associated documentation files (the +"Materials"), to deal in the Materials without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Materials, and to +permit persons to whom the Materials are 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 Materials. + +THE MATERIALS 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. +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 +MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. + +--- + +Files: tools/buildHeaders/jsoncpp/* +The JsonCpp library's source code, including accompanying documentation, +tests and demonstration applications, are licensed under the following +conditions... + +The author (Baptiste Lepilleur) explicitly disclaims copyright in all +jurisdictions which recognize such a disclaimer. In such jurisdictions, +this software is released into the Public Domain. + +In jurisdictions which do not recognize Public Domain property (e.g. Germany as of +2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is +released under the terms of the MIT License (see below). + +In jurisdictions which recognize Public Domain property, the user of this +software may choose to accept it either as 1) Public Domain, 2) under the +conditions of the MIT License (see below), or 3) under the terms of dual +Public Domain/MIT License conditions described here, as they choose. + +The MIT License is about as close to Public Domain as a license can get, and is +described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + +The full text of the MIT License follows: + +======================================================================== +Copyright (c) 2007-2010 Baptiste Lepilleur + +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. +======================================================================== + +--- + +Files: **.md, WORKSPACE, .git** + +Attribution 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution 4.0 International Public License ("Public License"). To the +extent this Public License may be interpreted as a contract, You are +granted the Licensed Rights in consideration of Your acceptance of +these terms and conditions, and the Licensor grants You such rights in +consideration of benefits the Licensor receives from making the +Licensed Material available under these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + d. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + g. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + i. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's + License You apply must not prevent recipients of the Adapted + Material from complying with this Public License. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. + diff --git a/llama/legal/natives/spirv-headers/SOURCE.txt b/llama/legal/natives/spirv-headers/SOURCE.txt new file mode 100644 index 000000000..b258d3e38 --- /dev/null +++ b/llama/legal/natives/spirv-headers/SOURCE.txt @@ -0,0 +1 @@ +LICENSE: https://github.com/KhronosGroup/SPIRV-Headers/blob/vulkan-sdk-1.4.350.0/LICENSE diff --git a/llama/legal/natives/stb_image/SOURCE.txt b/llama/legal/natives/stb_image/SOURCE.txt new file mode 100644 index 000000000..978e68383 --- /dev/null +++ b/llama/legal/natives/stb_image/SOURCE.txt @@ -0,0 +1 @@ +stb_image.h-LICENSE.txt: verbatim lines 7948-7988 of https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/vendor/stb/stb_image.h diff --git a/llama/legal/natives/stb_image/stb_image.h-LICENSE.txt b/llama/legal/natives/stb_image/stb_image.h-LICENSE.txt new file mode 100644 index 000000000..8309c94f1 --- /dev/null +++ b/llama/legal/natives/stb_image/stb_image.h-LICENSE.txt @@ -0,0 +1,41 @@ +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +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. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +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 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/llama/legal/natives/unicode/SOURCE.txt b/llama/legal/natives/unicode/SOURCE.txt new file mode 100644 index 000000000..d1d4dc7bf --- /dev/null +++ b/llama/legal/natives/unicode/SOURCE.txt @@ -0,0 +1 @@ +license.txt: https://www.unicode.org/license.txt (fetched 2026-10-25) diff --git a/llama/legal/natives/unicode/license.txt b/llama/legal/natives/unicode/license.txt new file mode 100644 index 000000000..56da58912 --- /dev/null +++ b/llama/legal/natives/unicode/license.txt @@ -0,0 +1,39 @@ +UNICODE LICENSE V3 + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 1991-2026 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. diff --git a/llama/legal/natives/vulkan-headers/Apache-2.0.txt b/llama/legal/natives/vulkan-headers/Apache-2.0.txt new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/llama/legal/natives/vulkan-headers/Apache-2.0.txt @@ -0,0 +1,202 @@ + + 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. diff --git a/llama/legal/natives/vulkan-headers/LICENSE.md b/llama/legal/natives/vulkan-headers/LICENSE.md new file mode 100644 index 000000000..d6a0648b6 --- /dev/null +++ b/llama/legal/natives/vulkan-headers/LICENSE.md @@ -0,0 +1,18 @@ +Copyright 2015-2023 The Khronos Group Inc. + +Files in this repository fall under one of these licenses: + +- `Apache-2.0` +- `MIT` + +Note: With the exception of `parse_dependency.py` the files using `MIT` license +also fall under `Apache-2.0`. Example: + +``` +SPDX-License-Identifier: Apache-2.0 OR MIT +``` + +Full license text of these licenses is available at: + + * Apache-2.0: https://opensource.org/licenses/Apache-2.0 + * MIT: https://opensource.org/licenses/MIT diff --git a/llama/legal/natives/vulkan-headers/MIT.txt b/llama/legal/natives/vulkan-headers/MIT.txt new file mode 100644 index 000000000..8495fe9e9 --- /dev/null +++ b/llama/legal/natives/vulkan-headers/MIT.txt @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2015-2023 The Khronos Group 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. diff --git a/llama/legal/natives/vulkan-headers/SOURCE.txt b/llama/legal/natives/vulkan-headers/SOURCE.txt new file mode 100644 index 000000000..594fbe26b --- /dev/null +++ b/llama/legal/natives/vulkan-headers/SOURCE.txt @@ -0,0 +1,3 @@ +LICENSE.md: https://github.com/KhronosGroup/Vulkan-Headers/blob/vulkan-sdk-1.4.350.0/LICENSE.md +Apache-2.0.txt: https://github.com/KhronosGroup/Vulkan-Headers/blob/vulkan-sdk-1.4.350.0/LICENSES/Apache-2.0.txt +MIT.txt: https://github.com/KhronosGroup/Vulkan-Headers/blob/vulkan-sdk-1.4.350.0/LICENSES/MIT.txt diff --git a/llama/legal/natives/webui-big-integer/LICENSE b/llama/legal/natives/webui-big-integer/LICENSE new file mode 100644 index 000000000..cf1ab25da --- /dev/null +++ b/llama/legal/natives/webui-big-integer/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +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 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. + +For more information, please refer to diff --git a/llama/legal/natives/webui-big-integer/SOURCE.txt b/llama/legal/natives/webui-big-integer/SOURCE.txt new file mode 100644 index 000000000..106d3dd41 --- /dev/null +++ b/llama/legal/natives/webui-big-integer/SOURCE.txt @@ -0,0 +1 @@ +LICENSE: https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/tools/ui/src/lib/vendors/big-integer/LICENSE diff --git a/llama/legal/natives/webui-decimal.js/LICENCE.md b/llama/legal/natives/webui-decimal.js/LICENCE.md new file mode 100644 index 000000000..e62dbae88 --- /dev/null +++ b/llama/legal/natives/webui-decimal.js/LICENCE.md @@ -0,0 +1,23 @@ +The MIT Licence. + +Copyright (c) 2025 Michael Mclaughlin + +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/llama/legal/natives/webui-decimal.js/SOURCE.txt b/llama/legal/natives/webui-decimal.js/SOURCE.txt new file mode 100644 index 000000000..337fa835b --- /dev/null +++ b/llama/legal/natives/webui-decimal.js/SOURCE.txt @@ -0,0 +1 @@ +LICENCE.md: https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/tools/ui/src/lib/vendors/decimal.js/LICENCE.md diff --git a/llama/legal/natives/webui-nerdamer-prime/LICENSE b/llama/legal/natives/webui-nerdamer-prime/LICENSE new file mode 100644 index 000000000..1a62b421b --- /dev/null +++ b/llama/legal/natives/webui-nerdamer-prime/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 together-science + +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/llama/legal/natives/webui-nerdamer-prime/SOURCE.txt b/llama/legal/natives/webui-nerdamer-prime/SOURCE.txt new file mode 100644 index 000000000..9da88bbdd --- /dev/null +++ b/llama/legal/natives/webui-nerdamer-prime/SOURCE.txt @@ -0,0 +1 @@ +LICENSE: https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/tools/ui/src/lib/vendors/nerdamer-prime/LICENSE diff --git a/llama/legal/natives/webui-npm/LOCKFILE.sha256 b/llama/legal/natives/webui-npm/LOCKFILE.sha256 new file mode 100644 index 000000000..d52b9d1c8 --- /dev/null +++ b/llama/legal/natives/webui-npm/LOCKFILE.sha256 @@ -0,0 +1 @@ +ca12fa34cf60965e260b4f00d6dfada6de1e6d683a18ef097f7a24c21f1aa2d0 tools/ui/package-lock.json diff --git a/llama/legal/natives/webui-npm/THIRD-PARTY-LICENSES.txt b/llama/legal/natives/webui-npm/THIRD-PARTY-LICENSES.txt new file mode 100644 index 000000000..093cdfae7 --- /dev/null +++ b/llama/legal/natives/webui-npm/THIRD-PARTY-LICENSES.txt @@ -0,0 +1,9457 @@ +Licenses of the npm packages the embedded llama.cpp WebUI can contain (an upper bound, +see .github/buildcheck/webuilicenses.py). Generated; do not edit. + +============================================================================== +@antfu/install-pkg@1.1.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2021 Anthony Fu + +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. + +============================================================================== +@braintree/sanitize-url@7.1.2 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2017 Braintree + +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. + +============================================================================== +@chevrotain/types@11.1.2 (Apache-2.0): LICENSE.txt +============================================================================== + + 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. + +============================================================================== +@floating-ui/core@1.7.5 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2021-present Floating UI 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. + +============================================================================== +@floating-ui/dom@1.7.6 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2021-present Floating UI 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. + +============================================================================== +@floating-ui/utils@0.2.11 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2021-present Floating UI 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. + +============================================================================== +@hono/node-server@2.1.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2022 - present, Yusuke Wada and Hono 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. + +============================================================================== +@iconify/types@2.0.0 (MIT): license.txt +============================================================================== +MIT License + +Copyright (c) 2021 - 2022 Vjacheslav Trushkin / Iconify OÜ + +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. + +============================================================================== +@iconify/utils@3.1.3 (MIT): license.txt +============================================================================== +MIT License + +Copyright (c) 2021-PRESENT Vjacheslav Trushkin + +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. + +============================================================================== +@jridgewell/gen-mapping@0.3.13 (MIT): LICENSE +============================================================================== +Copyright 2024 Justin Ridgewell + +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. + +============================================================================== +@jridgewell/remapping@2.3.5 (MIT): LICENSE +============================================================================== +Copyright 2024 Justin Ridgewell + +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. + +============================================================================== +@jridgewell/resolve-uri@3.1.2 (MIT): LICENSE +============================================================================== +Copyright 2019 Justin Ridgewell + +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. + +============================================================================== +@jridgewell/sourcemap-codec@1.6.0 (MIT): LICENSE +============================================================================== +Copyright 2024 Justin Ridgewell + +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. + +============================================================================== +@jridgewell/trace-mapping@0.3.31 (MIT): LICENSE +============================================================================== +Copyright 2024 Justin Ridgewell + +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. + +============================================================================== +@lucide/svelte@1.46.0 (ISC): LICENSE +============================================================================== +ISC License + +Copyright (c) 2026 Lucide Icons and Contributors + +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. + +--- + +The following Lucide icons are derived from the Feather project: + +airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + +The MIT License (MIT) (for the icons listed above) + +Copyright (c) 2013-present Cole Bemis + +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. + +============================================================================== +@mermaid-js/parser@1.2.1 (MIT): LICENSE +============================================================================== +The MIT License (MIT) + +Copyright (c) 2023 Yokozuna59 + +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. + +============================================================================== +@modelcontextprotocol/sdk@1.32.1 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Anthropic, PBC + +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. + +============================================================================== +@napi-rs/canvas@0.1.100 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2020 lynweklm@gmail.com + +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. + +============================================================================== +@napi-rs/canvas-android-arm64@0.1.100 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): not declared +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +@napi-rs/canvas-darwin-arm64@0.1.100 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): not declared +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +@napi-rs/canvas-darwin-x64@0.1.100 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): not declared +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +@napi-rs/canvas-linux-arm-gnueabihf@0.1.100 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): not declared +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +@napi-rs/canvas-linux-arm64-gnu@0.1.100 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): not declared +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +@napi-rs/canvas-linux-arm64-musl@0.1.100 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): not declared +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +@napi-rs/canvas-linux-riscv64-gnu@0.1.100 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): not declared +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +@napi-rs/canvas-linux-x64-gnu@0.1.100 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): not declared +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +@napi-rs/canvas-linux-x64-musl@0.1.100 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): not declared +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +@napi-rs/canvas-win32-arm64-msvc@0.1.100 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): not declared +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +@napi-rs/canvas-win32-x64-msvc@0.1.100 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): not declared +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +@polka/url@1.0.0-next.29 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): Luke Edwards luke@lukeed.com +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +@standard-schema/spec@1.1.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Colin McDonnell + +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. + +============================================================================== +@sveltejs/acorn-typescript@1.0.10 (MIT): LICENSE.md +============================================================================== +MIT License + +Copyright (c) 2022 Tyreal Hu +Copyright (c) 2025 The Svelte Team + +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. + +============================================================================== +@sveltejs/kit@2.70.2 (MIT): LICENSE +============================================================================== +Copyright (c) 2020 [these people](https://github.com/sveltejs/kit/graphs/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. + +============================================================================== +@ungap/structured-clone@1.3.1 (ISC): LICENSE +============================================================================== +ISC License + +Copyright (c) 2021, Andrea Giammarchi, @WebReflection + +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. + +============================================================================== +@upsetjs/venn.js@2.0.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2013 Ben Frederickson +Copyright (c) 2021 Samuel Gratzl + +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. + +============================================================================== +accepts@2.0.0 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson + +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. + +============================================================================== +acorn@8.16.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (C) 2012-2022 by various contributors (see 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. + +============================================================================== +ajv@8.20.0 (MIT): LICENSE +============================================================================== +The MIT License (MIT) + +Copyright (c) 2015-2021 Evgeny Poberezkin + +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. + +============================================================================== +ajv-formats@3.0.1 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2020 Evgeny Poberezkin + +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. + +============================================================================== +axobject-query@4.1.0 (Apache-2.0): LICENSE +============================================================================== +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 A11yance + +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. + +============================================================================== +bail@2.0.2 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +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. + +============================================================================== +bits-ui@2.18.1 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2023 Hunter Johnston + +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. + +============================================================================== +body-parser@2.3.0 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson + +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. + +============================================================================== +content-type@2.0.0 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2015 Douglas Christopher Wilson + +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. + +============================================================================== +bytes@3.1.2 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015 Jed Watson + +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. + +============================================================================== +call-bind-apply-helpers@1.0.2 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Jordan Harband + +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. + +============================================================================== +call-bound@1.0.4 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Jordan Harband + +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. + +============================================================================== +ccount@2.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +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. + +============================================================================== +character-entities@2.0.2 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +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. + +============================================================================== +character-entities-html4@2.1.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +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. + +============================================================================== +character-entities-legacy@3.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +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. + +============================================================================== +clsx@2.1.1 (MIT): license +============================================================================== +MIT License + +Copyright (c) Luke Edwards (lukeed.com) + +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. + +============================================================================== +comma-separated-tokens@2.0.3 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +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. + +============================================================================== +commander@7.2.0 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2011 TJ Holowaychuk + +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. + +============================================================================== +content-disposition@1.1.0 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2014-2017 Douglas Christopher Wilson + +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. + +============================================================================== +content-type@1.0.5 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2015 Douglas Christopher Wilson + +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. + +============================================================================== +cookie@1.1.1 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2012-2014 Roman Shtylman +Copyright (c) 2015 Douglas Christopher Wilson + +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. + +============================================================================== +cookie-signature@1.2.2 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2012–2024 LearnBoost and other 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. + +============================================================================== +cors@2.8.6 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2013 Troy Goode + +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. + +============================================================================== +cose-base@1.0.3 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2019 - present, iVis@Bilkent. + +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. + +============================================================================== +cross-spawn@7.0.6 (MIT): LICENSE +============================================================================== +The MIT License (MIT) + +Copyright (c) 2018 Made With MOXY Lda + +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. + +============================================================================== +cytoscape@3.34.0 (MIT): LICENSE +============================================================================== +Copyright (c) 2016-2026, The Cytoscape Consortium. + +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. + +============================================================================== +cytoscape@3.34.0 (MIT): license-update.mjs +============================================================================== +import fs from 'fs'; +import path from 'path'; + +import { fileURLToPath } from 'url'; +import { dirname } from 'path'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const year = (new Date()).getFullYear(); + +const license = `Copyright (c) 2016-${year}, The Cytoscape Consortium. + +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.`; + +fs.writeFileSync(path.join(__dirname, 'LICENSE'), license); + +============================================================================== +cytoscape-cose-bilkent@4.1.0 (MIT): LICENSE +============================================================================== + + +Copyright (c) 2016-2018, The Cytoscape Consortium. + +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. + +============================================================================== +cytoscape-fcose@2.2.0 (MIT): LICENSE +============================================================================== +Copyright (c) 2018 - present, iVis-at-Bilkent. + +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. + +============================================================================== +cose-base@2.2.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2019 - present, iVis@Bilkent. + +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. + +============================================================================== +layout-base@2.0.1 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2019 iVis@Bilkent + +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. + +============================================================================== +d3@7.9.0 (ISC): LICENSE +============================================================================== +Copyright 2010-2023 Mike Bostock + +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. + +============================================================================== +d3-array@3.2.4 (ISC): LICENSE +============================================================================== +Copyright 2010-2023 Mike Bostock + +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. + +============================================================================== +d3-axis@3.0.0 (ISC): LICENSE +============================================================================== +Copyright 2010-2021 Mike Bostock + +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. + +============================================================================== +d3-brush@3.0.0 (ISC): LICENSE +============================================================================== +Copyright 2010-2021 Mike Bostock + +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. + +============================================================================== +d3-chord@3.0.1 (ISC): LICENSE +============================================================================== +Copyright 2010-2021 Mike Bostock + +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. + +============================================================================== +d3-color@3.1.0 (ISC): LICENSE +============================================================================== +Copyright 2010-2022 Mike Bostock + +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. + +============================================================================== +d3-contour@4.0.2 (ISC): LICENSE +============================================================================== +Copyright 2012-2023 Mike Bostock + +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. + +============================================================================== +d3-delaunay@6.0.4 (ISC): LICENSE +============================================================================== +Copyright 2018-2021 Observable, Inc. +Copyright 2021 Mapbox + +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. + +============================================================================== +d3-dispatch@3.0.1 (ISC): LICENSE +============================================================================== +Copyright 2010-2021 Mike Bostock + +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. + +============================================================================== +d3-drag@3.0.0 (ISC): LICENSE +============================================================================== +Copyright 2010-2021 Mike Bostock + +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. + +============================================================================== +d3-dsv@3.0.1 (ISC): LICENSE +============================================================================== +Copyright 2013-2021 Mike Bostock + +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. + +============================================================================== +iconv-lite@0.6.3 (MIT): LICENSE +============================================================================== +Copyright (c) 2011 Alexander Shtuchkin + +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. + +============================================================================== +d3-ease@3.0.1 (BSD-3-Clause): LICENSE +============================================================================== +Copyright 2010-2021 Mike Bostock +Copyright 2001 Robert Penner +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 the author nor the names of 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. + +============================================================================== +d3-fetch@3.0.1 (ISC): LICENSE +============================================================================== +Copyright 2016-2021 Mike Bostock + +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. + +============================================================================== +d3-force@3.0.0 (ISC): LICENSE +============================================================================== +Copyright 2010-2021 Mike Bostock + +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. + +============================================================================== +d3-format@3.1.2 (ISC): LICENSE +============================================================================== +Copyright 2010-2026 Mike Bostock + +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. + +============================================================================== +d3-geo@3.1.1 (ISC): LICENSE +============================================================================== +Copyright 2010-2024 Mike Bostock + +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. + +This license applies to GeographicLib, versions 1.12 and later. + +Copyright 2008-2012 Charles Karney + +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. + +============================================================================== +d3-hierarchy@3.1.2 (ISC): LICENSE +============================================================================== +Copyright 2010-2021 Mike Bostock + +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. + +============================================================================== +d3-interpolate@3.0.1 (ISC): LICENSE +============================================================================== +Copyright 2010-2021 Mike Bostock + +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. + +============================================================================== +d3-path@3.1.0 (ISC): LICENSE +============================================================================== +Copyright 2015-2022 Mike Bostock + +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. + +============================================================================== +d3-polygon@3.0.1 (ISC): LICENSE +============================================================================== +Copyright 2010-2021 Mike Bostock + +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. + +============================================================================== +d3-quadtree@3.0.1 (ISC): LICENSE +============================================================================== +Copyright 2010-2021 Mike Bostock + +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. + +============================================================================== +d3-random@3.0.1 (ISC): LICENSE +============================================================================== +Copyright 2010-2021 Mike Bostock + +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. + +============================================================================== +d3-sankey@0.12.3 (BSD-3-Clause): LICENSE +============================================================================== +Copyright 2015, Mike Bostock +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 the author nor the names of 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. + +============================================================================== +d3-array@2.12.1 (BSD-3-Clause): LICENSE +============================================================================== +Copyright 2010-2020 Mike Bostock +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 the author nor the names of 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. + +============================================================================== +d3-path@1.0.9 (BSD-3-Clause): LICENSE +============================================================================== +Copyright 2015-2016 Mike Bostock +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 the author nor the names of 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. + +============================================================================== +d3-shape@1.3.7 (BSD-3-Clause): LICENSE +============================================================================== +Copyright 2010-2015 Mike Bostock +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 the author nor the names of 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. + +============================================================================== +internmap@1.0.1 (ISC): LICENSE +============================================================================== +Copyright 2021 Mike Bostock + +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. + +============================================================================== +d3-scale@4.0.2 (ISC): LICENSE +============================================================================== +Copyright 2010-2021 Mike Bostock + +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. + +============================================================================== +d3-scale-chromatic@3.1.0 (ISC): LICENSE +============================================================================== +Copyright 2010-2024 Mike Bostock + +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. + +Apache-Style Software License for ColorBrewer software and ColorBrewer Color Schemes + +Copyright 2002 Cynthia Brewer, Mark Harrower, and The Pennsylvania State University + +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. + +============================================================================== +d3-selection@3.0.0 (ISC): LICENSE +============================================================================== +Copyright 2010-2021 Mike Bostock + +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. + +============================================================================== +d3-shape@3.2.0 (ISC): LICENSE +============================================================================== +Copyright 2010-2022 Mike Bostock + +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. + +============================================================================== +d3-time@3.1.0 (ISC): LICENSE +============================================================================== +Copyright 2010-2022 Mike Bostock + +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. + +============================================================================== +d3-time-format@4.1.0 (ISC): LICENSE +============================================================================== +Copyright 2010-2021 Mike Bostock + +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. + +============================================================================== +d3-timer@3.0.1 (ISC): LICENSE +============================================================================== +Copyright 2010-2021 Mike Bostock + +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. + +============================================================================== +d3-transition@3.0.1 (ISC): LICENSE +============================================================================== +Copyright 2010-2021 Mike Bostock + +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. + +============================================================================== +d3-zoom@3.0.0 (ISC): LICENSE +============================================================================== +Copyright 2010-2021 Mike Bostock + +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. + +============================================================================== +dagre-d3-es@7.0.14 (MIT): LICENSE.md +============================================================================== +Original dagre-d3 copyright: Copyright (c) 2013 Chris Pettitt +Original dagre copyright: Copyright (c) 2012-2014 Chris Pettitt +Original graphlib copyright: Copyright (c) 2012-2014 Chris Pettitt + +Copyright (c) 2022-2024 Thibaut Lassalle, David Newell, Alois Klink, Sidharth Vinod and dagre-es 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. + +============================================================================== +dayjs@1.11.21 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2018-present, iamkun + +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. + +============================================================================== +debug@4.4.3 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2014-2017 TJ Holowaychuk +Copyright (c) 2018-2021 Josh Junon + +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. + +============================================================================== +decode-named-character-reference@1.3.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +delaunator@5.1.0 (ISC): LICENSE +============================================================================== +ISC License + +Copyright (c) 2026, Mapbox + +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. + +============================================================================== +depd@2.0.0 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2014-2018 Douglas Christopher Wilson + +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. + +============================================================================== +dequal@2.0.3 (MIT): license +============================================================================== +The MIT License (MIT) + +Copyright (c) Luke Edwards (lukeed.com) + +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. + +============================================================================== +devalue@5.9.4 (MIT): LICENSE +============================================================================== +Copyright (c) 2018-19 [these people](https://github.com/rich-harris/devalue/graphs/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. + +============================================================================== +devlop@1.1.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2023 Titus Wormer + +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. + +============================================================================== +dexie@4.4.3 (Apache-2.0): LICENSE +============================================================================== +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. + +============================================================================== +dexie@4.4.3 (Apache-2.0): NOTICE +============================================================================== +Dexie.js + +Copyright (c) 2014-2017 David Fahlander + +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. + +============================================================================== +dompurify@3.4.17 ((MPL-2.0 OR Apache-2.0)): LICENSE +============================================================================== + + 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. + +============================================================================== +dompurify@3.4.17 ((MPL-2.0 OR Apache-2.0)): LICENSE-MPL +============================================================================== +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. + +============================================================================== +dunder-proto@1.0.1 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 ECMAScript Shims + +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. + +============================================================================== +ee-first@1.1.1 (MIT): LICENSE +============================================================================== + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong me@jongleberry.com + +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. + +============================================================================== +encodeurl@2.0.0 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2016 Douglas Christopher Wilson + +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. + +============================================================================== +entities@6.0.1 (BSD-2-Clause): LICENSE +============================================================================== +Copyright (c) Felix Böhm +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. + +THIS 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, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================================== +es-define-property@1.0.1 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Jordan Harband + +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. + +============================================================================== +es-errors@1.3.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Jordan Harband + +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. + +============================================================================== +es-object-atoms@1.1.2 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Jordan Harband + +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. + +============================================================================== +es-toolkit@1.47.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Viva Republica, Inc + +Copyright OpenJS Foundation and other contributors + +Parts of the test suite and compatibility layer in `es-toolkit/compat` are derived from Lodash (https://github.com/lodash/lodash) by the OpenJS Foundation (https://openjsf.org/) and Underscore.js by Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors (http://underscorejs.org/) + +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. + +============================================================================== +escape-html@1.0.3 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2012-2013 TJ Holowaychuk +Copyright (c) 2015 Andreas Lubbe +Copyright (c) 2015 Tiancheng "Timothy" Gu + +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. + +============================================================================== +esm-env@1.2.2 (MIT): LICENSE +============================================================================== +Copyright 2022 Benjamin McCann + +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. + +============================================================================== +etag@1.8.1 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2014-2016 Douglas Christopher Wilson + +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. + +============================================================================== +eventsource@3.0.7 (MIT): LICENSE +============================================================================== +The MIT License + +Copyright (c) EventSource GitHub organisation + +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. + +============================================================================== +eventsource-parser@3.1.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2026 Espen Hovlandsdal + +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. + +============================================================================== +express@5.2.1 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2009-2014 TJ Holowaychuk +Copyright (c) 2013-2014 Roman Shtylman +Copyright (c) 2014-2015 Douglas Christopher Wilson + +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. + +============================================================================== +express-rate-limit@8.5.2 (MIT): license.md +============================================================================== +# MIT License + +Copyright 2023 Nathan Friedly, Vedant K + +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. + +============================================================================== +extend@3.0.2 (MIT): LICENSE +============================================================================== +The MIT License (MIT) + +Copyright (c) 2014 Stefan Thomas + +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. + +============================================================================== +fast-deep-equal@3.1.3 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2017 Evgeny Poberezkin + +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. + +============================================================================== +fast-uri@3.1.8 (BSD-3-Clause): LICENSE +============================================================================== +Copyright (c) 2011-2021, Gary Court until https://github.com/garycourt/uri-js/commit/a1acf730b4bba3f1097c9f52e7d9d3aba8cdcaae +Copyright (c) 2021-present The Fastify team +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. + * The names of any contributors may not 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 HOLDERS AND 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 complete list of contributors can be found at: +- https://github.com/garycourt/uri-js/graphs/contributors + +============================================================================== +fastdom@1.0.12 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): Wilson Page wilsonpage@me.com +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +fflate@0.8.3 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2026 Arjun Barrett + +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. + +============================================================================== +finalhandler@2.1.1 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2014-2022 Douglas Christopher Wilson + +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. + +============================================================================== +forwarded@0.2.0 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2014-2017 Douglas Christopher Wilson + +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. + +============================================================================== +fresh@2.0.0 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2016-2017 Douglas Christopher Wilson + +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. + +============================================================================== +function-bind@1.1.2 (MIT): LICENSE +============================================================================== +Copyright (c) 2013 Raynos. + +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. + +============================================================================== +get-intrinsic@1.3.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2020 Jordan Harband + +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. + +============================================================================== +get-proto@1.0.1 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2025 Jordan Harband + +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. + +============================================================================== +gopd@1.2.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2022 Jordan Harband + +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. + +============================================================================== +hachure-fill@0.5.2 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2023 Preet Shihn + +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. + +============================================================================== +has-symbols@1.1.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2016 Jordan Harband + +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. + +============================================================================== +hasown@2.0.4 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) Jordan Harband 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. + +============================================================================== +hast-util-from-dom@5.0.1 (ISC): license +============================================================================== +(ISC License) + +Copyright (c) Keith McKnight + +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. + +============================================================================== +hast-util-from-html@2.0.3 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2022 Titus Wormer + +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. + +============================================================================== +hast-util-from-html-isomorphic@2.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2023 Remco Haszing + +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. + +============================================================================== +vfile-message@4.0.3 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +hast-util-from-parse5@8.0.3 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +hast-util-is-element@3.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +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. + +============================================================================== +hast-util-parse-selector@4.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +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. + +============================================================================== +hast-util-to-html@9.0.5 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +hast-util-to-text@4.0.2 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2019 Titus Wormer + +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. + +============================================================================== +hast-util-whitespace@3.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +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. + +============================================================================== +hastscript@9.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +highlight.js@11.11.1 (BSD-3-Clause): LICENSE +============================================================================== +BSD 3-Clause License + +Copyright (c) 2006, Ivan Sagalaev. +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 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. + +============================================================================== +hono@4.13.13 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2021 - present, Yusuke Wada and Hono 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. + +============================================================================== +html-void-elements@3.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +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. + +============================================================================== +http-errors@2.0.1 (MIT): LICENSE +============================================================================== + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong me@jongleberry.com +Copyright (c) 2016 Douglas Christopher Wilson doug@somethingdoug.com + +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. + +============================================================================== +iconv-lite@0.7.2 (MIT): LICENSE +============================================================================== +Copyright (c) 2011 Alexander Shtuchkin + +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. + +============================================================================== +import-meta-resolve@4.2.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +--- + +This is a derivative work based on: +. +Which is licensed: + +""" +Copyright Node.js contributors. All rights reserved. + +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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +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. +""" + +============================================================================== +inherits@2.0.4 (ISC): LICENSE +============================================================================== +The ISC License + +Copyright (c) Isaac Z. Schlueter + +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. + +============================================================================== +inline-style-parser@0.2.7 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2012 TJ Holowaychuk + +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. + +============================================================================== +internmap@2.0.3 (ISC): LICENSE +============================================================================== +Copyright 2021 Mike Bostock + +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. + +============================================================================== +ip-address@10.7.4 (MIT): LICENSE +============================================================================== +Copyright (C) 2011 by Beau Gunderson + +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. + +============================================================================== +ipaddr.js@1.9.1 (MIT): LICENSE +============================================================================== +Copyright (C) 2011-2017 whitequark + +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. + +============================================================================== +is-plain-obj@4.1.0 (MIT): license +============================================================================== +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +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. + +============================================================================== +is-promise@4.0.0 (MIT): LICENSE +============================================================================== +Copyright (c) 2014 Forbes Lindesay + +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. + +============================================================================== +is-reference@3.0.3 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): Rich Harris +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +isexe@2.0.0 (ISC): LICENSE +============================================================================== +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + +============================================================================== +jose@6.2.3 (MIT): LICENSE.md +============================================================================== +The MIT License (MIT) + +Copyright (c) 2018 Filip Skokan + +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. + +============================================================================== +json-schema-traverse@1.0.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2017 Evgeny Poberezkin + +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. + +============================================================================== +json-schema-typed@8.0.2 (BSD-2-Clause): LICENSE.md +============================================================================== +BSD 2-Clause License + +Original source code is copyright (c) 2019-2025 Remy Rylan + + +All JSON Schema documentation and descriptions are copyright (c): + +2009 [draft-0] IETF Trust , Kris Zyp , +and SitePen (USA) . + +2009 [draft-1] IETF Trust , Kris Zyp , +and SitePen (USA) . + +2010 [draft-2] IETF Trust , Kris Zyp , +and SitePen (USA) . + +2010 [draft-3] IETF Trust , Kris Zyp , +Gary Court , and SitePen (USA) . + +2013 [draft-4] IETF Trust ), Francis Galiegue +, Kris Zyp , Gary Court +, and SitePen (USA) . + +2018 [draft-7] IETF Trust , Austin Wright , +Henry Andrews , Geraint Luff , and +Cloudflare, Inc. . + +2019 [draft-2019-09] IETF Trust , Austin Wright +, Henry Andrews , Ben Hutton +, and Greg Dennis . + +2020 [draft-2020-12] IETF Trust , Austin Wright +, Henry Andrews , Ben Hutton +, and Greg Dennis . + +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. + +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. + +============================================================================== +katex@0.18.11 (MIT): LICENSE +============================================================================== +The MIT License (MIT) + +Copyright (c) 2013-2020 Khan Academy and other 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. + +============================================================================== +commander@15.0.0 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2011 TJ Holowaychuk + +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. + +============================================================================== +khroma@2.1.0 (): license +============================================================================== +The MIT License (MIT) + +Copyright (c) 2019-present Fabio Spampinato, Andrew Maney + +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. + +============================================================================== +kleur@4.1.5 (MIT): license +============================================================================== +The MIT License (MIT) + +Copyright (c) Luke Edwards (lukeed.com) + +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. + +============================================================================== +layout-base@1.0.2 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2019 iVis@Bilkent + +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. + +============================================================================== +locate-character@3.0.0 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): Rich Harris +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +lodash-es@4.18.1 (MIT): LICENSE +============================================================================== +Copyright OpenJS Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +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. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. + +============================================================================== +longest-streak@3.1.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +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. + +============================================================================== +lowlight@3.3.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +lz-string@1.5.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2013 pieroxy + +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. + +============================================================================== +magic-string@0.30.21 (MIT): LICENSE +============================================================================== +Copyright 2018 Rich Harris + +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. + +============================================================================== +markdown-table@3.0.4 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +marked@16.4.2 (MIT): LICENSE.md +============================================================================== +# License information + +## Contribution License Agreement + +If you contribute code to this project, you are implicitly allowing your code +to be distributed under the MIT license. You are also implicitly verifying that +all code is your original work. `` + +## Marked + +Copyright (c) 2018+, MarkedJS (https://github.com/markedjs/) +Copyright (c) 2011-2018, Christopher Jeffrey (https://github.com/chjj/) + +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. + +## Markdown + +Copyright © 2004, John Gruber +http://daringfireball.net/ +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 “Markdown” 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. + +============================================================================== +math-intrinsics@1.1.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 ECMAScript Shims + +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. + +============================================================================== +mdast-util-find-and-replace@3.0.2 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +escape-string-regexp@5.0.0 (MIT): license +============================================================================== +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +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. + +============================================================================== +mdast-util-from-markdown@2.0.3 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +mdast-util-gfm@3.1.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +mdast-util-gfm-autolink-literal@2.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +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. + +============================================================================== +mdast-util-gfm-footnote@2.1.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +mdast-util-gfm-strikethrough@2.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +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. + +============================================================================== +mdast-util-gfm-table@2.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +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. + +============================================================================== +mdast-util-gfm-task-list-item@2.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +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. + +============================================================================== +mdast-util-math@3.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +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. + +============================================================================== +mdast-util-newline-to-break@2.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2017 Titus Wormer + +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. + +============================================================================== +mdast-util-phrasing@4.1.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2017 Titus Wormer +Copyright (c) 2017 Victor Felder + +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. + +============================================================================== +mdast-util-to-hast@13.2.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +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. + +============================================================================== +mdast-util-to-markdown@2.1.2 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +mdast-util-to-string@4.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +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. + +============================================================================== +media-typer@1.1.0 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2014-2017 Douglas Christopher Wilson + +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. + +============================================================================== +merge-descriptors@2.0.0 (MIT): license +============================================================================== +MIT License + +Copyright (c) Jonathan Ong +Copyright (c) Douglas Christopher Wilson +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +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. + +============================================================================== +mermaid@11.17.2 (MIT): LICENSE +============================================================================== +The MIT License (MIT) + +Copyright (c) 2014 - 2022 Knut Sveidqvist + +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. + +============================================================================== +micromark@4.0.2 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-core-commonmark@2.0.3 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-extension-gfm@3.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +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. + +============================================================================== +micromark-extension-gfm-autolink-literal@2.1.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +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. + +============================================================================== +micromark-extension-gfm-footnote@2.1.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2021 Titus Wormer + +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. + +============================================================================== +micromark-extension-gfm-strikethrough@2.1.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +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. + +============================================================================== +micromark-extension-gfm-table@2.1.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-extension-gfm-tagfilter@2.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +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. + +============================================================================== +micromark-extension-gfm-task-list-item@2.1.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +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. + +============================================================================== +micromark-extension-math@3.1.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +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. + +============================================================================== +micromark-factory-destination@2.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-factory-label@2.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-factory-space@2.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-factory-title@2.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-factory-whitespace@2.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-util-character@2.1.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-util-chunked@2.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-util-classify-character@2.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-util-combine-extensions@2.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-util-decode-numeric-character-reference@2.0.2 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-util-decode-string@2.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-util-encode@2.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-util-html-tag-name@2.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-util-normalize-identifier@2.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-util-resolve-all@2.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-util-sanitize-uri@2.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-util-subtokenize@2.1.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-util-symbol@2.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +micromark-util-types@2.0.2 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +mime-db@1.54.0 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015-2022 Douglas Christopher Wilson + +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. + +============================================================================== +mime-types@3.0.2 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson + +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. + +============================================================================== +mode-watcher@1.1.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Hunter Johnston +Copyright (c) 2024 Svecosystem + +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. + +============================================================================== +runed@0.25.0 (): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Hunter Johnston +Copyright (c) 2024 Thomas G. Lopes + +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. + +============================================================================== +svelte-toolbelt@0.7.1 (): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Hunter Johnston +Copyright (c) 2024 Thomas G. Lopes + +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. + +============================================================================== +runed@0.23.4 (): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Hunter Johnston +Copyright (c) 2024 Thomas G. Lopes + +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. + +============================================================================== +mrmime@2.0.1 (MIT): license +============================================================================== +The MIT License (MIT) + +Copyright (c) Luke Edwards (https://lukeed.com) + +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. + +============================================================================== +ms@2.1.3 (MIT): license.md +============================================================================== +The MIT License (MIT) + +Copyright (c) 2020 Vercel, 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. + +============================================================================== +negotiator@1.0.0 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2012-2014 Federico Romero +Copyright (c) 2012-2014 Isaac Z. Schlueter +Copyright (c) 2014-2015 Douglas Christopher Wilson + +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. + +============================================================================== +object-assign@4.1.1 (MIT): license +============================================================================== +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +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. + +============================================================================== +object-inspect@1.13.4 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2013 James Halliday + +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. + +============================================================================== +on-finished@2.4.1 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2013 Jonathan Ong +Copyright (c) 2014 Douglas Christopher Wilson + +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. + +============================================================================== +once@1.4.0 (ISC): LICENSE +============================================================================== +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + +============================================================================== +package-manager-detector@1.6.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2020-PRESENT Anthony Fu + +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. + +============================================================================== +parse5@7.3.0 (MIT): LICENSE +============================================================================== +Copyright (c) 2013-2019 Ivan Nikulin (ifaaan@gmail.com, https://github.com/inikulin) + +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. + +============================================================================== +parseurl@1.3.3 (MIT): LICENSE +============================================================================== + +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2017 Douglas Christopher Wilson + +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. + +============================================================================== +path-data-parser@0.1.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2020 Preet Shihn + +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. + +============================================================================== +path-key@3.1.1 (MIT): license +============================================================================== +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +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. + +============================================================================== +path-to-regexp@8.4.2 (MIT): LICENSE +============================================================================== +The MIT License (MIT) + +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) + +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. + +============================================================================== +pdfjs-dist@5.4.54 (Apache-2.0): LICENSE +============================================================================== + + 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 + +============================================================================== +pkce-challenge@5.0.1 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2019 + +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. + +============================================================================== +points-on-curve@0.2.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2020 Preet Shihn + +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. + +============================================================================== +points-on-path@0.2.1 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2020 Preet + +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. + +============================================================================== +property-information@7.2.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +proxy-addr@2.0.8 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2014-2016 Douglas Christopher Wilson + +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. + +============================================================================== +qs@6.16.1 (BSD-3-Clause): LICENSE.md +============================================================================== +BSD 3-Clause License + +Copyright (c) 2014, Nathan LaFreniere and other [contributors](https://github.com/ljharb/qs/graphs/contributors) +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. + +============================================================================== +range-parser@1.2.1 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015-2016 Douglas Christopher Wilson +Copyright (c) 2014-2022 Douglas Christopher Wilson + +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. + +============================================================================== +rehype-highlight@7.0.2 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +rehype-katex@7.0.1 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): Junyoung Choi (https://rokt33r.github.io) +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +rehype-stringify@10.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +remark@15.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2014 Titus Wormer + +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. + +============================================================================== +remark-breaks@4.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2017 Titus Wormer + +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. + +============================================================================== +remark-gfm@4.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +remark-math@6.0.0 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): Junyoung Choi (https://rokt33r.github.io) +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +remark-parse@11.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2014 Titus Wormer + +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. + +============================================================================== +remark-rehype@11.1.2 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) Titus Wormer + +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. + +============================================================================== +remark-stringify@11.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2014 Titus Wormer + +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. + +============================================================================== +require-from-string@2.0.2 (MIT): license +============================================================================== +The MIT License (MIT) + +Copyright (c) Vsevolod Strukchinsky (github.com/floatdrop) + +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. + +============================================================================== +robust-predicates@3.0.3 (Unlicense): LICENSE +============================================================================== +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +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 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. + +For more information, please refer to + +============================================================================== +roughjs@4.6.6 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2019 Preet Shihn + +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. + +============================================================================== +router@2.2.0 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2013 Roman Shtylman +Copyright (c) 2014-2022 Douglas Christopher Wilson + +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. + +============================================================================== +runed@0.35.1 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Hunter Johnston +Copyright (c) 2024 Thomas G. Lopes + +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. + +============================================================================== +rw@1.3.3 (BSD-3-Clause): LICENSE +============================================================================== +Copyright (c) 2014-2016, Michael Bostock +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. + +* The name Michael Bostock may not 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 MICHAEL BOSTOCK 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. + +============================================================================== +safer-buffer@2.1.2 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2018 Nikita Skovoroda + +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. + +============================================================================== +send@1.2.1 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2014-2022 Douglas Christopher Wilson + +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. + +============================================================================== +serve-static@2.2.1 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2010 Sencha Inc. +Copyright (c) 2011 LearnBoost +Copyright (c) 2011 TJ Holowaychuk +Copyright (c) 2014-2016 Douglas Christopher Wilson + +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. + +============================================================================== +set-cookie-parser@3.1.0 (MIT): LICENSE +============================================================================== +The MIT License (MIT) + +Copyright (c) 2015 Nathan Friedly (http://nfriedly.com/) + +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. + +============================================================================== +setprototypeof@1.2.0 (ISC): LICENSE +============================================================================== +Copyright (c) 2015, Wes Todd + +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. + +============================================================================== +shebang-command@2.0.0 (MIT): license +============================================================================== +MIT License + +Copyright (c) Kevin Mårtensson (github.com/kevva) + +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. + +============================================================================== +shebang-regex@3.0.0 (MIT): license +============================================================================== +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +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. + +============================================================================== +side-channel@1.1.1 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2019 Jordan Harband + +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. + +============================================================================== +side-channel-list@1.0.1 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Jordan Harband + +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. + +============================================================================== +side-channel-map@1.0.1 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Jordan Harband + +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. + +============================================================================== +side-channel-weakmap@1.0.2 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2019 Jordan Harband + +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. + +============================================================================== +sirv@3.0.2 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): Luke Edwards luke@lukeed.com +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +space-separated-tokens@2.0.2 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +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. + +============================================================================== +statuses@2.0.2 (MIT): LICENSE +============================================================================== + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2016 Douglas Christopher Wilson + +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. + +============================================================================== +strictdom@1.0.1 (MIT): (declared in package.json) +============================================================================== +License (package.json): MIT +Author (package.json): Wilson Page wilsonpage@me.com +(The package ships no license file; this is the license and author its package.json declares; its full text is at the end of this file.) + +============================================================================== +stringify-entities@4.0.4 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +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. + +============================================================================== +style-to-object@1.0.14 (MIT): LICENSE +============================================================================== +The MIT License (MIT) + +Copyright (c) 2017 Menglin "Mark" Xu + +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. + +============================================================================== +stylis@4.4.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2016-present Sultan Tarimo + +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. + +============================================================================== +svelte@5.56.1 (MIT): LICENSE.md +============================================================================== +Copyright (c) 2016-2025 [Svelte Contributors](https://github.com/sveltejs/svelte/graphs/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. + +============================================================================== +svelte-sonner@1.1.1 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Robert Soriano + +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. + +============================================================================== +runed@0.28.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Hunter Johnston +Copyright (c) 2024 Thomas G. Lopes + +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. + +============================================================================== +svelte-toolbelt@0.10.6 (): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Hunter Johnston +Copyright (c) 2024 Thomas G. Lopes + +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. + +============================================================================== +aria-query@5.3.1 (Apache-2.0): LICENSE +============================================================================== +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 A11yance + +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. + +============================================================================== +esrap@2.2.11 (MIT): LICENSE +============================================================================== +Copyright (c) 2023-2025 [these people](https://github.com/sveltejs/esrap/graphs/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. + +============================================================================== +tabbable@6.4.0 (MIT): LICENSE +============================================================================== +The MIT License (MIT) + +Copyright (c) 2015 David Clark + +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. + +============================================================================== +tailwind-merge@3.6.0 (MIT): LICENSE.md +============================================================================== +MIT License + +Copyright (c) 2021 Dany Castillo + +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. + +============================================================================== +tailwind-variants@3.3.1 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2020 Tailwid Variants + +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. + +============================================================================== +tailwindcss@4.3.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) Tailwind Labs, 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. + +============================================================================== +tinyexec@1.2.4 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2024 Tinylibs + +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. + +============================================================================== +toidentifier@1.0.1 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2016 Douglas Christopher Wilson + +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. + +============================================================================== +totalist@3.0.1 (MIT): license +============================================================================== +The MIT License (MIT) + +Copyright (c) Luke Edwards (lukeed.com) + +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. + +============================================================================== +trim-lines@3.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +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. + +============================================================================== +trough@2.2.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +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. + +============================================================================== +ts-dedent@2.2.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2018 Tamino Martinius + +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. + +============================================================================== +tw-animate-css@1.4.0 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2025 Wombosvideo + +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. + +============================================================================== +type-is@2.1.0 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson + +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. + +============================================================================== +unified@11.0.5 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +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. + +============================================================================== +unist-util-find-after@5.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +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. + +============================================================================== +unist-util-is@6.0.1 (MIT): license +============================================================================== +(The MIT license) + +Copyright (c) 2015 Titus Wormer + +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. + +============================================================================== +unist-util-position@5.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +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. + +============================================================================== +unist-util-remove-position@5.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +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. + +============================================================================== +unist-util-stringify-position@4.0.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +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. + +============================================================================== +unist-util-visit@5.1.0 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +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. + +============================================================================== +unist-util-visit-parents@6.0.2 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +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. + +============================================================================== +unpipe@1.0.0 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2015 Douglas Christopher Wilson + +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. + +============================================================================== +uuid@13.0.2 (MIT): LICENSE.md +============================================================================== +The MIT License (MIT) + +Copyright (c) 2010-2020 Robert Kieffer and other 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. + +============================================================================== +vary@1.1.2 (MIT): LICENSE +============================================================================== +(The MIT License) + +Copyright (c) 2014-2017 Douglas Christopher Wilson + +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. + +============================================================================== +vaul-svelte@1.0.0-next.7 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2023 Hunter Johnston +Copyright (c) 2023 Emil Kowalski + +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. + +============================================================================== +vfile@6.0.3 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +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. + +============================================================================== +vfile-location@5.0.3 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +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. + +============================================================================== +web-namespaces@2.0.1 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +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. + +============================================================================== +which@2.0.2 (ISC): LICENSE +============================================================================== +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + +============================================================================== +workbox-core@7.4.1 (MIT): LICENSE +============================================================================== +Copyright 2018 Google LLC + +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. + +============================================================================== +workbox-window@7.4.1 (MIT): LICENSE +============================================================================== +Copyright 2018 Google LLC + +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. + +============================================================================== +wrappy@1.0.2 (ISC): LICENSE +============================================================================== +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + +============================================================================== +zimmerframe@1.1.4 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2023 [these people](https://github.com/Rich-Harris/zimmerframe/graphs/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. + +============================================================================== +zod@4.4.3 (MIT): LICENSE +============================================================================== +MIT License + +Copyright (c) 2025 Colin McDonnell + +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. + +============================================================================== +zod-to-json-schema@3.25.2 (ISC): LICENSE +============================================================================== +ISC License + +Copyright (c) 2020, Stefan Terdell + +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. + +============================================================================== +zwitch@2.0.4 (MIT): license +============================================================================== +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +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. + +============================================================================== +License text MIT (for the packages above marked (declared in package.json)) +============================================================================== +MIT License + +Copyright (c) + +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/llama/legal/natives/webui-npm/packages.csv b/llama/legal/natives/webui-npm/packages.csv new file mode 100644 index 000000000..647e63dba --- /dev/null +++ b/llama/legal/natives/webui-npm/packages.csv @@ -0,0 +1,338 @@ +package,version,license,files,tarball +@antfu/install-pkg,1.1.0,MIT,LICENSE,https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz +@braintree/sanitize-url,7.1.2,MIT,LICENSE,https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz +@chevrotain/types,11.1.2,Apache-2.0,LICENSE.txt,https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz +@floating-ui/core,1.7.5,MIT,LICENSE,https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz +@floating-ui/dom,1.7.6,MIT,LICENSE,https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz +@floating-ui/utils,0.2.11,MIT,LICENSE,https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz +@hono/node-server,2.1.0,MIT,LICENSE,https://registry.npmjs.org/@hono/node-server/-/node-server-2.1.0.tgz +@iconify/types,2.0.0,MIT,license.txt,https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz +@iconify/utils,3.1.3,MIT,license.txt,https://registry.npmjs.org/@iconify/utils/-/utils-3.1.3.tgz +@jridgewell/gen-mapping,0.3.13,MIT,LICENSE,https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz +@jridgewell/remapping,2.3.5,MIT,LICENSE,https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz +@jridgewell/resolve-uri,3.1.2,MIT,LICENSE,https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz +@jridgewell/sourcemap-codec,1.6.0,MIT,LICENSE,https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz +@jridgewell/trace-mapping,0.3.31,MIT,LICENSE,https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz +@lucide/svelte,1.46.0,ISC,LICENSE,https://registry.npmjs.org/@lucide/svelte/-/svelte-1.46.0.tgz +@mermaid-js/parser,1.2.1,MIT,LICENSE,https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.2.1.tgz +@modelcontextprotocol/sdk,1.32.1,MIT,LICENSE,https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.32.1.tgz +@napi-rs/canvas,0.1.100,MIT,LICENSE,https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.100.tgz +@napi-rs/canvas-android-arm64,0.1.100,MIT,(declared in package.json),https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.100.tgz +@napi-rs/canvas-darwin-arm64,0.1.100,MIT,(declared in package.json),https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.100.tgz +@napi-rs/canvas-darwin-x64,0.1.100,MIT,(declared in package.json),https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.100.tgz +@napi-rs/canvas-linux-arm-gnueabihf,0.1.100,MIT,(declared in package.json),https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.100.tgz +@napi-rs/canvas-linux-arm64-gnu,0.1.100,MIT,(declared in package.json),https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.100.tgz +@napi-rs/canvas-linux-arm64-musl,0.1.100,MIT,(declared in package.json),https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.100.tgz +@napi-rs/canvas-linux-riscv64-gnu,0.1.100,MIT,(declared in package.json),https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.100.tgz +@napi-rs/canvas-linux-x64-gnu,0.1.100,MIT,(declared in package.json),https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.100.tgz +@napi-rs/canvas-linux-x64-musl,0.1.100,MIT,(declared in package.json),https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.100.tgz +@napi-rs/canvas-win32-arm64-msvc,0.1.100,MIT,(declared in package.json),https://registry.npmjs.org/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-0.1.100.tgz +@napi-rs/canvas-win32-x64-msvc,0.1.100,MIT,(declared in package.json),https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.100.tgz +@polka/url,1.0.0-next.29,MIT,(declared in package.json),https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz +@standard-schema/spec,1.1.0,MIT,LICENSE,https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz +@sveltejs/acorn-typescript,1.0.10,MIT,LICENSE.md,https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.10.tgz +@sveltejs/kit,2.70.2,MIT,LICENSE,https://registry.npmjs.org/@sveltejs/kit/-/kit-2.70.2.tgz +@ungap/structured-clone,1.3.1,ISC,LICENSE,https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz +@upsetjs/venn.js,2.0.0,MIT,LICENSE,https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz +accepts,2.0.0,MIT,LICENSE,https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz +acorn,8.16.0,MIT,LICENSE,https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz +ajv,8.20.0,MIT,LICENSE,https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz +ajv-formats,3.0.1,MIT,LICENSE,https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz +axobject-query,4.1.0,Apache-2.0,LICENSE,https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz +bail,2.0.2,MIT,license,https://registry.npmjs.org/bail/-/bail-2.0.2.tgz +bits-ui,2.18.1,MIT,LICENSE,https://registry.npmjs.org/bits-ui/-/bits-ui-2.18.1.tgz +body-parser,2.3.0,MIT,LICENSE,https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz +content-type,2.0.0,MIT,LICENSE,https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz +bytes,3.1.2,MIT,LICENSE,https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz +call-bind-apply-helpers,1.0.2,MIT,LICENSE,https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz +call-bound,1.0.4,MIT,LICENSE,https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz +ccount,2.0.1,MIT,license,https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz +character-entities,2.0.2,MIT,license,https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz +character-entities-html4,2.1.0,MIT,license,https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz +character-entities-legacy,3.0.0,MIT,license,https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz +clsx,2.1.1,MIT,license,https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz +comma-separated-tokens,2.0.3,MIT,license,https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz +commander,7.2.0,MIT,LICENSE,https://registry.npmjs.org/commander/-/commander-7.2.0.tgz +content-disposition,1.1.0,MIT,LICENSE,https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz +content-type,1.0.5,MIT,LICENSE,https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz +cookie,1.1.1,MIT,LICENSE,https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz +cookie-signature,1.2.2,MIT,LICENSE,https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz +cors,2.8.6,MIT,LICENSE,https://registry.npmjs.org/cors/-/cors-2.8.6.tgz +cose-base,1.0.3,MIT,LICENSE,https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz +cross-spawn,7.0.6,MIT,LICENSE,https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz +cytoscape,3.34.0,MIT,LICENSE;license-update.mjs,https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.0.tgz +cytoscape-cose-bilkent,4.1.0,MIT,LICENSE,https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz +cytoscape-fcose,2.2.0,MIT,LICENSE,https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz +cose-base,2.2.0,MIT,LICENSE,https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz +layout-base,2.0.1,MIT,LICENSE,https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz +d3,7.9.0,ISC,LICENSE,https://registry.npmjs.org/d3/-/d3-7.9.0.tgz +d3-array,3.2.4,ISC,LICENSE,https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz +d3-axis,3.0.0,ISC,LICENSE,https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz +d3-brush,3.0.0,ISC,LICENSE,https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz +d3-chord,3.0.1,ISC,LICENSE,https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz +d3-color,3.1.0,ISC,LICENSE,https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz +d3-contour,4.0.2,ISC,LICENSE,https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz +d3-delaunay,6.0.4,ISC,LICENSE,https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz +d3-dispatch,3.0.1,ISC,LICENSE,https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz +d3-drag,3.0.0,ISC,LICENSE,https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz +d3-dsv,3.0.1,ISC,LICENSE,https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz +iconv-lite,0.6.3,MIT,LICENSE,https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz +d3-ease,3.0.1,BSD-3-Clause,LICENSE,https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz +d3-fetch,3.0.1,ISC,LICENSE,https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz +d3-force,3.0.0,ISC,LICENSE,https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz +d3-format,3.1.2,ISC,LICENSE,https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz +d3-geo,3.1.1,ISC,LICENSE,https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz +d3-hierarchy,3.1.2,ISC,LICENSE,https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz +d3-interpolate,3.0.1,ISC,LICENSE,https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz +d3-path,3.1.0,ISC,LICENSE,https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz +d3-polygon,3.0.1,ISC,LICENSE,https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz +d3-quadtree,3.0.1,ISC,LICENSE,https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz +d3-random,3.0.1,ISC,LICENSE,https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz +d3-sankey,0.12.3,BSD-3-Clause,LICENSE,https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz +d3-array,2.12.1,BSD-3-Clause,LICENSE,https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz +d3-path,1.0.9,BSD-3-Clause,LICENSE,https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz +d3-shape,1.3.7,BSD-3-Clause,LICENSE,https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz +internmap,1.0.1,ISC,LICENSE,https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz +d3-scale,4.0.2,ISC,LICENSE,https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz +d3-scale-chromatic,3.1.0,ISC,LICENSE,https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz +d3-selection,3.0.0,ISC,LICENSE,https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz +d3-shape,3.2.0,ISC,LICENSE,https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz +d3-time,3.1.0,ISC,LICENSE,https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz +d3-time-format,4.1.0,ISC,LICENSE,https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz +d3-timer,3.0.1,ISC,LICENSE,https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz +d3-transition,3.0.1,ISC,LICENSE,https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz +d3-zoom,3.0.0,ISC,LICENSE,https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz +dagre-d3-es,7.0.14,MIT,LICENSE.md,https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz +dayjs,1.11.21,MIT,LICENSE,https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz +debug,4.4.3,MIT,LICENSE,https://registry.npmjs.org/debug/-/debug-4.4.3.tgz +decode-named-character-reference,1.3.0,MIT,license,https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz +delaunator,5.1.0,ISC,LICENSE,https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz +depd,2.0.0,MIT,LICENSE,https://registry.npmjs.org/depd/-/depd-2.0.0.tgz +dequal,2.0.3,MIT,license,https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz +devalue,5.9.4,MIT,LICENSE,https://registry.npmjs.org/devalue/-/devalue-5.9.4.tgz +devlop,1.1.0,MIT,license,https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz +dexie,4.4.3,Apache-2.0,LICENSE;NOTICE,https://registry.npmjs.org/dexie/-/dexie-4.4.3.tgz +dompurify,3.4.17,(MPL-2.0 OR Apache-2.0),LICENSE;LICENSE-MPL,https://registry.npmjs.org/dompurify/-/dompurify-3.4.17.tgz +dunder-proto,1.0.1,MIT,LICENSE,https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz +ee-first,1.1.1,MIT,LICENSE,https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz +encodeurl,2.0.0,MIT,LICENSE,https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz +entities,6.0.1,BSD-2-Clause,LICENSE,https://registry.npmjs.org/entities/-/entities-6.0.1.tgz +es-define-property,1.0.1,MIT,LICENSE,https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz +es-errors,1.3.0,MIT,LICENSE,https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz +es-object-atoms,1.1.2,MIT,LICENSE,https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz +es-toolkit,1.47.0,MIT,LICENSE,https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.47.0.tgz +escape-html,1.0.3,MIT,LICENSE,https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz +esm-env,1.2.2,MIT,LICENSE,https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz +etag,1.8.1,MIT,LICENSE,https://registry.npmjs.org/etag/-/etag-1.8.1.tgz +eventsource,3.0.7,MIT,LICENSE,https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz +eventsource-parser,3.1.0,MIT,LICENSE,https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz +express,5.2.1,MIT,LICENSE,https://registry.npmjs.org/express/-/express-5.2.1.tgz +express-rate-limit,8.5.2,MIT,license.md,https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz +extend,3.0.2,MIT,LICENSE,https://registry.npmjs.org/extend/-/extend-3.0.2.tgz +fast-deep-equal,3.1.3,MIT,LICENSE,https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz +fast-uri,3.1.8,BSD-3-Clause,LICENSE,https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz +fastdom,1.0.12,MIT,(declared in package.json),https://registry.npmjs.org/fastdom/-/fastdom-1.0.12.tgz +fflate,0.8.3,MIT,LICENSE,https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz +finalhandler,2.1.1,MIT,LICENSE,https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz +forwarded,0.2.0,MIT,LICENSE,https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz +fresh,2.0.0,MIT,LICENSE,https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz +function-bind,1.1.2,MIT,LICENSE,https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz +get-intrinsic,1.3.0,MIT,LICENSE,https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz +get-proto,1.0.1,MIT,LICENSE,https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz +gopd,1.2.0,MIT,LICENSE,https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz +hachure-fill,0.5.2,MIT,LICENSE,https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz +has-symbols,1.1.0,MIT,LICENSE,https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz +hasown,2.0.4,MIT,LICENSE,https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz +hast-util-from-dom,5.0.1,ISC,license,https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.1.tgz +hast-util-from-html,2.0.3,MIT,license,https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz +hast-util-from-html-isomorphic,2.0.0,MIT,license,https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz +vfile-message,4.0.3,MIT,license,https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz +hast-util-from-parse5,8.0.3,MIT,license,https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz +hast-util-is-element,3.0.0,MIT,license,https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz +hast-util-parse-selector,4.0.0,MIT,license,https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz +hast-util-to-html,9.0.5,MIT,license,https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz +hast-util-to-text,4.0.2,MIT,license,https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz +hast-util-whitespace,3.0.0,MIT,license,https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz +hastscript,9.0.1,MIT,license,https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz +highlight.js,11.11.1,BSD-3-Clause,LICENSE,https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz +hono,4.13.13,MIT,LICENSE,https://registry.npmjs.org/hono/-/hono-4.13.13.tgz +html-void-elements,3.0.0,MIT,license,https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz +http-errors,2.0.1,MIT,LICENSE,https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz +iconv-lite,0.7.2,MIT,LICENSE,https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz +import-meta-resolve,4.2.0,MIT,license,https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz +inherits,2.0.4,ISC,LICENSE,https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz +inline-style-parser,0.2.7,MIT,LICENSE,https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz +internmap,2.0.3,ISC,LICENSE,https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz +ip-address,10.7.4,MIT,LICENSE,https://registry.npmjs.org/ip-address/-/ip-address-10.7.4.tgz +ipaddr.js,1.9.1,MIT,LICENSE,https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz +is-plain-obj,4.1.0,MIT,license,https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz +is-promise,4.0.0,MIT,LICENSE,https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz +is-reference,3.0.3,MIT,(declared in package.json),https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz +isexe,2.0.0,ISC,LICENSE,https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz +jose,6.2.3,MIT,LICENSE.md,https://registry.npmjs.org/jose/-/jose-6.2.3.tgz +json-schema-traverse,1.0.0,MIT,LICENSE,https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz +json-schema-typed,8.0.2,BSD-2-Clause,LICENSE.md,https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz +katex,0.18.11,MIT,LICENSE,https://registry.npmjs.org/katex/-/katex-0.18.11.tgz +commander,15.0.0,MIT,LICENSE,https://registry.npmjs.org/commander/-/commander-15.0.0.tgz +khroma,2.1.0,,license,https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz +kleur,4.1.5,MIT,license,https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz +layout-base,1.0.2,MIT,LICENSE,https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz +locate-character,3.0.0,MIT,(declared in package.json),https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz +lodash-es,4.18.1,MIT,LICENSE,https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz +longest-streak,3.1.0,MIT,license,https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz +lowlight,3.3.0,MIT,license,https://registry.npmjs.org/lowlight/-/lowlight-3.3.0.tgz +lz-string,1.5.0,MIT,LICENSE,https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz +magic-string,0.30.21,MIT,LICENSE,https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz +markdown-table,3.0.4,MIT,license,https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz +marked,16.4.2,MIT,LICENSE.md,https://registry.npmjs.org/marked/-/marked-16.4.2.tgz +math-intrinsics,1.1.0,MIT,LICENSE,https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz +mdast-util-find-and-replace,3.0.2,MIT,license,https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz +escape-string-regexp,5.0.0,MIT,license,https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz +mdast-util-from-markdown,2.0.3,MIT,license,https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz +mdast-util-gfm,3.1.0,MIT,license,https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz +mdast-util-gfm-autolink-literal,2.0.1,MIT,license,https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz +mdast-util-gfm-footnote,2.1.0,MIT,license,https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz +mdast-util-gfm-strikethrough,2.0.0,MIT,license,https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz +mdast-util-gfm-table,2.0.0,MIT,license,https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz +mdast-util-gfm-task-list-item,2.0.0,MIT,license,https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz +mdast-util-math,3.0.0,MIT,license,https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-3.0.0.tgz +mdast-util-newline-to-break,2.0.0,MIT,license,https://registry.npmjs.org/mdast-util-newline-to-break/-/mdast-util-newline-to-break-2.0.0.tgz +mdast-util-phrasing,4.1.0,MIT,license,https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz +mdast-util-to-hast,13.2.1,MIT,license,https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz +mdast-util-to-markdown,2.1.2,MIT,license,https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz +mdast-util-to-string,4.0.0,MIT,license,https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz +media-typer,1.1.0,MIT,LICENSE,https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz +merge-descriptors,2.0.0,MIT,license,https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz +mermaid,11.17.2,MIT,LICENSE,https://registry.npmjs.org/mermaid/-/mermaid-11.17.2.tgz +micromark,4.0.2,MIT,license,https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz +micromark-core-commonmark,2.0.3,MIT,license,https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz +micromark-extension-gfm,3.0.0,MIT,license,https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz +micromark-extension-gfm-autolink-literal,2.1.0,MIT,license,https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz +micromark-extension-gfm-footnote,2.1.0,MIT,license,https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz +micromark-extension-gfm-strikethrough,2.1.0,MIT,license,https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz +micromark-extension-gfm-table,2.1.1,MIT,license,https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz +micromark-extension-gfm-tagfilter,2.0.0,MIT,license,https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz +micromark-extension-gfm-task-list-item,2.1.0,MIT,license,https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz +micromark-extension-math,3.1.0,MIT,license,https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz +micromark-factory-destination,2.0.1,MIT,license,https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz +micromark-factory-label,2.0.1,MIT,license,https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz +micromark-factory-space,2.0.1,MIT,license,https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz +micromark-factory-title,2.0.1,MIT,license,https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz +micromark-factory-whitespace,2.0.1,MIT,license,https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz +micromark-util-character,2.1.1,MIT,license,https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz +micromark-util-chunked,2.0.1,MIT,license,https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz +micromark-util-classify-character,2.0.1,MIT,license,https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz +micromark-util-combine-extensions,2.0.1,MIT,license,https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz +micromark-util-decode-numeric-character-reference,2.0.2,MIT,license,https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz +micromark-util-decode-string,2.0.1,MIT,license,https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz +micromark-util-encode,2.0.1,MIT,license,https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz +micromark-util-html-tag-name,2.0.1,MIT,license,https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz +micromark-util-normalize-identifier,2.0.1,MIT,license,https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz +micromark-util-resolve-all,2.0.1,MIT,license,https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz +micromark-util-sanitize-uri,2.0.1,MIT,license,https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz +micromark-util-subtokenize,2.1.0,MIT,license,https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz +micromark-util-symbol,2.0.1,MIT,license,https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz +micromark-util-types,2.0.2,MIT,license,https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz +mime-db,1.54.0,MIT,LICENSE,https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz +mime-types,3.0.2,MIT,LICENSE,https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz +mode-watcher,1.1.0,MIT,LICENSE,https://registry.npmjs.org/mode-watcher/-/mode-watcher-1.1.0.tgz +runed,0.25.0,,LICENSE,https://registry.npmjs.org/runed/-/runed-0.25.0.tgz +svelte-toolbelt,0.7.1,,LICENSE,https://registry.npmjs.org/svelte-toolbelt/-/svelte-toolbelt-0.7.1.tgz +runed,0.23.4,,LICENSE,https://registry.npmjs.org/runed/-/runed-0.23.4.tgz +mrmime,2.0.1,MIT,license,https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz +ms,2.1.3,MIT,license.md,https://registry.npmjs.org/ms/-/ms-2.1.3.tgz +negotiator,1.0.0,MIT,LICENSE,https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz +object-assign,4.1.1,MIT,license,https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz +object-inspect,1.13.4,MIT,LICENSE,https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz +on-finished,2.4.1,MIT,LICENSE,https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz +once,1.4.0,ISC,LICENSE,https://registry.npmjs.org/once/-/once-1.4.0.tgz +package-manager-detector,1.6.0,MIT,LICENSE,https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz +parse5,7.3.0,MIT,LICENSE,https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz +parseurl,1.3.3,MIT,LICENSE,https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz +path-data-parser,0.1.0,MIT,LICENSE,https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz +path-key,3.1.1,MIT,license,https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz +path-to-regexp,8.4.2,MIT,LICENSE,https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz +pdfjs-dist,5.4.54,Apache-2.0,LICENSE,https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.4.54.tgz +pkce-challenge,5.0.1,MIT,LICENSE,https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz +points-on-curve,0.2.0,MIT,LICENSE,https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz +points-on-path,0.2.1,MIT,LICENSE,https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz +property-information,7.2.0,MIT,license,https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz +proxy-addr,2.0.8,MIT,LICENSE,https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.8.tgz +qs,6.16.1,BSD-3-Clause,LICENSE.md,https://registry.npmjs.org/qs/-/qs-6.16.1.tgz +range-parser,1.2.1,MIT,LICENSE,https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz +raw-body,3.0.2,MIT,LICENSE,https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz +rehype-highlight,7.0.2,MIT,license,https://registry.npmjs.org/rehype-highlight/-/rehype-highlight-7.0.2.tgz +rehype-katex,7.0.1,MIT,(declared in package.json),https://registry.npmjs.org/rehype-katex/-/rehype-katex-7.0.1.tgz +rehype-stringify,10.0.1,MIT,license,https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz +remark,15.0.1,MIT,license,https://registry.npmjs.org/remark/-/remark-15.0.1.tgz +remark-breaks,4.0.0,MIT,license,https://registry.npmjs.org/remark-breaks/-/remark-breaks-4.0.0.tgz +remark-gfm,4.0.1,MIT,license,https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz +remark-math,6.0.0,MIT,(declared in package.json),https://registry.npmjs.org/remark-math/-/remark-math-6.0.0.tgz +remark-parse,11.0.0,MIT,license,https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz +remark-rehype,11.1.2,MIT,license,https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz +remark-stringify,11.0.0,MIT,license,https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz +require-from-string,2.0.2,MIT,license,https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz +robust-predicates,3.0.3,Unlicense,LICENSE,https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz +roughjs,4.6.6,MIT,LICENSE,https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz +router,2.2.0,MIT,LICENSE,https://registry.npmjs.org/router/-/router-2.2.0.tgz +runed,0.35.1,MIT,LICENSE,https://registry.npmjs.org/runed/-/runed-0.35.1.tgz +rw,1.3.3,BSD-3-Clause,LICENSE,https://registry.npmjs.org/rw/-/rw-1.3.3.tgz +safer-buffer,2.1.2,MIT,LICENSE,https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz +send,1.2.1,MIT,LICENSE,https://registry.npmjs.org/send/-/send-1.2.1.tgz +serve-static,2.2.1,MIT,LICENSE,https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz +set-cookie-parser,3.1.0,MIT,LICENSE,https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.0.tgz +setprototypeof,1.2.0,ISC,LICENSE,https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz +shebang-command,2.0.0,MIT,license,https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz +shebang-regex,3.0.0,MIT,license,https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz +side-channel,1.1.1,MIT,LICENSE,https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz +side-channel-list,1.0.1,MIT,LICENSE,https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz +side-channel-map,1.0.1,MIT,LICENSE,https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz +side-channel-weakmap,1.0.2,MIT,LICENSE,https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz +sirv,3.0.2,MIT,(declared in package.json),https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz +space-separated-tokens,2.0.2,MIT,license,https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz +statuses,2.0.2,MIT,LICENSE,https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz +strictdom,1.0.1,MIT,(declared in package.json),https://registry.npmjs.org/strictdom/-/strictdom-1.0.1.tgz +stringify-entities,4.0.4,MIT,license,https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz +style-to-object,1.0.14,MIT,LICENSE,https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz +stylis,4.4.0,MIT,LICENSE,https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz +svelte,5.56.1,MIT,LICENSE.md,https://registry.npmjs.org/svelte/-/svelte-5.56.1.tgz +svelte-sonner,1.1.1,MIT,LICENSE,https://registry.npmjs.org/svelte-sonner/-/svelte-sonner-1.1.1.tgz +runed,0.28.0,MIT,LICENSE,https://registry.npmjs.org/runed/-/runed-0.28.0.tgz +svelte-toolbelt,0.10.6,,LICENSE,https://registry.npmjs.org/svelte-toolbelt/-/svelte-toolbelt-0.10.6.tgz +aria-query,5.3.1,Apache-2.0,LICENSE,https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz +esrap,2.2.11,MIT,LICENSE,https://registry.npmjs.org/esrap/-/esrap-2.2.11.tgz +tabbable,6.4.0,MIT,LICENSE,https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz +tailwind-merge,3.6.0,MIT,LICENSE.md,https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz +tailwind-variants,3.3.1,MIT,LICENSE,https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-3.3.1.tgz +tailwindcss,4.3.0,MIT,LICENSE,https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz +tinyexec,1.2.4,MIT,LICENSE,https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz +toidentifier,1.0.1,MIT,LICENSE,https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz +totalist,3.0.1,MIT,license,https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz +trim-lines,3.0.1,MIT,license,https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz +trough,2.2.0,MIT,license,https://registry.npmjs.org/trough/-/trough-2.2.0.tgz +ts-dedent,2.2.0,MIT,LICENSE,https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz +tw-animate-css,1.4.0,MIT,LICENSE,https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz +type-is,2.1.0,MIT,LICENSE,https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz +unified,11.0.5,MIT,license,https://registry.npmjs.org/unified/-/unified-11.0.5.tgz +unist-util-find-after,5.0.0,MIT,license,https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz +unist-util-is,6.0.1,MIT,license,https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz +unist-util-position,5.0.0,MIT,license,https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz +unist-util-remove-position,5.0.0,MIT,license,https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz +unist-util-stringify-position,4.0.0,MIT,license,https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz +unist-util-visit,5.1.0,MIT,license,https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz +unist-util-visit-parents,6.0.2,MIT,license,https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz +unpipe,1.0.0,MIT,LICENSE,https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz +uuid,13.0.2,MIT,LICENSE.md,https://registry.npmjs.org/uuid/-/uuid-13.0.2.tgz +vary,1.1.2,MIT,LICENSE,https://registry.npmjs.org/vary/-/vary-1.1.2.tgz +vaul-svelte,1.0.0-next.7,MIT,LICENSE,https://registry.npmjs.org/vaul-svelte/-/vaul-svelte-1.0.0-next.7.tgz +vfile,6.0.3,MIT,license,https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz +vfile-location,5.0.3,MIT,license,https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz +web-namespaces,2.0.1,MIT,license,https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz +which,2.0.2,ISC,LICENSE,https://registry.npmjs.org/which/-/which-2.0.2.tgz +workbox-core,7.4.1,MIT,LICENSE,https://registry.npmjs.org/workbox-core/-/workbox-core-7.4.1.tgz +workbox-window,7.4.1,MIT,LICENSE,https://registry.npmjs.org/workbox-window/-/workbox-window-7.4.1.tgz +wrappy,1.0.2,ISC,LICENSE,https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz +zimmerframe,1.1.4,MIT,LICENSE,https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz +zod,4.4.3,MIT,LICENSE,https://registry.npmjs.org/zod/-/zod-4.4.3.tgz +zod-to-json-schema,3.25.2,ISC,LICENSE,https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz +zwitch,2.0.4,MIT,license,https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz diff --git a/llama/legal/natives/xxhash/LICENSE b/llama/legal/natives/xxhash/LICENSE new file mode 100644 index 000000000..e4c5da723 --- /dev/null +++ b/llama/legal/natives/xxhash/LICENSE @@ -0,0 +1,26 @@ +xxHash Library +Copyright (c) 2012-2021 Yann Collet +All rights reserved. + +BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php) + +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 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. diff --git a/llama/legal/natives/xxhash/SOURCE.txt b/llama/legal/natives/xxhash/SOURCE.txt new file mode 100644 index 000000000..617ed6ed3 --- /dev/null +++ b/llama/legal/natives/xxhash/SOURCE.txt @@ -0,0 +1 @@ +LICENSE: https://github.com/ggml-org/llama.cpp/blob/fa3645feb5f47cbb30df5e6d031c22543d43d240/vendor/hash/xxhash/LICENSE (Cyan4973/xxHash@9f465f1ea932d6ad9a26cd77496311ffa544cd68) diff --git a/llama/legal/natives/yarn/LICENSE b/llama/legal/natives/yarn/LICENSE new file mode 100644 index 000000000..bf8c87304 --- /dev/null +++ b/llama/legal/natives/yarn/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Jeffrey Quesnelle and Bowen Peng + +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. \ No newline at end of file diff --git a/llama/legal/natives/yarn/SOURCE.txt b/llama/legal/natives/yarn/SOURCE.txt new file mode 100644 index 000000000..4f537b11b --- /dev/null +++ b/llama/legal/natives/yarn/SOURCE.txt @@ -0,0 +1 @@ +LICENSE: https://github.com/jquesnelle/yarn/blob/995db5b575e75230b3384d658f8b944c9662f775/LICENSE diff --git a/llama/patches/0006-server-embed-native-server-jni.patch b/llama/patches/0006-server-embed-native-server-jni.patch index 02907d30d..186a244c3 100644 --- a/llama/patches/0006-server-embed-native-server-jni.patch +++ b/llama/patches/0006-server-embed-native-server-jni.patch @@ -11,11 +11,18 @@ it captures are destroyed -- a request landing after llama_server() returned use over destroyed objects (SIGSEGV in server_http_context::stop(), seen in router mode). Runnable guard: src/test/cpp/test_native_server_shutdown.cpp. Applies after 0001. +Refreshed at b11881: #31113 split llama_server() into one function per role (server_run_router, +server_run_instance, server_run_download) and added server_run_opts. The embedded mode now clears +server_run_opts::install_signal_handlers (upstream's own switch, which llama-cli uses) instead of +guarding the sigaction block, and each role function that installs a shutdown handler declares the +reset after the last local its handler captures: models_routes in the router, ctx_http in the +instance. + diff --git a/tools/server/server.cpp b/tools/server/server.cpp -index deac18f61..6a1dc82db 100644 +index cf9a4045b..2fa87673c 100644 --- a/tools/server/server.cpp +++ b/tools/server/server.cpp -@@ -15,6 +15,7 @@ +@@ -16,6 +16,7 @@ #include #include #include @@ -23,14 +30,14 @@ index deac18f61..6a1dc82db 100644 #include #include // for std::thread::hardware_concurrency -@@ -25,6 +26,53 @@ +@@ -26,6 +27,53 @@ static std::function shutdown_handler; static std::atomic_flag is_terminating = ATOMIC_FLAG_INIT; +// [jllama] Embedded-mode support: when llama_server() is hosted inside libjllama and driven over +// JNI (net.ladenthin.llama.server.NativeServer), it must NOT install process-wide signal handlers +// (that would hijack the JVM's SIGINT/SIGTERM), and it must be stoppable out-of-band because -+// ctx_server is local to llama_server(). It also parses exactly the forwarded argv rather than ++// ctx_server is local to the role function. It also parses exactly the forwarded argv rather than +// re-deriving it from the process command line (which would be java.exe's — the Windows bug the +// 0001 patch fixes for the embedded path). These symbols are declared in +// src/main/cpp/native_server_bridge.h and called by native_server.cpp. @@ -40,12 +47,12 @@ index deac18f61..6a1dc82db 100644 + g_llama_server_embedded.store(embedded); +} + -+// [jllama] shutdown_handler captures llama_server()'s locals by reference and upstream never ++// [jllama] shutdown_handler captures the role function's locals by reference and upstream never +// clears it, so a request that lands after llama_server() returned ran it over destroyed objects +// (SIGSEGV in server_http_context::stop(), seen in RouterModeIntegrationTest's tearDown). The JNI +// caller signals repeatedly until the server has returned, so that window is routinely hit. Two -+// guards close it: every read and write of the handler holds this mutex (the caller runs on another -+// thread), and a llama_server_shutdown_handler_reset declared after the captured locals clears the ++// guards close it: every write of the handler and every invocation from another thread holds this ++// mutex, and a llama_server_shutdown_handler_reset declared after the captured locals clears the +// handler before any of them is destroyed. The handler is invoked under the lock, so the reset -- +// and therefore the destruction of what it captures -- waits for an invocation in progress. +static std::mutex g_shutdown_handler_mutex; @@ -66,8 +73,8 @@ index deac18f61..6a1dc82db 100644 + +void llama_server_request_shutdown() { + // Mirrors the SIGTERM path: invoke the installed shutdown_handler, which unblocks -+ // ctx_server.start_loop() (single-model) / ctx_http.stop() (router). No-op if the server has -+ // not finished starting (handler not yet installed) or has already returned (handler reset). ++ // ctx_server.start_loop() (instance) / ctx_http.stop() (router). No-op if the server has not ++ // finished starting (handler not yet installed) or has already returned (handler reset). + std::lock_guard lock(g_shutdown_handler_mutex); + if (shutdown_handler) { + shutdown_handler(SIGTERM); @@ -77,67 +84,83 @@ index deac18f61..6a1dc82db 100644 static inline void signal_handler(int signal) { if (is_terminating.test_and_set()) { // in case it hangs, we can force terminate the server by hitting Ctrl+C twice -@@ -102,7 +150,13 @@ int llama_server(int argc, char ** argv) { - // touch it. lifecycle is symmetric, stop_gc() runs in clean_up() before backend free - server_stream_session_manager_start(); +@@ -447,6 +495,9 @@ static int server_run_router(common_params & params, int argc, char ** argv, con -- if (!common_params_parse_main(argc, argv, params, LLAMA_EXAMPLE_SERVER)) { -+ // [jllama] embedded (JNI) callers forward a clean UTF-8 argv, so honor it exactly via -+ // common_params_parse; only the standalone tool needs common_params_parse_main's -+ // process-command-line (GetCommandLineW) UTF-8 recovery. -+ const bool parsed_ok = g_llama_server_embedded.load() -+ ? common_params_parse(argc, argv, params, LLAMA_EXAMPLE_SERVER) -+ : common_params_parse_main(argc, argv, params, LLAMA_EXAMPLE_SERVER); -+ if (!parsed_ok) { - return 1; + // setup server instances manager + std::optional models_routes; ++ // [jllama] declared after every local the shutdown handler captures (models_routes, ctx_http, ++ // mcp_mgr), so it clears the handler before any of them is destroyed ++ llama_server_shutdown_handler_reset shutdown_handler_reset; + try { + models_routes.emplace(params, argc, argv); + } catch (const std::exception & e) { +@@ -522,14 +573,14 @@ static int server_run_router(common_params & params, int argc, char ** argv, con } + ctx_http.is_ready.store(true); + +- shutdown_handler = [&](int) { ++ llama_server_set_shutdown_handler([&](int) { + if (models_routes.has_value()) { + // important to disconnect any SSE clients + models_routes->stopping.store(true); + } + mcp_mgr.shutdown(); + ctx_http.stop(); +- }; ++ }); -@@ -197,6 +251,9 @@ int llama_server(common_params & params, int argc, char ** argv) { - std::optional models_routes{}; + try { + models_routes->models.load_startup_models(); +@@ -590,6 +641,9 @@ static int server_run_instance(common_params & params, server_role & role, commo + server_tools tools; server_http_context ctx_http; -+ // [jllama] declared after every local the shutdown handler captures, so it clears the handler -+ // before any of them is destroyed (see llama_server_request_shutdown) ++ // [jllama] declared after every local the shutdown handler captures (ctx_server, mcp_mgr), so ++ // it clears the handler before any of them is destroyed + llama_server_shutdown_handler_reset shutdown_handler_reset; if (!ctx_http.init(params)) { SRV_ERR("%s", "failed to initialize HTTP server\n"); return 1; -@@ -427,14 +484,14 @@ int llama_server(common_params & params, int argc, char ** argv) { - } - ctx_http.is_ready.store(true); +@@ -642,11 +696,11 @@ static int server_run_instance(common_params & params, server_role & role, commo -- shutdown_handler = [&](int) { -+ llama_server_set_shutdown_handler([&](int) { - if (models_routes.has_value()) { - // important to disconnect any SSE clients - models_routes->stopping.store(true); - } - mcp_mgr.shutdown(); - ctx_http.stop(); -- }; -+ }); + SRV_INF("%s", "model loaded\n"); - try { - models_routes->models.load_startup_models(); -@@ -484,15 +541,18 @@ int llama_server(common_params & params, int argc, char ** argv) { +- shutdown_handler = [&](int) { ++ llama_server_set_shutdown_handler([&](int) { + mcp_mgr.shutdown(); + // this will unblock start_loop() + ctx_server.terminate(); +- }; ++ }); - SRV_INF("%s", "model loaded\n"); + if (opts.install_signal_handlers) { + server_install_signal_handlers(); +@@ -743,7 +797,14 @@ int llama_server(int argc, char ** argv) { + // touch it. lifecycle is symmetric, stop_gc() runs in clean_up() before backend free + server_stream_session_manager_start(); -- shutdown_handler = [&](int) { -+ llama_server_set_shutdown_handler([&](int) { - mcp_mgr.shutdown(); - // this will unblock start_loop() - ctx_server.terminate(); -- }; -+ }); +- if (!common_params_parse_main(argc, argv, params, LLAMA_EXAMPLE_SERVER)) { ++ // [jllama] embedded (JNI) callers forward a clean UTF-8 argv, so honor it exactly via ++ // common_params_parse; only the standalone tool needs common_params_parse_main's ++ // process-command-line (GetCommandLineW) UTF-8 recovery. ++ const bool embedded = g_llama_server_embedded.load(); ++ const bool parsed_ok = embedded ++ ? common_params_parse(argc, argv, params, LLAMA_EXAMPLE_SERVER) ++ : common_params_parse_main(argc, argv, params, LLAMA_EXAMPLE_SERVER); ++ if (!parsed_ok) { + return 1; } - // register signal handler if not running by CLI -- if (!is_run_by_cli) { -+ // [jllama] also skip when embedded in the JVM (they would hijack the JVM's own -+ // SIGINT/SIGTERM). NativeServer stops the embedded server via -+ // llama_server_request_shutdown() instead. -+ if (!is_run_by_cli && !g_llama_server_embedded.load()) { - #if defined (__unix__) || (defined (__APPLE__) && defined (__MACH__)) - struct sigaction sigint_action; - sigint_action.sa_handler = signal_handler; +@@ -752,7 +813,11 @@ int llama_server(int argc, char ** argv) { + llama_backend_init(); + llama_numa_init(params.numa); + +- const int result = server_run(params, argc, argv, role, server_run_opts{}); ++ server_run_opts opts; ++ // [jllama] no process-wide SIGINT/SIGTERM handlers when embedded in the JVM (they would hijack ++ // the JVM's own); NativeServer stops the embedded server via llama_server_request_shutdown() ++ opts.install_signal_handlers = !embedded; ++ const int result = server_run(params, argc, argv, role, opts); + common_log_flush(common_log_main()); + return result; + } diff --git a/llama/patches/0007-server-attach-http-frontend.patch b/llama/patches/0007-server-attach-http-frontend.patch index d80f18e66..84e3efd51 100644 --- a/llama/patches/0007-server-attach-http-frontend.patch +++ b/llama/patches/0007-server-attach-http-frontend.patch @@ -3,153 +3,40 @@ server: let an embedding host attach the HTTP frontend to an already-loaded serv Adds llama_server_attach(argc, argv, server_context &, server_routes &), which serves a model the host has already loaded over the upstream HTTP frontend: no second model load, no start_loop() -- the host's worker keeps driving the shared server_context and the HTTP routes post tasks to its -queue. The stable route table is factored out of llama_server() into -llama_server_register_common_routes(), byte-identical to the block it replaces (the invariant to -re-check on every bump); the attach entry point registers it plus the non-router resumable-streaming -handlers and the GCP shim, answers /cors-proxy and /tools with 403 (the MCP/tools host belongs to a -full llama-server), marks ready immediately and blocks in ctx_http.join() until +queue. The attach entry point registers upstream's own server_register_routes() (the route table and +the GCP shim) plus the instance (non-router) resumable-streaming handlers through +server_register_stream_routes(), exactly what server_run_instance() registers, so the two entry +points cannot drift on the endpoint set; it answers /cors-proxy and /tools with 403 (the MCP/tools +host belongs to a full llama-server), marks ready immediately and blocks in ctx_http.join() until llama_server_request_shutdown(). It serves the caller's server_routes rather than a frame-local one: server_routes' constructor registers a sleeping-state callback on the model's task queue that outlives the attach call. Applies after 0001 and 0006. -Refreshed at b11799: POST /tts (b11781, #26603) and the WebSocket /v1/realtime (b11780, #30636) joined -the route table between the transcription and the Anthropic routes; both are in the removed block and -in the helper, so attach mode serves them too. +Refreshed at b11881: #31113 factored the route table out of llama_server() itself +(server_register_routes, server_register_stream_routes), so the patch no longer extracts a copy of +it -- the helper this patch used to add, and the "verbatim copy" invariant it had to keep, are gone. diff --git a/tools/server/server.cpp b/tools/server/server.cpp -index d3131f206..287d6708e 100644 +index 2fa87673c..7d0691999 100644 --- a/tools/server/server.cpp +++ b/tools/server/server.cpp -@@ -91,6 +91,7 @@ int llama_server(int argc, char ** argv); +@@ -96,6 +96,7 @@ int llama_server(int argc, char ** argv); + // to be used via CLI (argc / argv are used by router mode only) int llama_server(common_params & params, int argc, char ** argv); - int llama_server(common_params & params, int argc, char ** argv, server_child & child); +int llama_server_attach(int argc, char ** argv, server_context & ctx_server, server_routes & routes); void llama_server_terminate(); void llama_server_terminate() { if (shutdown_handler) { -@@ -139,6 +140,60 @@ static server_http_context::handler_t ex_wrapper(server_http_context::handler_t - }; +@@ -831,3 +832,96 @@ int llama_server(common_params & params, int argc, char ** argv) { + server_role role; + return server_run(params, argc, argv, role, opts); } - -+// [jllama] Pure route table shared by the standalone single-model server and the embedded -+// attach mode (llama_server_attach below), extracted verbatim from llama_server() so the two -+// entry points cannot drift on the core endpoint set. Only the stable, state-independent -+// routes live here (health .. slots); the resumable-streaming routes (handlers differ by -+// router vs non-router), the GCP-compat shim and the experimental CORS-proxy / MCP / -+// built-in-tools wiring stay in each entry point, since upstream couples them to per-call -+// state (server_mcp mcp_mgr lifecycle, is_router_server). -+static void llama_server_register_common_routes(server_http_context & ctx_http, server_routes & routes) { -+ ctx_http.get ("/health", ex_wrapper(routes.get_health)); // public endpoint (no API key check) -+ ctx_http.get ("/v1/health", ex_wrapper(routes.get_health)); // public endpoint (no API key check) -+ ctx_http.get ("/metrics", ex_wrapper(routes.get_metrics)); -+ ctx_http.get ("/props", ex_wrapper(routes.get_props)); -+ ctx_http.post("/props", ex_wrapper(routes.post_props)); -+ ctx_http.get ("/models", ex_wrapper(routes.get_models)); -+ ctx_http.get ("/v1/models", ex_wrapper(routes.get_models)); -+ ctx_http.post("/completion", ex_wrapper(routes.post_completions)); // legacy -+ ctx_http.post("/completions", ex_wrapper(routes.post_completions)); -+ ctx_http.post("/v1/completions", ex_wrapper(routes.post_completions_oai)); -+ ctx_http.post("/chat/completions", ex_wrapper(routes.post_chat_completions)); -+ ctx_http.post("/v1/chat/completions", ex_wrapper(routes.post_chat_completions)); -+ ctx_http.post("/v1/chat/completions/control", ex_wrapper(routes.post_control)); -+ ctx_http.post("/v1/responses", ex_wrapper(routes.post_responses_oai)); -+ ctx_http.post("/responses", ex_wrapper(routes.post_responses_oai)); -+ ctx_http.post("/v1/audio/transcriptions", ex_wrapper(routes.post_transcriptions_oai)); -+ ctx_http.post("/audio/transcriptions", ex_wrapper(routes.post_transcriptions_oai)); -+ ctx_http.post("/tts", ex_wrapper(routes.post_tts)); -+ ctx_http.ws ("/v1/realtime", routes.ws_realtime); -+ ctx_http.post("/v1/messages", ex_wrapper(routes.post_anthropic_messages)); // anthropic messages API -+ ctx_http.post("/infill", ex_wrapper(routes.post_infill)); -+ ctx_http.post("/embedding", ex_wrapper(routes.post_embeddings)); // legacy -+ ctx_http.post("/embeddings", ex_wrapper(routes.post_embeddings)); -+ ctx_http.post("/v1/embeddings", ex_wrapper(routes.post_embeddings_oai)); -+ ctx_http.post("/rerank", ex_wrapper(routes.post_rerank)); -+ ctx_http.post("/reranking", ex_wrapper(routes.post_rerank)); -+ ctx_http.post("/v1/rerank", ex_wrapper(routes.post_rerank)); -+ ctx_http.post("/v1/reranking", ex_wrapper(routes.post_rerank)); -+ ctx_http.post("/v1/systemone", ex_wrapper(routes.post_systemone)); -+ ctx_http.post("/tokenize", ex_wrapper(routes.post_tokenize)); -+ ctx_http.post("/detokenize", ex_wrapper(routes.post_detokenize)); -+ ctx_http.post("/apply-template", ex_wrapper(routes.post_apply_template)); -+ // token counting -+ ctx_http.post("/chat/completions/input_tokens", ex_wrapper(routes.post_chat_completions_tok)); -+ ctx_http.post("/v1/chat/completions/input_tokens", ex_wrapper(routes.post_chat_completions_tok)); -+ ctx_http.post("/responses/input_tokens", ex_wrapper(routes.post_responses_tok_oai)); -+ ctx_http.post("/v1/responses/input_tokens", ex_wrapper(routes.post_responses_tok_oai)); -+ ctx_http.post("/v1/messages/count_tokens", ex_wrapper(routes.post_anthropic_count_tokens)); // anthropic token counting -+ // LoRA adapters hotswap -+ ctx_http.get ("/lora-adapters", ex_wrapper(routes.get_lora_adapters)); -+ ctx_http.post("/lora-adapters", ex_wrapper(routes.post_lora_adapters)); -+ // Save & load slots -+ ctx_http.get ("/slots", ex_wrapper(routes.get_slots)); -+ ctx_http.post("/slots/:id_slot", ex_wrapper(routes.post_slots)); -+} + - int llama_server(int argc, char ** argv) { - server_child child; - -@@ -334,50 +389,7 @@ int llama_server(common_params & params, int argc, char ** argv, server_child & - ctx_http.del ("/models", ex_wrapper(models_routes->del_router_models)); - } - -- ctx_http.get ("/health", ex_wrapper(routes.get_health)); // public endpoint (no API key check) -- ctx_http.get ("/v1/health", ex_wrapper(routes.get_health)); // public endpoint (no API key check) -- ctx_http.get ("/metrics", ex_wrapper(routes.get_metrics)); -- ctx_http.get ("/props", ex_wrapper(routes.get_props)); -- ctx_http.post("/props", ex_wrapper(routes.post_props)); -- ctx_http.get ("/models", ex_wrapper(routes.get_models)); -- ctx_http.get ("/v1/models", ex_wrapper(routes.get_models)); -- ctx_http.post("/completion", ex_wrapper(routes.post_completions)); // legacy -- ctx_http.post("/completions", ex_wrapper(routes.post_completions)); -- ctx_http.post("/v1/completions", ex_wrapper(routes.post_completions_oai)); -- ctx_http.post("/chat/completions", ex_wrapper(routes.post_chat_completions)); -- ctx_http.post("/v1/chat/completions", ex_wrapper(routes.post_chat_completions)); -- ctx_http.post("/v1/chat/completions/control", ex_wrapper(routes.post_control)); -- ctx_http.post("/v1/responses", ex_wrapper(routes.post_responses_oai)); -- ctx_http.post("/responses", ex_wrapper(routes.post_responses_oai)); -- ctx_http.post("/v1/audio/transcriptions", ex_wrapper(routes.post_transcriptions_oai)); -- ctx_http.post("/audio/transcriptions", ex_wrapper(routes.post_transcriptions_oai)); -- ctx_http.post("/tts", ex_wrapper(routes.post_tts)); -- ctx_http.ws ("/v1/realtime", routes.ws_realtime); -- ctx_http.post("/v1/messages", ex_wrapper(routes.post_anthropic_messages)); // anthropic messages API -- ctx_http.post("/infill", ex_wrapper(routes.post_infill)); -- ctx_http.post("/embedding", ex_wrapper(routes.post_embeddings)); // legacy -- ctx_http.post("/embeddings", ex_wrapper(routes.post_embeddings)); -- ctx_http.post("/v1/embeddings", ex_wrapper(routes.post_embeddings_oai)); -- ctx_http.post("/rerank", ex_wrapper(routes.post_rerank)); -- ctx_http.post("/reranking", ex_wrapper(routes.post_rerank)); -- ctx_http.post("/v1/rerank", ex_wrapper(routes.post_rerank)); -- ctx_http.post("/v1/reranking", ex_wrapper(routes.post_rerank)); -- ctx_http.post("/v1/systemone", ex_wrapper(routes.post_systemone)); -- ctx_http.post("/tokenize", ex_wrapper(routes.post_tokenize)); -- ctx_http.post("/detokenize", ex_wrapper(routes.post_detokenize)); -- ctx_http.post("/apply-template", ex_wrapper(routes.post_apply_template)); -- // token counting -- ctx_http.post("/chat/completions/input_tokens", ex_wrapper(routes.post_chat_completions_tok)); -- ctx_http.post("/v1/chat/completions/input_tokens", ex_wrapper(routes.post_chat_completions_tok)); -- ctx_http.post("/responses/input_tokens", ex_wrapper(routes.post_responses_tok_oai)); -- ctx_http.post("/v1/responses/input_tokens", ex_wrapper(routes.post_responses_tok_oai)); -- ctx_http.post("/v1/messages/count_tokens", ex_wrapper(routes.post_anthropic_count_tokens)); // anthropic token counting -- // LoRA adapters hotswap -- ctx_http.get ("/lora-adapters", ex_wrapper(routes.get_lora_adapters)); -- ctx_http.post("/lora-adapters", ex_wrapper(routes.post_lora_adapters)); -- // Save & load slots -- ctx_http.get ("/slots", ex_wrapper(routes.get_slots)); -- ctx_http.post("/slots/:id_slot", ex_wrapper(routes.post_slots)); -+ llama_server_register_common_routes(ctx_http, routes); - - // resumable streaming: a child binds the local session factories, the router binds - // proxies that resolve the owning child, see server-stream.h -@@ -653,3 +665,98 @@ int llama_server(common_params & params, int argc, char ** argv, server_child & - - return 0; - } -+ -+// [jllama] Attach the upstream HTTP frontend — full core route table, WebUI assets, resumable -+// streaming — to an ALREADY-LOADED server_context owned by an embedding caller (a LlamaModel -+// driven over JNI). Unlike llama_server(): no common_init(), no backend/NUMA init, no model -+// load and no start_loop() — the caller's worker thread keeps driving the context, the HTTP ++// [jllama] Attach the upstream HTTP frontend — the route table of every server, WebUI assets, ++// resumable streaming — to an ALREADY-LOADED server_context owned by an embedding caller (a ++// LlamaModel driven over JNI). Unlike llama_server(): no common_init(), no backend/NUMA init, no ++// model load and no start_loop() — the caller's worker thread keeps driving the context, the HTTP +// routes only post tasks to its queue (the queue is the synchronization point). Parses only the +// HTTP-relevant argv (--host/--port/--api-key/...; no -m). Blocks until +// llama_server_request_shutdown(); never terminates the shared server_context or frees the @@ -159,7 +46,7 @@ index d3131f206..287d6708e 100644 +// llama-server host, not an embedded model); they answer 403 "disabled" like a stock build with +// those features off. +// `routes` is the caller's own server_routes over that context -- the one its model load built, -+// as llama_server() builds one before load_model(). It must be the caller's: server_routes ++// as server_run_instance() builds one before load_model(). It must be the caller's: server_routes +// registers a sleeping-state callback on the context's task queue in its constructor and the +// queue never unregisters, so a server_routes built on this frame left a callback into a +// destroyed object behind when the attach returned, and the model's next idle sleep ran it. @@ -187,15 +74,13 @@ index d3131f206..287d6708e 100644 + return 1; + } + -+ llama_server_register_common_routes(ctx_http, routes); -+ -+ // single-model (non-router) resumable-streaming handlers (upstream b10154 paths) -+ ctx_http.get ("/v1/stream", ex_wrapper(server_stream_make_get_handler())); -+ ctx_http.post("/v1/streams/lookup", ex_wrapper(server_stream_make_lookup_handler())); -+ ctx_http.del ("/v1/stream", ex_wrapper(server_stream_make_delete_handler())); -+ -+ // Google Cloud Platform (Vertex AI) compat — cheap, kept for parity with llama_server() -+ ctx_http.register_gcp_compat(); ++ // the same route table, GCP compat shim and instance (non-router) streaming handlers as ++ // server_run_instance(), so the two entry points cannot drift on the endpoint set ++ server_register_routes(ctx_http, routes); ++ server_register_stream_routes(ctx_http, ++ server_stream_make_get_handler(), ++ server_stream_make_lookup_handler(), ++ server_stream_make_delete_handler()); + + // return 403 for the experimental features attach mode does not wire (CORS proxy, built-in + // tools), so those paths answer "disabled" rather than 404 — matching a stock server built diff --git a/llama/patches/0015-rpc-embeddable-client-and-stoppable-server.patch b/llama/patches/0015-rpc-embeddable-client-and-stoppable-server.patch index 13c905f70..07056e0c9 100644 --- a/llama/patches/0015-rpc-embeddable-client-and-stoppable-server.patch +++ b/llama/patches/0015-rpc-embeddable-client-and-stoppable-server.patch @@ -30,23 +30,37 @@ JVM) cannot use ggml-rpc as it is: 3. ggml_backend_rpc_start_server() cannot be stopped: while(true) around accept(). Two new entry points, both also exposed through get_proc_address: - - ggml_backend_rpc_stop_server() disconnects the client being served and wakes accept() - with a loopback connection (the one portable way to interrupt it). The loop then - releases its backends; it used to never reach that code. + - ggml_backend_rpc_stop_server() disconnects the client and every live peer socket. + Listener accept and outgoing peer connect poll cancellation at 50 ms intervals; no + wake-up connection can fill the listen backlog and block the stopping thread. The + loop releases its backends when it ends. - ggml_backend_rpc_server_listening() tells the host whether the socket was bound. The transport stays initialised on the way out, because WSACleanup() would invalidate every other RPC socket in the process. 4. transport: no SIGPIPE when the peer went away (MSG_NOSIGNAL / SO_NOSIGPIPE), a - socket_t::shutdown(), and the file descriptors that connect()/create_server()/accept() + socket_t::shutdown() (on Windows also CancelIoEx: shutdown alone does not wake a recv + blocked in another thread there), and the file descriptors that connect()/create_server()/accept() leaked on their error paths are closed. Upstream-submittable; not filed upstream yet. The runnable guard is src/test/cpp/test_rpc.cpp: it links both new functions and exercises the registration and -stop paths over loopback. +stop paths over loopback. test_rpc_comm.cpp drives protocol-v8 COMM_INIT through the C +API: loopback/network binding, missing peer, stalled caps handshakes in both ranks, +normal peer setup, socket cleanup and restart. Subprocess deadlines bound failures. + +5. COMM_INIT preserves the configured server bind address instead of opening a wildcard + listener for a loopback-only server. Peer sockets are weakly registered before any + caps I/O, under the same mutex as stop; stop also catches a peer accepted/connected + concurrently. Normal COMM_FREE/disconnect still frees them immediately. The rank-1 + retry loop checks cancellation too. The former main-listener wake-up connection is + removed: repeated C-API stops while the peer was absent filled its backlog. + +Drop-check on each upstream bump: inspect comm_init, the stoppable accept/connect +paths and stop_server. Drop upstream-fixed hunks instead of mechanically refreshing them. diff --git a/common/arg.cpp b/common/arg.cpp -index f56d57552..60a0cd9be 100644 +index 267b84874..3d6886eff 100644 --- a/common/arg.cpp +++ b/common/arg.cpp @@ -1183,6 +1183,11 @@ static void add_rpc_devices(const std::string & servers) { @@ -62,11 +76,11 @@ index f56d57552..60a0cd9be 100644 } } diff --git a/ggml/include/ggml-rpc.h b/ggml/include/ggml-rpc.h -index 482bd3666..f7fc68956 100644 +index ecf0a3a6d..9d73a48a7 100644 --- a/ggml/include/ggml-rpc.h +++ b/ggml/include/ggml-rpc.h @@ -26,6 +26,11 @@ GGML_BACKEND_API void ggml_backend_rpc_get_device_memory(const char * endpoint, - + GGML_BACKEND_API void ggml_backend_rpc_start_server(const char * endpoint, const char * cache_dir, size_t n_threads, size_t n_devices, ggml_backend_dev_t * devices); +// Makes a ggml_backend_rpc_start_server() running on another thread return: the client being @@ -74,16 +88,16 @@ index 482bd3666..f7fc68956 100644 +GGML_BACKEND_API void ggml_backend_rpc_stop_server(void); +// true while ggml_backend_rpc_start_server() is accepting connections +GGML_BACKEND_API bool ggml_backend_rpc_server_listening(void); - + GGML_BACKEND_API ggml_backend_reg_t ggml_backend_rpc_reg(void); GGML_BACKEND_API ggml_backend_reg_t ggml_backend_rpc_add_server(const char * endpoint); diff --git a/ggml/src/ggml-rpc/ggml-rpc.cpp b/ggml/src/ggml-rpc/ggml-rpc.cpp -index 45fa8a42d..8061e6186 100644 +index 49f11073e..62925820d 100644 --- a/ggml/src/ggml-rpc/ggml-rpc.cpp +++ b/ggml/src/ggml-rpc/ggml-rpc.cpp -@@ -422,7 +422,12 @@ static bool negotiate_hello(const std::shared_ptr & sock) { +@@ -427,7 +427,12 @@ static bool negotiate_hello(const std::shared_ptr & sock) { sock->get_caps(request.conn_caps); - + bool status = send_rpc_cmd(sock, RPC_CMD_HELLO, &request, sizeof(request), &response, sizeof(response)); - RPC_STATUS_ASSERT(status); + if (!status) { @@ -92,22 +106,22 @@ index 45fa8a42d..8061e6186 100644 + LOG_ERROR("RPC handshake: no valid HELLO response\n"); + return false; + } - + if (response.major != RPC_PROTO_MAJOR_VERSION || response.minor > RPC_PROTO_MINOR_VERSION) { LOG_ERROR("RPC server version mismatch: %d.%d.%d\n", -@@ -505,7 +510,7 @@ public: +@@ -510,7 +515,7 @@ public: void busy_spin_release(); void graph_compute(uint32_t device, const ggml_cgraph * cgraph); - + - void start(const std::string & endpoint); + bool start(const std::string & endpoint); void work(); - + ~rpc_dispatcher(); -@@ -630,26 +635,32 @@ void rpc_dispatcher::busy_spin_release() { +@@ -635,26 +640,32 @@ void rpc_dispatcher::busy_spin_release() { GGML_ASSERT(previous > 0); } - + -void rpc_dispatcher::start(const std::string & endpoint) { +bool rpc_dispatcher::start(const std::string & endpoint) { std::string host; @@ -122,7 +136,7 @@ index 45fa8a42d..8061e6186 100644 + LOG_ERROR("RPC transport initialization failed\n"); + return false; } - + sock = socket_t::connect(host.c_str(), port); if (sock == nullptr) { - GGML_ABORT("Failed to connect to %s\n", endpoint.c_str()); @@ -140,21 +154,21 @@ index 45fa8a42d..8061e6186 100644 thread = std::thread(rpc_dispatcher_trampoline, this); + return true; } - + void rpc_dispatcher::work() { -@@ -699,7 +710,8 @@ rpc_dispatcher::~rpc_dispatcher() { +@@ -705,7 +716,8 @@ rpc_dispatcher::~rpc_dispatcher() { } } - + -static std::shared_ptr get_dispatcher(const std::string & endpoint) { +// Returns nullptr when the endpoint cannot be parsed, reached or handshaken with. +static std::shared_ptr try_get_dispatcher(const std::string & endpoint) { static std::mutex mutex; std::lock_guard lock(mutex); static std::unordered_map> dispatchers; -@@ -712,11 +724,23 @@ static std::shared_ptr get_dispatcher(const std::string & endpoi +@@ -718,11 +730,23 @@ static std::shared_ptr get_dispatcher(const std::string & endpoi } - + auto dispatcher = std::make_shared(); - dispatcher->start(endpoint); + if (!dispatcher->start(endpoint)) { @@ -163,7 +177,7 @@ index 45fa8a42d..8061e6186 100644 dispatchers[endpoint] = dispatcher; return dispatcher; } - + +// Every path below ggml_backend_rpc_add_server() keeps the original contract: a server that +// disappears after it was registered is still fatal (see the RPC_STATUS_ASSERT in work()). +static std::shared_ptr get_dispatcher(const std::string & endpoint) { @@ -177,7 +191,7 @@ index 45fa8a42d..8061e6186 100644 static void ggml_backend_rpc_buffer_free_buffer(ggml_backend_buffer_t buffer) { ggml_backend_rpc_buffer_context * ctx = (ggml_backend_rpc_buffer_context *)buffer->context; auto request = std::make_shared(); -@@ -1335,6 +1359,10 @@ ggml_backend_t ggml_backend_rpc_init(const char * endpoint, uint32_t device) { +@@ -1357,6 +1381,10 @@ ggml_backend_t ggml_backend_rpc_init(const char * endpoint, uint32_t device) { /* .name = */ dev_name, }; auto reg = ggml_backend_rpc_add_server(endpoint); @@ -188,9 +202,9 @@ index 45fa8a42d..8061e6186 100644 LOG_DBG("[%s] %s\n", __func__, dev_name.c_str()); ggml_backend_t backend = new ggml_backend { /* .guid = */ ggml_backend_rpc_guid(), -@@ -1350,7 +1378,15 @@ bool ggml_backend_is_rpc(ggml_backend_t backend) { +@@ -1372,7 +1400,15 @@ bool ggml_backend_is_rpc(ggml_backend_t backend) { } - + void ggml_backend_rpc_get_device_memory(const char * endpoint, uint32_t device, size_t * free, size_t * total) { - auto dispatcher = get_dispatcher(endpoint); + auto dispatcher = try_get_dispatcher(endpoint); @@ -205,39 +219,125 @@ index 45fa8a42d..8061e6186 100644 auto request = std::make_shared(); request->device = device; rpc_msg_get_device_memory_rsp response; -@@ -2724,6 +2760,41 @@ static void rpc_serve_client(const std::vector & backends, const - } +@@ -1383,12 +1419,37 @@ void ggml_backend_rpc_get_device_memory(const char * endpoint, uint32_t device, + *total = response.total_mem; } - -+// State of the one server a process can run, so that another thread can stop it. -+// ggml_backend_rpc_start_server() blocks for the lifetime of the server; an embedding host -+// (e.g. a JVM) runs it on a thread of its own and needs a way to end it without ending the process. -+static std::mutex g_rpc_server_mutex; -+static std::atomic g_rpc_server_stop{false}; -+static std::atomic g_rpc_server_listening{false}; -+static socket_ptr g_rpc_server_client; // the client being served, if any -+static std::string g_rpc_server_wake; // endpoint that reaches the listening socket + ++// State of the one embedding server. Peer sockets are registered before their blocking caps ++// handshake, and kept weakly so COMM_FREE/client disconnect still release them immediately. ++static std::mutex g_rpc_server_mutex; ++static std::atomic g_rpc_server_stop{false}; ++static std::atomic g_rpc_server_listening{false}; ++static socket_ptr g_rpc_server_client; ++static std::vector> g_rpc_server_peers; + -+void ggml_backend_rpc_stop_server(void) { -+ std::string wake; -+ { -+ std::lock_guard lock(g_rpc_server_mutex); -+ g_rpc_server_stop = true; -+ if (g_rpc_server_client) { -+ // ends rpc_serve_client(): its blocking recv returns an error -+ g_rpc_server_client->shutdown(); ++static bool rpc_server_track_peer(const socket_ptr & peer) { ++ std::lock_guard lock(g_rpc_server_mutex); ++ if (g_rpc_server_stop) { ++ peer->shutdown(); ++ return false; ++ } ++ for (auto it = g_rpc_server_peers.begin(); it != g_rpc_server_peers.end();) { ++ if (it->expired()) { ++ it = g_rpc_server_peers.erase(it); ++ } else { ++ ++it; ++ } ++ } ++ g_rpc_server_peers.push_back(peer); ++ return true; ++} ++ + // RPC server-side implementation + + class rpc_server { + public: +- rpc_server(std::vector all_backends, const char * cache_dir) +- : backends(std::move(all_backends)), cache_dir(cache_dir) { ++ rpc_server(std::vector all_backends, const char * cache_dir, const std::string & bind_host) ++ : backends(std::move(all_backends)), cache_dir(cache_dir), bind_host(bind_host) { + stored_graphs.resize(backends.size()); + comm_states.resize(backends.size()); + } +@@ -1445,6 +1506,7 @@ private: + + std::vector backends; + const char * cache_dir; ++ const std::string bind_host; + std::unordered_set buffers; + // computed graphs cached per backend, keyed by uid + std::vector> stored_graphs; +@@ -2234,13 +2296,15 @@ bool rpc_server::comm_init(const rpc_msg_comm_init_req & request, rpc_msg_comm_i + uint8_t local_caps[RPC_CONN_CAPS_SIZE] = {}; + uint8_t remote_caps[RPC_CONN_CAPS_SIZE] = {}; + if (request.rank == 0) { +- socket_ptr srv = socket_t::create_server("0.0.0.0", request.port); ++ // A local embedding server must not become network-visible on a client-selected port. ++ socket_ptr srv = socket_t::create_server(bind_host.c_str(), request.port); + if (srv == nullptr) { + LOG_ERROR("[%s] failed to listen on comm port %u\n", __func__, request.port); + return true; + } +- state.peer = srv->accept(); +- if (state.peer == nullptr) { ++ state.peer = srv->accept(&g_rpc_server_stop); ++ if (state.peer == nullptr || !rpc_server_track_peer(state.peer)) { ++ state.peer = nullptr; + return true; + } + if (!state.peer->recv_data(remote_caps, sizeof(remote_caps))) { +@@ -2256,9 +2320,9 @@ bool rpc_server::comm_init(const rpc_msg_comm_init_req & request, rpc_msg_comm_i + } else { + const std::string host(request.host, strnlen(request.host, sizeof(request.host))); + // rank 0 may not be listening yet, retry for a few seconds +- for (int i = 0; i < 100 && state.peer == nullptr; i++) { +- state.peer = socket_t::connect(host.c_str(), request.port); +- if (state.peer == nullptr) { ++ for (int i = 0; i < 100 && state.peer == nullptr && !g_rpc_server_stop; i++) { ++ state.peer = socket_t::connect(host.c_str(), request.port, &g_rpc_server_stop); ++ if (state.peer == nullptr && !g_rpc_server_stop) { + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + } + } +@@ -2266,6 +2330,10 @@ bool rpc_server::comm_init(const rpc_msg_comm_init_req & request, rpc_msg_comm_i + LOG_ERROR("[%s] failed to connect to peer %s:%u\n", __func__, host.c_str(), request.port); + return true; + } ++ if (!rpc_server_track_peer(state.peer)) { ++ state.peer = nullptr; ++ return true; + } -+ wake = g_rpc_server_wake; + state.peer->get_caps(local_caps); + if (!state.peer->send_data(local_caps, sizeof(local_caps)) || + !state.peer->recv_data(remote_caps, sizeof(remote_caps))) { +@@ -2432,8 +2500,8 @@ rpc_server::~rpc_server() { + } + + static void rpc_serve_client(const std::vector & backends, const char * cache_dir, +- socket_ptr sock) { +- rpc_server server(backends, cache_dir); ++ socket_ptr sock, const std::string & bind_host) { ++ rpc_server server(backends, cache_dir, bind_host); + uint8_t cmd; + if (!sock->recv_data(&cmd, 1)) { + return; +@@ -2759,6 +2827,25 @@ static void rpc_serve_client(const std::vector & backends, const + } + } + ++void ggml_backend_rpc_stop_server(void) { ++ std::lock_guard lock(g_rpc_server_mutex); ++ g_rpc_server_stop = true; ++ if (g_rpc_server_client) { ++ g_rpc_server_client->shutdown(); + } -+ if (!wake.empty()) { -+ // accept() is not interruptible from another thread in a portable way; a connection -+ // is. The loop sees the stop flag as soon as accept() returns and closes it unserved. -+ std::string host; -+ int port; -+ if (parse_endpoint(wake, host, port)) { -+ socket_t::connect(host.c_str(), port); ++ for (const auto & weak : g_rpc_server_peers) { ++ if (auto peer = weak.lock()) { ++ peer->shutdown(); + } + } ++ // Listener accept / outgoing peer connect poll the stop flag. No wake-up connection: ++ // repeated C-API stop calls used to fill the main listener's backlog and block here too. +} + +bool ggml_backend_rpc_server_listening(void) { @@ -247,7 +347,7 @@ index 45fa8a42d..8061e6186 100644 void ggml_backend_rpc_start_server(const char * endpoint, const char * cache_dir, size_t n_threads, size_t n_devices, ggml_backend_dev_t * devices) { if (n_devices == 0 || devices == nullptr) { -@@ -2731,6 +2802,12 @@ void ggml_backend_rpc_start_server(const char * endpoint, const char * cache_dir +@@ -2766,6 +2853,12 @@ void ggml_backend_rpc_start_server(const char * endpoint, const char * cache_dir return; } std::vector backends; @@ -260,7 +360,7 @@ index 45fa8a42d..8061e6186 100644 LOG_INFO("Starting RPC server v%d.%d.%d\n", RPC_PROTO_MAJOR_VERSION, RPC_PROTO_MINOR_VERSION, -@@ -2747,6 +2824,7 @@ void ggml_backend_rpc_start_server(const char * endpoint, const char * cache_dir +@@ -2782,6 +2875,7 @@ void ggml_backend_rpc_start_server(const char * endpoint, const char * cache_dir auto backend = ggml_backend_dev_init(dev, nullptr); if (!backend) { LOG_ERROR("Failed to create backend for device %s\n", dev->iface.get_name(dev)); @@ -268,15 +368,15 @@ index 45fa8a42d..8061e6186 100644 return; } backends.push_back(backend); -@@ -2762,6 +2840,7 @@ void ggml_backend_rpc_start_server(const char * endpoint, const char * cache_dir +@@ -2797,6 +2891,7 @@ void ggml_backend_rpc_start_server(const char * endpoint, const char * cache_dir std::string host; int port; if (!parse_endpoint(endpoint, host, port)) { + free_backends(); return; } - -@@ -2772,27 +2851,55 @@ void ggml_backend_rpc_start_server(const char * endpoint, const char * cache_dir + +@@ -2807,27 +2902,54 @@ void ggml_backend_rpc_start_server(const char * endpoint, const char * cache_dir #endif // GGML_RPC_RDMA if (!rpc_transport_init()) { LOG_ERROR("Failed to initialize RPC transport\n"); @@ -290,15 +390,14 @@ index 45fa8a42d..8061e6186 100644 return; } - while (true) { +- auto client_socket = server_socket->accept(); + { + std::lock_guard lock(g_rpc_server_mutex); + g_rpc_server_stop = false; -+ // a server bound to every interface is reached for the wake-up on loopback -+ g_rpc_server_wake = (host == "0.0.0.0" ? std::string("127.0.0.1") : host) + ":" + std::to_string(port); + } + g_rpc_server_listening = true; + while (!g_rpc_server_stop) { - auto client_socket = server_socket->accept(); ++ auto client_socket = server_socket->accept(&g_rpc_server_stop); if (client_socket == nullptr) { - LOG_ERROR("Failed to accept client connection\n"); - return; @@ -310,15 +409,17 @@ index 45fa8a42d..8061e6186 100644 + { + std::lock_guard lock(g_rpc_server_mutex); + if (g_rpc_server_stop) { -+ break; // the wake-up connection of ggml_backend_rpc_stop_server() ++ break; + } + g_rpc_server_client = client_socket; } LOG_INFO("Accepted client connection\n"); - rpc_serve_client(backends, cache_dir, client_socket); +- rpc_serve_client(backends, cache_dir, client_socket); ++ rpc_serve_client(backends, cache_dir, client_socket, host); + { + std::lock_guard lock(g_rpc_server_mutex); + g_rpc_server_client = nullptr; ++ g_rpc_server_peers.clear(); + } LOG_INFO("Client connection closed\n"); } @@ -327,7 +428,7 @@ index 45fa8a42d..8061e6186 100644 - ggml_backend_free(backend); + { + std::lock_guard lock(g_rpc_server_mutex); -+ g_rpc_server_wake.clear(); ++ g_rpc_server_peers.clear(); } + g_rpc_server_listening = false; + server_socket = nullptr; @@ -336,9 +437,9 @@ index 45fa8a42d..8061e6186 100644 + // original loop never got here, so it never cleaned up either. + free_backends(); } - + static const char * ggml_backend_rpc_device_get_name(ggml_backend_dev_t dev) { -@@ -3076,6 +3183,12 @@ static void * ggml_backend_rpc_get_proc_address(ggml_backend_reg_t reg, const ch +@@ -3111,6 +3233,12 @@ static void * ggml_backend_rpc_get_proc_address(ggml_backend_reg_t reg, const ch if (std::strcmp(name, "ggml_backend_comm_allreduce_tensor") == 0) { return (void *)ggml_backend_rpc_comm_allreduce_tensor; } @@ -349,12 +450,12 @@ index 45fa8a42d..8061e6186 100644 + return (void *)ggml_backend_rpc_server_listening; + } return NULL; - + GGML_UNUSED(reg); -@@ -3098,8 +3211,13 @@ ggml_backend_reg_t ggml_backend_rpc_reg(void) { +@@ -3133,8 +3261,13 @@ ggml_backend_reg_t ggml_backend_rpc_reg(void) { return &ggml_backend_rpc_reg; } - + +// 0 when the server cannot be reached, so that registering an unreachable server is an +// ordinary failure for the caller rather than an abort of the whole process. static uint32_t ggml_backend_rpc_get_device_count(const char * endpoint) { @@ -366,7 +467,7 @@ index 45fa8a42d..8061e6186 100644 rpc_msg_device_count_rsp response; dispatcher->send(RPC_CMD_DEVICE_COUNT, nullptr, 0, &response, sizeof(response)); return response.device_count; -@@ -3118,6 +3236,11 @@ ggml_backend_reg_t ggml_backend_rpc_add_server(const char * endpoint) { +@@ -3153,6 +3286,11 @@ ggml_backend_reg_t ggml_backend_rpc_add_server(const char * endpoint) { static uint32_t dev_id = 0; std::lock_guard lock(mutex); if (reg_map.find(endpoint) != reg_map.end()) { @@ -379,10 +480,25 @@ index 45fa8a42d..8061e6186 100644 return reg_map[endpoint]; } diff --git a/ggml/src/ggml-rpc/transport.cpp b/ggml/src/ggml-rpc/transport.cpp -index 0d5343853..08284395d 100644 +index 22b38e00f..36360b0a7 100644 --- a/ggml/src/ggml-rpc/transport.cpp +++ b/ggml/src/ggml-rpc/transport.cpp -@@ -545,7 +545,12 @@ bool socket_t::impl::send_data(const void * data, size_t size) { +@@ -16,11 +16,14 @@ + # include + # include + # include ++# include ++# include + #endif + #include + #include + #include + #include ++#include + + #ifdef GGML_RPC_RDMA + # include +@@ -545,7 +548,12 @@ bool socket_t::impl::send_data(const void * data, size_t size) { size_t bytes_sent = 0; while (bytes_sent < size) { size_t size_to_send = std::min(size - bytes_sent, MAX_CHUNK_SIZE); @@ -395,10 +511,10 @@ index 0d5343853..08284395d 100644 if (n < 0) { LOG_ERROR("send failed (bytes_sent=%zu, size_to_send=%zu)\n", bytes_sent, size_to_send); -@@ -702,6 +707,32 @@ static bool set_no_delay(sockfd_t sockfd) { +@@ -702,21 +710,121 @@ static bool set_no_delay(sockfd_t sockfd) { return ret == 0; } - + +static void close_fd(sockfd_t sockfd) { +#ifdef _WIN32 + closesocket(sockfd); @@ -420,6 +536,10 @@ index 0d5343853..08284395d 100644 +void socket_t::shutdown() { +#ifdef _WIN32 + ::shutdown(pimpl->fd, SD_BOTH); ++ // A recv()/send() blocked in another thread does not return on Windows when the socket is ++ // shut down (it does on POSIX). Cancelling the handle's pending I/O ends it with WSAEINTR, ++ // which is what stop relies on for the client and every peer. ++ CancelIoEx(reinterpret_cast(pimpl->fd), nullptr); +#else + ::shutdown(pimpl->fd, SHUT_RDWR); +#endif @@ -428,8 +548,84 @@ index 0d5343853..08284395d 100644 static bool set_reuse_addr(sockfd_t sockfd) { int flag = 1; int ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&flag, sizeof(int)); -@@ -715,8 +746,10 @@ socket_ptr socket_t::accept() { + return ret == 0; + } + +-socket_ptr socket_t::accept() { +- auto client_socket_fd = ::accept(pimpl->fd, NULL, NULL); ++static bool set_nonblocking(sockfd_t fd, bool enabled) { ++#ifdef _WIN32 ++ u_long mode = enabled ? 1 : 0; ++ return ioctlsocket(fd, FIONBIO, &mode) == 0; ++#else ++ const int flags = fcntl(fd, F_GETFL, 0); ++ return flags >= 0 && fcntl(fd, F_SETFL, enabled ? flags | O_NONBLOCK : flags & ~O_NONBLOCK) == 0; ++#endif ++} ++ ++static bool socket_would_block() { ++#ifdef _WIN32 ++ const int error = WSAGetLastError(); ++ return error == WSAEWOULDBLOCK || error == WSAEINPROGRESS; ++#else ++ return errno == EAGAIN || errno == EWOULDBLOCK || errno == EINPROGRESS; ++#endif ++} ++ ++// poll/WSAPoll work for high-numbered JVM descriptors too, unlike FD_SET/select on POSIX. ++static bool wait_socket(sockfd_t fd, bool write, const std::atomic * stop) { ++#ifdef _WIN32 ++ WSAPOLLFD pending = {}; ++#else ++ struct pollfd pending = {}; ++#endif ++ pending.fd = fd; ++ pending.events = write ? POLLOUT : POLLIN; ++ while (!stop->load()) { ++#ifdef _WIN32 ++ const int ready = WSAPoll(&pending, 1, 50); ++ if (ready < 0 && WSAGetLastError() == WSAEINTR) { ++ continue; ++ } ++#else ++ const int ready = poll(&pending, 1, 50); ++ if (ready < 0 && errno == EINTR) { ++ continue; ++ } ++#endif ++ if (ready < 0 || (pending.revents & POLLNVAL)) { ++ return false; ++ } ++ if (ready > 0) { ++ return !stop->load(); ++ } ++ } ++ return false; ++} ++ ++socket_ptr socket_t::accept(const std::atomic * stop) { ++ if (stop && !set_nonblocking(pimpl->fd, true)) { ++ return nullptr; ++ } ++ sockfd_t client_socket_fd; ++ for (;;) { ++ if (stop && !wait_socket(pimpl->fd, false, stop)) { ++ return nullptr; ++ } ++ client_socket_fd = ::accept(pimpl->fd, NULL, NULL); ++ if (is_valid_fd(client_socket_fd) || !stop || !socket_would_block()) { ++ break; ++ } ++ } + if (!is_valid_fd(client_socket_fd)) { + return nullptr; } ++ // Windows inherits the listener's nonblocking mode; recv/send on the accepted client stay ++ // blocking and are cancelled by shutdown() through the embedding server's socket registry. ++ if (stop && (stop->load() || !set_nonblocking(client_socket_fd, false))) { ++ close_fd(client_socket_fd); ++ return nullptr; ++ } if (!set_no_delay(client_socket_fd)) { LOG_ERROR("Failed to set TCP_NODELAY\n"); + close_fd(client_socket_fd); @@ -439,7 +635,7 @@ index 0d5343853..08284395d 100644 LOG_DBG("[%s] accepted client connection\n", __func__); return socket_ptr(new socket_t(std::make_unique(client_socket_fd))); } -@@ -728,10 +761,12 @@ socket_ptr socket_t::create_server(const char * host, int port) { +@@ -728,10 +836,12 @@ socket_ptr socket_t::create_server(const char * host, int port) { } if (!set_reuse_addr(sockfd)) { LOG_ERROR("Failed to set SO_REUSEADDR\n"); @@ -452,9 +648,9 @@ index 0d5343853..08284395d 100644 return nullptr; } struct sockaddr_in serv_addr; -@@ -740,9 +775,11 @@ socket_ptr socket_t::create_server(const char * host, int port) { +@@ -740,34 +850,60 @@ socket_ptr socket_t::create_server(const char * host, int port) { serv_addr.sin_port = htons(port); - + if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { + close_fd(sockfd); return nullptr; @@ -464,7 +660,14 @@ index 0d5343853..08284395d 100644 return nullptr; } LOG_DBG("[%s] listening on %s:%d\n", __func__, host, port); -@@ -756,18 +793,22 @@ socket_ptr socket_t::connect(const char * host, int port) { + return socket_ptr(new socket_t(std::make_unique(sockfd))); + } + +-socket_ptr socket_t::connect(const char * host, int port) { ++socket_ptr socket_t::connect(const char * host, int port, const std::atomic * stop) { + auto sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (!is_valid_fd(sockfd)) { + return nullptr; } if (!set_no_delay(sockfd)) { LOG_ERROR("Failed to set TCP_NODELAY\n"); @@ -482,23 +685,63 @@ index 0d5343853..08284395d 100644 return nullptr; } memcpy(&addr.sin_addr.s_addr, server->h_addr, server->h_length); ++ if (stop && (stop->load() || !set_nonblocking(sockfd, true))) { ++ close_fd(sockfd); ++ return nullptr; ++ } if (::connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { ++ if (!stop || !socket_would_block() || !wait_socket(sockfd, true, stop)) { ++ close_fd(sockfd); ++ return nullptr; ++ } ++ int error = 0; ++#ifdef _WIN32 ++ int length = sizeof(error); ++#else ++ socklen_t length = sizeof(error); ++#endif ++ if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (char *) &error, &length) != 0 || error != 0) { ++ close_fd(sockfd); ++ return nullptr; ++ } ++ } ++ if (stop && (stop->load() || !set_nonblocking(sockfd, false))) { + close_fd(sockfd); return nullptr; } LOG_DBG("[%s] connected to %s:%d\n", __func__, host, port); diff --git a/ggml/src/ggml-rpc/transport.h b/ggml/src/ggml-rpc/transport.h -index 59b8845c0..f8aa5728e 100644 +index 59b8845c0..d24dd7531 100644 --- a/ggml/src/ggml-rpc/transport.h +++ b/ggml/src/ggml-rpc/transport.h -@@ -22,6 +22,10 @@ struct socket_t { - - socket_ptr accept(); - +@@ -3,6 +3,7 @@ + #include + #include + #include ++#include + + struct socket_t; + typedef std::shared_ptr socket_ptr; +@@ -20,14 +21,20 @@ struct socket_t { + // here. No-op on TCP. + bool flush(); + +- socket_ptr accept(); ++ // Optional cancellation for an embedding server's listener. Waiting uses short polls, ++ // not a wake-up connection that can itself block behind an unserved accept queue. ++ socket_ptr accept(const std::atomic * stop = nullptr); ++ + // Ends any blocking send/recv/accept on this socket from another thread, so + // an embedding host can stop a server that is waiting for or serving a client. + void shutdown(); -+ + void get_caps(uint8_t * local_caps); void update_caps(const uint8_t * remote_caps); const char * transport_name() const; + + static socket_ptr create_server(const char * host, int port); +- static socket_ptr connect(const char * host, int port); ++ static socket_ptr connect(const char * host, int port, const std::atomic * stop = nullptr); + + private: + struct impl; diff --git a/llama/pom.xml b/llama/pom.xml index 9051e635f..4eb025162 100644 --- a/llama/pom.xml +++ b/llama/pom.xml @@ -337,6 +337,19 @@ SPDX-License-Identifier: MIT + + + ${project.basedir}/src/main/resources + + + ${project.basedir}/.. + META-INF/third-party/net.ladenthin/${project.artifactId} + + LICENSE + THIRD_PARTY.md + + + @@ -922,6 +935,33 @@ SPDX-License-Identifier: MIT natives + + + org.apache.maven.plugins + maven-resources-plugin + + + natives-legal + prepare-package + + copy-resources + + + ${project.basedir}/src/main/natives/META-INF/third-party/natives + + + ${project.basedir}/legal/natives + + + + + + org.apache.maven.plugins maven-jar-plugin @@ -937,6 +977,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Linux/x86_64/cpu/** + META-INF/third-party/natives/** false @@ -957,6 +998,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Linux/aarch64/cpu/** + META-INF/third-party/natives/** false @@ -977,6 +1019,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Linux/s390x/cpu/** + META-INF/third-party/natives/** false @@ -997,6 +1040,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Linux-Android/aarch64/cpu/** + META-INF/third-party/natives/** false @@ -1017,6 +1061,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Linux-Android/x86_64/cpu/** + META-INF/third-party/natives/** false @@ -1037,6 +1082,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Windows/x86_64/cpu/** + META-INF/third-party/natives/** false @@ -1057,6 +1103,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Windows/aarch64/cpu/** + META-INF/third-party/natives/** false @@ -1077,6 +1124,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Mac/aarch64/metal/** + META-INF/third-party/natives/** false @@ -1097,6 +1145,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Linux/x86_64/cuda13/** + META-INF/third-party/natives/** false @@ -1117,6 +1166,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Windows/x86_64/cuda13/** + META-INF/third-party/natives/** false @@ -1137,6 +1187,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Linux/x86_64/rocm/** + META-INF/third-party/natives/** false @@ -1157,6 +1208,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Windows/x86_64/rocm/** + META-INF/third-party/natives/** false @@ -1177,6 +1229,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Linux/x86_64/sycl/** + META-INF/third-party/natives/** false @@ -1197,6 +1250,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Windows/x86_64/sycl/** + META-INF/third-party/natives/** false @@ -1217,6 +1271,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Linux/aarch64/vulkan/** + META-INF/third-party/natives/** false @@ -1237,6 +1292,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Linux/x86_64/vulkan/** + META-INF/third-party/natives/** false @@ -1257,6 +1313,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Windows/aarch64/vulkan/** + META-INF/third-party/natives/** false @@ -1277,6 +1334,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Windows/x86_64/vulkan/** + META-INF/third-party/natives/** false @@ -1297,6 +1355,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Linux-Android/aarch64/opencl/** + META-INF/third-party/natives/** false @@ -1317,6 +1376,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Windows/aarch64/opencl/** + META-INF/third-party/natives/** false @@ -1337,6 +1397,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Windows/x86_64/opencl/** + META-INF/third-party/natives/** false @@ -1357,6 +1418,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Linux/x86_64/openvino/** + META-INF/third-party/natives/** false @@ -1377,6 +1439,7 @@ SPDX-License-Identifier: MIT ${project.basedir}/src/main/natives net/ladenthin/llama/Windows/x86_64/openvino/** + META-INF/third-party/natives/** false diff --git a/llama/src/main/java/net/ladenthin/llama/value/LlamaCppVersion.java b/llama/src/main/java/net/ladenthin/llama/value/LlamaCppVersion.java index ebfaf7ed6..28224e451 100644 --- a/llama/src/main/java/net/ladenthin/llama/value/LlamaCppVersion.java +++ b/llama/src/main/java/net/ladenthin/llama/value/LlamaCppVersion.java @@ -9,13 +9,13 @@ * library was compiled against, exposed as a compile-time constant so callers can render a badge or * emit a startup log line without loading the native library. * - *

{@link #LLAMA_CPP_VERSION} is a pure-Java string ({@code "b11827"}) that mirrors the + *

{@link #LLAMA_CPP_VERSION} is a pure-Java string ({@code "b11881"}) that mirrors the * {@code GIT_TAG} in {@code llama/CMakeLists.txt}. It is available even when {@code libjllama} is * absent (pure-Java checkout, before {@code System.load}), which is what makes it suitable for a * lightweight version badge in Android or other UIs.

* *

For the authoritative value that is baked into the native binary — the build number - * plus the resolved upstream commit, e.g. {@code "b11827-"} — call + * plus the resolved upstream commit, e.g. {@code "b11881-"} — call * {@link net.ladenthin.llama.LlamaModel#getLlamaCppBuildInfo()} instead; that reads llama.cpp's own * {@code build-info} through JNI and therefore cannot drift from the compiled library (but requires * the native library to be loaded).

@@ -23,14 +23,14 @@ public final class LlamaCppVersion { /** - * The pinned llama.cpp release tag this library was built against, e.g. {@code "b11827"}. + * The pinned llama.cpp release tag this library was built against, e.g. {@code "b11881"}. * *

Kept in lockstep with {@code GIT_TAG} in {@code llama/CMakeLists.txt} — see the * "Upgrading/Downgrading llama.cpp Version" checklist in {@code CLAUDE.md}. This is the * compile-time pin; use {@link net.ladenthin.llama.LlamaModel#getLlamaCppBuildInfo()} for the * value actually linked into the native binary.

*/ - public static final String LLAMA_CPP_VERSION = "b11827"; + public static final String LLAMA_CPP_VERSION = "b11881"; // Constants holder — not instantiable. private LlamaCppVersion() {} diff --git a/llama/src/test/cpp/test_c_api.cpp b/llama/src/test/cpp/test_c_api.cpp index 5238a5739..5c509db60 100644 --- a/llama/src/test/cpp/test_c_api.cpp +++ b/llama/src/test/cpp/test_c_api.cpp @@ -1565,9 +1565,10 @@ TEST(CApiRpc, TheRpcServerServesTheCpuOverLoopbackAndStops) { // server returns at once when it cannot bind, which `listening` tells apart. bool served = false; for (int attempt = 0; attempt < 50 && !served; ++attempt) { + // Below every default ephemeral range (Linux from 32768, Windows and macOS from 49152). const int port = - 42000 + static_cast( - (std::chrono::steady_clock::now().time_since_epoch().count() / 1000 + attempt * 97) % 20000); + 20000 + static_cast( + (std::chrono::steady_clock::now().time_since_epoch().count() / 1000 + attempt * 97) % 12000); auto done = std::make_shared>(false); auto status = std::make_shared(JLLAMA_STATUS_OK); std::thread worker([port, done, status]() { @@ -1594,9 +1595,12 @@ TEST(CApiRpc, TheRpcServerServesTheCpuOverLoopbackAndStops) { namespace { // A port of the range the serve test above uses (a fixed port would collide with parallel jobs). +// Below every default ephemeral range (Linux from 32768, Windows and macOS from 49152): a port out +// of 42000-62000 was once taken by an outgoing connection on the aarch64 runner, and the serve failed +// to bind ("Failed to create server socket", run 40195444689). int rpc_test_port(int attempt) { - return 42000 + static_cast( - (std::chrono::steady_clock::now().time_since_epoch().count() / 1000 + attempt * 97) % 20000); + return 20000 + static_cast( + (std::chrono::steady_clock::now().time_since_epoch().count() / 1000 + attempt * 97) % 12000); } // jllama_rpc_server_serve() on a thread of its own, with a way to wait for it to return. diff --git a/llama/src/test/cpp/test_rpc.cpp b/llama/src/test/cpp/test_rpc.cpp index 32292b982..979b8a0bb 100644 --- a/llama/src/test/cpp/test_rpc.cpp +++ b/llama/src/test/cpp/test_rpc.cpp @@ -165,9 +165,10 @@ class loopback_server { loopback_server() { devices_ = jllama::rpc::server_devices({"CPU"}); for (int attempt = 0; attempt < 50 && !listening_; ++attempt) { - port_ = 42000 + + // Below every default ephemeral range (Linux from 32768, Windows and macOS from 49152). + port_ = 20000 + static_cast( - (std::chrono::steady_clock::now().time_since_epoch().count() / 1000 + attempt * 97) % 20000); + (std::chrono::steady_clock::now().time_since_epoch().count() / 1000 + attempt * 97) % 12000); const std::string endpoint = "127.0.0.1:" + std::to_string(port_); auto done = std::make_shared>(false); thread_ = std::thread([this, endpoint, done]() { @@ -310,7 +311,12 @@ TEST(RpcLoopback, StopDisconnectsAClientThatIsStillConnected) { // an open backend keeps its connection -- the server is inside rpc_serve_client when stopped ggml_backend_t rpc = ggml_backend_rpc_init(server.endpoint().c_str(), 0); ASSERT_NE(rpc, nullptr); - server.stop(); // must return rather than wait for the client to hang up + // Must return rather than wait for the client to hang up. Without the deadline this passed on + // Windows after 120 s, where shutdown() alone does not wake the server's blocked recv(). + const auto started = std::chrono::steady_clock::now(); + server.stop(); + EXPECT_LT(std::chrono::steady_clock::now() - started, std::chrono::seconds(10)) + << "stop waited for the connected client instead of disconnecting it"; EXPECT_FALSE(ggml_backend_rpc_server_listening()); ggml_backend_free(rpc); } diff --git a/llama/src/test/cpp/test_rpc_comm.cpp b/llama/src/test/cpp/test_rpc_comm.cpp new file mode 100644 index 000000000..f72b80ed4 --- /dev/null +++ b/llama/src/test/cpp/test_rpc_comm.cpp @@ -0,0 +1,399 @@ +// SPDX-FileCopyrightText: 2026 Bernard Ladenthin +// +// SPDX-License-Identifier: MIT + +// Real TCP protocol-v8 clients of the C API used by JNI/FFM. No models, GPU or external network. +// Each scenario runs in a fresh subprocess: a regression in stop must produce a bounded failure, +// rather than hang the test runner or leave a server thread affecting the following cases. + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX +#include +#include +#else +#include +#include +#include +#include +#include +#endif + +#include "jllama_api.h" +#include "ggml.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +using namespace std::chrono_literals; +#ifdef _WIN32 +using fd_t = SOCKET; +constexpr fd_t invalid_fd = INVALID_SOCKET; +void close_fd(fd_t fd) { closesocket(fd); } +#else +using fd_t = int; +constexpr fd_t invalid_fd = -1; +void close_fd(fd_t fd) { close(fd); } +#endif + +void require(bool condition, const char *message) { + if (!condition) { + std::fprintf(stderr, "RPC comm regression: %s\n", message); + std::fflush(stderr); + std::_Exit(1); + } +} + +void init_sockets() { +#ifdef _WIN32 + static const bool initialized = []() { + WSADATA data; + return WSAStartup(MAKEWORD(2, 2), &data) == 0; + }(); + require(initialized, "WSAStartup failed"); +#endif +} + +struct socket_owner { + fd_t fd = invalid_fd; + explicit socket_owner(fd_t value = invalid_fd) : fd(value) {} + ~socket_owner() { + if (fd != invalid_fd) { + close_fd(fd); + } + } + socket_owner(const socket_owner &) = delete; + socket_owner &operator=(const socket_owner &) = delete; +}; + +sockaddr_in address(const char *host, int port) { + sockaddr_in addr{}; + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = inet_addr(host); + addr.sin_port = htons(static_cast(port)); + return addr; +} + +fd_t new_socket() { + fd_t fd = socket(AF_INET, SOCK_STREAM, 0); + require(fd != invalid_fd, "socket creation failed"); +#ifdef _WIN32 + const DWORD timeout = 5000; +#else + const timeval timeout{5, 0}; +#endif + require(setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast(&timeout), sizeof(timeout)) == 0, + "receive timeout setup failed"); + require(setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, reinterpret_cast(&timeout), sizeof(timeout)) == 0, + "send timeout setup failed"); +#ifdef SO_NOSIGPIPE + const int yes = 1; + setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &yes, sizeof(yes)); +#endif + return fd; +} + +bool can_bind(const char *host, int port) { + socket_owner sock(new_socket()); + auto addr = address(host, port); + return bind(sock.fd, reinterpret_cast(&addr), sizeof(addr)) == 0; +} + +int free_port() { + socket_owner sock(new_socket()); + auto addr = address("127.0.0.1", 0); + require(bind(sock.fd, reinterpret_cast(&addr), sizeof(addr)) == 0, "ephemeral bind failed"); +#ifdef _WIN32 + int len = sizeof(addr); +#else + socklen_t len = sizeof(addr); +#endif + require(getsockname(sock.fd, reinterpret_cast(&addr), &len) == 0, "getsockname failed"); + return ntohs(addr.sin_port); +} + +fd_t try_connect(const char *host, int port) { + socket_owner sock(new_socket()); + auto addr = address(host, port); + if (connect(sock.fd, reinterpret_cast(&addr), sizeof(addr)) != 0) { + return invalid_fd; + } + fd_t result = sock.fd; + sock.fd = invalid_fd; + return result; +} + +template bool eventually(Predicate predicate, std::chrono::milliseconds budget = 5s) { + const auto deadline = std::chrono::steady_clock::now() + budget; + do { + if (predicate()) { + return true; + } + std::this_thread::sleep_for(5ms); + } while (std::chrono::steady_clock::now() < deadline); + return predicate(); +} + +void send_bytes(fd_t fd, const void *data, size_t size) { + auto bytes = static_cast(data); + while (size != 0) { +#ifdef MSG_NOSIGNAL + const int flags = MSG_NOSIGNAL; +#else + const int flags = 0; +#endif + const auto n = send(fd, bytes, static_cast(size), flags); + require(n > 0, "wire send failed"); + bytes += n; + size -= static_cast(n); + } +} + +void recv_bytes(fd_t fd, void *data, size_t size) { + auto bytes = static_cast(data); + while (size != 0) { + const auto n = recv(fd, bytes, static_cast(size), 0); + require(n > 0, "wire receive failed or timed out"); + bytes += n; + size -= static_cast(n); + } +} + +void command(fd_t fd, uint8_t cmd, const void *payload, uint64_t size) { + // Like upstream, the protocol sends fixed-width fields in native byte order. + send_bytes(fd, &cmd, sizeof(cmd)); + send_bytes(fd, &size, sizeof(size)); + send_bytes(fd, payload, static_cast(size)); +} + +void hello(fd_t fd) { + std::array caps{}; + command(fd, 14, caps.data(), caps.size()); + uint64_t size = 0; + recv_bytes(fd, &size, sizeof(size)); + require(size == 28, "HELLO response changed: update the protocol-v8 fixture"); + std::array response{}; + recv_bytes(fd, response.data(), response.size()); + require(response[0] == 8, "expected RPC protocol v8"); +} + +void comm_init(fd_t fd, int port, bool rank_one) { + struct request { + uint32_t device, rank, world, port; + char host[64]; + } req{0, rank_one ? 1u : 0u, 2, static_cast(port), "127.0.0.1"}; + static_assert(sizeof(req) == 80, "COMM_INIT wire layout changed"); + command(fd, 20, &req, sizeof(req)); +} + +// Observe the real listener without occupying its port (a bind probe can race create_server), +// connecting a recovery peer, or adding a production test hook. Debug logs are enabled before +// the backend is initialized in this fresh subprocess. A changed log/protocol fails explicitly. +struct trace_state { + std::string peer_endpoint; + std::atomic listening{false}; + std::atomic accepted{false}; +}; + +void trace_rpc(ggml_log_level, const char *text, void *context) { + auto &state = *static_cast(context); + if (std::strstr(text, "[create_server] listening on ") && std::strstr(text, state.peer_endpoint.c_str())) { + state.listening = true; + } + if (state.listening && std::strstr(text, "[accept] accepted client connection")) { + state.accepted = true; + } +} + +class watchdog { + public: + watchdog() + : thread_([this]() { + std::unique_lock lock(mutex_); + if (!changed_.wait_for(lock, 25s, [this]() { return done_; })) { + require(false, "subprocess exceeded the 25-second safety deadline"); + } + }) {} + ~watchdog() { + { + std::lock_guard lock(mutex_); + done_ = true; + } + changed_.notify_all(); + thread_.join(); + } + + private: + std::mutex mutex_; + std::condition_variable changed_; + bool done_ = false; + std::thread thread_; +}; + +class running_server { + public: + explicit running_server(int port, const char *host = "127.0.0.1") + : worker_([this, port, host]() { + status_ = jllama_rpc_server_serve(host, port, 1, nullptr, "CPU"); + done_ = true; + }) { + require(eventually([this]() { return jllama_rpc_server_listening() || done_.load(); }), + "server startup timed out"); + require(jllama_rpc_server_listening(), "server failed to bind"); + } + ~running_server() { stop(); } + void stop(std::chrono::milliseconds budget = 5s) { + if (!worker_.joinable()) { + return; + } + std::atomic stopped{false}; + jllama_status stop_status = JLLAMA_STATUS_ERROR; + std::thread stopper([&]() { + stop_status = jllama_rpc_server_stop(); + stopped = true; + }); + require(eventually([&]() { return stopped.load() && done_.load(); }, budget), + "stop/serve exceeded its test deadline without help from a peer"); + stopper.join(); + worker_.join(); + require(stop_status == JLLAMA_STATUS_OK && status_ == JLLAMA_STATUS_OK, "stop/serve returned an error"); + require(!jllama_rpc_server_listening(), "listener flag survived stop"); + } + + private: + std::atomic done_{false}; + jllama_status status_ = JLLAMA_STATUS_ERROR; + std::thread worker_; +}; + +enum class scenario { bind_local, bind_network, no_peer, rank_zero_handshake, rank_one_handshake, established }; + +void run_scenario(scenario mode) { + init_sockets(); +#ifdef _WIN32 + _putenv_s("GGML_RPC_DEBUG", "2"); +#else + setenv("GGML_RPC_DEBUG", "2", 1); +#endif + watchdog deadline; + const int main_port = free_port(); + running_server server(main_port, mode == scenario::bind_network ? "0.0.0.0" : "127.0.0.1"); + socket_owner client(try_connect("127.0.0.1", main_port)); + require(client.fd != invalid_fd, "main connection failed"); + hello(client.fd); + const int peer_port = free_port(); + trace_state trace; + trace.peer_endpoint = ":" + std::to_string(peer_port) + "\n"; + ggml_log_set(trace_rpc, &trace); + socket_owner listener; + if (mode == scenario::rank_one_handshake) { + listener.fd = new_socket(); + auto addr = address("127.0.0.1", peer_port); + require(bind(listener.fd, reinterpret_cast(&addr), sizeof(addr)) == 0, "fake peer bind failed"); + require(listen(listener.fd, 1) == 0, "fake peer listen failed"); + } + comm_init(client.fd, peer_port, mode == scenario::rank_one_handshake); + socket_owner peer; + if (mode == scenario::rank_one_handshake) { + // select bounds accept even with the old implementation. No model is needed to reach it. + fd_set read_set; + FD_ZERO(&read_set); + FD_SET(listener.fd, &read_set); + timeval timeout{5, 0}; + require(select(static_cast(listener.fd + 1), &read_set, nullptr, nullptr, &timeout) > 0, + "rank one did not connect to the fake peer"); + peer.fd = accept(listener.fd, nullptr, nullptr); + require(peer.fd != invalid_fd, "fake peer accept failed"); + std::array caps{}; + recv_bytes(peer.fd, caps.data(), caps.size()); // server is now waiting for our caps + } else { + require(eventually([&]() { return trace.listening.load(); }), "COMM_INIT did not open its listener"); + if (mode == scenario::bind_local || mode == scenario::bind_network) { + socket_owner other(try_connect("127.0.0.2", peer_port)); + require((other.fd != invalid_fd) == (mode == scenario::bind_network), + "COMM_INIT did not preserve the configured bind address"); + } + if (mode != scenario::no_peer && mode != scenario::bind_network) { + peer.fd = try_connect("127.0.0.1", peer_port); + require(peer.fd != invalid_fd, "peer connection failed"); + require(eventually([&]() { return trace.accepted.load(); }), "server did not accept the peer"); + } + if (mode == scenario::established || mode == scenario::bind_local) { + std::array caps{}; + send_bytes(peer.fd, caps.data(), caps.size()); + recv_bytes(peer.fd, caps.data(), caps.size()); + uint64_t size = 0; + uint8_t ok = 0; + recv_bytes(client.fd, &size, sizeof(size)); + require(size == 1, "COMM_INIT response size changed"); + recv_bytes(client.fd, &ok, sizeof(ok)); + require(ok == 1, "COMM_INIT rejected a valid pair"); + } + } + server.stop(); + // No recovery peer is supplied. Stop must have closed both ports by itself. + socket_owner old_main(try_connect("127.0.0.1", main_port)); + socket_owner old_peer(try_connect("127.0.0.1", peer_port)); + require(old_main.fd == invalid_fd, "main listener survived shutdown"); + if (mode != scenario::rank_one_handshake) { + require(old_peer.fd == invalid_fd, "peer listener survived shutdown"); + } + for (int port : {main_port, peer_port}) { + if (mode == scenario::rank_one_handshake && port == peer_port) { + continue; // this listener belongs to the test, not the RPC server + } + running_server restarted(port); + socket_owner next(try_connect("127.0.0.1", port)); + require(next.fd != invalid_fd, "restart could not reuse the old port"); + hello(next.fd); + restarted.stop(); + } + ggml_log_set(nullptr, nullptr); +} + +void check_scenario(scenario mode) { + // Re-exec instead of forking a process that may have ggml worker threads from earlier tests. + ::testing::FLAGS_gtest_death_test_style = "threadsafe"; + ASSERT_EXIT( + { + run_scenario(mode); + std::_Exit(0); + }, + ::testing::ExitedWithCode(0), ""); +} + +} // namespace + +TEST(RpcComm, LocalServerDoesNotOpenAWildcardPeerListener) { + init_sockets(); + if (!can_bind("127.0.0.2", 0)) { + GTEST_SKIP() << "this host has no second loopback address; shutdown scenarios still run"; + } + check_scenario(scenario::bind_local); +} + +TEST(RpcComm, NetworkBindRemainsAnExplicitOptIn) { + init_sockets(); + if (!can_bind("127.0.0.2", 0)) { + GTEST_SKIP() << "this host has no second loopback address"; + } + check_scenario(scenario::bind_network); +} + +TEST(RpcComm, StopWithoutPeerClosesBothListenersAndAllowsRestart) { check_scenario(scenario::no_peer); } +TEST(RpcComm, StopInterruptsRankZeroCapsHandshake) { check_scenario(scenario::rank_zero_handshake); } +TEST(RpcComm, StopInterruptsRankOneCapsHandshake) { check_scenario(scenario::rank_one_handshake); } +TEST(RpcComm, SuccessfulPeerSetupStillWorksAndStops) { check_scenario(scenario::established); } diff --git a/llama/src/test/java/net/ladenthin/llama/server/NativeServerAttachIntegrationTest.java b/llama/src/test/java/net/ladenthin/llama/server/NativeServerAttachIntegrationTest.java index 6ad48eccc..40960057b 100644 --- a/llama/src/test/java/net/ladenthin/llama/server/NativeServerAttachIntegrationTest.java +++ b/llama/src/test/java/net/ladenthin/llama/server/NativeServerAttachIntegrationTest.java @@ -124,7 +124,8 @@ public void completion_overHttp_served() throws IOException { * {@code server-context.cpp} and unreachable from {@code jllama_test}, and the * {@code CommonJsonEnumTrap} C++ tests build their own JSON — they document the trap but call no * project code, so they stay green if the cast is reverted or the patch dropped. This test drives - * the real route, which {@code patches/0007}'s common route table registers in attach mode too. + * the real route, which upstream's {@code server_register_routes()} registers in attach mode too + * ({@code patches/0007}). * *

It is also the signal for dropping the patch: if upstream casts the value * themselves, this keeps passing while the patch becomes a redundant carry — which the fail-loud diff --git a/pom.xml b/pom.xml index b813bb4f1..b7a914b2a 100644 --- a/pom.xml +++ b/pom.xml @@ -234,10 +234,8 @@ SPDX-License-Identifier: MIT central true - - validated - - 21600 + + uploaded