[
  {
    "path": ".bazelignore",
    "content": ""
  },
  {
    "path": ".bazelrc",
    "content": "# Bazel settings that apply to this repository.\n# Take care to document any settings that you expect users to apply.\n# Settings that apply only to CI are in .github/workflows/ci.bazelrc\n\n# Allow DOCKER_HOST env to leak into test actions.\ntest --test_env=DOCKER_HOST\n\n# Stamp\nbuild:release --workspace_status_command=./private/stamp.bash --stamp\nrun:release --workspace_status_command=./private/stamp.bash --stamp\ntest:release --workspace_status_command=./private/stamp.bash --stamp\n\n# Allow external dependencies to be retried. debian snapshot is unreliable and needs retries.\ncommon --experimental_repository_downloader_retries=20\ncommon --experimental_downloader_config=downloader.cfg\ncommon --http_timeout_scaling=2.0\n\n# Enable platform specific options\nbuild --enable_platform_specific_config\n\n# Use a hermetic Java version\nbuild --java_runtime_version=remotejdk_11\n\n# Newer versions jdk creates collisions on /tmp\n# See: https://github.com/bazelbuild/bazel/issues/3236\n# https://github.com/GoogleContainerTools/rules_distroless/actions/runs/7118944984/job/19382981899?pr=9#step:8:51\ncommon:linux --sandbox_tmpfs_path=/tmp\n\n# Load any settings specific to the current user.\n# .bazelrc.user should appear in .gitignore so that settings are not shared with team members\n# This needs to be last statement in this\n# config, as the user configuration should be able to overwrite flags from this file.\n# See https://docs.bazel.build/versions/master/best-practices.html#bazelrc\n# (Note that we use .bazelrc.user so the file appears next to .bazelrc in directory listing,\n# rather than user.bazelrc as suggested in the Bazel docs)\ntry-import %workspace%/.bazelrc.user\n"
  },
  {
    "path": ".bazelversion",
    "content": "7.4.0"
  },
  {
    "path": ".cloudbuild/cloudbuild.yaml",
    "content": "timeout: 10800s  # 3 hours\n\noptions:\n  machineType: E2_HIGHCPU_32\n  logging: CLOUD_LOGGING_ONLY\n\nartifacts:\n  objects:\n    location: 'gs://${_ARTIFACTS_GCS_}/logs'\n    paths: ['.logs/*.log']\n\nsteps:\n  - name: gcr.io/cloud-builders/bazel@sha256:70e96d9faec4bab40a9d8d55d6b86ce2657927d8bca6bdc2dcb21a82b66dbdf7 # 5.4.0\n    env:\n      - PROJECT_ID=${PROJECT_ID}\n      - COMMIT_SHA=${COMMIT_SHA}\n      - REGISTRY=gcr.io\n      - REMOTE_CACHE_GCS=${_REMOTE_CACHE_GCS_}\n      - KEYLESS=keyless@${PROJECT_ID}.iam.gserviceaccount.com\n    entrypoint: bash\n    args: [\".cloudbuild/release.sh\"]\n"
  },
  {
    "path": ".cloudbuild/lifecycle_tag.sh",
    "content": "#!/usr/bin/env bash\nset -o errexit -o nounset -o xtrace -o pipefail\n\nBAZELISK_VERSION=\"1.27.0\"\nBAZELISK_SHA256=\"e1508323f347ad1465a887bc5d2bfb91cffc232d11e8e997b623227c6b32fb76\"\n\nGGCR_VERSION=\"0.20.7\"\nGGCR_SHA256=\"8ef3564d264e6b5ca93f7b7f5652704c4dd29d33935aff6947dd5adefd05953e\"\n\n# install gcrane\ncurl -fsSL \"https://github.com/google/go-containerregistry/releases/download/v${GGCR_VERSION}/go-containerregistry_Linux_x86_64.tar.gz\" -o ggcr.tar.gz\necho \"${GGCR_SHA256} ggcr.tar.gz\" | sha256sum --check\ntar -xzf ggcr.tar.gz gcrane\nchmod a+x gcrane\nmv gcrane /usr/bin/gcrane # needs to be on path\n\n# we need jq too\napt-get update\napt-get -y install jq\n\n# install bazelisk (TODO: there's probably a better way to do this)\ncurl -fsSL \"https://github.com/bazelbuild/bazelisk/releases/download/v${BAZELISK_VERSION}/bazelisk-linux-amd64\" -o bazelisk\necho \"${BAZELISK_SHA256} bazelisk\" | sha256sum --check\nchmod a+x bazelisk\n\necho \"common --google_default_credentials\" >> ~/.bazelrc\necho \"common --announce_rc\" >> ~/.bazelrc\n\n./bazelisk run :attach_lifecycle_tags --config=release\n"
  },
  {
    "path": ".cloudbuild/lifecycle_tag.yaml",
    "content": "timeout: 1800s # 30 minutes\n\noptions:\n  machineType: E2_MEDIUM\n  logging: CLOUD_LOGGING_ONLY\n\nsteps:\n  - name: gcr.io/cloud-builders/bazel@sha256:70e96d9faec4bab40a9d8d55d6b86ce2657927d8bca6bdc2dcb21a82b66dbdf7 # 5.4.0\n    env:\n      - PROJECT_ID=${PROJECT_ID}\n      - REGISTRY=gcr.io\n    entrypoint: bash\n    args: [\".cloudbuild/lifecycle_tag.sh\"]\n"
  },
  {
    "path": ".cloudbuild/release.sh",
    "content": "#!/usr/bin/env bash\nset -o errexit -o xtrace -o pipefail\n\nBAZEL_REMOTE_VERSION=\"2.6.1\"\nBAZEL_REMOTE_SHA256=\"025d53aeb03a7fdd4a0e76262a5ae9eeee9f64d53ca510deff1c84cf3f276784\"\nBAZELISK_VERSION=\"1.27.0\"\nBAZELISK_SHA256=\"e1508323f347ad1465a887bc5d2bfb91cffc232d11e8e997b623227c6b32fb76\"\n\n# setup remote cache\ncurl -fsSL \"https://github.com/buchgr/bazel-remote/releases/download/v${BAZEL_REMOTE_VERSION}/bazel-remote-${BAZEL_REMOTE_VERSION}-linux-amd64\" -o bazel-remote\necho \"${BAZEL_REMOTE_SHA256} bazel-remote\" | sha256sum --check\nchmod +x bazel-remote\nmkdir .logs\n./bazel-remote --max_size 8 --dir ~/.cache/bazel-remote --experimental_remote_asset_api --grpc_address 0.0.0.0:4700 --gcs_proxy.bucket $REMOTE_CACHE_GCS --gcs_proxy.use_default_credentials > .logs/bazel-remote.log 2>&1 &\n\n# install bazelisk (TODO: there's probably a better way to do this)\ncurl -fsSL \"https://github.com/bazelbuild/bazelisk/releases/download/v${BAZELISK_VERSION}/bazelisk-linux-amd64\" -o bazelisk\necho \"${BAZELISK_SHA256} bazelisk\" | sha256sum --check\nchmod a+x bazelisk\n\n# setup remote caching and remote asset API.\necho \"common --remote_cache=grpc://0.0.0.0:4700\" >> ~/.bazelrc\necho \"common --experimental_remote_downloader=grpc://0.0.0.0:4700\" >> ~/.bazelrc\necho \"common --google_default_credentials\" >> ~/.bazelrc\necho \"common --announce_rc\" >> ~/.bazelrc\n\nfor i in $(seq 5); do \n    ./bazelisk cquery 'kind(merge_providers, deps(kind(oci_image, ...)))' --output=label --config=release && break || sleep 20;\ndone\n./bazelisk run :sign_and_push --config=release -- --keyless $KEYLESS\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/actionable-debian-cve.md",
    "content": "---\nname: Actionable debian CVE\nabout: A CVE from a debian package where a fix is available\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n- [ ] I have read the [SECURITY.md](https://github.com/GoogleContainerTools/distroless/blob/main/SECURITY.md)\n- [ ] I understand that this repo tracks debian package releases and cannot fix debian CVEs on its own\n- [ ] this CVE shows a fix is available in the appropriate debian version (bookworm) and channel (main, security) *and* it has been more than 48 hours.\n\nPlease describe the image you encountered this with and a link to the debian security tracker\nhttps://security-tracker.debian.org/tracker/CVE-XXXX-YYYYY\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/actionable-non-debian-cve.md",
    "content": "---\nname: Actionable non debian CVE\nabout: A CVE is an package imported into distroless that is not from debian\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**CVE disclosure**\nA link to a public CVE disclosure\n\n**Name of image**\nThe distroless image you are using\n\n**Link to updated package**\nA link to an available update for this package\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: There is an issue with how distroless is built\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Console Output**\nIf applicable, add information from your container run\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n- package-ecosystem: \"gomod\"\n  directory: \"/\"\n  schedule:\n    interval: \"daily\"\n- package-ecosystem: \"gomod\"\n  directory: \"debian-package-manager/\"\n  schedule:\n    interval: \"daily\"\n- package-ecosystem: \"github-actions\"\n  directory: \"/\"\n  schedule:\n    interval: \"daily\"\n"
  },
  {
    "path": ".github/workflows/buildifier.yaml",
    "content": "name: Buildifier\n\non:\n  pull_request:\n    branches: [\"main\"]\n\npermissions:\n  contents: read\n\njobs:\n  autoformat:\n    name: Auto-format and Check\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Set up Go\n        uses: actions/setup-go@v6\n        with:\n          go-version: \"1.25\"\n\n      - name: Check out code\n        uses: actions/checkout@v6\n\n      - name: Install Dependencies\n        run: |\n          go install github.com/bazelbuild/buildtools/buildifier@3.2.0\n\n      - name: Run buildifier\n        run: |\n          ./knife lint --check\n"
  },
  {
    "path": ".github/workflows/check-ldconfig.yaml",
    "content": "name: Check ldconfig cache\n\non:\n  pull_request:\n    branches: [\"main\"]\n  push:\n    branches: [\"main\"]\n\npermissions:\n  contents: read\n\njobs:\n  check-ldconfig:\n    name: Check ldconfig cache up to date\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n\n      - name: Set up QEMU\n        uses: docker/setup-qemu-action@v4\n\n      - name: Check ldconfig caches\n        run: bazel test //python3:check_ldconfig_tests\n"
  },
  {
    "path": ".github/workflows/ci.bazelrc",
    "content": "build --announce_rc\nbuild --repository_cache=~/.cache/bazel-repo\n# intentionally disable build cache, it gets too big\n# build --disk_cache=~/.cache/bazel\n\ncommon --curses=no\ntest  --test_output=errors\n"
  },
  {
    "path": ".github/workflows/ci.yaml",
    "content": "name: CI\n\non:\n  workflow_dispatch: # Allow manual runs.\n  pull_request:\n    branches: [\"main\"]\n  push:\n    branches: [\"main\"]\n\npermissions:\n  contents: read\n\njobs:\n  lockfile:\n    name: Check lockfile up to date\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - name: Check lockfile\n        run: bazel mod deps --lockfile_mode=error\n\n  ci-build-test:\n    name: CI build and unit test\n    runs-on: distroless-ci-large-ubuntu-22.04\n    steps:\n      - uses: actions/checkout@v6\n      - name: Mount bazel caches\n        uses: actions/cache@v4\n        with:\n          path: |\n            ~/.cache/bazel-repo\n          key: bazel-cache-deps-ci1-${{ github.sha }}\n          restore-keys: |\n            bazel-cache-deps-ci1-${{ github.sha }}\n            bazel-cache-deps-ci1-\n\n      - name: Fetch # this can take a long time if there are a lot of errors\n        run: |\n          for i in $(seq 10); do\n            bazel --bazelrc=$GITHUB_WORKSPACE/.github/workflows/ci.bazelrc fetch //... && break || sleep 180;\n          done\n      - name: Build All Images\n        run: |\n          set -e\n          targets=$(bazel query 'kind(oci_image, deps(:sign_and_push))')\n          bazel --bazelrc=$GITHUB_WORKSPACE/.github/workflows/ci.bazelrc build $targets\n      - name: Unit Tests\n        run: bazel --bazelrc=$GITHUB_WORKSPACE/.github/workflows/ci.bazelrc test //... --build_tests_only\n      - name: Build Examples\n        run: bazel --bazelrc=$GITHUB_WORKSPACE/.github/workflows/ci.bazelrc build //examples/...\n\n  ci-images:\n    name: CI image tests\n    runs-on: distroless-ci-large-ubuntu-22.04\n    steps:\n      - uses: actions/checkout@v6\n      - name: Mount bazel caches\n        uses: actions/cache@v4\n        with:\n          path: |\n            ~/.cache/bazel-repo\n          key: bazel-cache-deps-ci2-${{ github.sha }}\n          restore-keys: |\n            bazel-cache-deps-ci2-${{ github.sha }}\n            bazel-cache-deps-ci2-\n\n      - name: Fetch\n        run: |\n          for i in $(seq 20); do\n            bazel --bazelrc=$GITHUB_WORKSPACE/.github/workflows/ci.bazelrc cquery 'attr(tags, \"amd64\", ...)' && break\n            sleep 10;\n          done\n\n      - name: Image Tests\n        run: bazel --bazelrc=$GITHUB_WORKSPACE/.github/workflows/ci.bazelrc test $(bazel query 'attr(tags, \"amd64\", ...)')\n"
  },
  {
    "path": ".github/workflows/config-diff.yaml",
    "content": "name: Config Check\n\non:\n  workflow_dispatch:\n  pull_request:\n    branches: [\"main\"]\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}\n  cancel-in-progress: true\n\npermissions:\n  pull-requests: write\n  \njobs:\n  diff:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout PR Branch\n        uses: actions/checkout@v6\n        with:\n          ref: ${{ github.event.pull_request.head.sha }}\n          path: pr_branch\n\n      - name: Build :sign_and_push.query for PR\n        run: |\n          cd pr_branch\n          bazel build :sign_and_push.query\n          cp bazel-bin/sign_and_push_query ../pr_query_output.txt\n          cd ..\n\n      - name: Checkout main Branch\n        uses: actions/checkout@v6\n        with:\n          ref: main\n          path: main_branch\n\n      - name: Build :sign_and_push.query for main\n        run: |\n          cd main_branch\n          bazel build :sign_and_push.query\n          cp bazel-bin/sign_and_push_query ../main_query_output.txt\n          cd ..\n\n      - name: Diff the query outputs\n        id: diff\n        run: |\n          # diff may exit with non-zero\n          DIFF_OUTPUT=$(diff -u <(sort main_query_output.txt) <(sort pr_query_output.txt)) || true\n          \n          if [ \"$DIFF_OUTPUT\" ]; then\n            echo \"$DIFF_OUTPUT\"\n            echo \"changed_build<<EOF\" >> $GITHUB_OUTPUT\n            echo \"$DIFF_OUTPUT\" >> $GITHUB_OUTPUT\n            echo \"EOF\" >> $GITHUB_OUTPUT\n          fi\n\n      - uses: peter-evans/find-comment@v4\n        id: fc\n        if: ${{ !github.event.pull_request.head.repo.fork }}\n        with:\n          issue-number: ${{ github.event.pull_request.number }}\n          comment-author: \"github-actions[bot]\"\n          body-includes: 🌳 🔧 Config Check\n\n      - name: Report diff\n        if: ${{ !github.event.pull_request.head.repo.fork && steps.diff.outputs.changed_build }}\n        uses: peter-evans/create-or-update-comment@v5\n        with:\n          comment-id: ${{ steps.fc.outputs.comment-id }}\n          issue-number: ${{ github.event.pull_request.number }}\n          body: |\n            🌳 🔧 Config Check\n\n            This pull request has modified the root BUILD\n\n            ```diff\n            ${{steps.diff.outputs.changed_build}}\n            ```\n          edit-mode: replace\n\n      - name: Report no diff\n        if: ${{ !github.event.pull_request.head.repo.fork && !steps.diff.outputs.changed_build }}\n        uses: peter-evans/create-or-update-comment@v5\n        with:\n          comment-id: ${{ steps.fc.outputs.comment-id }}\n          issue-number: ${{ github.event.pull_request.number }}\n          body: |\n            🌳 🔧 Config Check\n\n            This pull request has not modified the root BUILD\n          edit-mode: replace\n"
  },
  {
    "path": ".github/workflows/examples.yaml",
    "content": "name: Examples\n\non:\n  pull_request:\n    branches: [ 'main' ]\n\npermissions:\n  contents: read\n\njobs:\n  examples:\n    name: Build and run examples\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions/checkout@v6\n      - run: ./examples/test.sh\n"
  },
  {
    "path": ".github/workflows/image-check.yaml",
    "content": "name: Image Check\n\non:\n  workflow_dispatch:\n  pull_request:\n    branches: [\"main\"]\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}\n  cancel-in-progress: true\n\npermissions:\n  pull-requests: write\n\njobs:\n  diff:\n    runs-on: distroless-ci-large-ubuntu-22.04\n    steps:\n      - uses: actions/checkout@v6\n      - name: Set up Go\n        uses: actions/setup-go@v6\n        with:\n          go-version: \"1.25\"\n      - uses: actions/cache@v4\n        with:\n          path: |\n            ~/.cache/bazel-repo\n          key: bazel-cache-deps-ci2-${{ github.sha }}\n          restore-keys: |\n            bazel-cache-deps-ci2-${{ github.sha }}\n            bazel-cache-deps-ci2-\n\n      - name: Fetch\n        run: |\n          for i in $(seq 10); do\n            bazel --bazelrc=$GITHUB_WORKSPACE/.github/workflows/ci.bazelrc cquery 'attr(tags, \"amd64\", ...)' && break\n            sleep 10;\n          done\n\n      - name: Build all images\n        run: bazel build //:sign_and_push\n\n      - name: Install Deps\n        run: |\n          go install github.com/google/go-containerregistry/cmd/crane@main\n          go install github.com/reproducible-containers/diffoci/cmd/diffoci@master\n          go install filippo.io/mkcert@master\n          sudo curl -fsSL \"https://github.com/project-zot/zot/releases/download/v2.0.2-rc2/zot-linux-amd64-minimal\" > /usr/local/bin/zot\n          sudo chmod +x /usr/local/bin/zot\n\n      - name: Diff All Images\n        id: diff\n        env:\n          HEAD_REF: ${{ github.head_ref }}\n          BASE_REF: ${{ github.event.pull_request.base.ref }}\n        run: |\n          ./private/tools/diff/diff.bash \\\n            --query-bazel --registry-spawn-https \\\n            --head-ref \"$HEAD_REF\" \\\n            --base-ref \"$BASE_REF\" \\\n            --set-github-output-on-diff \\\n            --skip-image-index \\\n            --jobs $(($(nproc --all) * 2)) \\\n            --logs ./verbose.log \\\n            --report ./report.log\n\n      - uses: actions/upload-artifact@v7.0.0\n        id: report\n        with:\n          name: \"Report\"\n          path: |\n            ./verbose.log\n            ./report.log\n\n      - name: Write diff to job output for forks\n        if: ${{ github.event.pull_request.head.repo.fork && steps.diff.outputs.changed_targets }}\n        env:\n          CHANGED: ${{ steps.diff.outputs.changed_targets }}\n        run: |\n          echo \"This pull request has modified the following images:\"\n          echo \"$CHANGED\"\n\n      - uses: peter-evans/find-comment@v4\n        id: fc\n        if: ${{ !github.event.pull_request.head.repo.fork }}\n        with:\n          issue-number: ${{ github.event.pull_request.number }}\n          comment-author: \"github-actions[bot]\"\n          body-includes: 🌳 🔄 Image Check\n\n      - name: Report diff\n        if: ${{ !github.event.pull_request.head.repo.fork && steps.diff.outputs.changed_targets }}\n        uses: peter-evans/create-or-update-comment@v5\n        with:\n          comment-id: ${{ steps.fc.outputs.comment-id }}\n          issue-number: ${{ github.event.pull_request.number }}\n          body: |\n            🌳 🔄 Image Check\n\n            This pull request has modified the following images:\n\n            ```starlark\n            ${{steps.diff.outputs.changed_targets}}\n            ```\n\n            You can check the details in the report [here](${{steps.report.outputs.artifact-url}})\n          edit-mode: replace\n\n      - name: Report no diff\n        if: ${{ !github.event.pull_request.head.repo.fork && !steps.diff.outputs.changed_targets }}\n        uses: peter-evans/create-or-update-comment@v5\n        with:\n          comment-id: ${{ steps.fc.outputs.comment-id }}\n          issue-number: ${{ github.event.pull_request.number }}\n          body: |\n            🌳 🔄 Image Check\n            This pull request doesn't make any changes to the images. 👍\n            You can check the details in the report [here](${{steps.report.outputs.artifact-url}})\n          edit-mode: replace\n"
  },
  {
    "path": ".github/workflows/scorecards-analysis.yml",
    "content": "name: Scorecards supply-chain security\non: \n  # Only the default branch is supported.\n  branch_protection_rule:\n  schedule:\n    - cron: '38 10 * * 1'\n  push:\n    branches: [ main ]\n\n# Declare default permissions as read only.\npermissions: read-all\n\njobs:\n  analysis:\n    name: Scorecards analysis\n    runs-on: ubuntu-latest\n    permissions:\n      # Needed to upload the results to code-scanning dashboard.\n      security-events: write\n      id-token: write\n    \n    steps:\n      - name: \"Checkout code\"\n        uses: actions/checkout@v6\n        with:\n          persist-credentials: false\n\n      - name: \"Run analysis\"\n        uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3\n        with:\n          results_file: results.sarif\n          results_format: sarif\n          # Read-only PAT token.\n          repo_token: ${{ secrets.SCORECARD_TOKEN }}\n          # Publish the results to enable scorecard badges. For more details, see\n          # https://github.com/ossf/scorecard-action#publishing-results.\n          publish_results: true\n\n      # Upload the results as artifacts (optional).\n      - name: \"Upload artifact\"\n        uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0\n        with:\n          name: SARIF file\n          path: results.sarif\n          retention-days: 5\n      \n      # Upload the results to GitHub's code scanning dashboard.\n      - name: \"Upload to code-scanning\"\n        uses: github/codeql-action/upload-sarif@0d579ffd059c29b07949a3cce3983f0780820c98 # v4.32.6\n        with:\n          sarif_file: results.sarif\n"
  },
  {
    "path": ".github/workflows/update-deb-package-non-snapshots.yml",
    "content": "name: update-non-snapshots\non:\n  # will send emails to last editor of this cron syntax (distroless-bot)\n  schedule:\n    - cron: \"35 20 * * *\"\n  # allow this workflow to be manually run\n  workflow_dispatch:\n\npermissions:\n  contents: read\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n\n    steps:\n      - uses: actions/checkout@v6\n\n      - name: Update non-snapshots\n        run: ./knife update-non-snapshots\n\n      - name: Check for changes\n        run: |\n          git status\n          if [[ $(git status --porcelain) ]]; then \n            echo \"DISTROLESS_DIFF=true\" >> \"$GITHUB_ENV\"\n          else\n            echo \"No changes detected\"\n            exit 0\n          fi\n\n      - name: Run update lockfile\n        if: env.DISTROLESS_DIFF\n        run: bazel mod deps --lockfile_mode=update\n\n      - name: Create commits\n        if: env.DISTROLESS_DIFF\n        id: create-commits\n        run: |\n          git checkout -b update-non-snapshots\n\n          # Set identity.\n          git config --global user.email \"distroless-bot@google.com\"\n          git config --global user.name \"Distroless Bot\"\n\n          # Commit changes\n          git add .\n          git commit -s -m \"Bumping non-snapshot packages to latest stable versions\"\n          git push --force origin HEAD\n\n      - name: Create Pull Request\n        if: env.DISTROLESS_DIFF\n        env:\n          GH_TOKEN: ${{ secrets.ACTIONS_TOKEN }}\n        run: |\n          BODY_FILE=$(mktemp)\n          printf \"Bumping non-snapshot packages to latest stable version\\n\" >> $BODY_FILE\n          if ! OUTPUT=$(gh pr create -B main -H update-non-snapshots -t \"Bumping non-snapshot packages to latest stable versions\" --body-file \"$BODY_FILE\" 2>&1) ; then\n            echo $OUTPUT\n            if [[ \"${OUTPUT}\" =~ \"already exists\" ]]; then\n              echo \"PR already exists and it was updated. Ending successfully\";\n              exit 0;\n            else\n              exit 1;\n            fi\n          fi\n"
  },
  {
    "path": ".github/workflows/update-deb-package-snapshots.yml",
    "content": "name: update-snapshots\non:\n  # will send emails to last editor of this cron syntax (distroless-bot)\n  schedule:\n    - cron: \"35 20 * * *\"\n  # allow this workflow to be manually run\n  workflow_dispatch:\n\npermissions:\n  contents: read\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-go@v6\n        with:\n          go-version: \"1.25\"\n\n      - name: Update snapshots\n        run: ./knife github-update-snapshots\n\n      - name: Set up QEMU\n        if: env.DISTROLESS_DIFF\n        uses: docker/setup-qemu-action@v4\n\n      - name: Update ldconfig\n        if: env.DISTROLESS_DIFF\n        run: bazel run //python3:update_ldconfig\n\n      - name: Run update sboms script\n        if: env.DISTROLESS_DIFF\n        run: |\n          for i in $(seq 5); do\n            bazel --bazelrc=$GITHUB_WORKSPACE/.github/workflows/ci.bazelrc fetch //private/pkg/test/oci_image:test_sboms && break || sleep 20;\n          done\n          bazel run @//private/pkg/test/oci_image:test_sboms\n\n      - name: Run update lockfile\n        if: env.DISTROLESS_DIFF\n        run: bazel mod deps --lockfile_mode=update\n\n      - name: Create commits\n        if: env.DISTROLESS_DIFF\n        id: create-commits\n        run: |\n          git checkout -b update-snapshots\n\n          # Set identity.\n          git config --global user.email \"distroless-bot@google.com\"\n          git config --global user.name \"Distroless Bot\"\n\n          # Commit changes\n          git add .\n          git commit -s -m \"Bumping packages to latest stable versions\"\n          git push --force origin HEAD\n\n      - name: Create Pull Request\n        if: env.DISTROLESS_DIFF\n        env:\n          GH_TOKEN: ${{ secrets.ACTIONS_TOKEN }}\n        run: |\n          BODY_FILE=$(mktemp)\n          printf \"Bumping packages to latest stable version\\n\\`\\`\\`diff\\n$DISTROLESS_DIFF\\n\\`\\`\\`\\n\" >> $BODY_FILE\n          if ! OUTPUT=$(gh pr create -B main -H update-snapshots -t \"Bumping packages to latest stable versions\" --body-file \"$BODY_FILE\" 2>&1) ; then\n            echo $OUTPUT\n            if [[ \"${OUTPUT}\" =~ \"already exists\" ]]; then\n              echo \"PR already exists and it was updated. Ending successfully\";\n              exit 0;\n            else\n              exit 1;\n            fi\n          fi\n"
  },
  {
    "path": ".github/workflows/update-node-archives.yml",
    "content": "name: update-node-packages\non:\n  # will send emails to last editor of this cron syntax (distroless-bot)\n  schedule:\n    - cron: \"30 20 * * *\"\n  # allow this workflow to be manually run\n  workflow_dispatch:\n\npermissions:\n  contents: read\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-node@v6\n\n      - name: Update node archives\n        run: ./knife update-node-archives\n\n      - name: Check for changes\n        run: |\n          git status\n          if [[ $(git status --porcelain) ]]; then\n            echo \"DISTROLESS_DIFF=true\" >> \"$GITHUB_ENV\"\n          else\n            echo \"No changes detected\"\n            exit 0\n          fi\n\n      - name: Run update lockfile\n        if: env.DISTROLESS_DIFF\n        run: bazel mod deps --lockfile_mode=update\n\n      - name: Create commits\n        if: env.DISTROLESS_DIFF\n        run: |\n          git checkout -b update-node-archives\n\n          # Set identity.\n          git config --global user.email \"distroless-bot@google.com\"\n          git config --global user.name \"Distroless Bot\"\n\n          # Commit changes\n          git add .\n          git commit -s -m \"Bumping node archives to latest stable versions\"\n          git push --force origin HEAD\n\n      - name: Create Pull Request\n        if: env.DISTROLESS_DIFF\n        env:\n          GH_TOKEN: ${{ secrets.ACTIONS_TOKEN }}\n        run: |\n          BODY_FILE=$(mktemp)\n          if ! OUTPUT=$(gh pr create -B main -H update-node-archives --fill 2>&1) ; then\n            echo $OUTPUT\n            if [[ \"${OUTPUT}\" =~ \"already exists\" ]]; then\n              echo \"PR already exists and it was updated. Ending successfully\";\n              exit 0;\n            else\n              exit 1;\n            fi\n          fi\n"
  },
  {
    "path": ".gitignore",
    "content": "# Ignore backup files.\n*~\n# Ignore Vim swap files.\n.*.swp\n# Ignore files generated by IDEs.\n/.classpath\n/.factorypath\n.idea/\n*.iml\n/.project\n/.settings\n/bazel.iml\n# Ignore all bazel-* symlinks. There is no full list since this can change\n# based on the name of the directory bazel is cloned into.\n/bazel-*\n# Ignore outputs generated during Bazel bootstrapping.\n/output/\n# ignore user bazelrc\n.bazelrc.user\n*.log"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "# See CONTRIBUTING.md for instructions.\n# See https://pre-commit.com for more information\n# See https://pre-commit.com/hooks.html for more hooks\n\n# Commitizen runs in commit-msg stage\n# but we don't want to run the other hooks on commit messages\ndefault_stages: [commit]\n\n# Use a slightly older version of node by default\n# as the default uses a very new version of GLIBC\ndefault_language_version:\n  node: 16.18.0\n\nrepos:\n  # Check formatting and lint for starlark code\n  - repo: https://github.com/keith/pre-commit-buildifier\n    rev: 6.1.0.1\n    hooks:\n      - id: buildifier\n      - id: buildifier-lint\n  # Enforce that commit messages allow for later changelog generation\n  - repo: https://github.com/commitizen-tools/commitizen\n    rev: v2.18.0\n    hooks:\n      # Requires that commitizen is already installed\n      - id: commitizen\n        stages: [commit-msg]\n  - repo: https://github.com/pre-commit/mirrors-prettier\n    rev: \"v2.4.0\"\n    hooks:\n      - id: prettier\n"
  },
  {
    "path": ".prettierignore",
    "content": "private/pkg/test/oci_image/*"
  },
  {
    "path": "BUILD",
    "content": "load(\"//base:config.bzl\", \"BASE_ARCHITECTURES\", \"BASE_DISTROS\")\nload(\"//cc:config.bzl\", \"CC_ARCHITECTURES\", \"CC_DISTROS\")\nload(\"//java:config.bzl\", \"JAVA_ARCHITECTURES\", \"JAVA_DISTROS\", \"JAVA_MAJOR_VERSIONS\")\nload(\"//nodejs:config.bzl\", \"NODEJS_ARCHITECTURES\", \"NODEJS_DISTROS\", \"NODEJS_MAJOR_VERSIONS\")\nload(\"//private/oci:defs.bzl\", \"sign_and_push_all\")\nload(\"//private/tools/lifecycle:defs.bzl\", \"attach_lifecycle_tags\")\nload(\"//python3:config.bzl\", \"PYTHON_ARCHITECTURES\", \"PYTHON_DISTROS\")\nload(\"//static:config.bzl\", \"STATIC_ARCHITECTURES\", \"STATIC_DISTROS\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nDEFAULT_DISTRO = \"debian13\"\n\nVARIANTS = [\n    (\"latest\", \"\", \"root\"),\n    (\"nonroot\", \"\", \"nonroot\"),\n    (\"debug\", \"_debug\", \"root\"),\n    (\"debug-nonroot\", \"_debug\", \"nonroot\"),\n]\n\n###############\n# STATIC      #\n###############\nSTATIC = {\n    \"{REGISTRY}/{PROJECT_ID}/static:\" + tag_base + \"-\" + arch: \"//static:static\" + debug_mode + \"_\" + user + \"_\" + arch + \"_\" + DEFAULT_DISTRO\n    for arch in STATIC_ARCHITECTURES[DEFAULT_DISTRO]\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\n# oci_image_index\nSTATIC |= {\n    \"{REGISTRY}/{PROJECT_ID}/static:\" + tag_base: \"//static:static\" + debug_mode + \"_\" + user + \"_\" + DEFAULT_DISTRO\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\nSTATIC |= {\n    \"{REGISTRY}/{PROJECT_ID}/static-\" + distro + \":\" + tag_base + \"-\" + arch: \"//static:static\" + debug_mode + \"_\" + user + \"_\" + arch + \"_\" + distro\n    for (tag_base, debug_mode, user) in VARIANTS\n    for distro in STATIC_DISTROS\n    for arch in STATIC_ARCHITECTURES[distro]\n}\n\n# oci_image_index\nSTATIC |= {\n    \"{REGISTRY}/{PROJECT_ID}/static-\" + distro + \":\" + tag_base: \"//static:static\" + debug_mode + \"_\" + user + \"_\" + distro\n    for (tag_base, debug_mode, user) in VARIANTS\n    for distro in STATIC_DISTROS\n}\n\n###############\n# BASE        #\n###############\nBASE = {\n    \"{REGISTRY}/{PROJECT_ID}/base:\" + tag_base + \"-\" + arch: \"//base:base\" + debug_mode + \"_\" + user + \"_\" + arch + \"_\" + DEFAULT_DISTRO\n    for arch in BASE_ARCHITECTURES[DEFAULT_DISTRO]\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\n# oci_image_index\nBASE |= {\n    \"{REGISTRY}/{PROJECT_ID}/base:\" + tag_base: \"//base:base\" + debug_mode + \"_\" + user + \"_\" + DEFAULT_DISTRO\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\nBASE |= {\n    \"{REGISTRY}/{PROJECT_ID}/base-\" + distro + \":\" + tag_base + \"-\" + arch: \"//base:base\" + debug_mode + \"_\" + user + \"_\" + arch + \"_\" + distro\n    for distro in BASE_DISTROS\n    for arch in BASE_ARCHITECTURES[distro]\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\n# oci_image_index\nBASE |= {\n    \"{REGISTRY}/{PROJECT_ID}/base-\" + distro + \":\" + tag_base: \"//base:base\" + debug_mode + \"_\" + user + \"_\" + distro\n    for (tag_base, debug_mode, user) in VARIANTS\n    for distro in BASE_DISTROS\n}\n\n###############\n# BASE_NOSSL  #\n###############\nBASE_NOSSL = {\n    \"{REGISTRY}/{PROJECT_ID}/base-nossl:\" + tag_base + \"-\" + arch: \"//base:base_nossl\" + debug_mode + \"_\" + user + \"_\" + arch + \"_\" + DEFAULT_DISTRO\n    for arch in BASE_ARCHITECTURES[DEFAULT_DISTRO]\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\n# oci_image_index\nBASE_NOSSL |= {\n    \"{REGISTRY}/{PROJECT_ID}/base-nossl:\" + tag_base: \"//base:base_nossl\" + debug_mode + \"_\" + user + \"_\" + DEFAULT_DISTRO\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\nBASE_NOSSL |= {\n    \"{REGISTRY}/{PROJECT_ID}/base-nossl-\" + distro + \":\" + tag_base + \"-\" + arch: \"//base:base_nossl\" + debug_mode + \"_\" + user + \"_\" + arch + \"_\" + distro\n    for (tag_base, debug_mode, user) in VARIANTS\n    for distro in BASE_DISTROS\n    for arch in BASE_ARCHITECTURES[distro]\n}\n\n# oci_image_index\nBASE_NOSSL |= {\n    \"{REGISTRY}/{PROJECT_ID}/base-nossl-\" + distro + \":\" + tag_base: \"//base:base_nossl\" + debug_mode + \"_\" + user + \"_\" + distro\n    for (tag_base, debug_mode, user) in VARIANTS\n    for distro in BASE_DISTROS\n}\n\n###############\n# CC          #\n###############\nCC = {\n    \"{REGISTRY}/{PROJECT_ID}/cc:\" + tag_base + \"-\" + arch: \"//cc:cc\" + debug_mode + \"_\" + user + \"_\" + arch + \"_\" + DEFAULT_DISTRO\n    for arch in CC_ARCHITECTURES[DEFAULT_DISTRO]\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\n# oci_image_index\nCC |= {\n    \"{REGISTRY}/{PROJECT_ID}/cc:\" + tag_base: \"//cc:cc\" + debug_mode + \"_\" + user + \"_\" + DEFAULT_DISTRO\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\nCC |= {\n    \"{REGISTRY}/{PROJECT_ID}/cc-\" + distro + \":\" + tag_base + \"-\" + arch: \"//cc:cc\" + debug_mode + \"_\" + user + \"_\" + arch + \"_\" + distro\n    for (tag_base, debug_mode, user) in VARIANTS\n    for distro in CC_DISTROS\n    for arch in CC_ARCHITECTURES[distro]\n}\n\n# oci_image_index\nCC |= {\n    \"{REGISTRY}/{PROJECT_ID}/cc-\" + distro + \":\" + tag_base: \"//cc:cc\" + debug_mode + \"_\" + user + \"_\" + distro\n    for (tag_base, debug_mode, user) in VARIANTS\n    for distro in CC_DISTROS\n}\n\n###############\n# PYTHON 3    #\n###############\nPYTHON3 = {\n    \"{REGISTRY}/{PROJECT_ID}/python3:\" + tag_base + \"-\" + arch: \"//python3:python3\" + debug_mode + \"_\" + user + \"_\" + arch + \"_\" + DEFAULT_DISTRO\n    for arch in PYTHON_ARCHITECTURES[DEFAULT_DISTRO]\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\n# oci_image_index\nPYTHON3 |= {\n    \"{REGISTRY}/{PROJECT_ID}/python3:\" + tag_base: \"//python3:python3\" + debug_mode + \"_\" + user + \"_\" + DEFAULT_DISTRO\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\nPYTHON3 |= {\n    \"{REGISTRY}/{PROJECT_ID}/python3-\" + distro + \":\" + tag_base + \"-\" + arch: \"//python3:python3\" + debug_mode + \"_\" + user + \"_\" + arch + \"_\" + distro\n    for distro in PYTHON_DISTROS\n    for arch in PYTHON_ARCHITECTURES[distro]\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\n# oci_image_index\nPYTHON3 |= {\n    \"{REGISTRY}/{PROJECT_ID}/python3-\" + distro + \":\" + tag_base: \"//python3:python3\" + debug_mode + \"_\" + user + \"_\" + distro\n    for distro in PYTHON_DISTROS\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\n###############\n# NODEJS      #\n###############\nNODEJS = {\n    \"{REGISTRY}/{PROJECT_ID}/nodejs\" + version + \"-\" + distro + \":\" + tag_base + \"-\" + arch: \"//nodejs:nodejs\" + version + debug_mode + \"_\" + user + \"_\" + arch + \"_\" + distro\n    for version in NODEJS_MAJOR_VERSIONS\n    for distro in NODEJS_DISTROS\n    for arch in NODEJS_ARCHITECTURES[distro][version]\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\n# oci_image_index\nNODEJS |= {\n    \"{REGISTRY}/{PROJECT_ID}/nodejs\" + version + \"-\" + distro + \":\" + tag_base: \"//nodejs:nodejs\" + version + debug_mode + \"_\" + user + \"_\" + distro\n    for version in NODEJS_MAJOR_VERSIONS\n    for distro in NODEJS_DISTROS\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\nNODEJS |= {\n    \"{REGISTRY}/{PROJECT_ID}/nodejs\" + version + \":\" + tag_base + \"-\" + arch: \"//nodejs:nodejs\" + version + debug_mode + \"_\" + user + \"_\" + arch + \"_\" + DEFAULT_DISTRO\n    for version in NODEJS_MAJOR_VERSIONS\n    for arch in NODEJS_ARCHITECTURES[DEFAULT_DISTRO][version]\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\n# oci_image_index\nNODEJS |= {\n    \"{REGISTRY}/{PROJECT_ID}/nodejs\" + version + \":\" + tag_base: \"//nodejs:nodejs\" + version + debug_mode + \"_\" + user + \"_\" + DEFAULT_DISTRO\n    for version in NODEJS_MAJOR_VERSIONS\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\n###############\n# JAVA_BASE   #\n###############\nJAVA_BASE = {\n    \"{REGISTRY}/{PROJECT_ID}/java-base:\" + tag_base + \"-\" + arch: \"//java:java_base\" + debug_mode + \"_\" + user + \"_\" + arch + \"_\" + DEFAULT_DISTRO\n    for arch in JAVA_ARCHITECTURES[DEFAULT_DISTRO]\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\nJAVA_BASE |= {\n    \"{REGISTRY}/{PROJECT_ID}/java-base:\" + tag_base: \"//java:java_base\" + debug_mode + \"_\" + user + \"_\" + DEFAULT_DISTRO\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\nJAVA_BASE |= {\n    \"{REGISTRY}/{PROJECT_ID}/java-base-\" + distro + \":\" + tag_base + \"-\" + arch: \"//java:java_base\" + debug_mode + \"_\" + user + \"_\" + arch + \"_\" + distro\n    for distro in JAVA_DISTROS\n    for arch in JAVA_ARCHITECTURES[distro]\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\nJAVA_BASE |= {\n    \"{REGISTRY}/{PROJECT_ID}/java-base-\" + distro + \":\" + tag_base: \"//java:java_base\" + debug_mode + \"_\" + user + \"_\" + distro\n    for (tag_base, debug_mode, user) in VARIANTS\n    for distro in JAVA_DISTROS\n}\n\n###############\n# JAVA        #\n###############\nJAVA = {\n    \"{REGISTRY}/{PROJECT_ID}/java\" + version + \":\" + tag_base + \"-\" + arch: \"//java:java\" + version + debug_mode + \"_\" + user + \"_\" + arch + \"_\" + DEFAULT_DISTRO\n    for version in JAVA_MAJOR_VERSIONS[DEFAULT_DISTRO]\n    for arch in JAVA_ARCHITECTURES[DEFAULT_DISTRO]\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\n# oci_image_index\nJAVA |= {\n    \"{REGISTRY}/{PROJECT_ID}/java\" + version + \":\" + tag_base: \"//java:java\" + version + debug_mode + \"_\" + user + \"_\" + DEFAULT_DISTRO\n    for version in JAVA_MAJOR_VERSIONS[DEFAULT_DISTRO]\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\nJAVA |= {\n    \"{REGISTRY}/{PROJECT_ID}/java\" + version + \"-\" + distro + \":\" + tag_base + \"-\" + arch: \"//java:java\" + version + debug_mode + \"_\" + user + \"_\" + arch + \"_\" + distro\n    for distro in JAVA_DISTROS\n    for version in JAVA_MAJOR_VERSIONS[distro]\n    for arch in JAVA_ARCHITECTURES[distro]\n    for (tag_base, debug_mode, user) in VARIANTS\n}\n\n# oci_image_index\nJAVA |= {\n    \"{REGISTRY}/{PROJECT_ID}/java\" + version + \"-\" + distro + \":\" + tag_base: \"//java:java\" + version + debug_mode + \"_\" + user + \"_\" + distro\n    for (tag_base, debug_mode, user) in VARIANTS\n    for distro in JAVA_DISTROS\n    for version in JAVA_MAJOR_VERSIONS[distro]\n}\n\nALL = {}\n\nALL |= STATIC\n\nALL |= BASE\n\nALL |= BASE_NOSSL\n\nALL |= CC\n\nALL |= PYTHON3\n\nALL |= NODEJS\n\nALL |= JAVA_BASE\n\nALL |= JAVA\n\n# create additional tags by appending COMMIT_SHA to all tags\n# remove \"latest\" if they contain it (this is brittle if we make funky changes):\n# - image:latest -> image:{COMMIT_SHA}\n# - image:latest-xyz -> image:xyz-{COMMIT_SHA}\nCOMMIT_SUFFIXED_TAGS = {\n    (image_ref.replace(\"latest\", \"\") + \"-{COMMIT_SHA}\").replace(\":-\", \":\"): build_target\n    for (image_ref, build_target) in ALL.items()\n}\n\nALL |= COMMIT_SUFFIXED_TAGS\n\nsign_and_push_all(\n    name = \"sign_and_push\",\n    images = ALL,\n)\n\nattach_lifecycle_tags(\n    name = \"attach_lifecycle_tags\",\n    images = ALL,\n)\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# How to become a contributor and submit your own code\n\n## Contributor License Agreements\n\nWe'd love to accept your patches! Before we can take them, we have to jump a couple of legal hurdles.\n\nPlease fill out either the individual or corporate [Contributor License Agreement (CLA)](https://cla.developers.google.com/about).\n\n- If you are an individual writing original source code and you're sure you own the intellectual property, then you'll need to sign an [individual CLA](https://cla.developers.google.com/about/google-individual).\n- If you work for a company that wants to allow you to contribute your work, then you'll need to sign a [corporate CLA](https://cla.developers.google.com/about/google-corporate).\n\nFollow either of the two links above to access the appropriate CLA and instructions for how to sign and return it. Once we receive it, we'll be able to accept your pull requests.\n\n## How to Build and Test\n\n1. `bazel build //...` to build the whole project or ex:`bazel build //base:static_root_amd64_debian17` for a single image\n\n2. For running tests, check `./knife test`. (`bazel test //...` will NOT run all tests, as many tests are marked \"manual\".)\n\n3. For building and loading images to your local Docker engine, you need to add a new rule for that image to the BUILD:\n\n```starlark\nload(\"@rules_oci//oci:defs.bzl\", \"oci_load\")\n\noci_load(\n  name = \"local_build\",\n  image = \"//base:static_root_amd64_debian17\",\n  repo_tags = [],\n)\n```\n\nthen run the following command to load into the daemon\n\n```shell\nbazel run //:local_build\n```\n\n## Adding or removing Debian packages\n\nWhenever a change made to `common/*.yaml` manifests, the locking step has to be performed to regenerate lock files.\n\nThis can be done by running; `./knife lock`\n\n## Code style\n\nFor styling Bazel files, install and run `buildifier` with:\n\n```shell\n# Install buildifier version 3.2.0\ngo install github.com/bazelbuild/buildtools/buildifier@latest\n\n# This will automatically fix files.\nbuildifier -mode=fix $(find . -name 'BUILD*' -o -name 'WORKSPACE*' -o -name '*.bzl' -type f)\n```\n\nFor styling Python files, [install](https://www.pylint.org/#install) and run `pylint` with:\n\n```shell\n# Install pylint\nsudo pip install pylint\n# Or\nsudo apt-get install pylint\n# Or on macos\nbrew install pylint\n\n# Identify python style issues.\nfind . -name \"*.py\" | xargs pylint --disable=R,C\n```\n\n## Contributing a Patch\n\n1. Submit an issue describing your proposed change to the repo in question.\n1. The repo owner will respond to your issue promptly.\n1. If your proposed change is accepted, and you haven't already done so, sign a Contributor License Agreement (see details above).\n1. Fork the desired repo, develop and test your code changes.\n1. Submit a pull request.\n"
  },
  {
    "path": "LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "MODULE.bazel",
    "content": "\"distroless\"\n\nmodule(name = \"distroless\")\n\nbazel_dep(name = \"bazel_skylib\", version = \"1.8.2\")\nbazel_dep(name = \"aspect_bazel_lib\", version = \"2.21.1\")\nbazel_dep(name = \"rules_pkg\", version = \"1.1.0\")\nbazel_dep(name = \"platforms\", version = \"1.0.0\")\nbazel_dep(name = \"rules_go\", version = \"0.57.0\")\nbazel_dep(name = \"gazelle\", version = \"0.38.0\")\nbazel_dep(name = \"rules_rust\", version = \"0.63.0\")\nbazel_dep(name = \"container_structure_test\", version = \"1.19.1\")\nbazel_dep(name = \"rules_oci\", version = \"2.2.7\")\nbazel_dep(name = \"rules_distroless\", version = \"0.6.2\")\nbazel_dep(name = \"rules_python\", version = \"1.5.3\")\nbazel_dep(name = \"rules_cc\", version = \"0.2.4\")\n\n### OCI ###\n# Note: rules_oci registers toolchains in its MODULE.bazel\n# We import the repos to use crane in sign_and_push rule\noci = use_extension(\"@rules_oci//oci:extensions.bzl\", \"oci\")\nuse_repo(oci, \"oci_crane_toolchains\")\n\n### PYTHON ###\npython = use_extension(\"@rules_python//python/extensions:python.bzl\", \"python\")\npython.toolchain(\n    ignore_root_user_error = True,\n    python_version = \"3.11\",\n)\n\n### GO ####\ngo_deps = use_extension(\"@gazelle//:extensions.bzl\", \"go_deps\")\ngo_deps.module(\n    path = \"github.com/spdx/tools-golang\",\n    sum = \"h1:9B623Cfs+mclYK6dsae7gLSwuIBHvlgmEup87qpqsAQ=\",\n    version = \"v0.3.1-0.20230104082527-d6f58551be3f\",\n)\nuse_repo(go_deps, \"com_github_spdx_tools_golang\")\n\n### BUSYBOX ###\nbusybox = use_extension(\"//private/extensions:busybox.bzl\", \"busybox\")\nbusybox.archive()\nuse_repo(busybox, \"busybox_amd64\", \"busybox_arm\", \"busybox_arm64\", \"busybox_ppc64le\", \"busybox_riscv64\", \"busybox_s390x\")\n\n### JAVA ###\n\n### NODE ###\nnode = use_extension(\"//private/extensions:node.bzl\", \"node\")\nnode.archive()\nuse_repo(node, \"nodejs20_amd64\", \"nodejs20_arm\", \"nodejs20_arm64\", \"nodejs20_ppc64le\", \"nodejs20_s390x\", \"nodejs22_amd64\", \"nodejs22_arm\", \"nodejs22_arm64\", \"nodejs22_ppc64le\", \"nodejs22_s390x\", \"nodejs24_amd64\", \"nodejs24_arm64\", \"nodejs24_ppc64le\", \"nodejs24_s390x\")\n\n### DEBIAN ###\ninclude(\"//private/repos/deb:deb.MODULE.bazel\")\n"
  },
  {
    "path": "PACKAGE_METADATA.md",
    "content": "# Package Metadata\n\n## `dpkg` Metadata Structure Standard\n\n### Overview\n\nThis document defines the standard structure for `dpkg` metadata within Google Distroless Debian-based images. The goal is to provide a clear specification for tool authors and users, enabling consistent and accurate results for vulnerability (CVE) scanning and package analysis.\n\n### Directory Structure\n\nDistroless Debian images differ from traditional Debian images in their handling of `dpkg` metadata. The relevant structure is as follows:\n\n```\n/var/lib/dpkg/\n    └── status.d/\n                ├── <package>\n                └── <package>.md5sums\n```\n\n### Details\n\n- **`/var/lib/dpkg/status.d/`**  \n    - Contains one file per installed package.\n    - Each file is named after the package (e.g., `libc6`, `libssl1.1`).\n\n- **`/var/lib/dpkg/status.d/<package>`**  \n    - Contains package metadata, equivalent to the output of:  \n        ```\n        dpkg-deb --field <package>.deb > /var/lib/dpkg/status.d/<package>\n        ```\n\n- **`/var/lib/dpkg/status.d/<package>.md5sums`**  \n    - Contains file checksums, equivalent to the output of:  \n        ```\n        dpkg-deb --control <package>.deb CONTROL\n        cp CONTROL/md5sums /var/lib/dpkg/status.d/<package>.md5sums\n        rm -rf CONTROL\n        ```\n\n### Omitted Files\n\nDistroless images intentionally omit several files found in standard Debian images:\n\n- `/var/lib/dpkg/status`  \n    - **Not present.** Replaced by the `status.d` directory.\n\n- `/var/lib/dpkg/info/<package>.list`  \n    - **Not present.** File lists can be inferred from the `.md5sums` files.\n\n- `/var/lib/dpkg/info/<package>.md5sums`  \n    - **Not present.** Checksums are stored in `status.d/<package>.md5sums`.\n\n- Other `/var/lib/dpkg/info/<package>.*` files  \n    - **Not present.** Not required for CVE scanning.\n\n### Rationale\n\n- **CVE Scanning Compatibility:**  \n    The provided metadata is sufficient for most vulnerability scanners to identify installed packages and their versions.\n\n- **Avoiding Conflicts:**  \n    Using the `status.d` directory exclusively prevents confusion or potential issues that could arise if files conflicted with default `dpkg` folders. This approach ensures compatibility, especially if `dpkg` is used directly within the image.\n\n### Guidance for Tool Authors\n\n- Scan `/var/lib/dpkg/status.d/` for installed package metadata.\n- Use `<package>` files for package details.\n- Use `<package>.md5sums` for file checksums and file lists.\n- Do not expect `/var/lib/dpkg/status` or `/var/lib/dpkg/info/` files.\n\n## Non-debian packages\nTODO\n"
  },
  {
    "path": "README.md",
    "content": "# \"Distroless\" Container Images.\n\n[![CI Build Status](https://github.com/GoogleContainerTools/distroless/actions/workflows/ci.yaml/badge.svg)](https://github.com/GoogleContainerTools/distroless/actions/workflows/ci.yaml)\n\n\"Distroless\" images contain only your application and its runtime dependencies.\nThey do not contain package managers, shells or any other programs you would expect to find in a standard Linux distribution.\n\nFor more information, see this [talk](https://swampup2017.sched.com/event/A6CW/distroless-docker-containerizing-apps-not-vms?iframe=no&w=100%&sidebar=yes&bg=no) ([video](https://www.youtube.com/watch?v=lviLZFciDv4)).\n\n## Why should I use distroless images?\n\nRestricting what's in your runtime container to precisely what's necessary for your app is a best practice employed by Google\nand other tech giants that have used containers in production for many years.\nIt improves the signal to noise of scanners (e.g. CVE) and reduces the burden of establishing provenance to just what you need.\n\nDistroless images are _very small_.\nThe smallest distroless image, `gcr.io/distroless/static-debian12`, is around 2 MiB.\nThat's about 50% of the size of `alpine` (~5 MiB), and less than 2% of the size of `debian` (124 MiB).\n\n## How do I use distroless images?\n\nThese images are built using [bazel](https://bazel.build), but they can also be used through other Docker image build tooling.\n\n### What images are available?\n\nThe following images are currently published and updated by the distroless project (see [SUPPORT_POLICY.md](SUPPORT_POLICY.md) for support timelines)\n\nThese images refer to image indexes with references to all supported architectures. Architecture specific images can be directly referenced using an additional architecture suffix on the tag, like `gcr.io/distroless/static-debian12:latest-amd64`\n\nAny other tags are considered deprecated and are no longer updated\n\n#### Debian 12\n\n| Image                                 | Tags                                  | Architecture Suffixes             |\n| ------------------------------------- | ------------------------------------- | --------------------------------- |\n| gcr.io/distroless/static-debian12     | latest, nonroot, debug, debug-nonroot | amd64, arm64, arm, s390x, ppc64le |\n| gcr.io/distroless/base-debian12       | latest, nonroot, debug, debug-nonroot | amd64, arm64, arm, s390x, ppc64le |\n| gcr.io/distroless/base-nossl-debian12 | latest, nonroot, debug, debug-nonroot | amd64, arm64, arm, s390x, ppc64le |\n| gcr.io/distroless/cc-debian12         | latest, nonroot, debug, debug-nonroot | amd64, arm64, arm, s390x, ppc64le |\n| gcr.io/distroless/python3-debian12    | latest, nonroot, debug, debug-nonroot | amd64, arm64                      |\n\n#### Debian 13\n\nDebian 13 distroless images use the debian [UsrMerge](https://wiki.debian.org/UsrMerge) scheme. If you use `rules_distroless` to add packages to an image, set `mergedusr = True` in [`apt.install`](https://registry.bazel.build/docs/rules_distroless#apt_install).\n\n| Image                                 | Tags                                  | Architecture Suffixes                      |\n| ------------------------------------- | ------------------------------------- | ------------------------------------------ |\n| gcr.io/distroless/static-debian13     | latest, nonroot, debug, debug-nonroot | amd64, arm64, arm, s390x, ppc64le, riscv64 |\n| gcr.io/distroless/base-debian13       | latest, nonroot, debug, debug-nonroot | amd64, arm64, arm, s390x, ppc64le, riscv64 |\n| gcr.io/distroless/base-nossl-debian13 | latest, nonroot, debug, debug-nonroot | amd64, arm64, arm, s390x, ppc64le, riscv64 |\n| gcr.io/distroless/cc-debian13         | latest, nonroot, debug, debug-nonroot | amd64, arm64, arm, s390x, ppc64le, riscv64 |\n| gcr.io/distroless/java-base-debian13  | latest, nonroot, debug, debug-nonroot | amd64, arm64, s390x, ppc64le, riscv64      |\n| gcr.io/distroless/java17-debian13     | latest, nonroot, debug, debug-nonroot | amd64, arm64, s390x, ppc64le, riscv64      |\n| gcr.io/distroless/java21-debian13     | latest, nonroot, debug, debug-nonroot | amd64, arm64, s390x, ppc64le, riscv64      |\n| gcr.io/distroless/java25-debian13     | latest, nonroot, debug, debug-nonroot | amd64, arm64, s390x, ppc64le, riscv64      |\n| gcr.io/distroless/nodejs20-debian13   | latest, nonroot, debug, debug-nonroot | amd64, arm64, arm, s390x, ppc64le          |\n| gcr.io/distroless/nodejs22-debian13   | latest, nonroot, debug, debug-nonroot | amd64, arm64, arm, s390x, ppc64le          |\n| gcr.io/distroless/nodejs24-debian13   | latest, nonroot, debug, debug-nonroot | amd64, arm64, s390x, ppc64le               |\n| gcr.io/distroless/python3-debian13    | latest, nonroot, debug, debug-nonroot | amd64, arm64                               |\n\n## Why is distroless still using `gcr.io` instead of `pkg.dev`?\n\nDistroless's serving infrastructure has moved to artifact registry but we still use the `gcr.io` domain. Users will get the benefits of the newer infrastructure without changing their builds.\n\n## How do I verify distroless images?\n\nAll distroless images are signed by [cosign](https://github.com/sigstore/cosign) with ephemeral keys (keyless). We recommend verifying any distroless image you use before building your image. You can verify the keyless signature of any distroless image with:\n\n```sh\ncosign verify $IMAGE_NAME --certificate-oidc-issuer https://accounts.google.com --certificate-identity keyless@distroless.iam.gserviceaccount.com\n```\n\n### Entrypoints\n\nNote that distroless images by default do not contain a shell.\nThat means the Dockerfile `ENTRYPOINT` command, when defined, must be specified in `vector` form, to avoid the container runtime prefixing with a shell.\n\nThis works:\n\n```dockerfile\nENTRYPOINT [\"myapp\"]\n```\n\nBut this does not work:\n\n```dockerfile\nENTRYPOINT \"myapp\"\n```\n\nFor the same reasons, if the entrypoint is set to the empty vector, the CMD command should be specified in `vector` form (see examples below).\nNote that by default static, base and cc images have the empty vector entrypoint. Images with an included language runtime have a language specific default (see: [java](java/README.md#usage), [nodejs](nodejs/README.md#usage), [python3](python3/README.md#usage)).\n\n### Docker\n\nDocker multi-stage builds make using distroless images easy.\nFollow these steps to get started:\n\n- Pick the right base image for your application stack.\n- Write a multi-stage docker file.\n  Note: This requires Docker 17.05 or higher.\n\n  The basic idea is that you'll have one stage to build your application artifacts, and insert them into your runtime distroless image.\n  If you'd like to learn more, please see the documentation on [multi-stage builds](https://docs.docker.com/engine/userguide/eng-image/multistage-build/).\n\n#### Examples with Docker\n\nHere's a quick example for go:\n\n```dockerfile\n# Start by building the application.\nFROM golang:1.18 as build\n\nWORKDIR /go/src/app\nCOPY . .\n\nRUN go mod download\nRUN CGO_ENABLED=0 go build -o /go/bin/app\n\n# Now copy it into our base image.\nFROM gcr.io/distroless/static-debian12\nCOPY --from=build /go/bin/app /\nCMD [\"/app\"]\n```\n\nYou can find other examples here:\n\n- [Java](examples/java/Dockerfile)\n- [Python 3](examples/python3/Dockerfile)\n- [Go](examples/go/Dockerfile)\n- [Node.js](examples/nodejs/Dockerfile)\n- [Rust](examples/rust/Dockerfile)\n\nTo run any example, go to the directory for the language and run:\n\n```sh\ndocker build -t myapp .\ndocker run -t myapp\n```\n\nTo run the [Node.js Express example app](examples/nodejs/node-express) and expose the container's ports:\n\n```sh\nnpm install # Install express and its transitive dependencies\ndocker build -t myexpressapp . # Normal build command\ndocker run -p 3000:3000 -t myexpressapp\n```\n\nThis should expose the Express application to your `localhost:3000`\n\n### Bazel\n\nFor full documentation on how to use bazel to generate Container images, see the [bazel-contrib/rules_oci](https://github.com/bazel-contrib/rules_oci) repository.\n\nFor documentation and example on how to create custom container images, see the [GoogleContainerTools/rules_distroless](https://github.com/GoogleContainerTools/rules_distroless) repository.\n\nExamples can be found in the [GoogleContainerTools/rules_distroless](https://github.com/GoogleContainerTools/rules_distroless/tree/main/examples) repository.\n\n#### Examples with Bazel\n\nWe have some examples on how to run some common application stacks in the /examples directory.\nSee here for:\n\n- [Java](examples/java/BUILD)\n- [Python 3](examples/python3/BUILD)\n- [Go](examples/go/BUILD)\n- [Node.js](examples/nodejs/BUILD)\n\nSee here for examples on how to complete some common tasks in your image:\n\n- [Adding and running as a non-root user](examples/nonroot)\n- [Including Debian Packages](https://registry.bazel.build/docs/rules_distroless#module_extension-apt)\n- [Including CA certificates](https://registry.bazel.build/docs/rules_distroless#rule-cacerts)\n\nSee here for more information on how these images are [built and released](RELEASES.md).\n\n### Base Operating System\n\nDistroless images are based on Debian 12 (bookworm). Images are explicitly tagged with Debian version suffixes (e.g. `-debian12`). Specifying an image without the distribution will currently select `-debian12` images, but that will change in the future to a newer version of Debian. It can be useful to reference the distribution explicitly, to prevent breaking builds when the next Debian version is released.\n\n### Operating System Updates for Security Fixes and CVEs\n\nDistroless tracks the upstream Debian releases, using [Github actions to automatically generate a pull request when there are updates](https://github.com/GoogleContainerTools/distroless/blob/main/.github/workflows/update-deb-package-snapshots.yml).\n\n### Debug Images\n\nDistroless images are minimal and lack shell access. The `:debug` image set for each language provides a busybox shell to enter.\n\nFor example:\n\n```sh\ncd examples/python3/\n```\n\nedit the `Dockerfile` to change the final image to `:debug`:\n\n```dockerfile\nFROM gcr.io/distroless/python3-debian12:debug\nCOPY . /app\nWORKDIR /app\nCMD [\"hello.py\", \"/etc\"]\n```\n\nthen build and launch with a shell entrypoint:\n\n```sh\ndocker build -t my_debug_image .\n```\n\n```sh\n$ docker run --entrypoint=sh -ti my_debug_image\n\n/app # ls\nBUILD       Dockerfile  hello.py\n```\n\n> Note: If the image you are using already has a tag, for example `gcr.io/distroless/java17-debian13:nonroot`, use the tag `debug-<existing tag>` instead, for example `gcr.io/distroless/java17-debian13:debug-nonroot`.\n\n> Note: [ldd](http://man7.org/linux/man-pages/man1/ldd.1.html) is not installed in the base image as it's a shell script, you can copy it in or download it.\n\n### Who uses Distroless?\n\n- [Kubernetes](https://github.com/kubernetes/enhancements/blob/master/keps/sig-release/1729-rebase-images-to-distroless/README.md), since v1.15\n- [Knative](https://knative.dev)\n- [Tekton](https://tekton.dev)\n- [Teleport](https://goteleport.com)\n- [BloodHound](https://github.com/SpecterOps/BloodHound) by [SpecterOps](https://specterops.io/)\n\nIf your project uses Distroless, send a PR to add your project here!\n\n## Community Discussion\n\n- [distroless-users Google Group](https://groups.google.com/forum/#!forum/distroless-users)\n- [Kubernetes slack #distroless channel](https://slack.k8s.io/)\n"
  },
  {
    "path": "RELEASES.md",
    "content": "# Release Process\n\nImages in this repository are built and released in the `gcr.io/distroless` repository on the [Google Container Registry](https://cloud.google.com/container-registry/).\n\nImages are automatically built and pushed every commit, according to the policy defined in [cloudbuild.yaml](.cloudbuild/cloudbuild.yaml).\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Supported Versions\n\nDistroless currently tracks debian 12 ([bookworm](https://packages.debian.org/bookworm/allpackages)) and debian 13 ([trixie](https://packages.debian.org/trixie/allpackages)) packages.\n\nDebian package versions used for the current build are found in https://github.com/GoogleContainerTools/distroless/blob/main/private/repos/deb. It can be parsed and printed into simple json data by invoking `./knife deb-versions` at the root of this project.\n\n## Reporting a Vulnerability\n\nIf a distroless image you are using contains a CVE or other vulnerability:\n1. ensure you are using a [currently supported image](https://github.com/GoogleContainerTools/distroless#what-images-are-available)\n1. find the appropriate debian security-tracker notice: `https://security-tracker.debian.org/tracker/CVE-XXXX-YYYYY`, for [example](https://security-tracker.debian.org/tracker/CVE-2022-21476).\n1. check if a fix is available for the appropriate debian version in the main/security channels (ex `trixie`, `trixie (security)`).\n    1. if a fix is not yet available, do not file a bug, track it in your internal tracker until one becomes available.\n    1. if a fix is available *and* it has been more than 48 hours, please let the team know by creating an issue and pointing to the CVE or vulnerability disclosure.\n"
  },
  {
    "path": "SUPPORT_POLICY.md",
    "content": "Distroless currently tracks Debian on their [standard support timeline](https://wiki.debian.org/DebianReleases#Production_Releases).\n\nThe current estimation of end of life for images with the pattern:\n\n`gcr.io/distroless/<image>-debian<version>:(latest|nonroot|debug|debug-nonroot)`\n\n| Image       | Debian 12 EOL  | Debian 13 EOL               |\n| ----------- | -------------- | --------------------------- |\n| static      | Sept 2026      | debian 14 release day + 1yr |\n| base        | Sept 2026      | debian 14 release day + 1yr |\n| base-nossl  | Sept 2026      | debian 14 release day + 1yr |\n| cc          | Sept 2026      | debian 14 release day + 1yr |\n| java*       | Jan 2026       | debian 14 release day + 3mo |\n| node*       | Jan 2026       | debian 14 release day + 3mo |\n| python*     | April 2026     | debian 14 release day + 3mo |\n\n\\* see below for language specific runtime notes\n\n\n### Java\nJava will only support current LTS version distributed by debian [see here](https://wiki.debian.org/Java).\n\n### Node\nNode version support is for even numbered releases (20, 22, 24, etc) that are current, active or in LTS maintenance. For more information, [see here](https://nodejs.org/en/about/previous-releases#release-schedule).\n\n### Python (TBD)\n\n### Images no longer supported\nA list of supported image tags is available here: https://github.com/GoogleContainerTools/distroless#what-images-are-available\n"
  },
  {
    "path": "WORKSPACE",
    "content": "load(\"@rules_oci//cosign:repositories.bzl\", \"cosign_register_toolchains\")\n\ncosign_register_toolchains(name = \"oci_cosign\")\n"
  },
  {
    "path": "base/BUILD",
    "content": "load(\":base.bzl\", \"base_image\", \"base_image_index\", \"base_nossl_image\", \"base_nossl_image_index\")\nload(\":config.bzl\", \"BASE_ARCHITECTURES\", \"BASE_DISTROS\", \"BASE_NOSSL_PACKAGES\", \"BASE_PACKAGES\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\n# base nossl\n[\n    base_nossl_image(\n        arch = arch,\n        distro = distro,\n        packages = BASE_NOSSL_PACKAGES[distro],\n    )\n    for distro in BASE_DISTROS\n    for arch in BASE_ARCHITECTURES[distro]\n]\n\n[\n    base_nossl_image_index(\n        architectures = BASE_ARCHITECTURES[distro],\n        distro = distro,\n    )\n    for distro in BASE_DISTROS\n]\n\n# base (with libssl)\n\n[\n    base_image(\n        arch = arch,\n        distro = distro,\n        packages = BASE_PACKAGES[distro],\n    )\n    for distro in BASE_DISTROS\n    for arch in BASE_ARCHITECTURES[distro]\n]\n\n[\n    base_image_index(\n        architectures = BASE_ARCHITECTURES[distro],\n        distro = distro,\n    )\n    for distro in BASE_DISTROS\n]\n"
  },
  {
    "path": "base/README.md",
    "content": "# Documentation for `gcr.io/distroless/base`, `gcr.io/distroless/base-nossl` and `gcr.io/distroless/static`\n\n## Image Contents\n\nThis image contains a minimal Linux, glibc-based system. It is intended for use directly by \"mostly-statically compiled\" languages like Go, Rust or D.\n\nStatically compiled applications (Go) that do not require libc can use the `gcr.io/distroless/static` image, which contains:\n\n* ca-certificates\n* A /etc/passwd entry for a root user\n* A /tmp directory\n* tzdata\n\nApplications that require libc but do not need libssl can use the `gcr.io/distroless/base-nossl`, which contains all\nof the packages in `gcr.io/distroless/static`, and\n\n* glibc\n\nMost other applications (and Go apps that require libc/cgo) should start with `gcr.io/distroless/base`, which contains all\nof the packages in `gcr.io/distroless/static`, and \n\n* glibc\n* libssl\n  * for Debian 13 or later, libssl dependencies (zlib, libzstd) are also included.\n\nNote: Debian 13 base image does not include [OpenSSL legacy algorithms](https://docs.openssl.org/3.5/man7/OSSL_PROVIDER-legacy/#operations-and-algorithms).\n\nIf you want to use them, you will need to add `openssl-legacy-provider` yourself.\n\n## Usage\n\nUsers are expected to include their compiled application and set the correct cmd in their image.\n"
  },
  {
    "path": "base/base.bzl",
    "content": "\"defines a function to replicate the container images for different distributions\"\n\nload(\"@container_structure_test//:defs.bzl\", \"container_structure_test\")\nload(\"@rules_oci//oci:defs.bzl\", \"oci_image\", \"oci_image_index\")\nload(\"//common:variables.bzl\", \"DEBUG_MODE\", \"USERS\")\nload(\"//private/util:deb.bzl\", \"deb\")\n\ndef base_nossl_image_index(distro, architectures):\n    \"\"\"base nossl image index for a distro\n\n    Args:\n        distro: name of distribution\n        architectures: all architectures included in index\n    \"\"\"\n    [\n        oci_image_index(\n            name = \"base_nossl\" + mode + \"_\" + user + \"_\" + distro,\n            images = [\n                \"base_nossl\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro\n                for arch in architectures\n            ],\n        )\n        for user in USERS\n        for mode in DEBUG_MODE\n    ]\n\ndef base_image_index(distro, architectures):\n    \"\"\"base image index for a distro\n\n    Args:\n        distro: name of distribution\n        architectures: all architectures included in index\n    \"\"\"\n    [\n        oci_image_index(\n            name = \"base\" + mode + \"_\" + user + \"_\" + distro,\n            images = [\n                \"base\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro\n                for arch in architectures\n            ],\n        )\n        for user in USERS\n        for mode in DEBUG_MODE\n    ]\n\ndef base_nossl_image(distro, arch, packages):\n    \"\"\"base nossl and debug images and tests for a distro/arch\n\n    Args:\n        distro: name of the distribution\n        arch: the target architecture\n    \"\"\"\n\n    [\n        oci_image(\n            name = \"base_nossl\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro,\n            base = \"//static:static\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro,\n            tars = [\n                deb.package(arch, distro, pkg)\n                for pkg in packages\n            ],\n        )\n        for user in USERS\n        for mode in DEBUG_MODE\n    ]\n\n    # Check for common base files.\n    container_structure_test(\n        name = \"base_nossl_\" + arch + \"_\" + distro + \"_test\",\n        configs = [\"testdata/base.yaml\"],\n        image = \":base_nossl_root_\" + arch + \"_\" + distro,\n        tags = [\"manual\", arch],\n    )\n\n    # Check for busybox\n    container_structure_test(\n        name = \"base_nossl_debug_\" + arch + \"_\" + distro + \"_test\",\n        configs = [\"testdata/debug.yaml\"],\n        image = \":base_nossl_debug_root_\" + arch + \"_\" + distro,\n        tags = [\"manual\", arch],\n    )\n\ndef base_image(distro, arch, packages):\n    \"\"\"base and debug images and tests for a distro/arch\n\n    Args:\n        distro: name of the distribution\n        arch: the target architecture\n    \"\"\"\n    LIBSSL = {\n        \"debian12\": \"libssl3\",\n        \"debian13\": \"libssl3t64\",\n    }\n\n    [\n        oci_image(\n            name = \"base\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro,\n            base = \"//static:static\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro,\n            tars = [\n                deb.package(arch, distro, pkg)\n                for pkg in packages\n            ],\n        )\n        for user in USERS\n        for mode in DEBUG_MODE\n    ]\n\n    # Check for common base files.\n    container_structure_test(\n        name = \"base_\" + arch + \"_\" + distro + \"_test\",\n        configs = [\"testdata/base.yaml\"],\n        image = \":base_root_\" + arch + \"_\" + distro,\n        tags = [\"manual\", arch],\n    )\n\n    # Check for busybox\n    container_structure_test(\n        name = \"base_debug_\" + arch + \"_\" + distro + \"_test\",\n        configs = [\"testdata/debug.yaml\"],\n        image = \":base_debug_root_\" + arch + \"_\" + distro,\n        tags = [\"manual\", arch],\n    )\n"
  },
  {
    "path": "base/config.bzl",
    "content": "BASE_DISTROS = [\"debian12\", \"debian13\"]\nBASE_ARCHITECTURES = {\n    \"debian12\": [\"amd64\", \"arm64\", \"arm\", \"s390x\", \"ppc64le\"],\n    \"debian13\": [\"amd64\", \"arm64\", \"arm\", \"s390x\", \"ppc64le\", \"riscv64\"],\n}\n\nBASE_PACKAGES = {\n    \"debian12\": [\n        \"libc6\",\n        \"libssl3\",\n    ],\n    \"debian13\": [\n        \"libc6\",\n        \"libssl3t64\",\n        \"libzstd1\",\n        \"zlib1g\",\n    ],\n}\n\nBASE_NOSSL_PACKAGES = {\n    \"debian12\": [\n        \"libc6\",\n    ],\n    \"debian13\": [\n        \"libc6\",\n    ],\n}\n"
  },
  {
    "path": "base/test.sh",
    "content": "$RUNFILES_DIR/runtimes_common/structure_tests/ext_run.sh \\\n  -i bazel/base:cc \\\n  -t $RUNFILES_DIR/distroless/base/base.tar \\\n  -c $RUNFILES_DIR/distroless/base/testdata/base.yaml\n"
  },
  {
    "path": "base/testdata/base.yaml",
    "content": "schemaVersion: \"1.0.0\"\nfileExistenceTests:\n# Basic FS sanity checks.\n- name: root\n  path: '/'\n  shouldExist: true\n- name: tmp\n  path: '/tmp'\n  shouldExist: true\n- name: passwd\n  path: '/etc/passwd'\n  shouldExist: true\n- name: group\n  path: '/etc/group'\n  shouldExist: true\n- name: etc-os-release\n  path: '/etc/os-release'\n  shouldExist: true\n- name: certs\n  path: '/etc/ssl/certs/ca-certificates.crt'\n  shouldExist: true\n- name: certs_copyright\n  path: '/usr/share/doc/ca-certificates/copyright'\n  shouldExist: true\n- name: services\n  path: '/etc/services'\n  shouldExist: true\n- name: tzdata_copyright\n  path: '/usr/share/doc/tzdata/copyright'\n  shouldExist: true\n- name: tzdata_zoneinfo\n  path: '/usr/share/zoneinfo'\n  shouldExist: true\n- name: homedir\n  path: '/root'\n  shouldExist: true\n- name: nonroot-homedir\n  path: '/home/nonroot'\n  shouldExist: true\n- name: dpkg-status.d\n  path: '/var/lib/dpkg/status.d/libc6'\n  shouldExist: true\nfileContentTests:\n- name: 'known users'\n  path: '/etc/passwd'\n  expectedContents: ['^root:x:0:0:root:/root:/sbin/nologin\\nnobody:x:65534:65534:nobody:/nonexistent:/sbin/nologin\\nnonroot:x:65532:65532:nonroot:/home/nonroot:/sbin/nologin\\n$']\n- name: 'known groups'\n  path: '/etc/group'\n  expectedContents: ['^root:x:0:\\nnobody:x:65534:\\ntty:x:5:\\nstaff:x:50:\\nnonroot:x:65532:\\n$']\n- name: '/usr/lib/os-release pretty name'\n  path: '/usr/lib/os-release'\n  expectedContents: ['PRETTY_NAME=\"Distroless\"']\n# /etc/os-release is a symlink to /usr/lib/os-release, make sure they match.\n- name: '/etc/os-release pretty name'\n  path: '/etc/os-release'\n  expectedContents: ['PRETTY_NAME=\"Distroless\"']\n"
  },
  {
    "path": "base/testdata/debug.yaml",
    "content": "schemaVersion: \"1.0.0\"\nfileExistenceTests:\n# Basic FS sanity checks.\n- name: busybox\n  path: '/busybox'\n  shouldExist: true\ncommandTests:\n  - name: busybox\n    command: [\"/busybox/busybox\"]\n    expectedOutput: ['BusyBox v1\\.37\\.0']\n"
  },
  {
    "path": "cc/BUILD",
    "content": "load(\":cc.bzl\", \"cc_image\", \"cc_image_index\")\nload(\":config.bzl\", \"CC_ARCHITECTURES\", \"CC_DISTROS\", \"CC_PACKAGES\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\n[\n    cc_image(\n        arch = arch,\n        distro = distro,\n        packages = CC_PACKAGES[distro],\n    )\n    for distro in CC_DISTROS\n    for arch in CC_ARCHITECTURES[distro]\n]\n\n[\n    cc_image_index(\n        architectures = CC_ARCHITECTURES[distro],\n        distro = distro,\n    )\n    for distro in CC_DISTROS\n]\n"
  },
  {
    "path": "cc/README.md",
    "content": "# Documentation for `gcr.io/distroless/cc`\n\n## Image Contents\n\nThis image contains a minimal Linux, glibc runtime for \"mostly-statically compiled\" languages like Rust and D.\n\nSpecifically, the image contains everything in the [base image](../base/README.md), plus:\n\n* libgcc1 and its dependencies.\n\n## Usage\n\nUsers are expected to include their compiled application and set the correct CMD in their image.\n"
  },
  {
    "path": "cc/cc.bzl",
    "content": "load(\"@rules_oci//oci:defs.bzl\", \"oci_image\", \"oci_image_index\")\nload(\"//common:variables.bzl\", \"DEBUG_MODE\", \"USERS\")\nload(\"//private/util:deb.bzl\", \"deb\")\n\ndef cc_image_index(distro, architectures):\n    \"\"\"cc image index for a distro\n\n    Args:\n        distro: name of distribution\n        architectures: all architectures included in index\n    \"\"\"\n    [\n        oci_image_index(\n            name = \"cc\" + mode + \"_\" + user + \"_\" + distro,\n            images = [\n                \"cc\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro\n                for arch in architectures\n            ],\n        )\n        for mode in DEBUG_MODE\n        for user in USERS\n    ]\n\ndef cc_image(distro, arch, packages):\n    \"\"\"base nossl and debug images and tests for a distro/arch\n\n    Args:\n        distro: name of the distribution\n        arch: the target architecture\n    \"\"\"\n    [\n        oci_image(\n            name = \"cc\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro,\n            base = \"//base:base\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro,\n            tars = [\n                deb.package(arch, distro, pkg)\n                for pkg in packages\n            ],\n        )\n        for mode in DEBUG_MODE\n        for user in USERS\n    ]\n"
  },
  {
    "path": "cc/config.bzl",
    "content": "CC_DISTROS = [\"debian12\", \"debian13\"]\nCC_ARCHITECTURES = {\n    \"debian12\": [\"amd64\", \"arm64\", \"arm\", \"s390x\", \"ppc64le\"],\n    \"debian13\": [\"amd64\", \"arm64\", \"arm\", \"s390x\", \"ppc64le\", \"riscv64\"],\n}\n\nCC_PACKAGES = {\n    \"debian12\": [\n        \"libgomp1\",\n        \"libstdc++6\",\n        \"libgcc-s1\",\n        \"gcc-12-base\",\n    ],\n    \"debian13\": [\n        \"libgomp1\",\n        \"libstdc++6\",\n        \"libgcc-s1\",\n        \"gcc-14-base\",\n    ],\n}\n"
  },
  {
    "path": "common/BUILD.bazel",
    "content": "load(\"@aspect_bazel_lib//lib:tar.bzl\", \"tar\")\nload(\"@rules_distroless//distroless:defs.bzl\", \"cacerts\", \"group\", \"home\", \"locale\", \"os_release\", \"passwd\")\nload(\"//:distro.bzl\", \"ALL_DISTROS\", \"VERSIONS\")\nload(\"//private/util:deb.bzl\", \"deb\")\nload(\":variables.bzl\", \"NOBODY\", \"NONROOT\", \"OS_RELEASE\", \"ROOT\", \"quote\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nCOMMON_DISTROS = ALL_DISTROS\n\nCOMMON_ARCHITECTURES = {\n    \"debian12\": [\n        \"amd64\",\n        \"arm64\",\n        \"arm\",\n        \"s390x\",\n        \"ppc64le\",\n    ],\n    \"debian13\": [\n        \"amd64\",\n        \"arm64\",\n        \"arm\",\n        \"s390x\",\n        \"ppc64le\",\n        \"riscv64\",\n    ],\n}\n\ntar(\n    name = \"rootfs\",\n    srcs = [],\n    args = [\n        \"--format\",\n        \"gnutar\",\n    ],\n    compress = \"gzip\",\n    mtree = [\"./ type=dir uid=0 gid=0 mode=0755 time=0.0\"],\n)\n\ntar(\n    name = \"tmp\",\n    srcs = [],\n    # original tmp.tar was created on a gnutar, mimic that.\n    args = [\n        \"--format\",\n        \"gnutar\",\n    ],\n    compress = \"gzip\",\n    mtree = [\"./tmp gname=root uname=root time=0.0 mode=1777 gid=0 uid=0 type=dir\"],\n)\n\n[\n    os_release(\n        name = \"os_release_%s\" % dist,\n        content = {\n            key: quote(value.format(\n                CODENAME = codename,\n                VERSION = version,\n            ))\n            for (key, value) in OS_RELEASE.items()\n        },\n    )\n    for (dist, codename, version) in VERSIONS\n]\n\n[\n    locale(\n        name = \"locale_%s_%s\" % (distro, arch),\n        charset = \"C.utf8\",\n        package = deb.data(arch, distro, \"libc-bin\"),\n    )\n    for distro in COMMON_DISTROS\n    for arch in COMMON_ARCHITECTURES[distro]\n]\n\n[\n    cacerts(\n        name = \"cacerts_%s_%s\" % (distro, arch),\n        package = deb.data(arch, distro, \"ca-certificates\"),\n    )\n    for distro in COMMON_DISTROS\n    for arch in COMMON_ARCHITECTURES[distro]\n]\n\n# create /etc/group with the root, tty, and staff groups\ngroup(\n    name = \"group\",\n    entries = [\n        {\n            \"name\": \"root\",  # root_group\n            \"gid\": ROOT,\n            \"password\": \"x\",\n        },\n        {\n            \"name\": \"nobody\",  # nobody_group\n            \"gid\": NOBODY,\n            \"password\": \"x\",\n        },\n        {\n            \"name\": \"tty\",  # tty_group\n            \"gid\": 5,\n            \"password\": \"x\",\n        },\n        {\n            \"name\": \"staff\",  # staff_group\n            \"gid\": 50,\n            \"password\": \"x\",\n        },\n        {\n            \"name\": \"nonroot\",  # nonroot_group\n            \"gid\": NONROOT,\n            \"password\": \"x\",\n        },\n    ],\n)\n\npasswd(\n    name = \"passwd\",\n    entries = [\n        {\n            \"gecos\": [\"root\"],\n            \"gid\": ROOT,\n            \"shell\": \"/sbin/nologin\",\n            \"home\": \"/root\",\n            \"uid\": ROOT,\n            \"password\": \"x\",\n            \"username\": \"root\",\n        },\n        {\n            \"gecos\": [\"nobody\"],\n            \"gid\": NOBODY,\n            \"home\": \"/nonexistent\",\n            \"shell\": \"/sbin/nologin\",\n            \"uid\": NOBODY,\n            \"password\": \"x\",\n            \"username\": \"nobody\",\n        },\n        {\n            \"gecos\": [\"nonroot\"],\n            \"gid\": NONROOT,\n            \"home\": \"/home/nonroot\",\n            \"shell\": \"/sbin/nologin\",\n            \"uid\": NONROOT,\n            \"password\": \"x\",\n            \"username\": \"nonroot\",\n        },\n    ],\n)\n\nhome(\n    name = \"home\",\n    dirs = [\n        {\n            \"home\": \"/root\",\n            \"uid\": ROOT,\n            \"gid\": ROOT,\n            \"mode\": 700,\n        },\n        {\n            \"home\": \"/home\",\n            \"uid\": ROOT,\n            \"gid\": ROOT,\n            \"mode\": 755,\n        },\n        {\n            \"home\": \"/home/nonroot\",\n            \"uid\": NONROOT,\n            \"gid\": NONROOT,\n            \"mode\": 700,\n        },\n    ],\n)\n"
  },
  {
    "path": "common/variables.bzl",
    "content": "\"common variables\"\n\ndef quote(str):\n    return '''\"{}\"'''.format(str)\n\nOS_RELEASE = dict(\n    PRETTY_NAME = \"Distroless\",\n    NAME = \"Debian GNU/Linux\",\n    ID = \"debian\",\n    VERSION_ID = \"{VERSION}\",\n    VERSION = \"Debian GNU/Linux {VERSION} ({CODENAME})\",\n    HOME_URL = \"https://github.com/GoogleContainerTools/distroless\",\n    SUPPORT_URL = \"https://github.com/GoogleContainerTools/distroless/blob/master/README.md\",\n    BUG_REPORT_URL = \"https://github.com/GoogleContainerTools/distroless/issues/new\",\n)\n\nNOBODY = 65534\nNONROOT = 65532\nROOT = 0\n\nDEBUG_MODE = [\"\", \"_debug\"]\nUSERS = [\"root\", \"nonroot\"]\n"
  },
  {
    "path": "cosign.pub",
    "content": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZzVzkb8A+DbgDpaJId/bOmV8n7Q\nOqxYbK0Iro6GzSmOzxkn+N2AKawLyXi84WSwJQBK//psATakCgAQKkNTAA==\n-----END PUBLIC KEY-----\n"
  },
  {
    "path": "distro.bzl",
    "content": "VERSIONS = [\n    (\"debian12\", \"bookworm\", \"12\"),\n    (\"debian13\", \"trixie\", \"13\"),\n]\n\nVARIANTS = {\n    \"arm\": \"v7\",\n    \"arm64\": \"v8\",\n}\n\nALL_ARCHITECTURES = [\"amd64\", \"arm64\", \"arm\", \"s390x\", \"ppc64le\", \"riscv64\"]\nALL_DISTROS = [\"debian12\", \"debian13\"]\n"
  },
  {
    "path": "downloader.cfg",
    "content": "rewrite (mirrors\\.kernel\\.org)/gnu/(.*) https://ftp.gnu.org/gnu/$2\nrewrite (mirrors\\.kernel\\.org)/gnu/(.*) https://ftpmirror.gnu.org/gnu/$2\n"
  },
  {
    "path": "examples/BUILD",
    "content": "package(default_visibility = [\"//visibility:public\"])\n"
  },
  {
    "path": "examples/cc/BUILD",
    "content": "# Public notice: this file is for internal documentation, testing, and\n# reference only. Note that repo maintainers can freely change any part of the\n# repository code at any time.\nload(\"@container_structure_test//:defs.bzl\", \"container_structure_test\")\nload(\"//cc:config.bzl\", DISTROS = \"CC_DISTROS\")\nload(\"//private/oci:defs.bzl\", \"cc_image\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\n[cc_image(\n    name = \"hello_\" + distro,\n    srcs = [\"hello.c\"],\n    base = \"//cc:cc_root_amd64_\" + distro,\n) for distro in DISTROS]\n\n[cc_image(\n    name = \"hello_cc_\" + distro,\n    srcs = [\"hello_cc.cc\"],\n    base = \"//cc:cc_root_amd64_\" + distro,\n) for distro in DISTROS]\n\n[container_structure_test(\n    name = \"hello_\" + distro + \"_test\",\n    size = \"small\",\n    configs = [\"testdata/hello_\" + distro + \".yaml\"],\n    image = \":hello_\" + distro,\n    tags = [\n        \"amd64\",\n        \"manual\",\n    ],\n) for distro in DISTROS]\n\n[container_structure_test(\n    name = \"hello_cc_\" + distro + \"_test\",\n    size = \"small\",\n    configs = [\"testdata/hello_cc_\" + distro + \".yaml\"],\n    image = \":hello_cc_\" + distro,\n    tags = [\n        \"amd64\",\n        \"manual\",\n    ],\n) for distro in DISTROS]\n"
  },
  {
    "path": "examples/cc/Dockerfile",
    "content": "FROM gcc:6 AS build-env\nCOPY . /app\nWORKDIR /app\nRUN cc hello.c -o hello\n\nFROM gcr.io/distroless/cc\nCOPY --from=build-env /app /app\nWORKDIR /app\nCMD [\"./hello\"]\n"
  },
  {
    "path": "examples/cc/hello.c",
    "content": "#include <stdio.h>\n\nint main() {\n   printf(\"Hello from distroless C!\\n\");\n   return 0;\n}\n"
  },
  {
    "path": "examples/cc/hello_cc.cc",
    "content": "#include <iostream>\n\nint main() {\n   std::cout << \"Hello from distroless C++!\" << std::endl;\n   return 0;\n}\n"
  },
  {
    "path": "examples/cc/testdata/hello_cc_debian12.yaml",
    "content": "schemaVersion: \"1.0.0\"\ncommandTests:\n  - name: hello_cc\n    command: ['/hello_cc_debian12_binary']\n    expectedOutput: ['Hello from distroless C\\+\\+!']\n"
  },
  {
    "path": "examples/cc/testdata/hello_cc_debian13.yaml",
    "content": "schemaVersion: \"1.0.0\"\ncommandTests:\n  - name: hello_cc\n    command: ['/hello_cc_debian13_binary']\n    expectedOutput: ['Hello from distroless C\\+\\+!']\n"
  },
  {
    "path": "examples/cc/testdata/hello_debian12.yaml",
    "content": "schemaVersion: \"1.0.0\"\ncommandTests:\n  - name: hello\n    command: ['/hello_debian12_binary']\n    expectedOutput: ['Hello from distroless C!']\n"
  },
  {
    "path": "examples/cc/testdata/hello_debian13.yaml",
    "content": "schemaVersion: \"1.0.0\"\ncommandTests:\n  - name: hello\n    command: ['/hello_debian13_binary']\n    expectedOutput: ['Hello from distroless C!']\n"
  },
  {
    "path": "examples/go/BUILD",
    "content": "# Public notice: this file is for internal documentation, testing, and\n# reference only. Note that repo maintainers can freely change any part of the\n# repository code at any time.\nload(\"@rules_oci//oci:defs.bzl\", \"oci_load\")\nload(\"//private/oci:defs.bzl\", \"go_image\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ngo_image(\n    name = \"go_example\",\n    srcs = [\"main.go\"],\n    base = \"//base:base_root_amd64_debian12\",\n)\n\n# Run\n# bazel run //examples/go:tarball\n# podman run localhost/distroless/examples/go:latest\noci_load(\n    name = \"tarball\",\n    image = \":go_example\",\n    repo_tags = [\"distroless/examples/go:latest\"],\n)\n"
  },
  {
    "path": "examples/go/Dockerfile",
    "content": "FROM golang:1.22 as build\n\nWORKDIR /go/src/app\nCOPY . .\n\nRUN go mod download\nRUN go vet -v\nRUN go test -v\n\nRUN CGO_ENABLED=0 go build -o /go/bin/app\n\nFROM gcr.io/distroless/static-debian12\n\nCOPY --from=build /go/bin/app /\nCMD [\"/app\"]\n"
  },
  {
    "path": "examples/go/go.mod",
    "content": "module github.com/GoogleContainerTools/distroless/examples/go\n\ngo 1.18\n"
  },
  {
    "path": "examples/go/main.go",
    "content": "// Copyright 2017 Google Inc. All rights reserved.\n\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n\n//     http://www.apache.org/licenses/LICENSE-2.0\n\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\tfmt.Println(\"Hello, world!\")\n}\n"
  },
  {
    "path": "examples/go/main_test.go",
    "content": "package main\n\nimport (\n\t\"testing\"\n)\n\nfunc Test1(t *testing.T) {\n}\n"
  },
  {
    "path": "examples/java/BUILD",
    "content": "# Public notice: this file is for internal documentation, testing, and\n# reference only. Note that repo maintainers can freely change any part of the\n# repository code at any time.\nload(\"@container_structure_test//:defs.bzl\", \"container_structure_test\")\nload(\"//private/oci:defs.bzl\", \"java_image\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nJAVA_VERSIONS_PER_DISTRO = [\n    (\"17\", \"debian13\"),\n]\n\n[\n    java_image(\n        name = \"hello_java\" + java_version + \"_\" + user + \"_\" + distro,\n        srcs = [\"HelloJava.java\"],\n        base = \"//java:java\" + java_version + \"_\" + user + \"_amd64\" + \"_\" + distro,\n        main_class = \"examples.HelloJava\",\n    )\n    for user in [\n        \"root\",\n        \"nonroot\",\n    ]\n    for java_version, distro in JAVA_VERSIONS_PER_DISTRO\n]\n\n[\n    container_structure_test(\n        name = \"hello_java\" + java_version + \"_\" + user + \"_\" + distro + \"_test\",\n        size = \"small\",\n        configs = [\"testdata/hello_\" + user + \"_\" + distro + \".yaml\"],\n        image = \":hello_java\" + java_version + \"_\" + user + \"_\" + distro,\n        tags = [\n            \"amd64\",\n            \"manual\",\n        ],\n    )\n    for user in [\n        \"root\",\n        \"nonroot\",\n    ]\n    for java_version, distro in JAVA_VERSIONS_PER_DISTRO\n]\n"
  },
  {
    "path": "examples/java/Dockerfile",
    "content": "FROM eclipse-temurin:17-jdk AS build-env\nCOPY . /app/examples\nWORKDIR /app\nRUN javac examples/*.java\nRUN jar cfe main.jar examples.HelloJava examples/*.class \n\nFROM gcr.io/distroless/java17-debian13\nCOPY --from=build-env /app /app\nWORKDIR /app\nCMD [\"main.jar\"]\n"
  },
  {
    "path": "examples/java/HelloJava.java",
    "content": "package examples;\n\npublic class HelloJava {\n    public static void main(String[] args) {\n        System.out.println(\"Hello world\");\n    }\n}\n"
  },
  {
    "path": "examples/java/testdata/hello_nonroot_debian13.yaml",
    "content": "schemaVersion: \"1.0.0\"\ncommandTests:\n  - name: hello\n    command: ['/usr/bin/java', '-cp', '/*', 'examples.HelloJava']\n    expectedOutput: ['Hello world']\n"
  },
  {
    "path": "examples/java/testdata/hello_root_debian13.yaml",
    "content": "schemaVersion: \"1.0.0\"\ncommandTests:\n  - name: hello\n    command: ['/usr/bin/java', '-cp', '/*', 'examples.HelloJava']\n    expectedOutput: ['Hello world']\n"
  },
  {
    "path": "examples/nodejs/BUILD",
    "content": "# Public notice: this file is for internal documentation, testing, and\n# reference only. Note that repo maintainers can freely change any part of the\n# repository code at any time.\nload(\"@container_structure_test//:defs.bzl\", \"container_structure_test\")\nload(\"@rules_oci//oci:defs.bzl\", \"oci_image\")\nload(\"//private/util:tar.bzl\", \"tar\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nARCHITECTURES = [\n    \"amd64\",\n    \"arm64\",\n]\n\nDISTROS = [\n    \"debian13\",\n]\n\n# These examples are adapted from:\n# https://howtonode.org/hello-node\n\ntar(\n    name = \"hello_tar\",\n    srcs = [\n        \"hello.js\",\n    ],\n)\n\ntar(\n    name = \"hello_http_tar\",\n    srcs = [\n        \"hello_http.js\",\n    ],\n)\n\n[\n    oci_image(\n        name = \"hello_\" + user + \"_\" + arch + \"_\" + distro,\n        base = \"//nodejs:nodejs22_\" + user + \"_\" + arch + \"_\" + distro,\n        cmd = [\"hello.js\"],\n        tars = [\":hello_tar\"],\n    )\n    for user in [\n        \"root\",\n        \"nonroot\",\n    ]\n    for arch in ARCHITECTURES\n    for distro in DISTROS\n]\n\n[\n    oci_image(\n        name = \"hello_http_\" + user + \"_\" + arch + \"_\" + distro,\n        base = \"//nodejs:nodejs22_\" + user + \"_\" + arch + \"_\" + distro,\n        cmd = [\"hello_http.js\"],\n        tars = [\":hello_http_tar\"],\n    )\n    for user in [\n        \"root\",\n        \"nonroot\",\n    ]\n    for arch in ARCHITECTURES\n    for distro in DISTROS\n]\n\n[\n    container_structure_test(\n        name = \"hello_\" + user + \"_\" + arch + \"_\" + distro + \"_test\",\n        configs = [\"testdata/hello.yaml\"],\n        image = \":hello_\" + user + \"_\" + arch + \"_\" + distro,\n        tags = [\n            arch,\n            \"manual\",\n        ],\n    )\n    for user in [\n        \"root\",\n        \"nonroot\",\n    ]\n    for arch in ARCHITECTURES\n    for distro in DISTROS\n]\n"
  },
  {
    "path": "examples/nodejs/Dockerfile",
    "content": "FROM node:22 AS build-env\nCOPY . /app\nWORKDIR /app\n\nRUN npm ci --omit=dev\n\nFROM gcr.io/distroless/nodejs22-debian13\nCOPY --from=build-env /app /app\nWORKDIR /app\nCMD [\"hello.js\"]\n"
  },
  {
    "path": "examples/nodejs/hello.js",
    "content": "\nconsole.log(\"Hello World\");\n"
  },
  {
    "path": "examples/nodejs/hello_http.js",
    "content": "// Load the http module to create an http server.\nvar http = require('http');\n\n// Configure our HTTP server to respond with Hello World to all requests.\nvar server = http.createServer(function (request, response) {\n  response.writeHead(200, {\"Content-Type\": \"text/plain\"});\n  response.end(\"Hello World\\n\");\n});\n\n// Listen on port 8000, IP defaults to 127.0.0.1\nserver.listen(8000);\n\n// Put a friendly message on the terminal\nconsole.log(\"Server running at http://127.0.0.1:8000/\");\n"
  },
  {
    "path": "examples/nodejs/node-express/Dockerfile",
    "content": "FROM node:22 AS build-env\nADD . /app\nWORKDIR /app\nRUN npm install --omit=dev\n\nFROM gcr.io/distroless/nodejs22-debian13\nCOPY --from=build-env /app /app\nWORKDIR /app\nEXPOSE 3000\nCMD [\"hello_express.js\"]\n"
  },
  {
    "path": "examples/nodejs/node-express/hello_express.js",
    "content": "const express = require('express')\nconst app = express()\nconst port = 3000\n\napp.get('/', (req, res) => res.send('Hello World!'))\n\napp.listen(port, () => console.log(`Example app listening on port ${port}!`))\n"
  },
  {
    "path": "examples/nodejs/node-express/package.json",
    "content": "{\n  \"name\": \"distroless-express\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Distroless express node.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/GoogleContainerTools/distroless.git\"\n  },\n  \"dependencies\": {\n    \"express\": \"4.20.0\"\n  },\n  \"author\": \"Bryant Hagadorn\",\n  \"license\": \"ISC\"\n}"
  },
  {
    "path": "examples/nodejs/package.json",
    "content": "{\n  \"name\": \"nodejs\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Example\",\n  \"main\": \"hello.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\"\n}\n"
  },
  {
    "path": "examples/nodejs/testdata/hello.yaml",
    "content": "schemaVersion: \"1.0.0\"\ncommandTests:\n  - name: hello\n    command: [\"/nodejs/bin/node\", \"/hello.js\"]\n    expectedOutput: ['Hello World']\n"
  },
  {
    "path": "examples/nonroot/BUILD",
    "content": "# Public notice: this file is for internal documentation, testing, and\n# reference only. Note that repo maintainers can freely change any part of the\n# repository code at any time.\nload(\"@container_structure_test//:defs.bzl\", \"container_structure_test\")\nload(\"@rules_distroless//distroless:defs.bzl\", \"home\", \"passwd\")\nload(\"@rules_go//go:def.bzl\", \"go_binary\")\nload(\"@rules_oci//oci:defs.bzl\", \"oci_image\")\nload(\"//:distro.bzl\", DISTROS = \"ALL_DISTROS\")\nload(\"//private/util:tar.bzl\", \"tar\")\n\n# Create a passwd file and home directory with a nonroot user and uid.\npasswd(\n    name = \"passwd\",\n    entries = [\n        {\n            \"gecos\": [\"nonroot\"],\n            \"gid\": 1000,\n            \"home\": \"/home\",\n            \"shell\": \"/bin/bash\",\n            \"uid\": 1002,\n            \"username\": \"nonroot\",\n        },\n    ],\n)\n\nhome(\n    name = \"home\",\n    dirs = [\n        {\n            \"home\": \"/home\",\n            \"uid\": 1002,\n            \"gid\": 1000,\n        },\n    ],\n)\n\n# Include it in our image as a tar.\noci_image(\n    name = \"passwd_image\",\n    base = \"//base:base_root_amd64_debian12\",\n    tars = [\n        \":passwd\",\n        \":home\",\n    ],\n    user = \"nonroot\",\n    visibility = [\"//visibility:private\"],\n)\n\n# Simple go program to print out the username and uid.\ngo_binary(\n    name = \"user\",\n    srcs = [\"testdata/user.go\"],\n    goarch = \"amd64\",\n    # Test image is linux based\n    goos = \"linux\",\n    pure = \"on\",\n)\n\ntar(\n    name = \"user_tar\",\n    srcs = [\":user\"],\n)\n\n[oci_image(\n    name = \"check_user_image_\" + distro,\n    base = \":passwd_image\",\n    tars = [\":user_tar\"],\n    visibility = [\"//visibility:private\"],\n) for distro in DISTROS]\n\n# Test to verify this works :)\n[container_structure_test(\n    name = \"check_user_\" + distro + \"_test\",\n    configs = [\"testdata/user.yaml\"],\n    image = \":check_user_image_\" + distro,\n    tags = [\n        \"amd64\",\n        \"manual\",\n    ],\n    visibility = [\"//visibility:private\"],\n) for distro in DISTROS]\n"
  },
  {
    "path": "examples/nonroot/testdata/user.go",
    "content": "// Copyright 2017 Google Inc. All rights reserved.\n\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n\n//     http://www.apache.org/licenses/LICENSE-2.0\n\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n)\n\nfunc main() {\n\t// We can't use user.Current here because it requires cgo.\n\tuid := strconv.Itoa(os.Getuid())\n\n\tpasswd, err := ioutil.ReadFile(\"/etc/passwd\")\n\tif err != nil {\n\t\tfmt.Printf(\"Error reading /etc/passwd: %v\", err)\n\t\treturn\n\t}\n\tfor _, line := range strings.Split(string(passwd), \"\\n\") {\n\t\tif len(line) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tentries := strings.Split(line, \":\")\n\t\tname, id := entries[0], entries[2]\n\t\tif id == uid {\n\t\t\tfmt.Println(\"User:\", name)\n\t\t\tfmt.Println(\"Uid:\", id)\n\t\t\treturn\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "examples/nonroot/testdata/user.yaml",
    "content": "schemaVersion: \"1.0.0\"\ncommandTests:\n  - name: user\n    command: ['/user']\n    expectedOutput: ['User: nonroot', 'Uid: 1002']\n"
  },
  {
    "path": "examples/python3/BUILD",
    "content": "# Public notice: this file is for internal documentation, testing, and\n# reference only. Note that repo maintainers can freely change any part of the\n# repository code at any time.\nload(\"@rules_oci//oci:defs.bzl\", \"oci_image\", \"oci_load\")\nload(\"//private/util:tar.bzl\", \"tar\")\nload(\"//python3:config.bzl\", DISTROS = \"PYTHON_DISTROS\")\n\ntar(\n    name = \"hello_py\",\n    srcs = [\"hello.py\"],\n)\n\n# This example runs a python program that walks the filesystem under \"/etc\" and prints every filename.\n[\n    oci_image(\n        name = \"hello_\" + distro,\n        base = \"//python3:python3_root_amd64_\" + distro,\n        cmd = [\n            \"hello.py\",\n            \"/etc\",\n        ],\n        tars = [\n            \":hello_py\",\n        ],\n    )\n    for distro in DISTROS\n]\n\n# Run\n# bazel run //examples/python3:tarball_debian12\n# podman run localhost/distroless/examples/py:latest\n[\n    oci_load(\n        name = \"tarball_\" + distro,\n        image = \":hello_\" + distro,\n        repo_tags = [\"distroless/examples/py:latest\"],\n    )\n    for distro in DISTROS\n]\n"
  },
  {
    "path": "examples/python3/Dockerfile",
    "content": "FROM python:3-slim AS build-env\nCOPY . /app\nWORKDIR /app\n\nFROM gcr.io/distroless/python3\nCOPY --from=build-env /app /app\nWORKDIR /app\nCMD [\"hello.py\", \"/etc\"]\n"
  },
  {
    "path": "examples/python3/hello.py",
    "content": "#!/bin/python\n\n# Copyright 2017 Google Inc. All rights reserved.\n\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n\n#     http://www.apache.org/licenses/LICENSE-2.0\n\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nimport argparse\nimport os\n\nparser = argparse.ArgumentParser()\nparser.add_argument('root', type=str,\n                    help='The root directory to walk.')\n\ndef main(args):\n    \"\"\"Prints the files that are inside the container, rooted at the first argument.\"\"\"\n    for dirpath, _, files in os.walk(args.root):\n        for f in files:\n            print(os.path.join(dirpath, f))\n\nif __name__ == \"__main__\":\n    main(parser.parse_args())\n"
  },
  {
    "path": "examples/python3-requirements/Dockerfile",
    "content": "# Build a virtualenv using the appropriate Debian release\n# * Install python3-venv for the built-in Python3 venv module (not installed by default)\n# * Install gcc libpython3-dev to compile C Python modules\n# * In the virtualenv: Update pip setuputils and wheel to support building new packages\nFROM debian:12-slim AS build\nRUN apt-get update && \\\n    apt-get install --no-install-suggests --no-install-recommends --yes python3-venv gcc libpython3-dev && \\\n    python3 -m venv /venv && \\\n    /venv/bin/pip install --upgrade pip setuptools wheel\n\n# Build the virtualenv as a separate step: Only re-execute this step when requirements.txt changes\nFROM build AS build-venv\nCOPY requirements.txt /requirements.txt\nRUN /venv/bin/pip install --disable-pip-version-check -r /requirements.txt\n\n# Copy the virtualenv into a distroless image\nFROM gcr.io/distroless/python3-debian12\nCOPY --from=build-venv /venv /venv\nCOPY . /app\nWORKDIR /app\nENTRYPOINT [\"/venv/bin/python3\", \"psutil_example.py\"]\n"
  },
  {
    "path": "examples/python3-requirements/README.md",
    "content": "# Python 3 with requirements.txt\n\nThis is a Python 3 application that specifies third-party dependencies using requirements.txt. The\npsutil module it uses is a C module that must be compiled. This is the most annoying kind of\ndependency, since you need to build it in an environment where the C library and Python version\nmatch where it will run.\n\nIt builds the final container in three stages:\n\n1. `build`: Set up a Debian build environment that can compile Python C modules.\n2. `build-venv`: Create a virtualenv using `requirements.txt`.\n3. Output: Copy the venv and the code and build the final image.\n\nThe first step is only re-executed if you edit `Dockerfile`. The second step is only re-executed\nif you change requirements.txt. The final step is very fast and will change on every code edit.\n\n\n## Build and run\n\n1. Build the image: `docker build . --tag=psutil-example`\n2. Run it! `docker run --rm psutil-example`\n\n\n## Example output\n\n```\nRSS: 13.0 MiB;  SHARED: 5.7 MiB; VIRTUAL: 19.9 MiB\n```\n\n\n## TODO: Bazel\n\nIt would be nice if we could show how to build this container with Bazel, but I don't actually know\nhow to do that.\n"
  },
  {
    "path": "examples/python3-requirements/psutil_example.py",
    "content": "#!/usr/bin/env python3\n\n# Distroless's test.sh runs pylint on all python files, but this module will not exist\n# pylint: disable=import-error\nimport psutil\n\n\ndef mib(total_bytes):\n    '''Converts bytes to MiB (float).'''\n    return total_bytes / 1024 / 1024\n\n\ndef main():\n    current_process = psutil.Process()\n    memory = current_process.memory_info()\n    print(f'RSS: {mib(memory.rss):.1f} MiB;  SHARED: {mib(memory.shared):.1f} MiB; VIRTUAL: {mib(memory.vms):.1f} MiB')\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "examples/python3-requirements/requirements.txt",
    "content": "# this version of psutil does not ship binary wheels: must be compiled\npsutil==5.6.6\n"
  },
  {
    "path": "examples/rust/.dockerignore",
    "content": ".git/\ntarget/\n"
  },
  {
    "path": "examples/rust/BUILD",
    "content": "# Public notice: this file is for internal documentation, testing, and\n# reference only. Note that repo maintainers can freely change any part of the\n# repository code at any time.\n\n# Rust\nload(\"//private/oci:defs.bzl\", \"rust_image\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\n# NOTE: Bazel Rust rules don't support cross-compilation yet,\n# so at this time it's required that you build on the same platform as the image\nrust_image(\n    name = \"rust_example\",\n    srcs = [\"src/main.rs\"],\n    base = \"//cc:cc_root_amd64_debian12\",\n    tags = [\n        \"amd64\",\n        \"manual\",\n    ],\n)\n"
  },
  {
    "path": "examples/rust/Cargo.toml",
    "content": "[package]\nname = \"hello-world-distroless\"\nversion = \"0.1.0\"\nauthors = [\"Bryant Hagadorn <blhagadorn@gmail.com>\"]\n\n[dependencies]\n"
  },
  {
    "path": "examples/rust/Dockerfile",
    "content": "FROM rust:1 as build-env\nWORKDIR /app\nCOPY . /app\nRUN cargo build --release\n\nFROM gcr.io/distroless/cc-debian12\nCOPY --from=build-env /app/target/release/hello-world-distroless /\nCMD [\"./hello-world-distroless\"]\n"
  },
  {
    "path": "examples/rust/src/main.rs",
    "content": "fn main() {\n    println!(\"Hello World!\");\n}\n"
  },
  {
    "path": "examples/test.sh",
    "content": "#!/usr/bin/env bash\n\nset -euo pipefail\n\nfor d in examples/*; do\n\t# Skip non-directories.\n\tif [[ ! -d \"$d\" ]]; then continue; fi\n\n\t# Skip if the directory doesn't have a Dockerfile.\n\tif [[ ! -f $d/Dockerfile ]]; then continue; fi\n\n\t# Skip these non-working examples.\n\tif [[ $d == \"examples/cc\" ]]; then continue; fi\n\n\t# Build the Dockerfile and run the image, or fail.\n\techo ====================================\n\techo = building $d\n\techo ====================================\n\tdocker build -t $d ./$d/\n\tdocker run $d\ndone\n"
  },
  {
    "path": "experimental/BUILD",
    "content": ""
  },
  {
    "path": "experimental/busybox/BUILD",
    "content": "load(\"//:distro.bzl\", BUSYBOX_ARCHITECTURES = \"ALL_ARCHITECTURES\")\nload(\":commands.bzl\", \"busybox_layer\")\n\npackage(default_visibility = [\"//static:__subpackages__\"])\n\n[\n    busybox_layer(\n        name = \"busybox_\" + arch,\n        busybox = \"@busybox_\" + arch + \"//:file\",\n        compress = \"gzip\",\n    )\n    for arch in BUSYBOX_ARCHITECTURES\n]\n"
  },
  {
    "path": "experimental/busybox/commands.bzl",
    "content": "load(\"@aspect_bazel_lib//lib:tar.bzl\", \"tar\")\n\nBUSYBOX_COMMANDS = [\n    \"[\",\n    \"[[\",\n    \"acpid\",\n    \"add-shell\",\n    \"addgroup\",\n    \"adduser\",\n    \"adjtimex\",\n    \"ar\",\n    \"arp\",\n    \"arping\",\n    \"ash\",\n    \"awk\",\n    \"base64\",\n    \"basename\",\n    \"blkdiscard\",\n    \"blkid\",\n    \"blockdev\",\n    \"bootchartd\",\n    \"brctl\",\n    \"bunzip2\",\n    \"bzcat\",\n    \"bzip2\",\n    \"cal\",\n    \"cat\",\n    \"chat\",\n    \"chattr\",\n    \"chgrp\",\n    \"chmod\",\n    \"chown\",\n    \"chpasswd\",\n    \"chpst\",\n    \"chroot\",\n    \"chrt\",\n    \"chvt\",\n    \"cksum\",\n    \"clear\",\n    \"cmp\",\n    \"comm\",\n    \"conspy\",\n    \"cp\",\n    \"cpio\",\n    \"crond\",\n    \"crontab\",\n    \"cryptpw\",\n    \"cttyhack\",\n    \"cut\",\n    \"date\",\n    \"dc\",\n    \"dd\",\n    \"deallocvt\",\n    \"delgroup\",\n    \"deluser\",\n    \"depmod\",\n    \"devmem\",\n    \"df\",\n    \"dhcprelay\",\n    \"diff\",\n    \"dirname\",\n    \"dmesg\",\n    \"dnsd\",\n    \"dnsdomainname\",\n    \"dos2unix\",\n    \"dpkg\",\n    \"dpkg-deb\",\n    \"du\",\n    \"dumpkmap\",\n    \"dumpleases\",\n    \"echo\",\n    \"ed\",\n    \"egrep\",\n    \"eject\",\n    \"env\",\n    \"envdir\",\n    \"envuidgid\",\n    \"expand\",\n    \"expr\",\n    \"factor\",\n    \"fakeidentd\",\n    \"false\",\n    \"fatattr\",\n    \"fbset\",\n    \"fbsplash\",\n    \"fdflush\",\n    \"fdformat\",\n    \"fdisk\",\n    \"fgconsole\",\n    \"fgrep\",\n    \"find\",\n    \"findfs\",\n    \"flash_eraseall\",\n    \"flash_lock\",\n    \"flash_unlock\",\n    \"flashcp\",\n    \"flock\",\n    \"fold\",\n    \"free\",\n    \"freeramdisk\",\n    \"fsck\",\n    \"fsck.minix\",\n    \"fsfreeze\",\n    \"fstrim\",\n    \"fsync\",\n    \"ftpd\",\n    \"ftpget\",\n    \"ftpput\",\n    \"fuser\",\n    \"getopt\",\n    \"getty\",\n    \"grep\",\n    \"groups\",\n    \"gunzip\",\n    \"gzip\",\n    \"halt\",\n    \"hd\",\n    \"hdparm\",\n    \"head\",\n    \"hexdump\",\n    \"hostid\",\n    \"hostname\",\n    \"httpd\",\n    \"hush\",\n    \"hwclock\",\n    \"i2cdetect\",\n    \"i2cdump\",\n    \"i2cget\",\n    \"i2cset\",\n    \"id\",\n    \"ifconfig\",\n    \"ifenslave\",\n    \"ifplugd\",\n    \"inetd\",\n    \"init\",\n    \"inotifyd\",\n    \"insmod\",\n    \"install\",\n    \"ionice\",\n    \"iostat\",\n    \"ip\",\n    \"ipaddr\",\n    \"ipcalc\",\n    \"ipcrm\",\n    \"ipcs\",\n    \"iplink\",\n    \"ipneigh\",\n    \"iproute\",\n    \"iprule\",\n    \"iptunnel\",\n    \"kbd_mode\",\n    \"kill\",\n    \"killall\",\n    \"killall5\",\n    \"klogd\",\n    \"last\",\n    \"less\",\n    \"link\",\n    \"linux32\",\n    \"linux64\",\n    \"linuxrc\",\n    \"ln\",\n    \"loadfont\",\n    \"loadkmap\",\n    \"logger\",\n    \"login\",\n    \"logname\",\n    \"losetup\",\n    \"lpd\",\n    \"lpq\",\n    \"lpr\",\n    \"ls\",\n    \"lsattr\",\n    \"lsmod\",\n    \"lsof\",\n    \"lspci\",\n    \"lsscsi\",\n    \"lsusb\",\n    \"lzcat\",\n    \"lzma\",\n    \"lzop\",\n    \"lzopcat\",\n    \"makedevs\",\n    \"makemime\",\n    \"man\",\n    \"md5sum\",\n    \"mdev\",\n    \"mesg\",\n    \"microcom\",\n    \"mkdir\",\n    \"mkdosfs\",\n    \"mke2fs\",\n    \"mkfifo\",\n    \"mkfs.ext2\",\n    \"mkfs.minix\",\n    \"mkfs.vfat\",\n    \"mknod\",\n    \"mkpasswd\",\n    \"mkswap\",\n    \"mktemp\",\n    \"modinfo\",\n    \"modprobe\",\n    \"more\",\n    \"mount\",\n    \"mountpoint\",\n    \"mpstat\",\n    \"mt\",\n    \"mv\",\n    \"nameif\",\n    \"nbd-client\",\n    \"nc\",\n    \"netstat\",\n    \"nice\",\n    \"nl\",\n    \"nmeter\",\n    \"nohup\",\n    \"nproc\",\n    \"ntpd\",\n    \"od\",\n    \"openvt\",\n    \"partprobe\",\n    \"passwd\",\n    \"paste\",\n    \"patch\",\n    \"pgrep\",\n    \"pidof\",\n    \"ping\",\n    \"ping6\",\n    \"pipe_progress\",\n    \"pivot_root\",\n    \"pkill\",\n    \"pmap\",\n    \"popmaildir\",\n    \"poweroff\",\n    \"powertop\",\n    \"printenv\",\n    \"printf\",\n    \"ps\",\n    \"pscan\",\n    \"pstree\",\n    \"pwd\",\n    \"pwdx\",\n    \"raidautorun\",\n    \"rdate\",\n    \"rdev\",\n    \"readlink\",\n    \"readprofile\",\n    \"realpath\",\n    \"reboot\",\n    \"reformime\",\n    \"remove-shell\",\n    \"renice\",\n    \"reset\",\n    \"resize\",\n    \"rev\",\n    \"rm\",\n    \"rmdir\",\n    \"rmmod\",\n    \"route\",\n    \"rpm\",\n    \"rpm2cpio\",\n    \"rtcwake\",\n    \"run-parts\",\n    \"runlevel\",\n    \"runsv\",\n    \"runsvdir\",\n    \"rx\",\n    \"script\",\n    \"scriptreplay\",\n    \"sed\",\n    \"sendmail\",\n    \"seq\",\n    \"setarch\",\n    \"setconsole\",\n    \"setfont\",\n    \"setkeycodes\",\n    \"setlogcons\",\n    \"setpriv\",\n    \"setserial\",\n    \"setsid\",\n    \"setuidgid\",\n    \"sh\",\n    \"sha1sum\",\n    \"sha256sum\",\n    \"sha3sum\",\n    \"sha512sum\",\n    \"showkey\",\n    \"shred\",\n    \"shuf\",\n    \"slattach\",\n    \"sleep\",\n    \"smemcap\",\n    \"softlimit\",\n    \"sort\",\n    \"split\",\n    \"ssl_client\",\n    \"start-stop-daemon\",\n    \"stat\",\n    \"strings\",\n    \"stty\",\n    \"su\",\n    \"sulogin\",\n    \"sum\",\n    \"sv\",\n    \"svc\",\n    \"svlogd\",\n    \"swapoff\",\n    \"swapon\",\n    \"switch_root\",\n    \"sync\",\n    \"sysctl\",\n    \"syslogd\",\n    \"tac\",\n    \"tail\",\n    \"tar\",\n    \"taskset\",\n    \"tcpsvd\",\n    \"tee\",\n    \"telnet\",\n    \"telnetd\",\n    \"test\",\n    \"tftp\",\n    \"tftpd\",\n    \"time\",\n    \"timeout\",\n    \"top\",\n    \"touch\",\n    \"tr\",\n    \"traceroute\",\n    \"traceroute6\",\n    \"true\",\n    \"truncate\",\n    \"tty\",\n    \"ttysize\",\n    \"tunctl\",\n    \"tune2fs\",\n    \"ubiattach\",\n    \"ubidetach\",\n    \"ubimkvol\",\n    \"ubirename\",\n    \"ubirmvol\",\n    \"ubirsvol\",\n    \"ubiupdatevol\",\n    \"udhcpc\",\n    \"udhcpd\",\n    \"udpsvd\",\n    \"uevent\",\n    \"umount\",\n    \"uname\",\n    \"uncompress\",\n    \"unexpand\",\n    \"uniq\",\n    \"unix2dos\",\n    \"unlink\",\n    \"unlzma\",\n    \"unlzop\",\n    \"unxz\",\n    \"unzip\",\n    \"uptime\",\n    \"users\",\n    \"usleep\",\n    \"uudecode\",\n    \"uuencode\",\n    \"vconfig\",\n    \"vi\",\n    \"vlock\",\n    \"volname\",\n    \"w\",\n    \"wall\",\n    \"watch\",\n    \"watchdog\",\n    \"wc\",\n    \"wget\",\n    \"which\",\n    \"who\",\n    \"whoami\",\n    \"whois\",\n    \"xargs\",\n    \"xxd\",\n    \"xz\",\n    \"xzcat\",\n    \"yes\",\n    \"zcat\",\n    \"zcip\",\n]\n\nBUSYBOX_ARCHIVE_BUILD = \"\"\"\\\nfilegroup(\n    name = \"file\",\n    srcs = [\"bin/busybox\"],\n    visibility = [\"//visibility:public\"]\n)\n\"\"\"\n\ndef busybox_layer(busybox, **kwargs):\n    tar(\n        srcs = [busybox],\n        mtree = [\n            \"./busybox/ uid=0 gid=0 mode=0755 time=0.0 type=dir\",\n            \"./busybox/busybox uid=0 gid=0 mode=0755 time=0.0 type=file content=$(location {})\".format(busybox),\n        ] + [\n            \"./busybox/{cmd} uid=0 gid=0 mode=0755 time=0.0 type=link link=/busybox/busybox\".format(cmd = cmd)\n            for cmd in BUSYBOX_COMMANDS\n        ],\n        **kwargs\n    )\n"
  },
  {
    "path": "java/BUILD",
    "content": "load(\":config.bzl\", \"JAVA_ARCHITECTURES\", \"JAVA_BASE_PACKAGES\", \"JAVA_DISTROS\")\nload(\":java.bzl\", \"java_base_image\", \"java_base_image_index\", \"java_image\", \"java_image_index\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\n# publishable java base images\n[\n    java_base_image(\n        distro,\n        arch,\n        JAVA_BASE_PACKAGES[distro],\n    )\n    for distro in JAVA_DISTROS\n    for arch in JAVA_ARCHITECTURES[distro]\n]\n\n[\n    java_base_image_index(\n        distro,\n        JAVA_ARCHITECTURES[distro],\n    )\n    for distro in JAVA_DISTROS\n]\n\n# publishable java temurin images from adoptium deb repository\nADOPTIUM_DEB_PER_DISTRO = [\n    (\"17\", \"debian13\"),\n    (\"21\", \"debian13\"),\n    (\"25\", \"debian13\"),\n]\n\n[\n    java_image(distro, java_version, arch)\n    for java_version, distro in ADOPTIUM_DEB_PER_DISTRO\n    for arch in JAVA_ARCHITECTURES[distro]\n]\n\n# all image indexes\n[\n    java_image_index(\n        distro,\n        java_version,\n        JAVA_ARCHITECTURES[distro],\n    )\n    for java_version, distro in ADOPTIUM_DEB_PER_DISTRO\n]\n"
  },
  {
    "path": "java/README.md",
    "content": "# Documentation for `gcr.io/distroless/java`\n\n## Image Contents\n\nThis image contains a minimal Linux, OpenJDK-based runtime.\n\nSpecifically, the image contains everything in the [base image](../base/README.md), plus:\n\n* Temurin OpenJDK 17 (`gcr.io/distroless/java17-debian13`) and its dependencies.\n* Temurin OpenJDK 21 (`gcr.io/distroless/java21-debian13`) and its dependencies\n* Temurin OpenJDK 25 (`gcr.io/distroless/java25-debian13`) and its dependencies\n\n## Usage\n\nThe entrypoint of this image is set to the equivalent of \"java -jar\", so this image expects users to supply a path to a JAR file in the CMD.\n\n## Add another JAVA version\n\nTo support a new JAVA version you need to do the following steps:\n- Add the new version to `ADOPTIUM_DEB_PER_DISTRO` in [java/BUILD](BUILD).\n- Add the new version to `JAVA_MAJOR_VERSIONS` in [java/config.bzl](config.bzl).\n- Add two yaml files in the [java/testdata](testdata) folder to prepare the tests, you can take inspiration on the other files.\n\nYou can then ensure everything works on this folder with `bazel build //java:...`\n"
  },
  {
    "path": "java/config.bzl",
    "content": "JAVA_DISTROS = [\"debian13\"]\nJAVA_ARCHITECTURES = {\n    \"debian13\": [\"amd64\", \"arm64\", \"s390x\", \"ppc64le\", \"riscv64\"],\n}\nJAVA_MAJOR_VERSIONS = {\n    \"debian13\": [\"17\", \"21\", \"25\"],\n}\n\nJAVA_BASE_PACKAGES = {\n    # debian 13 - temurin ships with libharfbuzz already\n    \"debian13\": [\n        \"zlib1g\",\n        \"libjpeg62-turbo\",\n        \"liblcms2-2\",\n        \"libfreetype6\",\n        \"fonts-dejavu-core\",\n        \"fontconfig-config\",\n        \"libexpat1\",\n        \"libfontconfig1\",\n        \"libuuid1\",\n        \"libbrotli1\",\n        \"libcrypt1\",\n        \"libstdc++6\",\n        \"libgcc-s1\",\n        \"gcc-14-base\",\n        \"libpng16-16t64\",\n        \"libbz2-1.0\",\n    ],\n}\n"
  },
  {
    "path": "java/control",
    "content": "Package: Eclipse Temurin\nVersion: {{VERSION}}\nArchitecture: {{ARCHITECTURE}}\nMaintainer: Adoptium Working Group <https://adoptium.net/>\nHomepage: https://adoptium.net\nSHA256: {{SHA256}}\nDescription: Eclipse Temurin is the name of the OpenJDK distribution from Adoptium.\n"
  },
  {
    "path": "java/java.bzl",
    "content": "\"java image definitions\"\n\nload(\"@container_structure_test//:defs.bzl\", \"container_structure_test\")\nload(\"@rules_oci//oci:defs.bzl\", \"oci_image\", \"oci_image_index\")\nload(\"//common:variables.bzl\", \"DEBUG_MODE\", \"USERS\")\nload(\"//java:jre_ver.bzl\", \"jre_ver\")\nload(\"//private/oci:defs.bzl\", oci_java_image = \"java_image\")\nload(\"//private/util:deb.bzl\", \"deb\")\nload(\"//private/util:java_cacerts.bzl\", \"java_cacerts\")\nload(\"//private/util:tar.bzl\", \"tar\")\n\ndef ca_certs(distro, arch):\n    \"\"\"java ca certs for a specific arch and distro\n    \"\"\"\n\n    if native.existing_rule(\"cacerts_java_\" + arch + \"_\" + distro):\n        return\n\n    java_cacerts(\n        name = \"cacerts_java_\" + arch + \"_\" + distro,\n        archive = \"//common:cacerts_\" + distro + \"_\" + arch,\n    )\n\ndef java_base_image_index(distro, architectures):\n    \"\"\"java base image index for a distro\n\n    Args:\n        distro: name of distribution\n        architectures: all architectures included in index\n    \"\"\"\n    for mode in DEBUG_MODE:\n        for user in USERS:\n            oci_image_index(\n                name = \"java_base\" + mode + \"_\" + user + \"_\" + distro,\n                images = [\n                    \"java_base\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro\n                    for arch in architectures\n                ],\n            )\n\ndef java_base_image(distro, arch, packages):\n    \"\"\"java base for a distro/arch\n\n    Args:\n        distro: name of distribution\n        arch: the target arch\n        packages: to add to the image (from a debianX_java repo)\n    \"\"\"\n\n    # pre-req\n    ca_certs(distro, arch)\n\n    for mode in DEBUG_MODE:\n        for user in USERS:\n            oci_image(\n                name = \"java_base\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro,\n                base = \"//base:base_nossl\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro,\n                env = {\"LANG\": \"C.UTF-8\"},\n                tars = [\n                    deb.package(arch, distro, pkg, \"java\")\n                    for pkg in packages\n                ] + [\n                    \"//common:locale_\" + distro + \"_\" + arch,\n                    \":cacerts_java_\" + arch + \"_\" + distro,\n                ],\n            )\n\n    for mode in DEBUG_MODE:\n        for user in USERS:\n            container_structure_test(\n                name = \"java_base\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro + \"_test\",\n                configs = [\"testdata/java_base\" + mode + \".yaml\"],\n                image = \":java_base\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro,\n                tags = [\n                    arch,\n                    \"manual\",\n                ],\n            )\n\ndef java_image_index(distro, java_version, architectures):\n    \"\"\"java and debug image indexes (applies to all java_image builds)\n\n    Args:\n        distro: name of distribution\n        java_version: version of java\n        architectures: all architectures included in index\n    \"\"\"\n    for user in USERS:\n        for mode in DEBUG_MODE:\n            oci_image_index(\n                name = \"java\" + java_version + mode + \"_\" + user + \"_\" + distro,\n                images = [\n                    \"java\" + java_version + mode + \"_\" + user + \"_\" + arch + \"_\" + distro\n                    for arch in architectures\n                ],\n            )\n\ndef java_image(distro, java_version, arch):\n    \"\"\"java images from adoptium temurin deb distribution\n\n    Args:\n        distro: name of distribution\n        java_version: version of java\n        arch: the target arch\n    \"\"\"\n\n    # intermediary rule to configure jre symlinks\n    tar(\n        name = \"temurin_\" + java_version + \"_jre_\" + arch + \"_\" + distro,\n        extension = \"tar.gz\",\n        symlinks = {\n            \"/usr/bin/java\": \"/usr/lib/jvm/temurin-\" + java_version + \"-jre-\" + arch + \"/bin/java\",\n            \"/etc/ssl/certs/adoptium/cacerts\": \"/etc/ssl/certs/java/cacerts\",\n        },\n        deps = [\n            deb.package(\n                arch,\n                distro,\n                \"temurin-\" + java_version + \"-jre\",\n                \"adoptium\",\n            ),\n        ],\n    )\n\n    # intermediary rules to configure jdk symlinks\n    tar(\n        name = \"temurin_\" + java_version + \"_jdk_\" + arch + \"_\" + distro,\n        extension = \"tar.gz\",\n        symlinks = {\n            \"/usr/bin/java\": \"/usr/lib/jvm/temurin-\" + java_version + \"-jdk-\" + arch + \"/bin/java\",\n            \"/etc/ssl/certs/adoptium/cacerts\": \"/etc/ssl/certs/java/cacerts\",\n        },\n        deps = [\n            deb.package(\n                arch,\n                distro,\n                \"temurin-\" + java_version + \"-jdk\",\n                \"adoptium\",\n            ),\n        ],\n    )\n\n    # standard image builds\n    for user in USERS:\n        oci_image(\n            name = \"java\" + java_version + \"_\" + user + \"_\" + arch + \"_\" + distro,\n            base = \":java_base_\" + user + \"_\" + arch + \"_\" + distro,\n            # We expect users to use:\n            # cmd = [\"/path/to/deploy.jar\", \"--option1\", ...]\n            entrypoint = [\n                \"/usr/bin/java\",\n                \"-jar\",\n            ],\n            env = {\n                \"JAVA_VERSION\": jre_ver(deb.version(\n                    arch,\n                    distro,\n                    \"temurin-\" + java_version + \"-jre\",\n                    \"adoptium\",\n                )),\n            },\n            tars = [\n                # we use system certs, but we might want to pull this out of the distro\n                # like we did for the github released temurin\n                \":temurin_\" + java_version + \"_jre_\" + arch + \"_\" + distro,\n            ],\n        )\n\n    # debug image builds\n    for user in USERS:\n        oci_image(\n            name = \"java\" + java_version + \"_debug_\" + user + \"_\" + arch + \"_\" + distro,\n            base = \":java_base_debug_\" + user + \"_\" + arch + \"_\" + distro,\n            # We expect users to use:\n            # cmd = [\"/path/to/deploy.jar\", \"--option1\", ...]\n            entrypoint = [\n                \"/usr/bin/java\",\n                \"-jar\",\n            ],\n            env = {\n                \"JAVA_VERSION\": jre_ver(deb.version(\n                    arch,\n                    distro,\n                    \"temurin-\" + java_version + \"-jdk\",\n                    \"adoptium\",\n                )),\n            },\n            tars = [\n                # we use system certs, but we might want to pull this out of the distro\n                # like we did for the github released temurin\n                \":cacerts_java_\" + arch + \"_\" + distro,\n                \":temurin_\" + java_version + \"_jdk_\" + arch + \"_\" + distro,\n            ],\n        )\n\n    java_tests(distro, java_version, arch)\n\ndef java_tests(distro, java_version, arch):\n    \"\"\"Tests for java images.\n\n    Args:\n        distro: name of distribution\n        java_version: version of java\n        arch: the target arch\n    \"\"\"\n    for user in USERS:\n        container_structure_test(\n            name = \"java\" + java_version + \"_\" + user + \"_\" + arch + \"_\" + distro + \"_test\",\n            configs = [\"testdata/java\" + java_version + \"_\" + distro + \".yaml\"],\n            image = \":java\" + java_version + \"_\" + user + \"_\" + arch + \"_\" + distro,\n            tags = [\n                arch,\n                \"manual\",\n            ],\n        )\n\n    for user in USERS:\n        container_structure_test(\n            name = \"java\" + java_version + \"_debug_\" + user + \"_\" + arch + \"_\" + distro + \"_test\",\n            configs = [\"testdata/java\" + java_version + \"_debug\" + \"_\" + distro + \".yaml\"],\n            image = \":java\" + java_version + \"_debug_\" + user + \"_\" + arch + \"_\" + distro,\n            tags = [\n                arch,\n                \"manual\",\n            ],\n        )\n\n    if arch == \"amd64\":\n        for user in USERS:\n            oci_java_image(\n                name = \"check_certs_java\" + java_version + \"_\" + user + \"_\" + distro,\n                srcs = [\"testdata/CheckCerts.java\"],\n                base = \"//java:java\" + java_version + \"_\" + user + \"_amd64_\" + distro,\n                main_class = \"testdata.CheckCerts\",\n            )\n\n        for user in USERS:\n            container_structure_test(\n                name = \"check_certs_java\" + java_version + \"_\" + user + \"_\" + distro + \"_test\",\n                configs = [\"testdata/java_certs.yaml\"],\n                image = \":check_certs_java\" + java_version + \"_\" + user + \"_\" + distro,\n                tags = [\n                    \"amd64\",\n                    \"manual\",\n                ],\n            )\n\n        for user in USERS:\n            oci_java_image(\n                name = \"check_encoding_java\" + java_version + \"_\" + user + \"_\" + distro,\n                srcs = [\"testdata/CheckEncoding.java\"],\n                base = \"//java:java\" + java_version + \"_\" + user + \"_amd64_\" + distro,\n                main_class = \"testdata.CheckEncoding\",\n            )\n\n        for user in USERS:\n            container_structure_test(\n                name = \"check_encoding_java\" + java_version + \"_\" + user + \"_\" + distro + \"_test\",\n                configs = [\"testdata/java_encoding.yaml\"],\n                image = \":check_encoding_java\" + java_version + \"_\" + user + \"_\" + distro,\n                tags = [\n                    \"amd64\",\n                    \"manual\",\n                ],\n            )\n\n        for user in USERS:\n            oci_java_image(\n                name = \"check_libharfbuzz_java\" + java_version + \"_\" + user + \"_\" + distro,\n                srcs = [\"testdata/CheckLibharfbuzz.java\"],\n                base = \"//java:java\" + java_version + \"_\" + user + \"_amd64_\" + distro,\n                main_class = \"testdata.CheckLibharfbuzz\",\n            )\n\n        for user in USERS:\n            container_structure_test(\n                name = \"check_libharfbuzz_java\" + java_version + \"_\" + user + \"_\" + distro + \"_test\",\n                configs = [\"testdata/java_libharfbuzz.yaml\"],\n                image = \":check_libharfbuzz_java\" + java_version + \"_\" + user + \"_\" + distro,\n                tags = [\n                    \"amd64\",\n                    \"manual\",\n                ],\n            )\n"
  },
  {
    "path": "java/jre_ver.bzl",
    "content": "def jre_ver(version):\n    \"\"\"Extract JRE version from a Debian openjdk downloaded filename.\n\n      Debian packages versions are of the form:\n         openjdk-11-jre*: 11.0.1+13-2~bpo9+1\n    \"\"\"\n    if version.startswith(\"11.\") or version.startswith(\"17.\") or version.startswith(\"21.\") or version.startswith(\"25.\"):\n        v = version.split(\"+\")[0].split(\".\")\n        return v[0] + \".\" + v[1] + \".\" + v[2]\n\n    fail(\"unrecognized openjdk package version: \" + version)\n"
  },
  {
    "path": "java/testdata/CheckCerts.java",
    "content": "package testdata;\n\nimport java.io.IOException;\nimport java.net.URL;\nimport javax.net.ssl.HttpsURLConnection;\n\npublic class CheckCerts {\n\n  public static void main(String[] args) throws IOException {\n    URL url = new URL(\"https://www.google.com/\");\n    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();\n    conn.connect();\n    conn.getServerCertificates(); // succeeds if peer verified\n\n    System.out.println(\"Successfully connected: \" + conn.getResponseCode());\n  }\n}\n"
  },
  {
    "path": "java/testdata/CheckEncoding.java",
    "content": "package testdata;\n\nimport java.nio.charset.Charset;\nimport java.util.Locale;\n\npublic class CheckEncoding {\n\n  public static void main(String[] args) {\n    System.out.println(\"LANG=\" + System.getenv(\"LANG\"));\n    System.out.println(\"Locale.getDefault()=\" + Locale.getDefault());\n    System.out.println(\"Charset.defaultCharset()=\" + Charset.defaultCharset());\n    System.out.println(\"file.encoding=\" + System.getProperty(\"file.encoding\"));\n    System.out.println(\"sun.jnu.encoding=\" + System.getProperty(\"sun.jnu.encoding\"));\n  }\n}\n"
  },
  {
    "path": "java/testdata/CheckLibharfbuzz.java",
    "content": "package testdata;\n\nimport java.awt.GraphicsEnvironment;\nimport java.awt.Font;\n\npublic class CheckLibharfbuzz {\n    public static void main(String[] args) {\n        GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();\n        Font [] fonts = env.getAllFonts();\n        if ( fonts.length > 0 ) {\n            System.out.println(fonts.length + \" fonts available\");\n        }\n    }\n}\n"
  },
  {
    "path": "java/testdata/java17_debian13.yaml",
    "content": "schemaVersion: \"2.0.0\"\ncommandTests:\n  - name: java\n    command: \"/usr/lib/jvm/temurin-17-jre-amd64/bin/java\"\n    args: [\"-version\"]\n    expectedError: ['openjdk version \"17.0.18']\n  - name: java-symlink\n    command: \"/usr/bin/java\"\n    args: [\"-version\"]\n    expectedError: ['openjdk version \"17.0.18']\nfileExistenceTests:\n  - name: certs\n    path: \"/etc/ssl/certs/java/cacerts\"\n    shouldExist: true\n  - name: certs\n    path: \"/etc/ssl/certs/adoptium/cacerts\"\n    permissions: 'Lrwxrwxrwx'\n    shouldExist: true\n  - name: certs\n    path: \"/usr/lib/jvm/temurin-17-jre-amd64/lib/security/cacerts\"\n    permissions: 'Lrwxrwxrwx'\n    shouldExist: true\n  - name: no-busybox\n    path: \"/busybox/sh\"\n    shouldExist: false\n  - name: no-shell\n    path: \"/bin/sh\"\n    shouldExist: false\n  - name: no-javac\n    path: \"/usr/lib/jvm/temurin-17-jre-amd64/bin/javac\"\n    shouldExist: false\n  - name: jexec-executable\n    path: \"/usr/lib/jvm/temurin-17-jre-amd64/lib/jexec\"\n    shouldExist: true\n    isExecutableBy: \"any\"\n  - name: jspawnhelper-executable\n    path: \"/usr/lib/jvm/temurin-17-jre-amd64/lib/jspawnhelper\"\n    shouldExist: true\n    isExecutableBy: \"any\"\nmetadataTest:\n  envVars:\n    - key: 'JAVA_VERSION'\n      value: '17.0.18'\n"
  },
  {
    "path": "java/testdata/java17_debug_debian13.yaml",
    "content": "schemaVersion: \"2.0.0\"\ncommandTests:\n  - name: java\n    command: \"/usr/lib/jvm/temurin-17-jdk-amd64/bin/java\"\n    args: [\"-version\"]\n    expectedError: ['openjdk version \"17.0.18\"']\n  - name: java-symlink\n    command: \"/usr/bin/java\"\n    args: [\"-version\"]\n    expectedError: ['openjdk version \"17.0.18\"']\n  - name: javac\n    command: \"/usr/lib/jvm/temurin-17-jdk-amd64/bin/javac\"\n    args: [\"-version\"]\n    expectedOutput: ['javac 17.0.18']\nfileExistenceTests:\n  - name: certs\n    path: \"/etc/ssl/certs/java/cacerts\"\n    shouldExist: true\n  - name: certs\n    path: \"/etc/ssl/certs/adoptium/cacerts\"\n    permissions: 'Lrwxrwxrwx'\n    shouldExist: true\n  - name: certs\n    path: \"/usr/lib/jvm/temurin-17-jdk-amd64/lib/security/cacerts\"\n    permissions: 'Lrwxrwxrwx'\n    shouldExist: true\n  - name: busybox\n    path: \"/busybox/sh\"\n    shouldExist: true\n  - name: no-shell\n    path: \"/bin/sh\"\n    shouldExist: false\nmetadataTest:\n  envVars:\n    - key: 'JAVA_VERSION'\n      value: '17.0.18'\n"
  },
  {
    "path": "java/testdata/java21_debian13.yaml",
    "content": "schemaVersion: \"2.0.0\"\ncommandTests:\n  - name: java\n    command: \"/usr/lib/jvm/temurin-21-jre-amd64/bin/java\"\n    args: [\"-version\"]\n    expectedError: ['openjdk version \"21.0.10\"']\n  - name: java-symlink\n    command: \"/usr/bin/java\"\n    args: [\"-version\"]\n    expectedError: ['openjdk version \"21.0.10\"']\nfileExistenceTests:\n  - name: certs\n    path: \"/etc/ssl/certs/java/cacerts\"\n    shouldExist: true\n  - name: certs\n    path: \"/etc/ssl/certs/adoptium/cacerts\"\n    permissions: 'Lrwxrwxrwx'\n    shouldExist: true\n  - name: certs\n    path: \"/usr/lib/jvm/temurin-21-jre-amd64/lib/security/cacerts\"\n    permissions: 'Lrwxrwxrwx'\n    shouldExist: true\n  - name: no-busybox\n    path: \"/busybox/sh\"\n    shouldExist: false\n  - name: no-shell\n    path: \"/bin/sh\"\n    shouldExist: false\n  - name: no-javac\n    path: \"/usr/lib/jvm/temurin-21-jre-amd64/bin/javac\"\n    shouldExist: false\n  - name: jexec-executable\n    path: \"/usr/lib/jvm/temurin-21-jre-amd64/lib/jexec\"\n    shouldExist: true\n    isExecutableBy: \"any\"\n  - name: jspawnhelper-executable\n    path: \"/usr/lib/jvm/temurin-21-jre-amd64/lib/jspawnhelper\"\n    shouldExist: true\n    isExecutableBy: \"any\"\nmetadataTest:\n  envVars:\n    - key: 'JAVA_VERSION'\n      value: '21.0.10'\n"
  },
  {
    "path": "java/testdata/java21_debug_debian13.yaml",
    "content": "schemaVersion: \"2.0.0\"\ncommandTests:\n  - name: java\n    command: \"/usr/lib/jvm/temurin-21-jdk-amd64/bin/java\"\n    args: [\"-version\"]\n    expectedError: ['openjdk version \"21.0.10\"']\n  - name: java-symlink\n    command: \"/usr/bin/java\"\n    args: [\"-version\"]\n    expectedError: ['openjdk version \"21.0.10\"']\n  - name: javac\n    command: \"/usr/lib/jvm/temurin-21-jdk-amd64/bin/javac\"\n    args: [\"-version\"]\n    expectedOutput: ['javac 21.0.10']\nfileExistenceTests:\n  - name: certs\n    path: \"/etc/ssl/certs/java/cacerts\"\n    shouldExist: true\n  - name: certs\n    path: \"/etc/ssl/certs/adoptium/cacerts\"\n    permissions: 'Lrwxrwxrwx'\n    shouldExist: true\n  - name: certs\n    path: \"/usr/lib/jvm/temurin-21-jdk-amd64/lib/security/cacerts\"\n    permissions: 'Lrwxrwxrwx'\n    shouldExist: true\n  - name: busybox\n    path: \"/busybox/sh\"\n    shouldExist: true\n  - name: no-shell\n    path: \"/bin/sh\"\n    shouldExist: false\nmetadataTest:\n  envVars:\n    - key: 'JAVA_VERSION'\n      value: '21.0.10'\n"
  },
  {
    "path": "java/testdata/java25_debian13.yaml",
    "content": "schemaVersion: \"2.0.0\"\ncommandTests:\n  - name: java\n    command: \"/usr/lib/jvm/temurin-25-jre-amd64/bin/java\"\n    args: [\"-version\"]\n    expectedError: ['openjdk version \"25.0.2\"']\n  - name: java-symlink\n    command: \"/usr/bin/java\"\n    args: [\"-version\"]\n    expectedError: ['openjdk version \"25.0.2\"']\nfileExistenceTests:\n  - name: certs\n    path: \"/etc/ssl/certs/java/cacerts\"\n    shouldExist: true\n  - name: certs\n    path: \"/etc/ssl/certs/adoptium/cacerts\"\n    permissions: 'Lrwxrwxrwx'\n    shouldExist: true\n  - name: certs\n    path: \"/usr/lib/jvm/temurin-25-jre-amd64/lib/security/cacerts\"\n    permissions: 'Lrwxrwxrwx'\n    shouldExist: true\n  - name: no-busybox\n    path: \"/busybox/sh\"\n    shouldExist: false\n  - name: no-shell\n    path: \"/bin/sh\"\n    shouldExist: false\n  - name: no-javac\n    path: \"/usr/lib/jvm/temurin-25-jre-amd64/bin/javac\"\n    shouldExist: false\n  - name: jexec-executable\n    path: \"/usr/lib/jvm/temurin-25-jre-amd64/lib/jexec\"\n    shouldExist: true\n    isExecutableBy: \"any\"\n  - name: jspawnhelper-executable\n    path: \"/usr/lib/jvm/temurin-25-jre-amd64/lib/jspawnhelper\"\n    shouldExist: true\n    isExecutableBy: \"any\"\nmetadataTest:\n  envVars:\n    - key: 'JAVA_VERSION'\n      value: '25.0.2'\n"
  },
  {
    "path": "java/testdata/java25_debug_debian13.yaml",
    "content": "schemaVersion: \"2.0.0\"\ncommandTests:\n  - name: java\n    command: \"/usr/lib/jvm/temurin-25-jdk-amd64/bin/java\"\n    args: [\"-version\"]\n    expectedError: ['openjdk version \"25.0.2\"']\n  - name: java-symlink\n    command: \"/usr/bin/java\"\n    args: [\"-version\"]\n    expectedError: ['openjdk version \"25.0.2\"']\n  - name: javac\n    command: \"/usr/lib/jvm/temurin-25-jdk-amd64/bin/javac\"\n    args: [\"-version\"]\n    expectedOutput: ['javac 25.0.2']\nfileExistenceTests:\n  - name: certs\n    path: \"/etc/ssl/certs/java/cacerts\"\n    shouldExist: true\n  - name: certs\n    path: \"/etc/ssl/certs/adoptium/cacerts\"\n    permissions: 'Lrwxrwxrwx'\n    shouldExist: true\n  - name: certs\n    path: \"/usr/lib/jvm/temurin-25-jdk-amd64/lib/security/cacerts\"\n    permissions: 'Lrwxrwxrwx'\n    shouldExist: true\n  - name: busybox\n    path: \"/busybox/sh\"\n    shouldExist: true\n  - name: no-shell\n    path: \"/bin/sh\"\n    shouldExist: false\nmetadataTest:\n  envVars:\n    - key: 'JAVA_VERSION'\n      value: '25.0.2'\n"
  },
  {
    "path": "java/testdata/java_base.yaml",
    "content": "schemaVersion: \"2.0.0\"\nfileExistenceTests:\n  - name: certs\n    path: \"/etc/ssl/certs/java/cacerts\"\n    shouldExist: true\n  - name: no-busybox\n    path: \"/busybox/sh\"\n    shouldExist: false\n  - name: no-shell\n    path: \"/bin/sh\"\n    shouldExist: false\n  - name: no-jvm\n    path: \"/usr/lib/jvm\"\n    shouldExist: false\n"
  },
  {
    "path": "java/testdata/java_base_debug.yaml",
    "content": "schemaVersion: \"2.0.0\"\nfileExistenceTests:\n  - name: certs\n    path: \"/etc/ssl/certs/java/cacerts\"\n    shouldExist: true\n  - name: busybox\n    path: \"/busybox/sh\"\n    shouldExist: true\n  - name: no-shell\n    path: \"/bin/sh\"\n    shouldExist: false\n  - name: no-jvm\n    path: \"/usr/lib/jvm\"\n    shouldExist: false\n"
  },
  {
    "path": "java/testdata/java_certs.yaml",
    "content": "schemaVersion: \"1.0.0\"\ncommandTests:\n  - name: connect_to_https_google_com\n    # This is a bit ugly because structure tests can't test the default entrypoint yet.\n    command: [\"/usr/bin/java\",\n              \"-cp\",\n              \"/*\",\n              \"testdata.CheckCerts\"]\n    expectedOutput: ['Successfully connected: 200']\n"
  },
  {
    "path": "java/testdata/java_encoding.yaml",
    "content": "schemaVersion: \"1.0.0\"\ncommandTests:\n  - name: check_encoding\n    command: [\"/usr/bin/java\",\n              \"-cp\",\n              \"/*\",\n              \"testdata.CheckEncoding\"]\n    expectedOutput: ['LANG=C.UTF-8',\n                     'Locale.getDefault\\(\\)=en',\n                     'Charset.defaultCharset\\(\\)=UTF-8',\n                     'file.encoding=UTF-8',\n                     'sun.jnu.encoding=UTF-8']\n"
  },
  {
    "path": "java/testdata/java_libharfbuzz.yaml",
    "content": "schemaVersion: \"1.0.0\"\ncommandTests:\n  - name: check_libharfbuzz\n    command: [\"/usr/bin/java\",\n              \"-cp\",\n              \"/*\",\n              \"testdata.CheckLibharfbuzz\"]\n    expectedOutput: ['^\\d+ fonts available']\n"
  },
  {
    "path": "knife",
    "content": "#!/usr/bin/env bash\nset -o pipefail -o errexit -o nounset\n\n# Copyright 2024 Google Inc. All rights reserved.\n\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n\n#     http://www.apache.org/licenses/LICENSE-2.0\n\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nsource knife.d/update_java_versions.sh\n\nif [ $(uname) == \"Darwin\" ]; then\n    echo \"WARNING: You are on a macos, you need to run 'brew install coreutils gnu-sed' to install required packages.\"\n    echo \"\"\n    export PATH=\"/opt/homebrew/opt/coreutils/libexec/gnubin:$PATH\"\n    export PATH=\"/opt/homebrew/opt/gnu-sed/libexec/gnubin:$PATH\"\nfi\n\nfunction cmd_lock_all() {\n    cmd_lock_snapshots\n    cmd_lock_non_snapshots\n}\n\nfunction cmd_lock_snapshots() {\n    echo \"🚧 Querying for snapshot repos\"\n    echo \"\"\n    local repos=$(grep -l snapshot.debian.org ./private/repos/deb/*.yaml | xargs -L 1 basename | cut -d. -f 1)\n    _cmd_lock \"$repos\"\n}\n\nfunction cmd_lock_non_snapshots() {\n    echo \"🚧 Querying for non_snapshot repos\"\n    echo \"\"\n    local repos=$(grep -lL snapshot.debian.org ./private/repos/deb/*.yaml | xargs -L 1 basename | cut -d. -f 1)\n    _cmd_lock \"$repos\"\n    update_java_versions_debian13\n}\n\nfunction _cmd_lock() {\n    local repos=\"$1\"\n    for repo in $repos; do\n      for i in $(seq 10); do\n        echo \"🔑 Locking $repo (attempt ${i})\"\n        bazel run \"@${repo}//:lock\" && break || sleep 20;\n        if [[ $i -eq 10 ]]; then\n          echo \"\"\n          echo \"Failed to lock $repo after 10 attempts\" >&2\n          exit 1\n        fi\n      done\n    done\n}\n\nfunction find_latest_snapshot() {\n    local type=\"$1\"\n    # If it's the first of the month, look at the last month, otherwise this -1 day has no effect since searches\n    # occur at the \"month\" level. This is an intentional buffer added to get the snapshots fully hydrated. We\n    # intentionally don't include complicated logic for the case where it's after the 1st and no snapshots are\n    # availalbe for the month (it's extremely unlikely for our updater to run into this situation unless the\n    # snapshot serving infrastructure is acting up).\n    local current=\"$(date -d '-1 day' +%Y-%m-%d)\"\n    local tmp=$(mktemp)\n    local q=$(date -d \"$current\" +\"year=%Y&month=%m\")\n    if curl -fs \"https://snapshot.debian.org/archive/debian/?$q\" | grep -ohE \"([0-9]+T[0-9]+Z)\" > $tmp; then\n      # same logic as above, find the newest snapshot that isn't \"today\"\n      today=$(date +\"%Y%m%dT\")\n      cat $tmp | grep -v $today | tail -n1\n    fi\n}\n\nfunction cmd_update_snapshots() {\n    echo \"🧐 Looking for updates... \"\n    latest=$(find_latest_snapshot \"debian\")\n    latest_security=$(find_latest_snapshot \"debian-security\")\n    if [[ -z \"$latest\" || -z \"$latest_security\" ]]; then\n        echo \"\"\n        echo \"could not find any snapshots for debian or debian-security\"\n        exit 1\n    fi\n    echo \"\"\n    echo \"🎯 Found snapshots\"\n    echo \"   debian: $latest\"\n    echo \"   security: $latest_security\"\n    echo \"\"\n\n    # if tty ask for approval\n    if [ -t 1 ]; then\n        read -p \"Do you want to continue? (y/n) \" -n 1 -r\n        sleep 0.5\n        echo $'\\n'\n        if [[ ! \"$REPLY\" =~ ^[Yy]$ ]]; then\n            echo \"Aborting...\"\n            exit 0\n        fi\n    fi\n\n    for mpath in \"./private/repos/deb/\"*.yaml; do\n        if ! grep -q \"snapshot.debian.org\" \"$mpath\"; then\n            echo \"ignoring non-snapshot repo $mpath\"\n            continue\n        fi\n\n        current=$(grep -oE \"debian/([0-9]+T[0-9]+Z)\" $mpath | cut -d/ -f2 | head -n1)\n        current_security=$(grep -oE \"debian-security/([0-9]+T[0-9]+Z)\" $mpath | cut -d/ -f2 | head -n1)\n\n        if [[ \"$current\" == \"$latest\" && \"$current_security\" == \"$latest_security\" ]]; then\n            echo \"🎖️ $mpath is up to date.\"\n            continue\n        fi\n        echo \"🗞️ $mpath\"\n        if [[ \"$current\" != \"$latest\" ]]; then\n            sed -i -E \"s/(debian\\/)([0-9]+T[0-9]+Z)/\\1$latest/\" \"$mpath\"\n            echo \"   debian: $current -> $latest\"\n        fi\n        if [[ \"$current_security\" != \"$latest_security\" ]]; then\n            sed -i -E \"s/(debian-security\\/)([0-9]+T[0-9]+Z)/\\1$latest_security/\" \"$mpath\"\n            echo \"   debian-security: $current_security -> $latest_security\"\n        fi\n        echo \"\"\n    done\n    echo \"\"\n    echo \"👌 Done...\"\n}\n\n# write DISTROLESS_DIFF to GITHUB_ENV if changes are made\nfunction cmd_github_update_snapshots() {\n    local tmp=$(mktemp -d)\n    jq -nr 'inputs.packages[] | .key + \" \" + .sha256' ./private/repos/deb/*.lock.json | sort > \"$tmp/old.hashes\"\n    cmd_update_snapshots\n    cmd_lock_snapshots\n    jq -nr 'inputs.packages[] | .key + \" \" + .sha256' ./private/repos/deb/*.lock.json | sort > \"$tmp/new.hashes\"\n    diff \"$tmp/old.hashes\" \"$tmp/new.hashes\" | tee \"$tmp/diff\" || printf \"DISTROLESS_DIFF<<EOF\\n$(<$tmp/diff)\\nEOF\" >> \"$GITHUB_ENV\"\n}\n\nfunction cmd_lint () {\n    local mode=\"fix\"\n    if [[ \"${1:-}\" == \"--check\" ]]; then\n        mode=\"check\"\n    fi\n    echo \"🧹 Linting\"\n    echo \"\"\n    if ! which buildifier > /dev/null; then\n        echo \"🧱 No buildifier executable was found.\"\n        echo \" Did you follow the ./CONTRIBUTING.md ?\"\n        exit 1\n    fi\n    buildifier -mode=$mode $(find . -type f \\( -name 'BUILD*' -o -name 'WORKSPACE*' -o -name '*.bzl' \\))\n}\n\nfunction cmd_update_node_archives () {\n\tif ! which jq > /dev/null; then\n\t\techo \"🧱 No jq executable was found\"\n\t\texit 1\n    fi\n\tif ! which curl > /dev/null; then\n\t\techo \"🧱 No curl executable was found\"\n\t\texit 1\n\tfi\n\tif ! which node > /dev/null; then\n\t\techo \"🧱 No node executable was found\"\n\t\texit 1\n\tfi\n\n    versions=()\n    for major in 20 22 24; do\n        latest_version=$(curl -sSL https://nodejs.org/dist/index.json | jq -r --arg major \"v$major\" '\n            map(select(.version | startswith($major)))\n            | sort_by(.date) | reverse | .[0].version\n        ')\n        latest_nov=$(echo \"$latest_version\" | sed 's/^v//')\n        versions+=(\"$latest_nov\")\n    done\n\n    joined_versions=$(IFS=, ; echo \"${versions[*]}\")\n    node knife.d/update_node_archives.js \"$joined_versions\"\n}\n\n\nfunction cmd_test () {\n    echo \"🧪 Testing\"\n    echo \"\"\n\n    local arch=$(uname -m)\n    if [ ${arch} == \"x86_64\" ]; then\n      arch=\"amd64\"\n    fi\n\n    echo \"💡 only including image tests for $arch\"\n    echo \"\"\n\n    arch_specific_targets=$(bazel query \"attr(\\\"tags\\\", \"$arch\", \\\"//...\\\")\")\n\n    # Run all tests tagged with \"amd64\"\n    bazel test --test_timeout=900 //... $arch_specific_targets\n}\n\nfunction cmd_deb_versions () {\n    echo \"🔧 Printing .deb Versions (bookworm) from private/repos/deb/bookworm*.lock.json\"\n    echo \"\"\n\n    jq -n '[inputs.packages[]] | group_by(.arch) | map({(.[0].arch): map({package: .name, version: .version})})' private/repos/deb/bookworm*.lock.json\n}\n\ncase \"${1:-\"~~nocmd\"}\" in\nlock)\n    cmd_lock_all\n    ;;\nupdate-snapshots)\n    cmd_update_snapshots\n    ;;\nupdate-non-snapshots)\n    cmd_lock_non_snapshots\n    ;;\nlint)\n    cmd_lint \"${@:2}\"\n    ;;\ngithub-update-snapshots)\n    cmd_github_update_snapshots\n    ;;\ntest)\n    cmd_test\n    ;;\ndeb-versions)\n    cmd_deb_versions\n    ;;\nupdate-node-archives)\n\tcmd_update_node_archives\n\t;;\n~~nocmd) # no command provided\n    echo \"provide a command: lock, update-snapshots, github-update-snapshots, update-non-snapshots, test, deb-versions, update-node-archives\"\n    exit 1\n    ;;\n*) # unknown command\n    echo \"unknown command $1\"\n    exit 1\n    ;;\nesac\n"
  },
  {
    "path": "knife.d/update_java_versions.sh",
    "content": "set -o pipefail -o errexit -o nounset\n\n# Copyright 2024 Google Inc. All rights reserved.\n\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n\n#     http://www.apache.org/licenses/LICENSE-2.0\n\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# a collection of functions to use when updating java archives from the knife utility\n\n\nfunction update_java_versions_debian13() {\n  local java_versions=(\"17\" \"21\" \"25\")\n\n  for java_version in \"${java_versions[@]}\"; do\n    local version=$(jq -r --arg jv \"temurin-${java_version}-jre\" '.packages.[] | select((.arch==\"amd64\") and (.name==$jv)) | .version | split(\".\") | .[0:3] | join(\".\")' private/repos/deb/trixie_adoptium.lock.json)\n    local major_version=$(echo \"$version\" | cut -d. -f 1)\n    sed -i -r -e \"s/${major_version}\\\\.[0-9]+\\\\.[0-9]+/${version}/g\" java/testdata/java${major_version}*debian13.yaml\n  done\n}\n"
  },
  {
    "path": "knife.d/update_node_archives.js",
    "content": "#!/usr/bin/env node\nconst crypto = require(\"crypto\");\nconst https = require(\"https\");\nconst fs = require(\"fs\");\n\nif (process.argv.length < 3) {\n  console.error(\"Usage: node nodeChecksum.js <nodejs_version>\");\n  process.exit(1);\n}\n\nconst versions = process.argv[2].split(\",\");\nconst architectures = [\"amd64\", \"arm64\", \"arm\", \"ppc64le\", \"s390x\"];\n\nconst nodeVersions = {};\n\nconst calculateChecksum = (url) => {\n  return new Promise((resolve, reject) => {\n    https\n      .get(url, (res) => {\n        const hash = crypto.createHash(\"sha256\");\n        res.on(\"data\", (data) => {\n          hash.update(data);\n        });\n        res.on(\"end\", () => {\n          resolve(hash.digest(\"hex\"));\n        });\n      })\n      .on(\"error\", (err) => {\n        reject(`Error downloading file: ${err.message}`);\n      });\n  });\n};\n\nconst fetchChecksums = async () => {\n  for (const nodeVersion of versions) {\n    const major = parseInt(nodeVersion.split(\".\")[0]);\n    nodeVersions[nodeVersion] = {};\n    await Promise.all(\n      architectures.map(async (key) => {\n        let arch = key;\n        if (major > 22 && key === \"arm\") {\n          return;\n        }\n        if (key === \"amd64\") {\n          arch = \"x64\";\n        } else if (key === \"arm\") {\n          arch = \"armv7l\";\n        }\n        const url = `https://nodejs.org/dist/v${nodeVersion}/node-v${nodeVersion}-linux-${arch}.tar.gz`;\n        try {\n          const checksum = await calculateChecksum(url);\n          nodeVersions[nodeVersion][key] = {\n            checksum,\n            suffix: arch,\n          };\n        } catch (error) {\n          console.error(error);\n        }\n      })\n    );\n  }\n};\n\nfetchChecksums().then(() => {\n  let nodeArchives = `\"node\"\n\nBUILD_TMPL = \"\"\"\\\\\n# GENERATED BY node_archive.bzl\nload(\"@distroless//private/pkg:debian_spdx.bzl\", \"debian_spdx\")\nload(\"@distroless//private/util:merge_providers.bzl\", \"merge_providers\")\nload(\"@distroless//private/util:tar.bzl\", \"tar\")\n\ntar(\n    name = \"data\",\n    extension = \"tar.gz\",\n    srcs = glob(\n        [\n            \"output/bin/node\",\n            \"output/LICENSE\",\n        ],\n    ),\n    package_dir = \"/nodejs\",\n    strip_prefix = \"external/{canonical_name}/output\"\n)\n\ntar(\n    name = \"_control\",\n    extension = \"tar.gz\",\n    srcs = [\"control\"]\n)\n\ndebian_spdx(\n    name = \"spdx\",\n    control = \":_control\",\n    data = \":data\",\n    package_name = \"{package_name}\",\n    spdx_id = \"{spdx_id}\",\n    sha256 = \"{sha256}\",\n    urls = [{urls}]\n)\n\nmerge_providers(\n    name = \"{name}\",\n    srcs = [\":data\", \":spdx\"],\n    visibility = [\"//visibility:public\"],\n)\n\"\"\"\n\ndef _impl(rctx):\n    rctx.report_progress(\"Fetching {}\".format(rctx.attr.package_name))\n    rctx.download_and_extract(\n        url = rctx.attr.urls,\n        sha256 = rctx.attr.sha256,\n        type = rctx.attr.type,\n        stripPrefix = rctx.attr.strip_prefix,\n        output = \"output\",\n    )\n    rctx.template(\n        \"control\",\n        rctx.attr.control,\n        substitutions = {\n            \"{{VERSION}}\": rctx.attr.version,\n            \"{{ARCHITECTURE}}\": rctx.attr.architecture,\n            \"{{SHA256}}\": rctx.attr.sha256,\n        },\n    )\n    rctx.file(\n        \"BUILD.bazel\",\n        content = BUILD_TMPL.format(\n            canonical_name = rctx.attr.name,\n            name = rctx.attr.name.split(\"~\")[-1],\n            package_name = rctx.attr.package_name,\n            spdx_id = rctx.attr.name,\n            urls = \",\".join(['\"%s\"' % url for url in rctx.attr.urls]),\n            sha256 = rctx.attr.sha256,\n        ),\n    )\n\nnode_archive = repository_rule(\n    implementation = _impl,\n    attrs = {\n        \"urls\": attr.string_list(mandatory = True),\n        \"sha256\": attr.string(mandatory = True),\n        \"type\": attr.string(default = \".tar.gz\"),\n        \"strip_prefix\": attr.string(),\n        \"package_name\": attr.string(default = \"nodejs\"),\n        \"version\": attr.string(mandatory = True),\n        \"architecture\": attr.string(mandatory = True),\n        # control is only used to populate the sbom, see https://github.com/GoogleContainerTools/distroless/issues/1373\n        # for why writing debian control files to the image is incompatible with scanners.\n        \"control\": attr.label(),\n    },\n)\n\ndef _node_impl(module_ctx):\n    mod = module_ctx.modules[0]\n\n    if len(module_ctx.modules) > 1:\n        fail(\"node.archive should be called only once\")\n    if not mod.is_root:\n        fail(\"node.archive should be called from root module only.\")\n\n    # Node (https://nodejs.org/en/about/releases/)\n    # Follow Node's maintainence schedule and support all LTS versions that are not end of life`;\n\n  for (const nodeVersion of versions) {\n    const major = parseInt(nodeVersion.split(\".\")[0]);\n\n    for (const key of architectures) {\n      if (major > 22 && key === \"arm\") {\n        continue;\n      }\n      const arch = nodeVersions[nodeVersion][key];\n      const url = `https://nodejs.org/dist/v${nodeVersion}/node-v${nodeVersion}-linux-${arch.suffix}.tar.gz`;\n\n      nodeArchives += \"\\n\";\n      nodeArchives += `\n    node_archive(\n        name = \"nodejs${major}_${key}\",\n        sha256 = \"${arch.checksum}\",\n        strip_prefix = \"node-v${nodeVersion}-linux-${arch.suffix}/\",\n        urls = [\"${url}\"],\n        version = \"${nodeVersion}\",\n        architecture = \"${key}\",\n        control = \"//nodejs:control\",\n    )`;\n    }\n\n    const testData = `schemaVersion: \"2.0.0\"\ncommandTests:\n  - name: nodejs\n    command: \"/nodejs/bin/node\"\n    args: [\"--version\"]\n    expectedOutput: [\"v${nodeVersion}\"]\n`;\n\n    fs.writeFile(`nodejs/testdata/nodejs${major}.yaml`, testData, (err) => {\n      if (err) {\n        console.error(err);\n      }\n    });\n  }\n  nodeArchives += `\n\n    return module_ctx.extension_metadata(\n        root_module_direct_deps = [`;\n\n  for (const nodeVersion of versions) {\n    const major = parseInt(nodeVersion.split(\".\")[0]);\n    for (const arch of architectures) {\n      if (major > 22 && arch === \"arm\") {\n        continue;\n      }\n      nodeArchives += `\n            \"nodejs${major}_${arch}\",`;\n    }\n  }\n\n  nodeArchives += `\n        ],\n        root_module_direct_dev_deps = [],\n    )\n\n_archive = tag_class(attrs = {})\n\nnode = module_extension(\n    implementation = _node_impl,\n    tag_classes = {\n        \"archive\": _archive,\n    },\n)\n`;\n\n  // Write output to node_archives.bzl file\n  fs.writeFile(\"private/extensions/node.bzl\", nodeArchives, (err) => {\n    if (err) {\n      console.error(err);\n    }\n  });\n});\n"
  },
  {
    "path": "nodejs/BUILD",
    "content": "load(\":config.bzl\", \"NODEJS_ARCHITECTURES\", \"NODEJS_DISTROS\", \"NODEJS_MAJOR_VERSIONS\")\nload(\":nodejs.bzl\", \"nodejs_image\", \"nodejs_image_index\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\n[\n    nodejs_image(\n        arch = arch,\n        distro = distro,\n        major_version = major_version,\n    )\n    for distro in NODEJS_DISTROS\n    for major_version in NODEJS_MAJOR_VERSIONS\n    for arch in NODEJS_ARCHITECTURES[distro][major_version]\n]\n\n[\n    nodejs_image_index(\n        architectures = NODEJS_ARCHITECTURES[distro][major_version],\n        distro = distro,\n        major_version = major_version,\n    )\n    for distro in NODEJS_DISTROS\n    for major_version in NODEJS_MAJOR_VERSIONS\n]\n"
  },
  {
    "path": "nodejs/README.md",
    "content": "# Documentation for `gcr.io/distroless/nodejs`\n\n## Image Contents\n\nThese images contain a minimal Linux, Node.js-based runtime. The supported versions match the [Node.js LTS releases](https://nodejs.org/en/about/previous-releases).\n\nSpecifically, these images contain everything in the [cc image](../cc/README.md), plus one of:\n\n- Node.js v20 (`gcr.io/distroless/nodejs20-debian13`) and its dependencies.\n- Node.js v22 (`gcr.io/distroless/nodejs22-debian13`) and its dependencies.\n- Node.js v24 (`gcr.io/distroless/nodejs24-debian13`) and its dependencies.\n\n## Usage\n\nThe entrypoint of this image is set to \"node\", so this image expects users to supply a path to a .js file in the CMD.\n\nSee the Node.js [Hello World](../examples/nodejs/) directory for an example.\n"
  },
  {
    "path": "nodejs/config.bzl",
    "content": "NODEJS_DISTROS = [\"debian13\"]\nNODEJS_ARCHITECTURES = {\n    \"debian13\": {\n        \"20\": [\"amd64\", \"arm64\", \"arm\", \"s390x\", \"ppc64le\"],\n        \"22\": [\"amd64\", \"arm64\", \"arm\", \"s390x\", \"ppc64le\"],\n        \"24\": [\"amd64\", \"arm64\", \"s390x\", \"ppc64le\"],\n    },\n}\nNODEJS_MAJOR_VERSIONS = [\"20\", \"22\", \"24\"]\n"
  },
  {
    "path": "nodejs/control",
    "content": "Package: nodejs\nVersion: {{VERSION}}\nArchitecture: {{ARCHITECTURE}}\nMaintainer: OpenJS Foundation <https://openjsf.org/>\nHomepage: https://nodejs.org\nSHA256: {{SHA256}}\nDescription: Node.js event-based server-side javascript engine\n Node.js is similar in design to and influenced by systems like\n Ruby's Event Machine or Python's Twisted.\n .\n It takes the event model a bit further - it presents the event\n loop as a language construct instead of as a library.\n .\n Node.js is bundled with several useful libraries to handle server tasks :\n System, Events, Standard I/O, Modules, Timers, Child Processes, POSIX,\n HTTP, Multipart Parsing, TCP, DNS, Assert, Path, URL, Query Strings.\n"
  },
  {
    "path": "nodejs/nodejs.bzl",
    "content": "\"nodejs image definitions\"\n\nload(\"@container_structure_test//:defs.bzl\", \"container_structure_test\")\nload(\"@rules_oci//oci:defs.bzl\", \"oci_image\", \"oci_image_index\")\nload(\"//common:variables.bzl\", \"DEBUG_MODE\", \"USERS\")\nload(\"//private/util:tar.bzl\", \"tar\")\n\ndef nodejs_image_index(distro, major_version, architectures):\n    \"\"\"nodejs image index for a distro.\n\n    Args:\n        distro: name of distribution\n        major_version: version of nodejs\n        architectures: all architectures included in index\n    \"\"\"\n    for mode in DEBUG_MODE:\n        for user in USERS:\n            oci_image_index(\n                name = \"nodejs\" + major_version + mode + \"_\" + user + \"_\" + distro,\n                images = [\n                    \"nodejs\" + major_version + mode + \"_\" + user + \"_\" + arch + \"_\" + distro\n                    for arch in architectures\n                ],\n            )\n\ndef _check_certificates_tar():\n    # only create once\n    if native.existing_rule(\"check_certificate\"):\n        return\n\n    tar(\n        name = \"check_certificate\",\n        extension = \"tar.gz\",\n        srcs = [\"testdata/check_certificate.js\"],\n    )\n\ndef nodejs_image(distro, major_version, arch):\n    \"\"\"nodejs and debug image with tests.\n\n    Args:\n        distro: name of distribution\n        major_version: version of nodejs\n        arch: the target arch\n    \"\"\"\n    for mode in DEBUG_MODE:\n        for user in USERS:\n            oci_image(\n                name = \"nodejs\" + major_version + mode + \"_\" + user + \"_\" + arch + \"_\" + distro,\n                base = \"//cc:cc\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro,\n                entrypoint = [\"/nodejs/bin/node\"],\n                tars = [\n                    \"@nodejs\" + major_version + \"_\" + arch,\n                ],\n            )\n\n    _check_certificates_tar()\n\n    for mode in DEBUG_MODE:\n        for user in USERS:\n            container_structure_test(\n                name = \"nodejs\" + major_version + mode + \"_\" + user + \"_\" + arch + \"_\" + distro + \"_test\",\n                configs = [\n                    \"testdata/nodejs\" + major_version + \".yaml\",\n                    \"testdata/check_headers.yaml\",\n                    \"testdata/check_npm.yaml\",\n                ],\n                image = \"nodejs\" + major_version + mode + \"_\" + user + \"_\" + arch + \"_\" + distro,\n                tags = [\n                    arch,\n                    \"manual\",\n                ],\n            )\n\n    for mode in DEBUG_MODE:\n        for user in USERS:\n            oci_image(\n                name = \"check_certificate_nodejs\" + major_version + mode + \"_\" + user + \"_\" + arch + \"_\" + distro,\n                base = \"nodejs\" + major_version + mode + \"_\" + user + \"_\" + arch + \"_\" + distro,\n                tars = [\n                    \":check_certificate\",\n                ],\n            )\n\n    for mode in DEBUG_MODE:\n        for user in USERS:\n            container_structure_test(\n                name = \"check_certificate_nodejs\" + major_version + mode + \"_\" + user + \"_\" + arch + \"_\" + distro + \"_test\",\n                configs = [\"testdata/check_certificate.yaml\"],\n                image = \"check_certificate_nodejs\" + major_version + mode + \"_\" + user + \"_\" + arch + \"_\" + distro,\n                tags = [\n                    arch,\n                    \"manual\",\n                ],\n            )\n"
  },
  {
    "path": "nodejs/testdata/check_certificate.js",
    "content": "const https = require('https')\nconst options = {\n  hostname: 'www.google.com',\n  port: 443,\n  path: '/',\n  method: 'GET'\n}\n\nconst req = https.request(options, res => {\n  console.log(`statusCode: ${res.statusCode}`)\n  res.resume()\n})\n\nreq.end()\n"
  },
  {
    "path": "nodejs/testdata/check_certificate.yaml",
    "content": "schemaVersion: \"2.0.0\"\ncommandTests:\n  - name: nodejs\n    command: \"/nodejs/bin/node\" \n    args: [\"/check_certificate.js\"]\n    expectedOutput: ['statusCode: 200']\n"
  },
  {
    "path": "nodejs/testdata/check_headers.yaml",
    "content": "schemaVersion: \"2.0.0\"\nfileExistenceTests:\n  - name: npm\n    path: '/nodejs/include/node/node.h'\n    shouldExist: false\n"
  },
  {
    "path": "nodejs/testdata/check_npm.yaml",
    "content": "schemaVersion: \"2.0.0\"\nfileExistenceTests:\n  - name: npm\n    path: '/nodejs/lib/node_modules/npm'\n    shouldExist: false\n  - name: corepack\n    path: '/nodejs/lib/node_modules/corepack'\n    shouldExist: false\n  - name: npm\n    path: '/nodejs/bin/npm'\n    shouldExist: false\n  - name: corepack\n    path: '/nodejs/bin/corepack'\n    shouldExist: false\n  - name: npx\n    path: '/nodejs/bin/npx'\n    shouldExist: false\n"
  },
  {
    "path": "nodejs/testdata/nodejs20.yaml",
    "content": "schemaVersion: \"2.0.0\"\ncommandTests:\n  - name: nodejs\n    command: \"/nodejs/bin/node\"\n    args: [\"--version\"]\n    expectedOutput: [\"v20.20.1\"]\n"
  },
  {
    "path": "nodejs/testdata/nodejs22.yaml",
    "content": "schemaVersion: \"2.0.0\"\ncommandTests:\n  - name: nodejs\n    command: \"/nodejs/bin/node\"\n    args: [\"--version\"]\n    expectedOutput: [\"v22.22.1\"]\n"
  },
  {
    "path": "nodejs/testdata/nodejs24.yaml",
    "content": "schemaVersion: \"2.0.0\"\ncommandTests:\n  - name: nodejs\n    command: \"/nodejs/bin/node\"\n    args: [\"--version\"]\n    expectedOutput: [\"v24.14.0\"]\n"
  },
  {
    "path": "private/extensions/BUILD.bazel",
    "content": ""
  },
  {
    "path": "private/extensions/busybox.bzl",
    "content": "\"busybox\"\n\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\", \"http_file\")\nload(\"//experimental/busybox:commands.bzl\", \"BUSYBOX_ARCHIVE_BUILD\")\n\ndef _busybox_impl(module_ctx):\n    mod = module_ctx.modules[0]\n\n    if len(module_ctx.modules) > 1:\n        fail(\"busybox.archive should be called only once\")\n    if not mod.is_root:\n        fail(\"busybox.archive should be called from root module only.\")\n\n    # To update amd64 busybox binary (#1014)\n    # Get the latest commit hash from dist-amd64 branch of docker-library repo. You can also view it\n    # at https://github.com/docker-library/official-images/blob/master/library/busybox\n    # Substitute it in the link: https://github.com/docker-library/busybox/raw/<latest-commit-hash>/latest/musl/busybox.tar.gz\n    # Update the sha256 value. Since github api doesn't give sha256 value, it can be obtained using sha256sum command.\n    http_archive(\n        name = \"busybox_amd64\",\n        sha256 = \"8e7bef4a92afca21c56c9f85e4e63885b320f1da8f8f82a1cf87af359faf57d3\",\n        urls = [\"https://raw.githubusercontent.com/docker-library/busybox/e5b5178110ca0332364a77d5eb4fff87b0e2ba3f/latest/musl/amd64/rootfs.tar.gz\"],\n        build_file_content = BUSYBOX_ARCHIVE_BUILD,\n    )\n\n    # To update arm busybox binary\n    # Get the latest commit hash from dist-arm32v7 branch of docker-library repo. You can also view it\n    # at https://github.com/docker-library/official-images/blob/master/library/busybox\n    # Substitute it in the link: https://github.com/docker-library/busybox/raw/<latest-commit-hash>/latest/musl/arm32v7/rootfs.tar.gz\n    # Update the sha256 value. Since github api doesn't give sha256 value, it can be obtained using sha256sum command.\n    http_archive(\n        name = \"busybox_arm\",\n        sha256 = \"3c873527f998bba56151b7c7d19c133390a44ef894242e7ad5536de1ac0c347e\",\n        urls = [\"https://raw.githubusercontent.com/docker-library/busybox/a4fac83861d137e9dcfce70b31d0b8fafea9346e/latest/musl/arm32v7/rootfs.tar.gz\"],\n        build_file_content = BUSYBOX_ARCHIVE_BUILD,\n    )\n\n    # To update arm64 busybox binary (#657)\n    # Get the latest commit hash from dist-arm64v8 branch of docker-library repo. You can also view it\n    # at https://github.com/docker-library/official-images/blob/master/library/busybox\n    # Substitute it in the link: https://github.com/docker-library/busybox/raw/<latest-commit-hash>/latest/musl/busybox.tar.gz\n    # Update the sha256 value. Since github api doesn't give sha256 value, it can be obtained using sha256sum command.\n    http_archive(\n        name = \"busybox_arm64\",\n        sha256 = \"07b73337cea2a5d87c21278f251e1e742e253232ebd035d6a4a6d2cb4612e462\",\n        urls = [\"https://raw.githubusercontent.com/docker-library/busybox/f30de561de9bf38da10058620e9c4c383ec8a905/latest/musl/arm64v8/rootfs.tar.gz\"],\n        build_file_content = BUSYBOX_ARCHIVE_BUILD,\n    )\n\n    # To update s390x busybox binary\n    # Get the latest commit hash from dist-s390x branch of docker-library repo. You can also view it\n    # at https://github.com/docker-library/official-images/blob/master/library/busybox\n    # Substitute it in the link: https://github.com/docker-library/busybox/raw/<latest-commit-hash>/latest/musl/s390x/rootfs.tar.gz\n    # Update the sha256 value. Since github api doesn't give sha256 value, it can be obtained using sha256sum command.\n    http_archive(\n        name = \"busybox_s390x\",\n        sha256 = \"3bd977f75e22a5e164e2e6ac3556cee55053022e9ad8bba89614e7a8680791d1\",\n        urls = [\"https://raw.githubusercontent.com/docker-library/busybox/87c948a4fac6f84195e795486a8d650b0c9cc10d/latest/musl/s390x/rootfs.tar.gz\"],\n        build_file_content = BUSYBOX_ARCHIVE_BUILD,\n    )\n\n    # To update ppc64le busybox binary (#723)\n    # Get the latest commit hash from dist-ppc64le branch of docker-library repo. You can also view it\n    # at https://github.com/docker-library/official-images/blob/master/library/busybox\n    # Substitute it in the link: https://github.com/docker-library/busybox/raw/<latest-commit-hash>/latest/musl/busybox.tar.gz\n    # Update the sha256 value. Since github api doesn't give sha256 value, it can be obtained using sha256sum command.\n    http_archive(\n        name = \"busybox_ppc64le\",\n        sha256 = \"f3f5d636887b8d56aabe29047a58ef074511f5252c722b1e476b7f79fd35fb7f\",\n        urls = [\"https://raw.githubusercontent.com/docker-library/busybox/149c39d6036d77a55679c6b9e0c946ba2ad38555/latest/musl/ppc64le/rootfs.tar.gz\"],\n        build_file_content = BUSYBOX_ARCHIVE_BUILD,\n    )\n\n    # To update riscv64 busybox binary\n    # Get the latest commit hash from dist-riscv64 branch of docker-library repo. You can also view it\n    # at https://github.com/docker-library/official-images/blob/master/library/busybox\n    # Substitute it in the link: https://github.com/docker-library/busybox/raw/<latest-commit-hash>/latest/musl/busybox.tar.gz\n    # Update the sha256 value. Since github api doesn't give sha256 value, it can be obtained using sha256sum command.\n    http_archive(\n        name = \"busybox_riscv64\",\n        sha256 = \"17737180c892fb9eac75524ae789040f0b01415e6e05e063bc2b8f982b340d97\",\n        urls = [\"https://raw.githubusercontent.com/docker-library/busybox/eabe7cf678f2abbc0477a8603428519771ede877/latest/musl/riscv64/rootfs.tar.gz\"],\n        build_file_content = BUSYBOX_ARCHIVE_BUILD,\n    )\n\n    return module_ctx.extension_metadata(\n        root_module_direct_deps = [\n            \"busybox_amd64\",\n            \"busybox_arm\",\n            \"busybox_arm64\",\n            \"busybox_s390x\",\n            \"busybox_ppc64le\",\n            \"busybox_riscv64\",\n        ],\n        root_module_direct_dev_deps = [],\n    )\n\n_archive = tag_class(attrs = {})\n\nbusybox = module_extension(\n    implementation = _busybox_impl,\n    tag_classes = {\n        \"archive\": _archive,\n    },\n)\n"
  },
  {
    "path": "private/extensions/node.bzl",
    "content": "\"node\"\n\nBUILD_TMPL = \"\"\"\\\n# GENERATED BY node_archive.bzl\nload(\"@distroless//private/pkg:debian_spdx.bzl\", \"debian_spdx\")\nload(\"@distroless//private/util:merge_providers.bzl\", \"merge_providers\")\nload(\"@distroless//private/util:tar.bzl\", \"tar\")\n\ntar(\n    name = \"data\",\n    extension = \"tar.gz\",\n    srcs = glob(\n        [\n            \"output/bin/node\",\n            \"output/LICENSE\",\n        ],\n    ),\n    package_dir = \"/nodejs\",\n    strip_prefix = \"external/{canonical_name}/output\"\n)\n\ntar(\n    name = \"_control\",\n    extension = \"tar.gz\",\n    srcs = [\"control\"]\n)\n\ndebian_spdx(\n    name = \"spdx\",\n    control = \":_control\",\n    data = \":data\",\n    package_name = \"{package_name}\",\n    spdx_id = \"{spdx_id}\",\n    sha256 = \"{sha256}\",\n    urls = [{urls}]\n)\n\nmerge_providers(\n    name = \"{name}\",\n    srcs = [\":data\", \":spdx\"],\n    visibility = [\"//visibility:public\"],\n)\n\"\"\"\n\ndef _impl(rctx):\n    rctx.report_progress(\"Fetching {}\".format(rctx.attr.package_name))\n    rctx.download_and_extract(\n        url = rctx.attr.urls,\n        sha256 = rctx.attr.sha256,\n        type = rctx.attr.type,\n        stripPrefix = rctx.attr.strip_prefix,\n        output = \"output\",\n    )\n    rctx.template(\n        \"control\",\n        rctx.attr.control,\n        substitutions = {\n            \"{{VERSION}}\": rctx.attr.version,\n            \"{{ARCHITECTURE}}\": rctx.attr.architecture,\n            \"{{SHA256}}\": rctx.attr.sha256,\n        },\n    )\n    rctx.file(\n        \"BUILD.bazel\",\n        content = BUILD_TMPL.format(\n            canonical_name = rctx.attr.name,\n            name = rctx.attr.name.split(\"~\")[-1],\n            package_name = rctx.attr.package_name,\n            spdx_id = rctx.attr.name,\n            urls = \",\".join(['\"%s\"' % url for url in rctx.attr.urls]),\n            sha256 = rctx.attr.sha256,\n        ),\n    )\n\nnode_archive = repository_rule(\n    implementation = _impl,\n    attrs = {\n        \"urls\": attr.string_list(mandatory = True),\n        \"sha256\": attr.string(mandatory = True),\n        \"type\": attr.string(default = \".tar.gz\"),\n        \"strip_prefix\": attr.string(),\n        \"package_name\": attr.string(default = \"nodejs\"),\n        \"version\": attr.string(mandatory = True),\n        \"architecture\": attr.string(mandatory = True),\n        # control is only used to populate the sbom, see https://github.com/GoogleContainerTools/distroless/issues/1373\n        # for why writing debian control files to the image is incompatible with scanners.\n        \"control\": attr.label(),\n    },\n)\n\ndef _node_impl(module_ctx):\n    mod = module_ctx.modules[0]\n\n    if len(module_ctx.modules) > 1:\n        fail(\"node.archive should be called only once\")\n    if not mod.is_root:\n        fail(\"node.archive should be called from root module only.\")\n\n    # Node (https://nodejs.org/en/about/releases/)\n    # Follow Node's maintainence schedule and support all LTS versions that are not end of life\n\n    node_archive(\n        name = \"nodejs20_amd64\",\n        sha256 = \"6362e50804cdcc110592201f67beda93bcd702fdcbe1c42840a50d590e3af0ce\",\n        strip_prefix = \"node-v20.20.1-linux-x64/\",\n        urls = [\"https://nodejs.org/dist/v20.20.1/node-v20.20.1-linux-x64.tar.gz\"],\n        version = \"20.20.1\",\n        architecture = \"amd64\",\n        control = \"//nodejs:control\",\n    )\n\n    node_archive(\n        name = \"nodejs20_arm64\",\n        sha256 = \"d6947e10ddc124284aee92981cc739cd4581a6b4bf89520792f2b582600195fa\",\n        strip_prefix = \"node-v20.20.1-linux-arm64/\",\n        urls = [\"https://nodejs.org/dist/v20.20.1/node-v20.20.1-linux-arm64.tar.gz\"],\n        version = \"20.20.1\",\n        architecture = \"arm64\",\n        control = \"//nodejs:control\",\n    )\n\n    node_archive(\n        name = \"nodejs20_arm\",\n        sha256 = \"6d7b0f1f3a88004b251fd4d2ee2f5c4faca15587a3cdaaefae11e655b9e01cde\",\n        strip_prefix = \"node-v20.20.1-linux-armv7l/\",\n        urls = [\"https://nodejs.org/dist/v20.20.1/node-v20.20.1-linux-armv7l.tar.gz\"],\n        version = \"20.20.1\",\n        architecture = \"arm\",\n        control = \"//nodejs:control\",\n    )\n\n    node_archive(\n        name = \"nodejs20_ppc64le\",\n        sha256 = \"d885a22c1a08bd2d2f91c290770f3a9762075c4ec222fcd9d9fc921b0c8294b9\",\n        strip_prefix = \"node-v20.20.1-linux-ppc64le/\",\n        urls = [\"https://nodejs.org/dist/v20.20.1/node-v20.20.1-linux-ppc64le.tar.gz\"],\n        version = \"20.20.1\",\n        architecture = \"ppc64le\",\n        control = \"//nodejs:control\",\n    )\n\n    node_archive(\n        name = \"nodejs20_s390x\",\n        sha256 = \"7f0688d98fce89a9d7c623a3b0d2eab8374333f31461c8cb8b9d34712c45a1ba\",\n        strip_prefix = \"node-v20.20.1-linux-s390x/\",\n        urls = [\"https://nodejs.org/dist/v20.20.1/node-v20.20.1-linux-s390x.tar.gz\"],\n        version = \"20.20.1\",\n        architecture = \"s390x\",\n        control = \"//nodejs:control\",\n    )\n\n    node_archive(\n        name = \"nodejs22_amd64\",\n        sha256 = \"07c8aafa60644fb81adefa1ee7da860eb1920851ffdc9a37020ab0be47fbc10e\",\n        strip_prefix = \"node-v22.22.1-linux-x64/\",\n        urls = [\"https://nodejs.org/dist/v22.22.1/node-v22.22.1-linux-x64.tar.gz\"],\n        version = \"22.22.1\",\n        architecture = \"amd64\",\n        control = \"//nodejs:control\",\n    )\n\n    node_archive(\n        name = \"nodejs22_arm64\",\n        sha256 = \"1d1690e9aba47e887a275abc6d8f7317e571a0700deaef493f768377e99155f5\",\n        strip_prefix = \"node-v22.22.1-linux-arm64/\",\n        urls = [\"https://nodejs.org/dist/v22.22.1/node-v22.22.1-linux-arm64.tar.gz\"],\n        version = \"22.22.1\",\n        architecture = \"arm64\",\n        control = \"//nodejs:control\",\n    )\n\n    node_archive(\n        name = \"nodejs22_arm\",\n        sha256 = \"2b592d21609ef299d1e3918bb806ed62ba715d4109b0f8ec11b132af9fa42d70\",\n        strip_prefix = \"node-v22.22.1-linux-armv7l/\",\n        urls = [\"https://nodejs.org/dist/v22.22.1/node-v22.22.1-linux-armv7l.tar.gz\"],\n        version = \"22.22.1\",\n        architecture = \"arm\",\n        control = \"//nodejs:control\",\n    )\n\n    node_archive(\n        name = \"nodejs22_ppc64le\",\n        sha256 = \"18f9ab7da4f3a04ec213590b14e5d78b60bfb5c6b8bf53541e7eaf1adf9d270a\",\n        strip_prefix = \"node-v22.22.1-linux-ppc64le/\",\n        urls = [\"https://nodejs.org/dist/v22.22.1/node-v22.22.1-linux-ppc64le.tar.gz\"],\n        version = \"22.22.1\",\n        architecture = \"ppc64le\",\n        control = \"//nodejs:control\",\n    )\n\n    node_archive(\n        name = \"nodejs22_s390x\",\n        sha256 = \"6128f9d54a1b43258144d7ac074a82d3b6c96d8e9cb3a8e14e4722a66990adbe\",\n        strip_prefix = \"node-v22.22.1-linux-s390x/\",\n        urls = [\"https://nodejs.org/dist/v22.22.1/node-v22.22.1-linux-s390x.tar.gz\"],\n        version = \"22.22.1\",\n        architecture = \"s390x\",\n        control = \"//nodejs:control\",\n    )\n\n    node_archive(\n        name = \"nodejs24_amd64\",\n        sha256 = \"dbf5b8665dec15e59e6359a517fefb47b23fdb9152d8def975b9bca3dfc6d355\",\n        strip_prefix = \"node-v24.14.0-linux-x64/\",\n        urls = [\"https://nodejs.org/dist/v24.14.0/node-v24.14.0-linux-x64.tar.gz\"],\n        version = \"24.14.0\",\n        architecture = \"amd64\",\n        control = \"//nodejs:control\",\n    )\n\n    node_archive(\n        name = \"nodejs24_arm64\",\n        sha256 = \"f44740cd218de8127f1c44c41510a3a740fa5c9c8d1cdce1c3bedada79f3cde7\",\n        strip_prefix = \"node-v24.14.0-linux-arm64/\",\n        urls = [\"https://nodejs.org/dist/v24.14.0/node-v24.14.0-linux-arm64.tar.gz\"],\n        version = \"24.14.0\",\n        architecture = \"arm64\",\n        control = \"//nodejs:control\",\n    )\n\n    node_archive(\n        name = \"nodejs24_ppc64le\",\n        sha256 = \"83b263f9c2ea946c0c4a15c3caea6470dc49fe0beb6f33dfd29aa9128250637a\",\n        strip_prefix = \"node-v24.14.0-linux-ppc64le/\",\n        urls = [\"https://nodejs.org/dist/v24.14.0/node-v24.14.0-linux-ppc64le.tar.gz\"],\n        version = \"24.14.0\",\n        architecture = \"ppc64le\",\n        control = \"//nodejs:control\",\n    )\n\n    node_archive(\n        name = \"nodejs24_s390x\",\n        sha256 = \"8fa220a1f7b7769605c2e929fdbf736822997bf4cf88a3db05188eabd7712328\",\n        strip_prefix = \"node-v24.14.0-linux-s390x/\",\n        urls = [\"https://nodejs.org/dist/v24.14.0/node-v24.14.0-linux-s390x.tar.gz\"],\n        version = \"24.14.0\",\n        architecture = \"s390x\",\n        control = \"//nodejs:control\",\n    )\n\n    return module_ctx.extension_metadata(\n        root_module_direct_deps = [\n            \"nodejs20_amd64\",\n            \"nodejs20_arm64\",\n            \"nodejs20_arm\",\n            \"nodejs20_ppc64le\",\n            \"nodejs20_s390x\",\n            \"nodejs22_amd64\",\n            \"nodejs22_arm64\",\n            \"nodejs22_arm\",\n            \"nodejs22_ppc64le\",\n            \"nodejs22_s390x\",\n            \"nodejs24_amd64\",\n            \"nodejs24_arm64\",\n            \"nodejs24_ppc64le\",\n            \"nodejs24_s390x\",\n        ],\n        root_module_direct_dev_deps = [],\n    )\n\n_archive = tag_class(attrs = {})\n\nnode = module_extension(\n    implementation = _node_impl,\n    tag_classes = {\n        \"archive\": _archive,\n    },\n)\n"
  },
  {
    "path": "private/extensions/version.bzl",
    "content": "\"generates version information from lockfiles\"\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_distroless//apt/private:version.bzl\", _version = \"version\")\n\n_VERSIONS_TMPL = \"\"\"\\\n\"versions repo\"\n\n# AUTO GENERATED. DO NOT EDIT.\n_versions = {}\n\n# buildifier: disable=function-docstring\ndef version(dist, arch, name):\n    if dist not in _versions:\n        fail(\"unknown dist {{}}\".format(dist))\n    if name not in _versions[dist]:\n        fail(\"unknown package {{}}\".format(name))\n    if arch not in _versions[dist][name]:\n        fail(\"unknown arch {{}}\".format(arch))\n    return struct(**_versions[dist][name][arch])\n\"\"\"\n\ndef _parse_version(raw):\n    (epoch, upstream, revision) = _version.parse(raw)\n\n    return struct(raw = raw, epoch = epoch, upstream = upstream, revision = revision)\n\ndef _version_repo_impl(rctx):\n    rctx.file(\"versions.bzl\", _VERSIONS_TMPL.format(json.decode(rctx.attr.versions)))\n    rctx.file(\"BUILD.bazel\", \"exports_files(['versions.bzl'])\")\n\nversion_repo = repository_rule(\n    implementation = _version_repo_impl,\n    attrs = {\n        \"versions\": attr.string(),\n    },\n)\n\ndef _version_impl(module_ctx):\n    versions = dict()\n\n    for mod in module_ctx.modules:\n        for from_lock in mod.tags.from_lock:\n            lock = json.decode(module_ctx.read(from_lock.lock))\n            repo = from_lock.repo_name\n\n            if lock[\"version\"] != 1:\n                fail(\"unknown lock version\")\n\n            if repo not in versions:\n                versions[repo] = dict()\n\n            for pkg in lock[\"packages\"]:\n                if pkg[\"name\"] not in versions[repo]:\n                    versions[repo][pkg[\"name\"]] = dict()\n\n                versions[repo][pkg[\"name\"]][pkg[\"arch\"]] = _parse_version(pkg[\"version\"])\n\n    version_repo(\n        name = \"versions\",\n        versions = json.encode(versions),\n    )\n\n    return module_ctx.extension_metadata(\n        root_module_direct_deps = [\"versions\"],\n        root_module_direct_dev_deps = [],\n    )\n\n_from_lock = tag_class(attrs = {\n    \"repo_name\": attr.string(mandatory = True),\n    \"lock\": attr.label(mandatory = True),\n})\n\nversion = module_extension(\n    implementation = _version_impl,\n    tag_classes = {\n        \"from_lock\": _from_lock,\n    },\n)\n"
  },
  {
    "path": "private/oci/BUILD.bazel",
    "content": "exports_files([\"sign_and_push.sh.tpl\"])\n"
  },
  {
    "path": "private/oci/cc_image.bzl",
    "content": "\"cc_image rule for creating C++ container images\"\n\nload(\"@rules_cc//cc:cc_binary.bzl\", \"cc_binary\")\nload(\"@rules_oci//oci:defs.bzl\", \"oci_image\")\nload(\"//private/util:tar.bzl\", \"tar\")\n\ndef cc_image(name, srcs, base):\n    cc_binary(\n        name = \"%s_binary\" % name,\n        srcs = srcs,\n    )\n\n    tar(\n        name = \"%s_layer\" % name,\n        extension = \"tar.gz\",\n        srcs = [\n            \":%s_binary\" % name,\n        ],\n    )\n\n    oci_image(\n        name = name,\n        base = base,\n        entrypoint = [\n            \"/%s_binary\" % name,\n        ],\n        tars = [\n            \":%s_layer\" % name,\n        ],\n    )\n"
  },
  {
    "path": "private/oci/defs.bzl",
    "content": "load(\":cc_image.bzl\", _cc_image = \"cc_image\")\nload(\":go_image.bzl\", _go_image = \"go_image\")\nload(\":java_image.bzl\", _java_image = \"java_image\")\nload(\":rust_image.bzl\", _rust_image = \"rust_image\")\nload(\":sign_and_push.bzl\", _sign_and_push_all = \"sign_and_push_all\")\n\njava_image = _java_image\ncc_image = _cc_image\nrust_image = _rust_image\ngo_image = _go_image\nsign_and_push_all = _sign_and_push_all\n"
  },
  {
    "path": "private/oci/digest.bzl",
    "content": "\"generate digest for oci_image and oci_image_index\"\n\nload(\"@aspect_bazel_lib//lib:copy_file.bzl\", \"copy_file\")\nload(\"@aspect_bazel_lib//lib:directory_path.bzl\", \"directory_path\")\nload(\"@aspect_bazel_lib//lib:jq.bzl\", \"jq\")\n\n# Normally we'd use the `.digest` target that rules_oci creates for every oci_image but\n# we also use oci_image_index which does not have a digest target. This was fixed in\n# https://github.com/bazel-contrib/rules_oci/pull/742 but it on the 2.x releases of rules_oci\n# TODO: Remove this once we upgrade to rules_oci 2.x\ndef digest(name, image, **kwargs):\n    # `oci_image_rule` and `oci_image_index_rule` produce a directory as default output.\n    # Label for the [name]/index.json file\n    directory_path(\n        name = \"_{}_index_json\".format(name),\n        directory = image,\n        path = \"index.json\",\n        **kwargs\n    )\n\n    copy_file(\n        name = \"_{}_index_json_cp\".format(name),\n        src = \"_{}_index_json\".format(name),\n        out = \"_{}_index.json\".format(name),\n        **kwargs\n    )\n\n    # Matches the [name].digest target produced by rules_docker container_image\n    jq(\n        name = name,\n        args = [\"--raw-output\"],\n        srcs = [\"_{}_index.json\".format(name)],\n        filter = \"\"\".manifests[0].digest\"\"\",\n        out = name + \".json.sha256\",  # path chosen to match rules_docker for easy migration\n        **kwargs\n    )\n"
  },
  {
    "path": "private/oci/go_image.bzl",
    "content": "\"go_image rule for creating Go container images\"\n\nload(\"@rules_go//go:def.bzl\", \"go_binary\")\nload(\"@rules_oci//oci:defs.bzl\", \"oci_image\")\nload(\"//private/util:tar.bzl\", \"tar\")\n\ndef go_image(name, srcs, base, arch = \"amd64\", os = \"linux\"):\n    go_binary(\n        name = \"{}_binary\".format(name),\n        srcs = srcs,\n        goarch = arch,\n        goos = os,\n        pure = \"on\",\n    )\n\n    tar(\n        name = \"{}_layer\".format(name),\n        extension = \"tar.gz\",\n        srcs = [\"{}_binary\".format(name)],\n    )\n\n    oci_image(\n        name = name,\n        base = base,\n        entrypoint = [\"/{}_binary\".format(name)],\n        tars = [\n            \"{}_layer\".format(name),\n        ],\n    )\n"
  },
  {
    "path": "private/oci/java_image.bzl",
    "content": "\"java_image rule for creating Java container images\"\n\nload(\"@rules_oci//oci:defs.bzl\", \"oci_image\")\nload(\"//private/util:tar.bzl\", \"tar\")\n\ndef java_image(name, srcs, main_class, base):\n    native.java_binary(\n        name = \"%s_binary\" % name,\n        srcs = srcs,\n        main_class = main_class,\n    )\n\n    tar(\n        name = \"%s_layer\" % name,\n        extension = \"tar.gz\",\n        srcs = [\n            \":%s_binary\" % name,\n        ],\n    )\n\n    oci_image(\n        name = name,\n        base = base,\n        cmd = [\n            \"/%s_binary.jar\" % name,\n        ],\n        tars = [\n            \":%s_layer\" % name,\n        ],\n    )\n"
  },
  {
    "path": "private/oci/rust_image.bzl",
    "content": "\"rust_image rule for creating Rust container images\"\n\nload(\"@rules_oci//oci:defs.bzl\", \"oci_image\")\nload(\"@rules_rust//rust:defs.bzl\", \"rust_binary\")\nload(\"//private/util:tar.bzl\", \"tar\")\n\ndef rust_image(name, srcs, base, tags):\n    rust_binary(\n        name = \"%s_binary\" % name,\n        srcs = srcs,\n        tags = tags,\n    )\n\n    tar(\n        name = \"%s_layer\" % name,\n        extension = \"tar.gz\",\n        srcs = [\n            \":%s_binary\" % name,\n        ],\n        tags = tags,\n    )\n\n    oci_image(\n        name = name,\n        base = base,\n        entrypoint = [\n            \"/%s_binary\" % name,\n        ],\n        tars = [\n            \":%s_layer\" % name,\n        ],\n        tags = tags,\n    )\n"
  },
  {
    "path": "private/oci/sign_and_push.bzl",
    "content": "\"rules for signing, attesting and pushing images\"\n\nload(\"@bazel_skylib//rules:write_file.bzl\", \"write_file\")\nload(\"//private/pkg:oci_image_spdx.bzl\", \"oci_image_spdx\")\nload(\":digest.bzl\", \"digest\")\n\nPUSH_AND_SIGN_CMD = \"\"\"\\\n# Push {IMAGE}\nrepository=\"$(stamp \"{REPOSITORY}\")\"\ntag=\"$(stamp \"{TAG}\")\"\ndigest=\"$(cat {DIGEST})\"\necho \"Pushing $repository@$digest\"\n{CRANE} push {IMAGE} \"$repository@$digest\"\n\n# Check for signature and skip signing/sbom if present\nif ! {COSIGN} verify \"$repository@$digest\" --certificate-oidc-issuer https://accounts.google.com --certificate-identity \"${{KEYLESS}}\" > /dev/null; then\n    {COSIGN} attest \"$repository@$digest\" --predicate \"{SBOM}\" --type \"spdx\" --yes\n    {COSIGN} sign \"$repository@$digest\" --yes\nfi\n\n{CRANE} tag \"$repository@$digest\" \"$tag\"\n\"\"\"\n\nTAG_CMD = \"\"\"\\\n# Tag {IMAGE}\nfrom=\"$(stamp \"{FROM}\")\"\ntag=\"$(stamp \"{TAG}\")\"\n{CRANE} tag \"$from\" \"$tag\"\n\"\"\"\n\ndef _sign_and_push_impl(ctx):\n    cmds = []\n\n    runfiles = ctx.runfiles(files = ctx.files.targets + [ctx.version_file, ctx.file._crane, ctx.file._cosign])\n\n    for (image, target) in ctx.attr.targets.items():\n        files = target[DefaultInfo].files.to_list()\n\n        all_refs = ctx.attr.refs[image]\n        for ref in all_refs:\n            repository_and_tag = ref.split(\":\")\n            cmds.append(\n                PUSH_AND_SIGN_CMD.format(\n                    IMAGE = files[0].short_path,\n                    SBOM = files[1].short_path,\n                    DIGEST = files[2].short_path,\n                    CRANE = ctx.file._crane.short_path,\n                    COSIGN = ctx.file._cosign.short_path,\n                    REPOSITORY = repository_and_tag[0],\n                    TAG = repository_and_tag[1],\n                ),\n            )\n\n            for tag in ctx.attr.more_tags[ref]:\n                cmds.append(\n                    TAG_CMD.format(\n                        IMAGE = image,\n                        FROM = ref,\n                        TAG = tag,\n                        CRANE = ctx.file._crane.short_path,\n                    ),\n                )\n\n    executable = ctx.actions.declare_file(\"{}_sign_and_push.sh\".format(ctx.label.name))\n    ctx.actions.expand_template(\n        template = ctx.file._push_tpl,\n        output = executable,\n        substitutions = {\n            \"{{VERSION_FILE}}\": ctx.version_file.short_path,\n            \"{{CMDS}}\": \"\\n\".join(cmds),\n        },\n        is_executable = True,\n    )\n\n    return DefaultInfo(executable = executable, runfiles = runfiles)\n\nsign_and_push = rule(\n    implementation = _sign_and_push_impl,\n    attrs = {\n        \"refs\": attr.string_list_dict(mandatory = True),\n        \"targets\": attr.string_keyed_label_dict(mandatory = True, cfg = \"exec\"),\n        \"more_tags\": attr.string_list_dict(mandatory = True),\n        \"_push_tpl\": attr.label(default = \"sign_and_push.sh.tpl\", allow_single_file = True),\n        \"_crane\": attr.label(allow_single_file = True, cfg = \"exec\", default = \"@oci_crane_toolchains//:current_toolchain\"),\n        \"_cosign\": attr.label(allow_single_file = True, cfg = \"exec\", default = \"@oci_cosign_toolchains//:current_toolchain\"),\n    },\n    executable = True,\n)\n\ndef sign_and_push_all(name, images):\n    \"\"\"simple macro singing and pushing images\n\n    Args:\n        name: name of the target\n        images: a dict where keys are fully qualified image reference and values are image label\n    \"\"\"\n\n    # since bazel doesn't allow dicts of dicts of lists as attrs, we have to write this nutty\n    # deduplication code\n    dedup_image_dict = dict()\n    dedup_more_tags = dict()\n    dedup_push_dict = dict()\n\n    for (idx, (ref, image)) in enumerate(images.items()):\n        repository_and_tag = ref.split(\":\")\n        repository = repository_and_tag[0]\n        tag = repository_and_tag[1]\n        if image in dedup_image_dict:\n            foundPrefix = False\n            for oRef in dedup_image_dict[image]:\n                if oRef.split(\":\")[0] == repository:\n                    dedup_more_tags[oRef].append(tag)\n                    foundPrefix = True\n                    break\n            if not foundPrefix:\n                dedup_image_dict[image].append(ref)\n                dedup_more_tags[ref] = []\n        else:\n            dedup_image_dict[image] = [ref]\n            dedup_more_tags[ref] = []\n\n    for (idx, (image, _)) in enumerate(dedup_image_dict.items()):\n        oci_image_spdx(\n            name = \"{}_{}_sbom\".format(name, idx),\n            image = image,\n        )\n        digest(\n            name = \"{}_{}_digest\".format(name, idx),\n            image = image,\n        )\n\n        native.filegroup(\n            name = \"{}_{}\".format(name, idx),\n            srcs = [\n                image,\n                \":{}_{}_sbom\".format(name, idx),\n                \":{}_{}_digest\".format(name, idx),\n            ],\n        )\n\n        dedup_push_dict[image] = \"{}_{}\".format(name, idx)\n\n    write_file(\n        name = name + \".query\",\n        content = [\n            \"{repo} {image}\".format(\n                repo = repo,\n                image = image,\n            )\n            for (image, refs) in dedup_image_dict.items()\n            for repo in refs\n        ],\n        out = name + \"_query\",\n    )\n\n    sign_and_push(\n        name = name,\n        targets = dedup_push_dict,\n        more_tags = dedup_more_tags,\n        refs = dedup_image_dict,\n    )\n"
  },
  {
    "path": "private/oci/sign_and_push.sh.tpl",
    "content": "#!/usr/bin/env bash\nset -o pipefail -o errexit -o nounset\n\nKEYLESS=\"${KEYLESS:-}\"\n\nwhile (( $# > 0 )); do\n  case $1 in\n    (--keyless)\n      KEYLESS=\"$2\"\n      shift\n      shift;;\n    (*) \n      echo \"unknown arg $1\"\n      exit 1\n  esac\ndone\n\nif [ -z $KEYLESS ]; then\n  echo \"--keyless flag or KEYLESS environment variable must be provided\"\n  exit 1\nfi\n\necho \"## Signing and pushing images...\"\necho \"\"\n\nreadonly version_file=\"$(cat \"{{VERSION_FILE}}\")\"\n\nfunction stamp() {\n    local str=$1\n    while read -r line; \n    do\n        IFS=\" \" read -r key value <<< \"$line\"\n        str=\"${str/\\{$key\\}/$value}\"\n    done <<< \"$version_file\"\n    echo \"$str\"\n}\n\n\nexport GOOGLE_SERVICE_ACCOUNT_NAME=\"${KEYLESS}\"\n\n{{CMDS}}\n\necho \"\"\necho \"👌 Finished pushing & signing\"\necho \"\"\n"
  },
  {
    "path": "private/pkg/BUILD.bazel",
    "content": "load(\"@rules_go//go:def.bzl\", \"go_binary\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ngo_binary(\n    name = \"oci_image_spdx\",\n    srcs = [\"oci_image_spdx.go\"],\n    deps = [\n        \"@com_github_spdx_tools_golang//json\",\n        \"@com_github_spdx_tools_golang//spdx/common\",\n        \"@com_github_spdx_tools_golang//spdx/v2_3\",\n    ],\n)\n\ngo_binary(\n    name = \"debian_spdx\",\n    srcs = [\"debian_spdx.go\"],\n    deps = [\n        \"@com_github_spdx_tools_golang//json\",\n        \"@com_github_spdx_tools_golang//spdx/common\",\n        \"@com_github_spdx_tools_golang//spdx/v2_3\",\n    ],\n)\n"
  },
  {
    "path": "private/pkg/debian_spdx.bzl",
    "content": "SPDX_CMD = \"\"\"\\\ntmp=\"$(mktemp -d)\"\n\ntar -xf \"$1\" -C \"$tmp\" \"./control\" || tar -xf \"$1\" -C \"$tmp\" \"control\"\n\nif  tar -xf \"$2\" -C \"$tmp\" \"usr/share/doc/$3/copyright\" >/dev/null 2>&1; then\n    COPYRIGHT=\"$tmp/usr/share/doc/$3/copyright\"\nfi\n\nif  tar -xf \"$2\" -C \"$tmp\" \"./usr/share/doc/$3/copyright\" >/dev/null 2>&1; then\n    COPYRIGHT=\"$tmp/usr/share/doc/$3/copyright\"\nfi\nshift\nshift\nshift\n{generator} --control=\"$tmp/control\" --copyright=$COPYRIGHT $@\n\"\"\"\n\ndef _impl(ctx):\n    output = ctx.actions.declare_file(\"%s.spdx.json\" % ctx.label.name)\n\n    args = ctx.actions.args()\n    args.add(ctx.file.control.path)\n    args.add(ctx.file.data.path)\n    args.add(ctx.attr.package_name)\n    args.add(ctx.attr.spdx_id, format = \"--id=%s\")\n    args.add(output.path, format = \"--output=%s\")\n    args.add(ctx.label, format = \"--generates=%s\")\n\n    # TODO: multiple urls. it is not required at the moment since .deb are fetched without a fallback mirror.\n    args.add(ctx.attr.urls[0], format = \"--url=%s\")\n    args.add(ctx.attr.sha256, format = \"--sha256=%s\")\n\n    ctx.actions.run_shell(\n        inputs = [ctx.file.control, ctx.file.data],\n        outputs = [output],\n        command = SPDX_CMD.format(generator = ctx.file._generator.path),\n        tools = [ctx.executable._generator],\n        arguments = [args],\n    )\n\n    return OutputGroupInfo(\n        spdx = depset([output]),\n    )\n\ndebian_spdx = rule(\n    implementation = _impl,\n    attrs = {\n        \"control\": attr.label(mandatory = True, allow_single_file = [\".tar\", \".tar.xz\", \"tar.gz\", \"tar.zst\"]),\n        \"data\": attr.label(mandatory = True, allow_single_file = [\".tar\", \".tar.xz\", \"tar.gz\", \"tar.zst\"]),\n        \"package_name\": attr.string(mandatory = True),\n        \"spdx_id\": attr.string(mandatory = True),\n        \"urls\": attr.string_list(mandatory = True),\n        \"sha256\": attr.string(mandatory = True),\n        \"_generator\": attr.label(default = \":debian_spdx\", executable = True, allow_single_file = True, cfg = \"exec\"),\n    },\n)\n"
  },
  {
    "path": "private/pkg/debian_spdx.go",
    "content": "package main\n\nimport (\n\t\"bufio\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"os\"\n\t\"regexp\"\n\t\"strings\"\n\n\tspdx_json \"github.com/spdx/tools-golang/json\"\n\t\"github.com/spdx/tools-golang/spdx/common\"\n\t\"github.com/spdx/tools-golang/spdx/v2_3\"\n)\n\nfunc pkgId(id string) string {\n\tid = strings.ReplaceAll(id, \"/\", \"-slash-\")\n\tid = strings.ReplaceAll(id, \"_\", \"-underscore-\")\n\tid = strings.ReplaceAll(id, \"_\", \"-underscore-\")\n\tid = strings.ReplaceAll(id, \":\", \"-colon-\")\n\tid = strings.ReplaceAll(id, \"@\", \"-at-\")\n\treturn id\n}\n\n// TODO: make part of debian_package_manager\nfunc parseDebControl(r io.Reader) (map[string]string, error) {\n\tconst (\n\t\tseparator = \":\"\n\t)\n\tvar currentKey string\n\tvar currentEntry = map[string]string{}\n\n\tcontinuation := regexp.MustCompile(`^\\s`)\n\ts := bufio.NewScanner(r)\n\n\t// some Packages.xz lines are super big\n\tmaxCap := 1024 * 1024\n\tmegaBuffer := make([]byte, maxCap)\n\ts.Buffer(megaBuffer, maxCap)\n\n\tln := 0\n\tfor s.Scan() {\n\t\tline := s.Text()\n\t\tln++\n\n\t\tif continuation.MatchString(line) {\n\t\t\tif currentKey == \"\" || len(currentEntry) == 0 {\n\t\t\t\treturn nil, fmt.Errorf(\"bad indentation on line %d: %q\", ln, line)\n\t\t\t}\n\t\t\tcurrentEntry[currentKey] += \"\\n\" + strings.TrimSpace(line)\n\t\t} else if strings.Contains(line, separator) {\n\t\t\tsp := strings.SplitN(line, separator, 2)\n\t\t\tcurrentKey = strings.TrimSpace(sp[0])\n\t\t\tif _, ok := currentEntry[currentKey]; ok {\n\t\t\t\treturn nil, fmt.Errorf(\"duplicate key %q on line %d: %q\", currentKey, ln, line)\n\t\t\t}\n\t\t\tcurrentEntry[currentKey] = strings.TrimSpace(sp[1])\n\t\t} else {\n\t\t\treturn nil, fmt.Errorf(\"no indentation or delimiter on line %d: %q\", ln, line)\n\t\t}\n\n\t}\n\tif s.Err() != nil {\n\t\treturn nil, s.Err()\n\t}\n\n\treturn currentEntry, nil\n}\n\nfunc main() {\n\tvar control, output, sha256, url, id, copyright, generates string\n\tflag.StringVar(&control, \"control\", \"\", \"\")\n\tflag.StringVar(&output, \"output\", \"\", \"\")\n\tflag.StringVar(&sha256, \"sha256\", \"\", \"\")\n\tflag.StringVar(&id, \"id\", \"\", \"\")\n\tflag.StringVar(&copyright, \"copyright\", \"\", \"\")\n\tflag.StringVar(&generates, \"generates\", \"\", \"\")\n\t// TODO: multiple urls. it is not required at the moment since .deb are fetched without a fallback mirror.\n\tflag.StringVar(&url, \"url\", \"\", \"\")\n\tflag.Parse()\n\n\tread, err := os.Open(control)\n\tif err != nil {\n\t\tlog.Fatalln(err)\n\t}\n\tmp, err := parseDebControl(read)\n\tif err != nil {\n\t\tlog.Fatalln(err)\n\t}\n\n\tcopyrightText := \"NOASSERTION\"\n\tif copyright != \"\" {\n\t\tcopyrightBytes, err := os.ReadFile(copyright)\n\t\tif err != nil {\n\t\t\tlog.Fatalln(err)\n\t\t}\n\t\tcopyrightText = string(copyrightBytes)\n\t}\n\n\tsupplier := &common.Supplier{}\n\tif mp[\"Maintainer\"] != \"\" {\n\t\tsupplier.Supplier = mp[\"Maintainer\"]\n\t\tsupplier.SupplierType = \"Person\"\n\t}\n\n\tdeb := &v2_3.Package{\n\t\tPackageSPDXIdentifier:   common.ElementID(pkgId(id)),\n\t\tPackageName:             mp[\"Package\"],\n\t\tPackageDescription:      mp[\"Description\"],\n\t\tPackageSummary:          strings.Split(mp[\"Description\"], \"\\n\")[0],\n\t\tPackageVersion:          mp[\"Version\"],\n\t\tPackageSourceInfo:       mp[\"Source\"],\n\t\tPackageHomePage:         mp[\"Homepage\"],\n\t\tBuiltDate:               mp[\"Date\"],\n\t\tReleaseDate:             mp[\"Date\"],\n\t\tPackageDownloadLocation: url,\n\t\tPackageSupplier:         supplier,\n\t\tPackageCopyrightText:    copyrightText,\n\t\tPackageChecksums: []common.Checksum{\n\t\t\t{\n\t\t\t\tAlgorithm: common.SHA256,\n\t\t\t\tValue:     sha256,\n\t\t\t},\n\t\t},\n\t\tPackageExternalReferences: []*v2_3.PackageExternalReference{\n\t\t\t{\n\n\t\t\t\tCategory: \"PACKAGE-MANAGER\",\n\t\t\t\tLocator:  fmt.Sprintf(\"pkg:deb/debian/%s@%s?arch=%s\", mp[\"Package\"], mp[\"Version\"], mp[\"Architecture\"]),\n\t\t\t\tRefType:  common.TypePackageManagerPURL,\n\t\t\t},\n\t\t},\n\t}\n\tgen := &v2_3.Package{\n\t\tPackageSPDXIdentifier:   common.ElementID(pkgId(generates)),\n\t\tPackageName:             generates,\n\t\tPackageDescription:      fmt.Sprintf(\"Generated from %s@%s\", deb.PackageName, deb.PackageVersion),\n\t\tPackageDownloadLocation: \"NOASSERTION\",\n\t\tPackageCopyrightText:    \"NOASSERTION\",\n\t}\n\tdoc := &v2_3.Document{\n\t\tSPDXIdentifier: gen.PackageSPDXIdentifier,\n\t\tPackages: []*v2_3.Package{\n\t\t\tdeb,\n\t\t\tgen,\n\t\t},\n\t\tRelationships: []*v2_3.Relationship{\n\t\t\t&v2_3.Relationship{\n\t\t\t\tRefA:         common.DocElementID{ElementRefID: gen.PackageSPDXIdentifier},\n\t\t\t\tRefB:         common.DocElementID{ElementRefID: deb.PackageSPDXIdentifier},\n\t\t\t\tRelationship: common.TypeRelationshipGeneratedFrom,\n\t\t\t},\n\t\t},\n\t}\n\toutputFile, err := os.Create(output)\n\tif err != nil {\n\t\tlog.Fatalln(err)\n\t}\n\tif err := spdx_json.Save2_3(doc, outputFile); err != nil {\n\t\tlog.Fatalln(err)\n\t}\n}\n"
  },
  {
    "path": "private/pkg/oci_image_spdx.bzl",
    "content": "\"an aspect rule that generates spdx by collecting spdx output group\"\n\ndef _image_aspect_impl(target, ctx):\n    output = ctx.actions.declare_file(\"%s.spdx.json\" % target.label.name)\n\n    args = ctx.actions.args()\n    args.add(output.path, format = \"--output=%s\")\n    args.add(target.label, format = \"--label=%s\")\n\n    input_depsets = []\n\n    if ctx.rule.kind == \"oci_image\":\n        if ctx.rule.attr.base != None:\n            output_group_info = ctx.rule.attr.base[OutputGroupInfo]\n            if output_group_info and \"spdx\" in output_group_info:\n                input_depsets.append(output_group_info.spdx)\n                args.add_all(output_group_info.spdx, format_each = \"--contains=%s\")\n\n        for src in ctx.rule.attr.tars:\n            if OutputGroupInfo in src and \"spdx\" in src[OutputGroupInfo]:\n                input_depsets.append(src[OutputGroupInfo].spdx)\n                args.add_all(src[OutputGroupInfo].spdx)\n\n    elif ctx.rule.kind == \"oci_image_index\":\n        for image in ctx.rule.attr.images:\n            if OutputGroupInfo in image and \"spdx\" in image[OutputGroupInfo]:\n                input_depsets.append(image[OutputGroupInfo].spdx)\n                args.add_all(image[OutputGroupInfo].spdx, format_each = \"--contains=%s\")\n\n    ctx.actions.run(\n        inputs = depset(transitive = input_depsets),\n        outputs = [output],\n        executable = ctx.executable._generator,\n        arguments = [args],\n    )\n\n    return [\n        OutputGroupInfo(\n            spdx = depset([output]),\n        ),\n    ]\n\nimage_aspect = aspect(\n    implementation = _image_aspect_impl,\n    attr_aspects = [\"base\", \"images\"],\n    attrs = {\"_generator\": attr.label(default = \":oci_image_spdx\", executable = True, allow_single_file = True, cfg = \"exec\")},\n)\n\ndef _oci_image_spdx_impl(ctx):\n    return DefaultInfo(files = ctx.attr.image[OutputGroupInfo].spdx)\n\noci_image_spdx = rule(\n    implementation = _oci_image_spdx_impl,\n    attrs = {\n        \"image\": attr.label(aspects = [image_aspect]),\n    },\n)\n"
  },
  {
    "path": "private/pkg/oci_image_spdx.go",
    "content": "package main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"strings\"\n\n\tspdx_json \"github.com/spdx/tools-golang/json\"\n\t\"github.com/spdx/tools-golang/spdx/common\"\n\t\"github.com/spdx/tools-golang/spdx/v2_3\"\n)\n\nfunc pkgId(id string) string {\n\tid = strings.ReplaceAll(id, \"/\", \"-slash-\")\n\tid = strings.ReplaceAll(id, \"_\", \"-underscore-\")\n\tid = strings.ReplaceAll(id, \"_\", \"-underscore-\")\n\tid = strings.ReplaceAll(id, \":\", \"-colon-\")\n\tid = strings.ReplaceAll(id, \"@\", \"-at-\")\n\treturn id\n}\n\ntype ArrayFlags []string\n\nfunc (i *ArrayFlags) String() string {\n\treturn \"my string representation\"\n}\n\nfunc (i *ArrayFlags) Set(value string) error {\n\t*i = append(*i, value)\n\treturn nil\n}\n\nfunc main() {\n\tvar label, output string\n\tvar contains ArrayFlags\n\tflag.StringVar(&output, \"output\", \"\", \"\")\n\tflag.StringVar(&label, \"label\", \"\", \"\")\n\tflag.Var(&contains, \"contains\", \"\")\n\tflag.Parse()\n\n\tid := pkgId(label)\n\tdoc := v2_3.Document{\n\t\tSPDXIdentifier:    \"SPDXRef-DOCUMENT\",\n\t\tSPDXVersion:       \"SPDX-2.3\",\n\t\tDocumentName:      label,\n\t\tDataLicense:       \"CC0-1.0\",\n\t\tDocumentNamespace: \"http://spdx.org/spdxdocs/distroless/\" + id,\n\t\tCreationInfo: &v2_3.CreationInfo{\n\t\t\tCreated: \"1970-01-01T00:00:00Z\",\n\t\t\tCreators: []common.Creator{\n\t\t\t\tcommon.Creator{\n\t\t\t\t\tCreator: \"distroless\", CreatorType: \"Organization\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tLicenseListVersion: \"NOASSERTION\",\n\t\t},\n\t\tPackages: []*v2_3.Package{\n\t\t\t{\n\t\t\t\tPackageSPDXIdentifier:   common.ElementID(id),\n\t\t\t\tPackageName:             label,\n\t\t\t\tPackageDownloadLocation: \"NOASSERTION\",\n\t\t\t\tPackageCopyrightText:    \"NOASSERTION\",\n\t\t\t},\n\t\t},\n\t\tRelationships: []*v2_3.Relationship{\n\t\t\t{\n\t\t\t\tRefA:         common.MakeDocElementID(\"\", \"DOCUMENT\"),\n\t\t\t\tRefB:         common.MakeDocElementID(\"\", id),\n\t\t\t\tRelationship: \"DESCRIBES\",\n\t\t\t},\n\t\t},\n\t}\n\tspdxs := flag.Args()\n\tfor _, p := range spdxs {\n\t\tbytes, err := os.Open(p)\n\t\tif err != nil {\n\t\t\tlog.Fatalln(err)\n\t\t}\n\t\tsubdoc, err := spdx_json.Load2_3(bytes)\n\t\tif err != nil {\n\t\t\tlog.Fatalln(err)\n\t\t}\n\t\tdoc.Packages = append(doc.Packages, subdoc.Packages...)\n\t\tfor _, rel := range subdoc.Relationships {\n\t\t\tif rel.Relationship == \"DESCRIBES\" && rel.RefA.ElementRefID == \"DOCUMENT\" {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tdoc.Relationships = append(doc.Relationships, rel)\n\t\t}\n\t\tdoc.Relationships = append(doc.Relationships, &v2_3.Relationship{\n\t\t\tRefA:         common.MakeDocElementID(\"\", id),\n\t\t\tRefB:         common.DocElementID{ElementRefID: subdoc.SPDXIdentifier},\n\t\t\tRelationship: \"DEPENDS_ON\",\n\t\t})\n\t}\n\n\tfor _, contain := range contains {\n\t\tbytes, err := os.Open(contain)\n\t\tif err != nil {\n\t\t\tlog.Fatalln(err)\n\t\t}\n\t\tsubdoc, err := spdx_json.Load2_3(bytes)\n\t\tif err != nil {\n\t\t\tlog.Fatalln(err)\n\t\t}\n\t\tdoc.Packages = append(doc.Packages, subdoc.Packages...)\n\n\t\tvar describedBy *common.DocElementID = nil\n\t\tfor _, rel := range subdoc.Relationships {\n\t\t\tif rel.Relationship == \"DESCRIBES\" && rel.RefA.ElementRefID == \"DOCUMENT\" {\n\t\t\t\tif rel.RefA.ElementRefID == subdoc.SPDXIdentifier {\n\t\t\t\t\tdescribedBy = &rel.RefB\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tdoc.Relationships = append(doc.Relationships, rel)\n\t\t}\n\t\tif describedBy == nil {\n\t\t\tlog.Fatalln(fmt.Errorf(\"%s: can not determine which package describes %s\", contain, subdoc.SPDXIdentifier))\n\t\t}\n\t\tdoc.Relationships = append(doc.Relationships, &v2_3.Relationship{\n\t\t\tRefA:         common.MakeDocElementID(\"\", id),\n\t\t\tRefB:         *describedBy,\n\t\t\tRelationship: \"CONTAINS\",\n\t\t})\n\t}\n\n\toutputFile, err := os.Create(output)\n\tif err != nil {\n\t\tlog.Fatalln(err)\n\t}\n\n\tif err := spdx_json.Save2_3(&doc, outputFile); err != nil {\n\t\tlog.Fatalln(err)\n\t}\n}\n"
  },
  {
    "path": "private/pkg/test/oci_image/BUILD.bazel",
    "content": "load(\"@aspect_bazel_lib//lib:write_source_files.bzl\", \"write_source_files\")\nload(\"@rules_oci//oci:defs.bzl\", \"oci_image\", \"oci_image_index\")\nload(\"//private/pkg:oci_image_spdx.bzl\", \"oci_image_spdx\")\nload(\"//private/util:deb.bzl\", \"deb\")\n\noci_image(\n    name = \"image_arm64\",\n    architecture = \"arm64\",\n    os = \"linux\",\n    tars = [\n        deb.package(\"arm64\", \"debian12\", \"base-files\"),\n    ],\n)\n\noci_image_spdx(\n    name = \"image_arm64_sbom\",\n    image = \":image_arm64\",\n)\n\noci_image(\n    name = \"image_amd64\",\n    architecture = \"amd64\",\n    os = \"linux\",\n    tars = [\n        deb.package(\"amd64\", \"debian12\", \"netbase\"),\n    ],\n)\n\noci_image_spdx(\n    name = \"image_amd64_sbom\",\n    image = \":image_amd64\",\n)\n\noci_image_index(\n    name = \"fat_image\",\n    images = [\n        \":image_arm64\",\n        \":image_amd64\",\n    ],\n)\n\noci_image_spdx(\n    name = \"fat_image_sbom\",\n    image = \":fat_image\",\n)\n\nwrite_source_files(\n    name = \"test_sboms\",\n    files = {\n        \"fat_image_sbom.spdx.json\": \":fat_image_sbom\",\n        \"image_arm64.spdx.json\": \":image_arm64_sbom\",\n        \"image_amd64.spdx.json\": \":image_amd64_sbom\",\n    },\n)\n"
  },
  {
    "path": "private/pkg/test/oci_image/fat_image_sbom.spdx.json",
    "content": "{\"spdxVersion\":\"SPDX-2.3\",\"dataLicense\":\"CC0-1.0\",\"SPDXID\":\"SPDXRef-DOCUMENT\",\"name\":\"//private/pkg/test/oci_image:fat_image\",\"documentNamespace\":\"http://spdx.org/spdxdocs/distroless/-slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-fat-underscore-image\",\"creationInfo\":{\"licenseListVersion\":\"NOASSERTION\",\"creators\":[\"Organization: distroless\"],\"created\":\"1970-01-01T00:00:00Z\"},\"packages\":[{\"name\":\"//private/pkg/test/oci_image:fat_image\",\"SPDXID\":\"SPDXRef--slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-fat-underscore-image\",\"downloadLocation\":\"NOASSERTION\",\"copyrightText\":\"NOASSERTION\"},{\"name\":\"//private/pkg/test/oci_image:image_arm64\",\"SPDXID\":\"SPDXRef--slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-image-underscore-arm64\",\"downloadLocation\":\"NOASSERTION\",\"copyrightText\":\"NOASSERTION\"},{\"name\":\"base-files\",\"SPDXID\":\"SPDXRef--at-rules-underscore-distroless~~apt~bookworm-underscore-base-files-underscore-12.4-p-deb12u13-underscore-arm64\",\"versionInfo\":\"12.4+deb12u13\",\"supplier\":\"Person: Santiago Vila \\\\\\\\u003csanvila@debian.org\\\\\\\\u003e\",\"downloadLocation\":\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/base-files/base-files_12.4+deb12u13_arm64.deb\",\"checksums\":[{\"algorithm\":\"SHA256\",\"checksumValue\":\"4eed22415ebf001438f17064ded8ae9bb5d1bc4ad1200a3f05345055af540e1f\"}],\"copyrightText\":\"This is the Debian prepackaged version of the Debian Base System\\nMiscellaneous files. These files were written by Ian Murdock\\n\\u003cimurdock@debian.org\\u003e and Bruce Perens \\u003cbruce@pixar.com\\u003e.\\n\\nThis package was first put together by Bruce Perens \\u003cBruce@Pixar.com\\u003e,\\nfrom his own sources.\\n\\nThe GNU Public Licenses in /usr/share/common-licenses were taken from\\nftp.gnu.org and are copyrighted by the Free Software Foundation, Inc.\\n\\nThe Artistic License in /usr/share/common-licenses is the one coming\\nfrom Perl and its SPDX name is \\\"Artistic License 1.0 (Perl)\\\".\\n\\n\\nCopyright (C) 1995-2011 Software in the Public Interest.\\n\\nThis program is free software; you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation; either version 2 of the License, or\\n(at your option) any later version.\\n\\nThis program is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nOn Debian systems, the complete text of the GNU General\\nPublic License can be found in `/usr/share/common-licenses/GPL'.\\n\",\"summary\":\"Debian base system miscellaneous files\",\"description\":\"Debian base system miscellaneous files\\nThis package contains the basic filesystem hierarchy of a Debian system, and\\nseveral important miscellaneous files, such as /etc/debian_version,\\n/etc/host.conf, /etc/issue, /etc/motd, /etc/profile, and others,\\nand the text of several common licenses in use on Debian systems.\",\"externalRefs\":[{\"referenceCategory\":\"PACKAGE-MANAGER\",\"referenceType\":\"purl\",\"referenceLocator\":\"pkg:deb/debian/base-files@12.4+deb12u13?arch=arm64\"}]},{\"name\":\"@bookworm//base-files/arm64:spdx\",\"SPDXID\":\"SPDXRef--at-bookworm-slash--slash-base-files-slash-arm64-colon-spdx\",\"downloadLocation\":\"NOASSERTION\",\"copyrightText\":\"NOASSERTION\",\"description\":\"Generated from base-files@12.4+deb12u13\"},{\"name\":\"//private/pkg/test/oci_image:image_amd64\",\"SPDXID\":\"SPDXRef--slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-image-underscore-amd64\",\"downloadLocation\":\"NOASSERTION\",\"copyrightText\":\"NOASSERTION\"},{\"name\":\"netbase\",\"SPDXID\":\"SPDXRef--at-rules-underscore-distroless~~apt~bookworm-underscore-netbase-underscore-6.4-underscore-amd64\",\"versionInfo\":\"6.4\",\"supplier\":\"Person: Marco d'Itri \\\\\\\\u003cmd@linux.it\\\\\\\\u003e\",\"downloadLocation\":\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/netbase/netbase_6.4_all.deb\",\"checksums\":[{\"algorithm\":\"SHA256\",\"checksumValue\":\"29b23c48c0fe6f878e56c5ddc9f65d1c05d729360f3690a593a8c795031cd867\"}],\"copyrightText\":\"Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/\\nComment:\\n This package was created by Peter Tobias tobias@et-inf.fho-emden.de on\\n Wed, 24 Aug 1994 21:33:28 +0200 and maintained by Anthony Towns\\n \\u003cajt@debian.org\\u003e until 2001.\\n It is currently maintained by Marco d'Itri \\u003cmd@linux.it\\u003e.\\n\\nFiles: *\\nCopyright:\\n Copyright (c) 1994-1998 Peter Tobias\\n Copyright (c) 1998-2001 Anthony Towns\\n Copyright (c) 2002-2022 Marco d'Itri\\nLicense: GPL-2\\n This program is free software; you can redistribute it and/or modify\\n it under the terms of the GNU General Public License, version 2, as\\n published by the Free Software Foundation.\\n .\\n This program is distributed in the hope that it will be useful,\\n but WITHOUT ANY WARRANTY; without even the implied warranty of\\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\n GNU General Public License for more details.\\n .\\n You should have received a copy of the GNU General Public License along\\n with this program; if not, write to the Free Software Foundation,\\n Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\\n .\\n On Debian systems, the complete text of the GNU General Public License\\n version 2 can be found in '/usr/share/common-licenses/GPL-2'.\\n\",\"summary\":\"Basic TCP/IP networking system\",\"description\":\"Basic TCP/IP networking system\\nThis package provides the necessary infrastructure for basic TCP/IP based\\nnetworking.\\n.\\nIn particular, it supplies common name-to-number mappings in /etc/services,\\n/etc/rpc, /etc/protocols and /etc/ethertypes.\",\"externalRefs\":[{\"referenceCategory\":\"PACKAGE-MANAGER\",\"referenceType\":\"purl\",\"referenceLocator\":\"pkg:deb/debian/netbase@6.4?arch=all\"}]},{\"name\":\"@bookworm//netbase/amd64:spdx\",\"SPDXID\":\"SPDXRef--at-bookworm-slash--slash-netbase-slash-amd64-colon-spdx\",\"downloadLocation\":\"NOASSERTION\",\"copyrightText\":\"NOASSERTION\",\"description\":\"Generated from netbase@6.4\"}],\"relationships\":[{\"spdxElementId\":\"SPDXRef-DOCUMENT\",\"relatedSpdxElement\":\"SPDXRef--slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-fat-underscore-image\",\"relationshipType\":\"DESCRIBES\"},{\"spdxElementId\":\"SPDXRef--at-bookworm-slash--slash-base-files-slash-arm64-colon-spdx\",\"relatedSpdxElement\":\"SPDXRef--at-rules-underscore-distroless~~apt~bookworm-underscore-base-files-underscore-12.4-p-deb12u13-underscore-arm64\",\"relationshipType\":\"GENERATED_FROM\"},{\"spdxElementId\":\"SPDXRef--slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-image-underscore-arm64\",\"relatedSpdxElement\":\"SPDXRef--at-bookworm-slash--slash-base-files-slash-arm64-colon-spdx\",\"relationshipType\":\"DEPENDS_ON\"},{\"spdxElementId\":\"SPDXRef--slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-fat-underscore-image\",\"relatedSpdxElement\":\"SPDXRef--slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-image-underscore-arm64\",\"relationshipType\":\"CONTAINS\"},{\"spdxElementId\":\"SPDXRef--at-bookworm-slash--slash-netbase-slash-amd64-colon-spdx\",\"relatedSpdxElement\":\"SPDXRef--at-rules-underscore-distroless~~apt~bookworm-underscore-netbase-underscore-6.4-underscore-amd64\",\"relationshipType\":\"GENERATED_FROM\"},{\"spdxElementId\":\"SPDXRef--slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-image-underscore-amd64\",\"relatedSpdxElement\":\"SPDXRef--at-bookworm-slash--slash-netbase-slash-amd64-colon-spdx\",\"relationshipType\":\"DEPENDS_ON\"},{\"spdxElementId\":\"SPDXRef--slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-fat-underscore-image\",\"relatedSpdxElement\":\"SPDXRef--slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-image-underscore-amd64\",\"relationshipType\":\"CONTAINS\"}]}"
  },
  {
    "path": "private/pkg/test/oci_image/image_amd64.spdx.json",
    "content": "{\"spdxVersion\":\"SPDX-2.3\",\"dataLicense\":\"CC0-1.0\",\"SPDXID\":\"SPDXRef-DOCUMENT\",\"name\":\"//private/pkg/test/oci_image:image_amd64\",\"documentNamespace\":\"http://spdx.org/spdxdocs/distroless/-slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-image-underscore-amd64\",\"creationInfo\":{\"licenseListVersion\":\"NOASSERTION\",\"creators\":[\"Organization: distroless\"],\"created\":\"1970-01-01T00:00:00Z\"},\"packages\":[{\"name\":\"//private/pkg/test/oci_image:image_amd64\",\"SPDXID\":\"SPDXRef--slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-image-underscore-amd64\",\"downloadLocation\":\"NOASSERTION\",\"copyrightText\":\"NOASSERTION\"},{\"name\":\"netbase\",\"SPDXID\":\"SPDXRef--at-rules-underscore-distroless~~apt~bookworm-underscore-netbase-underscore-6.4-underscore-amd64\",\"versionInfo\":\"6.4\",\"supplier\":\"Person: Marco d'Itri \\\\u003cmd@linux.it\\\\u003e\",\"downloadLocation\":\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/netbase/netbase_6.4_all.deb\",\"checksums\":[{\"algorithm\":\"SHA256\",\"checksumValue\":\"29b23c48c0fe6f878e56c5ddc9f65d1c05d729360f3690a593a8c795031cd867\"}],\"copyrightText\":\"Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/\\nComment:\\n This package was created by Peter Tobias tobias@et-inf.fho-emden.de on\\n Wed, 24 Aug 1994 21:33:28 +0200 and maintained by Anthony Towns\\n \\u003cajt@debian.org\\u003e until 2001.\\n It is currently maintained by Marco d'Itri \\u003cmd@linux.it\\u003e.\\n\\nFiles: *\\nCopyright:\\n Copyright (c) 1994-1998 Peter Tobias\\n Copyright (c) 1998-2001 Anthony Towns\\n Copyright (c) 2002-2022 Marco d'Itri\\nLicense: GPL-2\\n This program is free software; you can redistribute it and/or modify\\n it under the terms of the GNU General Public License, version 2, as\\n published by the Free Software Foundation.\\n .\\n This program is distributed in the hope that it will be useful,\\n but WITHOUT ANY WARRANTY; without even the implied warranty of\\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\n GNU General Public License for more details.\\n .\\n You should have received a copy of the GNU General Public License along\\n with this program; if not, write to the Free Software Foundation,\\n Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\\n .\\n On Debian systems, the complete text of the GNU General Public License\\n version 2 can be found in '/usr/share/common-licenses/GPL-2'.\\n\",\"summary\":\"Basic TCP/IP networking system\",\"description\":\"Basic TCP/IP networking system\\nThis package provides the necessary infrastructure for basic TCP/IP based\\nnetworking.\\n.\\nIn particular, it supplies common name-to-number mappings in /etc/services,\\n/etc/rpc, /etc/protocols and /etc/ethertypes.\",\"externalRefs\":[{\"referenceCategory\":\"PACKAGE-MANAGER\",\"referenceType\":\"purl\",\"referenceLocator\":\"pkg:deb/debian/netbase@6.4?arch=all\"}]},{\"name\":\"@bookworm//netbase/amd64:spdx\",\"SPDXID\":\"SPDXRef--at-bookworm-slash--slash-netbase-slash-amd64-colon-spdx\",\"downloadLocation\":\"NOASSERTION\",\"copyrightText\":\"NOASSERTION\",\"description\":\"Generated from netbase@6.4\"}],\"relationships\":[{\"spdxElementId\":\"SPDXRef-DOCUMENT\",\"relatedSpdxElement\":\"SPDXRef--slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-image-underscore-amd64\",\"relationshipType\":\"DESCRIBES\"},{\"spdxElementId\":\"SPDXRef--at-bookworm-slash--slash-netbase-slash-amd64-colon-spdx\",\"relatedSpdxElement\":\"SPDXRef--at-rules-underscore-distroless~~apt~bookworm-underscore-netbase-underscore-6.4-underscore-amd64\",\"relationshipType\":\"GENERATED_FROM\"},{\"spdxElementId\":\"SPDXRef--slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-image-underscore-amd64\",\"relatedSpdxElement\":\"SPDXRef--at-bookworm-slash--slash-netbase-slash-amd64-colon-spdx\",\"relationshipType\":\"DEPENDS_ON\"}]}"
  },
  {
    "path": "private/pkg/test/oci_image/image_arm64.spdx.json",
    "content": "{\"spdxVersion\":\"SPDX-2.3\",\"dataLicense\":\"CC0-1.0\",\"SPDXID\":\"SPDXRef-DOCUMENT\",\"name\":\"//private/pkg/test/oci_image:image_arm64\",\"documentNamespace\":\"http://spdx.org/spdxdocs/distroless/-slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-image-underscore-arm64\",\"creationInfo\":{\"licenseListVersion\":\"NOASSERTION\",\"creators\":[\"Organization: distroless\"],\"created\":\"1970-01-01T00:00:00Z\"},\"packages\":[{\"name\":\"//private/pkg/test/oci_image:image_arm64\",\"SPDXID\":\"SPDXRef--slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-image-underscore-arm64\",\"downloadLocation\":\"NOASSERTION\",\"copyrightText\":\"NOASSERTION\"},{\"name\":\"base-files\",\"SPDXID\":\"SPDXRef--at-rules-underscore-distroless~~apt~bookworm-underscore-base-files-underscore-12.4-p-deb12u13-underscore-arm64\",\"versionInfo\":\"12.4+deb12u13\",\"supplier\":\"Person: Santiago Vila \\\\u003csanvila@debian.org\\\\u003e\",\"downloadLocation\":\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/base-files/base-files_12.4+deb12u13_arm64.deb\",\"checksums\":[{\"algorithm\":\"SHA256\",\"checksumValue\":\"4eed22415ebf001438f17064ded8ae9bb5d1bc4ad1200a3f05345055af540e1f\"}],\"copyrightText\":\"This is the Debian prepackaged version of the Debian Base System\\nMiscellaneous files. These files were written by Ian Murdock\\n\\u003cimurdock@debian.org\\u003e and Bruce Perens \\u003cbruce@pixar.com\\u003e.\\n\\nThis package was first put together by Bruce Perens \\u003cBruce@Pixar.com\\u003e,\\nfrom his own sources.\\n\\nThe GNU Public Licenses in /usr/share/common-licenses were taken from\\nftp.gnu.org and are copyrighted by the Free Software Foundation, Inc.\\n\\nThe Artistic License in /usr/share/common-licenses is the one coming\\nfrom Perl and its SPDX name is \\\"Artistic License 1.0 (Perl)\\\".\\n\\n\\nCopyright (C) 1995-2011 Software in the Public Interest.\\n\\nThis program is free software; you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation; either version 2 of the License, or\\n(at your option) any later version.\\n\\nThis program is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nOn Debian systems, the complete text of the GNU General\\nPublic License can be found in `/usr/share/common-licenses/GPL'.\\n\",\"summary\":\"Debian base system miscellaneous files\",\"description\":\"Debian base system miscellaneous files\\nThis package contains the basic filesystem hierarchy of a Debian system, and\\nseveral important miscellaneous files, such as /etc/debian_version,\\n/etc/host.conf, /etc/issue, /etc/motd, /etc/profile, and others,\\nand the text of several common licenses in use on Debian systems.\",\"externalRefs\":[{\"referenceCategory\":\"PACKAGE-MANAGER\",\"referenceType\":\"purl\",\"referenceLocator\":\"pkg:deb/debian/base-files@12.4+deb12u13?arch=arm64\"}]},{\"name\":\"@bookworm//base-files/arm64:spdx\",\"SPDXID\":\"SPDXRef--at-bookworm-slash--slash-base-files-slash-arm64-colon-spdx\",\"downloadLocation\":\"NOASSERTION\",\"copyrightText\":\"NOASSERTION\",\"description\":\"Generated from base-files@12.4+deb12u13\"}],\"relationships\":[{\"spdxElementId\":\"SPDXRef-DOCUMENT\",\"relatedSpdxElement\":\"SPDXRef--slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-image-underscore-arm64\",\"relationshipType\":\"DESCRIBES\"},{\"spdxElementId\":\"SPDXRef--at-bookworm-slash--slash-base-files-slash-arm64-colon-spdx\",\"relatedSpdxElement\":\"SPDXRef--at-rules-underscore-distroless~~apt~bookworm-underscore-base-files-underscore-12.4-p-deb12u13-underscore-arm64\",\"relationshipType\":\"GENERATED_FROM\"},{\"spdxElementId\":\"SPDXRef--slash--slash-private-slash-pkg-slash-test-slash-oci-underscore-image-colon-image-underscore-arm64\",\"relatedSpdxElement\":\"SPDXRef--at-bookworm-slash--slash-base-files-slash-arm64-colon-spdx\",\"relationshipType\":\"DEPENDS_ON\"}]}"
  },
  {
    "path": "private/repos/deb/BUILD.bazel",
    "content": ""
  },
  {
    "path": "private/repos/deb/bookworm.lock.json",
    "content": "{\n\t\"packages\": [\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"base-files_12.4-p-deb12u13_amd64\",\n\t\t\t\"name\": \"base-files\",\n\t\t\t\"sha256\": \"d0aee30a91b1283e0c724e9ad0ae7394d8e56f07d20cacfcb79b8f444daa94cd\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/base-files/base-files_12.4+deb12u13_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.4+deb12u13\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"ca-certificates_20230311-p-deb12u1_amd64\",\n\t\t\t\"name\": \"ca-certificates\",\n\t\t\t\"sha256\": \"0d5f444f594e48c1e16a41d8fc628a09b24c658916a1274025c2330f2a802bed\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/c/ca-certificates/ca-certificates_20230311+deb12u1_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"20230311+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc6_2.36-9-p-deb12u13_amd64\",\n\t\t\t\"name\": \"libc6\",\n\t\t\t\"sha256\": \"3d8072c73b017e907bbf44b7db870687888a991961d74f1ecbba6b9458f32a2c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc6_2.36-9+deb12u13_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.36-9+deb12u13\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc-bin_2.36-9-p-deb12u13_amd64\",\n\t\t\t\"name\": \"libc-bin\",\n\t\t\t\"sha256\": \"3f7a7caf9a34875fb076f08d168430ad8c338c71b0b7e6c02d19e914d7bc4277\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc-bin_2.36-9+deb12u13_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.36-9+deb12u13\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libssl3_3.0.18-1_deb12u2_amd64\",\n\t\t\t\"name\": \"libssl3\",\n\t\t\t\"sha256\": \"ed44f11b74763cded2ad406f4de4d585ea27b0ce6377e7c8d98c2ddf2ed35cb3\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian-security/20260314T202839Z/pool/updates/main/o/openssl/libssl3_3.0.18-1~deb12u2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.0.18-1~deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"netbase_6.4_amd64\",\n\t\t\t\"name\": \"netbase\",\n\t\t\t\"sha256\": \"29b23c48c0fe6f878e56c5ddc9f65d1c05d729360f3690a593a8c795031cd867\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/netbase/netbase_6.4_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"openssl_3.0.18-1_deb12u2_amd64\",\n\t\t\t\"name\": \"openssl\",\n\t\t\t\"sha256\": \"9107c374e0f760d5d7c9c7372788d4e618e1433db4fdef9a3a25788dfd5588bb\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian-security/20260314T202839Z/pool/updates/main/o/openssl/openssl_3.0.18-1~deb12u2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.0.18-1~deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"tzdata_2025b-0-p-deb12u2_amd64\",\n\t\t\t\"name\": \"tzdata\",\n\t\t\t\"sha256\": \"719b61acbc9974a86b92c1d043b9f3b7883dbfe9f5824f9a43c575445fa55d2a\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/t/tzdata/tzdata_2025b-0+deb12u2_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2025b-0+deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"media-types_10.0.0_amd64\",\n\t\t\t\"name\": \"media-types\",\n\t\t\t\"sha256\": \"aaa46dcb3b39948ae2e0fdb72cfcb2f48c0b59f19785a3da8045c05eb19955dd\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/m/media-types/media-types_10.0.0_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"10.0.0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"gcc-12-base_12.2.0-14-p-deb12u1_amd64\",\n\t\t\t\"name\": \"gcc-12-base\",\n\t\t\t\"sha256\": \"1896a2aacf4ad681ff5eacc24a5b0ca4d5d9c9b9c9e4b6de5197bc1e116ea619\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/gcc-12-base_12.2.0-14+deb12u1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgcc-s1_12.2.0-14-p-deb12u1_amd64\",\n\t\t\t\"name\": \"libgcc-s1\",\n\t\t\t\"sha256\": \"3016e62cb4b7cd8038822870601f5ed131befe942774d0f745622cc77d8a88f7\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/libgcc-s1_12.2.0-14+deb12u1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgomp1_12.2.0-14-p-deb12u1_amd64\",\n\t\t\t\"name\": \"libgomp1\",\n\t\t\t\"sha256\": \"48fec46bda7f5b1638b9e959889bfbc20491247d402d120bb152687eb48143d7\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/libgomp1_12.2.0-14+deb12u1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libstdc-p--p-6_12.2.0-14-p-deb12u1_amd64\",\n\t\t\t\"name\": \"libstdc++6\",\n\t\t\t\"sha256\": \"5cd3171216d4ab0fc911cfe9c35509bf2dd8f47761c43b7f6a4296701551a24d\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/libstdc++6_12.2.0-14+deb12u1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"base-files_12.4-p-deb12u13_arm64\",\n\t\t\t\"name\": \"base-files\",\n\t\t\t\"sha256\": \"4eed22415ebf001438f17064ded8ae9bb5d1bc4ad1200a3f05345055af540e1f\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/base-files/base-files_12.4+deb12u13_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.4+deb12u13\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"ca-certificates_20230311-p-deb12u1_arm64\",\n\t\t\t\"name\": \"ca-certificates\",\n\t\t\t\"sha256\": \"0d5f444f594e48c1e16a41d8fc628a09b24c658916a1274025c2330f2a802bed\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/c/ca-certificates/ca-certificates_20230311+deb12u1_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"20230311+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc6_2.36-9-p-deb12u13_arm64\",\n\t\t\t\"name\": \"libc6\",\n\t\t\t\"sha256\": \"03c3909c47a6df9f6f05357474efefca9bc30212069135a7c354fa78a1ec2415\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc6_2.36-9+deb12u13_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.36-9+deb12u13\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc-bin_2.36-9-p-deb12u13_arm64\",\n\t\t\t\"name\": \"libc-bin\",\n\t\t\t\"sha256\": \"1199da233e4c893e0a44e81b2024667241c19f93eb12f4ec1e29585117270a85\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc-bin_2.36-9+deb12u13_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.36-9+deb12u13\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libssl3_3.0.18-1_deb12u2_arm64\",\n\t\t\t\"name\": \"libssl3\",\n\t\t\t\"sha256\": \"30b2d6c27fd4a2f5ef554ac3b86c96e8a3abbbfb454c6dbe7e308ce9df36f8c5\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian-security/20260314T202839Z/pool/updates/main/o/openssl/libssl3_3.0.18-1~deb12u2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.0.18-1~deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"netbase_6.4_arm64\",\n\t\t\t\"name\": \"netbase\",\n\t\t\t\"sha256\": \"29b23c48c0fe6f878e56c5ddc9f65d1c05d729360f3690a593a8c795031cd867\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/netbase/netbase_6.4_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"openssl_3.0.18-1_deb12u2_arm64\",\n\t\t\t\"name\": \"openssl\",\n\t\t\t\"sha256\": \"ed4671eb9fcc282b69c9768863f2df0386664d686bb3103d5397802f9c0b1297\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian-security/20260314T202839Z/pool/updates/main/o/openssl/openssl_3.0.18-1~deb12u2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.0.18-1~deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"tzdata_2025b-0-p-deb12u2_arm64\",\n\t\t\t\"name\": \"tzdata\",\n\t\t\t\"sha256\": \"719b61acbc9974a86b92c1d043b9f3b7883dbfe9f5824f9a43c575445fa55d2a\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/t/tzdata/tzdata_2025b-0+deb12u2_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2025b-0+deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"media-types_10.0.0_arm64\",\n\t\t\t\"name\": \"media-types\",\n\t\t\t\"sha256\": \"aaa46dcb3b39948ae2e0fdb72cfcb2f48c0b59f19785a3da8045c05eb19955dd\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/m/media-types/media-types_10.0.0_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"10.0.0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"gcc-12-base_12.2.0-14-p-deb12u1_arm64\",\n\t\t\t\"name\": \"gcc-12-base\",\n\t\t\t\"sha256\": \"674cf6cba6d432bd200c45fe866c1652c7a53523cc2e7a613e05bc4abf7b5440\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/gcc-12-base_12.2.0-14+deb12u1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgcc-s1_12.2.0-14-p-deb12u1_arm64\",\n\t\t\t\"name\": \"libgcc-s1\",\n\t\t\t\"sha256\": \"576926b283613db80168ddf76380a3bd877602778cf0d226caa7bfbfa71eacf3\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/libgcc-s1_12.2.0-14+deb12u1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgomp1_12.2.0-14-p-deb12u1_arm64\",\n\t\t\t\"name\": \"libgomp1\",\n\t\t\t\"sha256\": \"a48b70dd1a95585466b40bd94564bce56ebcb2566e49ccdb6441e996aaab2098\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/libgomp1_12.2.0-14+deb12u1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libstdc-p--p-6_12.2.0-14-p-deb12u1_arm64\",\n\t\t\t\"name\": \"libstdc++6\",\n\t\t\t\"sha256\": \"26e138c677a985775331373828a6c286c551ff397cb735d00e2383cb273d1cb2\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/libstdc++6_12.2.0-14+deb12u1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"base-files_12.4-p-deb12u13_armhf\",\n\t\t\t\"name\": \"base-files\",\n\t\t\t\"sha256\": \"75e4530fc4f301449c94b953d4568ad22ce6b57209fbcf9d1f0d0091ec03de69\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/base-files/base-files_12.4+deb12u13_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.4+deb12u13\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"ca-certificates_20230311-p-deb12u1_armhf\",\n\t\t\t\"name\": \"ca-certificates\",\n\t\t\t\"sha256\": \"0d5f444f594e48c1e16a41d8fc628a09b24c658916a1274025c2330f2a802bed\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/c/ca-certificates/ca-certificates_20230311+deb12u1_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"20230311+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc6_2.36-9-p-deb12u13_armhf\",\n\t\t\t\"name\": \"libc6\",\n\t\t\t\"sha256\": \"f62e6fb5ec766e80ef811d11e8453e44a389900076899f7c9d4cb244955883d0\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc6_2.36-9+deb12u13_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.36-9+deb12u13\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc-bin_2.36-9-p-deb12u13_armhf\",\n\t\t\t\"name\": \"libc-bin\",\n\t\t\t\"sha256\": \"a4f59c85e0dca4a66f21e26eb4c7d440f581a806edeab2ce7b749a0cf5b8cb3d\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc-bin_2.36-9+deb12u13_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.36-9+deb12u13\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libssl3_3.0.18-1_deb12u2_armhf\",\n\t\t\t\"name\": \"libssl3\",\n\t\t\t\"sha256\": \"954b6ba96d28e9659e4049de09ff56aee9d7b16e9f2c94577e22907a4c3b4085\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian-security/20260314T202839Z/pool/updates/main/o/openssl/libssl3_3.0.18-1~deb12u2_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.0.18-1~deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"netbase_6.4_armhf\",\n\t\t\t\"name\": \"netbase\",\n\t\t\t\"sha256\": \"29b23c48c0fe6f878e56c5ddc9f65d1c05d729360f3690a593a8c795031cd867\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/netbase/netbase_6.4_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"openssl_3.0.18-1_deb12u2_armhf\",\n\t\t\t\"name\": \"openssl\",\n\t\t\t\"sha256\": \"f7e9348d0edc740f1b1dee053414b24f99f40d6db76b93b4db0b2af45a5d8a06\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian-security/20260314T202839Z/pool/updates/main/o/openssl/openssl_3.0.18-1~deb12u2_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.0.18-1~deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"tzdata_2025b-0-p-deb12u2_armhf\",\n\t\t\t\"name\": \"tzdata\",\n\t\t\t\"sha256\": \"719b61acbc9974a86b92c1d043b9f3b7883dbfe9f5824f9a43c575445fa55d2a\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/t/tzdata/tzdata_2025b-0+deb12u2_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2025b-0+deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"media-types_10.0.0_armhf\",\n\t\t\t\"name\": \"media-types\",\n\t\t\t\"sha256\": \"aaa46dcb3b39948ae2e0fdb72cfcb2f48c0b59f19785a3da8045c05eb19955dd\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/m/media-types/media-types_10.0.0_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"10.0.0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"gcc-12-base_12.2.0-14-p-deb12u1_armhf\",\n\t\t\t\"name\": \"gcc-12-base\",\n\t\t\t\"sha256\": \"aa50f90c440377b9219830ed3e658aedcb0a1c1bb47733eb05cf65545012f563\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/gcc-12-base_12.2.0-14+deb12u1_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgcc-s1_12.2.0-14-p-deb12u1_armhf\",\n\t\t\t\"name\": \"libgcc-s1\",\n\t\t\t\"sha256\": \"f58562bf01efd6112b914182147ee149e0d4c90869046e31844da8803669eeb3\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/libgcc-s1_12.2.0-14+deb12u1_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgomp1_12.2.0-14-p-deb12u1_armhf\",\n\t\t\t\"name\": \"libgomp1\",\n\t\t\t\"sha256\": \"31a758a139de68333485e03679cc4721d4a5a2652b64a9402b0b1f401f38ce85\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/libgomp1_12.2.0-14+deb12u1_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libstdc-p--p-6_12.2.0-14-p-deb12u1_armhf\",\n\t\t\t\"name\": \"libstdc++6\",\n\t\t\t\"sha256\": \"66d53ddeb10a37f22e455611c2c515f9d444e523b55d873ff48bde47267963db\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/libstdc++6_12.2.0-14+deb12u1_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"base-files_12.4-p-deb12u13_s390x\",\n\t\t\t\"name\": \"base-files\",\n\t\t\t\"sha256\": \"26836d12260f8ebff7d7cc4c635af23b413e4d46a96c2707d0310a99f5a07e94\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/base-files/base-files_12.4+deb12u13_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.4+deb12u13\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"ca-certificates_20230311-p-deb12u1_s390x\",\n\t\t\t\"name\": \"ca-certificates\",\n\t\t\t\"sha256\": \"0d5f444f594e48c1e16a41d8fc628a09b24c658916a1274025c2330f2a802bed\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/c/ca-certificates/ca-certificates_20230311+deb12u1_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"20230311+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc6_2.36-9-p-deb12u13_s390x\",\n\t\t\t\"name\": \"libc6\",\n\t\t\t\"sha256\": \"a3445bb815ef415ca1c419b5c84dab873cac4d1210ace620b95600d8e0344137\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc6_2.36-9+deb12u13_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.36-9+deb12u13\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc-bin_2.36-9-p-deb12u13_s390x\",\n\t\t\t\"name\": \"libc-bin\",\n\t\t\t\"sha256\": \"6a459d71f550505335fcbb81a7f67866a3c3ffc08e77c1d82e4a39dbcb9090a3\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc-bin_2.36-9+deb12u13_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.36-9+deb12u13\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libssl3_3.0.18-1_deb12u2_s390x\",\n\t\t\t\"name\": \"libssl3\",\n\t\t\t\"sha256\": \"4880e9829cf618d54ed5c2662a6f9a0a3eaf021e2db4767e76eab5a95da6d023\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian-security/20260314T202839Z/pool/updates/main/o/openssl/libssl3_3.0.18-1~deb12u2_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.0.18-1~deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"netbase_6.4_s390x\",\n\t\t\t\"name\": \"netbase\",\n\t\t\t\"sha256\": \"29b23c48c0fe6f878e56c5ddc9f65d1c05d729360f3690a593a8c795031cd867\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/netbase/netbase_6.4_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"openssl_3.0.18-1_deb12u2_s390x\",\n\t\t\t\"name\": \"openssl\",\n\t\t\t\"sha256\": \"1f393115696962b061d47e82abcce6501d69e86a0e9cb81068b4a7454cd0f0ae\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian-security/20260314T202839Z/pool/updates/main/o/openssl/openssl_3.0.18-1~deb12u2_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.0.18-1~deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"tzdata_2025b-0-p-deb12u2_s390x\",\n\t\t\t\"name\": \"tzdata\",\n\t\t\t\"sha256\": \"719b61acbc9974a86b92c1d043b9f3b7883dbfe9f5824f9a43c575445fa55d2a\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/t/tzdata/tzdata_2025b-0+deb12u2_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2025b-0+deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"media-types_10.0.0_s390x\",\n\t\t\t\"name\": \"media-types\",\n\t\t\t\"sha256\": \"aaa46dcb3b39948ae2e0fdb72cfcb2f48c0b59f19785a3da8045c05eb19955dd\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/m/media-types/media-types_10.0.0_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"10.0.0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"gcc-12-base_12.2.0-14-p-deb12u1_s390x\",\n\t\t\t\"name\": \"gcc-12-base\",\n\t\t\t\"sha256\": \"95394971de33e2d3c04c8e77c5cab1ddcba3924692749513be19d8c65b4a3001\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/gcc-12-base_12.2.0-14+deb12u1_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgcc-s1_12.2.0-14-p-deb12u1_s390x\",\n\t\t\t\"name\": \"libgcc-s1\",\n\t\t\t\"sha256\": \"58f31fb42eecc42510d5b5022f03aa7e302350637a5643b1773361c0da97f905\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/libgcc-s1_12.2.0-14+deb12u1_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgomp1_12.2.0-14-p-deb12u1_s390x\",\n\t\t\t\"name\": \"libgomp1\",\n\t\t\t\"sha256\": \"57527a0d71f4ba47e384d69c3bb2d5647dcddc4b49cd098a2fd46d59492eaefc\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/libgomp1_12.2.0-14+deb12u1_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libstdc-p--p-6_12.2.0-14-p-deb12u1_s390x\",\n\t\t\t\"name\": \"libstdc++6\",\n\t\t\t\"sha256\": \"b0521cbe2cd1de442a468373bdfe323ed83e04aa729d5a3f554beefba4049e68\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/libstdc++6_12.2.0-14+deb12u1_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"base-files_12.4-p-deb12u13_ppc64el\",\n\t\t\t\"name\": \"base-files\",\n\t\t\t\"sha256\": \"ae229b34dd67ed8245554d40d7dc3579fe43da7ffb5a22b40c7d94cf7d2a0a8e\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/base-files/base-files_12.4+deb12u13_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.4+deb12u13\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"ca-certificates_20230311-p-deb12u1_ppc64el\",\n\t\t\t\"name\": \"ca-certificates\",\n\t\t\t\"sha256\": \"0d5f444f594e48c1e16a41d8fc628a09b24c658916a1274025c2330f2a802bed\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/c/ca-certificates/ca-certificates_20230311+deb12u1_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"20230311+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc6_2.36-9-p-deb12u13_ppc64el\",\n\t\t\t\"name\": \"libc6\",\n\t\t\t\"sha256\": \"17280b91201b45e75469dc3fb6a307de8d6551bee16bc6cb98335601a4dc5311\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc6_2.36-9+deb12u13_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.36-9+deb12u13\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc-bin_2.36-9-p-deb12u13_ppc64el\",\n\t\t\t\"name\": \"libc-bin\",\n\t\t\t\"sha256\": \"babb33ae6ad54d257cd8f999894dc9cf4a0a7f03654f5c860c1131eef1c6d9ba\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc-bin_2.36-9+deb12u13_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.36-9+deb12u13\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libssl3_3.0.18-1_deb12u2_ppc64el\",\n\t\t\t\"name\": \"libssl3\",\n\t\t\t\"sha256\": \"b5f48b447b296ed45f857a34fdc42f42134ad26ababbe6b5b0e7ed56c8bedc54\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian-security/20260314T202839Z/pool/updates/main/o/openssl/libssl3_3.0.18-1~deb12u2_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.0.18-1~deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"netbase_6.4_ppc64el\",\n\t\t\t\"name\": \"netbase\",\n\t\t\t\"sha256\": \"29b23c48c0fe6f878e56c5ddc9f65d1c05d729360f3690a593a8c795031cd867\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/netbase/netbase_6.4_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"openssl_3.0.18-1_deb12u2_ppc64el\",\n\t\t\t\"name\": \"openssl\",\n\t\t\t\"sha256\": \"269f301321dfd24a68a48c30d2e468176561681b0acdd50787e311b0232dd785\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian-security/20260314T202839Z/pool/updates/main/o/openssl/openssl_3.0.18-1~deb12u2_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.0.18-1~deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"tzdata_2025b-0-p-deb12u2_ppc64el\",\n\t\t\t\"name\": \"tzdata\",\n\t\t\t\"sha256\": \"719b61acbc9974a86b92c1d043b9f3b7883dbfe9f5824f9a43c575445fa55d2a\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/t/tzdata/tzdata_2025b-0+deb12u2_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2025b-0+deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"media-types_10.0.0_ppc64el\",\n\t\t\t\"name\": \"media-types\",\n\t\t\t\"sha256\": \"aaa46dcb3b39948ae2e0fdb72cfcb2f48c0b59f19785a3da8045c05eb19955dd\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/m/media-types/media-types_10.0.0_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"10.0.0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"gcc-12-base_12.2.0-14-p-deb12u1_ppc64el\",\n\t\t\t\"name\": \"gcc-12-base\",\n\t\t\t\"sha256\": \"2703f8a9087f18cc73b2d6c3c0adcd568e9302451335dad627392517019200b5\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/gcc-12-base_12.2.0-14+deb12u1_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgcc-s1_12.2.0-14-p-deb12u1_ppc64el\",\n\t\t\t\"name\": \"libgcc-s1\",\n\t\t\t\"sha256\": \"ced4a668899fc6b13e87b2ffa44b0e819797f9b36fcff5c1709094d653cd9b2f\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/libgcc-s1_12.2.0-14+deb12u1_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgomp1_12.2.0-14-p-deb12u1_ppc64el\",\n\t\t\t\"name\": \"libgomp1\",\n\t\t\t\"sha256\": \"e7ae3f0f0d26334fca637989ac691b7c91046c3a878b64227efd29ee00a369e4\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/libgomp1_12.2.0-14+deb12u1_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libstdc-p--p-6_12.2.0-14-p-deb12u1_ppc64el\",\n\t\t\t\"name\": \"libstdc++6\",\n\t\t\t\"sha256\": \"290e4a488a2911b230df0b03c19591a5663a7136f8cc5ceba946880ff7dbf047\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-12/libstdc++6_12.2.0-14+deb12u1_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"12.2.0-14+deb12u1\"\n\t\t}\n\t],\n\t\"version\": 1\n}"
  },
  {
    "path": "private/repos/deb/bookworm.yaml",
    "content": "# debian 12\nversion: 1\n\nsources:\n  - channel: bookworm main\n    url: https://snapshot.debian.org/archive/debian/20260314T202839Z\n  - channel: bookworm-updates main\n    url: https://snapshot.debian.org/archive/debian/20260314T202839Z\n  - channel: bookworm-security main\n    url: https://snapshot.debian.org/archive/debian-security/20260314T202839Z\n\narchs:\n  - amd64\n  - arm64\n  - armhf\n  - s390x\n  - ppc64el\n\npackages:\n  - base-files\n  - ca-certificates\n  - libc6\n  - libc-bin\n  - libssl3\n  - netbase\n  - openssl\n  - tzdata\n  - media-types\n  # c++\n  - gcc-12-base\n  - libgcc-s1\n  - libgomp1\n  - libstdc++6\n"
  },
  {
    "path": "private/repos/deb/bookworm_python.lock.json",
    "content": "{\n\t\"packages\": [\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libbz2-1.0_1.0.8-5-p-b1_amd64\",\n\t\t\t\"name\": \"libbz2-1.0\",\n\t\t\t\"sha256\": \"54149da3f44b22d523b26b692033b84503d822cc5122fed606ea69cc83ca5aeb\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-5+b1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.0.8-5+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libcom-err2_1.47.0-2-p-b2_amd64\",\n\t\t\t\"name\": \"libcom-err2\",\n\t\t\t\"sha256\": \"a2bac7015e78fbc0c504df3e441f3a22292f1d2d77f9ccda760057f3690e22f2\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/e/e2fsprogs/libcom-err2_1.47.0-2+b2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.47.0-2+b2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libcrypt1_1-4.4.33-2_amd64\",\n\t\t\t\"name\": \"libcrypt1\",\n\t\t\t\"sha256\": \"f5f60a5cdfd4e4eaa9438ade5078a57741a7a78d659fcb0c701204f523e8bd29\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libx/libxcrypt/libcrypt1_4.4.33-2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:4.4.33-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libdb5.3_5.3.28-p-dfsg2-1_amd64\",\n\t\t\t\"name\": \"libdb5.3\",\n\t\t\t\"sha256\": \"7dc5127b8dd0da80e992ba594954c005ae4359d839a24eb65d0d8129b5235c84\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg2-1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"5.3.28+dfsg2-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libexpat1_2.5.0-1-p-deb12u2_amd64\",\n\t\t\t\"name\": \"libexpat1\",\n\t\t\t\"sha256\": \"2255e62fc22a86d2c544b8a3f516da9aee19383ad5742722ab4ce7f66a30dbc8\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/e/expat/libexpat1_2.5.0-1+deb12u2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.5.0-1+deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libffi8_3.4.4-1_amd64\",\n\t\t\t\"name\": \"libffi8\",\n\t\t\t\"sha256\": \"6d9f6c25c30efccce6d4bceaa48ea86c329a3432abb360a141f76ac223a4c34a\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libf/libffi/libffi8_3.4.4-1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.4.4-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgssapi-krb5-2_1.20.1-2-p-deb12u4_amd64\",\n\t\t\t\"name\": \"libgssapi-krb5-2\",\n\t\t\t\"sha256\": \"ae20a9d90d0998ccb062a42739c8c5c725579e2d3f44fbd16b026e336b4543bb\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/krb5/libgssapi-krb5-2_1.20.1-2+deb12u4_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.20.1-2+deb12u4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libk5crypto3_1.20.1-2-p-deb12u4_amd64\",\n\t\t\t\"name\": \"libk5crypto3\",\n\t\t\t\"sha256\": \"b921355ee030582117aadd95a9f08de341867921a277803ae7e520be2ac9786d\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/krb5/libk5crypto3_1.20.1-2+deb12u4_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.20.1-2+deb12u4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libkeyutils1_1.6.3-2_amd64\",\n\t\t\t\"name\": \"libkeyutils1\",\n\t\t\t\"sha256\": \"cfac89e6a7a54ff3c6a4f843310e25efeddaa771baeae470bd98bd588c373563\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/keyutils/libkeyutils1_1.6.3-2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.6.3-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libkrb5-3_1.20.1-2-p-deb12u4_amd64\",\n\t\t\t\"name\": \"libkrb5-3\",\n\t\t\t\"sha256\": \"af14ab652a7e8579c67c846dd95b987a4332c05165c8eec9790028f5aea6c2b0\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/krb5/libkrb5-3_1.20.1-2+deb12u4_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.20.1-2+deb12u4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libkrb5support0_1.20.1-2-p-deb12u4_amd64\",\n\t\t\t\"name\": \"libkrb5support0\",\n\t\t\t\"sha256\": \"5e7fac690530a3e16c0a6707d8262d869c23248eac72daee3eb7c40982c3ddfe\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/krb5/libkrb5support0_1.20.1-2+deb12u4_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.20.1-2+deb12u4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"liblzma5_5.4.1-1_amd64\",\n\t\t\t\"name\": \"liblzma5\",\n\t\t\t\"sha256\": \"d321b9502b16aac534e1c691afbe3dc5e125e5091aa35bea026c59b25ebe82e7\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian-security/20260314T202839Z/pool/updates/main/x/xz-utils/liblzma5_5.4.1-1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"5.4.1-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libncursesw6_6.4-4_amd64\",\n\t\t\t\"name\": \"libncursesw6\",\n\t\t\t\"sha256\": \"98fa7a53dc565a38b65fb70422ad08001bf5361d8fbc74255280c329996a6bec\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/ncurses/libncursesw6_6.4-4_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.4-4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libnsl2_1.3.0-2_amd64\",\n\t\t\t\"name\": \"libnsl2\",\n\t\t\t\"sha256\": \"c0d83437fdb016cb289436f49f28a36be44b3e8f1f2498c7e3a095f709c0d6f8\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.3.0-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libpython3.11-minimal_3.11.2-6-p-deb12u6_amd64\",\n\t\t\t\"name\": \"libpython3.11-minimal\",\n\t\t\t\"sha256\": \"b21639516f96bde030d9548220952ad17ed5dd602b6339ce183658c5aa4c1fb4\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/python3.11/libpython3.11-minimal_3.11.2-6+deb12u6_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.11.2-6+deb12u6\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libpython3.11-stdlib_3.11.2-6-p-deb12u6_amd64\",\n\t\t\t\"name\": \"libpython3.11-stdlib\",\n\t\t\t\"sha256\": \"409f354d3d5d5b605a5d2d359936e6c2262b6c8f2bb120ec530bc69cb318fac4\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/python3.11/libpython3.11-stdlib_3.11.2-6+deb12u6_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.11.2-6+deb12u6\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libreadline8_8.2-1.3_amd64\",\n\t\t\t\"name\": \"libreadline8\",\n\t\t\t\"sha256\": \"e02ebbd3701cf468dbf98d6d917fbe0325e881f07fe8b316150c8d2a64486e66\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/r/readline/libreadline8_8.2-1.3_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"8.2-1.3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libsqlite3-0_3.40.1-2-p-deb12u2_amd64\",\n\t\t\t\"name\": \"libsqlite3-0\",\n\t\t\t\"sha256\": \"a8d78b40e9b4e422224aeebfe0e4dfc243f6acf3532490b0c05480d4283d41e2\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/s/sqlite3/libsqlite3-0_3.40.1-2+deb12u2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.40.1-2+deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libtinfo6_6.4-4_amd64\",\n\t\t\t\"name\": \"libtinfo6\",\n\t\t\t\"sha256\": \"072d908f38f51090ca28ca5afa3b46b2957dc61fe35094c0b851426859a49a51\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/ncurses/libtinfo6_6.4-4_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.4-4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libtirpc3_1.3.3-p-ds-1_amd64\",\n\t\t\t\"name\": \"libtirpc3\",\n\t\t\t\"sha256\": \"2a46d5a5e9486da11ffeff5740931740d6deae4f92cd6098df060dc5dff1e1c7\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libt/libtirpc/libtirpc3_1.3.3+ds-1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.3.3+ds-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libuuid1_2.38.1-5-p-deb12u3_amd64\",\n\t\t\t\"name\": \"libuuid1\",\n\t\t\t\"sha256\": \"5fff398321da62d28a842bcbabd193d72ae21724962c029dc32b1dc6b2deaeaf\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/u/util-linux/libuuid1_2.38.1-5+deb12u3_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.38.1-5+deb12u3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"python3-distutils_3.11.2-3_amd64\",\n\t\t\t\"name\": \"python3-distutils\",\n\t\t\t\"sha256\": \"a620b555f301860a08e30534c7e6f7d79818e5e1977bfec39a612e7003074318\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/python3-stdlib-extensions/python3-distutils_3.11.2-3_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.11.2-3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"python3.11-minimal_3.11.2-6-p-deb12u6_amd64\",\n\t\t\t\"name\": \"python3.11-minimal\",\n\t\t\t\"sha256\": \"4742c49d9bc418eac8c60216af4b9280440f86d5ecf0816931fcc6774a6d90d4\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/python3.11/python3.11-minimal_3.11.2-6+deb12u6_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.11.2-6+deb12u6\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"zlib1g_1-1.2.13.dfsg-1_amd64\",\n\t\t\t\"name\": \"zlib1g\",\n\t\t\t\"sha256\": \"d7dd1d1411fedf27f5e27650a6eff20ef294077b568f4c8c5e51466dc7c08ce4\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/z/zlib/zlib1g_1.2.13.dfsg-1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:1.2.13.dfsg-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libbz2-1.0_1.0.8-5-p-b1_arm64\",\n\t\t\t\"name\": \"libbz2-1.0\",\n\t\t\t\"sha256\": \"d3a96ece03326498b39ff093a76800dfcbcb1d4049d6ae6e9f6fa1aa7a590ad6\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-5+b1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.0.8-5+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libcom-err2_1.47.0-2-p-b2_arm64\",\n\t\t\t\"name\": \"libcom-err2\",\n\t\t\t\"sha256\": \"36c15f933a965b50f4c9558d792d9556934c84e532703935d8ae7e69dd3fa863\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/e/e2fsprogs/libcom-err2_1.47.0-2+b2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.47.0-2+b2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libcrypt1_1-4.4.33-2_arm64\",\n\t\t\t\"name\": \"libcrypt1\",\n\t\t\t\"sha256\": \"eea0ad76ea5eb507127fea0c291622ea4ecdbb71c4b9a8ed9c76ae33fc1a0127\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libx/libxcrypt/libcrypt1_4.4.33-2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:4.4.33-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libdb5.3_5.3.28-p-dfsg2-1_arm64\",\n\t\t\t\"name\": \"libdb5.3\",\n\t\t\t\"sha256\": \"344367608d622298a3d916f4cee3dc3173286f3b21f8f497ab21e7178ba930f9\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg2-1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"5.3.28+dfsg2-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libexpat1_2.5.0-1-p-deb12u2_arm64\",\n\t\t\t\"name\": \"libexpat1\",\n\t\t\t\"sha256\": \"8dc1976735acf825e3a922d82f171e20feec7394da2b8c616091983e38706275\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/e/expat/libexpat1_2.5.0-1+deb12u2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.5.0-1+deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libffi8_3.4.4-1_arm64\",\n\t\t\t\"name\": \"libffi8\",\n\t\t\t\"sha256\": \"80b5c36177dc0e29d531c7eddbed3cc7355cb490e49f8cfa5959572d161f27b3\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libf/libffi/libffi8_3.4.4-1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.4.4-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgssapi-krb5-2_1.20.1-2-p-deb12u4_arm64\",\n\t\t\t\"name\": \"libgssapi-krb5-2\",\n\t\t\t\"sha256\": \"5dd7242e08da4b8e190b8c4bbad2a0f7b26d718bf98c332233362aface6fd44d\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/krb5/libgssapi-krb5-2_1.20.1-2+deb12u4_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.20.1-2+deb12u4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libk5crypto3_1.20.1-2-p-deb12u4_arm64\",\n\t\t\t\"name\": \"libk5crypto3\",\n\t\t\t\"sha256\": \"e72fc6077826bcc070e56c11491f6032010269f1af0135ccb918bf90471add6b\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/krb5/libk5crypto3_1.20.1-2+deb12u4_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.20.1-2+deb12u4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libkeyutils1_1.6.3-2_arm64\",\n\t\t\t\"name\": \"libkeyutils1\",\n\t\t\t\"sha256\": \"aac46cb6faec4e737502b3c2290b7b02f8ba04e8accd5af7fd07934df0c867b1\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/keyutils/libkeyutils1_1.6.3-2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.6.3-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libkrb5-3_1.20.1-2-p-deb12u4_arm64\",\n\t\t\t\"name\": \"libkrb5-3\",\n\t\t\t\"sha256\": \"70599ea93ff9dacf0621f776faa4ae142b6cc0420f50dad7cf6bd2c1bcdad71b\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/krb5/libkrb5-3_1.20.1-2+deb12u4_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.20.1-2+deb12u4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libkrb5support0_1.20.1-2-p-deb12u4_arm64\",\n\t\t\t\"name\": \"libkrb5support0\",\n\t\t\t\"sha256\": \"e201269c7fa36cc22a4edb680bc093a155a32fbef23ef2d65fef20907cee4ff7\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/krb5/libkrb5support0_1.20.1-2+deb12u4_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.20.1-2+deb12u4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"liblzma5_5.4.1-1_arm64\",\n\t\t\t\"name\": \"liblzma5\",\n\t\t\t\"sha256\": \"3d9b12d3f93d08205335624c2238518911f7b1ce3355c630b433561b3ca25cd4\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian-security/20260314T202839Z/pool/updates/main/x/xz-utils/liblzma5_5.4.1-1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"5.4.1-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libncursesw6_6.4-4_arm64\",\n\t\t\t\"name\": \"libncursesw6\",\n\t\t\t\"sha256\": \"cf32cb6751718872c6def448b82211eec494f688e2f1a3e6c71bfdaf6b0722c5\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/ncurses/libncursesw6_6.4-4_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.4-4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libnsl2_1.3.0-2_arm64\",\n\t\t\t\"name\": \"libnsl2\",\n\t\t\t\"sha256\": \"8f9ba58b219779b43c4ccc78c79b0a23f721fc96323c202abb31e02f942104b3\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.3.0-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libpython3.11-minimal_3.11.2-6-p-deb12u6_arm64\",\n\t\t\t\"name\": \"libpython3.11-minimal\",\n\t\t\t\"sha256\": \"c75c613fd294230221b05c4a65daecb9ccdb4da0076682b6a1ce67bdee9ad0fd\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/python3.11/libpython3.11-minimal_3.11.2-6+deb12u6_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.11.2-6+deb12u6\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libpython3.11-stdlib_3.11.2-6-p-deb12u6_arm64\",\n\t\t\t\"name\": \"libpython3.11-stdlib\",\n\t\t\t\"sha256\": \"d9043f4957804cd4c7bc0af4784c80c4a5d08002a0e9b67407da20b3b47e3676\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/python3.11/libpython3.11-stdlib_3.11.2-6+deb12u6_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.11.2-6+deb12u6\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libreadline8_8.2-1.3_arm64\",\n\t\t\t\"name\": \"libreadline8\",\n\t\t\t\"sha256\": \"f3b162b7c1e05430607e792ebdbfc417cbd1f1d32cf83664133ae63d811a72d2\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/r/readline/libreadline8_8.2-1.3_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"8.2-1.3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libsqlite3-0_3.40.1-2-p-deb12u2_arm64\",\n\t\t\t\"name\": \"libsqlite3-0\",\n\t\t\t\"sha256\": \"a690f7f2aa6435bd1fd7cbbd2216acb9acbb8c48c9721f2c195766375439eb13\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/s/sqlite3/libsqlite3-0_3.40.1-2+deb12u2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.40.1-2+deb12u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libtinfo6_6.4-4_arm64\",\n\t\t\t\"name\": \"libtinfo6\",\n\t\t\t\"sha256\": \"baef0f6776f84c7eed4f1146d6e5774689567dad43216894d41da02e6608e4b3\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/ncurses/libtinfo6_6.4-4_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.4-4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libtirpc3_1.3.3-p-ds-1_arm64\",\n\t\t\t\"name\": \"libtirpc3\",\n\t\t\t\"sha256\": \"deaf9ea54f74cab6690b4bc0b427f05cbe62cc073580d84f5f18a8d9e2ece401\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libt/libtirpc/libtirpc3_1.3.3+ds-1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.3.3+ds-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libuuid1_2.38.1-5-p-deb12u3_arm64\",\n\t\t\t\"name\": \"libuuid1\",\n\t\t\t\"sha256\": \"3b2d19df0f3190108cf54228c4cfc822226c06d8f3615a5ab16a7dffb1f58aed\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/u/util-linux/libuuid1_2.38.1-5+deb12u3_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.38.1-5+deb12u3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"python3-distutils_3.11.2-3_arm64\",\n\t\t\t\"name\": \"python3-distutils\",\n\t\t\t\"sha256\": \"a620b555f301860a08e30534c7e6f7d79818e5e1977bfec39a612e7003074318\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/python3-stdlib-extensions/python3-distutils_3.11.2-3_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.11.2-3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"python3.11-minimal_3.11.2-6-p-deb12u6_arm64\",\n\t\t\t\"name\": \"python3.11-minimal\",\n\t\t\t\"sha256\": \"44196e58ef8c3ccae9d9f03055273d8cc647d27f93548ea76a1f96b0e531b8a1\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/python3.11/python3.11-minimal_3.11.2-6+deb12u6_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.11.2-6+deb12u6\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"zlib1g_1-1.2.13.dfsg-1_arm64\",\n\t\t\t\"name\": \"zlib1g\",\n\t\t\t\"sha256\": \"52b8b8a145bbe1956bba82034f77022cbef0c3d0885c9e32d9817a7932fe1913\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/z/zlib/zlib1g_1.2.13.dfsg-1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:1.2.13.dfsg-1\"\n\t\t}\n\t],\n\t\"version\": 1\n}"
  },
  {
    "path": "private/repos/deb/bookworm_python.yaml",
    "content": "# debian 12, limited architectures, python only\nversion: 1\n\nsources:\n  - channel: bookworm main\n    url: https://snapshot.debian.org/archive/debian/20260314T202839Z\n  - channel: bookworm-updates main\n    url: https://snapshot.debian.org/archive/debian/20260314T202839Z\n  - channel: bookworm-security main\n    url: https://snapshot.debian.org/archive/debian-security/20260314T202839Z\n\narchs:\n  - amd64\n  - arm64\n\npackages:\n  - libbz2-1.0\n  - libcom-err2\n  - libcrypt1 # TODO: glibc library for -lcrypt; maybe should be in cc?\n  - libdb5.3\n  - libexpat1\n  - libffi8\n  - libgssapi-krb5-2\n  - libk5crypto3\n  - libkeyutils1\n  - libkrb5-3\n  - libkrb5support0\n  - liblzma5\n  - libncursesw6\n  - libnsl2\n  - libpython3.11-minimal\n  - libpython3.11-stdlib\n  - libreadline8\n  - libsqlite3-0\n  - libtinfo6\n  - libtirpc3\n  - libuuid1\n  - python3-distutils\n  - python3.11-minimal\n  - zlib1g\n"
  },
  {
    "path": "private/repos/deb/deb.MODULE.bazel",
    "content": "\"debian dependencies\"\n\nREPOS = [\n    \"trixie\",\n    \"trixie_java\",\n    \"trixie_adoptium\",\n    \"trixie_python\",\n    \"bookworm\",\n    \"bookworm_python\",\n]\n\napt = use_extension(\"@rules_distroless//apt:extensions.bzl\", \"apt\")\n\n[\n    apt.install(\n        name = repo,\n        lock = \"//private/repos/deb:{}.lock.json\".format(repo),\n        manifest = \"//private/repos/deb:{}.yaml\".format(repo),\n        ## merged usr fs is only enabled on debian13+, remove this line once we remove debian12 builds\n        mergedusr = repo.startswith(\"trixie\"),\n        package_template = \"//private/repos/deb:package.BUILD.tmpl\",\n        resolve_transitive = False,\n    )\n    for repo in REPOS\n]\n\nuse_repo(apt, \"bookworm\", \"bookworm_python\", \"trixie\", \"trixie_adoptium\", \"trixie_java\", \"trixie_python\")\n\n### VERSIONS HUB REPO ###\nversion = use_extension(\"//private/extensions:version.bzl\", \"version\")\n\n[\n    version.from_lock(\n        lock = \"//private/repos/deb:{}.lock.json\".format(repo),\n        repo_name = repo,\n    )\n    for repo in REPOS\n]\n\nuse_repo(version, \"versions\")\n"
  },
  {
    "path": "private/repos/deb/package.BUILD.tmpl",
    "content": "\"\"\"Generated by distroless. DO NOT EDIT!\"\"\"\n\nload(\"@@//private/pkg:debian_spdx.bzl\", \"debian_spdx\")\nload(\"@@//private/util:merge_providers.bzl\", \"merge_providers\")\nload(\"@@rules_distroless~//apt:defs.bzl\", \"dpkg_statusd\")\nload(\"@@//private/util:tar.bzl\", \"tar\")\n\nalias(\n    name = \"control\",\n    actual = \"@{repo_name}//:control\",\n    visibility = [\"//visibility:public\"]\n)\nalias(\n    name = \"data\",\n    actual = \"@{repo_name}//:data\",\n    visibility = [\"//visibility:public\"]\n)\n\ndpkg_statusd(\n    name = \"statusd\",\n    control = \":control\",\n    package_name = \"{name}\"\n)\n\ntar(\n    name = \"data_statusd\",\n    extension = \"tar.gz\",\n    package_dir = \"./\",\n    deps = [\n        \":data\",\n        \":statusd\"\n    ]\n)\n\ndebian_spdx(\n    name = \"spdx\",\n    control = \":control\",\n    data = \":data\",\n    package_name = \"{name}\",\n    spdx_id = \"{repo_name}\",\n    sha256 = \"{sha256}\",\n    urls = {urls}\n)\n\nmerge_providers(\n    name = \"{target_name}\",\n    srcs = [\":data_statusd\", \":spdx\"],\n    visibility = [\"//visibility:public\"],\n)"
  },
  {
    "path": "private/repos/deb/trixie.lock.json",
    "content": "{\n\t\"packages\": [\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"base-files_13.8-p-deb13u4_amd64\",\n\t\t\t\"name\": \"base-files\",\n\t\t\t\"sha256\": \"819e70a077c6b94d72c1385cc18a512446ded629499f7bb7d84d727977b67ad4\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/base-files/base-files_13.8+deb13u4_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"13.8+deb13u4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"ca-certificates_20250419_amd64\",\n\t\t\t\"name\": \"ca-certificates\",\n\t\t\t\"sha256\": \"ef590f89563aa4b46c8260d49d1cea0fc1b181d19e8df3782694706adf05c184\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/c/ca-certificates/ca-certificates_20250419_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"20250419\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc6_2.41-12-p-deb13u2_amd64\",\n\t\t\t\"name\": \"libc6\",\n\t\t\t\"sha256\": \"8f9ddeb958cec3a05c4c303d4c85fddf30cb994747b16b1eb715ac49049f6d4a\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc6_2.41-12+deb13u2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-12+deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc-bin_2.41-12-p-deb13u2_amd64\",\n\t\t\t\"name\": \"libc-bin\",\n\t\t\t\"sha256\": \"e30df1bcd947889cd96b5a094e0bf6be6acb4d6d7d2b6def0507f36b432916be\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc-bin_2.41-12+deb13u2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-12+deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libssl3t64_3.5.5-1_deb13u1_amd64\",\n\t\t\t\"name\": \"libssl3t64\",\n\t\t\t\"sha256\": \"9a5d0bc0c5fcdd11e8d70bf01ab444a10aebae7d90ea6e25f93ddc797b134dbc\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/o/openssl/libssl3t64_3.5.5-1~deb13u1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.5.5-1~deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"netbase_6.5_amd64\",\n\t\t\t\"name\": \"netbase\",\n\t\t\t\"sha256\": \"76bafa92947ebd37b0a6f9ec6570412041f56edebc1c66d323731216d318471e\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/netbase/netbase_6.5_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"openssl_3.5.5-1_deb13u1_amd64\",\n\t\t\t\"name\": \"openssl\",\n\t\t\t\"sha256\": \"233d6d1f6ff00509cba554365e7cfb3be36db1dea57291eeb248f2c04d62719d\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/o/openssl/openssl_3.5.5-1~deb13u1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.5.5-1~deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"tzdata_2026a-0-p-deb13u1_amd64\",\n\t\t\t\"name\": \"tzdata\",\n\t\t\t\"sha256\": \"9fb91a8d4f4f852918d14b1379f788c1c4971cf640c4bda7f568e7601620a874\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/t/tzdata/tzdata_2026a-0+deb13u1_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2026a-0+deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"tzdata-legacy_2026a-0-p-deb13u1_amd64\",\n\t\t\t\"name\": \"tzdata-legacy\",\n\t\t\t\"sha256\": \"f402289df6fd7f698e0f073da0e260e3365be368243a66bf2a2b940f37554b1c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/t/tzdata/tzdata-legacy_2026a-0+deb13u1_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2026a-0+deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"media-types_13.0.0_amd64\",\n\t\t\t\"name\": \"media-types\",\n\t\t\t\"sha256\": \"0788e4b0b72db1bcf74a19cb24c3511e7770ad0b341f0f30e361701c3072f53e\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/m/media-types/media-types_13.0.0_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"13.0.0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"zlib1g_1-1.3.dfsg-p-really1.3.1-1-p-b1_amd64\",\n\t\t\t\"name\": \"zlib1g\",\n\t\t\t\"sha256\": \"015be740d6236ad114582dea500c1d907f29e16d6db00566ca32fb68d71ac90d\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/z/zlib/zlib1g_1.3.dfsg+really1.3.1-1+b1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:1.3.dfsg+really1.3.1-1+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libzstd1_1.5.7-p-dfsg-1_amd64\",\n\t\t\t\"name\": \"libzstd1\",\n\t\t\t\"sha256\": \"2f6a2aeacfc925eba8b00ac9139bc4bfccf8cacb09eb93de067074b26948eef9\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libz/libzstd/libzstd1_1.5.7+dfsg-1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.5.7+dfsg-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"gcc-14-base_14.2.0-19_amd64\",\n\t\t\t\"name\": \"gcc-14-base\",\n\t\t\t\"sha256\": \"5b6825de4263824b78c4c51f6476414f3b4e89c2ab63e81dc8b9b5501e867cf6\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/gcc-14-base_14.2.0-19_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgcc-s1_14.2.0-19_amd64\",\n\t\t\t\"name\": \"libgcc-s1\",\n\t\t\t\"sha256\": \"3c71917b490d1a17aed43196a2787a256ecf060526cdb20216a74bedc061b150\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libgcc-s1_14.2.0-19_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgomp1_14.2.0-19_amd64\",\n\t\t\t\"name\": \"libgomp1\",\n\t\t\t\"sha256\": \"72b7a1a33c48f3195efeb044111b34ae684b1e640bb6495c832443b798601cd5\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libgomp1_14.2.0-19_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libstdc-p--p-6_14.2.0-19_amd64\",\n\t\t\t\"name\": \"libstdc++6\",\n\t\t\t\"sha256\": \"ab1fa05837aa7a92aae748fd07a18a35f7d18bb4a71c4724fe2bbf0e32089de0\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libstdc++6_14.2.0-19_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"base-files_13.8-p-deb13u4_arm64\",\n\t\t\t\"name\": \"base-files\",\n\t\t\t\"sha256\": \"d4493ac8b04311c4e393ccf87b8413155912aabe551f67877f9487c1f16cee69\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/base-files/base-files_13.8+deb13u4_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"13.8+deb13u4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"ca-certificates_20250419_arm64\",\n\t\t\t\"name\": \"ca-certificates\",\n\t\t\t\"sha256\": \"ef590f89563aa4b46c8260d49d1cea0fc1b181d19e8df3782694706adf05c184\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/c/ca-certificates/ca-certificates_20250419_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"20250419\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc6_2.41-12-p-deb13u2_arm64\",\n\t\t\t\"name\": \"libc6\",\n\t\t\t\"sha256\": \"f4679f22ee71be9f79bb36c62bb0b6fed97c19f245d2afaf8a9c1d000a1d312a\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc6_2.41-12+deb13u2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-12+deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc-bin_2.41-12-p-deb13u2_arm64\",\n\t\t\t\"name\": \"libc-bin\",\n\t\t\t\"sha256\": \"c533ba20b97e8cec1ad816936043e7c2cfa24e724e13e99eaa66cad74fbff0c8\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc-bin_2.41-12+deb13u2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-12+deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libssl3t64_3.5.5-1_deb13u1_arm64\",\n\t\t\t\"name\": \"libssl3t64\",\n\t\t\t\"sha256\": \"7273dabe9471b474bcbceffd1caf7207e37fa7d7e4974cfb033c1ea2f6f3ef51\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/o/openssl/libssl3t64_3.5.5-1~deb13u1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.5.5-1~deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"netbase_6.5_arm64\",\n\t\t\t\"name\": \"netbase\",\n\t\t\t\"sha256\": \"76bafa92947ebd37b0a6f9ec6570412041f56edebc1c66d323731216d318471e\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/netbase/netbase_6.5_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"openssl_3.5.5-1_deb13u1_arm64\",\n\t\t\t\"name\": \"openssl\",\n\t\t\t\"sha256\": \"92dfcdc213cd7a5e6aa34a1ac9660a59e56838d12876f4b34599f8fea39cb432\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/o/openssl/openssl_3.5.5-1~deb13u1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.5.5-1~deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"tzdata_2026a-0-p-deb13u1_arm64\",\n\t\t\t\"name\": \"tzdata\",\n\t\t\t\"sha256\": \"9fb91a8d4f4f852918d14b1379f788c1c4971cf640c4bda7f568e7601620a874\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/t/tzdata/tzdata_2026a-0+deb13u1_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2026a-0+deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"tzdata-legacy_2026a-0-p-deb13u1_arm64\",\n\t\t\t\"name\": \"tzdata-legacy\",\n\t\t\t\"sha256\": \"f402289df6fd7f698e0f073da0e260e3365be368243a66bf2a2b940f37554b1c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/t/tzdata/tzdata-legacy_2026a-0+deb13u1_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2026a-0+deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"media-types_13.0.0_arm64\",\n\t\t\t\"name\": \"media-types\",\n\t\t\t\"sha256\": \"0788e4b0b72db1bcf74a19cb24c3511e7770ad0b341f0f30e361701c3072f53e\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/m/media-types/media-types_13.0.0_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"13.0.0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"zlib1g_1-1.3.dfsg-p-really1.3.1-1-p-b1_arm64\",\n\t\t\t\"name\": \"zlib1g\",\n\t\t\t\"sha256\": \"209aa5cf671e97b9eb0410844fa6df4cae2e75b0c72e7802ab6c8ece13e6ddef\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/z/zlib/zlib1g_1.3.dfsg+really1.3.1-1+b1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:1.3.dfsg+really1.3.1-1+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libzstd1_1.5.7-p-dfsg-1_arm64\",\n\t\t\t\"name\": \"libzstd1\",\n\t\t\t\"sha256\": \"924540bd59fdbfa77a0604360efdaca54411a43daf11c7e002a3c64791b67448\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libz/libzstd/libzstd1_1.5.7+dfsg-1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.5.7+dfsg-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"gcc-14-base_14.2.0-19_arm64\",\n\t\t\t\"name\": \"gcc-14-base\",\n\t\t\t\"sha256\": \"34ee90679b018c0e64234747a4c4c0ae6b7f63541115037465a8627c2dfbc594\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/gcc-14-base_14.2.0-19_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgcc-s1_14.2.0-19_arm64\",\n\t\t\t\"name\": \"libgcc-s1\",\n\t\t\t\"sha256\": \"1108bc87879833d6d9a145f22a4a15cddb34e065b4b5f4b97bee586adbac2851\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libgcc-s1_14.2.0-19_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgomp1_14.2.0-19_arm64\",\n\t\t\t\"name\": \"libgomp1\",\n\t\t\t\"sha256\": \"43e84cb7971d8a4d8870cab6204e998ea4f23ee1339bb0ff556dd881bac82d25\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libgomp1_14.2.0-19_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libstdc-p--p-6_14.2.0-19_arm64\",\n\t\t\t\"name\": \"libstdc++6\",\n\t\t\t\"sha256\": \"6669b0c52a2e7c6af9adfdabce3ff6e286065cdfbc7b85280862b5f799daebee\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libstdc++6_14.2.0-19_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"base-files_13.8-p-deb13u4_armhf\",\n\t\t\t\"name\": \"base-files\",\n\t\t\t\"sha256\": \"c18f87e0b0bfc9832c805adffb9dfc1f2642ead53e447b105098334241d3b40f\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/base-files/base-files_13.8+deb13u4_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"13.8+deb13u4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"ca-certificates_20250419_armhf\",\n\t\t\t\"name\": \"ca-certificates\",\n\t\t\t\"sha256\": \"ef590f89563aa4b46c8260d49d1cea0fc1b181d19e8df3782694706adf05c184\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/c/ca-certificates/ca-certificates_20250419_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"20250419\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc6_2.41-12-p-deb13u2_armhf\",\n\t\t\t\"name\": \"libc6\",\n\t\t\t\"sha256\": \"5111f0399bdcd0e7cc517cf5d0a7796649c364c11f1e2cd52cce89fe30d230f8\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc6_2.41-12+deb13u2_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-12+deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc-bin_2.41-12-p-deb13u2_armhf\",\n\t\t\t\"name\": \"libc-bin\",\n\t\t\t\"sha256\": \"81e7d78ef525e9bf4052e720adb85682827c37e23bfaa3083b898953211bceb0\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc-bin_2.41-12+deb13u2_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-12+deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libssl3t64_3.5.5-1_deb13u1_armhf\",\n\t\t\t\"name\": \"libssl3t64\",\n\t\t\t\"sha256\": \"6a46fcc84c641c72df3fd1fe2a1e919aed9ca05176c4b444963b8cdf38e8bf78\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/o/openssl/libssl3t64_3.5.5-1~deb13u1_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.5.5-1~deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"netbase_6.5_armhf\",\n\t\t\t\"name\": \"netbase\",\n\t\t\t\"sha256\": \"76bafa92947ebd37b0a6f9ec6570412041f56edebc1c66d323731216d318471e\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/netbase/netbase_6.5_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"openssl_3.5.5-1_deb13u1_armhf\",\n\t\t\t\"name\": \"openssl\",\n\t\t\t\"sha256\": \"79fc2bdd6a2dd5682110a4e6d6d6349e16e3d691831ec0cb299699b0821ea157\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/o/openssl/openssl_3.5.5-1~deb13u1_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.5.5-1~deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"tzdata_2026a-0-p-deb13u1_armhf\",\n\t\t\t\"name\": \"tzdata\",\n\t\t\t\"sha256\": \"9fb91a8d4f4f852918d14b1379f788c1c4971cf640c4bda7f568e7601620a874\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/t/tzdata/tzdata_2026a-0+deb13u1_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2026a-0+deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"tzdata-legacy_2026a-0-p-deb13u1_armhf\",\n\t\t\t\"name\": \"tzdata-legacy\",\n\t\t\t\"sha256\": \"f402289df6fd7f698e0f073da0e260e3365be368243a66bf2a2b940f37554b1c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/t/tzdata/tzdata-legacy_2026a-0+deb13u1_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2026a-0+deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"media-types_13.0.0_armhf\",\n\t\t\t\"name\": \"media-types\",\n\t\t\t\"sha256\": \"0788e4b0b72db1bcf74a19cb24c3511e7770ad0b341f0f30e361701c3072f53e\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/m/media-types/media-types_13.0.0_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"13.0.0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"zlib1g_1-1.3.dfsg-p-really1.3.1-1-p-b1_armhf\",\n\t\t\t\"name\": \"zlib1g\",\n\t\t\t\"sha256\": \"81c55a59e1570477ecef6a449bf6dce44dad67ba4ce9e04760451d4cfe200534\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/z/zlib/zlib1g_1.3.dfsg+really1.3.1-1+b1_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:1.3.dfsg+really1.3.1-1+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libzstd1_1.5.7-p-dfsg-1_armhf\",\n\t\t\t\"name\": \"libzstd1\",\n\t\t\t\"sha256\": \"da5238dd84fc51f782f39d435821bff556409b3dbc82d232e4e81f427fb1ca65\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libz/libzstd/libzstd1_1.5.7+dfsg-1_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.5.7+dfsg-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"gcc-14-base_14.2.0-19_armhf\",\n\t\t\t\"name\": \"gcc-14-base\",\n\t\t\t\"sha256\": \"0f702fdd5e5471efda9fece892e09ce73e3447968083e1f8c341f8b66b1fb340\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/gcc-14-base_14.2.0-19_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgcc-s1_14.2.0-19_armhf\",\n\t\t\t\"name\": \"libgcc-s1\",\n\t\t\t\"sha256\": \"25910c3a0bce3985e388de445244578b7922dc670c9bba1c8673779b89447873\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libgcc-s1_14.2.0-19_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgomp1_14.2.0-19_armhf\",\n\t\t\t\"name\": \"libgomp1\",\n\t\t\t\"sha256\": \"00e56cbc41157ce7139b758b422133ab2a75bdfc71ee5c8c2ab8dbdc98cb2dbf\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libgomp1_14.2.0-19_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"armhf\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libstdc-p--p-6_14.2.0-19_armhf\",\n\t\t\t\"name\": \"libstdc++6\",\n\t\t\t\"sha256\": \"9c82eecc30961a3da3e062c0dba8ce076736059f4b8e7794c803985e75aea48b\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libstdc++6_14.2.0-19_armhf.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"base-files_13.8-p-deb13u4_s390x\",\n\t\t\t\"name\": \"base-files\",\n\t\t\t\"sha256\": \"1d8657244ce4944696cfc7b9cbb3464133dc913ef20abea8e481afc906b24b2c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/base-files/base-files_13.8+deb13u4_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"13.8+deb13u4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"ca-certificates_20250419_s390x\",\n\t\t\t\"name\": \"ca-certificates\",\n\t\t\t\"sha256\": \"ef590f89563aa4b46c8260d49d1cea0fc1b181d19e8df3782694706adf05c184\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/c/ca-certificates/ca-certificates_20250419_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"20250419\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc6_2.41-12-p-deb13u2_s390x\",\n\t\t\t\"name\": \"libc6\",\n\t\t\t\"sha256\": \"d896feb7b84aae53707ad7d2f842232a9ed1df4f29cecf2ec3a761fda91ea43b\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc6_2.41-12+deb13u2_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-12+deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc-bin_2.41-12-p-deb13u2_s390x\",\n\t\t\t\"name\": \"libc-bin\",\n\t\t\t\"sha256\": \"dd6b635d449b0f9238028ea8ce17b2a2e2f71f915444e8c4fbb8ad9386d37fcd\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc-bin_2.41-12+deb13u2_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-12+deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libssl3t64_3.5.5-1_deb13u1_s390x\",\n\t\t\t\"name\": \"libssl3t64\",\n\t\t\t\"sha256\": \"3aec6fa7c116f3f59f65816c3244194cfa1b4bc6bb9fd1b1a8d0c7b5ea9a1c83\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/o/openssl/libssl3t64_3.5.5-1~deb13u1_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.5.5-1~deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"netbase_6.5_s390x\",\n\t\t\t\"name\": \"netbase\",\n\t\t\t\"sha256\": \"76bafa92947ebd37b0a6f9ec6570412041f56edebc1c66d323731216d318471e\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/netbase/netbase_6.5_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"openssl_3.5.5-1_deb13u1_s390x\",\n\t\t\t\"name\": \"openssl\",\n\t\t\t\"sha256\": \"8eda97cd22dc15e525e6fea05fc49433ece3298d2183302a74ee7bffebbe3274\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/o/openssl/openssl_3.5.5-1~deb13u1_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.5.5-1~deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"tzdata_2026a-0-p-deb13u1_s390x\",\n\t\t\t\"name\": \"tzdata\",\n\t\t\t\"sha256\": \"9fb91a8d4f4f852918d14b1379f788c1c4971cf640c4bda7f568e7601620a874\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/t/tzdata/tzdata_2026a-0+deb13u1_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2026a-0+deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"tzdata-legacy_2026a-0-p-deb13u1_s390x\",\n\t\t\t\"name\": \"tzdata-legacy\",\n\t\t\t\"sha256\": \"f402289df6fd7f698e0f073da0e260e3365be368243a66bf2a2b940f37554b1c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/t/tzdata/tzdata-legacy_2026a-0+deb13u1_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2026a-0+deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"media-types_13.0.0_s390x\",\n\t\t\t\"name\": \"media-types\",\n\t\t\t\"sha256\": \"0788e4b0b72db1bcf74a19cb24c3511e7770ad0b341f0f30e361701c3072f53e\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/m/media-types/media-types_13.0.0_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"13.0.0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"zlib1g_1-1.3.dfsg-p-really1.3.1-1-p-b1_s390x\",\n\t\t\t\"name\": \"zlib1g\",\n\t\t\t\"sha256\": \"e38a94c60e944dfcf1937a12b02785afbbb2bedf356da18984c4dac0acc47ed9\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/z/zlib/zlib1g_1.3.dfsg+really1.3.1-1+b1_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:1.3.dfsg+really1.3.1-1+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libzstd1_1.5.7-p-dfsg-1_s390x\",\n\t\t\t\"name\": \"libzstd1\",\n\t\t\t\"sha256\": \"ed6bd13718360720b0a03d62e2440bd926b1db3b7443f46314fe3deb7e69989e\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libz/libzstd/libzstd1_1.5.7+dfsg-1_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.5.7+dfsg-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"gcc-14-base_14.2.0-19_s390x\",\n\t\t\t\"name\": \"gcc-14-base\",\n\t\t\t\"sha256\": \"7db20fd710eadefff128e82b4d4de68b466ce2aa1c53255004eb1d3d1d168495\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/gcc-14-base_14.2.0-19_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgcc-s1_14.2.0-19_s390x\",\n\t\t\t\"name\": \"libgcc-s1\",\n\t\t\t\"sha256\": \"b5e87f11a8ac0537d500bf2dba37165bf8d25b5b44add1035a32deddbd4bfdda\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libgcc-s1_14.2.0-19_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgomp1_14.2.0-19_s390x\",\n\t\t\t\"name\": \"libgomp1\",\n\t\t\t\"sha256\": \"7297625ed2bd024f2fbb013a3a2c291cd4b0d5fb02afccaeba85c4cb8c386a2d\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libgomp1_14.2.0-19_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libstdc-p--p-6_14.2.0-19_s390x\",\n\t\t\t\"name\": \"libstdc++6\",\n\t\t\t\"sha256\": \"6a91f4a1c8c30dc6d0a23ad7ead8a56271b9f6966d6d74734f4b423cdfe5c21b\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libstdc++6_14.2.0-19_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"base-files_13.8-p-deb13u4_ppc64el\",\n\t\t\t\"name\": \"base-files\",\n\t\t\t\"sha256\": \"ce2583fae881bb3abbf78cf81937877ce79a1527deaa9245c5b1ee4fd70533bc\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/base-files/base-files_13.8+deb13u4_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"13.8+deb13u4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"ca-certificates_20250419_ppc64el\",\n\t\t\t\"name\": \"ca-certificates\",\n\t\t\t\"sha256\": \"ef590f89563aa4b46c8260d49d1cea0fc1b181d19e8df3782694706adf05c184\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/c/ca-certificates/ca-certificates_20250419_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"20250419\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc6_2.41-12-p-deb13u2_ppc64el\",\n\t\t\t\"name\": \"libc6\",\n\t\t\t\"sha256\": \"eb4ae10394bec4d04449bc029b953f1fc8d8a7958b8f881addce25e65f56ecce\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc6_2.41-12+deb13u2_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-12+deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc-bin_2.41-12-p-deb13u2_ppc64el\",\n\t\t\t\"name\": \"libc-bin\",\n\t\t\t\"sha256\": \"fce65b28edb8e02457e65aea16a63d3d5b4ec69cc7616b1c7620124aac4b39ed\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc-bin_2.41-12+deb13u2_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-12+deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libssl3t64_3.5.5-1_deb13u1_ppc64el\",\n\t\t\t\"name\": \"libssl3t64\",\n\t\t\t\"sha256\": \"498840dfa4bb1e5abd3f01c867a0f8e7dcbb5433c0c529d4d57e5031a511e5ac\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/o/openssl/libssl3t64_3.5.5-1~deb13u1_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.5.5-1~deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"netbase_6.5_ppc64el\",\n\t\t\t\"name\": \"netbase\",\n\t\t\t\"sha256\": \"76bafa92947ebd37b0a6f9ec6570412041f56edebc1c66d323731216d318471e\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/netbase/netbase_6.5_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"openssl_3.5.5-1_deb13u1_ppc64el\",\n\t\t\t\"name\": \"openssl\",\n\t\t\t\"sha256\": \"4a02e74427acdd82f7dc11b0442a46ba50db2fe8a1e0bbf36afcd85b574a3e1d\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/o/openssl/openssl_3.5.5-1~deb13u1_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.5.5-1~deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"tzdata_2026a-0-p-deb13u1_ppc64el\",\n\t\t\t\"name\": \"tzdata\",\n\t\t\t\"sha256\": \"9fb91a8d4f4f852918d14b1379f788c1c4971cf640c4bda7f568e7601620a874\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/t/tzdata/tzdata_2026a-0+deb13u1_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2026a-0+deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"tzdata-legacy_2026a-0-p-deb13u1_ppc64el\",\n\t\t\t\"name\": \"tzdata-legacy\",\n\t\t\t\"sha256\": \"f402289df6fd7f698e0f073da0e260e3365be368243a66bf2a2b940f37554b1c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/t/tzdata/tzdata-legacy_2026a-0+deb13u1_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2026a-0+deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"media-types_13.0.0_ppc64el\",\n\t\t\t\"name\": \"media-types\",\n\t\t\t\"sha256\": \"0788e4b0b72db1bcf74a19cb24c3511e7770ad0b341f0f30e361701c3072f53e\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/m/media-types/media-types_13.0.0_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"13.0.0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"zlib1g_1-1.3.dfsg-p-really1.3.1-1-p-b1_ppc64el\",\n\t\t\t\"name\": \"zlib1g\",\n\t\t\t\"sha256\": \"f526e830310db11983cf51cfde95a74bc449a7bdc44b6ce68827d78802f1b4ae\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/z/zlib/zlib1g_1.3.dfsg+really1.3.1-1+b1_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:1.3.dfsg+really1.3.1-1+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libzstd1_1.5.7-p-dfsg-1_ppc64el\",\n\t\t\t\"name\": \"libzstd1\",\n\t\t\t\"sha256\": \"1cdefa11a7d31bb36b610d4e44551870a44dfc6cac8359ebe9f9061a4f830773\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libz/libzstd/libzstd1_1.5.7+dfsg-1_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.5.7+dfsg-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"gcc-14-base_14.2.0-19_ppc64el\",\n\t\t\t\"name\": \"gcc-14-base\",\n\t\t\t\"sha256\": \"ebb80291fedd8db88488eef76573df0b4a1a11648a16406d9a0c0d4aaf229593\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/gcc-14-base_14.2.0-19_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgcc-s1_14.2.0-19_ppc64el\",\n\t\t\t\"name\": \"libgcc-s1\",\n\t\t\t\"sha256\": \"9fef01c88bc508ff05ff9ce5d0cc05de36798591e060b07749c3835616ed5696\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libgcc-s1_14.2.0-19_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgomp1_14.2.0-19_ppc64el\",\n\t\t\t\"name\": \"libgomp1\",\n\t\t\t\"sha256\": \"cca95ab0ba3537a573c1d2796b8c1a00ef2839766fbb01b7b8882f47b2d504bb\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libgomp1_14.2.0-19_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libstdc-p--p-6_14.2.0-19_ppc64el\",\n\t\t\t\"name\": \"libstdc++6\",\n\t\t\t\"sha256\": \"ee601ab87b7c7ac01f3d7be0fe2423f0ddc3a51b46d3331b4e9dff4110e6a8b9\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libstdc++6_14.2.0-19_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"base-files_13.8-p-deb13u4_riscv64\",\n\t\t\t\"name\": \"base-files\",\n\t\t\t\"sha256\": \"80ed884c8808860b4aa0a1e8e27b5ffe9ae6f4f3f1ff1f609ec6bab88c7ab437\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/base-files/base-files_13.8+deb13u4_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"13.8+deb13u4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"ca-certificates_20250419_riscv64\",\n\t\t\t\"name\": \"ca-certificates\",\n\t\t\t\"sha256\": \"ef590f89563aa4b46c8260d49d1cea0fc1b181d19e8df3782694706adf05c184\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/c/ca-certificates/ca-certificates_20250419_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"20250419\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc6_2.41-12-p-deb13u2_riscv64\",\n\t\t\t\"name\": \"libc6\",\n\t\t\t\"sha256\": \"3c80d1019eb1d15c5d941bda85bab8358621d46408099ba2bc08ac4512c2fe0c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc6_2.41-12+deb13u2_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-12+deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc-bin_2.41-12-p-deb13u2_riscv64\",\n\t\t\t\"name\": \"libc-bin\",\n\t\t\t\"sha256\": \"4b03a077476ed203f0edd56339a8d2b91a6b12ae1cc801db2ac917ad07b05617\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc-bin_2.41-12+deb13u2_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-12+deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libssl3t64_3.5.5-1_deb13u1_riscv64\",\n\t\t\t\"name\": \"libssl3t64\",\n\t\t\t\"sha256\": \"3f07bbe787738e37733b094195cd073451ca722bad41462630b6a1146664673c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/o/openssl/libssl3t64_3.5.5-1~deb13u1_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.5.5-1~deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"netbase_6.5_riscv64\",\n\t\t\t\"name\": \"netbase\",\n\t\t\t\"sha256\": \"76bafa92947ebd37b0a6f9ec6570412041f56edebc1c66d323731216d318471e\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/netbase/netbase_6.5_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"openssl_3.5.5-1_deb13u1_riscv64\",\n\t\t\t\"name\": \"openssl\",\n\t\t\t\"sha256\": \"d035fac9cd37b94a8a2cd571816ff4ce1630ddcc7ca8f81d5b351affed71671e\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/o/openssl/openssl_3.5.5-1~deb13u1_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.5.5-1~deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"tzdata_2026a-0-p-deb13u1_riscv64\",\n\t\t\t\"name\": \"tzdata\",\n\t\t\t\"sha256\": \"9fb91a8d4f4f852918d14b1379f788c1c4971cf640c4bda7f568e7601620a874\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/t/tzdata/tzdata_2026a-0+deb13u1_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2026a-0+deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"tzdata-legacy_2026a-0-p-deb13u1_riscv64\",\n\t\t\t\"name\": \"tzdata-legacy\",\n\t\t\t\"sha256\": \"f402289df6fd7f698e0f073da0e260e3365be368243a66bf2a2b940f37554b1c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/t/tzdata/tzdata-legacy_2026a-0+deb13u1_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2026a-0+deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"media-types_13.0.0_riscv64\",\n\t\t\t\"name\": \"media-types\",\n\t\t\t\"sha256\": \"0788e4b0b72db1bcf74a19cb24c3511e7770ad0b341f0f30e361701c3072f53e\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/m/media-types/media-types_13.0.0_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"13.0.0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"zlib1g_1-1.3.dfsg-p-really1.3.1-1-p-b1_riscv64\",\n\t\t\t\"name\": \"zlib1g\",\n\t\t\t\"sha256\": \"38c52eef58e5fc9b13d93f8a7d0a0549c32b4f00402a778d39a135254f554314\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/z/zlib/zlib1g_1.3.dfsg+really1.3.1-1+b1_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:1.3.dfsg+really1.3.1-1+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libzstd1_1.5.7-p-dfsg-1_riscv64\",\n\t\t\t\"name\": \"libzstd1\",\n\t\t\t\"sha256\": \"5967f5f97bfb6e7a8036d4e615c0ecd6861a9bb686bd60ee0c81422581faf0ad\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libz/libzstd/libzstd1_1.5.7+dfsg-1_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.5.7+dfsg-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"gcc-14-base_14.2.0-19_riscv64\",\n\t\t\t\"name\": \"gcc-14-base\",\n\t\t\t\"sha256\": \"bb871e84c5c108463fa6a858e72f15cbf809f3888442b89941fc625449874206\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/gcc-14-base_14.2.0-19_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgcc-s1_14.2.0-19_riscv64\",\n\t\t\t\"name\": \"libgcc-s1\",\n\t\t\t\"sha256\": \"16d3f9f534028615413d23f649e5d246baef48fe7db739ad564ef8b9a6e5587c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libgcc-s1_14.2.0-19_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgomp1_14.2.0-19_riscv64\",\n\t\t\t\"name\": \"libgomp1\",\n\t\t\t\"sha256\": \"0d457810c609eed431d438aa3e7a0c5a6974d3dca8e16ecd8fe38a949ba63b0f\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libgomp1_14.2.0-19_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libstdc-p--p-6_14.2.0-19_riscv64\",\n\t\t\t\"name\": \"libstdc++6\",\n\t\t\t\"sha256\": \"f285313f34e0d8f65463c669fac8eb29760a3f3fd6459005dd3110cdd2b10fd7\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libstdc++6_14.2.0-19_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t}\n\t],\n\t\"version\": 1\n}"
  },
  {
    "path": "private/repos/deb/trixie.yaml",
    "content": "# debian 13\nversion: 1\n\nsources:\n  - channel: trixie main\n    url: https://snapshot.debian.org/archive/debian/20260314T202839Z\n  - channel: trixie-updates main\n    url: https://snapshot.debian.org/archive/debian/20260314T202839Z\n  - channel: trixie-security main\n    url: https://snapshot.debian.org/archive/debian-security/20260314T202839Z\n\narchs:\n  - amd64\n  - arm64\n  - armhf\n  - s390x\n  - ppc64el\n  - riscv64\n\npackages:\n  - base-files\n  - ca-certificates\n  - libc6\n  - libc-bin\n  - libssl3t64\n  - netbase\n  - openssl\n  - tzdata\n  - tzdata-legacy\n  - media-types\n  - zlib1g\n  - libzstd1\n  # c++\n  - gcc-14-base\n  - libgcc-s1\n  - libgomp1\n  - libstdc++6\n"
  },
  {
    "path": "private/repos/deb/trixie_adoptium.lock.json",
    "content": "{\n\t\"packages\": [\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-17-jre_17.0.18.0.0-p-8-1_amd64\",\n\t\t\t\"name\": \"temurin-17-jre\",\n\t\t\t\"sha256\": \"fada157f316e14b0c8fda17b886b0d0b524b562ee77dc2c146fa471d2342709b\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-17/temurin-17-jre_17.0.18.0.0+8-1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"17.0.18.0.0+8-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-17-jdk_17.0.18.0.0-p-8-1_amd64\",\n\t\t\t\"name\": \"temurin-17-jdk\",\n\t\t\t\"sha256\": \"ce5e529f453ae11e41ddb3ae25979df491634fd4d3f4ed5fed44db1d13ca502f\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-17/temurin-17-jdk_17.0.18.0.0+8-1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"17.0.18.0.0+8-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-21-jre_21.0.10.0.0-p-7-1_amd64\",\n\t\t\t\"name\": \"temurin-21-jre\",\n\t\t\t\"sha256\": \"93282daa88301f2502e6e4e1d9f63c3b5ebc64a56e74d8c9d0e7a0a28263a82b\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-21/temurin-21-jre_21.0.10.0.0+7-1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"21.0.10.0.0+7-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-21-jdk_21.0.10.0.0-p-7-1_amd64\",\n\t\t\t\"name\": \"temurin-21-jdk\",\n\t\t\t\"sha256\": \"ec89ad6f51af0511ab1e3ed1c354cbcc7c7a08462ca16ac4a874f5a6728139e8\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-21/temurin-21-jdk_21.0.10.0.0+7-1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"21.0.10.0.0+7-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-25-jre_25.0.2.0.0-p-10-1_amd64\",\n\t\t\t\"name\": \"temurin-25-jre\",\n\t\t\t\"sha256\": \"279d043f5849f94895dfa32252748bdbb40c87b9bf75dffae141434cbc9eb8f3\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-25/temurin-25-jre_25.0.2.0.0+10-1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"25.0.2.0.0+10-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-25-jdk_25.0.2.0.0-p-10-1_amd64\",\n\t\t\t\"name\": \"temurin-25-jdk\",\n\t\t\t\"sha256\": \"a04db715e851b2a5c1fa27db5f3e68d8d488877d5da6f0030b86a140b2c4029d\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-25/temurin-25-jdk_25.0.2.0.0+10-1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"25.0.2.0.0+10-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-17-jre_17.0.18.0.0-p-8-0_arm64\",\n\t\t\t\"name\": \"temurin-17-jre\",\n\t\t\t\"sha256\": \"54581ac52cde67e6d1dfa214777aa2bbe818b4fda4f0b2c8d1d4d644f9322487\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-17/temurin-17-jre_17.0.18.0.0+8-0_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"17.0.18.0.0+8-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-17-jdk_17.0.18.0.0-p-8-0_arm64\",\n\t\t\t\"name\": \"temurin-17-jdk\",\n\t\t\t\"sha256\": \"2410ea398569b5981e436626f148b1fcfebd0dfe61b1d8a73e63959c313a6ba4\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-17/temurin-17-jdk_17.0.18.0.0+8-0_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"17.0.18.0.0+8-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-21-jre_21.0.10.0.0-p-7-0_arm64\",\n\t\t\t\"name\": \"temurin-21-jre\",\n\t\t\t\"sha256\": \"dc256aebf81f8e7c0a859c0894233830c698cd105de62332d02ac3df70141f2a\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-21/temurin-21-jre_21.0.10.0.0+7-0_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"21.0.10.0.0+7-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-21-jdk_21.0.10.0.0-p-7-0_arm64\",\n\t\t\t\"name\": \"temurin-21-jdk\",\n\t\t\t\"sha256\": \"dd9b54ff7f8fc809730a34608656dc3be4369c94c39923e7e00ef83192166168\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-21/temurin-21-jdk_21.0.10.0.0+7-0_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"21.0.10.0.0+7-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-25-jre_25.0.2.0.0-p-10-0_arm64\",\n\t\t\t\"name\": \"temurin-25-jre\",\n\t\t\t\"sha256\": \"7472db63d005e331f9311ebb93798ac94d8ac247ee0b5266c13206c21058800c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-25/temurin-25-jre_25.0.2.0.0+10-0_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"25.0.2.0.0+10-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-25-jdk_25.0.2.0.0-p-10-0_arm64\",\n\t\t\t\"name\": \"temurin-25-jdk\",\n\t\t\t\"sha256\": \"346d974fa90fcaca91260ead05f08b6b2cc3d2c4f324d3619a6d2080d8211103\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-25/temurin-25-jdk_25.0.2.0.0+10-0_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"25.0.2.0.0+10-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-17-jre_17.0.18.0.0-p-8-0_s390x\",\n\t\t\t\"name\": \"temurin-17-jre\",\n\t\t\t\"sha256\": \"c3e8b38312ce0e0c4ca6f317ccc0e27744c09728bd654de726f76f692eee655a\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-17/temurin-17-jre_17.0.18.0.0+8-0_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"17.0.18.0.0+8-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-17-jdk_17.0.18.0.0-p-8-0_s390x\",\n\t\t\t\"name\": \"temurin-17-jdk\",\n\t\t\t\"sha256\": \"cce158ab3d50ac6a23397bf2a095db95d78484ebe44ee37fec2b6093059c091b\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-17/temurin-17-jdk_17.0.18.0.0+8-0_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"17.0.18.0.0+8-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-21-jre_21.0.10.0.0-p-7-0_s390x\",\n\t\t\t\"name\": \"temurin-21-jre\",\n\t\t\t\"sha256\": \"0da663187c25289add32f65fddf13604542b5d32d359a6d5e13ab345a7ab544c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-21/temurin-21-jre_21.0.10.0.0+7-0_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"21.0.10.0.0+7-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-21-jdk_21.0.10.0.0-p-7-0_s390x\",\n\t\t\t\"name\": \"temurin-21-jdk\",\n\t\t\t\"sha256\": \"ef9b01f844c2523eb2c26e9c585ce2669d2e781b874ed33514bd15aa254c18c7\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-21/temurin-21-jdk_21.0.10.0.0+7-0_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"21.0.10.0.0+7-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-25-jre_25.0.2.0.0-p-10-0_s390x\",\n\t\t\t\"name\": \"temurin-25-jre\",\n\t\t\t\"sha256\": \"7318035d9ff137622ad368e2159cb9d1c45635d05f8185b2f82af5ae89d672b6\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-25/temurin-25-jre_25.0.2.0.0+10-0_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"25.0.2.0.0+10-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-25-jdk_25.0.2.0.0-p-10-0_s390x\",\n\t\t\t\"name\": \"temurin-25-jdk\",\n\t\t\t\"sha256\": \"7abab559d6d751713bfa6ba09ff75076b454fdec05dcb95ec897eb92e8d34e15\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-25/temurin-25-jdk_25.0.2.0.0+10-0_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"25.0.2.0.0+10-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-17-jre_17.0.18.0.0-p-8-0_ppc64el\",\n\t\t\t\"name\": \"temurin-17-jre\",\n\t\t\t\"sha256\": \"693ce1870ab6ed087aa8c803cc36094154fcbfed3793ff89dffec915e694d71e\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-17/temurin-17-jre_17.0.18.0.0+8-0_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"17.0.18.0.0+8-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-17-jdk_17.0.18.0.0-p-8-0_ppc64el\",\n\t\t\t\"name\": \"temurin-17-jdk\",\n\t\t\t\"sha256\": \"bf7bae624e25fdfae61d93dc1206aa98284e9be9b4158a2492e0a75d4203a71b\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-17/temurin-17-jdk_17.0.18.0.0+8-0_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"17.0.18.0.0+8-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-21-jre_21.0.10.0.0-p-7-0_ppc64el\",\n\t\t\t\"name\": \"temurin-21-jre\",\n\t\t\t\"sha256\": \"537f072bdcd06e55b9635d55612190eb830df0e8165c1b4a55b67cc46be26089\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-21/temurin-21-jre_21.0.10.0.0+7-0_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"21.0.10.0.0+7-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-21-jdk_21.0.10.0.0-p-7-0_ppc64el\",\n\t\t\t\"name\": \"temurin-21-jdk\",\n\t\t\t\"sha256\": \"9f192399ed2756baf5f5d90b83c62d9e562498e5168440b43721bb2c20db0bae\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-21/temurin-21-jdk_21.0.10.0.0+7-0_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"21.0.10.0.0+7-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-25-jre_25.0.2.0.0-p-10-0_ppc64el\",\n\t\t\t\"name\": \"temurin-25-jre\",\n\t\t\t\"sha256\": \"2d5908ae4952668d23f5c89a77d7fe6a460b7bed1c4b8514ca755fa87aa21417\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-25/temurin-25-jre_25.0.2.0.0+10-0_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"25.0.2.0.0+10-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-25-jdk_25.0.2.0.0-p-10-0_ppc64el\",\n\t\t\t\"name\": \"temurin-25-jdk\",\n\t\t\t\"sha256\": \"8b6bed3265dac51a23c1dbb4fb252f4f7d628729c00d3f835705e66fc0c23d93\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-25/temurin-25-jdk_25.0.2.0.0+10-0_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"25.0.2.0.0+10-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-17-jre_17.0.18.0.0-p-8-0_riscv64\",\n\t\t\t\"name\": \"temurin-17-jre\",\n\t\t\t\"sha256\": \"0dcc823cfa1757c2f3739b59ce8ebfe32f2d619343ef77dfb501bf79a5165748\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-17/temurin-17-jre_17.0.18.0.0+8-0_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"17.0.18.0.0+8-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-17-jdk_17.0.18.0.0-p-8-0_riscv64\",\n\t\t\t\"name\": \"temurin-17-jdk\",\n\t\t\t\"sha256\": \"92fe04052404438f5b65173c2cc9feb760cdab2992d0f4feb7dc32452532be0c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-17/temurin-17-jdk_17.0.18.0.0+8-0_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"17.0.18.0.0+8-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-21-jre_21.0.10.0.0-p-7-0_riscv64\",\n\t\t\t\"name\": \"temurin-21-jre\",\n\t\t\t\"sha256\": \"0518002b3ce24936615f2996ec9bc29b6e868a5156f134df16c6a271edfe54a8\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-21/temurin-21-jre_21.0.10.0.0+7-0_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"21.0.10.0.0+7-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-21-jdk_21.0.10.0.0-p-7-0_riscv64\",\n\t\t\t\"name\": \"temurin-21-jdk\",\n\t\t\t\"sha256\": \"c85788afa927d86254b351d9a5af6628a7cad7182c8e700469d0244f296fa6b4\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-21/temurin-21-jdk_21.0.10.0.0+7-0_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"21.0.10.0.0+7-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-25-jre_25.0.2.0.0-p-10-0_riscv64\",\n\t\t\t\"name\": \"temurin-25-jre\",\n\t\t\t\"sha256\": \"c93c327e0aa5b7a1d249ddadfe4ba071a7fcda1b7c82a33f2d5ff4931d6ad51d\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-25/temurin-25-jre_25.0.2.0.0+10-0_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"25.0.2.0.0+10-0\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"temurin-25-jdk_25.0.2.0.0-p-10-0_riscv64\",\n\t\t\t\"name\": \"temurin-25-jdk\",\n\t\t\t\"sha256\": \"99eebd085906b13f7b25fc26b8cc85d3f6635373f0a9d202b916445f243cd0b5\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-25/temurin-25-jdk_25.0.2.0.0+10-0_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"25.0.2.0.0+10-0\"\n\t\t}\n\t],\n\t\"version\": 1\n}"
  },
  {
    "path": "private/repos/deb/trixie_adoptium.yaml",
    "content": "# debian 13, java from adoptium repositories\nversion: 1\n\nsources:\n  # adoptium\n  - channel: trixie main\n    url: https://packages.adoptium.net/artifactory/deb\n\narchs:\n  - amd64\n  - arm64\n  - s390x\n  - ppc64el\n  - riscv64\n\npackages:\n  - temurin-17-jre\n  - temurin-17-jdk\n  - temurin-21-jre\n  - temurin-21-jdk\n  - temurin-25-jre\n  - temurin-25-jdk\n"
  },
  {
    "path": "private/repos/deb/trixie_java.lock.json",
    "content": "{\n\t\"packages\": [\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"fontconfig-config_2.15.0-2.3_amd64\",\n\t\t\t\"name\": \"fontconfig-config\",\n\t\t\t\"sha256\": \"0475c00d02660c07a15085051818625331bb502e053242106aaaa1f2ddb41225\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/fontconfig/fontconfig-config_2.15.0-2.3_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.15.0-2.3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"fonts-dejavu-core_2.37-8_amd64\",\n\t\t\t\"name\": \"fonts-dejavu-core\",\n\t\t\t\"sha256\": \"86635b3d25b3655fc11cb3ecc3af59f0bf19643b02b94f2de48bd10253cdba12\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/fonts-dejavu/fonts-dejavu-core_2.37-8_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.37-8\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libbrotli1_1.1.0-2-p-b7_amd64\",\n\t\t\t\"name\": \"libbrotli1\",\n\t\t\t\"sha256\": \"0fb79f88db210afbd69282ab9649e525f393ec6950ca34da1a6b359250b8d7db\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/brotli/libbrotli1_1.1.0-2+b7_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.1.0-2+b7\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libbz2-1.0_1.0.8-6_amd64\",\n\t\t\t\"name\": \"libbz2-1.0\",\n\t\t\t\"sha256\": \"cba4cda04244b5e481bb15524bc3c983a7d1b6f330013b9b381706a2fcb65310\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-6_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.0.8-6\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libcrypt1_1-4.4.38-1_amd64\",\n\t\t\t\"name\": \"libcrypt1\",\n\t\t\t\"sha256\": \"0ebc144d662e3197982d1bf3a7b8b35ca845e54c68811de0328b1f0d7c67585c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libx/libxcrypt/libcrypt1_4.4.38-1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:4.4.38-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libexpat1_2.7.1-2_amd64\",\n\t\t\t\"name\": \"libexpat1\",\n\t\t\t\"sha256\": \"f875f56675be5b074da877f9a93b09d47dc2eb4e679951d36e2943b8d4843344\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/e/expat/libexpat1_2.7.1-2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.7.1-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libfontconfig1_2.15.0-2.3_amd64\",\n\t\t\t\"name\": \"libfontconfig1\",\n\t\t\t\"sha256\": \"7ae91ec59857cc8e375eb2bdd371a4a69daea38f7787d06d474a847867d852b1\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/fontconfig/libfontconfig1_2.15.0-2.3_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.15.0-2.3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libfreetype6_2.13.3-p-dfsg-1_amd64\",\n\t\t\t\"name\": \"libfreetype6\",\n\t\t\t\"sha256\": \"1fcf0600356ff0d9b387ad908a897e1e5418705ffb8d7cb66d6dcb25af55b76f\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/freetype/libfreetype6_2.13.3+dfsg-1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.13.3+dfsg-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libglib2.0-0t64_2.84.4-3_deb13u2_amd64\",\n\t\t\t\"name\": \"libglib2.0-0t64\",\n\t\t\t\"sha256\": \"6d4c07e17b9809eca7078b49851da8e1d16e510e80897cc96681bd4c75b27353\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glib2.0/libglib2.0-0t64_2.84.4-3~deb13u2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.84.4-3~deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgraphite2-3_1.3.14-2-p-b1_amd64\",\n\t\t\t\"name\": \"libgraphite2-3\",\n\t\t\t\"sha256\": \"e3ca92b45f951d65542c9309e7d68b1fc36e6aa3cc3de69b5123859fd6988d25\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/graphite2/libgraphite2-3_1.3.14-2+b1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.3.14-2+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libharfbuzz0b_10.2.0-1-p-b1_amd64\",\n\t\t\t\"name\": \"libharfbuzz0b\",\n\t\t\t\"sha256\": \"153daeed7f6bec0b0573600c4063badac3bb65d6005a14f3c0296fb5728b54c2\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/h/harfbuzz/libharfbuzz0b_10.2.0-1+b1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"10.2.0-1+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libjpeg62-turbo_1-2.1.5-4_amd64\",\n\t\t\t\"name\": \"libjpeg62-turbo\",\n\t\t\t\"sha256\": \"5504299ad0e3c0a9ca9f962a68a650a040db52f9f416a109e74df48d55601d3f\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.1.5-4_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:2.1.5-4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"liblcms2-2_2.16-2_amd64\",\n\t\t\t\"name\": \"liblcms2-2\",\n\t\t\t\"sha256\": \"726ef00f17a41bd9735c8df8e9562e6243baa13275164ad942f06f2a3772f520\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/l/lcms2/liblcms2-2_2.16-2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.16-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libpcre2-8-0_10.46-1_deb13u1_amd64\",\n\t\t\t\"name\": \"libpcre2-8-0\",\n\t\t\t\"sha256\": \"6aa452af6a07e34498bf8e734e8789c9dd602fb34f12572e62dc1bba4889a60e\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/pcre2/libpcre2-8-0_10.46-1~deb13u1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"10.46-1~deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libpng16-16t64_1.6.48-1-p-deb13u3_amd64\",\n\t\t\t\"name\": \"libpng16-16t64\",\n\t\t\t\"sha256\": \"679adfba65710f40666b80216877e9df18649244936b5ee39f406367dd21ba79\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian-security/20260314T202839Z/pool/updates/main/libp/libpng1.6/libpng16-16t64_1.6.48-1+deb13u3_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.6.48-1+deb13u3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libuuid1_2.41-5_amd64\",\n\t\t\t\"name\": \"libuuid1\",\n\t\t\t\"sha256\": \"10247744737c1bb574f9667b3f06a3b43a5055c67bdfcc1945803451cc036db3\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/u/util-linux/libuuid1_2.41-5_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"zlib1g_1-1.3.dfsg-p-really1.3.1-1-p-b1_amd64\",\n\t\t\t\"name\": \"zlib1g\",\n\t\t\t\"sha256\": \"015be740d6236ad114582dea500c1d907f29e16d6db00566ca32fb68d71ac90d\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/z/zlib/zlib1g_1.3.dfsg+really1.3.1-1+b1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:1.3.dfsg+really1.3.1-1+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"gcc-14-base_14.2.0-19_amd64\",\n\t\t\t\"name\": \"gcc-14-base\",\n\t\t\t\"sha256\": \"5b6825de4263824b78c4c51f6476414f3b4e89c2ab63e81dc8b9b5501e867cf6\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/gcc-14-base_14.2.0-19_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgcc-s1_14.2.0-19_amd64\",\n\t\t\t\"name\": \"libgcc-s1\",\n\t\t\t\"sha256\": \"3c71917b490d1a17aed43196a2787a256ecf060526cdb20216a74bedc061b150\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libgcc-s1_14.2.0-19_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libstdc-p--p-6_14.2.0-19_amd64\",\n\t\t\t\"name\": \"libstdc++6\",\n\t\t\t\"sha256\": \"ab1fa05837aa7a92aae748fd07a18a35f7d18bb4a71c4724fe2bbf0e32089de0\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libstdc++6_14.2.0-19_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"fontconfig-config_2.15.0-2.3_arm64\",\n\t\t\t\"name\": \"fontconfig-config\",\n\t\t\t\"sha256\": \"10f643f467b51cf25fc18d1945bc61246dd8d8d1fe6bc712a2b1712c74ebc4d6\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/fontconfig/fontconfig-config_2.15.0-2.3_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.15.0-2.3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"fonts-dejavu-core_2.37-8_arm64\",\n\t\t\t\"name\": \"fonts-dejavu-core\",\n\t\t\t\"sha256\": \"86635b3d25b3655fc11cb3ecc3af59f0bf19643b02b94f2de48bd10253cdba12\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/fonts-dejavu/fonts-dejavu-core_2.37-8_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.37-8\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libbrotli1_1.1.0-2-p-b7_arm64\",\n\t\t\t\"name\": \"libbrotli1\",\n\t\t\t\"sha256\": \"10270398c4842e71c72b4081fa1761728b3225d6c8dce7c58d5baafe58a5e18f\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/brotli/libbrotli1_1.1.0-2+b7_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.1.0-2+b7\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libbz2-1.0_1.0.8-6_arm64\",\n\t\t\t\"name\": \"libbz2-1.0\",\n\t\t\t\"sha256\": \"3537fe4fc577a60c8a9568873cd577db7ebc135eb8bb1825f18caf8972d9d2f2\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-6_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.0.8-6\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libcrypt1_1-4.4.38-1_arm64\",\n\t\t\t\"name\": \"libcrypt1\",\n\t\t\t\"sha256\": \"b9aaa808aa3812b3de3e54eb5dfb16762c1779db032604abef2354c02fdc29b8\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libx/libxcrypt/libcrypt1_4.4.38-1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:4.4.38-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libexpat1_2.7.1-2_arm64\",\n\t\t\t\"name\": \"libexpat1\",\n\t\t\t\"sha256\": \"7f6868227f4893a11123e43b9ed291950b550c7dc209905b2fb871c74678d1bf\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/e/expat/libexpat1_2.7.1-2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.7.1-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libfontconfig1_2.15.0-2.3_arm64\",\n\t\t\t\"name\": \"libfontconfig1\",\n\t\t\t\"sha256\": \"872781cf62926b68c34a4302a3caae334ff8d4d83a2b2477f8fb454460aadc99\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/fontconfig/libfontconfig1_2.15.0-2.3_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.15.0-2.3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libfreetype6_2.13.3-p-dfsg-1_arm64\",\n\t\t\t\"name\": \"libfreetype6\",\n\t\t\t\"sha256\": \"dcb545c78601b14049e85901f8f83ddb5d05b7792ae6188b21d0edf7dc449ac0\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/freetype/libfreetype6_2.13.3+dfsg-1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.13.3+dfsg-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libglib2.0-0t64_2.84.4-3_deb13u2_arm64\",\n\t\t\t\"name\": \"libglib2.0-0t64\",\n\t\t\t\"sha256\": \"61ac86d96726c10403028a7674575504f46c0e0a4f6fac7c9447502d579b7649\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glib2.0/libglib2.0-0t64_2.84.4-3~deb13u2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.84.4-3~deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgraphite2-3_1.3.14-2-p-b1_arm64\",\n\t\t\t\"name\": \"libgraphite2-3\",\n\t\t\t\"sha256\": \"77e3063bf319dcc5c421352d576330d5896764098d81afc15236da6bd2a8f438\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/graphite2/libgraphite2-3_1.3.14-2+b1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.3.14-2+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libharfbuzz0b_10.2.0-1-p-b1_arm64\",\n\t\t\t\"name\": \"libharfbuzz0b\",\n\t\t\t\"sha256\": \"16cbe882396bedde9224797925595142f9115aede8bf62d7d407696a1e307384\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/h/harfbuzz/libharfbuzz0b_10.2.0-1+b1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"10.2.0-1+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libjpeg62-turbo_1-2.1.5-4_arm64\",\n\t\t\t\"name\": \"libjpeg62-turbo\",\n\t\t\t\"sha256\": \"e4989073bb0bac8a6ec043c7adb80e1dfe601d8552233da48bb24ab45d1a1d4a\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.1.5-4_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:2.1.5-4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"liblcms2-2_2.16-2_arm64\",\n\t\t\t\"name\": \"liblcms2-2\",\n\t\t\t\"sha256\": \"c2a9e32455134df3ad9f39b1109980e3d93f8369f1a35f6ea8e45ca2a25dc0b1\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/l/lcms2/liblcms2-2_2.16-2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.16-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libpcre2-8-0_10.46-1_deb13u1_arm64\",\n\t\t\t\"name\": \"libpcre2-8-0\",\n\t\t\t\"sha256\": \"f74d3e1082c2d6d2f7b4d47e41070de4a7e2f7f9d0e6e0c901ebfe0e82cdd3ee\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/pcre2/libpcre2-8-0_10.46-1~deb13u1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"10.46-1~deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libpng16-16t64_1.6.48-1-p-deb13u3_arm64\",\n\t\t\t\"name\": \"libpng16-16t64\",\n\t\t\t\"sha256\": \"89f31e282ef54e29c28313fda75360559348edf18a0dcda459876acae20d7df7\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian-security/20260314T202839Z/pool/updates/main/libp/libpng1.6/libpng16-16t64_1.6.48-1+deb13u3_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.6.48-1+deb13u3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libuuid1_2.41-5_arm64\",\n\t\t\t\"name\": \"libuuid1\",\n\t\t\t\"sha256\": \"85b7d04605f9d423d5699b3c07f027e8380649fd164a51e0712cded0cc56eced\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/u/util-linux/libuuid1_2.41-5_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"zlib1g_1-1.3.dfsg-p-really1.3.1-1-p-b1_arm64\",\n\t\t\t\"name\": \"zlib1g\",\n\t\t\t\"sha256\": \"209aa5cf671e97b9eb0410844fa6df4cae2e75b0c72e7802ab6c8ece13e6ddef\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/z/zlib/zlib1g_1.3.dfsg+really1.3.1-1+b1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:1.3.dfsg+really1.3.1-1+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"gcc-14-base_14.2.0-19_arm64\",\n\t\t\t\"name\": \"gcc-14-base\",\n\t\t\t\"sha256\": \"34ee90679b018c0e64234747a4c4c0ae6b7f63541115037465a8627c2dfbc594\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/gcc-14-base_14.2.0-19_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgcc-s1_14.2.0-19_arm64\",\n\t\t\t\"name\": \"libgcc-s1\",\n\t\t\t\"sha256\": \"1108bc87879833d6d9a145f22a4a15cddb34e065b4b5f4b97bee586adbac2851\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libgcc-s1_14.2.0-19_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libstdc-p--p-6_14.2.0-19_arm64\",\n\t\t\t\"name\": \"libstdc++6\",\n\t\t\t\"sha256\": \"6669b0c52a2e7c6af9adfdabce3ff6e286065cdfbc7b85280862b5f799daebee\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libstdc++6_14.2.0-19_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"fontconfig-config_2.15.0-2.3_s390x\",\n\t\t\t\"name\": \"fontconfig-config\",\n\t\t\t\"sha256\": \"67579884a5d0b140ddeec9425d2e45d8b7351f60e12a324db3b44bb36b51c0a8\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/fontconfig/fontconfig-config_2.15.0-2.3_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.15.0-2.3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"fonts-dejavu-core_2.37-8_s390x\",\n\t\t\t\"name\": \"fonts-dejavu-core\",\n\t\t\t\"sha256\": \"86635b3d25b3655fc11cb3ecc3af59f0bf19643b02b94f2de48bd10253cdba12\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/fonts-dejavu/fonts-dejavu-core_2.37-8_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.37-8\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libbrotli1_1.1.0-2-p-b7_s390x\",\n\t\t\t\"name\": \"libbrotli1\",\n\t\t\t\"sha256\": \"4b258faa654f95a7b3911956436d8556657af28dda91a05dd4045bb3bdf673fd\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/brotli/libbrotli1_1.1.0-2+b7_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.1.0-2+b7\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libbz2-1.0_1.0.8-6_s390x\",\n\t\t\t\"name\": \"libbz2-1.0\",\n\t\t\t\"sha256\": \"d1f51ce5ef4b7232b079fa21e222a1aafe3d631344dfbe369c8c77a79d5265e7\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-6_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.0.8-6\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libcrypt1_1-4.4.38-1_s390x\",\n\t\t\t\"name\": \"libcrypt1\",\n\t\t\t\"sha256\": \"c8c4cd4f66171c7607665141e2f8a8c60c8f9309ce62b6ac2eeeb0edbab2fe40\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libx/libxcrypt/libcrypt1_4.4.38-1_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:4.4.38-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libexpat1_2.7.1-2_s390x\",\n\t\t\t\"name\": \"libexpat1\",\n\t\t\t\"sha256\": \"d16e16898d3726847e96a5f3eb35e4c721b838b50f61f7515ee6700a564d388c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/e/expat/libexpat1_2.7.1-2_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.7.1-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libfontconfig1_2.15.0-2.3_s390x\",\n\t\t\t\"name\": \"libfontconfig1\",\n\t\t\t\"sha256\": \"dabbb1b7358525900cc98aba5d25f78bac953fdaaf96b1bb09a6b570ae917be0\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/fontconfig/libfontconfig1_2.15.0-2.3_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.15.0-2.3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libfreetype6_2.13.3-p-dfsg-1_s390x\",\n\t\t\t\"name\": \"libfreetype6\",\n\t\t\t\"sha256\": \"ad73bbee549e4e28f6334fc11d01571f0c445d1ae877c4e6ce21838fb265685d\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/freetype/libfreetype6_2.13.3+dfsg-1_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.13.3+dfsg-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libglib2.0-0t64_2.84.4-3_deb13u2_s390x\",\n\t\t\t\"name\": \"libglib2.0-0t64\",\n\t\t\t\"sha256\": \"7f3b66433fa74de544297719ab11318bc4234cb0b3cf658920d1a1ce44a7c4e4\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glib2.0/libglib2.0-0t64_2.84.4-3~deb13u2_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.84.4-3~deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgraphite2-3_1.3.14-2-p-b1_s390x\",\n\t\t\t\"name\": \"libgraphite2-3\",\n\t\t\t\"sha256\": \"724140c5dedd0778a3e701c9d8aff45a2c83a355b38b97cc1aecedb46fef74e5\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/graphite2/libgraphite2-3_1.3.14-2+b1_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.3.14-2+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libharfbuzz0b_10.2.0-1-p-b1_s390x\",\n\t\t\t\"name\": \"libharfbuzz0b\",\n\t\t\t\"sha256\": \"5932a76bbdc14bacb3e99d6dfa5e9eadba907d745e2f775b841561090f8a55f7\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/h/harfbuzz/libharfbuzz0b_10.2.0-1+b1_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"10.2.0-1+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libjpeg62-turbo_1-2.1.5-4_s390x\",\n\t\t\t\"name\": \"libjpeg62-turbo\",\n\t\t\t\"sha256\": \"cbfd8a7724b8f89d6c0922f77b523ce8ebecbcc6455bb9364435c18f563790c4\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.1.5-4_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:2.1.5-4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"liblcms2-2_2.16-2_s390x\",\n\t\t\t\"name\": \"liblcms2-2\",\n\t\t\t\"sha256\": \"f3cec223271a0612f20bf164cf4732e9a31ccaa575ef58fbbfa51d98dd178515\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/l/lcms2/liblcms2-2_2.16-2_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.16-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libpcre2-8-0_10.46-1_deb13u1_s390x\",\n\t\t\t\"name\": \"libpcre2-8-0\",\n\t\t\t\"sha256\": \"ac6b596afaa99888dadf7ff8464c1f082f9d16421f51b505e038142364cbace3\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/pcre2/libpcre2-8-0_10.46-1~deb13u1_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"10.46-1~deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libpng16-16t64_1.6.48-1-p-deb13u3_s390x\",\n\t\t\t\"name\": \"libpng16-16t64\",\n\t\t\t\"sha256\": \"a464a4a9a669978450ae5509b0a6bead90e1f4e7aec2fa2c7d9f57660f6f2d68\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian-security/20260314T202839Z/pool/updates/main/libp/libpng1.6/libpng16-16t64_1.6.48-1+deb13u3_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.6.48-1+deb13u3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libuuid1_2.41-5_s390x\",\n\t\t\t\"name\": \"libuuid1\",\n\t\t\t\"sha256\": \"bc039ffc1143510981f97d97939016753f94d06b0e9049eaeeef99116ef04363\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/u/util-linux/libuuid1_2.41-5_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"zlib1g_1-1.3.dfsg-p-really1.3.1-1-p-b1_s390x\",\n\t\t\t\"name\": \"zlib1g\",\n\t\t\t\"sha256\": \"e38a94c60e944dfcf1937a12b02785afbbb2bedf356da18984c4dac0acc47ed9\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/z/zlib/zlib1g_1.3.dfsg+really1.3.1-1+b1_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:1.3.dfsg+really1.3.1-1+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"gcc-14-base_14.2.0-19_s390x\",\n\t\t\t\"name\": \"gcc-14-base\",\n\t\t\t\"sha256\": \"7db20fd710eadefff128e82b4d4de68b466ce2aa1c53255004eb1d3d1d168495\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/gcc-14-base_14.2.0-19_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgcc-s1_14.2.0-19_s390x\",\n\t\t\t\"name\": \"libgcc-s1\",\n\t\t\t\"sha256\": \"b5e87f11a8ac0537d500bf2dba37165bf8d25b5b44add1035a32deddbd4bfdda\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libgcc-s1_14.2.0-19_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"s390x\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libstdc-p--p-6_14.2.0-19_s390x\",\n\t\t\t\"name\": \"libstdc++6\",\n\t\t\t\"sha256\": \"6a91f4a1c8c30dc6d0a23ad7ead8a56271b9f6966d6d74734f4b423cdfe5c21b\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libstdc++6_14.2.0-19_s390x.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"fontconfig-config_2.15.0-2.3_ppc64el\",\n\t\t\t\"name\": \"fontconfig-config\",\n\t\t\t\"sha256\": \"116cf37c74debed705140ed8215fc74450979a9135cd1d5b22a8656e4d76d5f6\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/fontconfig/fontconfig-config_2.15.0-2.3_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.15.0-2.3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"fonts-dejavu-core_2.37-8_ppc64el\",\n\t\t\t\"name\": \"fonts-dejavu-core\",\n\t\t\t\"sha256\": \"86635b3d25b3655fc11cb3ecc3af59f0bf19643b02b94f2de48bd10253cdba12\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/fonts-dejavu/fonts-dejavu-core_2.37-8_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.37-8\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libbrotli1_1.1.0-2-p-b7_ppc64el\",\n\t\t\t\"name\": \"libbrotli1\",\n\t\t\t\"sha256\": \"bdbb6171de2ff9d22d1a5b98e06a4979506f8e5ac1f4dfafabd5c3b952e9c7ab\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/brotli/libbrotli1_1.1.0-2+b7_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.1.0-2+b7\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libbz2-1.0_1.0.8-6_ppc64el\",\n\t\t\t\"name\": \"libbz2-1.0\",\n\t\t\t\"sha256\": \"10390b9ded521aaf6c37df8f63b32a0f127f96d0818c34e60c6ea5260fd99e39\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-6_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.0.8-6\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libcrypt1_1-4.4.38-1_ppc64el\",\n\t\t\t\"name\": \"libcrypt1\",\n\t\t\t\"sha256\": \"271558e9158d9c01e706d2b8702b9ffcca50858e52e840482789d1e52ee7c5d2\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libx/libxcrypt/libcrypt1_4.4.38-1_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:4.4.38-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libexpat1_2.7.1-2_ppc64el\",\n\t\t\t\"name\": \"libexpat1\",\n\t\t\t\"sha256\": \"0bee337d77fbe3f2da4a4bc01fca418c12488f2a52edf8d71ff2ff9d1eec0dee\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/e/expat/libexpat1_2.7.1-2_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.7.1-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libfontconfig1_2.15.0-2.3_ppc64el\",\n\t\t\t\"name\": \"libfontconfig1\",\n\t\t\t\"sha256\": \"8850e0627a3c934d1a0ee507a2a3ca3a40ba9fbdc835283a05f835cc8ba0c608\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/fontconfig/libfontconfig1_2.15.0-2.3_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.15.0-2.3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libfreetype6_2.13.3-p-dfsg-1_ppc64el\",\n\t\t\t\"name\": \"libfreetype6\",\n\t\t\t\"sha256\": \"23ebc1c4388cd9610049a933c609daf7e36be2ce2610e6d7a6214fdccbfe4173\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/freetype/libfreetype6_2.13.3+dfsg-1_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.13.3+dfsg-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libglib2.0-0t64_2.84.4-3_deb13u2_ppc64el\",\n\t\t\t\"name\": \"libglib2.0-0t64\",\n\t\t\t\"sha256\": \"1f5efffa7a48ec7154c78820751c467a9e38a699135280a2c96d6e342ab38bdf\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glib2.0/libglib2.0-0t64_2.84.4-3~deb13u2_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.84.4-3~deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgraphite2-3_1.3.14-2-p-b1_ppc64el\",\n\t\t\t\"name\": \"libgraphite2-3\",\n\t\t\t\"sha256\": \"10ba655d80e1b67a34ff3a2de16dd4f25a210c0e83d460637c912deea40d46fc\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/graphite2/libgraphite2-3_1.3.14-2+b1_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.3.14-2+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libharfbuzz0b_10.2.0-1-p-b1_ppc64el\",\n\t\t\t\"name\": \"libharfbuzz0b\",\n\t\t\t\"sha256\": \"4b202116b68a726b3df0d0e5cfc5e60fc041c185dbf1dc075bf8df0620c652fe\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/h/harfbuzz/libharfbuzz0b_10.2.0-1+b1_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"10.2.0-1+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libjpeg62-turbo_1-2.1.5-4_ppc64el\",\n\t\t\t\"name\": \"libjpeg62-turbo\",\n\t\t\t\"sha256\": \"e64e9c819ae310538e8e8273784c291cd347a6ecf8f52fa1cbc36b5c3f20399b\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.1.5-4_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:2.1.5-4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"liblcms2-2_2.16-2_ppc64el\",\n\t\t\t\"name\": \"liblcms2-2\",\n\t\t\t\"sha256\": \"b21cfab91854a77e643cdf7b6bc8cbb9b6d42663a21f5638a68cd9e12e104e00\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/l/lcms2/liblcms2-2_2.16-2_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.16-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libpcre2-8-0_10.46-1_deb13u1_ppc64el\",\n\t\t\t\"name\": \"libpcre2-8-0\",\n\t\t\t\"sha256\": \"9c78fe76ba1f39cc2a2bec4182fb816606b7d4e217b2c8c7d46e2b4ab335f92b\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/pcre2/libpcre2-8-0_10.46-1~deb13u1_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"10.46-1~deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libpng16-16t64_1.6.48-1-p-deb13u3_ppc64el\",\n\t\t\t\"name\": \"libpng16-16t64\",\n\t\t\t\"sha256\": \"863897dcd7be77a7bb88d883a1506454c85d06254cc37f4ed405c85e806cd091\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian-security/20260314T202839Z/pool/updates/main/libp/libpng1.6/libpng16-16t64_1.6.48-1+deb13u3_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.6.48-1+deb13u3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libuuid1_2.41-5_ppc64el\",\n\t\t\t\"name\": \"libuuid1\",\n\t\t\t\"sha256\": \"7600e5c742c0231bbbd91f37304bc7a19855984de6313886ea4f09ef2fced4be\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/u/util-linux/libuuid1_2.41-5_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"zlib1g_1-1.3.dfsg-p-really1.3.1-1-p-b1_ppc64el\",\n\t\t\t\"name\": \"zlib1g\",\n\t\t\t\"sha256\": \"f526e830310db11983cf51cfde95a74bc449a7bdc44b6ce68827d78802f1b4ae\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/z/zlib/zlib1g_1.3.dfsg+really1.3.1-1+b1_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:1.3.dfsg+really1.3.1-1+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"gcc-14-base_14.2.0-19_ppc64el\",\n\t\t\t\"name\": \"gcc-14-base\",\n\t\t\t\"sha256\": \"ebb80291fedd8db88488eef76573df0b4a1a11648a16406d9a0c0d4aaf229593\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/gcc-14-base_14.2.0-19_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgcc-s1_14.2.0-19_ppc64el\",\n\t\t\t\"name\": \"libgcc-s1\",\n\t\t\t\"sha256\": \"9fef01c88bc508ff05ff9ce5d0cc05de36798591e060b07749c3835616ed5696\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libgcc-s1_14.2.0-19_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"ppc64el\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libstdc-p--p-6_14.2.0-19_ppc64el\",\n\t\t\t\"name\": \"libstdc++6\",\n\t\t\t\"sha256\": \"ee601ab87b7c7ac01f3d7be0fe2423f0ddc3a51b46d3331b4e9dff4110e6a8b9\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libstdc++6_14.2.0-19_ppc64el.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"fontconfig-config_2.15.0-2.3_riscv64\",\n\t\t\t\"name\": \"fontconfig-config\",\n\t\t\t\"sha256\": \"4fd18a83b8d86f3493ad7ab714a77bfdb18ca19139168aea7161231a420963b5\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/fontconfig/fontconfig-config_2.15.0-2.3_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.15.0-2.3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"fonts-dejavu-core_2.37-8_riscv64\",\n\t\t\t\"name\": \"fonts-dejavu-core\",\n\t\t\t\"sha256\": \"86635b3d25b3655fc11cb3ecc3af59f0bf19643b02b94f2de48bd10253cdba12\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/fonts-dejavu/fonts-dejavu-core_2.37-8_all.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.37-8\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libbrotli1_1.1.0-2-p-b7_riscv64\",\n\t\t\t\"name\": \"libbrotli1\",\n\t\t\t\"sha256\": \"c18cc200551f11cc2e22514c1625c12e83a2c4155ddee78f77fb1f2c26fe3c6a\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/brotli/libbrotli1_1.1.0-2+b7_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.1.0-2+b7\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libbz2-1.0_1.0.8-6_riscv64\",\n\t\t\t\"name\": \"libbz2-1.0\",\n\t\t\t\"sha256\": \"27c7937eb4d2e314e1f0a57a99a20c141c55f720e5ee93d2244de432fd247a55\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-6_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.0.8-6\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libcrypt1_1-4.4.38-1_riscv64\",\n\t\t\t\"name\": \"libcrypt1\",\n\t\t\t\"sha256\": \"85ae0d868b2a27043249ca332dac782a1a67e3171139b0f57d63414eaf4ec887\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libx/libxcrypt/libcrypt1_4.4.38-1_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:4.4.38-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libexpat1_2.7.1-2_riscv64\",\n\t\t\t\"name\": \"libexpat1\",\n\t\t\t\"sha256\": \"73d5d2aae20867ccd38d92e68f04ec63887964d1704836a6e3ee550142218b76\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/e/expat/libexpat1_2.7.1-2_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.7.1-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libfontconfig1_2.15.0-2.3_riscv64\",\n\t\t\t\"name\": \"libfontconfig1\",\n\t\t\t\"sha256\": \"dc06597ba8578cccf2e39ef1aa0cb281e805b3c51588ffa185dc83d5d5fa8a89\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/fontconfig/libfontconfig1_2.15.0-2.3_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.15.0-2.3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libfreetype6_2.13.3-p-dfsg-1_riscv64\",\n\t\t\t\"name\": \"libfreetype6\",\n\t\t\t\"sha256\": \"60f12a364d14006ac3db690d48bfb612aad9a63b7a48c984b46d64d5c8efd7d1\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/f/freetype/libfreetype6_2.13.3+dfsg-1_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.13.3+dfsg-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libglib2.0-0t64_2.84.4-3_deb13u2_riscv64\",\n\t\t\t\"name\": \"libglib2.0-0t64\",\n\t\t\t\"sha256\": \"871f0878240b26721d952d348fdb76b4bcc31ef97a65260e40fd5ae6d5a8040a\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glib2.0/libglib2.0-0t64_2.84.4-3~deb13u2_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.84.4-3~deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgraphite2-3_1.3.14-2-p-b1_riscv64\",\n\t\t\t\"name\": \"libgraphite2-3\",\n\t\t\t\"sha256\": \"e53a9debf6b8e2fafe9d22952c3a6de720b318ff592ef67dc354c748c810ba40\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/graphite2/libgraphite2-3_1.3.14-2+b1_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.3.14-2+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libharfbuzz0b_10.2.0-1-p-b1_riscv64\",\n\t\t\t\"name\": \"libharfbuzz0b\",\n\t\t\t\"sha256\": \"1982c5b99ec2ed7dff65482ad816966dbffb35818a81ddb453b226d48cee2c0b\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/h/harfbuzz/libharfbuzz0b_10.2.0-1+b1_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"10.2.0-1+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libjpeg62-turbo_1-2.1.5-4_riscv64\",\n\t\t\t\"name\": \"libjpeg62-turbo\",\n\t\t\t\"sha256\": \"859970b9a4379c1cdef6127fcdc21fd6a445f0188e9bd8a35199d2d6bcd49a3b\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.1.5-4_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:2.1.5-4\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"liblcms2-2_2.16-2_riscv64\",\n\t\t\t\"name\": \"liblcms2-2\",\n\t\t\t\"sha256\": \"9bebcd4f35358b340c3c4b2006df7cbf0bc7461ddfbae3d9f3ce7ce5c095b4e0\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/l/lcms2/liblcms2-2_2.16-2_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.16-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libpcre2-8-0_10.46-1_deb13u1_riscv64\",\n\t\t\t\"name\": \"libpcre2-8-0\",\n\t\t\t\"sha256\": \"862091023de3e70cf4e4f80347e54873800169a2f39d8111f5faa6c7a7f5009c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/pcre2/libpcre2-8-0_10.46-1~deb13u1_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"10.46-1~deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libpng16-16t64_1.6.48-1-p-deb13u3_riscv64\",\n\t\t\t\"name\": \"libpng16-16t64\",\n\t\t\t\"sha256\": \"257a8ed3ba11a471764ef20a0b12b46c6c70f41277dad4d56f5886d82da013fd\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian-security/20260314T202839Z/pool/updates/main/libp/libpng1.6/libpng16-16t64_1.6.48-1+deb13u3_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.6.48-1+deb13u3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libuuid1_2.41-5_riscv64\",\n\t\t\t\"name\": \"libuuid1\",\n\t\t\t\"sha256\": \"01e0da9223fe9963270227f532f1bb57c01013ede0411710836181ab72192839\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/u/util-linux/libuuid1_2.41-5_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"zlib1g_1-1.3.dfsg-p-really1.3.1-1-p-b1_riscv64\",\n\t\t\t\"name\": \"zlib1g\",\n\t\t\t\"sha256\": \"38c52eef58e5fc9b13d93f8a7d0a0549c32b4f00402a778d39a135254f554314\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/z/zlib/zlib1g_1.3.dfsg+really1.3.1-1+b1_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:1.3.dfsg+really1.3.1-1+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"gcc-14-base_14.2.0-19_riscv64\",\n\t\t\t\"name\": \"gcc-14-base\",\n\t\t\t\"sha256\": \"bb871e84c5c108463fa6a858e72f15cbf809f3888442b89941fc625449874206\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/gcc-14-base_14.2.0-19_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgcc-s1_14.2.0-19_riscv64\",\n\t\t\t\"name\": \"libgcc-s1\",\n\t\t\t\"sha256\": \"16d3f9f534028615413d23f649e5d246baef48fe7db739ad564ef8b9a6e5587c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libgcc-s1_14.2.0-19_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"riscv64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libstdc-p--p-6_14.2.0-19_riscv64\",\n\t\t\t\"name\": \"libstdc++6\",\n\t\t\t\"sha256\": \"f285313f34e0d8f65463c669fac8eb29760a3f3fd6459005dd3110cdd2b10fd7\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/gcc-14/libstdc++6_14.2.0-19_riscv64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"14.2.0-19\"\n\t\t}\n\t],\n\t\"version\": 1\n}"
  },
  {
    "path": "private/repos/deb/trixie_java.yaml",
    "content": "# debian 13, limited architectures, java only\nversion: 1\n\nsources:\n  - channel: trixie main\n    url: https://snapshot.debian.org/archive/debian/20260314T202839Z\n  - channel: trixie-updates main\n    url: https://snapshot.debian.org/archive/debian/20260314T202839Z\n  - channel: trixie-security main\n    url: https://snapshot.debian.org/archive/debian-security/20260314T202839Z\n\narchs:\n  - amd64\n  - arm64\n  - s390x\n  - ppc64el\n  - riscv64\n\npackages:\n  - fontconfig-config\n  - fonts-dejavu-core\n  - libbrotli1\n  - libbz2-1.0\n  - libcrypt1 # TODO: glibc library for -lcrypt; maybe should be in cc?\n  - libexpat1\n  - libfontconfig1\n  - libfreetype6\n  - libglib2.0-0t64\n  - libgraphite2-3\n  - libharfbuzz0b\n  - libjpeg62-turbo\n  - liblcms2-2\n  - libpcre2-8-0\n  - libpng16-16t64\n  - libuuid1\n  - zlib1g\n  # java image builds off base (not cc)\n  - gcc-14-base\n  - libgcc-s1\n  - libstdc++6\n"
  },
  {
    "path": "private/repos/deb/trixie_python.lock.json",
    "content": "{\n\t\"packages\": [\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libbz2-1.0_1.0.8-6_amd64\",\n\t\t\t\"name\": \"libbz2-1.0\",\n\t\t\t\"sha256\": \"cba4cda04244b5e481bb15524bc3c983a7d1b6f330013b9b381706a2fcb65310\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-6_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.0.8-6\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libcom-err2_1.47.2-3-p-b10_amd64\",\n\t\t\t\"name\": \"libcom-err2\",\n\t\t\t\"sha256\": \"a130de40aba78abeea8c9db49a26457ba74ef5c6194c9da3018935a088269397\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/e/e2fsprogs/libcom-err2_1.47.2-3+b10_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.47.2-3+b10\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libcrypt1_1-4.4.38-1_amd64\",\n\t\t\t\"name\": \"libcrypt1\",\n\t\t\t\"sha256\": \"0ebc144d662e3197982d1bf3a7b8b35ca845e54c68811de0328b1f0d7c67585c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libx/libxcrypt/libcrypt1_4.4.38-1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:4.4.38-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libdb5.3t64_5.3.28-p-dfsg2-9_amd64\",\n\t\t\t\"name\": \"libdb5.3t64\",\n\t\t\t\"sha256\": \"18d02510ee78b67e4504ba050176797a200ff24214a7cd318082ab60ad7bf3fc\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/d/db5.3/libdb5.3t64_5.3.28+dfsg2-9_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"5.3.28+dfsg2-9\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libexpat1_2.7.1-2_amd64\",\n\t\t\t\"name\": \"libexpat1\",\n\t\t\t\"sha256\": \"f875f56675be5b074da877f9a93b09d47dc2eb4e679951d36e2943b8d4843344\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/e/expat/libexpat1_2.7.1-2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.7.1-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc-bin_2.41-12-p-deb13u2_amd64\",\n\t\t\t\"name\": \"libc-bin\",\n\t\t\t\"sha256\": \"e30df1bcd947889cd96b5a094e0bf6be6acb4d6d7d2b6def0507f36b432916be\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc-bin_2.41-12+deb13u2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-12+deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libffi8_3.4.8-2_amd64\",\n\t\t\t\"name\": \"libffi8\",\n\t\t\t\"sha256\": \"0ebdc340de33333639c3c63874cd4b15ac2e83dfa1ef3053b7eefaf4919f4f68\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libf/libffi/libffi8_3.4.8-2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.4.8-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgssapi-krb5-2_1.21.3-5_amd64\",\n\t\t\t\"name\": \"libgssapi-krb5-2\",\n\t\t\t\"sha256\": \"53678c63919fc717816941947a9d275be8d6cb101a3753ae8fda0cf6e752d9d7\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/krb5/libgssapi-krb5-2_1.21.3-5_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.21.3-5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libk5crypto3_1.21.3-5_amd64\",\n\t\t\t\"name\": \"libk5crypto3\",\n\t\t\t\"sha256\": \"3368c4b8fd7f0172ba0f1cbd31d150d9ab3c67cc3f4bc3a4c77d895ade0701c4\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/krb5/libk5crypto3_1.21.3-5_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.21.3-5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libkeyutils1_1.6.3-6_amd64\",\n\t\t\t\"name\": \"libkeyutils1\",\n\t\t\t\"sha256\": \"0b11ad17be0300b63ad4eeb4c6450fed24d34b7b740f23e5363dcb29ee6d5eba\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/keyutils/libkeyutils1_1.6.3-6_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.6.3-6\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libkrb5-3_1.21.3-5_amd64\",\n\t\t\t\"name\": \"libkrb5-3\",\n\t\t\t\"sha256\": \"7e286fff31330a174a0df0ddfee19e388d7b1825f684aa55a3b62bcab5737c9a\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/krb5/libkrb5-3_1.21.3-5_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.21.3-5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libkrb5support0_1.21.3-5_amd64\",\n\t\t\t\"name\": \"libkrb5support0\",\n\t\t\t\"sha256\": \"15254b79d38d3f3abdc9385ccd56e0a84fc67738ec5af1fcd5e2723b0ef38b92\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/krb5/libkrb5support0_1.21.3-5_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.21.3-5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"liblzma5_5.8.1-1_amd64\",\n\t\t\t\"name\": \"liblzma5\",\n\t\t\t\"sha256\": \"3a4b863e62478b1895909c5d3b719da0395d6fe6da46f2218db2b0436e0fe892\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/x/xz-utils/liblzma5_5.8.1-1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"5.8.1-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libncursesw6_6.5-p-20250216-2_amd64\",\n\t\t\t\"name\": \"libncursesw6\",\n\t\t\t\"sha256\": \"47baa2e11579583654583a066b69bd5a5d2f22423081f707ed6c0c3ba6d538b7\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/ncurses/libncursesw6_6.5+20250216-2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.5+20250216-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libnsl2_1.3.0-3-p-b3_amd64\",\n\t\t\t\"name\": \"libnsl2\",\n\t\t\t\"sha256\": \"f1f11fc62a44cc8ca0fee6cf032b56d3554ea7355b300538b01085ee624f09dc\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libn/libnsl/libnsl2_1.3.0-3+b3_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.3.0-3+b3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libpython3.13-minimal_3.13.5-2_amd64\",\n\t\t\t\"name\": \"libpython3.13-minimal\",\n\t\t\t\"sha256\": \"d4972bf4b407236b1751e2346bfdd92848c224f6117992a1b13cbffeb91ad3cb\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/python3.13/libpython3.13-minimal_3.13.5-2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.13.5-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libpython3.13-stdlib_3.13.5-2_amd64\",\n\t\t\t\"name\": \"libpython3.13-stdlib\",\n\t\t\t\"sha256\": \"b05308cc6697b2b93e3504c25638abc4c2b0d1293b626a265aca2dbc5bd2eea4\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/python3.13/libpython3.13-stdlib_3.13.5-2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.13.5-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libreadline8t64_8.2-6_amd64\",\n\t\t\t\"name\": \"libreadline8t64\",\n\t\t\t\"sha256\": \"eeadf2b5e755c9f183883feea2d9b5b28560284275d5f54d3e55d0923b1d0967\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/r/readline/libreadline8t64_8.2-6_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"8.2-6\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libsqlite3-0_3.46.1-7-p-deb13u1_amd64\",\n\t\t\t\"name\": \"libsqlite3-0\",\n\t\t\t\"sha256\": \"edeacbdd6a86ee82d314dccc180b740905fd7f6392b72e5c0533079fda449361\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/s/sqlite3/libsqlite3-0_3.46.1-7+deb13u1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.46.1-7+deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libtinfo6_6.5-p-20250216-2_amd64\",\n\t\t\t\"name\": \"libtinfo6\",\n\t\t\t\"sha256\": \"8b9f6a7983e9418564e48a627518de4c03917b56efe68d7f3e93bd8fffa1cc10\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/ncurses/libtinfo6_6.5+20250216-2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.5+20250216-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libtirpc3t64_1.3.6-p-ds-1_amd64\",\n\t\t\t\"name\": \"libtirpc3t64\",\n\t\t\t\"sha256\": \"ef4536c09bf5063554310e22d586ae90990100ba66d2fe7c35660e9e658913b6\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libt/libtirpc/libtirpc3t64_1.3.6+ds-1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.3.6+ds-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libuuid1_2.41-5_amd64\",\n\t\t\t\"name\": \"libuuid1\",\n\t\t\t\"sha256\": \"10247744737c1bb574f9667b3f06a3b43a5055c67bdfcc1945803451cc036db3\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/u/util-linux/libuuid1_2.41-5_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"python3.13-venv_3.13.5-2_amd64\",\n\t\t\t\"name\": \"python3.13-venv\",\n\t\t\t\"sha256\": \"15138cb3306f06a2d336eabe563f6aeda9e42453261090f70ef32afaff40c425\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/python3.13/python3.13-venv_3.13.5-2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.13.5-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"python3.13-minimal_3.13.5-2_amd64\",\n\t\t\t\"name\": \"python3.13-minimal\",\n\t\t\t\"sha256\": \"d2d51b516de9e9b9fb6f7c4411deb3dd049b81eca400087c3457bc85c026eca8\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/python3.13/python3.13-minimal_3.13.5-2_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.13.5-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"amd64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"zlib1g_1-1.3.dfsg-p-really1.3.1-1-p-b1_amd64\",\n\t\t\t\"name\": \"zlib1g\",\n\t\t\t\"sha256\": \"015be740d6236ad114582dea500c1d907f29e16d6db00566ca32fb68d71ac90d\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/z/zlib/zlib1g_1.3.dfsg+really1.3.1-1+b1_amd64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:1.3.dfsg+really1.3.1-1+b1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libbz2-1.0_1.0.8-6_arm64\",\n\t\t\t\"name\": \"libbz2-1.0\",\n\t\t\t\"sha256\": \"3537fe4fc577a60c8a9568873cd577db7ebc135eb8bb1825f18caf8972d9d2f2\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-6_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.0.8-6\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libcom-err2_1.47.2-3-p-b10_arm64\",\n\t\t\t\"name\": \"libcom-err2\",\n\t\t\t\"sha256\": \"1b525834224b1fdfcc817f2a5a199a001de4ca4ea627f81ebd666798fe351ae1\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/e/e2fsprogs/libcom-err2_1.47.2-3+b10_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.47.2-3+b10\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libcrypt1_1-4.4.38-1_arm64\",\n\t\t\t\"name\": \"libcrypt1\",\n\t\t\t\"sha256\": \"b9aaa808aa3812b3de3e54eb5dfb16762c1779db032604abef2354c02fdc29b8\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libx/libxcrypt/libcrypt1_4.4.38-1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:4.4.38-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libdb5.3t64_5.3.28-p-dfsg2-9_arm64\",\n\t\t\t\"name\": \"libdb5.3t64\",\n\t\t\t\"sha256\": \"bfef56508d69fd3f940668f6abd0a466a362cabf63c4cc1c787cc58d28f6e92f\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/d/db5.3/libdb5.3t64_5.3.28+dfsg2-9_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"5.3.28+dfsg2-9\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libexpat1_2.7.1-2_arm64\",\n\t\t\t\"name\": \"libexpat1\",\n\t\t\t\"sha256\": \"7f6868227f4893a11123e43b9ed291950b550c7dc209905b2fb871c74678d1bf\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/e/expat/libexpat1_2.7.1-2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.7.1-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libc-bin_2.41-12-p-deb13u2_arm64\",\n\t\t\t\"name\": \"libc-bin\",\n\t\t\t\"sha256\": \"c533ba20b97e8cec1ad816936043e7c2cfa24e724e13e99eaa66cad74fbff0c8\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/g/glibc/libc-bin_2.41-12+deb13u2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-12+deb13u2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libffi8_3.4.8-2_arm64\",\n\t\t\t\"name\": \"libffi8\",\n\t\t\t\"sha256\": \"d84a783b818f2386627604e64b793eb4ac5bb9ea1ba321a194a1c9c82fe09a01\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libf/libffi/libffi8_3.4.8-2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.4.8-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libgssapi-krb5-2_1.21.3-5_arm64\",\n\t\t\t\"name\": \"libgssapi-krb5-2\",\n\t\t\t\"sha256\": \"99fd6203890ac144ba9907fefb76c84e733f17f31853af8c312c16d5c077c351\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/krb5/libgssapi-krb5-2_1.21.3-5_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.21.3-5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libk5crypto3_1.21.3-5_arm64\",\n\t\t\t\"name\": \"libk5crypto3\",\n\t\t\t\"sha256\": \"5ed29027bb77365ecbf4e1b54701cf802871e0a82c08f29c4177057e08d5469a\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/krb5/libk5crypto3_1.21.3-5_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.21.3-5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libkeyutils1_1.6.3-6_arm64\",\n\t\t\t\"name\": \"libkeyutils1\",\n\t\t\t\"sha256\": \"5e680f317a6613161986417fb3ed63007c9228343f5ac2348551b103cc7fd7b4\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/keyutils/libkeyutils1_1.6.3-6_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.6.3-6\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libkrb5-3_1.21.3-5_arm64\",\n\t\t\t\"name\": \"libkrb5-3\",\n\t\t\t\"sha256\": \"0f8d4555b39483ac003814b6f9b9d312dca4492ff4b34b084745b01dac514b4d\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/krb5/libkrb5-3_1.21.3-5_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.21.3-5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libkrb5support0_1.21.3-5_arm64\",\n\t\t\t\"name\": \"libkrb5support0\",\n\t\t\t\"sha256\": \"2c7bb86d48262263b0c1df9bc45e9330aaa32bcd1a8860c2e0be25fc4cb14053\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/k/krb5/libkrb5support0_1.21.3-5_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.21.3-5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"liblzma5_5.8.1-1_arm64\",\n\t\t\t\"name\": \"liblzma5\",\n\t\t\t\"sha256\": \"cf6dcb3a8ee0b86c4f021c7dc07458fe6db6686c1d4e7b12217cecd2a80a40b9\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/x/xz-utils/liblzma5_5.8.1-1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"5.8.1-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libncursesw6_6.5-p-20250216-2_arm64\",\n\t\t\t\"name\": \"libncursesw6\",\n\t\t\t\"sha256\": \"72121aeb08be2d915da321ddfae74f62a0764286f336279b2c2609ba07496d6d\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/ncurses/libncursesw6_6.5+20250216-2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.5+20250216-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libnsl2_1.3.0-3-p-b3_arm64\",\n\t\t\t\"name\": \"libnsl2\",\n\t\t\t\"sha256\": \"9d7f225630711e67d0159f7f05763e76e752fa7b36b39f59d72204a59940d3ca\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libn/libnsl/libnsl2_1.3.0-3+b3_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.3.0-3+b3\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libpython3.13-minimal_3.13.5-2_arm64\",\n\t\t\t\"name\": \"libpython3.13-minimal\",\n\t\t\t\"sha256\": \"e1fbde71bf7f0de82a70c0a7bc6e1100fd7001b90ce36b4f346476a5b671b5e6\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/python3.13/libpython3.13-minimal_3.13.5-2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.13.5-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libpython3.13-stdlib_3.13.5-2_arm64\",\n\t\t\t\"name\": \"libpython3.13-stdlib\",\n\t\t\t\"sha256\": \"80364ce9f7f1efefc6e4aed73793fa21040b86b17fd1c51f7a7b1fd9e16c0157\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/python3.13/libpython3.13-stdlib_3.13.5-2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.13.5-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libreadline8t64_8.2-6_arm64\",\n\t\t\t\"name\": \"libreadline8t64\",\n\t\t\t\"sha256\": \"f78ff432b2a627bc04f7eef0e6e2696501c9e06feca748a5b741d5e594429033\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/r/readline/libreadline8t64_8.2-6_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"8.2-6\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libsqlite3-0_3.46.1-7-p-deb13u1_arm64\",\n\t\t\t\"name\": \"libsqlite3-0\",\n\t\t\t\"sha256\": \"69dd4b705eca29fe134c17f18aaa4cc9e7ecd01c0250d5e195358801514c76ac\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/s/sqlite3/libsqlite3-0_3.46.1-7+deb13u1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.46.1-7+deb13u1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libtinfo6_6.5-p-20250216-2_arm64\",\n\t\t\t\"name\": \"libtinfo6\",\n\t\t\t\"sha256\": \"2a747f7fff3c2347c357387a7133df997410f07ba1b1df1a1461a97bd7fbc2fc\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/n/ncurses/libtinfo6_6.5+20250216-2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"6.5+20250216-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libtirpc3t64_1.3.6-p-ds-1_arm64\",\n\t\t\t\"name\": \"libtirpc3t64\",\n\t\t\t\"sha256\": \"ae390ce96435829f0d5252305fb9b22001f5bcc85477e452373ddb2a4fa4dbc1\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/libt/libtirpc/libtirpc3t64_1.3.6+ds-1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1.3.6+ds-1\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"libuuid1_2.41-5_arm64\",\n\t\t\t\"name\": \"libuuid1\",\n\t\t\t\"sha256\": \"85b7d04605f9d423d5699b3c07f027e8380649fd164a51e0712cded0cc56eced\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/u/util-linux/libuuid1_2.41-5_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"2.41-5\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"python3.13-venv_3.13.5-2_arm64\",\n\t\t\t\"name\": \"python3.13-venv\",\n\t\t\t\"sha256\": \"02d75b0c903efbe5e06ce079ff3967bafd08c621c846d7fe332b71d69de31c4c\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/python3.13/python3.13-venv_3.13.5-2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.13.5-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"python3.13-minimal_3.13.5-2_arm64\",\n\t\t\t\"name\": \"python3.13-minimal\",\n\t\t\t\"sha256\": \"a30123d05bc5f8ffec984efbfd138b3c8719f352797e29e643a7486457473982\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/p/python3.13/python3.13-minimal_3.13.5-2_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"3.13.5-2\"\n\t\t},\n\t\t{\n\t\t\t\"arch\": \"arm64\",\n\t\t\t\"dependencies\": [],\n\t\t\t\"key\": \"zlib1g_1-1.3.dfsg-p-really1.3.1-1-p-b1_arm64\",\n\t\t\t\"name\": \"zlib1g\",\n\t\t\t\"sha256\": \"209aa5cf671e97b9eb0410844fa6df4cae2e75b0c72e7802ab6c8ece13e6ddef\",\n\t\t\t\"urls\": [\n\t\t\t\t\"https://snapshot.debian.org/archive/debian/20260314T202839Z/pool/main/z/zlib/zlib1g_1.3.dfsg+really1.3.1-1+b1_arm64.deb\"\n\t\t\t],\n\t\t\t\"version\": \"1:1.3.dfsg+really1.3.1-1+b1\"\n\t\t}\n\t],\n\t\"version\": 1\n}"
  },
  {
    "path": "private/repos/deb/trixie_python.yaml",
    "content": "# debian 13, limited architectures, python only\nversion: 1\n\nsources:\n  - channel: trixie main\n    url: https://snapshot.debian.org/archive/debian/20260314T202839Z\n  - channel: trixie-updates main\n    url: https://snapshot.debian.org/archive/debian/20260314T202839Z\n  - channel: trixie-security main\n    url: https://snapshot.debian.org/archive/debian-security/20260314T202839Z\n\narchs:\n  - amd64\n  - arm64\n\npackages:\n  - libbz2-1.0\n  - libcom-err2\n  - libcrypt1 # TODO: glibc library for -lcrypt; maybe should be in cc?\n  - libdb5.3t64\n  - libexpat1\n  - libc-bin\n  - libffi8\n  - libgssapi-krb5-2\n  - libk5crypto3\n  - libkeyutils1\n  - libkrb5-3\n  - libkrb5support0\n  - liblzma5\n  - libncursesw6\n  - libnsl2\n  - libpython3.13-minimal\n  - libpython3.13-stdlib\n  - libreadline8t64\n  - libsqlite3-0\n  - libtinfo6\n  - libtirpc3t64\n  - libuuid1\n  - python3.13-venv\n  - python3.13-minimal\n  - zlib1g\n"
  },
  {
    "path": "private/stamp.bash",
    "content": "#!/usr/bin/env bash\nset -o pipefail -o errexit -o nounset\n\n# Do not error if the user doesn't have gcloud installed.\nif [ -z \"${PROJECT_ID:-}\" ]; then\n  if which gcloud > /dev/null; then\n    PROJECT_ID=\"$(gcloud config get-value core/project)\"\n  else\n    # some registries don't allow uppercase chars. we'll use lowercase ones to get meaningful error messages.\n    PROJECT_ID=\"no-project\"\n  fi\nfi\n\necho \"PROJECT_ID ${PROJECT_ID}\"\necho \"COMMIT_SHA ${COMMIT_SHA:-no-commit-sha}\"\necho \"REGISTRY ${REGISTRY:-gcr.io}\""
  },
  {
    "path": "private/tools/diff/BUILD.bazel",
    "content": "sh_binary(\n    name = \"diff\",\n    srcs = [\"diff.bash\"],\n    args = [\n        \"--head-ref\",\n        \"test\",\n        \"--base-ref\",\n        \"test\",\n        \"--report\",\n        \"./report.log\",\n        \"--query-bazel\",\n        \"--registry-spawn-https\",\n        \"--cd-into-workspace\",\n    ],\n)\n"
  },
  {
    "path": "private/tools/diff/diff.bash",
    "content": "#!/usr/bin/env bash\nset -o pipefail -o errexit -o nounset\n\n# ./private/tools/diff/diff.bash --head-ref test --base-ref test --query-bazel --registry-spawn --report ./report.log\n\nSTDERR=$(mktemp)\n\n# Upon exiting, stop the registry and print STDERR on non-zero exit code.\non_exit() {\n    last_exit_code=$?\n    set +o errexit\n    if [[ $last_exit_code != 0 ]]; then\n        echo \"\"\n        echo \"💥 Something went wrong.\"\n        if [[ $(wc -c <\"${STDERR}\") -gt 0 ]]; then\n            echo \"\"\n            echo \"Here's the STDERR:\"\n            echo \"\"\n            cat $STDERR\n        fi\n    fi\n    pkill -P $$\n}\ntrap \"on_exit\" EXIT\n\nPID=\nHEAD_REF=\nBASE_REF=\nQUERY_FILE=\nREPORT_FILE=\nREGISTRY=\nJOBS=\nSTDERR=$(mktemp)\nCHANGED_IMAGES_FILE=$(mktemp)\nSET_GITHUB_OUTPUT=\"0\"\nONLY=\nSKIP_INDEX=\"0\"\n\nwhile (($# > 0)); do\n    case $1 in\n    --base-ref)\n        BASE_REF=\"$2\"\n        shift 2\n        ;;\n    --head-ref)\n        HEAD_REF=\"$2\"\n        shift 2\n        ;;\n    --registry)\n        REGISTRY=\"$2\"\n        shift 2\n        ;;\n    --registry-spawn)\n        REGISTRY=\"spawn\"\n        shift\n        ;;\n    --registry-spawn-https)\n        REGISTRY=\"spawn_https\"\n        shift\n        ;;\n    --query)\n        QUERY_FILE=\"$2\"\n        shift 2\n        ;;\n    --query-bazel)\n        QUERY_FILE=\"bazel\"\n        shift\n        ;;\n    --report)\n        REPORT_FILE=\"$2\"\n        shift 2\n        ;;\n    --set-github-output-on-diff)\n        SET_GITHUB_OUTPUT=\"1\"\n        echo \"changed_targets=\" >> \"$GITHUB_OUTPUT\"\n        shift\n        ;;\n    --jobs)\n        JOBS=\"$2\"\n        shift 2\n        ;;\n    --logs)\n        STDERR=\"$2\"\n        shift 2\n        ;;\n    --only)\n        ONLY=\"$2\"\n        shift 2\n        ;;\n    --cd-into-workspace)\n        cd $BUILD_WORKSPACE_DIRECTORY\n        shift\n        ;;\n    --skip-image-index)\n        SKIP_INDEX=\"1\"\n        shift\n        ;;\n    *)\n        echo \"unknown arg $1\"\n        exit 1\n        ;;\n    esac\ndone\n\nif [[ -z \"${REGISTRY}\" ]]; then\n    echo \"--registry is required.\"\n    exit 1\nfi\n\nif [[ -z \"${BASE_REF}\" ]]; then\n    echo \"--base-ref is required.\"\n    exit 1\nfi\n\nif [[ -z \"${HEAD_REF}\" ]]; then\n    echo \"--head-ref is required.\"\n    exit 1\nfi\n\nif [[ -z \"${QUERY_FILE}\" ]]; then\n    echo \"--query or --query-bazel must be provided\"\n    exit 1\nfi\n\n# Redirect stderr to the $STDERR temp file for the rest of the script.\nexec 2>>\"${STDERR}\"\n\nDISK_STORAGE=\"/tmp/diff-storage\"\n\nif [[ \"${QUERY_FILE}\" == \"bazel\" ]]; then\n    bazel build :sign_and_push.query\n    QUERY_FILE=$(bazel cquery --output=files :sign_and_push.query)\nfi\n\nif [[ \"${REGISTRY}\" == \"spawn_https\" ]]; then\n    # Make a self signed cert\n    rm -f /tmp/localhost.pem /tmp/localhost-key.pem\n    rm -rf $DISK_STORAGE\n    mkcert -install\n    (cd /tmp && mkcert localhost)\n    echo '{\n        \"http\":{\n            \"address\":\"127.0.0.1\", \"port\":\"4564\",\n            \"tls\": {\n                \"cert\":\"/tmp/localhost.pem\",\n                \"key\":\"/tmp/localhost-key.pem\"\n            }\n        },\n        \"log\": { \"level\": \"info\" },\n        \"storage\":{\"rootDirectory\":\"/tmp/diff-storage\"}\n    }' >/tmp/cfg.json\n    REGISTRY=\"localhost:4564\"\n    zot serve /tmp/cfg.json 1>&2 &\n    sleep 1\nfi\n\nif [[ \"${REGISTRY}\" == \"spawn\" ]]; then\n    rm -rf $DISK_STORAGE\n    mkdir $DISK_STORAGE\n    REGISTRY=\"localhost:4564\"\n    crane registry serve --address \"$REGISTRY\" --disk \"$DISK_STORAGE\" &\nfi\n\nstamp_stage() {\n    local str=\"$1\"\n    str=${str/\"{COMMIT_SHA}\"/\"${HEAD_REF}\"}\n    str=${str/\"{REGISTRY}\"/\"${REGISTRY}\"}\n    echo ${str/\"{PROJECT_ID}\"/\"stage\"}\n}\n\nstamp_origin() {\n    local str=$1\n    str=${str/\"{COMMIT_SHA}\"/\"${BASE_REF}\"}\n    str=${str/\"{REGISTRY}\"/\"gcr.io\"}\n    echo ${str/\"{PROJECT_ID}\"/\"distroless\"}\n}\n\nfunction test_image() {\n    IFS=\" \" read -r repo image_label <<<\"$1\"\n\n    if [[ \"${ONLY}\" != \"\" && \"${ONLY}\" != \"$image_label\" ]]; then\n        return \n    fi\n\n    repo_origin=$(stamp_origin \"$repo\")\n    repo_stage=$(stamp_stage \"$repo\")\n\n    if ! crane manifest \"$repo_origin\" > /dev/null; then\n        echo \"🆕 New image will be added to $repo_origin\"\n        if [[ \"${SET_GITHUB_OUTPUT}\" == \"1\" ]]; then\n            echo \"$image_label (new)\" >> \"$CHANGED_IMAGES_FILE\"\n        fi\n        return\n    fi\n\n    if [[ \"${SKIP_INDEX}\" == \"1\" ]]; then\n        if ! crane manifest \"$repo_origin\" | jq -e '.mediaType == \"application/vnd.oci.image.manifest.v1+json\"' > /dev/null; then  \n            echo \"⏭️ Skipping image index $repo_origin\"\n            return\n        fi\n    fi\n\n    echo \"\"\n    echo \"🚧 Diffing $repo_origin against $repo_stage\"\n    echo \"\"\n\n    bazel build \"$image_label\"\n    crane push \"$(bazel cquery --output=files $image_label)\" \"$repo_stage\"\n    if ! diffoci diff --pull=always --all-platforms \"$repo_origin\" \"$repo_stage\"; then\n        echo \"\"\n        echo \"      🔬 To reproduce: bazel run //private/tools/diff:diff -- --only $image_label\"\n        echo \"\"\n        echo \"👎 $repo_origin and $repo_stage are different.\"\n        if [[ \"${SET_GITHUB_OUTPUT}\" == \"1\" ]]; then\n            echo \"$image_label\" >> \"$CHANGED_IMAGES_FILE\"\n        fi\n    else\n        echo \"\"\n        echo \"👍 $repo_origin and $repo_stage are identical.\"\n    fi\n}\n\nif [[ -n \"${REPORT_FILE}\" ]]; then\n    echo \"Report can be found in: $REPORT_FILE\"\n    echo -n \"\" >$REPORT_FILE\n    sleep 1\n    # Redirect rest of the file into both report file and stdout\n    exec 1> >(tee -a \"${REPORT_FILE}\")\nfi\n\n# Parallelize using gnu parallel\nif [[ \"${JOBS}\" -gt 0 ]]; then\n    export HEAD_REF BASE_REF REGISTRY REPORT_FILE SET_GITHUB_OUTPUT ONLY CHANGED_IMAGES_FILE SKIP_INDEX\n    export -f stamp_origin stamp_stage test_image\n    cat \"${QUERY_FILE}\" | parallel --eta --progress --jobs \"${JOBS}\" \"set -o pipefail -o errexit -o nounset && test_image\"\nelse\n    while IFS= read -r line || [ -n \"$line\" ]; do\n        test_image \"${line}\"\n    done <\"${QUERY_FILE}\"\nfi\n\nif [[ \"${SET_GITHUB_OUTPUT}\" == \"1\" ]]; then\n    echo \"changed_targets<<EOF\" >> \"$GITHUB_OUTPUT\"\n    cat \"$CHANGED_IMAGES_FILE\" >> \"$GITHUB_OUTPUT\"\n    echo \"EOF\" >> \"$GITHUB_OUTPUT\"\nfi\n"
  },
  {
    "path": "private/tools/lifecycle/BUILD.bazel",
    "content": "\"rules to deal with auto_vm lifecycle tagging\"\n\nexports_files([\"tag.sh\"])\n"
  },
  {
    "path": "private/tools/lifecycle/defs.bzl",
    "content": "load(\":tag.bzl\", _attach_lifecycle_tags = \"attach_lifecycle_tags\")\n\nattach_lifecycle_tags = _attach_lifecycle_tags\n"
  },
  {
    "path": "private/tools/lifecycle/tag.bzl",
    "content": "\"rules for attaching lifecycle tags to older published images\"\n\nload(\"@bazel_skylib//rules:write_file.bzl\", \"write_file\")\n\ndef _tag(ctx):\n    script_file = ctx.executable.script\n\n    runner_script = ctx.actions.declare_file(ctx.label.name + \"_runner.sh\")\n\n    commands = [\"#!/usr/bin/env bash\", \"set -euo pipefail\"]\n    for ref in ctx.attr.targets:\n        commands.append(\"{script} update {ref}\".format(\n            script = script_file.short_path,\n            ref = ref,\n        ))\n\n    ctx.actions.write(\n        output = runner_script,\n        content = \"\\n\".join(commands),\n        is_executable = True,\n    )\n\n    return [\n        DefaultInfo(\n            executable = runner_script,\n            runfiles = ctx.runfiles(files = [script_file]),\n        ),\n        RunEnvironmentInfo(\n            environment = {\"DRY_RUN\": \"false\"},\n            # maybe inherit this, need cloud build testing\n            # inherited_environment = [\"GOOGLE_APPLICATION_CREDENTIALS\"],\n        ),\n    ]\n\ntag = rule(\n    implementation = _tag,\n    attrs = {\n        \"targets\": attr.string_list(),\n        \"script\": attr.label(\n            mandatory = True,\n            allow_single_file = True,\n            executable = True,\n            cfg = \"exec\",\n        ),\n    },\n    executable = True,\n)\n\ndef attach_lifecycle_tags(name, images):\n    \"\"\"simple macro to assign lifecycle tags to older images\n\n    Args:\n        name: name of the target\n        images: a dict where keys are fully qualified image references and values are image label\n    \"\"\"\n\n    all_images = dict()\n\n    for (ref, _) in images.items():\n        repository_and_tag = ref.split(\":\")\n\n        # TODO: have these leverage ../stamp.bash\n        repository = repository_and_tag[0].format(REGISTRY = \"gcr.io\", PROJECT_ID = \"distroless\")\n        all_images[repository] = \"ignored\"\n\n    write_file(\n        name = name + \".query\",\n        content = sorted(all_images.keys()),\n        out = name + \"_query\",\n    )\n\n    tag(\n        name = name,\n        targets = sorted(all_images.keys()),\n        script = Label(\"//private/tools/lifecycle:tag.sh\"),\n    )\n"
  },
  {
    "path": "private/tools/lifecycle/tag.sh",
    "content": "#!/usr/bin/env bash\nset -euo pipefail\n\ntrap 'echo \"Ctrl+C caught, exiting...\"; exit 130' INT\n\nfunction exec_tag() {\n  local image=$1\n  local tag_prefix=$2\n  local -n hashes=$3\n  local count=0\n  local total=\"${#hashes[@]}\"\n  for h in \"${hashes[@]}\"; do\n    local sha256=\"${h#sha256:}\"\n    local img_path=\"${image}@${h}\"\n    local tag=\"${tag_prefix}${sha256}\"\n    echo -n \"tagging $img_path with $tag \"\n    if [[ ${dry_run} == false ]]; then\n      gcrane tag \"$img_path\" \"$tag\" && echo \"SUCCESS $((++count))/$total\" || { echo \"FAILED\"; exit 1; }\n    else\n      echo \"DRY_RUN\"\n    fi\n  done\n}\n\nfunction tag_update() {\n  local tag_prefix=\"update-available-\"\n  local image=\"$1\"\n\n  local NOW\n  local images_json\n\n  NOW=$(date +%s000)\n  images_json=$(gcrane ls \"$image\" --json)\n\n  # get all hashes for images that have no tags (or just the commit hash tag)\n  # jq behavior for all(test(pattern)) matches the empty list []\n  # or are older than 24 hours (we don't want to accidentally mess with any\n  # ongoing builds)\n  readarray -t targets < <(echo \"$images_json\" | jq -r --arg now \"$NOW\" '\n    .manifest | to_entries | sort_by(.value.timeUploadedMs|tonumber) | .[] | select(\n      (.value.tag // [] | all(test(\".*-[a-f0-9]{40}$|^[a-f0-9]{40}$\")))\n      and\n      (($now | tonumber) - (.value.timeUploadedMs | tonumber) > 86400000)\n    ) | .key\n  ');\n  background_pid=$!\n  wait \"$background_pid\"\n\n  echo \"tagging ${#targets[@]} images of $image\"\n\n  exec_tag \"$image\" \"$tag_prefix\" targets\n}\n\nfunction tag_deprecate() {\n  local targets\n  local tag_prefix=\"deprecated-public-image-\"\n  local image=$1\n\n  local images_json\n  images_json=$(gcrane ls \"$image\" --json)\n\n  # get all hashes for all images don't have the deprecated tag\n  # also skip images that already have an update-available tag\n  # this is only for wholesale deprecation of an image, it also\n  # will deprecate all cosign tag based signatures by nature of select(...)\n  # automatically adding deprecation tags to sha256.*(att|sig).\n  readarray -t targets < <(echo \"$images_json\" | jq -r '\n    .manifest | to_entries | sort_by(.value.timeUploadedMs|tonumber) | .[] | select(\n      (.value.tag // [] | all(test(\"deprecated-public-image-[a-f0-9]{64}$\") | not))\n      and\n      (.value.tag // [] | all(test(\"update-available-\") | not))\n    ) | .key\n  ');\n  background_pid=$!\n  wait \"$background_pid\"\n\n  echo \"tagging ${#targets[@]} images of $image\"\n  echo \"1. Careful about builds happening, this doesn't account for them.\"\n  printf \"2. Be sure images are not in the currently supported list at:\\n\\thttps://github.com/GoogleContainerTools/distroless/?tab=readme-ov-file#what-images-are-available\\n\"\n\n  read -r -p \"Continue? [y/N] \" response\n  if [[ ! \"$response\" =~ ^[Yy]$ ]]; then\n    echo \"Aborted.\"\n    exit 1\n  fi\n  exec_tag \"$image\" \"$tag_prefix\" targets\n}\n\ndry_run=${DRY_RUN:-true}\nif [[ \"${dry_run}\" != \"true\" && \"${dry_run}\" != \"false\" ]]; then\n  echo \"Error: DRY_RUN needs to have value (true|false).\"\n  exit 1\nfi\n\nfunction tag() {\n  local tag_mode=$1\n  local image=$2\n  case \"$tag_mode\" in\n    update)\n      tag_update \"$image\"\n      ;;\n    deprecate)\n      tag_deprecate \"$image\"\n      ;;\n    *)\n      echo \"wtf?\"\n      exit 1\n  esac\n}\n\nfunction usage() {\n  echo \"USAGE: $1 [deprecate|update] <image>\" >&2\n  exit 1\n}\n\ncase \"${1:-\"~~nocmd\"}\" in\n  update | deprecate)\n    if [[ \"$#\" -ne 2 ]]; then\n      usage \"$0\"\n    fi\n    tag \"$@\"\n    ;;\n  ~~nocmd | *)\n    usage \"$0\"\n    ;;\nesac\n"
  },
  {
    "path": "private/tools/lifecycle/tag.sh.README.md",
    "content": "# Container Image Lifecycle Tagger (Distroless Admin Tooling)\n\nA Bash utility to bulk-tag container images in a registry. This is particularly useful for marking old images as \"available for update\" or \"deprecated\" without deleting them, allowing for safer cleanup or auditing.\n\n## Prerequisites\n\n* **[gcrane](https://github.com/google/go-containerregistry/tree/main/cmd/gcrane):** Used for interacting with the container registry.\n* **[jq](https://github.com/jqlang/jq/):** Used for parsing registry JSON manifests.\n* **Authentication:** Ensure you are authenticated to your registry (e.g., `gcloud auth configure-docker`).\n\n## Functionality\n\nThe script operates in two primary modes:\n\n### 1. `update` mode\n\nIdentifies images that are \"stale\" but likely safe to mark for replacement. It selects images that:\n\n* Have no tags **OR** only have auto-generated git commit hash based tags (40-character hex strings).\n* Are older than **48 hours** (to avoid interfering with active CI/CD pipelines).\n* **Action:** Tags them with the prefix `update-available-<sha256>`.\n\n### 2. `deprecate` mode\n\nIdentifies images that have not yet been marked as deprecated.\n\n* Selects images that do **not** already have a tag matching the deprecation pattern.\n* **Action:** Tags them with the prefix `deprecated-public-image-<sha256>`.\n* *Note: The execution for this mode is currently commented out in the script as a safety measure.*\n\n---\n\n## Usage\n\n```bash\n./tag.sh [update|deprecate] <image>\n```\n\n### Examples\n\n**Dry Run (Default):**\nBy default, the script only prints what it *would* do.\n\n```bash\n./tag.sh update gcr.io/distroless/python3-debian12\n```\n\n**Live Execution:**\nTo actually apply tags to the registry, set `DRY_RUN` to `false`.\n\n```bash\nDRY_RUN=false ./tag.sh update gcr.io/distroless/python3-debian12\n```\n"
  },
  {
    "path": "private/util/BUILD",
    "content": ""
  },
  {
    "path": "private/util/deb.bzl",
    "content": "\"utility functions for constructing debian package labels\"\n\nload(\"@versions//:versions.bzl\", \"version\")\n\nDIST_ALIAS = dict(\n    # bullseye (deprecated)\n    debian11 = \"bullseye\",\n    bullseye = \"debian11\",\n    # bookworm\n    debian12 = \"bookworm\",\n    bookworm = \"debian12\",\n    # trixie\n    debian13 = \"trixie\",\n    trixie = \"debian13\",\n)\n\nARCH_ALIAS = dict(\n    arm = \"armhf\",\n    ppc64le = \"ppc64el\",\n    arm64 = \"arm64\",\n    amd64 = \"amd64\",\n    s390x = \"s390x\",\n    riscv64 = \"riscv64\",\n)\n\ndef _get_dist_arch_alias(arch, dist, repo_suffix):\n    dist = DIST_ALIAS[dist]\n    arch = ARCH_ALIAS[arch]\n\n    if repo_suffix != None:\n        dist += \"_\" + repo_suffix\n\n    return (arch, dist)\n\ndef _package(arch, dist, package, repo_suffix = None):\n    (arch, dist) = _get_dist_arch_alias(arch, dist, repo_suffix)\n    return \"@{dist}//{package}/{arch}\".format(arch = arch, dist = dist, package = package)\n\ndef _data(arch, dist, package, repo_suffix = None):\n    (arch, dist) = _get_dist_arch_alias(arch, dist, repo_suffix)\n    return \"@{dist}//{package}/{arch}:data\".format(arch = arch, dist = dist, package = package)\n\ndef _version(arch, dist, package, repo_suffix = None):\n    (arch, dist) = _get_dist_arch_alias(arch, dist, repo_suffix)\n    return version(dist, arch, package).raw\n\ndeb = struct(\n    package = _package,\n    data = _data,\n    version = _version,\n)\n"
  },
  {
    "path": "private/util/extract.bzl",
    "content": "\"a utility that extracts files from tar\"\n\nload(\"@aspect_bazel_lib//lib:tar.bzl\", \"tar_lib\")\n\ndef _tar_extract_file_impl(ctx):\n    bsdtar = ctx.toolchains[tar_lib.toolchain_type]\n    parts = ctx.attr.file.split(\"/\")\n    output = ctx.actions.declare_file(\"/\".join([ctx.label.name, parts[-1]]))\n\n    args = ctx.actions.args()\n    args.add(\"--extract\")\n    args.add(\"-C\", \"/\".join([ctx.bin_dir.path, ctx.label.package, ctx.label.name]))\n    args.add(\"--file\", ctx.file.archive)\n    args.add(\"--include\", ctx.attr.file)\n    args.add(\"--strip-components={}\".format(len(parts) - 1))\n\n    ctx.actions.run(\n        executable = bsdtar.tarinfo.binary,\n        inputs = [ctx.file.archive],\n        outputs = [output],\n        tools = bsdtar.default.files,\n        arguments = [args],\n    )\n\n    return [\n        DefaultInfo(files = depset([output])),\n    ]\n\ntar_extract_file = rule(\n    implementation = _tar_extract_file_impl,\n    attrs = {\n        \"archive\": attr.label(allow_single_file = True, mandatory = True),\n        \"file\": attr.string(mandatory = True),\n    },\n    toolchains = [tar_lib.toolchain_type],\n)\n"
  },
  {
    "path": "private/util/java_cacerts.bzl",
    "content": "\"java ca certificates\"\n\nload(\"@rules_distroless//distroless:defs.bzl\", \"java_keystore\")\nload(\":extract.bzl\", \"tar_extract_file\")\n\ndef java_cacerts(name, archive):\n    tar_extract_file(\n        name = name + \"_extract\",\n        archive = archive,\n        file = \"./etc/ssl/certs/ca-certificates.crt\",\n    )\n\n    java_keystore(\n        name = name,\n        certificates = [\n            \":\" + name + \"_extract\",\n        ],\n    )\n"
  },
  {
    "path": "private/util/merge_providers.bzl",
    "content": "\"a utility rule that merges DefaultInfo and OutputGroupInfo providers\"\n\nSKIP = \"_hidden_top_level_INTERNAL_\"\n\ndef _impl(ctx):\n    output_group_info = {}\n    default_info = {\"files\": depset(), \"runfiles\": ctx.runfiles()}\n\n    for src in ctx.attr.srcs:\n        if DefaultInfo in src:\n            default_info = {\n                \"files\": depset(transitive = [default_info[\"files\"], src[DefaultInfo].files]),\n                \"runfiles\": default_info[\"runfiles\"].merge(src[DefaultInfo].default_runfiles),\n            }\n        if OutputGroupInfo in src:\n            for key in src[OutputGroupInfo]:\n                if key == SKIP:\n                    continue\n                depsets = [src[OutputGroupInfo][key]]\n                if key in output_group_info:\n                    depsets.append(output_group_info[key])\n                output_group_info[key] = depset(transitive = depsets)\n\n    return [\n        OutputGroupInfo(**output_group_info),\n        DefaultInfo(**default_info),\n    ]\n\nmerge_providers = rule(\n    implementation = _impl,\n    attrs = {\n        \"srcs\": attr.label_list(),\n    },\n)\n"
  },
  {
    "path": "private/util/tar.bzl",
    "content": "\"Wrapper around tar rules for creating tar archives\"\n\nload(\"@aspect_bazel_lib//lib:tar.bzl\", _aspect_tar = \"tar\")\nload(\"@rules_pkg//:pkg.bzl\", \"pkg_tar\")\n\ndef tar(\n        name,\n        srcs = [],\n        deps = [],\n        extension = \"tar.gz\",\n        package_dir = None,\n        strip_prefix = None,\n        symlinks = {},\n        args = [],\n        mtree = [],\n        **kwargs):\n    \"\"\"Create a tar archive.\n\n    Uses aspect_bazel_lib tar when mtree is provided for precise control.\n    Uses pkg_tar otherwise for compatibility with deps merging.\n\n    Args:\n        name: Name of the target\n        srcs: Source files to include\n        deps: Other tar files to merge\n        extension: Output extension (tar.gz, tar, etc.)\n        package_dir: Directory prefix for files in the archive\n        strip_prefix: Prefix to strip from source file paths\n        symlinks: Dict of symlink path -> target\n        args: Additional arguments to pass to tar (aspect_bazel_lib only)\n        mtree: mtree specification for file metadata (aspect_bazel_lib only)\n        **kwargs: Additional arguments passed to underlying rule\n    \"\"\"\n\n    # Use aspect_bazel_lib tar when mtree is provided\n    if mtree:\n        compress = None\n        if extension == \"tar.gz\":\n            compress = \"gzip\"\n        elif extension == \"tar.bz2\":\n            compress = \"bzip2\"\n        elif extension == \"tar.xz\":\n            compress = \"xz\"\n        elif extension == \"tar.zst\":\n            compress = \"zstd\"\n\n        _aspect_tar(\n            name = name,\n            srcs = srcs + deps,\n            args = args,\n            mtree = mtree,\n            compress = compress,\n            **kwargs\n        )\n    else:\n        # Use pkg_tar for deps merging and legacy compatibility\n        pkg_tar(\n            name = name,\n            srcs = srcs,\n            deps = deps,\n            extension = extension,\n            package_dir = package_dir,\n            strip_prefix = strip_prefix,\n            symlinks = symlinks,\n            **kwargs\n        )\n"
  },
  {
    "path": "python3/BUILD",
    "content": "load(\"//private/util:tar.bzl\", \"tar\")\nload(\":config.bzl\", \"PYTHON_ARCHITECTURES\", \"PYTHON_DISTROS\", \"PYTHON_PACKAGES\")\nload(\":ldconfig.bzl\", \"python3_ldconfig\")\nload(\":python.bzl\", \"python3_image\", \"python3_image_index\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\n[\n    tar(\n        name = \"ldconfig_cache_{}\".format(arch),\n        srcs = [\"ldconfig/ld.so.cache.{}\".format(arch)],\n        args = [\n            \"--format\",\n            \"gnutar\",\n        ],\n        extension = \"tar.gz\",\n        mtree = [\"etc/ld.so.cache uid=0 gid=0 uname=root gname=root mode=0644 time=0 type=file content=$(location ldconfig/ld.so.cache.{})\".format(arch)],\n    )\n    for arch in PYTHON_ARCHITECTURES[\"debian13\"]\n]\n\n[\n    python3_image(\n        arch = arch,\n        distro = distro,\n        packages = PYTHON_PACKAGES[distro],\n    )\n    for distro in PYTHON_DISTROS\n    for arch in PYTHON_ARCHITECTURES[distro]\n]\n\n[\n    python3_image_index(\n        architectures = PYTHON_ARCHITECTURES[distro],\n        distro = distro,\n    )\n    for distro in PYTHON_DISTROS\n]\n\n# ldconfig.so.cache generation\npython3_ldconfig(\n    architectures = PYTHON_ARCHITECTURES[\"debian13\"],\n    distro = \"debian13\",\n)\n"
  },
  {
    "path": "python3/README.md",
    "content": "# Documentation for `gcr.io/distroless/python3`\n\n## Image Contents\n\nThis image contains a minimal Linux, Python-based runtime.\n\nSpecifically, the image contains everything in the [base image](../base/README.md), plus:\n\n* Python 3 and its dependencies.\n    * 3.11 on debian 12\n    * 3.13 on debian 13\n* No shell\n\n## ldconfig and ctypes\n\nOn debian13+ we include a pre-generated `ld.so.cache` to support user/framework calls to `ctypes.util.find_library()`. If a user modifies the image by adding a new library, it will not be found in the cache without calling ldconfig to refresh the cache.\n\n## Usage\n\nThe entrypoint of this image is set to \"python\", so this image expects users to supply a path to a .py file in the CMD.\n\nSee the Python [Hello World](../examples/python3/) directory for an example.\n"
  },
  {
    "path": "python3/config.bzl",
    "content": "PYTHON_DISTROS = [\"debian12\", \"debian13\"]\nPYTHON_ARCHITECTURES = {\n    \"debian12\": [\"amd64\", \"arm64\"],\n    \"debian13\": [\"amd64\", \"arm64\"],\n}\n\nPYTHON_PACKAGES = {\n    \"debian12\": [\n        \"libbz2-1.0\",\n        \"libdb5.3\",\n        \"libexpat1\",\n        \"liblzma5\",\n        \"libsqlite3-0\",\n        \"libuuid1\",\n        \"libncursesw6\",\n        \"libtinfo6\",\n        \"python3-distutils\",\n        \"zlib1g\",\n        \"libcom-err2\",\n        \"libcrypt1\",\n        \"libgssapi-krb5-2\",\n        \"libk5crypto3\",\n        \"libkeyutils1\",\n        \"libkrb5-3\",\n        \"libkrb5support0\",\n        \"libnsl2\",\n        \"libreadline8\",\n        \"libtirpc3\",\n        \"libffi8\",\n        \"libpython3.11-minimal\",\n        \"libpython3.11-stdlib\",\n        \"python3.11-minimal\",\n    ],\n    \"debian13\": [\n        \"libbz2-1.0\",\n        \"libdb5.3t64\",\n        \"libexpat1\",\n        \"liblzma5\",\n        \"libsqlite3-0\",\n        \"libuuid1\",\n        \"libncursesw6\",\n        \"libtinfo6\",\n        \"zlib1g\",\n        \"libcom-err2\",\n        \"libcrypt1\",\n        \"libc-bin\",\n        \"libgssapi-krb5-2\",\n        \"libk5crypto3\",\n        \"libkeyutils1\",\n        \"libkrb5-3\",\n        \"libkrb5support0\",\n        \"libnsl2\",\n        \"libreadline8t64\",\n        \"libtirpc3t64\",\n        \"libffi8\",\n        \"libpython3.13-minimal\",\n        \"libpython3.13-stdlib\",\n        \"python3.13-minimal\",\n        \"python3.13-venv\",\n    ],\n}\n"
  },
  {
    "path": "python3/ldconfig/ldconfig.sh",
    "content": "#!/usr/bin/env bash\nset -eo pipefail\n\nMODE=$1\nshift\n\nif [[ \"${MODE}\" != \"update\" && \"${MODE}\" != \"check\" ]]; then\n  echo \"Usage: $0 <update|check> <arch>...\" >&2\n  exit 1\nfi\n\n# Root to find the reference cache files\nROOT=\"python3/ldconfig\"\nif [[ -n \"${BUILD_WORKSPACE_DIRECTORY}\" ]]; then\n  cd \"${BUILD_WORKSPACE_DIRECTORY}\"\nelif [[ ! -d \"${ROOT}\" ]]; then\n  # Fallback to finding it in the same dir as the script\n  ROOT=$(dirname \"$0\")\nfi\n\nCID=\"\"\nTEMP_DIR=\"\"\ncleanup() {\n  local exit_status=$?\n  if [[ -n \"${CID}\" ]]; then docker rm -f \"${CID}\"; fi\n  if [[ -n \"${TEMP_DIR}\" ]]; then rm -rf \"${TEMP_DIR}\"; fi\n  exit \"${exit_status}\"\n}\ntrap cleanup EXIT\n\nfor arch in \"$@\"; do\n  echo \"===> ${MODE^}ing ldconfig cache for ${arch}...\"\n\n  # Run ldconfig and extract the cache.\n  # We assume the image is ALREADY loaded (handled by Bazel build dependencies)\n  CID=$(docker create --platform \"linux/${arch}\" --entrypoint /sbin/ldconfig \"bazel/python3:python3_root_${arch}_debian13\")\n  docker start -a \"${CID}\"\n\n  if [[ \"${MODE}\" == \"update\" ]]; then\n    docker cp \"${CID}:/etc/ld.so.cache\" \"${ROOT}/ld.so.cache.${arch}\"\n    echo \"✅ Updated ${arch} cache.\"\n  else\n    TEMP_DIR=$(mktemp -d)\n    docker cp \"${CID}:/etc/ld.so.cache\" \"${TEMP_DIR}/ld.so.cache.${arch}\"\n    if ! cmp -s \"${TEMP_DIR}/ld.so.cache.${arch}\" \"${ROOT}/ld.so.cache.${arch}\"; then\n      echo \"❌ ERROR: ldconfig cache for ${arch} is out of date!\" >&2\n      echo \"Run 'bazel run //python3:update_ldconfig' to regenerate.\" >&2\n      exit 1\n    fi\n    rm -rf \"${TEMP_DIR}\"\n    TEMP_DIR=\"\"\n    echo \"✅ ldconfig cache for ${arch} is up to date.\"\n  fi\n  docker rm -f \"${CID}\"\n  CID=\"\"\ndone\n"
  },
  {
    "path": "python3/ldconfig.bzl",
    "content": "\"Macros for generating ldconfig cache for python images\"\n\nload(\"@rules_oci//oci:defs.bzl\", \"oci_load\")\n\ndef python3_ldconfig(architectures, distro):\n    \"\"\"Generates ldconfig cache targets for python images.\n\n    Args:\n        architectures: list of architectures to support\n        distro: the distribution name (e.g. debian13)\n    \"\"\"\n\n    # 1. Create the oci_load targets (the scripts that load images into docker)\n    for arch in architectures:\n        oci_load(\n            name = \"load_python3_root_{}_{}\".format(arch, distro),\n            image = \":python3_root_{}_{}\".format(arch, distro),\n            repo_tags = [\"bazel/python3:python3_root_{}_{}\".format(arch, distro)],\n        )\n\n    # 2. Create the genrules that actually trigger the loading during 'bazel build'\n    for arch in architectures:\n        native.genrule(\n            name = \"do_load_{}\".format(arch),\n            outs = [\"do_load_{}.done\".format(arch)],\n            cmd = \"$(location :load_python3_root_{arch}_{distro}) && touch $@\".format(\n                arch = arch,\n                distro = distro,\n            ),\n            tags = [\n                \"local\",\n                \"no-sandbox\",\n            ],\n            tools = [\":load_python3_root_{}_{}\".format(arch, distro)],\n        )\n\n    # 3. Create the update_ldconfig binary\n    native.sh_binary(\n        name = \"update_ldconfig\",\n        srcs = [\"ldconfig/ldconfig.sh\"],\n        args = [\"update\"] + architectures,\n        data = [\"ldconfig/ldconfig.sh\"] + [\":do_load_{}\".format(arch) for arch in architectures],\n        tags = [\"local\"],\n    )\n\n    # 4. Create the architecture-specific tests\n    for arch in architectures:\n        native.sh_test(\n            name = \"check_ldconfig_{}_test\".format(arch),\n            srcs = [\"ldconfig/ldconfig.sh\"],\n            args = [\n                \"check\",\n                arch,\n            ],\n            data = [\n                \"ldconfig/ld.so.cache.{}\".format(arch),\n                \":do_load_{}\".format(arch),\n            ],\n            tags = [\n                arch,\n                \"local\",\n                \"manual\",\n                \"external\",\n                \"no-cache\",\n            ],\n        )\n\n    # 5. Create the test suite\n    native.test_suite(\n        name = \"check_ldconfig_tests\",\n        tests = [\n            \":check_ldconfig_{}_test\".format(arch)\n            for arch in architectures\n        ],\n        tags = [\"manual\"],\n    )\n"
  },
  {
    "path": "python3/python.bzl",
    "content": "\"python3 image definitions\"\n\nload(\"@container_structure_test//:defs.bzl\", \"container_structure_test\")\nload(\"@rules_oci//oci:defs.bzl\", \"oci_image\", \"oci_image_index\")\nload(\"//common:variables.bzl\", \"DEBUG_MODE\", \"USERS\")\nload(\"//private/util:deb.bzl\", \"deb\")\nload(\"//private/util:tar.bzl\", \"tar\")\n\nDISTRO_VERSION = {\n    \"debian12\": \"3.11\",\n    \"debian13\": \"3.13\",\n}\n\ndef python_alias(distro):\n    if native.existing_rule(\"python_aliases_\" + distro):\n        return\n\n    tar(\n        name = \"python_aliases_\" + distro,\n        extension = \"tar.gz\",\n        symlinks = {\n            \"/usr/bin/python\": \"/usr/bin/python\" + DISTRO_VERSION[distro],\n            \"/usr/bin/python3\": \"/usr/bin/python\" + DISTRO_VERSION[distro],\n        },\n    )\n\ndef python3_image_index(distro, architectures):\n    \"\"\"python image index for a distro\n\n    Args:\n        distro: name of distribution\n        architectures: all architectures included in index\n    \"\"\"\n    for mode in DEBUG_MODE:\n        for user in USERS:\n            oci_image_index(\n                name = \"python3\" + mode + \"_\" + user + \"_\" + distro,\n                images = [\n                    \"python3\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro\n                    for arch in architectures\n                ],\n            )\n\ndef python3_image(distro, arch, packages):\n    \"\"\"python3 and debug image with tests.\n\n    Args:\n        distro: name of distribution\n        arch: the target architecture\n        packages: list of debian packages to include\n    \"\"\"\n    python_alias(distro)\n\n    for mode in DEBUG_MODE:\n        for user in USERS:\n            oci_image(\n                name = \"python3\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro,\n                # Based on //cc so that C extensions work properly.\n                base = \"//cc:cc\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro,\n                entrypoint = [\n                    \"/usr/bin/python\" + DISTRO_VERSION[distro],\n                ],\n                # Use UTF-8 encoding for file system: match modern Linux\n                env = {\"LANG\": \"C.UTF-8\"},\n                tars = [\n                    deb.package(arch, distro, pkg, \"python\")\n                    for pkg in packages\n                ] + [\":python_aliases_%s\" % distro] + ([\":ldconfig_cache_\" + arch] if distro == \"debian13\" else []),\n            )\n\n    for user in USERS:\n        container_structure_test(\n            name = \"python3_\" + user + \"_\" + arch + \"_\" + distro + \"_test\",\n            size = \"medium\",\n            configs = [\"testdata/python3.yaml\"],\n            image = \":python3_\" + user + \"_\" + arch + \"_\" + distro,\n            tags = [\n                \"manual\",\n                arch,\n            ],\n        )\n\n    # tests for version-specific things\n    for user in USERS:\n        container_structure_test(\n            name = \"version_specific_\" + user + \"_\" + arch + \"_\" + distro + \"_test\",\n            size = \"medium\",\n            configs = [\"testdata/\" + distro + \".yaml\"],\n            image = \":python3_\" + user + \"_\" + arch + \"_\" + distro,\n            tags = [\n                \"manual\",\n                arch,\n            ],\n        )\n"
  },
  {
    "path": "python3/testdata/debian12.yaml",
    "content": "schemaVersion: \"1.0.0\"\ncommandTests:\n  - name: version\n    command: [\"/usr/bin/python3\", \"--version\"]\n    expectedOutput: [\"Python 3.11.2\"]\n  - name: symlink\n    command: [\"/usr/bin/python\", \"--version\"]\n    expectedOutput: [\"Python 3.11.2\"]\n\n  # debian 12's default python3 includes a partial version of distutils causing virtualenv to fail\n  # ensure we have the full version so virtualenvs work with distroless\n  - name: distutils_works\n    command: [\"/usr/bin/python3\", \"-c\", \"import distutils.dist\"]\n    exitCode: 0\n\n  # import every module installed with the Python package\n  - name: import_everything\n    exitCode: 0\n    expectedOutput: ['FINISHED ENTIRE SCRIPT']\n    command:\n      - \"/usr/bin/python3\"\n      - \"-c\"\n      # multi-line YAML string with Python script that imports all modules that are installed.\n      # This ensures we have the right native library dependencies.\n      - |\n        import pkgutil\n\n        skip_modules = frozenset((\n          # Windows-specific modules\n          'asyncio.windows_events',\n          'asyncio.windows_utils',\n          'ctypes.wintypes',\n          'distutils._msvccompiler',\n          'distutils.command.bdist_msi',\n          'distutils.msvc9compiler',\n          'encodings.cp65001',\n          'encodings.mbcs',\n          'encodings.oem',\n          'multiprocessing.popen_spawn_win32',\n          'winreg',\n\n          # Python regression tests \"for internal use by Python only\"\n          'test',\n\n          # calls sys.exit\n          'unittest.__main__',\n          'venv.__main__',\n\n          # depends on things not installed by default on Debian\n          'dbm.gnu',\n          'lib2to3.pgen2.conv',\n          'turtle',\n        ))\n\n        # pass an error handler so the test fails if there are broken standard library packages\n        def walk_packages_onerror(failed_module_name):\n          raise Exception('failed to import module: {}'.format(repr(failed_module_name)))\n        for module_info in pkgutil.walk_packages(onerror=walk_packages_onerror):\n          module_name = module_info.name\n          if module_name in skip_modules or module_name.startswith('test.'):\n            continue\n\n          __import__(module_name)\n          print('imported {}'.format(module_name))\n\n        # ensures some module does not exit early (e.g unittest.__main__)\n        print('FINISHED ENTIRE SCRIPT')\n"
  },
  {
    "path": "python3/testdata/debian13.yaml",
    "content": "schemaVersion: \"1.0.0\"\ncommandTests:\n  - name: version\n    command: [\"/usr/bin/python3\", \"--version\"]\n    expectedOutput: [\"Python 3.13.5\"]\n  - name: symlink\n    command: [\"/usr/bin/python\", \"--version\"]\n    expectedOutput: [\"Python 3.13.5\"]\n\n  # import every module installed with the Python package\n  - name: import_everything\n    exitCode: 0\n    expectedOutput: ['FINISHED ENTIRE SCRIPT']\n    command:\n      - \"/usr/bin/python3\"\n      - \"-c\"\n      # multi-line YAML string with Python script that imports all modules that are installed.\n      # This ensures we have the right native library dependencies.\n      - |\n        import pkgutil\n\n        skip_modules = frozenset((\n          # Windows-specific modules\n          'asyncio.windows_events',\n          'asyncio.windows_utils',\n          'ctypes.wintypes',\n          'distutils._msvccompiler',\n          'distutils.command.bdist_msi',\n          'distutils.msvc9compiler',\n          'encodings.cp65001',\n          'encodings.mbcs',\n          'encodings.oem',\n          'multiprocessing.popen_spawn_win32',\n          '_pyrepl.windows_console',\n          'winreg',\n\n          # Python regression tests \"for internal use by Python only\"\n          'test',\n\n          # no ios support\n          '_ios_support',\n\n          # pyrepl things\n          '_pyrepl._minimal_curses',\n\n          # i thought distutils was gone?\n          '_distutils_system_mod',\n\n          # calls sys.exit\n          'unittest.__main__',\n          'venv.__main__',\n\n          # depends on things not installed by default on Debian\n          'dbm.gnu',\n          'lib2to3.pgen2.conv',\n          'turtle',\n        ))\n\n        # pass an error handler so the test fails if there are broken standard library packages\n        def walk_packages_onerror(failed_module_name):\n          raise Exception('failed to import module: {}'.format(repr(failed_module_name)))\n        for module_info in pkgutil.walk_packages(onerror=walk_packages_onerror):\n          module_name = module_info.name\n          if module_name in skip_modules or module_name.startswith('test.'):\n            continue\n\n          print('importing {}'.format(module_name))\n          __import__(module_name)\n          print('imported {}'.format(module_name))\n\n        print('FINISHED ENTIRE SCRIPT')\n"
  },
  {
    "path": "python3/testdata/python3.yaml",
    "content": "schemaVersion: \"1.0.0\"\ncommandTests:\n  - name: hello\n    command: [\"/usr/bin/python3\", \"-c\", \"print('Hello World')\"]\n    expectedOutput: ['Hello World']\n\n  # ensure there is no shell\n  - name: no_shell\n    command: [\"/usr/bin/python3\", \"-c\",\n      \"import subprocess, sys; subprocess.check_call(sys.executable + ' -h', shell=True)\"]\n    exitCode: 1\n\n  # file names are UTF-8: default for modern Linux systems\n  # The \\xe9 backslash must be double-escaped to avoid YAML string parsing weirdness\n  - name: filesystem_utf8\n    command: [\"/usr/bin/python3\", \"-c\", \"open(u'h\\\\xe9llo', 'w'); import sys; print(sys.getfilesystemencoding())\"]\n    expectedOutput: ['utf-8']\n\n  # the print function should output UTF-8\n  - name: print_utf8\n    command: [\"/usr/bin/python3\", \"-c\", \"print(u'h\\\\xe9llo.txt')\"]\n    expectedOutput: ['h\\xe9llo']\n"
  },
  {
    "path": "static/BUILD",
    "content": "load(\"//private/util:tar.bzl\", \"tar\")\nload(\":config.bzl\", \"STATIC_ARCHITECTURES\", \"STATIC_DISTROS\", \"STATIC_PACKAGES\")\nload(\":static.bzl\", \"static_image\", \"static_image_index\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\n# Build gzip-compressed tar with GNU format and correct metadata\ntar(\n    name = \"nsswitch\",\n    srcs = [\"nsswitch.conf\"],\n    args = [\n        \"--format\",\n        \"gnutar\",\n    ],\n    extension = \"tar.gz\",\n    mtree = [\"etc/nsswitch.conf uid=0 gid=0 uname=root gname=root mode=0644 time=1514722362 type=file content=$(location nsswitch.conf)\"],\n)\n\n[\n    static_image(\n        arch = arch,\n        distro = distro,\n        packages = STATIC_PACKAGES[distro],\n    )\n    for distro in STATIC_DISTROS\n    for arch in STATIC_ARCHITECTURES[distro]\n]\n\n[\n    static_image_index(\n        architectures = STATIC_ARCHITECTURES[distro],\n        distro = distro,\n    )\n    for distro in STATIC_DISTROS\n]\n"
  },
  {
    "path": "static/config.bzl",
    "content": "STATIC_DISTROS = [\"debian12\", \"debian13\"]\nSTATIC_ARCHITECTURES = {\n    \"debian12\": [\"amd64\", \"arm64\", \"arm\", \"s390x\", \"ppc64le\"],\n    \"debian13\": [\"amd64\", \"arm64\", \"arm\", \"s390x\", \"ppc64le\", \"riscv64\"],\n}\n\nSTATIC_PACKAGES = {\n    \"debian12\": [\n        \"base-files\",\n        \"netbase\",\n        \"tzdata\",\n        \"media-types\",\n    ],\n    \"debian13\": [\n        \"base-files\",\n        \"netbase\",\n        \"tzdata\",\n        \"tzdata-legacy\",\n        \"media-types\",\n    ],\n}\n"
  },
  {
    "path": "static/nsswitch.conf",
    "content": "# /etc/nsswitch.conf\n#\n# Example configuration of GNU Name Service Switch functionality.\n# If you have the `glibc-doc-reference' and `info' packages installed, try:\n# `info libc \"Name Service Switch\"' for information about this file.\n\npasswd:         compat\ngroup:          compat\nshadow:         compat\ngshadow:        files\n\nhosts:          files dns\nnetworks:       files\n\nprotocols:      db files\nservices:       db files\nethers:         db files\nrpc:            db files\n\nnetgroup:       nis\n"
  },
  {
    "path": "static/static.bzl",
    "content": "\"defines a function to build static different distributions\"\n\nload(\"@container_structure_test//:defs.bzl\", \"container_structure_test\")\nload(\"@rules_go//go:def.bzl\", \"go_binary\")\nload(\"@rules_oci//oci:defs.bzl\", \"oci_image\", \"oci_image_index\")\nload(\"//:distro.bzl\", \"VARIANTS\")\nload(\"//common:variables.bzl\", \"DEBUG_MODE\", \"NONROOT\")\nload(\"//private/util:deb.bzl\", \"deb\")\nload(\"//private/util:tar.bzl\", \"tar\")\n\nUSER_VARIANTS = [(\"root\", 0, \"/\"), (\"nonroot\", NONROOT, \"/home/nonroot\")]\n\ndef static_image_index(distro, architectures):\n    \"\"\"Build image index for a distro\n\n    Args:\n        distro: name of distribution\n        architectures: all architectures included in index\n    \"\"\"\n    for (user, _, _) in USER_VARIANTS:\n        for mode in DEBUG_MODE:\n            oci_image_index(\n                name = \"static\" + mode + \"_\" + user + \"_\" + distro,\n                images = [\n                    \"static\" + mode + \"_\" + user + \"_\" + arch + \"_\" + distro\n                    for arch in architectures\n                ],\n            )\n\ndef static_image(distro, arch, packages):\n    \"\"\"static and debug images and tests for a distro/arch\n\n    Args:\n        distro: name of the distribution\n        arch: the target architecture\n        packages: distro-specific packages to include\n    \"\"\"\n    for (user, uid, workdir) in USER_VARIANTS:\n        oci_image(\n            name = \"static_\" + user + \"_\" + arch + \"_\" + distro,\n            env = {\n                \"PATH\": \"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\n                # allows openssl to find the certificates by default\n                # TODO: We should run update-ca-certifaces, but that requires \"openssl rehash\"\n                # which would probably need to be run inside the container\n                \"SSL_CERT_FILE\": \"/etc/ssl/certs/ca-certificates.crt\",\n            },\n            tars = [\n                deb.package(arch, distro, pkg)\n                for pkg in packages\n            ] + [\n                \"//common:rootfs\",\n                \"//common:passwd\",\n                \"//common:home\",\n                \"//common:group\",\n                # Create /tmp, too many things assume it exists.\n                # tmp.tar has a /tmp with the correct permissions 01777\n                \"//common:tmp\",\n                \":nsswitch\",\n                \"//common:os_release_\" + distro,\n                \"//common:cacerts_\" + distro + \"_\" + arch,\n            ],\n            user = \"%d\" % uid,\n            workdir = workdir,\n            os = \"linux\",\n            architecture = arch,\n            variant = VARIANTS.get(arch),\n        )\n\n        # A static debug image with busybox available.\n        oci_image(\n            name = \"static_debug_\" + user + \"_\" + arch + \"_\" + distro,\n            base = \":static_\" + user + \"_\" + arch + \"_\" + distro,\n            entrypoint = [\"/busybox/sh\"],\n            env = {\"PATH\": \"$PATH:/busybox\"},\n            tars = [\"//experimental/busybox:busybox_\" + arch],\n        )\n\n    ##########################################################################################\n    # Check that we can overlay a pure Go binary on a static base to check certificates\n    ##########################################################################################\n    go_binary(\n        name = \"check_certs_\" + arch + \"_\" + distro,\n        srcs = [\"testdata/check_certs.go\"],\n        goarch = arch,\n        # Test image is linux based\n        goos = \"linux\",\n        pure = \"on\",\n    )\n\n    tar(\n        name = \"check_certs_\" + arch + \"_\" + distro + \"_tar\",\n        extension = \"tar.gz\",\n        srcs = [\"check_certs_\" + arch + \"_\" + distro],\n        symlinks = {\n            \"/check_certs\": \"check_certs_\" + arch + \"_\" + distro,\n        },\n    )\n\n    oci_image(\n        name = \"check_certs_image_\" + arch + \"_\" + distro,\n        base = \"//static:static_root_\" + arch + \"_\" + distro,\n        tars = [\n            \":check_certs_\" + arch + \"_\" + distro + \"_tar\",\n        ],\n        visibility = [\"//visibility:private\"],\n    )\n\n    container_structure_test(\n        name = \"static_\" + arch + \"_\" + distro + \"_test\",\n        configs = [\"testdata/static.yaml\"],\n        image = \":check_certs_image_\" + arch + \"_\" + distro,\n        tags = [\"manual\", arch],\n    )\n\n    ##########################################################################################\n    # Check for busybox\n    ##########################################################################################\n    container_structure_test(\n        name = \"static_debug_\" + arch + \"_\" + distro + \"_test\",\n        configs = [\"testdata/debug.yaml\"],\n        image = \":static_debug_root_\" + arch + \"_\" + distro,\n        tags = [\"manual\", arch],\n    )\n\n    ##########################################################################################\n    # Check the /etc/os-release contents.\n    ##########################################################################################\n    container_structure_test(\n        name = \"static_release_\" + arch + \"_\" + distro + \"_test\",\n        configs = [\"testdata/\" + distro + \".yaml\"],\n        image = \":static_root_\" + arch + \"_\" + distro,\n        tags = [\"manual\", arch],\n    )\n\n    container_structure_test(\n        name = \"static_debug_release_\" + arch + \"_\" + distro + \"_test\",\n        configs = [\"testdata/\" + distro + \".yaml\"],\n        image = \":static_debug_root_\" + arch + \"_\" + distro,\n        tags = [\"manual\", arch],\n    )\n"
  },
  {
    "path": "static/testdata/check_certs.go",
    "content": "// Copyright 2017 Google Inc. All rights reserved.\n\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n\n//     http://www.apache.org/licenses/LICENSE-2.0\n\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"crypto/x509\"\n\t\"fmt\"\n\t\"os\"\n)\n\nfunc main() {\n\tpool, err := x509.SystemCertPool()\n\tif err != nil {\n\t\tfmt.Printf(\"Error %s loading system certs.\\n\", err)\n\t\tos.Exit(1)\n\t}\n\tif pool == nil {\n\t\tfmt.Println(\"No cert pools.\")\n\t\tos.Exit(1)\n\t}\n\tfmt.Println(\"Certs working!\")\n}\n"
  },
  {
    "path": "static/testdata/debian12.yaml",
    "content": "schemaVersion: \"1.0.0\"\nfileContentTests:\n- name: 'os-release contents'\n  path: '/etc/os-release'\n  expectedContents: ['.*\\nVERSION=\"Debian GNU/Linux 12 \\(bookworm\\)\"\\n']\n"
  },
  {
    "path": "static/testdata/debian13.yaml",
    "content": "schemaVersion: \"1.0.0\"\nfileContentTests:\n- name: 'os-release contents'\n  path: '/etc/os-release'\n  expectedContents: ['.*\\nVERSION=\"Debian GNU/Linux 13 \\(trixie\\)\"\\n']\n"
  },
  {
    "path": "static/testdata/debug.yaml",
    "content": "schemaVersion: \"1.0.0\"\nfileExistenceTests:\n# Basic FS sanity checks.\n- name: busybox\n  path: '/busybox'\n  shouldExist: true\ncommandTests:\n  - name: busybox\n    command: [\"/busybox/busybox\"]\n    expectedOutput: ['BusyBox v1\\.37\\.0']\n"
  },
  {
    "path": "static/testdata/static.yaml",
    "content": "schemaVersion: \"1.0.0\"\ncommandTests:\n# Check that Go programs can read the certificates\n- name: certs\n  command: [\"/check_certs\"]\n  exitCode: 0\nfileExistenceTests:\n- name: mime-types\n  path: '/etc/mime.types'\n  shouldExist: true\n"
  }
]