diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 389d3b45..2052a578 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -31,3 +31,6 @@ mkdocs.yml @ahouseholder # github setup /.github/ @ahouseholder @sei-vsarvepalli + +# CISA-namespaced items are kept in folders named `cisa` at various depths +**/cisa/** @j--- diff --git a/.github/workflows/deploy_site.yml b/.github/workflows/deploy_site.yml index 5987edac..e2bd5c0d 100644 --- a/.github/workflows/deploy_site.yml +++ b/.github/workflows/deploy_site.yml @@ -46,7 +46,7 @@ jobs: uv sync --no-dev - name: Setup Pages - uses: actions/configure-pages@v5 + uses: actions/configure-pages@v6 - name: Build Site run: | @@ -54,11 +54,11 @@ jobs: uv run mkdocs build --clean --config-file mkdocs.yml - name: Upload artifact - uses: actions/upload-pages-artifact@v4 + uses: actions/upload-pages-artifact@v5 with: # Upload entire repository path: 'site' - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v5 diff --git a/.github/workflows/docs_build_check.yml b/.github/workflows/docs_build_check.yml new file mode 100644 index 00000000..7b8095e4 --- /dev/null +++ b/.github/workflows/docs_build_check.yml @@ -0,0 +1,33 @@ +name: Docs Build Check + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +permissions: + contents: read + +jobs: + docs-build: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Set up Python 3.12 + uses: actions/setup-python@v6 + with: + python-version: "3.12" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip uv + uv sync --no-dev --frozen + + - name: Build docs + run: | + export PYTHONPATH=src:$PYTHONPATH + uv run mkdocs build --clean --config-file mkdocs.yml diff --git a/.github/workflows/lint_md_changes.yml b/.github/workflows/lint_md_changes.yml index 6c852a77..039da72e 100644 --- a/.github/workflows/lint_md_changes.yml +++ b/.github/workflows/lint_md_changes.yml @@ -16,12 +16,12 @@ jobs: - uses: actions/checkout@v6 with: fetch-depth: 0 - - uses: tj-actions/changed-files@e0021407031f5be11a464abee9a0776171c79891 + - uses: tj-actions/changed-files@9426d40962ed5378910ee2e21d5f8c6fcbf2dd96 id: changed-files with: files: '**/*.md' separator: "," - - uses: DavidAnson/markdownlint-cli2-action@v22 + - uses: DavidAnson/markdownlint-cli2-action@v23 if: steps.changed-files.outputs.any_changed == 'true' with: globs: ${{ steps.changed-files.outputs.all_changed_files }} diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml index c160a6b0..1a2bab3a 100644 --- a/.github/workflows/python-app.yml +++ b/.github/workflows/python-app.yml @@ -37,7 +37,7 @@ jobs: run: | uv build - name: Upload Artifacts - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: ssvc path: src/dist/ssvc-*.tar.gz diff --git a/.github/workflows/run_doctools.yml b/.github/workflows/run_doctools.yml new file mode 100644 index 00000000..a11e0855 --- /dev/null +++ b/.github/workflows/run_doctools.yml @@ -0,0 +1,64 @@ +name: "Run doctools on PR" + +on: + pull_request: + paths: + - 'src/ssvc/**' + - .github/workflows/run_doctools.yml + +permissions: + contents: write + +jobs: + run-doctools: + # Skip when the auto-commit from this workflow triggers a re-run + if: github.actor != 'github-actions[bot]' + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v6 + with: + ref: ${{ github.head_ref }} + fetch-depth: 0 + + - name: Set up Python 3.12 + uses: actions/setup-python@v6 + with: + python-version: "3.12" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip uv + uv sync --dev --frozen + + - name: Run doctools + run: | + # Remove stale decision point files so doctools generates a clean set + rm -rf data/json/decision_points + export PYTHONPATH=$(pwd)/src + uv run python -m ssvc.doctools --overwrite --datadir ./data + + - name: Fail if fork PR has uncommitted data/ changes + if: github.event.pull_request.head.repo.full_name != github.repository + run: | + git add data/ + if git diff --cached --quiet; then + echo "No data/ changes detected." + else + echo "::error::This PR is from a fork and data/ files need to be regenerated." + echo "::error::Please run 'make regenerate_json' locally and push the resulting data/ changes to your PR branch." + exit 1 + fi + + - name: Commit changes to data/ + if: github.event.pull_request.head.repo.full_name == github.repository + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add data/ + if git diff --cached --quiet; then + echo "No changes to commit" + else + git commit -m "chore: regenerate data files via doctools" + git push + fi diff --git a/.gitignore b/.gitignore index b066ebee..c6f3c68e 100644 --- a/.gitignore +++ b/.gitignore @@ -132,3 +132,4 @@ ssvc2-applier-wip.xlsx _version.py node_modules tmp +/wip_notes/ diff --git a/COPYRIGHT-code.txt b/COPYRIGHT-code.txt new file mode 100644 index 00000000..2ef01bc3 --- /dev/null +++ b/COPYRIGHT-code.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2026 Carnegie Mellon University. +# NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE +# ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. +# CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, +# EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT +# NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR +# MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE +# OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE +# ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM +# PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT. +# Licensed under a MIT (SEI)-style license, please see LICENSE or contact +# permission@sei.cmu.edu for full terms. +# [DISTRIBUTION STATEMENT A] This material has been approved for +# public release and unlimited distribution. Please see Copyright notice +# for non-US Government use and distribution. +# This Software includes and/or makes use of Third-Party Software each +# subject to its own license. +# DM24-0278 diff --git a/LICENSE b/LICENSE index be958a50..3099d572 100644 --- a/LICENSE +++ b/LICENSE @@ -2,47 +2,49 @@ Different directories in this repository are subject to different licenses. Plea --- -The following statement applies to markdown, pdf, bib, and text files (documentation): +Copyright 2026 Carnegie Mellon University. + +This material is based upon work funded and supported by the Department of Homeland Security under Contract No. FA8702-15-D-0002 with Carnegie Mellon University for the operation of the Software Engineering Institute, a federally funded research and development center sponsored by the United States Department of Defense. -Copyright 2025 Carnegie Mellon University. - -This material is based upon work funded and supported by the Department of Homeland Security under Contract No. FA8702-15-D-0002 with Carnegie Mellon University for the operation of the Software Engineering Institute, a federally funded research and development center sponsored by the United States Department of Defense. - The view, opinions, and/or findings contained in this material are those of the author(s) and should not be construed as an official Government position, policy, or decision, unless designated by other documentation. - + NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT. - + [DISTRIBUTION STATEMENT A] This material has been approved for public release and unlimited distribution. Please see Copyright notice for non-US Government use and distribution. - + This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. Requests for permission for non-licensed uses should be directed to the Software Engineering Institute at permission@sei.cmu.edu. -CERT Coordination Center® is registered in the U.S. Patent and Trademark Office by Carnegie Mellon University. + +This work product was created in part using generative AI. +CERT Coordination Center® is registered in the U.S. Patent and Trademark Office by Carnegie Mellon University. + DM24-0278 --- The following statement applies to py, json, csv, sh, toml files (software): -Copyright 2025 Carnegie Mellon University. - +Copyright 2026 Carnegie Mellon University. + Licensed under a MIT (SEI)-style license, please see license.txt or contact permission@sei.cmu.edu for full terms. - + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - + This Software includes and/or can make use of certain third party software ("Third Party Software"). The Third Party Software that is used by the software is dependent upon your system configuration, but typically includes the software identified in this license.txt file, and/or described in the documentation and/or read me file. By using this software, you agree to comply with any and all relevant Third Party Software terms and conditions contained in any such Third Party Software or separate license file distributed with such Third Party Software. The parties who own the Third Party Software ("Third Party Licensors") are intended third party beneficiaries to this License with respect to the terms applicable to their Third Party Software. Third Party Software licenses only apply to the Third Party Software and not any other portion of SEI Software or this software as a whole. - -This material is based upon work funded and supported by the Department of Defense under Contract No. FA8702-15-D-0002 with Carnegie Mellon University for the operation of the Software Engineering Institute, a federally funded research and development center. - -The view, opinions, and/or findings contained in this material are those of the author(s) and should not be construed as an official Government position, policy, or decision, unless designated by other documentation. - + +This material is based upon work funded and supported by the Department of Defense under Contract No. FA8702-15-D-0002 with Carnegie Mellon University for the operation of the Software Engineering Institute, a federally funded research and development center. + +The view, opinions, and/or findings contained in this material are those of the author(s) and should not be construed as an official Government position, policy, or decision, unless designated by other documentation. + References herein to any specific commercial product, process, or service by trade name, trade mark, manufacturer, or otherwise, does not necessarily constitute or imply its endorsement, recommendation, or favoring by Carnegie Mellon University or its Software Engineering Institute. - + NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT. - + +This work product was created in part using generative AI. + [DISTRIBUTION STATEMENT A] This material has been approved for public release and unlimited distribution. Please see Copyright notice for non-US Government use and distribution. - -DM24-0278 +DM24-0278 diff --git a/Makefile b/Makefile index deaab0a4..6b6d2340 100644 --- a/Makefile +++ b/Makefile @@ -10,40 +10,50 @@ UV_RUN=uv run all: help + +src/ssvc/utils/namespace_patterns.py: src/ssvc/utils/ssvc_namespace_pattern.abnf COPYRIGHT-code.txt + @{ \ + cat COPYRIGHT-code.txt; \ + echo ''; \ + echo '# AUTOGENERATED, DO NOT CHANGE manually, see Makefile'; \ + } >$@ + $(UV_RUN) --group codegen abnf-to-regexp --format python-nested -i $< >>$@ + dev: @echo "Set up dev environment..." uv sync --dev + $(MAKE) src/ssvc/utils/namespace_patterns.py mdlint_fix: @echo "Running markdownlint..." markdownlint --config .markdownlint.yml --fix . -test: +test: src/ssvc/utils/namespace_patterns.py @echo "Running tests locally..." $(UV_RUN) pytest -v -docker_test: +docker_test: src/ssvc/utils/namespace_patterns.py @echo "Building the latest test image..." $(DOCKER_COMPOSE) build test @echo "Running tests in Docker..." $(DOCKER_COMPOSE) run --rm test -docs_local: +docs_local: src/ssvc/utils/namespace_patterns.py @echo "Building and running docs locally..." $(UV_RUN) mkdocs serve -docs: +docs: src/ssvc/utils/namespace_patterns.py @echo "Building and running docs in Docker..." $(DOCKER_COMPOSE) up docs -api: +api: src/ssvc/utils/namespace_patterns.py @echo "Building and running API in Docker..." $(DOCKER_COMPOSE) up api -api_dev: +api_dev: src/ssvc/utils/namespace_patterns.py $(UV_RUN) uvicorn ssvc.api.main:app --reload -up: +up: src/ssvc/utils/namespace_patterns.py @echo "Starting Docker services..." $(DOCKER_COMPOSE) up -d @@ -51,7 +61,7 @@ down: @echo "Stopping Docker services..." $(DOCKER_COMPOSE) down -regenerate_json: +regenerate_json: src/ssvc/utils/namespace_patterns.py @echo "Regenerating JSON files..." rm -rf data/json/decision_points export PYTHONPATH=$(PWD)/src && ./src/ssvc/doctools.py --datadir=./data --overwrite diff --git a/data/LICENSE b/data/LICENSE index 9bc24bd1..b7cbe994 100644 --- a/data/LICENSE +++ b/data/LICENSE @@ -1,4 +1,4 @@ -Copyright 2025 Carnegie Mellon University. +Copyright 2026 Carnegie Mellon University. Licensed under a MIT (SEI)-style license, please see license.txt or contact permission@sei.cmu.edu for full terms. diff --git a/data/csv/cisa/cisa_bod_26_04_1_0_0.csv b/data/csv/cisa/cisa_bod_26_04_1_0_0.csv new file mode 100644 index 00000000..42c54fa4 --- /dev/null +++ b/data/csv/cisa/cisa_bod_26_04_1_0_0.csv @@ -0,0 +1,17 @@ +row,In KEV v1.0.0 (cisa),Publicly Exposed v1.0.0 (cisa),Automatable v2.0.0,Technical Impact v1.0.0,CISA BOD 26-04 Remediation Timelines v1.0.0 (cisa) +0,no,no,no,partial,fix on system upgrade +1,yes,no,no,partial,14 days +2,no,yes,no,partial,60 days +3,no,no,yes,partial,60 days +4,no,no,no,total,fix on system upgrade +5,yes,yes,no,partial,14 days +6,yes,no,yes,partial,14 days +7,no,yes,yes,partial,14 days +8,yes,no,no,total,14 days +9,no,yes,no,total,14 days +10,no,no,yes,total,60 days +11,yes,yes,yes,partial,3 days +12,yes,yes,no,total,3 days & forensic investigation +13,yes,no,yes,total,3 days & forensic investigation +14,no,yes,yes,total,3 days +15,yes,yes,yes,total,3 days & forensic investigation diff --git a/data/json/decision_points/cisa/cisa_bod_26_04_remediation_timelines_1_0_0.json b/data/json/decision_points/cisa/cisa_bod_26_04_remediation_timelines_1_0_0.json new file mode 100644 index 00000000..930cf1f4 --- /dev/null +++ b/data/json/decision_points/cisa/cisa_bod_26_04_remediation_timelines_1_0_0.json @@ -0,0 +1,35 @@ +{ + "namespace": "cisa", + "key": "BOD2604", + "version": "1.0.0", + "name": "CISA BOD 26-04 Remediation Timelines", + "definition": "The CISA BOD 26-04 outcome group of remediation timelines for agencies to follow.", + "schemaVersion": "2.0.0", + "values": [ + { + "key": "FSU", + "name": "Fix on system upgrade", + "definition": "The vulnerability should be remediated the next time the vulnerable asset receives a scheduled major upgrade or rebuild." + }, + { + "key": "60D", + "name": "60 days", + "definition": "Remediate within 60 days." + }, + { + "key": "14D", + "name": "14 days", + "definition": "Remediate within 14 days." + }, + { + "key": "3D", + "name": "3 days", + "definition": "Remediate within 3 days." + }, + { + "key": "3DF", + "name": "3 days & forensic investigation", + "definition": "Remediate within 3 days and carry out a forensic triage of the asset to assess whether the system is compromised." + } + ] +} diff --git a/data/json/decision_points/cisa/publicly_exposed_1_0_0.json b/data/json/decision_points/cisa/publicly_exposed_1_0_0.json new file mode 100644 index 00000000..156f93ae --- /dev/null +++ b/data/json/decision_points/cisa/publicly_exposed_1_0_0.json @@ -0,0 +1,20 @@ +{ + "namespace": "cisa", + "key": "PE", + "version": "1.0.0", + "name": "Publicly Exposed", + "definition": "Denotes whether the asset is accessible to unauthenticated or untrusted entities via public networks.", + "schemaVersion": "2.0.0", + "values": [ + { + "key": "N", + "name": "No", + "definition": "The asset is not accessible to unauthenticated or untrusted entities via public networks, such as the internet, regardless of its physical or logical location." + }, + { + "key": "Y", + "name": "Yes", + "definition": "The asset is accessible to unauthenticated or untrusted entities via public networks, such as the internet, regardless of its physical or logical location." + } + ] +} diff --git a/data/json/decision_tables/cisa/cisa_bod_26_04_1_0_0.json b/data/json/decision_tables/cisa/cisa_bod_26_04_1_0_0.json new file mode 100644 index 00000000..8e0baa2b --- /dev/null +++ b/data/json/decision_tables/cisa/cisa_bod_26_04_1_0_0.json @@ -0,0 +1,240 @@ +{ + "namespace": "cisa", + "key": "DT_BOD2604", + "version": "1.0.0", + "name": "CISA BOD 26-04", + "definition": "Decision table for CISA BOD 26-04.", + "schemaVersion": "2.0.0", + "decision_points": { + "cisa:PE:1.0.0": { + "namespace": "cisa", + "key": "PE", + "version": "1.0.0", + "name": "Publicly Exposed", + "definition": "Denotes whether the asset is accessible to unauthenticated or untrusted entities via public networks.", + "schemaVersion": "2.0.0", + "values": [ + { + "key": "N", + "name": "No", + "definition": "The asset is not accessible to unauthenticated or untrusted entities via public networks, such as the internet, regardless of its physical or logical location." + }, + { + "key": "Y", + "name": "Yes", + "definition": "The asset is accessible to unauthenticated or untrusted entities via public networks, such as the internet, regardless of its physical or logical location." + } + ] + }, + "cisa:KEV:1.0.0": { + "namespace": "cisa", + "key": "KEV", + "version": "1.0.0", + "name": "In KEV", + "definition": "Denotes whether a vulnerability is in the CISA Known Exploited Vulnerabilities (KEV) list.", + "schemaVersion": "2.0.0", + "values": [ + { + "key": "N", + "name": "No", + "definition": "Vulnerability is not listed in KEV." + }, + { + "key": "Y", + "name": "Yes", + "definition": "Vulnerability is listed in KEV." + } + ] + }, + "ssvc:A:2.0.0": { + "namespace": "ssvc", + "key": "A", + "version": "2.0.0", + "name": "Automatable", + "definition": "Can an attacker reliably automate creating exploitation events for this vulnerability?", + "schemaVersion": "2.0.0", + "values": [ + { + "key": "N", + "name": "No", + "definition": "Attackers cannot reliably automate steps 1-4 of the kill chain for this vulnerability. These steps are (1) reconnaissance, (2) weaponization, (3) delivery, and (4) exploitation." + }, + { + "key": "Y", + "name": "Yes", + "definition": "Attackers can reliably automate steps 1-4 of the kill chain." + } + ] + }, + "ssvc:TI:1.0.0": { + "namespace": "ssvc", + "key": "TI", + "version": "1.0.0", + "name": "Technical Impact", + "definition": "The technical impact of the vulnerability.", + "schemaVersion": "2.0.0", + "values": [ + { + "key": "P", + "name": "Partial", + "definition": "The exploit gives the adversary limited control over, or information exposure about, the behavior of the software that contains the vulnerability. Or the exploit gives the adversary an importantly low stochastic opportunity for total control." + }, + { + "key": "T", + "name": "Total", + "definition": "The exploit gives the adversary total control over the behavior of the software, or it gives total disclosure of all information on the system that contains the vulnerability." + } + ] + }, + "cisa:BOD2604:1.0.0": { + "namespace": "cisa", + "key": "BOD2604", + "version": "1.0.0", + "name": "CISA BOD 26-04 Remediation Timelines", + "definition": "The CISA BOD 26-04 outcome group of remediation timelines for agencies to follow.", + "schemaVersion": "2.0.0", + "values": [ + { + "key": "FSU", + "name": "Fix on system upgrade", + "definition": "The vulnerability should be remediated the next time the vulnerable asset receives a scheduled major upgrade or rebuild." + }, + { + "key": "60D", + "name": "60 days", + "definition": "Remediate within 60 days." + }, + { + "key": "14D", + "name": "14 days", + "definition": "Remediate within 14 days." + }, + { + "key": "3D", + "name": "3 days", + "definition": "Remediate within 3 days." + }, + { + "key": "3DF", + "name": "3 days & forensic investigation", + "definition": "Remediate within 3 days and carry out a forensic triage of the asset to assess whether the system is compromised." + } + ] + } + }, + "outcome": "cisa:BOD2604:1.0.0", + "mapping": [ + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "FSU" + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "14D" + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "60D" + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "60D" + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "FSU" + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "14D" + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "14D" + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "14D" + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "14D" + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "14D" + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "60D" + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "3D" + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "3DF" + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "3DF" + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "3D" + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "3DF" + } + ] +} diff --git a/data/json/ssvc_object_registry.json b/data/json/ssvc_object_registry.json index da406f0e..d46fe465 100644 --- a/data/json/ssvc_object_registry.json +++ b/data/json/ssvc_object_registry.json @@ -864,6 +864,116 @@ } } }, + "PE": { + "key": "PE", + "versions": { + "1.0.0": { + "version": "1.0.0", + "obj": { + "namespace": "cisa", + "key": "PE", + "version": "1.0.0", + "name": "Publicly Exposed", + "definition": "Denotes whether the asset is accessible to unauthenticated or untrusted entities via public networks.", + "schemaVersion": "2.0.0", + "values": [ + { + "key": "N", + "name": "No", + "definition": "The asset is not accessible to unauthenticated or untrusted entities via public networks, such as the internet, regardless of its physical or logical location." + }, + { + "key": "Y", + "name": "Yes", + "definition": "The asset is accessible to unauthenticated or untrusted entities via public networks, such as the internet, regardless of its physical or logical location." + } + ] + }, + "values": { + "N": { + "key": "N", + "name": "No", + "definition": "The asset is not accessible to unauthenticated or untrusted entities via public networks, such as the internet, regardless of its physical or logical location." + }, + "Y": { + "key": "Y", + "name": "Yes", + "definition": "The asset is accessible to unauthenticated or untrusted entities via public networks, such as the internet, regardless of its physical or logical location." + } + } + } + } + }, + "BOD2604": { + "key": "BOD2604", + "versions": { + "1.0.0": { + "version": "1.0.0", + "obj": { + "namespace": "cisa", + "key": "BOD2604", + "version": "1.0.0", + "name": "CISA BOD 26-04 Remediation Timelines", + "definition": "The CISA BOD 26-04 outcome group of remediation timelines for agencies to follow.", + "schemaVersion": "2.0.0", + "values": [ + { + "key": "FSU", + "name": "Fix on system upgrade", + "definition": "The vulnerability should be remediated the next time the vulnerable asset receives a scheduled major upgrade or rebuild." + }, + { + "key": "60D", + "name": "60 days", + "definition": "Remediate within 60 days." + }, + { + "key": "14D", + "name": "14 days", + "definition": "Remediate within 14 days." + }, + { + "key": "3D", + "name": "3 days", + "definition": "Remediate within 3 days." + }, + { + "key": "3DF", + "name": "3 days & forensic investigation", + "definition": "Remediate within 3 days and carry out a forensic triage of the asset to assess whether the system is compromised." + } + ] + }, + "values": { + "FSU": { + "key": "FSU", + "name": "Fix on system upgrade", + "definition": "The vulnerability should be remediated the next time the vulnerable asset receives a scheduled major upgrade or rebuild." + }, + "60D": { + "key": "60D", + "name": "60 days", + "definition": "Remediate within 60 days." + }, + "14D": { + "key": "14D", + "name": "14 days", + "definition": "Remediate within 14 days." + }, + "3D": { + "key": "3D", + "name": "3 days", + "definition": "Remediate within 3 days." + }, + "3DF": { + "key": "3DF", + "name": "3 days & forensic investigation", + "definition": "Remediate within 3 days and carry out a forensic triage of the asset to assess whether the system is compromised." + } + } + } + } + }, "CISA": { "key": "CISA", "versions": { @@ -7759,6 +7869,254 @@ "cisa": { "namespace": "cisa", "keys": { + "DT_BOD2604": { + "key": "DT_BOD2604", + "versions": { + "1.0.0": { + "version": "1.0.0", + "obj": { + "namespace": "cisa", + "key": "DT_BOD2604", + "version": "1.0.0", + "name": "CISA BOD 26-04", + "definition": "Decision table for CISA BOD 26-04.", + "schemaVersion": "2.0.0", + "decision_points": { + "cisa:PE:1.0.0": { + "namespace": "cisa", + "key": "PE", + "version": "1.0.0", + "name": "Publicly Exposed", + "definition": "Denotes whether the asset is accessible to unauthenticated or untrusted entities via public networks.", + "schemaVersion": "2.0.0", + "values": [ + { + "key": "N", + "name": "No", + "definition": "The asset is not accessible to unauthenticated or untrusted entities via public networks, such as the internet, regardless of its physical or logical location." + }, + { + "key": "Y", + "name": "Yes", + "definition": "The asset is accessible to unauthenticated or untrusted entities via public networks, such as the internet, regardless of its physical or logical location." + } + ] + }, + "cisa:KEV:1.0.0": { + "namespace": "cisa", + "key": "KEV", + "version": "1.0.0", + "name": "In KEV", + "definition": "Denotes whether a vulnerability is in the CISA Known Exploited Vulnerabilities (KEV) list.", + "schemaVersion": "2.0.0", + "values": [ + { + "key": "N", + "name": "No", + "definition": "Vulnerability is not listed in KEV." + }, + { + "key": "Y", + "name": "Yes", + "definition": "Vulnerability is listed in KEV." + } + ] + }, + "ssvc:A:2.0.0": { + "namespace": "ssvc", + "key": "A", + "version": "2.0.0", + "name": "Automatable", + "definition": "Can an attacker reliably automate creating exploitation events for this vulnerability?", + "schemaVersion": "2.0.0", + "values": [ + { + "key": "N", + "name": "No", + "definition": "Attackers cannot reliably automate steps 1-4 of the kill chain for this vulnerability. These steps are (1) reconnaissance, (2) weaponization, (3) delivery, and (4) exploitation." + }, + { + "key": "Y", + "name": "Yes", + "definition": "Attackers can reliably automate steps 1-4 of the kill chain." + } + ] + }, + "ssvc:TI:1.0.0": { + "namespace": "ssvc", + "key": "TI", + "version": "1.0.0", + "name": "Technical Impact", + "definition": "The technical impact of the vulnerability.", + "schemaVersion": "2.0.0", + "values": [ + { + "key": "P", + "name": "Partial", + "definition": "The exploit gives the adversary limited control over, or information exposure about, the behavior of the software that contains the vulnerability. Or the exploit gives the adversary an importantly low stochastic opportunity for total control." + }, + { + "key": "T", + "name": "Total", + "definition": "The exploit gives the adversary total control over the behavior of the software, or it gives total disclosure of all information on the system that contains the vulnerability." + } + ] + }, + "cisa:BOD2604:1.0.0": { + "namespace": "cisa", + "key": "BOD2604", + "version": "1.0.0", + "name": "CISA BOD 26-04 Remediation Timelines", + "definition": "The CISA BOD 26-04 outcome group of remediation timelines for agencies to follow.", + "schemaVersion": "2.0.0", + "values": [ + { + "key": "FSU", + "name": "Fix on system upgrade", + "definition": "The vulnerability should be remediated the next time the vulnerable asset receives a scheduled major upgrade or rebuild." + }, + { + "key": "60D", + "name": "60 days", + "definition": "Remediate within 60 days." + }, + { + "key": "14D", + "name": "14 days", + "definition": "Remediate within 14 days." + }, + { + "key": "3D", + "name": "3 days", + "definition": "Remediate within 3 days." + }, + { + "key": "3DF", + "name": "3 days & forensic investigation", + "definition": "Remediate within 3 days and carry out a forensic triage of the asset to assess whether the system is compromised." + } + ] + } + }, + "outcome": "cisa:BOD2604:1.0.0", + "mapping": [ + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "FSU" + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "14D" + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "60D" + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "60D" + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "FSU" + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "14D" + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "14D" + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "14D" + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "14D" + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "14D" + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "60D" + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "3D" + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "3DF" + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "3DF" + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "3D" + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "3DF" + } + ] + } + } + } + }, "DT_CO": { "key": "DT_CO", "versions": { diff --git a/doc/LICENSE b/doc/LICENSE index db23a092..7ae3b6c0 100644 --- a/doc/LICENSE +++ b/doc/LICENSE @@ -1,4 +1,4 @@ -Copyright 2025 Carnegie Mellon University. +Copyright 2026 Carnegie Mellon University. This material is based upon work funded and supported by the Department of Homeland Security under Contract No. FA8702-15-D-0002 with Carnegie Mellon University for the operation of the Software Engineering Institute, a federally funded research and development center sponsored by the United States Department of Defense. diff --git a/docker/Dockerfile b/docker/Dockerfile index 3fd4c214..bd171b6b 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -11,7 +11,7 @@ COPY . /app ENV PYTHONPATH=/app/src # install requirements -RUN uv sync --frozen +RUN uv sync --frozen --no-dev FROM dependencies AS test @@ -19,10 +19,10 @@ ENV PYTHONPATH=/app/src # Install pytest and dev dependencies RUN uv sync --frozen --dev # Run the unit tests -CMD ["uv", "run", "pytest"] +CMD ["uv", "run", "--no-sync", "pytest"] FROM dependencies AS docs -CMD ["uv", "run", "mkdocs", "serve", "--dev-addr", "0.0.0.0:8000"] +CMD ["uv", "run", "--no-sync", "mkdocs", "serve", "--dev-addr", "0.0.0.0:8000"] FROM dependencies AS registry_api -CMD ["uv", "run", "uvicorn", "ssvc.api.main:app", "--host", "0.0.0.0", "--port", "8000"] +CMD ["uv", "run", "--no-sync", "uvicorn", "ssvc.api.main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/docs/LICENSE b/docs/LICENSE index db23a092..7ae3b6c0 100644 --- a/docs/LICENSE +++ b/docs/LICENSE @@ -1,4 +1,4 @@ -Copyright 2025 Carnegie Mellon University. +Copyright 2026 Carnegie Mellon University. This material is based upon work funded and supported by the Department of Homeland Security under Contract No. FA8702-15-D-0002 with Carnegie Mellon University for the operation of the Software Engineering Institute, a federally funded research and development center sponsored by the United States Department of Defense. diff --git a/docs/_includes/ADR0014.md b/docs/_includes/ADR0014.md new file mode 100644 index 00000000..787b159c --- /dev/null +++ b/docs/_includes/ADR0014.md @@ -0,0 +1,11 @@ +!!! note inline end "About the term "decision tree"" + + In machine learning, a decision tree usually refers to a model learned from + data through statistical analysis. That’s not what SSVC uses the term for. In + the original SSVC documentation, decision tree referred to the + operations-research concept: a hand-crafted structure that encodes deliberate + choices, not a model inferred from datasets. + + Starting in SSVC v2025.9, we shifted to the term decision table to avoid + confusion with the ML meaning. For more information, see + [ADR-0014](../adr/0014-use-decision-table-terminology.md). diff --git a/docs/about/copyright.md b/docs/about/copyright.md index 79904388..392e3d83 100644 --- a/docs/about/copyright.md +++ b/docs/about/copyright.md @@ -1,4 +1,4 @@ -Copyright 2025 Carnegie Mellon University. +Copyright 2026 Carnegie Mellon University. This material is based upon work funded and supported by the Department of Homeland Security under Contract No. FA8702-15-D-0002 with Carnegie Mellon University for the operation of the Software Engineering Institute, a federally funded research and development center sponsored by the United States Department of Defense. diff --git a/docs/adr/0014-use-decision-table-terminology.md b/docs/adr/0014-use-decision-table-terminology.md new file mode 100644 index 00000000..358fdc20 --- /dev/null +++ b/docs/adr/0014-use-decision-table-terminology.md @@ -0,0 +1,76 @@ +--- +status: "accepted" +date: 2025-08-26 +--- +# Use "Decision Table" Instead of "Decision Tree" + +## Context and Problem Statement + +SSVC uses a tabular model to map combinations of decision point values to +recommended actions. Historically, this model was referred to as a "decision +tree" or "decision policy" with both terms being used interchangeably in +documentation and tooling. While our use of "decision tree" was consistent with +usage in the context of Operations Research +(Wikipedia: [Decision tree](https://en.wikipedia.org/wiki/Decision_tree)), +it caused confusion with the related-yet-different concept from Machine Learning +(Wikipedia: [Decision tree learning](https://en.wikipedia.org/wiki/Decision_tree_learning)). +Furthermore, the term "decision policy" has overloaded meanings beyond our +intended usage. We want to avoid confusion on both fronts, therefore we need a +new term. + +## Decision Drivers + +- Avoid ambiguity with the machine learning and operations research concept of + "decision tree" +- Use a less contentious term than "policy" as we are not dictating "capital-P + Policy" +- Accurately describe the underlying SSVC data structure, which is a table of + decision point value combinations and outcomes +- Improve clarity in documentation, tooling, and communication with + practitioners +- Align terminology with the actual data representations used (CSV and JSON + tables) + +## Considered Options + +- Switch to decision framework +- Switch to decision table +- Switch to decision model + +## Decision Outcome + +Chosen option: "Switch to decision table" + +### Rationale + +"Decision table" accurately describes the tabular structure used by +SSVC and avoids the well-established conflicting meaning of "decision tree" in +machine learning and statistics. + +We may use *decision model* for the more generic class of things to which a +*decision table* belongs, but *decision table* is specific enough to make it +clear exactly what our intended meaning is. + +### Consequences + +- Good, because the terminology now accurately reflects the underlying data + model (a table mapping decision point values to outcomes) +- Good, because it reduces confusion for practitioners familiar with machine + learning +- Bad, because some existing documentation, external references, and tooling may + still use "decision tree" — these will be updated incrementally +- Bad, because the change breaks consistency with prior SSVC publications and + external references that use "decision tree" + +### Confirmation + +Documentation, code, and tooling use "decision table" as the primary term for +an SSVC decision model. References to "decision tree" in the visual/hierarchical sense +(i.e., tree diagrams used to illustrate a decision table) may still appear where +appropriate but should be clearly distinguished from the decision table itself. + +## More Information + +- This change was introduced with the [SSVC v2025.9 release](https://github.com/CERTCC/SSVC/releases/tag/v2025.9). +- Wikipedia's [Decision table](https://en.wikipedia.org/wiki/Decision_table) page aligns with the concept that + we are trying to capture. diff --git a/docs/adr/0015-ssvc-json-schemas-use-schemaver.md b/docs/adr/0015-ssvc-json-schemas-use-schemaver.md new file mode 100644 index 00000000..753a7fea --- /dev/null +++ b/docs/adr/0015-ssvc-json-schemas-use-schemaver.md @@ -0,0 +1,106 @@ +--- +status: accepted +date: 2024-07-09 +deciders: Allen D. Householder, Vijay Sarvepalli +--- +# SSVC JSON Schemas Use SchemaVer + +## Context and Problem Statement + +SSVC defines JSON schemas to validate the structure of data objects such as decision points, decision +point groups, and decision point value selections. As these schemas evolve, we need a versioning scheme +that accurately communicates compatibility expectations to schema consumers. + +SSVC already uses [Semantic Versioning (SemVer)](https://semver.org/) for decision points +(see [ADR-0002](0002-ssvc-decision-points-are-versioned.md)) and decision point groups +(see [ADR-0004](0004-ssvc-decision-point-groups-are-versioned.md)). +However, SemVer was designed for software APIs and libraries, where "breaking" means a caller's code +must change. For JSON schemas, "breaking" means something different: it means existing data instances +may no longer validate against the new schema. These are distinct concerns that call for a +purpose-built approach. + +## Decision Drivers + +- JSON schema changes have data-compatibility semantics that differ from API/code-compatibility semantics. +- Consumers of SSVC schemas need to know whether a schema change will affect validation of their + existing stored data. +- SemVer's MAJOR/MINOR/PATCH model does not map cleanly onto schema evolution: a "minor" schema + addition (new optional field) does not break old data but may break some tooling; a field removal + always breaks all old data. +- A schema-specific versioning convention would make compatibility implications immediately legible + without consulting a changelog. + +## Considered Options + +- [Semantic Versioning (SemVer)](https://semver.org/) — already used for decision points and groups +- [SchemaVer](https://docs.snowplow.io/docs/api-reference/iglu/common-architecture/schemaver/) — designed specifically for JSON schema evolution +- [Calendar Versioning (CalVer)](https://calver.org/) — already adopted for overall SSVC project releases + +## Decision Outcome + +Chosen option: **SchemaVer**, because it was designed specifically for JSON schema versioning and its +three components map directly onto the compatibility questions that matter for schema consumers. + +SchemaVer uses the format `MODEL-REVISION-ADDITION`, starting at `1-0-0`. For existing SSVC +schemas, adoption of this ADR preserves the current logical version and normalizes legacy dotted forms +such as `2.0.0` to the equivalent SchemaVer form `2-0-0`; similarly, values already written as +`1-0-1` are treated as already using SchemaVer, while newly introduced schemas begin at `1-0-0`: + +| Component | When to increment | Compatibility implication | +|------------|-------------------|--------------------------| +| `MODEL` | Schema change is incompatible with **any** historical data | Existing data **will not** validate | +| `REVISION` | Schema change may prevent interaction with **some** historical data | Existing data **may not** validate | +| `ADDITION` | Schema change is compatible with **all** historical data | Existing data **will** continue to validate | + +Applied to SSVC schemas: + +### Increment MODEL when + +- A required field is removed +- A field's type or allowed values change in a way that invalidates previously valid data +- The schema's root structure changes (e.g., from object to array) + +### Increment REVISION when + +- A previously optional field becomes required (breaks data that omitted it) +- An `enum` gains values that affect round-trip processing for some consumers +- Constraints are tightened in a way that some existing data would fail (e.g., a minimum length + is added to a string field) + +### Increment ADDITION when + +- A new optional field is added +- A constraint is relaxed (e.g., removing a `maxLength`) +- Documentation (`description`, `$comment`) is updated without changing validation behavior +- An `enum` gains new allowed values in a way that only expands what is valid + +### Consequences + +- Good, because schema version strings immediately communicate data-compatibility impact without + requiring consumers to read a changelog. +- Good, because SchemaVer's semantics are independent of—and complementary to—SemVer on the + objects those schemas describe (a decision point can be at SemVer `2.0.0` while its schema + is at SchemaVer `1-2-3`). +- Good, because the approach scales naturally: `MODEL` increments are rare (most schema evolution + is additive), keeping churn low. +- Neutral, because SchemaVer is less widely known than SemVer, introducing a small learning curve + for new contributors. +- Bad, because existing schemas that were informally versioned (or unversioned) will need to be + assigned an initial SchemaVer version, requiring a one-time migration effort. + +### Confirmation + +- JSON schema files must continue to use `$schema` for the JSON Schema metaschema URI, and must + carry the SchemaVer identifier in `$id` and/or a dedicated version field such as `schemaVersion`. +- PR review process verifies that the correct SchemaVer component is incremented according to + these rules before merging schema changes. + +## More Information + +- [Issue #601](https://github.com/CERTCC/SSVC/issues/601) — original request for this ADR +- [PR #599 discussion](https://github.com/CERTCC/SSVC/pull/599#discussion_r1674439644) — discussion + that identified the need for a schema-specific versioning approach +- [SchemaVer specification](https://docs.snowplow.io/docs/api-reference/iglu/common-architecture/schemaver/) +- [ADR-0002 — SSVC Decision Points are versioned using Semantic Versioning](0002-ssvc-decision-points-are-versioned.md) +- [ADR-0004 — Decision Point Groups are Versioned using SemVer](0004-ssvc-decision-point-groups-are-versioned.md) +- [ADR-0013 — SSVC Project Versions Follow CalVer](0013-ssvc-project-versions.md) diff --git a/docs/adr/index.md b/docs/adr/index.md index 0571e67f..637562cf 100644 --- a/docs/adr/index.md +++ b/docs/adr/index.md @@ -25,6 +25,8 @@ the decision records that have been made. - [0011 - Correspondence between Automatable v2.0.0, Value Density v1.0.0, and CVSS v4](0011-automatable-and-value-density-and-CVSSv4.md) - [0012 - SSVC Namespaces](0012-ssvc-namespaces.md) - [0013 - SSVC Project Versions](0013-ssvc-project-versions.md) +- [0014 - Use "Decision Table" Instead of "Decision Tree"](0014-use-decision-table-terminology.md) +- [0015 - SSVC JSON Schemas Use SchemaVer](0015-ssvc-json-schemas-use-schemaver.md) ## Rejected Records diff --git a/docs/howto/cisa_response.md b/docs/howto/cisa_response.md new file mode 100644 index 00000000..133b3aa8 --- /dev/null +++ b/docs/howto/cisa_response.md @@ -0,0 +1,71 @@ +# HOW TO USE THE CISA RESPONSE TIMELINE SSVC DECISION TREE + +The CISA Response Timeline SSVC Decision Tree is a tool support implementers +of [CISA BOD 26-04](https://www.cisa. +gov/news-events/directives/bod-26-04-prioritizing-security-updates-based-risk). +Readers should consult the directive for more details about how to use the +decision table below. What follows is just a brief introduction to the +outcomes, decision points, and decision table structure. + +## Outcomes and Decision Points + +The CISA Response Timeline has 4 binary decision points: + +1. InKEV +2. Publicly Exposed +3. Automatable +4. Technical Impact + +More information about each of these will be at the bottom of this page. + +These 4 decision points are combined to yield 4 outcomes for vulnerability +response timelines: + +```python exec="true" idprefix="" +from ssvc.outcomes.cisa.bod2604 import LATEST +from ssvc.doc_helpers import example_block + +print(example_block(LATEST)) +``` + +InKEV, Automatable, and Technical Impact address the vulnerability whereas +Publicly Exposed questions the state of the asset. + +```python exec="true" idprefix="" +from ssvc.decision_points.cisa.in_kev import IN_KEV_1 +from ssvc.decision_points.cisa.publicly_exposed import PUBLICLY_EXPOSED_1 +from ssvc.decision_points.ssvc.automatable import AUTOMATABLE_2 +from ssvc.decision_points.ssvc.technical_impact import TECHNICAL_IMPACT_1 +from ssvc.doc_helpers import example_block + +print(example_block(IN_KEV_1)) +print(example_block(PUBLICLY_EXPOSED_1)) +print(example_block(AUTOMATABLE_2)) +print(example_block(TECHNICAL_IMPACT_1)) +``` + +## CISA BOD 26-04 Decision Model + +```python exec="true" idprefix="" +from ssvc.decision_tables.cisa.bod_2604_dt import LATEST as DT +from ssvc.decision_tables.helpers import mapping2mermaid, mermaid_title_from_dt + +rows = DT.mapping +title = mermaid_title_from_dt(DT) +print(mapping2mermaid(rows, title=title)) +``` + +### Table of Values + +The table below shows the values for the decision model. +Each row of the table corresponds to a path through the decision model diagram above. + +{% include-markdown "../_includes/_scrollable_table.md" heading-offset=1 %} + +```python exec="true" idprefix="" + +from ssvc.decision_tables.cisa.bod_2604_dt import LATEST as DT +from ssvc.decision_tables.helpers import dt2df_md + +print(dt2df_md(DT)) +``` diff --git a/docs/howto/deployer_tree.md b/docs/howto/deployer_tree.md index 09c4a777..99ce4c1f 100644 --- a/docs/howto/deployer_tree.md +++ b/docs/howto/deployer_tree.md @@ -115,7 +115,7 @@ The Deployer Patch Deployment Priority decision model uses the following decisio - [*Exploitation*](../reference/decision_points/exploitation.md) - A vulnerability with known exploitation is more likely to be given a higher priority. - [*System Exposure*](../reference/decision_points/system_exposure.md) - The more exposed a system is, the more likely it is to be given a higher priority. -- [*Utility*](../reference/decision_points/utility.md) - The more useful a vulnerability is to an attacker, the more likely it is to be given a higher priority. +- [*Automatable*](../reference/decision_points/automatable.md) - The more automatable a vulnerability is, the more likely it is to be given a higher priority. - [*Human Impact*](../reference/decision_points/human_impact.md) - The more severe the human (safety, mission) impact of a vulnerability, the more likely it is to be given a higher priority. More detail about each of these decision points is provided at the links above, here we provide a brief summary of each. diff --git a/docs/reference/decision_points/cisa/in_kev.md b/docs/reference/decision_points/cisa/in_kev.md new file mode 100644 index 00000000..f88b8546 --- /dev/null +++ b/docs/reference/decision_points/cisa/in_kev.md @@ -0,0 +1,8 @@ +# In KEV + +```python exec="true" idprefix="" +from ssvc.decision_points.cisa.in_kev import LATEST +from ssvc.doc_helpers import example_block + +print(example_block(LATEST)) +``` diff --git a/docs/reference/decision_points/cisa/index.md b/docs/reference/decision_points/cisa/index.md new file mode 100644 index 00000000..51ec0116 --- /dev/null +++ b/docs/reference/decision_points/cisa/index.md @@ -0,0 +1,8 @@ +# CISA Custom Decision Points + +In their customization of SSVC, CISA has implemented a set of custom +decision points. + +- [In KEV](in_kev.md) +- [Mission Prevalence](mission_prevalence.md) +- [Publicly Exposed](publicly_exposed.md) diff --git a/docs/reference/decision_points/cisa/mission_prevalence.md b/docs/reference/decision_points/cisa/mission_prevalence.md new file mode 100644 index 00000000..f022b6b4 --- /dev/null +++ b/docs/reference/decision_points/cisa/mission_prevalence.md @@ -0,0 +1,8 @@ +# Mission Prevalence + +```python exec="true" idprefix="" +from ssvc.decision_points.cisa.mission_prevalence import LATEST +from ssvc.doc_helpers import example_block + +print(example_block(LATEST)) +``` diff --git a/docs/reference/decision_points/cisa/publicly_exposed.md b/docs/reference/decision_points/cisa/publicly_exposed.md new file mode 100644 index 00000000..602def95 --- /dev/null +++ b/docs/reference/decision_points/cisa/publicly_exposed.md @@ -0,0 +1,8 @@ +# Publicly Exposed + +```python exec="true" idprefix="" +from ssvc.decision_points.cisa.publicly_exposed import LATEST +from ssvc.doc_helpers import example_block + +print(example_block(LATEST)) +``` diff --git a/docs/ssvc-calc/findex.html b/docs/ssvc-calc/findex.html index c695dcf1..c71740d2 100644 --- a/docs/ssvc-calc/findex.html +++ b/docs/ssvc-calc/findex.html @@ -1,5 +1,5 @@ |input to| model + model -->|defines| apply + apply -->|lead to| do + do -->|produce| effects + dc -->|informs| dps + effects -->|informs| gov + gov -->|refines| ssvcdt + gov -->|refines| dc +``` + +Vulnerability response is increasingly driven by automation. +On the input side, [Data Mapping](../howto/bootstrap/collect.md) funnels large-scale +data +collection into the small set of SSVC decision points. +On the output side, [Use & Respond](../howto/bootstrap/use.md) fans the model's outputs +out into operational decisions at scale. +SSVC sits in the middle as the human-scale interface where organizational policy +is defined and refined into decision support tools that can be automated. +This approach ensures that while the process is efficient and automated, the +core decision-making remains transparent, accountable, and aligned with +organizational risk appetite, providing a necessary bridge between technical +data and business policy. + +In the diagram above, the `Decision Model` subgraph (containing SSVC Decision +Points and the Decision Table) represents the SSVC scope. Data Mapping and +Use & Respond are adjacent processes that interface with SSVC on either side +but are outside its core scope. + +## Condensing Complexity into Human-Scale Decisions + +The initial stages of vulnerability +response—[data collection and mapping](../howto/bootstrap/collect.md)—often involve large +amounts of information, various data sharing formats (e.g., [CSAF](https://www.csaf.io/), +[CVE JSON](https://cveproject.github.io/cve-schema/schema/docs/)), and +diverse analytical tools, increasingly including AI features like large +language models (LLMs). SSVC's +core function is to condense this extensive, complex dataset into a small, +manageable set of [decision points](/reference/decision_points/index.md). + +These decision points possess several key characteristics that make them +suitable for human oversight and policy definition: + +- **Densely Defined and Ordinal:** Each decision point uses values that are + ordered (ordinal variables), moving from least likely to most likely to imply + action (e.g., Low, Medium, High). This ordering provides a clear, qualitative + progression without implying equal spacing between values. +- **Orthogonal and Independent:** The chosen decision points capture unique + dimensions of the problem. By minimizing conceptual overlap, the model ensures + that each dimension contributes independently to the final outcome, keeping + the overall decision table compact and easier to reason about. The goal is to + have completely independent decision points to reduce ambiguity. +- **Chunky Values:** To prevent the decision space from becoming unmanageable, + decision points are limited to a small number of values, typically two to + five. This restriction keeps the size of the final decision table small, as + the total table size is the product of the value counts for each decision + point. + +## The Decision Table: Policy as Code + +By defining a set of orthogonal, ordered decision points, SSVC induces a +*partial order* on the entire input space (the Cartesian product of all +decision point values). The resulting ordered set of input combinations is then +mapped, via a [decision table](/topics/decision_trees.md), onto a predefined +[outcome set](/reference/decision_points/outcomes) of ordered +outcomes. + +The decision table serves as the codified organizational policy. The outcomes +are also ordered and typically represent service-level expectations (SLEs), +priorities (e.g., Low, Medium, Critical), or prescribed actions (e.g., Defer, +Scheduled, Out-of-Cycle, Immediate). This mapping of inputs to output values +defines the policy. + +Key criteria for the decision table design include: + +| Criterion | Rationale | +|:----------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Small Size** | Avoids complexity; keeps the number of questions required for analysis minimal (ideally 2-7 inputs, not dozens). Collecting and discriminating between dozens of values comes at an unnecessary cost. | +| **Orthogonal Inputs** | Ensures inputs are independent, reducing ambiguity and overlap. | +| **Chunky Values** | Limiting values per input (2-5) prevents exponential growth of the table size ($3 \times 3 \times 3 = 27$ rows; $4 \times 3 \times 3 \times 3 = 108$ rows). | +| **Understandability** | Decision points must be understandable to non-technical risk owners, focusing on business impact rather than technical specifics (e.g., "Criticality of Affected System" instead of "Buffer Overflow vs. SQL Injection"). | + +## The Role of the Human in a Machine-Driven World + +With the decision table in place, automation can handle the volume—but humans +remain accountable for the quality and appropriateness of the policy that +drives it. + +### Accountability and Risk Alignment + +The decision table provides an explicit, unambiguous link between technical +vulnerability characteristics and organizational risk appetite. This structure +facilitates crucial conversations between technical staff—who are responsible +for developing or deploying mitigations and fixes—and risk owners +(CISO, IT management, senior management), +transferring responsibility from technical staff making proxy judgments to risk +owners defining explicit policy. + +- **Before SSVC:** Technical staff make proxy judgments based on complex + scores (e.g., CVSS 7.6 vs. 5.9), which risk owners often don't fully + comprehend. +- **With SSVC:** Decisions are explained using comprehensible terms: "We are + responding immediately because this has **High Technical Impact** and affects + a **Critical Central Server**. This aligns with our established policy." The + risk owner can also explain this policy up to their management. + +### Governance and Policy Refinement + +SSVC is designed for straightforward modification, enabling +policy owners to easily adapt their response posture when needed. Changes +can be managed through predictable steps. This process ensures that when a risk owner +desires a change, the modification to the decision table can be +clearly executed and understood. + +The SSVC governance process—described in detail in +the [Prepare](../howto/bootstrap/prepare.md#establish-governance) step of the Getting +Started guide—is what makes this refinement practical. Because the decision +table is small and explicit, conversations about policy changes stay grounded: + +> *"Why did we respond that way?"* +> "Because conditions A, B, and C were all met." +> *"I think we should have responded differently in that case."* +> "Should we add a new condition D to every decision, or just re-label the +outcome for the row where (A, B, C) applies?" + +This kind of structured conversation is exactly what SSVC is designed to enable. +A lightweight governance process periodically reviews each element of the model: + +- Are the *outcomes* still relevant to the organization? +- Are the *decision points* capturing the right dimensions of the problem? +- Does the *decision table* still reflect how the organization wants to make + decisions? + - Have there been cases where the table led to a decision that was later + regretted? + - Are there new constraints or requirements not yet captured? +- Is the [data mapping](../howto/bootstrap/prepare.md) still appropriate—are the + right data sources being used to assign values to decision points? + +Depending on the review, adjustments can be made to any element of the +model—outcomes, decision points, the decision table, or data mapping. The +impact of those adjustments is predictable: + +| Modification Type | Impact on Table Size and Complexity | +|:-----------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Adjusting Outcome Labels** | Simple fix; maintain existing inputs and values. Requires technical check to ensure partial order causality is maintained (e.g., low-risk inputs cannot have high-priority outcomes). | +| **Adding/Reducing Values** | Small, measurable change. Adding a value increases the table size additively (e.g., $3 \times 3 \times 3 = 27$ to $4 \times 3 \times 3 = 36$). | +| **Adding a Decision Point** | Multiplicative increase in table size (e.g., $3 \times 3 \times 3 = 27$ to $3 \times 3 \times 3 \times 3 = 81$). Requires a more involved policy review. | + +Crucially, governance should involve the right stakeholders. Risk owners must be +involved in reviewing and adjusting the decision table itself, while +vulnerability management and IT security teams are best positioned to review the +data mapping and decision point definitions. Observing the real-world results of +SSVC-driven decisions—as they flow back through operations—provides the +empirical basis for identifying where the model needs refinement. + +## SSVC is Not a Process Bottleneck + +Crucially, SSVC being a "human-scale bottleneck" does **not** mean it forces a +human to manually review every decision. The decision table, once defined, is +entirely automatable. + +Automation can exist throughout the entire response workflow: + +- **Input Automation:** AI (e.g., an LLM) can perform the "reading + comprehension test" + of analyzing raw vulnerability data and mechanically selecting the correct + values for the SSVC decision points. The [data mapping](../howto/bootstrap/collect.md) + established during [Prepare](../howto/bootstrap/prepare.md) defines how to + connect data sources to decision point values. +- **Output Automation:** The prioritized outcome from the SSVC table (e.g., "Immediate") can feed directly into automated patching, ticketing, or software + fix development systems. See [Use & Respond](../howto/bootstrap/use.md) for how to + operationalize SSVC outcomes at scale. + +SSVC acts as a fixed, unambiguous interface. The "human scale" element is in the +*design and governance* of this interface, ensuring human accountability and +understanding of the decision-making logic. The table's fixed structure means +there is no ambiguity—you know what the +output will be based on the defined inputs and policy. It is the locus where +technical reality meets organizational policy. SSVC embodies the +*human-on-the-loop* pattern: the human is responsible for the decision +framework—not every individual decision. This keeps humans accountable for +the policy while freeing them from the operational volume that automation +handles best. diff --git a/mkdocs.yml b/mkdocs.yml index 50276ec9..2cbe5942 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -24,6 +24,7 @@ nav: - About Coordination: 'howto/coordination_intro.md' - Coordination Triage: 'howto/coordination_triage_decision.md' - Publication Decision: 'howto/publication_decision.md' + - CISA BOD 26-04 Response Model: 'howto/cisa_response.md' - CVSS v4 Analyst Models: - About CVSS v4: 'howto/cvss_v4/index.md' - Equivalence Set 1: 'howto/cvss_v4/eq1.md' @@ -65,6 +66,7 @@ nav: - Scope: 'topics/scope.md' - SSVC and Asset Management: 'topics/asset_management.md' - Putting the Pieces Together: 'topics/decision_points_as_bricks.md' + - SSVC as a Human-Scale Bottleneck: 'topics/ssvc-human-scale-bottleneck.md' - Worked Example: 'topics/worked_example.md' - Evaluation: 'topics/evaluation_of_draft_trees.md' - Related Systems: 'topics/related_systems.md' @@ -94,6 +96,11 @@ nav: - Human Impact: 'reference/decision_points/human_impact.md' - Public Safety Impact: 'reference/decision_points/public_safety_impact.md' - Utility: 'reference/decision_points/utility.md' + - CISA-based decision points: + - 'reference/decision_points/cisa/index.md' + - In KEV: 'reference/decision_points/cisa/in_kev.md' + - Mission Prevalence: 'reference/decision_points/cisa/mission_prevalence.md' + - Publicly Exposed: 'reference/decision_points/cisa/publicly_exposed.md' - CVSS-based decision points: - 'reference/decision_points/cvss/index.md' - Qualitative Severity: 'reference/decision_points/cvss/qualitative_severity.md' diff --git a/obsolete/SSVC_csv-to-latex.py b/obsolete/SSVC_csv-to-latex.py index f42a00ef..376de625 100755 --- a/obsolete/SSVC_csv-to-latex.py +++ b/obsolete/SSVC_csv-to-latex.py @@ -1,6 +1,6 @@ #!/usr/bin/python -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/obsolete/enumerate-coord-publish-options.sh b/obsolete/enumerate-coord-publish-options.sh index f22ebb3d..daa30f6e 100755 --- a/obsolete/enumerate-coord-publish-options.sh +++ b/obsolete/enumerate-coord-publish-options.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/obsolete/enumerate-coord-triage-options.sh b/obsolete/enumerate-coord-triage-options.sh index 205e9d4d..229f5e1d 100755 --- a/obsolete/enumerate-coord-triage-options.sh +++ b/obsolete/enumerate-coord-triage-options.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/obsolete/enumerate-deployer-options.sh b/obsolete/enumerate-deployer-options.sh index 4e12cd70..bc3f9af8 100755 --- a/obsolete/enumerate-deployer-options.sh +++ b/obsolete/enumerate-deployer-options.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/obsolete/enumerate-supplier-options.sh b/obsolete/enumerate-supplier-options.sh index 7b6de2d3..998fb502 100755 --- a/obsolete/enumerate-supplier-options.sh +++ b/obsolete/enumerate-supplier-options.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/obsolete/ssvc_v2.py b/obsolete/ssvc_v2.py index a84cc37c..3c17d599 100644 --- a/obsolete/ssvc_v2.py +++ b/obsolete/ssvc_v2.py @@ -4,7 +4,7 @@ author: adh created_at: 3/23/21 3:23 PM """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/pdfs/LICENSE b/pdfs/LICENSE index db23a092..7ae3b6c0 100644 --- a/pdfs/LICENSE +++ b/pdfs/LICENSE @@ -1,4 +1,4 @@ -Copyright 2025 Carnegie Mellon University. +Copyright 2026 Carnegie Mellon University. This material is based upon work funded and supported by the Department of Homeland Security under Contract No. FA8702-15-D-0002 with Carnegie Mellon University for the operation of the Software Engineering Institute, a federally funded research and development center sponsored by the United States Department of Defense. diff --git a/pyproject.toml b/pyproject.toml index 93a556c4..f5104461 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,6 +42,7 @@ dependencies = [ "mkdocs-table-reader-plugin>=3.1.0", "mkdocs-print-site-plugin>=2.8", "markdown-exec[ansi]>=1.11.0", + "pymdown-extensions>=10.21.2", "thefuzz>=0.22.1", "scikit-learn>=1.6.1", "networkx>=3.4.2", @@ -92,3 +93,6 @@ dev = [ "linkchecker>=10.6.0", "pytest>=8.4.1", ] +codegen = [ + "abnf-to-regexp>=1.2.0", +] diff --git a/src/LICENSE b/src/LICENSE index 9bc24bd1..b7cbe994 100644 --- a/src/LICENSE +++ b/src/LICENSE @@ -1,4 +1,4 @@ -Copyright 2025 Carnegie Mellon University. +Copyright 2026 Carnegie Mellon University. Licensed under a MIT (SEI)-style license, please see license.txt or contact permission@sei.cmu.edu for full terms. diff --git a/src/ssvc/__init__.py b/src/ssvc/__init__.py index 3cb5b746..b75405d4 100644 --- a/src/ssvc/__init__.py +++ b/src/ssvc/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/_mixins.py b/src/ssvc/_mixins.py index d57d3e45..cbb7320f 100644 --- a/src/ssvc/_mixins.py +++ b/src/ssvc/_mixins.py @@ -3,7 +3,7 @@ This module provides mixin classes for adding features to SSVC objects. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/api/__init__.py b/src/ssvc/api/__init__.py index bf6fa6cc..2b92f7f4 100644 --- a/src/ssvc/api/__init__.py +++ b/src/ssvc/api/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/api/helpers.py b/src/ssvc/api/helpers.py index c9b5ce78..e94e7cf4 100644 --- a/src/ssvc/api/helpers.py +++ b/src/ssvc/api/helpers.py @@ -5,7 +5,7 @@ created_at: 8/20/25 4:35 PM """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/api/main.py b/src/ssvc/api/main.py index 05a592e7..7f2e59ae 100644 --- a/src/ssvc/api/main.py +++ b/src/ssvc/api/main.py @@ -3,7 +3,7 @@ API for SSVC """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/api/v1/__init__.py b/src/ssvc/api/v1/__init__.py index 15b1b5c8..0456f318 100644 --- a/src/ssvc/api/v1/__init__.py +++ b/src/ssvc/api/v1/__init__.py @@ -2,7 +2,7 @@ """ API version 1 router for SSVC """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/api/v1/response_models/__init__.py b/src/ssvc/api/v1/response_models/__init__.py index b66ceac9..7ba234bf 100644 --- a/src/ssvc/api/v1/response_models/__init__.py +++ b/src/ssvc/api/v1/response_models/__init__.py @@ -1,6 +1,6 @@ """Response Models for SSVC API.""" -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/api/v1/response_models/_type_defs.py b/src/ssvc/api/v1/response_models/_type_defs.py index 394cff87..06a9ffe9 100644 --- a/src/ssvc/api/v1/response_models/_type_defs.py +++ b/src/ssvc/api/v1/response_models/_type_defs.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/api/v1/routers/__init__.py b/src/ssvc/api/v1/routers/__init__.py index e490931b..fd910ec7 100644 --- a/src/ssvc/api/v1/routers/__init__.py +++ b/src/ssvc/api/v1/routers/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/api/v1/routers/decision_point.py b/src/ssvc/api/v1/routers/decision_point.py index 87923887..92a20af2 100644 --- a/src/ssvc/api/v1/routers/decision_point.py +++ b/src/ssvc/api/v1/routers/decision_point.py @@ -3,7 +3,7 @@ API Routes for decision_point """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/api/v1/routers/decision_points.py b/src/ssvc/api/v1/routers/decision_points.py index d1af14e9..701e497b 100644 --- a/src/ssvc/api/v1/routers/decision_points.py +++ b/src/ssvc/api/v1/routers/decision_points.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/api/v1/routers/decision_table.py b/src/ssvc/api/v1/routers/decision_table.py index 7f3d7044..c8d26aaf 100644 --- a/src/ssvc/api/v1/routers/decision_table.py +++ b/src/ssvc/api/v1/routers/decision_table.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/api/v1/routers/decision_tables.py b/src/ssvc/api/v1/routers/decision_tables.py index f8290215..571af98e 100644 --- a/src/ssvc/api/v1/routers/decision_tables.py +++ b/src/ssvc/api/v1/routers/decision_tables.py @@ -1,6 +1,6 @@ """Decision Tables API Router.""" -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/api/v1/routers/examples.py b/src/ssvc/api/v1/routers/examples.py index 090ba715..b6d32f43 100644 --- a/src/ssvc/api/v1/routers/examples.py +++ b/src/ssvc/api/v1/routers/examples.py @@ -3,7 +3,7 @@ SSVC API v1 Examples Router """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/api/v1/routers/keys.py b/src/ssvc/api/v1/routers/keys.py index 10883ef1..31bd3b41 100644 --- a/src/ssvc/api/v1/routers/keys.py +++ b/src/ssvc/api/v1/routers/keys.py @@ -1,6 +1,6 @@ """Keys API Router.""" -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/api/v1/routers/namespaces.py b/src/ssvc/api/v1/routers/namespaces.py index 7efc3fd6..62d92ef6 100644 --- a/src/ssvc/api/v1/routers/namespaces.py +++ b/src/ssvc/api/v1/routers/namespaces.py @@ -1,6 +1,6 @@ """Namespace Router.""" -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/api/v1/routers/objects.py b/src/ssvc/api/v1/routers/objects.py index 88a32e72..fb060dae 100644 --- a/src/ssvc/api/v1/routers/objects.py +++ b/src/ssvc/api/v1/routers/objects.py @@ -1,6 +1,6 @@ """Objects API Router.""" -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/api/v1/routers/types.py b/src/ssvc/api/v1/routers/types.py index 2fafd23a..0282403b 100644 --- a/src/ssvc/api/v1/routers/types.py +++ b/src/ssvc/api/v1/routers/types.py @@ -1,6 +1,6 @@ """Types Router.""" -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/api/v1/routers/v1_router.py b/src/ssvc/api/v1/routers/v1_router.py index 52422c05..5f85cda5 100644 --- a/src/ssvc/api/v1/routers/v1_router.py +++ b/src/ssvc/api/v1/routers/v1_router.py @@ -2,7 +2,7 @@ """ API version 1 router for SSVC """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/api/v1/routers/versions.py b/src/ssvc/api/v1/routers/versions.py index e9781b2a..5773464b 100644 --- a/src/ssvc/api/v1/routers/versions.py +++ b/src/ssvc/api/v1/routers/versions.py @@ -1,6 +1,6 @@ """Versions API Router.""" -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/csv_analyzer.py b/src/ssvc/csv_analyzer.py index 225d7b14..e8c226fe 100644 --- a/src/ssvc/csv_analyzer.py +++ b/src/ssvc/csv_analyzer.py @@ -40,7 +40,7 @@ Higher values imply more important features. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/__init__.py b/src/ssvc/decision_points/__init__.py index 7bd86f6d..de319568 100644 --- a/src/ssvc/decision_points/__init__.py +++ b/src/ssvc/decision_points/__init__.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/base.py b/src/ssvc/decision_points/base.py index 13dac927..c78a3494 100644 --- a/src/ssvc/decision_points/base.py +++ b/src/ssvc/decision_points/base.py @@ -3,7 +3,7 @@ """ Defines the formatting for SSVC Decision Points. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/basic/__init__.py b/src/ssvc/decision_points/basic/__init__.py index ebc4cbfc..dc46b0b9 100644 --- a/src/ssvc/decision_points/basic/__init__.py +++ b/src/ssvc/decision_points/basic/__init__.py @@ -2,7 +2,7 @@ Provides SSVC decision points in the `basic` namespace. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/basic/base.py b/src/ssvc/decision_points/basic/base.py index 57a87e32..00eb0960 100644 --- a/src/ssvc/decision_points/basic/base.py +++ b/src/ssvc/decision_points/basic/base.py @@ -2,7 +2,7 @@ """ Provides a base class for decision points in the SSVC 'basic' namespace. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/basic/near_boundary.py b/src/ssvc/decision_points/basic/near_boundary.py index 2fc5a28b..e6b8abe2 100644 --- a/src/ssvc/decision_points/basic/near_boundary.py +++ b/src/ssvc/decision_points/basic/near_boundary.py @@ -2,7 +2,7 @@ """ Provides a boolean decision point that can be used to indicate if another value is near a boundary condition. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/basic/probability/__init__.py b/src/ssvc/decision_points/basic/probability/__init__.py index da01e3e7..f3c6a3b3 100644 --- a/src/ssvc/decision_points/basic/probability/__init__.py +++ b/src/ssvc/decision_points/basic/probability/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/basic/probability/cis_wep.py b/src/ssvc/decision_points/basic/probability/cis_wep.py index 47afab41..e1e48b10 100644 --- a/src/ssvc/decision_points/basic/probability/cis_wep.py +++ b/src/ssvc/decision_points/basic/probability/cis_wep.py @@ -2,7 +2,7 @@ """ Provides probability-based decision points for SSVC """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/basic/probability/five_equal.py b/src/ssvc/decision_points/basic/probability/five_equal.py index f2017422..b2d97072 100644 --- a/src/ssvc/decision_points/basic/probability/five_equal.py +++ b/src/ssvc/decision_points/basic/probability/five_equal.py @@ -2,7 +2,7 @@ """ Provides a 5-level ascending probability scale decision point for SSVC """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/basic/probability/five_weighted.py b/src/ssvc/decision_points/basic/probability/five_weighted.py index 54488f09..58d6e349 100644 --- a/src/ssvc/decision_points/basic/probability/five_weighted.py +++ b/src/ssvc/decision_points/basic/probability/five_weighted.py @@ -2,7 +2,7 @@ """ Provides a 5-level ascending probability scale decision point for SSVC """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/basic/probability/two_equal.py b/src/ssvc/decision_points/basic/probability/two_equal.py index e5c5309e..1f6ffe62 100644 --- a/src/ssvc/decision_points/basic/probability/two_equal.py +++ b/src/ssvc/decision_points/basic/probability/two_equal.py @@ -2,7 +2,7 @@ """ Provides a 2-level ascending probability scale decision point for SSVC """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/basic/quantiles/__init__.py b/src/ssvc/decision_points/basic/quantiles/__init__.py index a72ff825..127acff7 100644 --- a/src/ssvc/decision_points/basic/quantiles/__init__.py +++ b/src/ssvc/decision_points/basic/quantiles/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/basic/quantiles/median.py b/src/ssvc/decision_points/basic/quantiles/median.py index ce382e0b..9d98704d 100644 --- a/src/ssvc/decision_points/basic/quantiles/median.py +++ b/src/ssvc/decision_points/basic/quantiles/median.py @@ -2,7 +2,7 @@ """ Provides median-based decision points for SSVC """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/basic/quantiles/quartiles.py b/src/ssvc/decision_points/basic/quantiles/quartiles.py index dd55b481..6a89fc65 100644 --- a/src/ssvc/decision_points/basic/quantiles/quartiles.py +++ b/src/ssvc/decision_points/basic/quantiles/quartiles.py @@ -2,7 +2,7 @@ """ Provides quartile-based decision points for SSVC """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/basic/quantiles/quintiles.py b/src/ssvc/decision_points/basic/quantiles/quintiles.py index 39b47608..0a867332 100644 --- a/src/ssvc/decision_points/basic/quantiles/quintiles.py +++ b/src/ssvc/decision_points/basic/quantiles/quintiles.py @@ -2,7 +2,7 @@ """ Provides quintile-based decision points for SSVC """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cisa/__init__.py b/src/ssvc/decision_points/cisa/__init__.py index e9f8bc40..f52ad061 100644 --- a/src/ssvc/decision_points/cisa/__init__.py +++ b/src/ssvc/decision_points/cisa/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University and Contributors. +# Copyright (c) 2026 Carnegie Mellon University and Contributors. # - see Contributors.md for a full list of Contributors # - see ContributionInstructions.md for information on how you can Contribute to this project # Stakeholder Specific Vulnerability Categorization (SSVC) is diff --git a/src/ssvc/decision_points/cisa/base.py b/src/ssvc/decision_points/cisa/base.py index 342c37a9..7116a080 100644 --- a/src/ssvc/decision_points/cisa/base.py +++ b/src/ssvc/decision_points/cisa/base.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cisa/in_kev.py b/src/ssvc/decision_points/cisa/in_kev.py index 6051b9f8..c93ab32f 100644 --- a/src/ssvc/decision_points/cisa/in_kev.py +++ b/src/ssvc/decision_points/cisa/in_kev.py @@ -2,7 +2,7 @@ """ Provides a decision point representing whether a vulnerability is in the CISA Known Exploited Vulnerabilities (KEV) list. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cisa/mission_prevalence.py b/src/ssvc/decision_points/cisa/mission_prevalence.py index 24bb5474..92395e27 100644 --- a/src/ssvc/decision_points/cisa/mission_prevalence.py +++ b/src/ssvc/decision_points/cisa/mission_prevalence.py @@ -4,7 +4,7 @@ Provides the Mission Prevalence decision point and its values. """ -# Copyright (c) 2024-2025 Carnegie Mellon University. +# Copyright (c) 2024-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cisa/publicly_exposed.py b/src/ssvc/decision_points/cisa/publicly_exposed.py new file mode 100644 index 00000000..0b55f163 --- /dev/null +++ b/src/ssvc/decision_points/cisa/publicly_exposed.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python +""" +Provides a decision point representing whether an asset is exposed via +public networks. + +Source: https://www.cisa.gov/news-events/directives/bod-26-04-prioritizing-security-updates-based-risk +Appendix A, paragraph (i). +""" +# Copyright (c) 2025-2026 Carnegie Mellon University. +# NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE +# ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. +# CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, +# EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT +# NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR +# MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE +# OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE +# ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM +# PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT. +# Licensed under a MIT (SEI)-style license, please see LICENSE or contact +# permission@sei.cmu.edu for full terms. +# [DISTRIBUTION STATEMENT A] This material has been approved for +# public release and unlimited distribution. Please see Copyright notice +# for non-US Government use and distribution. +# This Software includes and/or makes use of Third-Party Software each +# subject to its own license. +# DM24-0278 + +from ssvc.decision_points.base import DecisionPointValue +from ssvc.decision_points.cisa.base import CisaDecisionPoint +from ssvc.decision_points.helpers import print_versions_and_diffs + +NO = DecisionPointValue( + name="No", + key="N", + definition="The asset is not accessible to unauthenticated or untrusted entities via public networks, such as the internet, regardless of its physical or logical location.", +) + +YES = DecisionPointValue( + name="Yes", + key="Y", + definition="The asset is accessible to unauthenticated or untrusted entities via public networks, such as the internet, regardless of its physical or logical location.", +) + + +PUBLICLY_EXPOSED_1 = CisaDecisionPoint( + name="Publicly Exposed", + definition="Denotes whether the asset is accessible to unauthenticated or untrusted entities via public networks.", + key="PE", + version="1.0.0", + values=( + NO, + YES, + ), +) + +VERSIONS = (PUBLICLY_EXPOSED_1,) +LATEST = VERSIONS[-1] + + +def main(): + print_versions_and_diffs(VERSIONS) + + +if __name__ == "__main__": + main() diff --git a/src/ssvc/decision_points/cvss/__init__.py b/src/ssvc/decision_points/cvss/__init__.py index 5545743c..1e742ffd 100644 --- a/src/ssvc/decision_points/cvss/__init__.py +++ b/src/ssvc/decision_points/cvss/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/_not_defined.py b/src/ssvc/decision_points/cvss/_not_defined.py index c4031a1c..0a7cd032 100644 --- a/src/ssvc/decision_points/cvss/_not_defined.py +++ b/src/ssvc/decision_points/cvss/_not_defined.py @@ -2,7 +2,7 @@ """ Provides a generic Not Define decision point value for CVSS decision points. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/attack_complexity.py b/src/ssvc/decision_points/cvss/attack_complexity.py index be80091a..61ea7fa5 100644 --- a/src/ssvc/decision_points/cvss/attack_complexity.py +++ b/src/ssvc/decision_points/cvss/attack_complexity.py @@ -2,7 +2,7 @@ """ Models the CVSS Attack Complexity (formerly known as Access Complexity) metric as an SSVC decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/attack_requirements.py b/src/ssvc/decision_points/cvss/attack_requirements.py index d68e9f9b..f4ee0a2f 100644 --- a/src/ssvc/decision_points/cvss/attack_requirements.py +++ b/src/ssvc/decision_points/cvss/attack_requirements.py @@ -2,7 +2,7 @@ """ CVSS Attack Requirements """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/attack_vector.py b/src/ssvc/decision_points/cvss/attack_vector.py index 01c98107..d0a8489a 100644 --- a/src/ssvc/decision_points/cvss/attack_vector.py +++ b/src/ssvc/decision_points/cvss/attack_vector.py @@ -2,7 +2,7 @@ """ Models the CVSS Attack Vector (formerly known as Access Vector) metric as an SSVC decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/authentication.py b/src/ssvc/decision_points/cvss/authentication.py index e52c28f8..7b2cf034 100644 --- a/src/ssvc/decision_points/cvss/authentication.py +++ b/src/ssvc/decision_points/cvss/authentication.py @@ -3,7 +3,7 @@ Models the CVSS Authentication metric as an SSVC decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/availability_impact.py b/src/ssvc/decision_points/cvss/availability_impact.py index 3b340c08..dc5d49c2 100644 --- a/src/ssvc/decision_points/cvss/availability_impact.py +++ b/src/ssvc/decision_points/cvss/availability_impact.py @@ -3,7 +3,7 @@ Models the CVSS Availability Impact metric as an SSVC decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/availability_requirement.py b/src/ssvc/decision_points/cvss/availability_requirement.py index 7e0e1553..30d46dec 100644 --- a/src/ssvc/decision_points/cvss/availability_requirement.py +++ b/src/ssvc/decision_points/cvss/availability_requirement.py @@ -3,7 +3,7 @@ Models the CVSS Availability Requirement metric as an SSVC decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/base.py b/src/ssvc/decision_points/cvss/base.py index 40436b27..044b9a58 100644 --- a/src/ssvc/decision_points/cvss/base.py +++ b/src/ssvc/decision_points/cvss/base.py @@ -2,7 +2,7 @@ """ Provides a base class for modeling CVSS vector metrics as SSVC decision points. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/collateral_damage_potential.py b/src/ssvc/decision_points/cvss/collateral_damage_potential.py index 7e11cbf7..fdfc910c 100644 --- a/src/ssvc/decision_points/cvss/collateral_damage_potential.py +++ b/src/ssvc/decision_points/cvss/collateral_damage_potential.py @@ -3,7 +3,7 @@ Models the CVSS Collateral Damage Potential metric as an SSVC decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/confidentiality_impact.py b/src/ssvc/decision_points/cvss/confidentiality_impact.py index d7fd2f7f..4f962a64 100644 --- a/src/ssvc/decision_points/cvss/confidentiality_impact.py +++ b/src/ssvc/decision_points/cvss/confidentiality_impact.py @@ -2,7 +2,7 @@ """ Models the CVSS Confidentiality Impact metric as an SSVC decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/confidentiality_requirement.py b/src/ssvc/decision_points/cvss/confidentiality_requirement.py index a5b84b96..f76d7f46 100644 --- a/src/ssvc/decision_points/cvss/confidentiality_requirement.py +++ b/src/ssvc/decision_points/cvss/confidentiality_requirement.py @@ -3,7 +3,7 @@ Models the CVSS Confidentiality Requirement metric as an SSVC decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/equivalence_set_1.py b/src/ssvc/decision_points/cvss/equivalence_set_1.py index 91af8d97..b07a8044 100644 --- a/src/ssvc/decision_points/cvss/equivalence_set_1.py +++ b/src/ssvc/decision_points/cvss/equivalence_set_1.py @@ -2,7 +2,7 @@ """ Provides an object representing the CVSS Equivalence Set 1 as a decision point. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/equivalence_set_2.py b/src/ssvc/decision_points/cvss/equivalence_set_2.py index 8772624d..730893a9 100644 --- a/src/ssvc/decision_points/cvss/equivalence_set_2.py +++ b/src/ssvc/decision_points/cvss/equivalence_set_2.py @@ -2,7 +2,7 @@ """ This module provides an object representing the CVSS Equivalence Set 2 as a decision point. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/equivalence_set_3.py b/src/ssvc/decision_points/cvss/equivalence_set_3.py index 5fbc4159..542e9810 100644 --- a/src/ssvc/decision_points/cvss/equivalence_set_3.py +++ b/src/ssvc/decision_points/cvss/equivalence_set_3.py @@ -2,7 +2,7 @@ """ This module provides an object representing the CVSS Equivalence Set 3 as a decision point. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/equivalence_set_4.py b/src/ssvc/decision_points/cvss/equivalence_set_4.py index d980a100..a66c04fd 100644 --- a/src/ssvc/decision_points/cvss/equivalence_set_4.py +++ b/src/ssvc/decision_points/cvss/equivalence_set_4.py @@ -2,7 +2,7 @@ """ This module provides an object representing the CVSS Equivalence Set 4 as a decision point. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/equivalence_set_5.py b/src/ssvc/decision_points/cvss/equivalence_set_5.py index 6aeab253..60c6b005 100644 --- a/src/ssvc/decision_points/cvss/equivalence_set_5.py +++ b/src/ssvc/decision_points/cvss/equivalence_set_5.py @@ -2,7 +2,7 @@ """ This module provides an object representing the CVSS Equivalence Set 5 as a decision point. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/equivalence_set_6.py b/src/ssvc/decision_points/cvss/equivalence_set_6.py index 07287f50..3746ec56 100644 --- a/src/ssvc/decision_points/cvss/equivalence_set_6.py +++ b/src/ssvc/decision_points/cvss/equivalence_set_6.py @@ -2,7 +2,7 @@ """ This module provides an object representing the CVSS Equivalence Set 6 as a decision point. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/exploit_maturity.py b/src/ssvc/decision_points/cvss/exploit_maturity.py index d98e8b0e..2690a50b 100644 --- a/src/ssvc/decision_points/cvss/exploit_maturity.py +++ b/src/ssvc/decision_points/cvss/exploit_maturity.py @@ -3,7 +3,7 @@ Model the CVSS Exploitability and Exploit Code Maturity metrics as SSVC decision points. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/helpers.py b/src/ssvc/decision_points/cvss/helpers.py index 8ce75663..16eb8655 100644 --- a/src/ssvc/decision_points/cvss/helpers.py +++ b/src/ssvc/decision_points/cvss/helpers.py @@ -2,7 +2,7 @@ """ Provides helpers for working with CVSS decision points. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/impact_bias.py b/src/ssvc/decision_points/cvss/impact_bias.py index 8b8c6d5e..20c75373 100644 --- a/src/ssvc/decision_points/cvss/impact_bias.py +++ b/src/ssvc/decision_points/cvss/impact_bias.py @@ -2,7 +2,7 @@ """ Model the CVSS Impact Bias as an SSVC decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/integrity_impact.py b/src/ssvc/decision_points/cvss/integrity_impact.py index d27d5618..00e02d41 100644 --- a/src/ssvc/decision_points/cvss/integrity_impact.py +++ b/src/ssvc/decision_points/cvss/integrity_impact.py @@ -3,7 +3,7 @@ Models the CVSS Integrity Impact metric as an SSVC decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/integrity_requirement.py b/src/ssvc/decision_points/cvss/integrity_requirement.py index 9dc2a3ee..9c2b2db3 100644 --- a/src/ssvc/decision_points/cvss/integrity_requirement.py +++ b/src/ssvc/decision_points/cvss/integrity_requirement.py @@ -3,7 +3,7 @@ Models the CVSS Integrity Requirement metric as an SSVC decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/modified/__init__.py b/src/ssvc/decision_points/cvss/modified/__init__.py index 2c04ac3a..67b2171d 100644 --- a/src/ssvc/decision_points/cvss/modified/__init__.py +++ b/src/ssvc/decision_points/cvss/modified/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/modified/modified_subsequent_availability_impact.py b/src/ssvc/decision_points/cvss/modified/modified_subsequent_availability_impact.py index 7bafd94f..e9f94950 100644 --- a/src/ssvc/decision_points/cvss/modified/modified_subsequent_availability_impact.py +++ b/src/ssvc/decision_points/cvss/modified/modified_subsequent_availability_impact.py @@ -2,7 +2,7 @@ """ CVSS Subsequent system availability impact decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/modified/modified_subsequent_integrity_impact.py b/src/ssvc/decision_points/cvss/modified/modified_subsequent_integrity_impact.py index 574da037..4aa7a2b9 100644 --- a/src/ssvc/decision_points/cvss/modified/modified_subsequent_integrity_impact.py +++ b/src/ssvc/decision_points/cvss/modified/modified_subsequent_integrity_impact.py @@ -4,7 +4,7 @@ """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/privileges_required.py b/src/ssvc/decision_points/cvss/privileges_required.py index 52669a26..cbccafcd 100644 --- a/src/ssvc/decision_points/cvss/privileges_required.py +++ b/src/ssvc/decision_points/cvss/privileges_required.py @@ -2,7 +2,7 @@ """ Models the CVSS Privileges Required metric as an SSVC decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/qualitative_severity.py b/src/ssvc/decision_points/cvss/qualitative_severity.py index f9ea9686..53e2253e 100644 --- a/src/ssvc/decision_points/cvss/qualitative_severity.py +++ b/src/ssvc/decision_points/cvss/qualitative_severity.py @@ -2,7 +2,7 @@ """ Provides a decision point for the [CVSS Qualitative Severity Rating Scale](https://www.first.org/cvss/v4.0/specification-document#Qualitative-Severity-Rating-Scale). """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/remediation_level.py b/src/ssvc/decision_points/cvss/remediation_level.py index 9b3a8f69..fd9322ac 100644 --- a/src/ssvc/decision_points/cvss/remediation_level.py +++ b/src/ssvc/decision_points/cvss/remediation_level.py @@ -3,7 +3,7 @@ Models the CVSS Remediation Level metric as an SSVC decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/report_confidence.py b/src/ssvc/decision_points/cvss/report_confidence.py index 12731de4..904e19f9 100644 --- a/src/ssvc/decision_points/cvss/report_confidence.py +++ b/src/ssvc/decision_points/cvss/report_confidence.py @@ -3,7 +3,7 @@ Models the CVSS Report Confidence metric as an SSVC decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/scope.py b/src/ssvc/decision_points/cvss/scope.py index 74ed3b76..3813c931 100644 --- a/src/ssvc/decision_points/cvss/scope.py +++ b/src/ssvc/decision_points/cvss/scope.py @@ -3,7 +3,7 @@ Models CVSS Scope as an SSVC decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/subsequent_availability_impact.py b/src/ssvc/decision_points/cvss/subsequent_availability_impact.py index 3e15615f..ba7849bd 100644 --- a/src/ssvc/decision_points/cvss/subsequent_availability_impact.py +++ b/src/ssvc/decision_points/cvss/subsequent_availability_impact.py @@ -2,7 +2,7 @@ """ CVSS Subsequent system availability impact decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/subsequent_confidentiality_impact.py b/src/ssvc/decision_points/cvss/subsequent_confidentiality_impact.py index 0025c8fb..b9e8cb08 100644 --- a/src/ssvc/decision_points/cvss/subsequent_confidentiality_impact.py +++ b/src/ssvc/decision_points/cvss/subsequent_confidentiality_impact.py @@ -2,7 +2,7 @@ """ CVSS Subsequent System Confidentiality Impact """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/subsequent_integrity_impact.py b/src/ssvc/decision_points/cvss/subsequent_integrity_impact.py index cbcddf59..db7c6239 100644 --- a/src/ssvc/decision_points/cvss/subsequent_integrity_impact.py +++ b/src/ssvc/decision_points/cvss/subsequent_integrity_impact.py @@ -2,7 +2,7 @@ """ CVSS Subsequent System Integrity Impact Decision Point """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/supplemental/__init__.py b/src/ssvc/decision_points/cvss/supplemental/__init__.py index 97de01df..db1adbd7 100644 --- a/src/ssvc/decision_points/cvss/supplemental/__init__.py +++ b/src/ssvc/decision_points/cvss/supplemental/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/supplemental/automatable.py b/src/ssvc/decision_points/cvss/supplemental/automatable.py index 469421ba..037f99ea 100644 --- a/src/ssvc/decision_points/cvss/supplemental/automatable.py +++ b/src/ssvc/decision_points/cvss/supplemental/automatable.py @@ -2,7 +2,7 @@ """ Provides the CVSS supplemental metric Automatable """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/supplemental/provider_urgency.py b/src/ssvc/decision_points/cvss/supplemental/provider_urgency.py index 051a3ef8..cba78eda 100644 --- a/src/ssvc/decision_points/cvss/supplemental/provider_urgency.py +++ b/src/ssvc/decision_points/cvss/supplemental/provider_urgency.py @@ -2,7 +2,7 @@ """ Provides the CVSS supplemental metric Provider Urgency as a SSVC decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/supplemental/recovery.py b/src/ssvc/decision_points/cvss/supplemental/recovery.py index 9f027dc9..28240b46 100644 --- a/src/ssvc/decision_points/cvss/supplemental/recovery.py +++ b/src/ssvc/decision_points/cvss/supplemental/recovery.py @@ -2,7 +2,7 @@ """ Provides the CVSS supplemental metric Recovery """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/supplemental/safety.py b/src/ssvc/decision_points/cvss/supplemental/safety.py index a330fb61..70d7fdd4 100644 --- a/src/ssvc/decision_points/cvss/supplemental/safety.py +++ b/src/ssvc/decision_points/cvss/supplemental/safety.py @@ -3,7 +3,7 @@ Provides CVSS v4 Supplemental Metric for Safety """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/supplemental/value_density.py b/src/ssvc/decision_points/cvss/supplemental/value_density.py index 43b1d786..87db2da1 100644 --- a/src/ssvc/decision_points/cvss/supplemental/value_density.py +++ b/src/ssvc/decision_points/cvss/supplemental/value_density.py @@ -2,7 +2,7 @@ """ Provides the CVSS supplemental metric Value Density """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/supplemental/vulnerability_response_effort.py b/src/ssvc/decision_points/cvss/supplemental/vulnerability_response_effort.py index 2b466d18..2c8f38a4 100644 --- a/src/ssvc/decision_points/cvss/supplemental/vulnerability_response_effort.py +++ b/src/ssvc/decision_points/cvss/supplemental/vulnerability_response_effort.py @@ -2,7 +2,7 @@ """ Provides the CVSS supplemental metric Vulnerability Response Effort. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/target_distribution.py b/src/ssvc/decision_points/cvss/target_distribution.py index 7e07a66e..45fc8c3b 100644 --- a/src/ssvc/decision_points/cvss/target_distribution.py +++ b/src/ssvc/decision_points/cvss/target_distribution.py @@ -3,7 +3,7 @@ Models CVSS Target Distribution as an SSVC decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/cvss/user_interaction.py b/src/ssvc/decision_points/cvss/user_interaction.py index b09afe0b..d28d1685 100644 --- a/src/ssvc/decision_points/cvss/user_interaction.py +++ b/src/ssvc/decision_points/cvss/user_interaction.py @@ -3,7 +3,7 @@ Models CVSS User Interaction as an SSVC decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/example/__init__.py b/src/ssvc/decision_points/example/__init__.py index 48bbe577..73b790ac 100644 --- a/src/ssvc/decision_points/example/__init__.py +++ b/src/ssvc/decision_points/example/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/example/base.py b/src/ssvc/decision_points/example/base.py index 72930186..52184dc9 100644 --- a/src/ssvc/decision_points/example/base.py +++ b/src/ssvc/decision_points/example/base.py @@ -2,7 +2,7 @@ """ Provides the base class for example decision points """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/example/humidity.py b/src/ssvc/decision_points/example/humidity.py index 29cf7fcf..54c074dd 100644 --- a/src/ssvc/decision_points/example/humidity.py +++ b/src/ssvc/decision_points/example/humidity.py @@ -2,7 +2,7 @@ """ Provides example decision point for humidity values """ -# Copyright (c) 2024-2025 Carnegie Mellon University. +# Copyright (c) 2024-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/example/weather.py b/src/ssvc/decision_points/example/weather.py index cb1fd696..cf90b861 100644 --- a/src/ssvc/decision_points/example/weather.py +++ b/src/ssvc/decision_points/example/weather.py @@ -2,7 +2,7 @@ """ Provides example decision point for weather forecast """ -# Copyright (c) 2024-2025 Carnegie Mellon University. +# Copyright (c) 2024-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/helpers.py b/src/ssvc/decision_points/helpers.py index 71d54874..d9feeb3f 100644 --- a/src/ssvc/decision_points/helpers.py +++ b/src/ssvc/decision_points/helpers.py @@ -3,7 +3,7 @@ """ Provides helper functions for working with SSVC decision points. """ -# Copyright (c) 2024-2025 Carnegie Mellon University. +# Copyright (c) 2024-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/nist/__init__.py b/src/ssvc/decision_points/nist/__init__.py index 9a5d8558..7d5be91f 100644 --- a/src/ssvc/decision_points/nist/__init__.py +++ b/src/ssvc/decision_points/nist/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/nist/base.py b/src/ssvc/decision_points/nist/base.py index 210d6153..d369df67 100644 --- a/src/ssvc/decision_points/nist/base.py +++ b/src/ssvc/decision_points/nist/base.py @@ -2,7 +2,7 @@ """ Provides base classes for NIST-based decision points. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/nist/sp800_30_r1_g.py b/src/ssvc/decision_points/nist/sp800_30_r1_g.py index 24378b5f..bec257e3 100644 --- a/src/ssvc/decision_points/nist/sp800_30_r1_g.py +++ b/src/ssvc/decision_points/nist/sp800_30_r1_g.py @@ -2,7 +2,7 @@ """ Provides a 5-level ascending probability scale decision point for SSVC """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/__init__.py b/src/ssvc/decision_points/ssvc/__init__.py index 03abf5f2..1ce788d3 100644 --- a/src/ssvc/decision_points/ssvc/__init__.py +++ b/src/ssvc/decision_points/ssvc/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/automatable.py b/src/ssvc/decision_points/ssvc/automatable.py index c49506c1..69a91a15 100644 --- a/src/ssvc/decision_points/ssvc/automatable.py +++ b/src/ssvc/decision_points/ssvc/automatable.py @@ -3,7 +3,7 @@ """ Provides the Automatable decision point and its values. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/base.py b/src/ssvc/decision_points/ssvc/base.py index 9fe2640c..2d6ad38d 100644 --- a/src/ssvc/decision_points/ssvc/base.py +++ b/src/ssvc/decision_points/ssvc/base.py @@ -2,7 +2,7 @@ Provides the base class for all decision points in the `ssvc` namespace. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/critical_software.py b/src/ssvc/decision_points/ssvc/critical_software.py index 1e12e9c6..ff071a87 100644 --- a/src/ssvc/decision_points/ssvc/critical_software.py +++ b/src/ssvc/decision_points/ssvc/critical_software.py @@ -3,7 +3,7 @@ """ Provides an SSVC decision point for critical software designation. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/exploitation.py b/src/ssvc/decision_points/ssvc/exploitation.py index faade969..a29b19a0 100644 --- a/src/ssvc/decision_points/ssvc/exploitation.py +++ b/src/ssvc/decision_points/ssvc/exploitation.py @@ -2,7 +2,7 @@ """ Provides the Exploitation decision point and its values. """ -# Copyright (c) 2024-2025 Carnegie Mellon University. +# Copyright (c) 2024-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/high_value_asset.py b/src/ssvc/decision_points/ssvc/high_value_asset.py index 32ce690a..5db01004 100644 --- a/src/ssvc/decision_points/ssvc/high_value_asset.py +++ b/src/ssvc/decision_points/ssvc/high_value_asset.py @@ -3,7 +3,7 @@ """ Models a high value asset as a decision point. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/human_impact.py b/src/ssvc/decision_points/ssvc/human_impact.py index b79b8501..6c101399 100644 --- a/src/ssvc/decision_points/ssvc/human_impact.py +++ b/src/ssvc/decision_points/ssvc/human_impact.py @@ -3,7 +3,7 @@ """ Provides the Human Impact decision point and its values. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/mission_impact.py b/src/ssvc/decision_points/ssvc/mission_impact.py index 12273a35..969b5213 100644 --- a/src/ssvc/decision_points/ssvc/mission_impact.py +++ b/src/ssvc/decision_points/ssvc/mission_impact.py @@ -4,7 +4,7 @@ Provides the Mission Impact decision point and its values. """ -# Copyright (c) 2024-2025 Carnegie Mellon University. +# Copyright (c) 2024-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/public_safety_impact.py b/src/ssvc/decision_points/ssvc/public_safety_impact.py index e8b06704..2c697190 100644 --- a/src/ssvc/decision_points/ssvc/public_safety_impact.py +++ b/src/ssvc/decision_points/ssvc/public_safety_impact.py @@ -4,7 +4,7 @@ Provides the Public Safety Impact decision point and its values. """ -# Copyright (c) 2024-2025 Carnegie Mellon University. +# Copyright (c) 2024-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/public_value_added.py b/src/ssvc/decision_points/ssvc/public_value_added.py index dd8403a7..6f62f696 100644 --- a/src/ssvc/decision_points/ssvc/public_value_added.py +++ b/src/ssvc/decision_points/ssvc/public_value_added.py @@ -4,7 +4,7 @@ This module provides the Public Value Added decision point for the Stakeholder Specific Vulnerability Categorization (SSVC) framework. """ -# Copyright (c) 2024-2025 Carnegie Mellon University. +# Copyright (c) 2024-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/report_credibility.py b/src/ssvc/decision_points/ssvc/report_credibility.py index 2391a1c3..ca8daee5 100644 --- a/src/ssvc/decision_points/ssvc/report_credibility.py +++ b/src/ssvc/decision_points/ssvc/report_credibility.py @@ -4,7 +4,7 @@ Provides the SSVC Report Credibility Decision Point """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/report_public.py b/src/ssvc/decision_points/ssvc/report_public.py index 7ffe3198..24e48824 100644 --- a/src/ssvc/decision_points/ssvc/report_public.py +++ b/src/ssvc/decision_points/ssvc/report_public.py @@ -3,7 +3,7 @@ """ Provides the SSVC Report Public Decision Point """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/safety_impact.py b/src/ssvc/decision_points/ssvc/safety_impact.py index 23fb88e6..b98d9147 100644 --- a/src/ssvc/decision_points/ssvc/safety_impact.py +++ b/src/ssvc/decision_points/ssvc/safety_impact.py @@ -4,7 +4,7 @@ Provides the Safety Impact decision point and its values. """ -# Copyright (c) 2024-2025 Carnegie Mellon University. +# Copyright (c) 2024-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/supplier_cardinality.py b/src/ssvc/decision_points/ssvc/supplier_cardinality.py index ed1653f3..b739877a 100644 --- a/src/ssvc/decision_points/ssvc/supplier_cardinality.py +++ b/src/ssvc/decision_points/ssvc/supplier_cardinality.py @@ -3,7 +3,7 @@ """ Provides the Supplier Cardinality decision point and its values. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/supplier_contacted.py b/src/ssvc/decision_points/ssvc/supplier_contacted.py index 1a19b4ee..a5c14dd8 100644 --- a/src/ssvc/decision_points/ssvc/supplier_contacted.py +++ b/src/ssvc/decision_points/ssvc/supplier_contacted.py @@ -2,7 +2,7 @@ """ Provides the Supplier Engagement decision point and its values. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/supplier_engagement.py b/src/ssvc/decision_points/ssvc/supplier_engagement.py index ae0a2d3d..6024dd34 100644 --- a/src/ssvc/decision_points/ssvc/supplier_engagement.py +++ b/src/ssvc/decision_points/ssvc/supplier_engagement.py @@ -4,7 +4,7 @@ Provides the Supplier Engagement decision point and its values. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/supplier_involvement.py b/src/ssvc/decision_points/ssvc/supplier_involvement.py index f3e131c5..bfe02628 100644 --- a/src/ssvc/decision_points/ssvc/supplier_involvement.py +++ b/src/ssvc/decision_points/ssvc/supplier_involvement.py @@ -3,7 +3,7 @@ Provides the Supplier Involvement decision point and its values. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/system_exposure.py b/src/ssvc/decision_points/ssvc/system_exposure.py index 0c23cfc6..3f5bfa30 100644 --- a/src/ssvc/decision_points/ssvc/system_exposure.py +++ b/src/ssvc/decision_points/ssvc/system_exposure.py @@ -3,7 +3,7 @@ """ Provides the System Exposure decision point and its values. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/technical_impact.py b/src/ssvc/decision_points/ssvc/technical_impact.py index 742f0a16..60225bd4 100644 --- a/src/ssvc/decision_points/ssvc/technical_impact.py +++ b/src/ssvc/decision_points/ssvc/technical_impact.py @@ -4,7 +4,7 @@ Provides the Technical Impact decision point and its values. """ -# Copyright (c) 2024-2025 Carnegie Mellon University. +# Copyright (c) 2024-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/utility.py b/src/ssvc/decision_points/ssvc/utility.py index d7a774c6..3d5eb354 100644 --- a/src/ssvc/decision_points/ssvc/utility.py +++ b/src/ssvc/decision_points/ssvc/utility.py @@ -4,7 +4,7 @@ Provides the Utility decision point and its values. """ -# Copyright (c) 2024-2025 Carnegie Mellon University. +# Copyright (c) 2024-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_points/ssvc/value_density.py b/src/ssvc/decision_points/ssvc/value_density.py index 6cecd8cf..efd2b9d2 100644 --- a/src/ssvc/decision_points/ssvc/value_density.py +++ b/src/ssvc/decision_points/ssvc/value_density.py @@ -3,7 +3,7 @@ Provides the Value Density decision point and its values. """ -# Copyright (c) 2024-2025 Carnegie Mellon University. +# Copyright (c) 2024-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/__init__.py b/src/ssvc/decision_tables/__init__.py index 7dcc6391..2ef01bc3 100644 --- a/src/ssvc/decision_tables/__init__.py +++ b/src/ssvc/decision_tables/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/base.py b/src/ssvc/decision_tables/base.py index f8e49fea..2fcbffcd 100644 --- a/src/ssvc/decision_tables/base.py +++ b/src/ssvc/decision_tables/base.py @@ -2,7 +2,7 @@ """ DecisionTable: A flexible, serializable SSVC decision table model. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/cisa/__init__.py b/src/ssvc/decision_tables/cisa/__init__.py index 35435d58..4a8aa4d3 100644 --- a/src/ssvc/decision_tables/cisa/__init__.py +++ b/src/ssvc/decision_tables/cisa/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/cisa/bod_2604_dt.py b/src/ssvc/decision_tables/cisa/bod_2604_dt.py new file mode 100644 index 00000000..237f82be --- /dev/null +++ b/src/ssvc/decision_tables/cisa/bod_2604_dt.py @@ -0,0 +1,189 @@ +#!/usr/bin/env python +""" +Creates a decision table for CISA Binding Operational Directive 26-04. +""" +# Copyright (c) 2026 Carnegie Mellon University. +# NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE +# ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. +# CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, +# EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT +# NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR +# MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE +# OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE +# ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM +# PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT. +# Licensed under a MIT (SEI)-style license, please see LICENSE or contact +# permission@sei.cmu.edu for full terms. +# [DISTRIBUTION STATEMENT A] This material has been approved for +# public release and unlimited distribution. Please see Copyright notice +# for non-US Government use and distribution. +# This Software includes and/or makes use of Third-Party Software each +# subject to its own license. +# DM24-0278 + +from ssvc.decision_points.cisa.in_kev import IN_KEV_1 as InKEV +from ssvc.decision_points.cisa.publicly_exposed import ( + PUBLICLY_EXPOSED_1 as PUBLICLY_EXPOSED, +) +from ssvc.decision_points.ssvc.automatable import AUTOMATABLE_2 as AUTOMATABLE +from ssvc.decision_points.ssvc.technical_impact import ( + TECHNICAL_IMPACT_1 as TECHNICAL_IMPACT, +) +from ssvc.decision_tables.base import DecisionTable +from ssvc.namespaces import NameSpace +from ssvc.outcomes.cisa.bod2604 import BOD_26_04 as OUTCOMES + +BOD_26_04 = DecisionTable( + key="BOD2604", + version="1.0.0", + namespace=NameSpace.CISA, + name="CISA BOD 26-04", + definition="Decision table for CISA BOD 26-04.", + decision_points={ + dp.id: dp + for dp in [ + PUBLICLY_EXPOSED, + InKEV, + AUTOMATABLE, + TECHNICAL_IMPACT, + OUTCOMES, + ] + }, + outcome=OUTCOMES.id, + mapping=[ + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "FSU", + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "14D", + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "60D", + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "60D", + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "FSU", + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "14D", + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "14D", + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "14D", + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "14D", + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "14D", + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "60D", + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "P", + "cisa:BOD2604:1.0.0": "3D", + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "N", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "3DF", + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "N", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "3DF", + }, + { + "cisa:KEV:1.0.0": "N", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "3D", + }, + { + "cisa:KEV:1.0.0": "Y", + "cisa:PE:1.0.0": "Y", + "ssvc:A:2.0.0": "Y", + "ssvc:TI:1.0.0": "T", + "cisa:BOD2604:1.0.0": "3DF", + }, + ], +) + +VERSIONS = [ + BOD_26_04, +] +LATEST = BOD_26_04 + + +def main(): + + print("## BODs Decision Table Object") + print() + print(BOD_26_04.model_dump_json(indent=2)) + + print("## BODs Decision Table Longform DataFrame CSV") + print() + from ssvc.decision_tables.base import decision_table_to_longform_df + + print(decision_table_to_longform_df(BOD_26_04).to_csv(index=False)) + + +if __name__ == "__main__": + main() diff --git a/src/ssvc/decision_tables/cisa/cisa_coordinate_dt.py b/src/ssvc/decision_tables/cisa/cisa_coordinate_dt.py index 449b6a1d..ccd6f033 100644 --- a/src/ssvc/decision_tables/cisa/cisa_coordinate_dt.py +++ b/src/ssvc/decision_tables/cisa/cisa_coordinate_dt.py @@ -3,7 +3,7 @@ Provides the CISA coordinator decision table. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/cvss/__init__.py b/src/ssvc/decision_tables/cvss/__init__.py index 920ef790..0a679b42 100644 --- a/src/ssvc/decision_tables/cvss/__init__.py +++ b/src/ssvc/decision_tables/cvss/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/cvss/equivalence_set_five.py b/src/ssvc/decision_tables/cvss/equivalence_set_five.py index 15ba75d6..96faf901 100644 --- a/src/ssvc/decision_tables/cvss/equivalence_set_five.py +++ b/src/ssvc/decision_tables/cvss/equivalence_set_five.py @@ -2,7 +2,7 @@ """ CVSS Equivalence Set 5 Decision Table """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/cvss/equivalence_set_four.py b/src/ssvc/decision_tables/cvss/equivalence_set_four.py index e2523034..dfba03cb 100644 --- a/src/ssvc/decision_tables/cvss/equivalence_set_four.py +++ b/src/ssvc/decision_tables/cvss/equivalence_set_four.py @@ -2,7 +2,7 @@ """ Provides CVSS v4 Equivalence Set 4 Decision Table """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/cvss/equivalence_set_one.py b/src/ssvc/decision_tables/cvss/equivalence_set_one.py index 3c35c51b..172bb0ac 100644 --- a/src/ssvc/decision_tables/cvss/equivalence_set_one.py +++ b/src/ssvc/decision_tables/cvss/equivalence_set_one.py @@ -2,7 +2,7 @@ """ Provides a decision table modeling equivalence set 1 from CVSS v4""" -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/cvss/equivalence_set_six.py b/src/ssvc/decision_tables/cvss/equivalence_set_six.py index 97a28c2f..eabaf524 100644 --- a/src/ssvc/decision_tables/cvss/equivalence_set_six.py +++ b/src/ssvc/decision_tables/cvss/equivalence_set_six.py @@ -6,7 +6,7 @@ """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/cvss/equivalence_set_three.py b/src/ssvc/decision_tables/cvss/equivalence_set_three.py index a7d878bd..c7841afa 100644 --- a/src/ssvc/decision_tables/cvss/equivalence_set_three.py +++ b/src/ssvc/decision_tables/cvss/equivalence_set_three.py @@ -2,7 +2,7 @@ """ Provides a decision table modeling equivalence set 3 from CVSS v4""" -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/cvss/equivalence_set_two.py b/src/ssvc/decision_tables/cvss/equivalence_set_two.py index eb42a352..d1efd7f1 100644 --- a/src/ssvc/decision_tables/cvss/equivalence_set_two.py +++ b/src/ssvc/decision_tables/cvss/equivalence_set_two.py @@ -2,7 +2,7 @@ """ Provides a decision table modeling equivalence set 2 from CVSS v4""" -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/cvss/qualitative_severity.py b/src/ssvc/decision_tables/cvss/qualitative_severity.py index e808b302..9567a21b 100644 --- a/src/ssvc/decision_tables/cvss/qualitative_severity.py +++ b/src/ssvc/decision_tables/cvss/qualitative_severity.py @@ -2,7 +2,7 @@ """ Models the CVSS v4.0 Qualitative Severity Ratings from Equivalence Set 1-6 """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/example/__init__.py b/src/ssvc/decision_tables/example/__init__.py index 67090098..55db4f6f 100644 --- a/src/ssvc/decision_tables/example/__init__.py +++ b/src/ssvc/decision_tables/example/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/example/base.py b/src/ssvc/decision_tables/example/base.py index 85d8ac07..afaeb99e 100644 --- a/src/ssvc/decision_tables/example/base.py +++ b/src/ssvc/decision_tables/example/base.py @@ -4,7 +4,7 @@ """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/example/epss_percentile.py b/src/ssvc/decision_tables/example/epss_percentile.py index a998e590..4056d494 100644 --- a/src/ssvc/decision_tables/example/epss_percentile.py +++ b/src/ssvc/decision_tables/example/epss_percentile.py @@ -2,7 +2,7 @@ """ Provides an example decision table using EPSS probability as a decision point. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/example/epss_quartile.py b/src/ssvc/decision_tables/example/epss_quartile.py index 08119d5a..9bf26f56 100644 --- a/src/ssvc/decision_tables/example/epss_quartile.py +++ b/src/ssvc/decision_tables/example/epss_quartile.py @@ -2,7 +2,7 @@ """ Provides an example decision table using EPSS quartiles for probability. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/example/to_play.py b/src/ssvc/decision_tables/example/to_play.py index deeb3594..f49d1209 100644 --- a/src/ssvc/decision_tables/example/to_play.py +++ b/src/ssvc/decision_tables/example/to_play.py @@ -2,7 +2,7 @@ """ Models an example to play or not to play decision table for SSVC. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/helpers.py b/src/ssvc/decision_tables/helpers.py index aadcfda7..4326236e 100644 --- a/src/ssvc/decision_tables/helpers.py +++ b/src/ssvc/decision_tables/helpers.py @@ -3,7 +3,7 @@ Provides helper functions for decision tables in SSVC. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/ssvc/__init__.py b/src/ssvc/decision_tables/ssvc/__init__.py index c9448e9c..fff95b0f 100644 --- a/src/ssvc/decision_tables/ssvc/__init__.py +++ b/src/ssvc/decision_tables/ssvc/__init__.py @@ -2,7 +2,7 @@ """ Provides Decision Tables within the SSVC namespace. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/ssvc/coord_pub_dt.py b/src/ssvc/decision_tables/ssvc/coord_pub_dt.py index 6c204919..7586f0d7 100644 --- a/src/ssvc/decision_tables/ssvc/coord_pub_dt.py +++ b/src/ssvc/decision_tables/ssvc/coord_pub_dt.py @@ -4,7 +4,7 @@ """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/ssvc/coord_triage.py b/src/ssvc/decision_tables/ssvc/coord_triage.py index 3e621a70..feb78c2e 100644 --- a/src/ssvc/decision_tables/ssvc/coord_triage.py +++ b/src/ssvc/decision_tables/ssvc/coord_triage.py @@ -2,7 +2,7 @@ """ Provides the Coordination Triage decision table for SSVC.""" -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/ssvc/deployer_dt.py b/src/ssvc/decision_tables/ssvc/deployer_dt.py index dfac0231..14407d64 100644 --- a/src/ssvc/decision_tables/ssvc/deployer_dt.py +++ b/src/ssvc/decision_tables/ssvc/deployer_dt.py @@ -3,7 +3,7 @@ Provides the Deployer Patch Application Priority decision table for SSVC. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/ssvc/human_impact.py b/src/ssvc/decision_tables/ssvc/human_impact.py index c153a3ce..29583304 100644 --- a/src/ssvc/decision_tables/ssvc/human_impact.py +++ b/src/ssvc/decision_tables/ssvc/human_impact.py @@ -2,7 +2,7 @@ """ Models the Human Impact decision table for SSVC. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/ssvc/public_safety_impact.py b/src/ssvc/decision_tables/ssvc/public_safety_impact.py index 00b6d56b..fe16161b 100644 --- a/src/ssvc/decision_tables/ssvc/public_safety_impact.py +++ b/src/ssvc/decision_tables/ssvc/public_safety_impact.py @@ -3,7 +3,7 @@ Public Safety Impact Decision Table """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, @@ -29,7 +29,7 @@ from ssvc.decision_tables.base import DecisionTable from ssvc.namespaces import NameSpace -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/ssvc/supplier_dt.py b/src/ssvc/decision_tables/ssvc/supplier_dt.py index 9f6c2514..ed1991be 100644 --- a/src/ssvc/decision_tables/ssvc/supplier_dt.py +++ b/src/ssvc/decision_tables/ssvc/supplier_dt.py @@ -5,7 +5,7 @@ created_at: 7/18/25 1:57 PM """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/decision_tables/ssvc/utility.py b/src/ssvc/decision_tables/ssvc/utility.py index 830003ed..04de3fc4 100644 --- a/src/ssvc/decision_tables/ssvc/utility.py +++ b/src/ssvc/decision_tables/ssvc/utility.py @@ -3,7 +3,7 @@ Models the Utility decision table for SSVC. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/doc_helpers.py b/src/ssvc/doc_helpers.py index c228459c..1a7ac880 100644 --- a/src/ssvc/doc_helpers.py +++ b/src/ssvc/doc_helpers.py @@ -4,7 +4,7 @@ author: adh created_at: 2/14/25 2:54 PM """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/doctools.py b/src/ssvc/doctools.py index e4573829..da652bc5 100755 --- a/src/ssvc/doctools.py +++ b/src/ssvc/doctools.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/dp_groups/__init__.py b/src/ssvc/dp_groups/__init__.py index 57223656..23c79f66 100644 --- a/src/ssvc/dp_groups/__init__.py +++ b/src/ssvc/dp_groups/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/dp_groups/base.py b/src/ssvc/dp_groups/base.py index 105aa270..952e02e1 100644 --- a/src/ssvc/dp_groups/base.py +++ b/src/ssvc/dp_groups/base.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/dp_groups/cvss/__init__.py b/src/ssvc/dp_groups/cvss/__init__.py index 10f61c4c..40284412 100644 --- a/src/ssvc/dp_groups/cvss/__init__.py +++ b/src/ssvc/dp_groups/cvss/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/dp_groups/cvss/collections.py b/src/ssvc/dp_groups/cvss/collections.py index 651ff7f2..d4d72cad 100644 --- a/src/ssvc/dp_groups/cvss/collections.py +++ b/src/ssvc/dp_groups/cvss/collections.py @@ -2,7 +2,7 @@ """ Models CVSS vectors as SSVC decision point groups """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/dp_groups/ssvc/__init__.py b/src/ssvc/dp_groups/ssvc/__init__.py index 99cfbb7c..22481729 100644 --- a/src/ssvc/dp_groups/ssvc/__init__.py +++ b/src/ssvc/dp_groups/ssvc/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/dp_groups/ssvc/collections.py b/src/ssvc/dp_groups/ssvc/collections.py index e0570d10..70be51d8 100644 --- a/src/ssvc/dp_groups/ssvc/collections.py +++ b/src/ssvc/dp_groups/ssvc/collections.py @@ -2,7 +2,7 @@ """ Provides collections of decision points for each version of the SSVC. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/dp_groups/ssvc/coordinator_publication.py b/src/ssvc/dp_groups/ssvc/coordinator_publication.py index 2881a0eb..304a90d6 100644 --- a/src/ssvc/dp_groups/ssvc/coordinator_publication.py +++ b/src/ssvc/dp_groups/ssvc/coordinator_publication.py @@ -4,7 +4,7 @@ author: adh created_at: 9/21/23 11:40 AM """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/dp_groups/ssvc/coordinator_triage.py b/src/ssvc/dp_groups/ssvc/coordinator_triage.py index b24a5e74..dc698c84 100644 --- a/src/ssvc/dp_groups/ssvc/coordinator_triage.py +++ b/src/ssvc/dp_groups/ssvc/coordinator_triage.py @@ -4,7 +4,7 @@ author: adh created_at: 9/21/23 11:40 AM """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/dp_groups/ssvc/deployer.py b/src/ssvc/dp_groups/ssvc/deployer.py index 80654d15..c901bbad 100644 --- a/src/ssvc/dp_groups/ssvc/deployer.py +++ b/src/ssvc/dp_groups/ssvc/deployer.py @@ -5,7 +5,7 @@ created_at: 9/21/23 11:40 AM """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/dp_groups/ssvc/supplier.py b/src/ssvc/dp_groups/ssvc/supplier.py index 28557a2e..0bc817c7 100644 --- a/src/ssvc/dp_groups/ssvc/supplier.py +++ b/src/ssvc/dp_groups/ssvc/supplier.py @@ -5,7 +5,7 @@ created_at: 9/21/23 11:41 AM """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/examples.py b/src/ssvc/examples.py index 1f4939a6..dab0e624 100644 --- a/src/ssvc/examples.py +++ b/src/ssvc/examples.py @@ -3,7 +3,7 @@ Example SSVC object instances """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/md_gen.py b/src/ssvc/md_gen.py index 9c3385bc..51707bbb 100644 --- a/src/ssvc/md_gen.py +++ b/src/ssvc/md_gen.py @@ -4,7 +4,7 @@ author: adh created_at: 2/17/25 4:25 PM """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, @@ -26,7 +26,7 @@ import os -# Copyright (c) 2025 Carnegie Mellon University and Contributors. +# Copyright (c) 2026 Carnegie Mellon University and Contributors. # - see Contributors.md for a full list of Contributors # - see ContributionInstructions.md for information on how you can Contribute to this project # Stakeholder Specific Vulnerability Categorization (SSVC) is diff --git a/src/ssvc/namespaces.py b/src/ssvc/namespaces.py index 017f0aa1..9c0cb36c 100644 --- a/src/ssvc/namespaces.py +++ b/src/ssvc/namespaces.py @@ -4,7 +4,7 @@ stakeholders or analytical category sources. This module defines the official namespaces for SSVC and provides a method to validate namespace values. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/outcomes/__init__.py b/src/ssvc/outcomes/__init__.py index 072d55a6..6711bfc0 100644 --- a/src/ssvc/outcomes/__init__.py +++ b/src/ssvc/outcomes/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/outcomes/basic/__init__.py b/src/ssvc/outcomes/basic/__init__.py index 6682cf82..874f1482 100644 --- a/src/ssvc/outcomes/basic/__init__.py +++ b/src/ssvc/outcomes/basic/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/outcomes/basic/ike.py b/src/ssvc/outcomes/basic/ike.py index 1f669d78..c55f3527 100644 --- a/src/ssvc/outcomes/basic/ike.py +++ b/src/ssvc/outcomes/basic/ike.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/outcomes/basic/lmh.py b/src/ssvc/outcomes/basic/lmh.py index e9cf759f..437829d0 100644 --- a/src/ssvc/outcomes/basic/lmh.py +++ b/src/ssvc/outcomes/basic/lmh.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/outcomes/basic/mscw.py b/src/ssvc/outcomes/basic/mscw.py index f3d44346..7e8e4d24 100644 --- a/src/ssvc/outcomes/basic/mscw.py +++ b/src/ssvc/outcomes/basic/mscw.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/outcomes/basic/value_complexity.py b/src/ssvc/outcomes/basic/value_complexity.py index d197338d..c9f5f88e 100644 --- a/src/ssvc/outcomes/basic/value_complexity.py +++ b/src/ssvc/outcomes/basic/value_complexity.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/outcomes/basic/yn.py b/src/ssvc/outcomes/basic/yn.py index a947dd9c..2f8dccac 100644 --- a/src/ssvc/outcomes/basic/yn.py +++ b/src/ssvc/outcomes/basic/yn.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/outcomes/cisa/__init__.py b/src/ssvc/outcomes/cisa/__init__.py index c358bf53..4d79bcd4 100644 --- a/src/ssvc/outcomes/cisa/__init__.py +++ b/src/ssvc/outcomes/cisa/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, @@ -19,6 +19,7 @@ """ Provides SSVC outcome groups for the cisa namespace """ +from .bod2604 import LATEST as BOD2604 from .scoring import LATEST as CISA_SCORING -ALL = (CISA_SCORING,) +ALL = (CISA_SCORING, BOD2604) diff --git a/src/ssvc/outcomes/cisa/bod2604.py b/src/ssvc/outcomes/cisa/bod2604.py new file mode 100644 index 00000000..452fb70c --- /dev/null +++ b/src/ssvc/outcomes/cisa/bod2604.py @@ -0,0 +1,79 @@ +# Copyright (c) 2026 Carnegie Mellon University. +# NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE +# ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. +# CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, +# EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT +# NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR +# MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE +# OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE +# ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM +# PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT. +# Licensed under a MIT (SEI)-style license, please see LICENSE or contact +# permission@sei.cmu.edu for full terms. +# [DISTRIBUTION STATEMENT A] This material has been approved for +# public release and unlimited distribution. Please see Copyright notice +# for non-US Government use and distribution. +# This Software includes and/or makes use of Third-Party Software each +# subject to its own license. +# DM24-0278 +""" +Provides the CISA BOD 26-04 outcome group for use in SSVC. +These are timelines, in calendar days, for agencies to remedy vulnerabilities. +""" + +from ssvc.decision_points.base import DecisionPointValue +from ssvc.decision_points.cisa.base import CisaDecisionPoint +from ssvc.decision_points.helpers import print_versions_and_diffs + +_FSU = DecisionPointValue( + name="Fix on system upgrade", + key="FSU", + definition="The vulnerability should be remediated the next time the vulnerable asset receives a scheduled major upgrade or rebuild.", +) + +_60D = DecisionPointValue( + name="60 days", + key="60D", + definition="Remediate within 60 days.", +) + +_14D = DecisionPointValue( + name="14 days", + key="14D", + definition="Remediate within 14 days.", +) + +_3D = DecisionPointValue( + name="3 days", + key="3D", + definition="Remediate within 3 days.", +) + +_3DF = DecisionPointValue( + name="3 days & forensic investigation", + key="3DF", + definition="Remediate within 3 days and carry out a forensic triage of the asset to assess whether the system is compromised.", +) + + +BOD_26_04 = CisaDecisionPoint( + name="CISA BOD 26-04 Remediation Timelines", + key="BOD2604", + definition="The CISA BOD 26-04 outcome group of remediation timelines for agencies to follow.", + version="1.0.0", + values=(_FSU, _60D, _14D, _3D, _3DF), +) +""" +The CISA BOD 26-04 outcome group. Based on CISA's customizations of the SSVC model. +""" + +VERSIONS = (BOD_26_04,) +LATEST = VERSIONS[-1] + + +def main(): + print_versions_and_diffs(VERSIONS) + + +if __name__ == "__main__": + main() diff --git a/src/ssvc/outcomes/cisa/scoring.py b/src/ssvc/outcomes/cisa/scoring.py index fedbca80..63a57c50 100644 --- a/src/ssvc/outcomes/cisa/scoring.py +++ b/src/ssvc/outcomes/cisa/scoring.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/outcomes/cvss/__init__.py b/src/ssvc/outcomes/cvss/__init__.py index 95371d45..b8bcba8c 100644 --- a/src/ssvc/outcomes/cvss/__init__.py +++ b/src/ssvc/outcomes/cvss/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/outcomes/cvss/lmhc.py b/src/ssvc/outcomes/cvss/lmhc.py index e3c5ef79..97898f3d 100644 --- a/src/ssvc/outcomes/cvss/lmhc.py +++ b/src/ssvc/outcomes/cvss/lmhc.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/outcomes/ssvc/__init__.py b/src/ssvc/outcomes/ssvc/__init__.py index 22df73bf..3a06eee1 100644 --- a/src/ssvc/outcomes/ssvc/__init__.py +++ b/src/ssvc/outcomes/ssvc/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/outcomes/ssvc/coordinate.py b/src/ssvc/outcomes/ssvc/coordinate.py index f0dd396b..82e6ecaa 100644 --- a/src/ssvc/outcomes/ssvc/coordinate.py +++ b/src/ssvc/outcomes/ssvc/coordinate.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/outcomes/ssvc/dsoi.py b/src/ssvc/outcomes/ssvc/dsoi.py index fbfc407a..e7f65a70 100644 --- a/src/ssvc/outcomes/ssvc/dsoi.py +++ b/src/ssvc/outcomes/ssvc/dsoi.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/outcomes/ssvc/publish.py b/src/ssvc/outcomes/ssvc/publish.py index ae93bd55..c47cf88d 100644 --- a/src/ssvc/outcomes/ssvc/publish.py +++ b/src/ssvc/outcomes/ssvc/publish.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/outcomes/x_com_yahooinc/__init__.py b/src/ssvc/outcomes/x_com_yahooinc/__init__.py index 1985dd7b..84d2da82 100644 --- a/src/ssvc/outcomes/x_com_yahooinc/__init__.py +++ b/src/ssvc/outcomes/x_com_yahooinc/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/outcomes/x_com_yahooinc/paranoids.py b/src/ssvc/outcomes/x_com_yahooinc/paranoids.py index 55009742..120e034d 100644 --- a/src/ssvc/outcomes/x_com_yahooinc/paranoids.py +++ b/src/ssvc/outcomes/x_com_yahooinc/paranoids.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/policy_generator.py b/src/ssvc/policy_generator.py index ae8eb7f6..89f889bb 100644 --- a/src/ssvc/policy_generator.py +++ b/src/ssvc/policy_generator.py @@ -3,7 +3,7 @@ Provides a Policy Generator class for SSVC decision point groups. """ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/registry/__init__.py b/src/ssvc/registry/__init__.py index 612c34e7..ece3fbcc 100644 --- a/src/ssvc/registry/__init__.py +++ b/src/ssvc/registry/__init__.py @@ -2,7 +2,7 @@ Provides an object registry for SSVC. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/registry/base.py b/src/ssvc/registry/base.py index 93dcdbe8..1300a4e5 100644 --- a/src/ssvc/registry/base.py +++ b/src/ssvc/registry/base.py @@ -2,7 +2,7 @@ """ Work in progress on an experimental registry object for SSVC. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/registry/events.py b/src/ssvc/registry/events.py index 6c356d91..0f49e850 100644 --- a/src/ssvc/registry/events.py +++ b/src/ssvc/registry/events.py @@ -2,7 +2,7 @@ """ Provides an event system for SSVC object registration. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/registry_demo.py b/src/ssvc/registry_demo.py index fc02591f..65e7fe64 100644 --- a/src/ssvc/registry_demo.py +++ b/src/ssvc/registry_demo.py @@ -3,7 +3,7 @@ Demonstrates the SSVC registry and schema. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/selection.py b/src/ssvc/selection.py index e2ac2e5f..d8151917 100644 --- a/src/ssvc/selection.py +++ b/src/ssvc/selection.py @@ -2,7 +2,7 @@ """ Provides an SSVC selection object and functions to facilitate transition from an SSVC decision point to a selection. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/utils/__init__.py b/src/ssvc/utils/__init__.py index ff52eb81..a7059177 100644 --- a/src/ssvc/utils/__init__.py +++ b/src/ssvc/utils/__init__.py @@ -1,6 +1,6 @@ """Provides utility features for the SSVC package.""" -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/utils/defaults.py b/src/ssvc/utils/defaults.py index 37d8f3fe..17f9e7e3 100644 --- a/src/ssvc/utils/defaults.py +++ b/src/ssvc/utils/defaults.py @@ -3,7 +3,7 @@ Provides default values and constants for use in SSVC objects. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/utils/field_specs.py b/src/ssvc/utils/field_specs.py index 25295c78..49727ff1 100644 --- a/src/ssvc/utils/field_specs.py +++ b/src/ssvc/utils/field_specs.py @@ -3,7 +3,7 @@ Provides custom data types for use in SSVC objects. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/utils/importer.py b/src/ssvc/utils/importer.py index 32c858ee..847e3f3e 100644 --- a/src/ssvc/utils/importer.py +++ b/src/ssvc/utils/importer.py @@ -2,7 +2,7 @@ """ Provides a bulk importer for SSVC object modules. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/utils/misc.py b/src/ssvc/utils/misc.py index 9cdef197..8ff381ca 100644 --- a/src/ssvc/utils/misc.py +++ b/src/ssvc/utils/misc.py @@ -3,7 +3,7 @@ Provides miscellaneous utility functions for SSVC. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/utils/namespace_patterns.py b/src/ssvc/utils/namespace_patterns.py new file mode 100644 index 00000000..eecfc57b --- /dev/null +++ b/src/ssvc/utils/namespace_patterns.py @@ -0,0 +1,48 @@ +# Copyright (c) 2026 Carnegie Mellon University. +# NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE +# ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. +# CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, +# EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT +# NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR +# MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE +# OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE +# ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM +# PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT. +# Licensed under a MIT (SEI)-style license, please see LICENSE or contact +# permission@sei.cmu.edu for full terms. +# [DISTRIBUTION STATEMENT A] This material has been approved for +# public release and unlimited distribution. Please see Copyright notice +# for non-US Government use and distribution. +# This Software includes and/or makes use of Third-Party Software each +# subject to its own license. +# DM24-0278 + +# AUTOGENERATED, DO NOT CHANGE manually, see Makefile +alnum = '[a-zA-Z0-9]' +lower = '[a-z]' +alnumlow = f'({lower}|[0-9])' +dash = '-' +alnumlowdash = f'({alnumlow}|{dash})' +label = f'{alnumlow}(({alnumlowdash}){{0,61}}{alnumlow})?' +reverse_dns = f'{label}(\\.{label})+' +dot = '\\.' +specialchar = f'({dot}|{dash})' +fragment_seg = f'({alnumlow})+({specialchar}({alnumlow})+)*' +x_name = f'{reverse_dns}#{fragment_seg}' +x_base = f'x_{x_name}' +ns_core = f'{lower}{alnumlow}(({specialchar})?({alnumlow})+)+' +reg_base = f'{ns_core}(#{fragment_seg})?' +base_ns = f'({x_base}|{reg_base})' +singleton = '[0-9A-WY-Za-wy-z]' +bcp47 = ( + '(([a-zA-Z]{2,3}(-[a-zA-Z]{3}(-[a-zA-Z]{3}){0,2})?|[a-z' + 'A-Z]{4,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-' + f'(({alnum}){{5,8}}|[0-9]({alnum}){{3}}))*(-{singleton}(-' + f'({alnum}){{2,8}})+)*(-[xX](-({alnum}){{2,8}})+)?|[xX](-' + f'({alnum}){{2,8}})+|i-default|i-mingo)' +) +translation = f'\\.({reverse_dns}|{x_name})\\${bcp47}' +ext_seg = f'({bcp47}|\\.{x_name}|{translation})' +lang_ext = f'(/|/{bcp47})' +extensions = f'{lang_ext}((/{ext_seg})+)?' +namespace = f'{base_ns}({extensions})?' diff --git a/src/ssvc/utils/patterns.py b/src/ssvc/utils/patterns.py index f24b290a..9f4c677c 100644 --- a/src/ssvc/utils/patterns.py +++ b/src/ssvc/utils/patterns.py @@ -3,7 +3,8 @@ Provides python regular expressions and utility functions for SSVC-related patterns. """ -# Copyright (c) 2025 Carnegie Mellon University. + +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, @@ -22,6 +23,8 @@ # subject to its own license. # DM24-0278 +import ssvc.utils.namespace_patterns as namespace_patterns + # from https://semver.org/ VERSION_PATTERN = r"^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$" """A regular expression pattern for semantic versioning (semver).""" @@ -30,52 +33,14 @@ BCP_47_PATTERN = r"(([A-Za-z]{2,3}(-[A-Za-z]{3}(-[A-Za-z]{3}){0,2})?|[A-Za-z]{4,8})(-[A-Za-z]{4})?(-([A-Za-z]{2}|[0-9]{3}))?(-([A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(-[A-WY-Za-wy-z0-9](-[A-Za-z0-9]{2,8})+)*(-[Xx](-[A-Za-z0-9]{1,8})+)?|[Xx](-[A-Za-z0-9]{1,8})+|[Ii]-[Dd][Ee][Ff][Aa][Uu][Ll][Tt]|[Ii]-[Mm][Ii][Nn][Gg][Oo])" """A regular expression pattern for BCP-47 language tags.""" - # --- Namespace Regex Components --- - -# --- Length constraint --- +# ---- Length constraint ---- LENGTH_CHECK_PATTERN = r"(?=.{3,1000}$)" +# ---- define base patterns to be compatible with previously existing tests +BASE_PATTERN = namespace_patterns.ns_core +BASE_NS_PATTERN = namespace_patterns.base_ns +EXT_SEGMENT_PATTERN = namespace_patterns.fragment_seg -# fmt: off -# --- the following section is generated with -# abnf-to-regexp --format python-nested -i ssvc_namespace_pattern.abnf | \ -# sed --expression='s/{,/{0,/g' --expression='s/\\\\#/\#/g' -alnum = '[a-zA-Z0-9]' -lower = '[a-z]' -alnumlow = f'({lower}|[0-9])' -dash = '-' -alnumlowdash = f'({alnumlow}|{dash})' -label = f'{alnumlow}(({alnumlowdash}){{0,61}}{alnumlow})?' -reverse_dns = f'{label}(\\.{label})+' -dot = '\\.' -specialchar = f'({dot}|{dash})' -fragment_seg = f'({alnumlow})+({specialchar}({alnumlow})+)*' -x_name = f'{reverse_dns}#{fragment_seg}' -x_base = f'x_{x_name}' -ns_core = f'{lower}{alnumlow}(({specialchar})?({alnumlow})+)+' -reg_base = f'{ns_core}(#{fragment_seg})?' -base_ns = f'({x_base}|{reg_base})' -singleton = '[0-9A-WY-Za-wy-z]' -bcp47 = ( - '(([a-zA-Z]{2,3}(-[a-zA-Z]{3}(-[a-zA-Z]{3}){0,2})?|[a-z' - 'A-Z]{4,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-' - f'(({alnum}){{5,8}}|[0-9]({alnum}){{3}}))*(-{singleton}(-' - f'({alnum}){{2,8}})+)*(-[xX](-({alnum}){{2,8}})+)?|[xX](-' - f'({alnum}){{2,8}})+|i-default|i-mingo)' -) -translation = f'\\.({reverse_dns}|{x_name})\\${bcp47}' -ext_seg = f'({bcp47}|\\.{x_name}|{translation})' -lang_ext = f'(/|/{bcp47})' -extensions = f'{lang_ext}((/{ext_seg})+)?' -namespace = f'{base_ns}({extensions})?' -# --- end of generated output -# fmt: on - -# --- define base patterns to be compatible with previously existing tests -BASE_PATTERN = ns_core -BASE_NS_PATTERN = base_ns -EXT_SEGMENT_PATTERN = fragment_seg - -# --- Combine all parts into the full namespace pattern --- -NS_PATTERN_STR = rf"^{namespace}$" +# ---- Combine all parts into the full namespace pattern ---- +NS_PATTERN_STR = rf"^{namespace_patterns.namespace}$" diff --git a/src/ssvc/utils/schema.py b/src/ssvc/utils/schema.py index 175c40d5..9702b471 100644 --- a/src/ssvc/utils/schema.py +++ b/src/ssvc/utils/schema.py @@ -3,7 +3,7 @@ Utility functions for SSVC json schema handling. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/ssvc/utils/ssvc_namespace_pattern.abnf b/src/ssvc/utils/ssvc_namespace_pattern.abnf index 614174b6..3a83807d 100644 --- a/src/ssvc/utils/ssvc_namespace_pattern.abnf +++ b/src/ssvc/utils/ssvc_namespace_pattern.abnf @@ -1,4 +1,4 @@ -; SPDX-FileCopyrightText: 2025 Carnegie Mellon University +; SPDX-FileCopyrightText: 2026 Carnegie Mellon University ; SPDX-FileCopyrightText: 2025 German Federal Office for Information Security (BSI) ; SPDX-License-Identifier: LicenseRef-MIT-SEI-style.txt ; (see LICENCE for full terms) diff --git a/src/ssvc/utils/toposort.py b/src/ssvc/utils/toposort.py index 8bafe787..e8911aeb 100644 --- a/src/ssvc/utils/toposort.py +++ b/src/ssvc/utils/toposort.py @@ -5,7 +5,7 @@ created_at: 7/30/25 12:45 PM """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/__init__.py b/src/test/__init__.py index 8d6714b7..1d4e38f2 100644 --- a/src/test/__init__.py +++ b/src/test/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/api/__init__.py b/src/test/api/__init__.py index f704113b..b20e393c 100644 --- a/src/test/api/__init__.py +++ b/src/test/api/__init__.py @@ -6,7 +6,7 @@ """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/api/response_models/__init__.py b/src/test/api/response_models/__init__.py index 49ba3463..be41e6fa 100644 --- a/src/test/api/response_models/__init__.py +++ b/src/test/api/response_models/__init__.py @@ -6,7 +6,7 @@ """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/api/routers/__init__.py b/src/test/api/routers/__init__.py index 49ba3463..be41e6fa 100644 --- a/src/test/api/routers/__init__.py +++ b/src/test/api/routers/__init__.py @@ -6,7 +6,7 @@ """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/api/routers/test_decision_point.py b/src/test/api/routers/test_decision_point.py index 380cc704..35912974 100644 --- a/src/test/api/routers/test_decision_point.py +++ b/src/test/api/routers/test_decision_point.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, @@ -19,7 +19,7 @@ import json import unittest -from fastapi import HTTPException +from fastapi import FastAPI from fastapi.testclient import TestClient from ssvc.api.v1.routers import decision_point @@ -29,7 +29,9 @@ class TestDecisionPointAPI(unittest.TestCase): def setUp(self): - self.client = TestClient(decision_point.router) + app = FastAPI() + app.include_router(decision_point.router) + self.client = TestClient(app) # create a new registry for testing self.r = SsvcObjectRegistry( @@ -86,8 +88,8 @@ def test_get_decision_point_by_id_success(self): self.assertEqual(expected, response.json()) def test_get_decision_point_by_id_bad_id(self): - with self.assertRaises(HTTPException): - self.client.get("/decision_point?id=bad_id_format") + response = self.client.get("/decision_point?id=bad_id_format") + self.assertEqual(400, response.status_code) if __name__ == "__main__": diff --git a/src/test/api/routers/test_decision_points.py b/src/test/api/routers/test_decision_points.py index 4fc595d5..a54c2a91 100644 --- a/src/test/api/routers/test_decision_points.py +++ b/src/test/api/routers/test_decision_points.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/api/routers/test_decision_table.py b/src/test/api/routers/test_decision_table.py index ef842066..4460513e 100644 --- a/src/test/api/routers/test_decision_table.py +++ b/src/test/api/routers/test_decision_table.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, @@ -19,7 +19,7 @@ import json import unittest -from fastapi import HTTPException +from fastapi import FastAPI from fastapi.testclient import TestClient from ssvc.api.v1.routers import decision_table @@ -30,7 +30,9 @@ class TestDecisionPointAPI(unittest.TestCase): def setUp(self): - self.client = TestClient(decision_table.router) + app = FastAPI() + app.include_router(decision_table.router) + self.client = TestClient(app) # create a new registry for testing self.r = SsvcObjectRegistry( @@ -110,8 +112,8 @@ def test_get_decision_point_by_id_success(self): self.assertEqual(expected, response.json()) def test_get_decision_point_by_id_bad_id(self): - with self.assertRaises(HTTPException): - self.client.get("/decision_table?id=bad_id_format") + response = self.client.get("/decision_table?id=bad_id_format") + self.assertEqual(400, response.status_code) if __name__ == "__main__": diff --git a/src/test/api/routers/test_decision_tables.py b/src/test/api/routers/test_decision_tables.py index 7fcd986f..d6e5a2a4 100644 --- a/src/test/api/routers/test_decision_tables.py +++ b/src/test/api/routers/test_decision_tables.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/api/routers/test_examples.py b/src/test/api/routers/test_examples.py index 0abec341..e2cddc02 100644 --- a/src/test/api/routers/test_examples.py +++ b/src/test/api/routers/test_examples.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/api/routers/test_keys.py b/src/test/api/routers/test_keys.py index 206281f3..862300ca 100644 --- a/src/test/api/routers/test_keys.py +++ b/src/test/api/routers/test_keys.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/api/routers/test_namespaces.py b/src/test/api/routers/test_namespaces.py index 770733b1..07885bee 100644 --- a/src/test/api/routers/test_namespaces.py +++ b/src/test/api/routers/test_namespaces.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/api/routers/test_objects.py b/src/test/api/routers/test_objects.py index dc3edd5b..218850a6 100644 --- a/src/test/api/routers/test_objects.py +++ b/src/test/api/routers/test_objects.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/api/routers/test_types.py b/src/test/api/routers/test_types.py index 8a4248a4..00e5c8dc 100644 --- a/src/test/api/routers/test_types.py +++ b/src/test/api/routers/test_types.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/api/routers/test_versions.py b/src/test/api/routers/test_versions.py index e4a7d810..5a1d0639 100644 --- a/src/test/api/routers/test_versions.py +++ b/src/test/api/routers/test_versions.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/api/test_helpers.py b/src/test/api/test_helpers.py index c30f8b81..13e98491 100644 --- a/src/test/api/test_helpers.py +++ b/src/test/api/test_helpers.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/api/test_main.py b/src/test/api/test_main.py index c5d0546b..2e926949 100644 --- a/src/test/api/test_main.py +++ b/src/test/api/test_main.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/decision_points/__init__.py b/src/test/decision_points/__init__.py index 5c215061..b6c50dfd 100644 --- a/src/test/decision_points/__init__.py +++ b/src/test/decision_points/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University and Contributors. +# Copyright (c) 2026 Carnegie Mellon University and Contributors. # - see Contributors.md for a full list of Contributors # - see ContributionInstructions.md for information on how you can Contribute to this project # Stakeholder Specific Vulnerability Categorization (SSVC) is diff --git a/src/test/decision_points/test_cvss_helpers.py b/src/test/decision_points/test_cvss_helpers.py index 2937eac4..da9214de 100644 --- a/src/test/decision_points/test_cvss_helpers.py +++ b/src/test/decision_points/test_cvss_helpers.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/decision_points/test_dp_base.py b/src/test/decision_points/test_dp_base.py index 36e08f23..109ca3bd 100644 --- a/src/test/decision_points/test_dp_base.py +++ b/src/test/decision_points/test_dp_base.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/decision_points/test_dp_helpers.py b/src/test/decision_points/test_dp_helpers.py index a07f2df0..b0c0f3af 100644 --- a/src/test/decision_points/test_dp_helpers.py +++ b/src/test/decision_points/test_dp_helpers.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/decision_tables/__init__.py b/src/test/decision_tables/__init__.py index 9be8611d..243c4584 100644 --- a/src/test/decision_tables/__init__.py +++ b/src/test/decision_tables/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/decision_tables/cvss/__init__.py b/src/test/decision_tables/cvss/__init__.py index 7c3b4a14..ab1e2997 100644 --- a/src/test/decision_tables/cvss/__init__.py +++ b/src/test/decision_tables/cvss/__init__.py @@ -2,7 +2,7 @@ Unit tests for CVSS decision tables. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/decision_tables/cvss/_v4expected.py b/src/test/decision_tables/cvss/_v4expected.py index cb439cc1..f6aa2827 100644 --- a/src/test/decision_tables/cvss/_v4expected.py +++ b/src/test/decision_tables/cvss/_v4expected.py @@ -5,7 +5,7 @@ It was generated based on https://github.com/FIRSTdotorg/cvss-v4-calculator/blob/main/cvss_lookup.js """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/decision_tables/cvss/test_cvss_qsr4.py b/src/test/decision_tables/cvss/test_cvss_qsr4.py index deb4918e..4c45273f 100644 --- a/src/test/decision_tables/cvss/test_cvss_qsr4.py +++ b/src/test/decision_tables/cvss/test_cvss_qsr4.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/decision_tables/cvss/test_eq1.py b/src/test/decision_tables/cvss/test_eq1.py index 1d5e261b..117448fa 100644 --- a/src/test/decision_tables/cvss/test_eq1.py +++ b/src/test/decision_tables/cvss/test_eq1.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/decision_tables/cvss/test_eq2.py b/src/test/decision_tables/cvss/test_eq2.py index 24d1ce2d..6ba5fc40 100644 --- a/src/test/decision_tables/cvss/test_eq2.py +++ b/src/test/decision_tables/cvss/test_eq2.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/decision_tables/cvss/test_eq3.py b/src/test/decision_tables/cvss/test_eq3.py index 5812f6ed..71983672 100644 --- a/src/test/decision_tables/cvss/test_eq3.py +++ b/src/test/decision_tables/cvss/test_eq3.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/decision_tables/cvss/test_eq4.py b/src/test/decision_tables/cvss/test_eq4.py index 3d6a8591..2a38c50e 100644 --- a/src/test/decision_tables/cvss/test_eq4.py +++ b/src/test/decision_tables/cvss/test_eq4.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/decision_tables/cvss/test_eq5.py b/src/test/decision_tables/cvss/test_eq5.py index aee9b531..d5b852ce 100644 --- a/src/test/decision_tables/cvss/test_eq5.py +++ b/src/test/decision_tables/cvss/test_eq5.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/decision_tables/cvss/test_eq6.py b/src/test/decision_tables/cvss/test_eq6.py index f3ef9052..955ee658 100644 --- a/src/test/decision_tables/cvss/test_eq6.py +++ b/src/test/decision_tables/cvss/test_eq6.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/decision_tables/ssvc/__init__.py b/src/test/decision_tables/ssvc/__init__.py index bc4f1815..e67a30b1 100644 --- a/src/test/decision_tables/ssvc/__init__.py +++ b/src/test/decision_tables/ssvc/__init__.py @@ -2,7 +2,7 @@ Provides SSVC decision tables. """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/decision_tables/ssvc/test_coord_triage.py b/src/test/decision_tables/ssvc/test_coord_triage.py index 9cadefa9..590c1048 100644 --- a/src/test/decision_tables/ssvc/test_coord_triage.py +++ b/src/test/decision_tables/ssvc/test_coord_triage.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/decision_tables/ssvc/test_human_impact.py b/src/test/decision_tables/ssvc/test_human_impact.py index 61b89f5e..775b646e 100644 --- a/src/test/decision_tables/ssvc/test_human_impact.py +++ b/src/test/decision_tables/ssvc/test_human_impact.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/decision_tables/test_base.py b/src/test/decision_tables/test_base.py index 7b204f61..f875dcc6 100644 --- a/src/test/decision_tables/test_base.py +++ b/src/test/decision_tables/test_base.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/dp_groups/__init__.py b/src/test/dp_groups/__init__.py index bb9ae345..6dbb0985 100644 --- a/src/test/dp_groups/__init__.py +++ b/src/test/dp_groups/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University and Contributors. +# Copyright (c) 2026 Carnegie Mellon University and Contributors. # - see Contributors.md for a full list of Contributors # - see ContributionInstructions.md for information on how you can Contribute to this project # Stakeholder Specific Vulnerability Categorization (SSVC) is diff --git a/src/test/dp_groups/test_dp_groups.py b/src/test/dp_groups/test_dp_groups.py index 4fe6c24f..4e78cd85 100644 --- a/src/test/dp_groups/test_dp_groups.py +++ b/src/test/dp_groups/test_dp_groups.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/outcomes/__init__.py b/src/test/outcomes/__init__.py index 3c4a8bfe..1b5bc902 100644 --- a/src/test/outcomes/__init__.py +++ b/src/test/outcomes/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University and Contributors. +# Copyright (c) 2026 Carnegie Mellon University and Contributors. # - see Contributors.md for a full list of Contributors # - see ContributionInstructions.md for information on how you can Contribute to this project # Stakeholder Specific Vulnerability Categorization (SSVC) is diff --git a/src/test/outcomes/test_outcomes.py b/src/test/outcomes/test_outcomes.py index 4d2392b8..068dba36 100644 --- a/src/test/outcomes/test_outcomes.py +++ b/src/test/outcomes/test_outcomes.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/registry/__init__.py b/src/test/registry/__init__.py index ee3fe40d..4d9ebc24 100644 --- a/src/test/registry/__init__.py +++ b/src/test/registry/__init__.py @@ -6,7 +6,7 @@ """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/registry/test_base.py b/src/test/registry/test_base.py index 9f28ea61..e8493dbf 100644 --- a/src/test/registry/test_base.py +++ b/src/test/registry/test_base.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/test_csv_analyzer.py b/src/test/test_csv_analyzer.py index a6c7bcb5..d1806c61 100644 --- a/src/test/test_csv_analyzer.py +++ b/src/test/test_csv_analyzer.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/test_doc_helpers.py b/src/test/test_doc_helpers.py index e199cb2f..ff734887 100644 --- a/src/test/test_doc_helpers.py +++ b/src/test/test_doc_helpers.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/test_doctools.py b/src/test/test_doctools.py index 9bdb38b6..14027b04 100644 --- a/src/test/test_doctools.py +++ b/src/test/test_doctools.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/test_mixins.py b/src/test/test_mixins.py index decba16f..35b6eaf7 100644 --- a/src/test/test_mixins.py +++ b/src/test/test_mixins.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/test_namespaces.py b/src/test/test_namespaces.py index 9a66e4b3..af913c70 100644 --- a/src/test/test_namespaces.py +++ b/src/test/test_namespaces.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/test_namespaces_pattern.py b/src/test/test_namespaces_pattern.py index d105f3fb..e0af0252 100644 --- a/src/test/test_namespaces_pattern.py +++ b/src/test/test_namespaces_pattern.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/test_policy_generator.py b/src/test/test_policy_generator.py index b486700e..c598088f 100644 --- a/src/test/test_policy_generator.py +++ b/src/test/test_policy_generator.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/test_schema.py b/src/test/test_schema.py index d4c94795..387e4c17 100644 --- a/src/test/test_schema.py +++ b/src/test/test_schema.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Carnegie Mellon University. +# Copyright (c) 2023-2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/test_selections.py b/src/test/test_selections.py index f5d2e5c0..9f27f6bb 100644 --- a/src/test/test_selections.py +++ b/src/test/test_selections.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/utils/__init__.py b/src/test/utils/__init__.py index 684d6c79..71602dd6 100644 --- a/src/test/utils/__init__.py +++ b/src/test/utils/__init__.py @@ -6,7 +6,7 @@ """ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/src/test/utils/test_toposort.py b/src/test/utils/test_toposort.py index 52c6206b..a15b3fe2 100644 --- a/src/test/utils/test_toposort.py +++ b/src/test/utils/test_toposort.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Carnegie Mellon University. +# Copyright (c) 2026 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. # CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, diff --git a/uv.lock b/uv.lock index 039975c6..9face400 100644 --- a/uv.lock +++ b/uv.lock @@ -1,6 +1,50 @@ version = 1 revision = 3 requires-python = ">=3.12" +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] + +[[package]] +name = "abnf" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/f2/7b5fac50ee42e8b8d4a098d76743a394546f938c94125adbb93414e5ae7d/abnf-2.2.0.tar.gz", hash = "sha256:433380fd32855bbc60bc7b3d35d40616e21383a32ed1c9b8893d16d9f4a6c2f4", size = 197507, upload-time = "2023-03-17T18:26:24.577Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/95/f456ae7928a2f3a913f467d4fd9e662e295dd7349fc58b35f77f6c757a23/abnf-2.2.0-py3-none-any.whl", hash = "sha256:5dc2ae31a84ff454f7de46e08a2a21a442a0e21a092468420587a1590b490d1f", size = 39938, upload-time = "2023-03-17T18:26:22.608Z" }, +] + +[[package]] +name = "abnf-to-regexp" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "abnf" }, + { name = "icontract" }, + { name = "regex" }, + { name = "sortedcontainers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/23/6f3e11413bfac92688555c972a008f04cbc86b5e2e1a74649c919f2999a6/abnf_to_regexp-1.2.0.tar.gz", hash = "sha256:c3b51771e8015adeedfcd15857ee2a9a4d0595355b672571ab1b0f2adb535a0a", size = 25883, upload-time = "2025-11-08T18:15:10.232Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/8e/ca543f8ba7b89a632f059c19fdbcb24a640847b3603856f0cce2de45da91/abnf_to_regexp-1.2.0-py3-none-any.whl", hash = "sha256:63d330ebe080d4e68c252033449b0ea03be35847abf8fb17f52cd9afbed25b4d", size = 24393, upload-time = "2025-11-08T18:15:08.481Z" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] [[package]] name = "annotated-types" @@ -25,6 +69,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] +[[package]] +name = "asttokens" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/45/1d/f03bcb60c4a3212e15f99a56085d93093a497718adf828d050b9d675da81/asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0", size = 62284, upload-time = "2023-10-26T10:03:05.06Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", size = 27764, upload-time = "2023-10-26T10:03:01.789Z" }, +] + [[package]] name = "attrs" version = "25.3.0" @@ -72,7 +128,7 @@ wheels = [ [[package]] name = "black" -version = "25.9.0" +version = "26.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -82,17 +138,24 @@ dependencies = [ { name = "platformdirs" }, { name = "pytokens" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4b/43/20b5c90612d7bdb2bdbcceeb53d588acca3bb8f0e4c5d5c751a2c8fdd55a/black-25.9.0.tar.gz", hash = "sha256:0474bca9a0dd1b51791fcc507a4e02078a1c63f6d4e4ae5544b9848c7adfb619", size = 648393, upload-time = "2025-09-19T00:27:37.758Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/37/5628dd55bf2b34257fc7603f0fe97c40e3aaf24265f416a9c85c95ca1436/black-26.5.1.tar.gz", hash = "sha256:dd321f668053961824bcc1be1cc1df748b2d7e4fa28086b08331e577b0100a73", size = 679439, upload-time = "2026-05-18T16:53:36.107Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/8e/319cfe6c82f7e2d5bfb4d3353c6cc85b523d677ff59edc61fdb9ee275234/black-25.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1b9dc70c21ef8b43248f1d86aedd2aaf75ae110b958a7909ad8463c4aa0880b0", size = 1742012, upload-time = "2025-09-19T00:33:08.678Z" }, - { url = "https://files.pythonhosted.org/packages/94/cc/f562fe5d0a40cd2a4e6ae3f685e4c36e365b1f7e494af99c26ff7f28117f/black-25.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8e46eecf65a095fa62e53245ae2795c90bdecabd53b50c448d0a8bcd0d2e74c4", size = 1581421, upload-time = "2025-09-19T00:35:25.937Z" }, - { url = "https://files.pythonhosted.org/packages/84/67/6db6dff1ebc8965fd7661498aea0da5d7301074b85bba8606a28f47ede4d/black-25.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9101ee58ddc2442199a25cb648d46ba22cd580b00ca4b44234a324e3ec7a0f7e", size = 1655619, upload-time = "2025-09-19T00:30:49.241Z" }, - { url = "https://files.pythonhosted.org/packages/10/10/3faef9aa2a730306cf469d76f7f155a8cc1f66e74781298df0ba31f8b4c8/black-25.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:77e7060a00c5ec4b3367c55f39cf9b06e68965a4f2e61cecacd6d0d9b7ec945a", size = 1342481, upload-time = "2025-09-19T00:31:29.625Z" }, - { url = "https://files.pythonhosted.org/packages/48/99/3acfea65f5e79f45472c45f87ec13037b506522719cd9d4ac86484ff51ac/black-25.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0172a012f725b792c358d57fe7b6b6e8e67375dd157f64fa7a3097b3ed3e2175", size = 1742165, upload-time = "2025-09-19T00:34:10.402Z" }, - { url = "https://files.pythonhosted.org/packages/3a/18/799285282c8236a79f25d590f0222dbd6850e14b060dfaa3e720241fd772/black-25.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3bec74ee60f8dfef564b573a96b8930f7b6a538e846123d5ad77ba14a8d7a64f", size = 1581259, upload-time = "2025-09-19T00:32:49.685Z" }, - { url = "https://files.pythonhosted.org/packages/f1/ce/883ec4b6303acdeca93ee06b7622f1fa383c6b3765294824165d49b1a86b/black-25.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b756fc75871cb1bcac5499552d771822fd9db5a2bb8db2a7247936ca48f39831", size = 1655583, upload-time = "2025-09-19T00:30:44.505Z" }, - { url = "https://files.pythonhosted.org/packages/21/17/5c253aa80a0639ccc427a5c7144534b661505ae2b5a10b77ebe13fa25334/black-25.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:846d58e3ce7879ec1ffe816bb9df6d006cd9590515ed5d17db14e17666b2b357", size = 1343428, upload-time = "2025-09-19T00:32:13.839Z" }, - { url = "https://files.pythonhosted.org/packages/1b/46/863c90dcd3f9d41b109b7f19032ae0db021f0b2a81482ba0a1e28c84de86/black-25.9.0-py3-none-any.whl", hash = "sha256:474b34c1342cdc157d307b56c4c65bce916480c4a8f6551fdc6bf9b486a7c4ae", size = 203363, upload-time = "2025-09-19T00:27:35.724Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/7744b906703228264ef73bdd534df88ec1ef3de45c4e78f6d31b9e32d0c9/black-26.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4ad6fa01f941920f54f2bbb35f3df7673428a0ef98a0b0840c2eaef3b110efa8", size = 2012518, upload-time = "2026-05-18T17:05:20.108Z" }, + { url = "https://files.pythonhosted.org/packages/b7/c0/c5a3b1636dfd09c42534f2b3cf33506814f6d3e066fb0879ffa16c1ae860/black-26.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3915f256e75a2d7cf88d8953d37f780455dc586cc72dee059c528fe77f581217", size = 1816016, upload-time = "2026-05-18T17:05:21.84Z" }, + { url = "https://files.pythonhosted.org/packages/1f/0e/36044316b65ca471d3bb6d3703fd06fb50c6b727c3562f6a5a3153634f88/black-26.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d98d4137277c75dfb898ec8d846c4fd68ba1e9cf77f95e2865c203dc18f4c3d", size = 1884150, upload-time = "2026-05-18T17:05:23.546Z" }, + { url = "https://files.pythonhosted.org/packages/b3/33/dafc5808c2af43672912111d7c3354af1615f7e2be3bed7a878461abbe4d/black-26.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:a1dca32d9f1784af512a13410ec204c6f7f0aa9797a111c42e1c03449821c264", size = 1486825, upload-time = "2026-05-18T17:05:25.004Z" }, + { url = "https://files.pythonhosted.org/packages/82/14/b965ee6ad2a311f28bdbf692def3ee9848d2ae289dab28b27657fcee3e78/black-26.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:1037d5ac7b7b310b2632ad867ec8d0e4c4819dcdb0b820f63135da746a24e418", size = 1288646, upload-time = "2026-05-18T17:05:26.477Z" }, + { url = "https://files.pythonhosted.org/packages/3f/5c/c384363980e11e25ca6b93205949bb331fbf35f4e0dbec376dfa6326cec8/black-26.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b36cf2ddf5566e205f6535f782a62194a184d33e175b64ae8c40b1737522be3", size = 2009020, upload-time = "2026-05-18T17:05:28.132Z" }, + { url = "https://files.pythonhosted.org/packages/0b/df/9f31c5e0babbfed77d505fc5d120beb98b21b33feaeded3924ea941fe360/black-26.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f7ea64ebfa01b50f693508fc39f875e264446d3b097088f84f203b9d09618a0", size = 1813335, upload-time = "2026-05-18T17:05:31.266Z" }, + { url = "https://files.pythonhosted.org/packages/fb/24/8e7b9a2fa61b0afd82209efe937557d180a1fa055bd7f6161eb9defc3719/black-26.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecb3e624844c798144e9bd986954e0adc81d8911a1f30f375e1252fe26e8c294", size = 1881614, upload-time = "2026-05-18T17:05:32.718Z" }, + { url = "https://files.pythonhosted.org/packages/49/ad/b4e0d9365ba8ac34f6bbab62a4b1b2dd5d618fac3fa1b8db968c844201b5/black-26.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:e1a26503279b6b310669fb0b219c39e4820b77e8189fe80f522bb511f247db0a", size = 1488925, upload-time = "2026-05-18T17:05:34.259Z" }, + { url = "https://files.pythonhosted.org/packages/a1/4b/652b859bf5df88a751c30451b09338f7fd26a77d1271c666992f836b7711/black-26.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c34b25da232ead53a6f335b76dbea124f4d152ad568b9080d6f944bc2b34b52", size = 1289883, upload-time = "2026-05-18T17:05:36.019Z" }, + { url = "https://files.pythonhosted.org/packages/a6/16/a8da8eb208c51c7f4ce74609a45d0dcc6d8a2141e45e81ee5289d1bb0d59/black-26.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e88976690a64b0af98312ca958415849cb42423423c5f2ee74af4b49a97a2168", size = 2004800, upload-time = "2026-05-18T17:05:38.182Z" }, + { url = "https://files.pythonhosted.org/packages/11/8a/a479296a19e383b70a725882a6cf3d786540601ff03cabbaaf1cce864c5a/black-26.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32d5ea7f6c8bdfa6e648326ebca1f02b0764e2a029edc6f8dce2627e19d468c3", size = 1815576, upload-time = "2026-05-18T17:05:40.309Z" }, + { url = "https://files.pythonhosted.org/packages/81/6b/cfaf3d39f25132c156a068f6b805576c9103a84086019507c70e1911ee7d/black-26.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea8d16dc41655aa113cd64665e7219446cd7e4ff2248d7178eaa905190c86b18", size = 1877927, upload-time = "2026-05-18T17:05:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/66/76/302e313964bcff7e28df329d39f84f5270095730d85ff0acc260610a0d82/black-26.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:577f21094ea469ef92ec1adaf2c9441a226d2144d01a5be2fa823cecf6543e50", size = 1511860, upload-time = "2026-05-18T17:05:43.943Z" }, + { url = "https://files.pythonhosted.org/packages/27/4e/a3827e35e0e567f9f9ee59e2a0ab979267dca98718f25547ca8c6733afd4/black-26.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:ed1a20af114c301a0269bf01163d51dbef72737fd65f850001e7cbe7f3c7abae", size = 1316632, upload-time = "2026-05-18T17:05:45.521Z" }, + { url = "https://files.pythonhosted.org/packages/94/51/f975cae76d44274cc2868dc9040ac5d58d464784610234455b4e7b19c6ef/black-26.5.1-py3-none-any.whl", hash = "sha256:4ed7f7da04046d2e488437170797d3b4a4ad83906683bcb7dfc68b673bbce5e2", size = 213693, upload-time = "2026-05-18T16:53:33.964Z" }, ] [[package]] @@ -123,6 +186,7 @@ dependencies = [ { name = "networkx" }, { name = "pandas" }, { name = "pydantic" }, + { name = "pymdown-extensions" }, { name = "scikit-learn" }, { name = "scipy" }, { name = "semver" }, @@ -130,6 +194,9 @@ dependencies = [ ] [package.dev-dependencies] +codegen = [ + { name = "abnf-to-regexp" }, +] dev = [ { name = "black" }, { name = "linkchecker" }, @@ -153,6 +220,7 @@ requires-dist = [ { name = "networkx", specifier = ">=3.4.2" }, { name = "pandas", specifier = ">=2.3.2" }, { name = "pydantic", specifier = ">=2.11.7" }, + { name = "pymdown-extensions", specifier = ">=10.21.2" }, { name = "scikit-learn", specifier = ">=1.6.1" }, { name = "scipy", specifier = ">=1.16.1" }, { name = "semver", specifier = ">=3.0.4" }, @@ -160,6 +228,7 @@ requires-dist = [ ] [package.metadata.requires-dev] +codegen = [{ name = "abnf-to-regexp", specifier = ">=1.2.0" }] dev = [ { name = "black", specifier = ">=25.9.0" }, { name = "linkchecker", specifier = ">=10.6.0" }, @@ -262,16 +331,18 @@ wheels = [ [[package]] name = "fastapi" -version = "0.117.1" +version = "0.135.1" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "annotated-doc" }, { name = "pydantic" }, { name = "starlette" }, { name = "typing-extensions" }, + { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7e/7e/d9788300deaf416178f61fb3c2ceb16b7d0dc9f82a08fdb87a5e64ee3cc7/fastapi-0.117.1.tar.gz", hash = "sha256:fb2d42082d22b185f904ca0ecad2e195b851030bd6c5e4c032d1c981240c631a", size = 307155, upload-time = "2025-09-20T20:16:56.663Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/7b/f8e0211e9380f7195ba3f3d40c292594fd81ba8ec4629e3854c353aaca45/fastapi-0.135.1.tar.gz", hash = "sha256:d04115b508d936d254cea545b7312ecaa58a7b3a0f84952535b4c9afae7668cd", size = 394962, upload-time = "2026-03-01T18:18:29.369Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/45/d9d3e8eeefbe93be1c50060a9d9a9f366dba66f288bb518a9566a23a8631/fastapi-0.117.1-py3-none-any.whl", hash = "sha256:33c51a0d21cab2b9722d4e56dbb9316f3687155be6b276191790d8da03507552", size = 95959, upload-time = "2025-09-20T20:16:53.661Z" }, + { url = "https://files.pythonhosted.org/packages/e4/72/42e900510195b23a56bde950d26a51f8b723846bfcaa0286e90287f0422b/fastapi-0.135.1-py3-none-any.whl", hash = "sha256:46e2fc5745924b7c840f71ddd277382af29ce1cdb7d5eab5bf697e3fb9999c9e", size = 116999, upload-time = "2026-03-01T18:18:30.831Z" }, ] [package.optional-dependencies] @@ -281,12 +352,10 @@ all = [ { name = "httpx" }, { name = "itsdangerous" }, { name = "jinja2" }, - { name = "orjson" }, { name = "pydantic-extra-types" }, { name = "pydantic-settings" }, { name = "python-multipart" }, { name = "pyyaml" }, - { name = "ujson" }, { name = "uvicorn", extra = ["standard"] }, ] standard = [ @@ -294,6 +363,8 @@ standard = [ { name = "fastapi-cli", extra = ["standard"] }, { name = "httpx" }, { name = "jinja2" }, + { name = "pydantic-extra-types" }, + { name = "pydantic-settings" }, { name = "python-multipart" }, { name = "uvicorn", extra = ["standard"] }, ] @@ -349,15 +420,12 @@ wheels = [ ] [[package]] -name = "griffe" -version = "1.14.0" +name = "griffelib" +version = "2.0.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ec/d7/6c09dd7ce4c7837e4cdb11dce980cb45ae3cd87677298dc3b781b6bce7d3/griffe-1.14.0.tar.gz", hash = "sha256:9d2a15c1eca966d68e00517de5d69dd1bc5c9f2335ef6c1775362ba5b8651a13", size = 424684, upload-time = "2025-09-05T15:02:29.167Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/06/eccbd311c9e2b3ca45dbc063b93134c57a1ccc7607c5e545264ad092c4a9/griffelib-2.0.0.tar.gz", hash = "sha256:e504d637a089f5cab9b5daf18f7645970509bf4f53eda8d79ed71cce8bd97934", size = 166312, upload-time = "2026-03-23T21:06:55.954Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/b1/9ff6578d789a89812ff21e4e0f80ffae20a65d5dd84e7a17873fe3b365be/griffe-1.14.0-py3-none-any.whl", hash = "sha256:0e9d52832cccf0f7188cfe585ba962d2674b241c01916d780925df34873bceb0", size = 144439, upload-time = "2025-09-05T15:02:27.511Z" }, + { url = "https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl", hash = "sha256:01284878c966508b6d6f1dbff9b6fa607bc062d8261c5c7253cb285b06422a7f", size = 142004, upload-time = "2026-02-09T19:09:40.561Z" }, ] [[package]] @@ -419,13 +487,26 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, ] +[[package]] +name = "icontract" +version = "2.7.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/41/93/8a7d5850d848cba73aa094b961459d8101b7c96837b2e8dc91083adcf7ae/icontract-2.7.3.tar.gz", hash = "sha256:df37a43d86d532407bc6b84dea29dd9f7ece794b73211769fa8a33a76b8ed145", size = 68361, upload-time = "2026-01-29T13:11:14.724Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/aa/ffc16b7ed17e052e7d2140e66336f829e9383f61f31249c4d181e12fcdea/icontract-2.7.3-py3-none-any.whl", hash = "sha256:8fb0f93f71211416f214f37c01b8017fdc8c079d70159f49f0ddcc10918c14d0", size = 40983, upload-time = "2026-01-29T13:11:13.198Z" }, +] + [[package]] name = "idna" -version = "3.10" +version = "3.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, + { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, ] [[package]] @@ -469,7 +550,7 @@ wheels = [ [[package]] name = "jsonschema" -version = "4.25.1" +version = "4.26.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, @@ -477,9 +558,9 @@ dependencies = [ { name = "referencing" }, { name = "rpds-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342, upload-time = "2025-08-18T17:03:50.038Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload-time = "2025-08-18T17:03:48.373Z" }, + { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, ] [[package]] @@ -683,25 +764,24 @@ wheels = [ [[package]] name = "mkdocs-include-markdown-plugin" -version = "7.2.0" +version = "7.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mkdocs" }, { name = "wcmatch" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/90/10/b0b75ac42f4613556a808eee2dad3efe7a7d5079349aa5b9229d863e829f/mkdocs_include_markdown_plugin-7.2.0.tar.gz", hash = "sha256:4a67a91ade680dc0e15f608e5b6343bec03372ffa112c40a4254c1bfb10f42f3", size = 25509, upload-time = "2025-09-28T21:50:50.41Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/2b/c788fc5c39ccba342eb9067be637327faebbc0e47da41ea79dc2526e693a/mkdocs_include_markdown_plugin-7.3.0.tar.gz", hash = "sha256:2800126746452e31c2e321bbd43c8190b356e0de353e20cbc16a34a3c3d6796c", size = 25527, upload-time = "2026-05-15T18:16:13.946Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/f9/783338d1d7fd548c7635728b67a0f8f96d9e6c265aa61c51356c03597767/mkdocs_include_markdown_plugin-7.2.0-py3-none-any.whl", hash = "sha256:d56cdaeb2d113fb66ed0fe4fb7af1da889926b0b9872032be24e19bbb09c9f5b", size = 29548, upload-time = "2025-09-28T21:50:49.373Z" }, + { url = "https://files.pythonhosted.org/packages/85/84/c0109c5991b89cbf028b8597f73fa7bd6a6b092407be2369a354b52737ab/mkdocs_include_markdown_plugin-7.3.0-py3-none-any.whl", hash = "sha256:5b5c99b5d3c9b9ce0114a9e60353bbafb6be53a26c2d3b74ec6b767a7a8e55ca", size = 29675, upload-time = "2026-05-15T18:16:12.654Z" }, ] [[package]] name = "mkdocs-material" -version = "9.6.18" +version = "9.7.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "babel" }, { name = "backrefs" }, - { name = "click" }, { name = "colorama" }, { name = "jinja2" }, { name = "markdown" }, @@ -712,9 +792,9 @@ dependencies = [ { name = "pymdown-extensions" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e6/46/db0d78add5aac29dfcd0a593bcc6049c86c77ba8a25b3a5b681c190d5e99/mkdocs_material-9.6.18.tar.gz", hash = "sha256:a2eb253bcc8b66f8c6eaf8379c10ed6e9644090c2e2e9d0971c7722dc7211c05", size = 4034856, upload-time = "2025-08-22T08:21:47.575Z" } +sdist = { url = "https://files.pythonhosted.org/packages/45/29/6d2bcf41ae40802c4beda2432396fff97b8456fb496371d1bc7aad6512ec/mkdocs_material-9.7.6.tar.gz", hash = "sha256:00bdde50574f776d328b1862fe65daeaf581ec309bd150f7bff345a098c64a69", size = 4097959, upload-time = "2026-03-19T15:41:58.161Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/0b/545a4f8d4f9057e77f1d99640eb09aaae40c4f9034707f25636caf716ff9/mkdocs_material-9.6.18-py3-none-any.whl", hash = "sha256:dbc1e146a0ecce951a4d84f97b816a54936cdc9e1edd1667fc6868878ac06701", size = 9232642, upload-time = "2025-08-22T08:21:44.52Z" }, + { url = "https://files.pythonhosted.org/packages/2c/01/bc663630c510822c95c47a66af9fa7a443c295b47d5f041e5e6ae62ef659/mkdocs_material-9.7.6-py3-none-any.whl", hash = "sha256:71b84353921b8ea1ba84fe11c50912cc512da8fe0881038fcc9a0761c0e635ba", size = 9305470, upload-time = "2026-03-19T15:41:55.217Z" }, ] [[package]] @@ -755,7 +835,7 @@ wheels = [ [[package]] name = "mkdocstrings" -version = "0.30.0" +version = "1.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jinja2" }, @@ -765,23 +845,23 @@ dependencies = [ { name = "mkdocs-autorefs" }, { name = "pymdown-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e2/0a/7e4776217d4802009c8238c75c5345e23014a4706a8414a62c0498858183/mkdocstrings-0.30.0.tar.gz", hash = "sha256:5d8019b9c31ddacd780b6784ffcdd6f21c408f34c0bd1103b5351d609d5b4444", size = 106597, upload-time = "2025-07-22T23:48:45.998Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/5d/f888d4d3eb31359b327bc9b17a212d6ef03fe0b0682fbb3fc2cb849fb12b/mkdocstrings-1.0.4.tar.gz", hash = "sha256:3969a6515b77db65fd097b53c1b7aa4ae840bd71a2ee62a6a3e89503446d7172", size = 100088, upload-time = "2026-04-15T09:16:53.376Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/de/b4/3c5eac68f31e124a55d255d318c7445840fa1be55e013f507556d6481913/mkdocstrings-0.30.0-py3-none-any.whl", hash = "sha256:ae9e4a0d8c1789697ac776f2e034e2ddd71054ae1cf2c2bb1433ccfd07c226f2", size = 36579, upload-time = "2025-07-22T23:48:44.152Z" }, + { url = "https://files.pythonhosted.org/packages/6e/94/be70f8ee9c45f2f62b39a1f0e9303bc20e138a8f3b8e50ffd89498e177e1/mkdocstrings-1.0.4-py3-none-any.whl", hash = "sha256:63464b4b29053514f32a1dbbf604e52876d5e638111b0c295ab7ed3cac73ca9b", size = 35560, upload-time = "2026-04-15T09:16:51.436Z" }, ] [[package]] name = "mkdocstrings-python" -version = "1.17.0" +version = "2.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "griffe" }, + { name = "griffelib" }, { name = "mkdocs-autorefs" }, { name = "mkdocstrings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/39/7c/6dfd8ad59c0eebae167168528ed6cad00116f58ef2327686149f7b25d175/mkdocstrings_python-1.17.0.tar.gz", hash = "sha256:c6295962b60542a9c7468a3b515ce8524616ca9f8c1a38c790db4286340ba501", size = 200408, upload-time = "2025-08-14T21:18:14.568Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/b4/5fed370d8ebd96e4e399460a7146ae989263f16588b05a6facd6dbd51e60/mkdocstrings_python-2.0.4.tar.gz", hash = "sha256:58c73c5d358e64e9b1673447663f4a2f8a8941e392e225fc0a0c893758cc452f", size = 199219, upload-time = "2026-06-05T08:13:01.819Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/ac/b1fcc937f4ecd372f3e857162dea67c45c1e2eedbac80447be516e3372bb/mkdocstrings_python-1.17.0-py3-none-any.whl", hash = "sha256:49903fa355dfecc5ad0b891e78ff5d25d30ffd00846952801bbe8331e123d4b0", size = 124778, upload-time = "2025-08-14T21:18:12.821Z" }, + { url = "https://files.pythonhosted.org/packages/5e/e3/00ec594aef5f55522e6d373bc2ac53e53a8f5e9ae32f2d6854b0de4270f3/mkdocstrings_python-2.0.4-py3-none-any.whl", hash = "sha256:fd87c173e1e719a85997b6d4f852cdc55f36710e0ed08da3a7bd9abe79c9db00", size = 104790, upload-time = "2026-06-05T08:13:00.393Z" }, ] [[package]] @@ -793,13 +873,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, ] +[[package]] +name = "narwhals" +version = "2.22.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/1c/c80cb7719721a44846c6301ef118434bae30a423924bfad3a47f16bdc064/narwhals-2.22.0.tar.gz", hash = "sha256:6486282bb7e4b4ab55963efbd8be1451b764cc4874b74d1fd625eba9dc60b86f", size = 417565, upload-time = "2026-06-01T13:34:36.249Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/b6/e7cdde7b8e90d5dff25b622f95833ef26567ad184c977278b93a1cbd5717/narwhals-2.22.0-py3-none-any.whl", hash = "sha256:1421797ede01789cc1537619dbc3f36f840737240f748fdb24a60a0225fc80be", size = 453815, upload-time = "2026-06-01T13:34:34.127Z" }, +] + [[package]] name = "networkx" -version = "3.4.2" +version = "3.6.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263, upload-time = "2024-10-21T12:39:36.247Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504, upload-time = "2025-12-08T17:02:38.159Z" }, ] [[package]] @@ -865,55 +954,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/06/b9/33bba5ff6fb679aa0b1f8a07e853f002a6b04b9394db3069a1270a7784ca/numpy-2.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:78c9f6560dc7e6b3990e32df7ea1a50bbd0e2a111e05209963f5ddcab7073b0b", size = 10545953, upload-time = "2025-09-09T15:58:40.576Z" }, ] -[[package]] -name = "orjson" -version = "3.11.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/be/4d/8df5f83256a809c22c4d6792ce8d43bb503be0fb7a8e4da9025754b09658/orjson-3.11.3.tar.gz", hash = "sha256:1c0603b1d2ffcd43a411d64797a19556ef76958aef1c182f22dc30860152a98a", size = 5482394, upload-time = "2025-08-26T17:46:43.171Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/b0/a7edab2a00cdcb2688e1c943401cb3236323e7bfd2839815c6131a3742f4/orjson-3.11.3-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:8c752089db84333e36d754c4baf19c0e1437012242048439c7e80eb0e6426e3b", size = 238259, upload-time = "2025-08-26T17:45:15.093Z" }, - { url = "https://files.pythonhosted.org/packages/e1/c6/ff4865a9cc398a07a83342713b5932e4dc3cb4bf4bc04e8f83dedfc0d736/orjson-3.11.3-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:9b8761b6cf04a856eb544acdd82fc594b978f12ac3602d6374a7edb9d86fd2c2", size = 127633, upload-time = "2025-08-26T17:45:16.417Z" }, - { url = "https://files.pythonhosted.org/packages/6e/e6/e00bea2d9472f44fe8794f523e548ce0ad51eb9693cf538a753a27b8bda4/orjson-3.11.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b13974dc8ac6ba22feaa867fc19135a3e01a134b4f7c9c28162fed4d615008a", size = 123061, upload-time = "2025-08-26T17:45:17.673Z" }, - { url = "https://files.pythonhosted.org/packages/54/31/9fbb78b8e1eb3ac605467cb846e1c08d0588506028b37f4ee21f978a51d4/orjson-3.11.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f83abab5bacb76d9c821fd5c07728ff224ed0e52d7a71b7b3de822f3df04e15c", size = 127956, upload-time = "2025-08-26T17:45:19.172Z" }, - { url = "https://files.pythonhosted.org/packages/36/88/b0604c22af1eed9f98d709a96302006915cfd724a7ebd27d6dd11c22d80b/orjson-3.11.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6fbaf48a744b94091a56c62897b27c31ee2da93d826aa5b207131a1e13d4064", size = 130790, upload-time = "2025-08-26T17:45:20.586Z" }, - { url = "https://files.pythonhosted.org/packages/0e/9d/1c1238ae9fffbfed51ba1e507731b3faaf6b846126a47e9649222b0fd06f/orjson-3.11.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc779b4f4bba2847d0d2940081a7b6f7b5877e05408ffbb74fa1faf4a136c424", size = 132385, upload-time = "2025-08-26T17:45:22.036Z" }, - { url = "https://files.pythonhosted.org/packages/a3/b5/c06f1b090a1c875f337e21dd71943bc9d84087f7cdf8c6e9086902c34e42/orjson-3.11.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd4b909ce4c50faa2192da6bb684d9848d4510b736b0611b6ab4020ea6fd2d23", size = 135305, upload-time = "2025-08-26T17:45:23.4Z" }, - { url = "https://files.pythonhosted.org/packages/a0/26/5f028c7d81ad2ebbf84414ba6d6c9cac03f22f5cd0d01eb40fb2d6a06b07/orjson-3.11.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:524b765ad888dc5518bbce12c77c2e83dee1ed6b0992c1790cc5fb49bb4b6667", size = 132875, upload-time = "2025-08-26T17:45:25.182Z" }, - { url = "https://files.pythonhosted.org/packages/fe/d4/b8df70d9cfb56e385bf39b4e915298f9ae6c61454c8154a0f5fd7efcd42e/orjson-3.11.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:84fd82870b97ae3cdcea9d8746e592b6d40e1e4d4527835fc520c588d2ded04f", size = 130940, upload-time = "2025-08-26T17:45:27.209Z" }, - { url = "https://files.pythonhosted.org/packages/da/5e/afe6a052ebc1a4741c792dd96e9f65bf3939d2094e8b356503b68d48f9f5/orjson-3.11.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:fbecb9709111be913ae6879b07bafd4b0785b44c1eb5cac8ac76da048b3885a1", size = 403852, upload-time = "2025-08-26T17:45:28.478Z" }, - { url = "https://files.pythonhosted.org/packages/f8/90/7bbabafeb2ce65915e9247f14a56b29c9334003536009ef5b122783fe67e/orjson-3.11.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9dba358d55aee552bd868de348f4736ca5a4086d9a62e2bfbbeeb5629fe8b0cc", size = 146293, upload-time = "2025-08-26T17:45:29.86Z" }, - { url = "https://files.pythonhosted.org/packages/27/b3/2d703946447da8b093350570644a663df69448c9d9330e5f1d9cce997f20/orjson-3.11.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eabcf2e84f1d7105f84580e03012270c7e97ecb1fb1618bda395061b2a84a049", size = 135470, upload-time = "2025-08-26T17:45:31.243Z" }, - { url = "https://files.pythonhosted.org/packages/38/70/b14dcfae7aff0e379b0119c8a812f8396678919c431efccc8e8a0263e4d9/orjson-3.11.3-cp312-cp312-win32.whl", hash = "sha256:3782d2c60b8116772aea8d9b7905221437fdf53e7277282e8d8b07c220f96cca", size = 136248, upload-time = "2025-08-26T17:45:32.567Z" }, - { url = "https://files.pythonhosted.org/packages/35/b8/9e3127d65de7fff243f7f3e53f59a531bf6bb295ebe5db024c2503cc0726/orjson-3.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:79b44319268af2eaa3e315b92298de9a0067ade6e6003ddaef72f8e0bedb94f1", size = 131437, upload-time = "2025-08-26T17:45:34.949Z" }, - { url = "https://files.pythonhosted.org/packages/51/92/a946e737d4d8a7fd84a606aba96220043dcc7d6988b9e7551f7f6d5ba5ad/orjson-3.11.3-cp312-cp312-win_arm64.whl", hash = "sha256:0e92a4e83341ef79d835ca21b8bd13e27c859e4e9e4d7b63defc6e58462a3710", size = 125978, upload-time = "2025-08-26T17:45:36.422Z" }, - { url = "https://files.pythonhosted.org/packages/fc/79/8932b27293ad35919571f77cb3693b5906cf14f206ef17546052a241fdf6/orjson-3.11.3-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:af40c6612fd2a4b00de648aa26d18186cd1322330bd3a3cc52f87c699e995810", size = 238127, upload-time = "2025-08-26T17:45:38.146Z" }, - { url = "https://files.pythonhosted.org/packages/1c/82/cb93cd8cf132cd7643b30b6c5a56a26c4e780c7a145db6f83de977b540ce/orjson-3.11.3-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:9f1587f26c235894c09e8b5b7636a38091a9e6e7fe4531937534749c04face43", size = 127494, upload-time = "2025-08-26T17:45:39.57Z" }, - { url = "https://files.pythonhosted.org/packages/a4/b8/2d9eb181a9b6bb71463a78882bcac1027fd29cf62c38a40cc02fc11d3495/orjson-3.11.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61dcdad16da5bb486d7227a37a2e789c429397793a6955227cedbd7252eb5a27", size = 123017, upload-time = "2025-08-26T17:45:40.876Z" }, - { url = "https://files.pythonhosted.org/packages/b4/14/a0e971e72d03b509190232356d54c0f34507a05050bd026b8db2bf2c192c/orjson-3.11.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:11c6d71478e2cbea0a709e8a06365fa63da81da6498a53e4c4f065881d21ae8f", size = 127898, upload-time = "2025-08-26T17:45:42.188Z" }, - { url = "https://files.pythonhosted.org/packages/8e/af/dc74536722b03d65e17042cc30ae586161093e5b1f29bccda24765a6ae47/orjson-3.11.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff94112e0098470b665cb0ed06efb187154b63649403b8d5e9aedeb482b4548c", size = 130742, upload-time = "2025-08-26T17:45:43.511Z" }, - { url = "https://files.pythonhosted.org/packages/62/e6/7a3b63b6677bce089fe939353cda24a7679825c43a24e49f757805fc0d8a/orjson-3.11.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae8b756575aaa2a855a75192f356bbda11a89169830e1439cfb1a3e1a6dde7be", size = 132377, upload-time = "2025-08-26T17:45:45.525Z" }, - { url = "https://files.pythonhosted.org/packages/fc/cd/ce2ab93e2e7eaf518f0fd15e3068b8c43216c8a44ed82ac2b79ce5cef72d/orjson-3.11.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9416cc19a349c167ef76135b2fe40d03cea93680428efee8771f3e9fb66079d", size = 135313, upload-time = "2025-08-26T17:45:46.821Z" }, - { url = "https://files.pythonhosted.org/packages/d0/b4/f98355eff0bd1a38454209bbc73372ce351ba29933cb3e2eba16c04b9448/orjson-3.11.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b822caf5b9752bc6f246eb08124c3d12bf2175b66ab74bac2ef3bbf9221ce1b2", size = 132908, upload-time = "2025-08-26T17:45:48.126Z" }, - { url = "https://files.pythonhosted.org/packages/eb/92/8f5182d7bc2a1bed46ed960b61a39af8389f0ad476120cd99e67182bfb6d/orjson-3.11.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:414f71e3bdd5573893bf5ecdf35c32b213ed20aa15536fe2f588f946c318824f", size = 130905, upload-time = "2025-08-26T17:45:49.414Z" }, - { url = "https://files.pythonhosted.org/packages/1a/60/c41ca753ce9ffe3d0f67b9b4c093bdd6e5fdb1bc53064f992f66bb99954d/orjson-3.11.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:828e3149ad8815dc14468f36ab2a4b819237c155ee1370341b91ea4c8672d2ee", size = 403812, upload-time = "2025-08-26T17:45:51.085Z" }, - { url = "https://files.pythonhosted.org/packages/dd/13/e4a4f16d71ce1868860db59092e78782c67082a8f1dc06a3788aef2b41bc/orjson-3.11.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ac9e05f25627ffc714c21f8dfe3a579445a5c392a9c8ae7ba1d0e9fb5333f56e", size = 146277, upload-time = "2025-08-26T17:45:52.851Z" }, - { url = "https://files.pythonhosted.org/packages/8d/8b/bafb7f0afef9344754a3a0597a12442f1b85a048b82108ef2c956f53babd/orjson-3.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e44fbe4000bd321d9f3b648ae46e0196d21577cf66ae684a96ff90b1f7c93633", size = 135418, upload-time = "2025-08-26T17:45:54.806Z" }, - { url = "https://files.pythonhosted.org/packages/60/d4/bae8e4f26afb2c23bea69d2f6d566132584d1c3a5fe89ee8c17b718cab67/orjson-3.11.3-cp313-cp313-win32.whl", hash = "sha256:2039b7847ba3eec1f5886e75e6763a16e18c68a63efc4b029ddf994821e2e66b", size = 136216, upload-time = "2025-08-26T17:45:57.182Z" }, - { url = "https://files.pythonhosted.org/packages/88/76/224985d9f127e121c8cad882cea55f0ebe39f97925de040b75ccd4b33999/orjson-3.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:29be5ac4164aa8bdcba5fa0700a3c9c316b411d8ed9d39ef8a882541bd452fae", size = 131362, upload-time = "2025-08-26T17:45:58.56Z" }, - { url = "https://files.pythonhosted.org/packages/e2/cf/0dce7a0be94bd36d1346be5067ed65ded6adb795fdbe3abd234c8d576d01/orjson-3.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:18bd1435cb1f2857ceb59cfb7de6f92593ef7b831ccd1b9bfb28ca530e539dce", size = 125989, upload-time = "2025-08-26T17:45:59.95Z" }, - { url = "https://files.pythonhosted.org/packages/ef/77/d3b1fef1fc6aaeed4cbf3be2b480114035f4df8fa1a99d2dac1d40d6e924/orjson-3.11.3-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cf4b81227ec86935568c7edd78352a92e97af8da7bd70bdfdaa0d2e0011a1ab4", size = 238115, upload-time = "2025-08-26T17:46:01.669Z" }, - { url = "https://files.pythonhosted.org/packages/e4/6d/468d21d49bb12f900052edcfbf52c292022d0a323d7828dc6376e6319703/orjson-3.11.3-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:bc8bc85b81b6ac9fc4dae393a8c159b817f4c2c9dee5d12b773bddb3b95fc07e", size = 127493, upload-time = "2025-08-26T17:46:03.466Z" }, - { url = "https://files.pythonhosted.org/packages/67/46/1e2588700d354aacdf9e12cc2d98131fb8ac6f31ca65997bef3863edb8ff/orjson-3.11.3-cp314-cp314-manylinux_2_34_aarch64.whl", hash = "sha256:88dcfc514cfd1b0de038443c7b3e6a9797ffb1b3674ef1fd14f701a13397f82d", size = 122998, upload-time = "2025-08-26T17:46:04.803Z" }, - { url = "https://files.pythonhosted.org/packages/3b/94/11137c9b6adb3779f1b34fd98be51608a14b430dbc02c6d41134fbba484c/orjson-3.11.3-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:d61cd543d69715d5fc0a690c7c6f8dcc307bc23abef9738957981885f5f38229", size = 132915, upload-time = "2025-08-26T17:46:06.237Z" }, - { url = "https://files.pythonhosted.org/packages/10/61/dccedcf9e9bcaac09fdabe9eaee0311ca92115699500efbd31950d878833/orjson-3.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2b7b153ed90ababadbef5c3eb39549f9476890d339cf47af563aea7e07db2451", size = 130907, upload-time = "2025-08-26T17:46:07.581Z" }, - { url = "https://files.pythonhosted.org/packages/0e/fd/0e935539aa7b08b3ca0f817d73034f7eb506792aae5ecc3b7c6e679cdf5f/orjson-3.11.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:7909ae2460f5f494fecbcd10613beafe40381fd0316e35d6acb5f3a05bfda167", size = 403852, upload-time = "2025-08-26T17:46:08.982Z" }, - { url = "https://files.pythonhosted.org/packages/4a/2b/50ae1a5505cd1043379132fdb2adb8a05f37b3e1ebffe94a5073321966fd/orjson-3.11.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:2030c01cbf77bc67bee7eef1e7e31ecf28649353987775e3583062c752da0077", size = 146309, upload-time = "2025-08-26T17:46:10.576Z" }, - { url = "https://files.pythonhosted.org/packages/cd/1d/a473c158e380ef6f32753b5f39a69028b25ec5be331c2049a2201bde2e19/orjson-3.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a0169ebd1cbd94b26c7a7ad282cf5c2744fce054133f959e02eb5265deae1872", size = 135424, upload-time = "2025-08-26T17:46:12.386Z" }, - { url = "https://files.pythonhosted.org/packages/da/09/17d9d2b60592890ff7382e591aa1d9afb202a266b180c3d4049b1ec70e4a/orjson-3.11.3-cp314-cp314-win32.whl", hash = "sha256:0c6d7328c200c349e3a4c6d8c83e0a5ad029bdc2d417f234152bf34842d0fc8d", size = 136266, upload-time = "2025-08-26T17:46:13.853Z" }, - { url = "https://files.pythonhosted.org/packages/15/58/358f6846410a6b4958b74734727e582ed971e13d335d6c7ce3e47730493e/orjson-3.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:317bbe2c069bbc757b1a2e4105b64aacd3bc78279b66a6b9e51e846e4809f804", size = 131351, upload-time = "2025-08-26T17:46:15.27Z" }, - { url = "https://files.pythonhosted.org/packages/28/01/d6b274a0635be0468d4dbd9cafe80c47105937a0d42434e805e67cd2ed8b/orjson-3.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:e8f6a7a27d7b7bec81bd5924163e9af03d49bbb63013f107b48eb5d16db711bc", size = 125985, upload-time = "2025-08-26T17:46:16.67Z" }, -] - [[package]] name = "packaging" version = "25.0" @@ -934,45 +974,63 @@ wheels = [ [[package]] name = "pandas" -version = "2.3.2" +version = "3.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, { name = "python-dateutil" }, - { name = "pytz" }, - { name = "tzdata" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/79/8e/0e90233ac205ad182bd6b422532695d2b9414944a280488105d598c70023/pandas-2.3.2.tar.gz", hash = "sha256:ab7b58f8f82706890924ccdfb5f48002b83d2b5a3845976a9fb705d36c34dcdb", size = 4488684, upload-time = "2025-08-21T10:28:29.257Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/db/614c20fb7a85a14828edd23f1c02db58a30abf3ce76f38806155d160313c/pandas-2.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fbb977f802156e7a3f829e9d1d5398f6192375a3e2d1a9ee0803e35fe70a2b9", size = 11587652, upload-time = "2025-08-21T10:27:15.888Z" }, - { url = "https://files.pythonhosted.org/packages/99/b0/756e52f6582cade5e746f19bad0517ff27ba9c73404607c0306585c201b3/pandas-2.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b9b52693123dd234b7c985c68b709b0b009f4521000d0525f2b95c22f15944b", size = 10717686, upload-time = "2025-08-21T10:27:18.486Z" }, - { url = "https://files.pythonhosted.org/packages/37/4c/dd5ccc1e357abfeee8353123282de17997f90ff67855f86154e5a13b81e5/pandas-2.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bd281310d4f412733f319a5bc552f86d62cddc5f51d2e392c8787335c994175", size = 11278722, upload-time = "2025-08-21T10:27:21.149Z" }, - { url = "https://files.pythonhosted.org/packages/d3/a4/f7edcfa47e0a88cda0be8b068a5bae710bf264f867edfdf7b71584ace362/pandas-2.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96d31a6b4354e3b9b8a2c848af75d31da390657e3ac6f30c05c82068b9ed79b9", size = 11987803, upload-time = "2025-08-21T10:27:23.767Z" }, - { url = "https://files.pythonhosted.org/packages/f6/61/1bce4129f93ab66f1c68b7ed1c12bac6a70b1b56c5dab359c6bbcd480b52/pandas-2.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:df4df0b9d02bb873a106971bb85d448378ef14b86ba96f035f50bbd3688456b4", size = 12766345, upload-time = "2025-08-21T10:27:26.6Z" }, - { url = "https://files.pythonhosted.org/packages/8e/46/80d53de70fee835531da3a1dae827a1e76e77a43ad22a8cd0f8142b61587/pandas-2.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:213a5adf93d020b74327cb2c1b842884dbdd37f895f42dcc2f09d451d949f811", size = 13439314, upload-time = "2025-08-21T10:27:29.213Z" }, - { url = "https://files.pythonhosted.org/packages/28/30/8114832daff7489f179971dbc1d854109b7f4365a546e3ea75b6516cea95/pandas-2.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c13b81a9347eb8c7548f53fd9a4f08d4dfe996836543f805c987bafa03317ae", size = 10983326, upload-time = "2025-08-21T10:27:31.901Z" }, - { url = "https://files.pythonhosted.org/packages/27/64/a2f7bf678af502e16b472527735d168b22b7824e45a4d7e96a4fbb634b59/pandas-2.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0c6ecbac99a354a051ef21c5307601093cb9e0f4b1855984a084bfec9302699e", size = 11531061, upload-time = "2025-08-21T10:27:34.647Z" }, - { url = "https://files.pythonhosted.org/packages/54/4c/c3d21b2b7769ef2f4c2b9299fcadd601efa6729f1357a8dbce8dd949ed70/pandas-2.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c6f048aa0fd080d6a06cc7e7537c09b53be6642d330ac6f54a600c3ace857ee9", size = 10668666, upload-time = "2025-08-21T10:27:37.203Z" }, - { url = "https://files.pythonhosted.org/packages/50/e2/f775ba76ecfb3424d7f5862620841cf0edb592e9abd2d2a5387d305fe7a8/pandas-2.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0064187b80a5be6f2f9c9d6bdde29372468751dfa89f4211a3c5871854cfbf7a", size = 11332835, upload-time = "2025-08-21T10:27:40.188Z" }, - { url = "https://files.pythonhosted.org/packages/8f/52/0634adaace9be2d8cac9ef78f05c47f3a675882e068438b9d7ec7ef0c13f/pandas-2.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac8c320bded4718b298281339c1a50fb00a6ba78cb2a63521c39bec95b0209b", size = 12057211, upload-time = "2025-08-21T10:27:43.117Z" }, - { url = "https://files.pythonhosted.org/packages/0b/9d/2df913f14b2deb9c748975fdb2491da1a78773debb25abbc7cbc67c6b549/pandas-2.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:114c2fe4f4328cf98ce5716d1532f3ab79c5919f95a9cfee81d9140064a2e4d6", size = 12749277, upload-time = "2025-08-21T10:27:45.474Z" }, - { url = "https://files.pythonhosted.org/packages/87/af/da1a2417026bd14d98c236dba88e39837182459d29dcfcea510b2ac9e8a1/pandas-2.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:48fa91c4dfb3b2b9bfdb5c24cd3567575f4e13f9636810462ffed8925352be5a", size = 13415256, upload-time = "2025-08-21T10:27:49.885Z" }, - { url = "https://files.pythonhosted.org/packages/22/3c/f2af1ce8840ef648584a6156489636b5692c162771918aa95707c165ad2b/pandas-2.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:12d039facec710f7ba305786837d0225a3444af7bbd9c15c32ca2d40d157ed8b", size = 10982579, upload-time = "2025-08-21T10:28:08.435Z" }, - { url = "https://files.pythonhosted.org/packages/f3/98/8df69c4097a6719e357dc249bf437b8efbde808038268e584421696cbddf/pandas-2.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c624b615ce97864eb588779ed4046186f967374185c047070545253a52ab2d57", size = 12028163, upload-time = "2025-08-21T10:27:52.232Z" }, - { url = "https://files.pythonhosted.org/packages/0e/23/f95cbcbea319f349e10ff90db488b905c6883f03cbabd34f6b03cbc3c044/pandas-2.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0cee69d583b9b128823d9514171cabb6861e09409af805b54459bd0c821a35c2", size = 11391860, upload-time = "2025-08-21T10:27:54.673Z" }, - { url = "https://files.pythonhosted.org/packages/ad/1b/6a984e98c4abee22058aa75bfb8eb90dce58cf8d7296f8bc56c14bc330b0/pandas-2.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2319656ed81124982900b4c37f0e0c58c015af9a7bbc62342ba5ad07ace82ba9", size = 11309830, upload-time = "2025-08-21T10:27:56.957Z" }, - { url = "https://files.pythonhosted.org/packages/15/d5/f0486090eb18dd8710bf60afeaf638ba6817047c0c8ae5c6a25598665609/pandas-2.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b37205ad6f00d52f16b6d09f406434ba928c1a1966e2771006a9033c736d30d2", size = 11883216, upload-time = "2025-08-21T10:27:59.302Z" }, - { url = "https://files.pythonhosted.org/packages/10/86/692050c119696da19e20245bbd650d8dfca6ceb577da027c3a73c62a047e/pandas-2.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:837248b4fc3a9b83b9c6214699a13f069dc13510a6a6d7f9ba33145d2841a012", size = 12699743, upload-time = "2025-08-21T10:28:02.447Z" }, - { url = "https://files.pythonhosted.org/packages/cd/d7/612123674d7b17cf345aad0a10289b2a384bff404e0463a83c4a3a59d205/pandas-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d2c3554bd31b731cd6490d94a28f3abb8dd770634a9e06eb6d2911b9827db370", size = 13186141, upload-time = "2025-08-21T10:28:05.377Z" }, + { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/87/4341c6252d1c47b08768c3d25ac487362bf403f0313ddae4a2a26c9b1b4c/pandas-3.0.3.tar.gz", hash = "sha256:696a4a00a2a2a35d4e5deb3fc946641b96c944f02230e4f76137fe35d806c4fc", size = 4651414, upload-time = "2026-05-11T18:54:29.21Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/f1/392f8c5bfc16f66a0d2d41561c01627c228fe7ed2a0d056ef11315042570/pandas-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fed2ff7fd9779120e388e285fc029bd5cf9490cdd2e4166a9ee22c0e49a9ab09", size = 10357846, upload-time = "2026-05-11T18:52:36.143Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3d/b16412745651e855f357e5e66930248688378853a6e2698a214e331fba1f/pandas-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b168fc218fd80a6cbdbdbc1a97ddc7889ed057d7eb45f50d866ceab5f39904c4", size = 9899550, upload-time = "2026-05-11T18:52:38.976Z" }, + { url = "https://files.pythonhosted.org/packages/31/a8/fa2535168fffcedf67f4f6de28d2dd903a747ca7c8ea6989451aaeb3a92f/pandas-3.0.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0383c72c75cdcca61a9e116e611143902dbfd08bff356829c2f6d1cf40a9ca8c", size = 10412965, upload-time = "2026-05-11T18:52:41.915Z" }, + { url = "https://files.pythonhosted.org/packages/65/b6/09b01cdbc15224e2850365192d17b7bdebb8bdbd8780ed221fcdf0d9a515/pandas-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6dc0b3fd2169c9157deed50b4d519553a3655c8c6a96027136d654592be973a9", size = 10894600, upload-time = "2026-05-11T18:52:45.02Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a4/2eb28f2fccb4ced4a2c79ab2a5dee9ade1ebf44922ebad6fea158c9f95d4/pandas-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e65d5407dc0b394f509699650e4a2ec01c0514f21850f453fa60f3be79a5dbf", size = 11422824, upload-time = "2026-05-11T18:52:48.058Z" }, + { url = "https://files.pythonhosted.org/packages/f8/45/830bb57f533a4604b355e07edcb8ea18cf88b5f94e5fca92f27052d7c597/pandas-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f8894dc474d648fe7b6ff0ca9b0bd73950d19952bc1a6534540762c5d79d305c", size = 11950889, upload-time = "2026-05-11T18:52:50.905Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c5/fc1b368f303087d20e8c9bf3d6ceb186263cfac0ade735cd938538bea839/pandas-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:c7be265b62cef88e253a941e4698604973736dcfe242fdb5198f0f7bc473cdcc", size = 9755463, upload-time = "2026-05-11T18:52:53.386Z" }, + { url = "https://files.pythonhosted.org/packages/86/bd/fda8f9705b1b09c6ebe14bfc0fa0e4ec8584d54ea673628f157ff55131af/pandas-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:557409bc4178e70ee8d9ddb494798e51ebf6ea59330f6be22c51bab2a7db6c49", size = 9066158, upload-time = "2026-05-11T18:52:56.038Z" }, + { url = "https://files.pythonhosted.org/packages/c5/90/62d8302883c44308c477e222c3daf7c813a34c8e96985882fbd53d964352/pandas-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:67b3b64c11910cfa29f4e94a14d3bff9ee693b6fc76055e7cad549cee0aec5fa", size = 10331071, upload-time = "2026-05-11T18:52:58.838Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ae/6a6493c783a101f165e4356953ba3c74d6f77f0042fa7d753da9dfbb640c/pandas-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39436b377d56d2a2e52d0395bdbee171f01068e99af5250509aceeb929f765c7", size = 9875690, upload-time = "2026-05-11T18:53:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/62/7c/5df8e9f56c69a2769fbe9382a5ef8f2658c007e376434e1e2cbb57ad895f/pandas-3.0.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4be06d68f9ddcfc645b87534911da79a8fbffc7573c80e0edcf42a5020624d8", size = 10381634, upload-time = "2026-05-11T18:53:04.393Z" }, + { url = "https://files.pythonhosted.org/packages/99/68/1237369725aa617bb358263d535803e3053fdbc593513ec5ed9c9896b5b6/pandas-3.0.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a4eeb6830daf35a71cc09649bd823e2b542dac246cdee9614c6e4bd65028cd6a", size = 10891243, upload-time = "2026-05-11T18:53:07.643Z" }, + { url = "https://files.pythonhosted.org/packages/25/93/77d108e8af7222b4a503ebde0e30215b1c2e4f8e53a526431890f22d5586/pandas-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1928e07221f82db493cd4af1e23c1bfca524a19a4699887975bff68f49a72bfb", size = 11388659, upload-time = "2026-05-11T18:53:10.634Z" }, + { url = "https://files.pythonhosted.org/packages/d0/bd/eff5b4399f332ac386c853f6cd2bd3fa2ca0061b9f36ecd9c4d7c4265649/pandas-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51b1fe551acb77dac643c6fda86084d8d446c10fe64b06a9cc29c4cc8540e7f2", size = 11942880, upload-time = "2026-05-11T18:53:13.536Z" }, + { url = "https://files.pythonhosted.org/packages/2c/20/559ace4200982c3887d0b86bfd0d856a2143ef8ddab63cc07934951a964c/pandas-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:a82d532a3351d435432cd913edbccaf8b8e01d4dd0e5ced5a8d2e8ecd94c7e44", size = 9757091, upload-time = "2026-05-11T18:53:16.306Z" }, + { url = "https://files.pythonhosted.org/packages/3a/66/69055a09fe200f29f922a3eeec4804611900b95f52d932ece3393c3c0c19/pandas-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:275c14e0fce14a2ec20eee474aecd305478ea3c1e6f6a9d8fe219a165542717e", size = 9057282, upload-time = "2026-05-11T18:53:18.768Z" }, + { url = "https://files.pythonhosted.org/packages/57/0e/efe801b0e6811e8e650cd21b7f2608e30f08a7067e2bf6e8752b0d56ee3c/pandas-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:46997386d528eb40376ecd6b033cf4a8a1e5282580f68f43de875b78cba2199d", size = 10767016, upload-time = "2026-05-11T18:53:21.227Z" }, + { url = "https://files.pythonhosted.org/packages/ea/dc/eb55135a1d5f0f0519f28da1f609a206d2cad1f9c35c32d51e38dd7261ae/pandas-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:261e308dfb22448384b7580cf719d2f998fe2966c92893c3e77d14008af1f066", size = 10420210, upload-time = "2026-05-11T18:53:23.982Z" }, + { url = "https://files.pythonhosted.org/packages/c6/3e/b1d5d955ce33ffecb407465a60bc32769d74fcf68224b7ae67ae11d4dea4/pandas-3.0.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dd1a5d1def6a46002e964510bdc67c368aa0951df5d1d9f8365336f5a1f490cd", size = 10336126, upload-time = "2026-05-11T18:53:26.731Z" }, + { url = "https://files.pythonhosted.org/packages/f5/76/a01261711ab60a22d71b862f0de20e4c504bf80457270ad8cb42110f6abc/pandas-3.0.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d72828c20c6d6e83e1e22a6a3b47b326b71664112fa9705dcbccfd7a39b62085", size = 10728051, upload-time = "2026-05-11T18:53:29.125Z" }, + { url = "https://files.pythonhosted.org/packages/e9/21/ea191195e587b18cf682e97f433f81b2d0fbe341380e80a3e0d6e4403c8e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d26cbe1fcfc12e8fd900e2454163e466b2d3af84f7c75481df7683ffc073d870", size = 11350796, upload-time = "2026-05-11T18:53:32.056Z" }, + { url = "https://files.pythonhosted.org/packages/64/69/f0eaaf54939f0e8c6768fd06be9af2cef9b36048b96dfb9e1b2c685a807e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e91cec1879ada0624fc3dc9953c5cbd60208e59c0db28f540c5d6d47502422f", size = 11799741, upload-time = "2026-05-11T18:53:34.985Z" }, + { url = "https://files.pythonhosted.org/packages/45/a4/865e0e510cae5fc2194de4db28be638952de942571ba9125934fd9c01d47/pandas-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:08d789b41f87e0905880e293cedf6197ce71fe67cc081358b1e148a491b9bd13", size = 10499958, upload-time = "2026-05-11T18:53:37.857Z" }, + { url = "https://files.pythonhosted.org/packages/86/54/effdcc3c0ff7a08037889200e148ebe94c16c4f653be078c7b3675955df1/pandas-3.0.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3650109c0f22879df8bd6179ab9ee3d7f1d1d4e7e0094a3f0032d9f51e2e64ac", size = 10336065, upload-time = "2026-05-11T18:53:41.099Z" }, + { url = "https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bab900348131a7db1f69a7309ef141fd5680f1487094193bcbbb61791573bf8f", size = 9926101, upload-time = "2026-05-11T18:53:43.515Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e9/e35cf11c8a136e757b956f5f0efdcaa50aecde85ea055f1898dfc68262f3/pandas-3.0.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba7e08b9ac1d54569cd1e256e3668975ed624d6826f7b68df0342b012007bddb", size = 10457553, upload-time = "2026-05-11T18:53:46.394Z" }, + { url = "https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d71c63ae4ebdbf70209742096f1fc46a83a0613c99d4b23766cced9ff8cd62a", size = 10914065, upload-time = "2026-05-11T18:53:49.134Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c2/1ef644445fcd72e3627bceec77e3560636f87ddce4ed841afe76b83b5bf9/pandas-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e3a2ec42c98ffa2565a67e08e218d06d72576d758d90facb7c00805194d8f360", size = 11459188, upload-time = "2026-05-11T18:53:52.527Z" }, + { url = "https://files.pythonhosted.org/packages/7e/49/4d8d4f42cbc9c4adc7a1870f269c02cbd6cd40d059622c06fb298addcbad/pandas-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:335f62418ed562cfc3c49e9e196375c28b729dcef8543abf4f9438e381bf3c76", size = 11982966, upload-time = "2026-05-11T18:53:55.043Z" }, + { url = "https://files.pythonhosted.org/packages/38/55/792619469bab9882d8bbd5865d45a72f6478762d04a9af4bf0d08c503e95/pandas-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:3c20a521bbb85902f79f7270c80a59e1b5452d96d170c034f207181870f97ac5", size = 9876755, upload-time = "2026-05-11T18:53:58.067Z" }, + { url = "https://files.pythonhosted.org/packages/2a/af/33c469653b0ba03b50c3a98192d4c07f0c75c66b263ceb097fce0ee97d31/pandas-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:a2d2dff8a04f3917b55ab3910c32990f8ddf7eceba114947838cefa976a68977", size = 9198658, upload-time = "2026-05-11T18:54:00.733Z" }, + { url = "https://files.pythonhosted.org/packages/a2/fa/b8c257bd76b8bd060c3a9151c1fca05e9b9c5e3af5d0f549c0356f6d143d/pandas-3.0.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:0d589105b3c14645af1738ff279b2995102d8f7a03b0a66dc8d95550eb513e04", size = 10787242, upload-time = "2026-05-11T18:54:03.564Z" }, + { url = "https://files.pythonhosted.org/packages/54/eb/f19206ffb0bf1919002969aa448b4702c6594845156a6f8050674855aac3/pandas-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:13fc1e853d9e04743d11ba75a985ccbc2a317fe07d8af61e445a6fd24dacd6a6", size = 10436369, upload-time = "2026-05-11T18:54:06.311Z" }, + { url = "https://files.pythonhosted.org/packages/fd/24/c7c39fb4fe22b71a0c2d78bf0c585c600092d85f94f086d2b3b2f6ca27e2/pandas-3.0.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:819959dab7bbd0049c15623fbac4e29a191b9528160a61fb1032242d8ced2d9c", size = 10358306, upload-time = "2026-05-11T18:54:09.085Z" }, + { url = "https://files.pythonhosted.org/packages/16/ec/dd2a9eb7fa1204df88c0864164e35b228ac581062ac612ba0a67fd812e4c/pandas-3.0.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:60ae316d3fd75d1858d450d0db0103ea2be3e7d4a95ec2f064f7e2ae63f7b028", size = 10758394, upload-time = "2026-05-11T18:54:11.956Z" }, + { url = "https://files.pythonhosted.org/packages/95/6e/00c61ea8e85b4f6d8d35e11852a1a4998fc7fafc91c6a602d1cc9c972d64/pandas-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd3a518890b400d32f9023722dc9a9a5c969f00b415419a3c06c043f09bb5d7d", size = 11375717, upload-time = "2026-05-11T18:54:14.539Z" }, + { url = "https://files.pythonhosted.org/packages/31/89/8fc1c268969fac43688d65fd92e67df24bd128d53cb4d2eee534cd307399/pandas-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9c39be2d709d01fa972a0cabc522389fceca4f3969332ba25a7d6c5802cf976a", size = 11828897, upload-time = "2026-05-11T18:54:17.146Z" }, + { url = "https://files.pythonhosted.org/packages/56/3b/e7d20dea247a3e6dc0bd8a6953854afbedc03951def4e7371e05e7263e25/pandas-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4db8c527972a821cf5286b40ccc57642a39bc62e62022b42f99f8a67fca8c3a1", size = 10900855, upload-time = "2026-05-11T18:54:19.72Z" }, + { url = "https://files.pythonhosted.org/packages/0f/54/68a0978d1ef8502b8492099beaa6e7a0c1b32e3b5d4f677f5810cb08711c/pandas-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b2c95f8bfc1ee412bf482605d7bfd30c12d1d26bd59fdd91efeef1d4718decb1", size = 9466464, upload-time = "2026-05-11T18:54:22.754Z" }, ] [[package]] name = "pathspec" -version = "0.12.1" +version = "1.0.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, + { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, ] [[package]] @@ -1008,7 +1066,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.11.7" +version = "2.13.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -1016,9 +1074,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload-time = "2025-06-14T08:33:17.137Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782, upload-time = "2025-06-14T08:33:14.905Z" }, + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, ] [package.optional-dependencies] @@ -1028,44 +1086,77 @@ email = [ [[package]] name = "pydantic-core" -version = "2.33.2" +version = "2.46.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" }, - { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" }, - { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" }, - { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload-time = "2025-04-23T18:31:31.025Z" }, - { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload-time = "2025-04-23T18:31:32.514Z" }, - { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload-time = "2025-04-23T18:31:33.958Z" }, - { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload-time = "2025-04-23T18:31:39.095Z" }, - { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload-time = "2025-04-23T18:31:41.034Z" }, - { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload-time = "2025-04-23T18:31:42.757Z" }, - { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload-time = "2025-04-23T18:31:44.304Z" }, - { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload-time = "2025-04-23T18:31:45.891Z" }, - { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload-time = "2025-04-23T18:31:47.819Z" }, - { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload-time = "2025-04-23T18:31:49.635Z" }, - { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload-time = "2025-04-23T18:31:51.609Z" }, - { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload-time = "2025-04-23T18:31:53.175Z" }, - { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload-time = "2025-04-23T18:31:54.79Z" }, - { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload-time = "2025-04-23T18:31:57.393Z" }, - { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload-time = "2025-04-23T18:31:59.065Z" }, - { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload-time = "2025-04-23T18:32:00.78Z" }, - { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload-time = "2025-04-23T18:32:02.418Z" }, - { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload-time = "2025-04-23T18:32:04.152Z" }, - { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload-time = "2025-04-23T18:32:06.129Z" }, - { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload-time = "2025-04-23T18:32:08.178Z" }, - { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload-time = "2025-04-23T18:32:10.242Z" }, - { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload-time = "2025-04-23T18:32:12.382Z" }, - { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload-time = "2025-04-23T18:32:14.034Z" }, - { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload-time = "2025-04-23T18:32:15.783Z" }, - { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload-time = "2025-04-23T18:32:18.473Z" }, - { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" }, - { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" }, - { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" }, + { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" }, + { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, + { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, + { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" }, + { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" }, + { url = "https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306, upload-time = "2026-05-06T13:37:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" }, + { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" }, + { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" }, + { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" }, + { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" }, + { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" }, + { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" }, + { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" }, + { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" }, + { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" }, + { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" }, + { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" }, + { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" }, + { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" }, + { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" }, + { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" }, + { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" }, + { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" }, + { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, ] [[package]] @@ -1097,11 +1188,11 @@ wheels = [ [[package]] name = "pygments" -version = "2.19.2" +version = "2.20.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, ] [[package]] @@ -1118,15 +1209,15 @@ wheels = [ [[package]] name = "pymdown-extensions" -version = "10.16.1" +version = "10.21.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/b3/6d2b3f149bc5413b0a29761c2c5832d8ce904a1d7f621e86616d96f505cc/pymdown_extensions-10.16.1.tar.gz", hash = "sha256:aace82bcccba3efc03e25d584e6a22d27a8e17caa3f4dd9f207e49b787aa9a91", size = 853277, upload-time = "2025-07-28T16:19:34.167Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/26/d1015444da4d952a1ca487a236b522eb979766f0295a0bd0c5fc089989a9/pymdown_extensions-10.21.3.tar.gz", hash = "sha256:72cfcf55f07aea0d4af2c4f11dd4e52466ddfb1bb819673146398e0bd3a77354", size = 854140, upload-time = "2026-05-13T12:57:32.267Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl", hash = "sha256:d6ba157a6c03146a7fb122b2b9a121300056384eafeec9c9f9e584adfdb2a32d", size = 266178, upload-time = "2025-07-28T16:19:31.401Z" }, + { url = "https://files.pythonhosted.org/packages/7e/85/545a951eecc270fcd688288c600017e2050a1aacb56c711d208586d3e470/pymdown_extensions-10.21.3-py3-none-any.whl", hash = "sha256:d7a5d08014fc571e80ca21dd6f854e31f94c489800350564d55d15b3c41e76b6", size = 269002, upload-time = "2026-05-13T12:57:30.296Z" }, ] [[package]] @@ -1140,7 +1231,7 @@ wheels = [ [[package]] name = "pytest" -version = "8.4.2" +version = "9.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -1149,9 +1240,9 @@ dependencies = [ { name = "pluggy" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, ] [[package]] @@ -1168,38 +1259,49 @@ wheels = [ [[package]] name = "python-dotenv" -version = "1.1.1" +version = "1.2.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978, upload-time = "2025-06-24T04:21:07.341Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" }, + { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, ] [[package]] name = "python-multipart" -version = "0.0.20" +version = "0.0.27" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158, upload-time = "2024-12-16T19:45:46.972Z" } +sdist = { url = "https://files.pythonhosted.org/packages/69/9b/f23807317a113dc36e74e75eb265a02dd1a4d9082abc3c1064acd22997c4/python_multipart-0.0.27.tar.gz", hash = "sha256:9870a6a8c5a20a5bf4f07c017bd1489006ff8836cff097b6933355ee2b49b602", size = 44043, upload-time = "2026-04-27T10:51:26.649Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" }, + { url = "https://files.pythonhosted.org/packages/99/78/4126abcbdbd3c559d43e0db7f7b9173fc6befe45d39a2856cc0b8ec2a5a6/python_multipart-0.0.27-py3-none-any.whl", hash = "sha256:6fccfad17a27334bd0193681b369f476eda3409f17381a2d65aa7df3f7275645", size = 29254, upload-time = "2026-04-27T10:51:24.997Z" }, ] [[package]] name = "pytokens" -version = "0.1.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/5f/e959a442435e24f6fb5a01aec6c657079ceaca1b3baf18561c3728d681da/pytokens-0.1.10.tar.gz", hash = "sha256:c9a4bfa0be1d26aebce03e6884ba454e842f186a59ea43a6d3b25af58223c044", size = 12171, upload-time = "2025-02-19T14:51:22.001Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/60/e5/63bed382f6a7a5ba70e7e132b8b7b8abbcf4888ffa6be4877698dcfbed7d/pytokens-0.1.10-py3-none-any.whl", hash = "sha256:db7b72284e480e69fb085d9f251f66b3d2df8b7166059261258ff35f50fb711b", size = 12046, upload-time = "2025-02-19T14:51:18.694Z" }, -] - -[[package]] -name = "pytz" -version = "2025.2" +version = "0.4.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/b6/34/b4e015b99031667a7b960f888889c5bd34ef585c85e1cb56a594b92836ac/pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a", size = 23015, upload-time = "2026-01-30T01:03:45.924Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/5d/e44573011401fb82e9d51e97f1290ceb377800fb4eed650b96f4753b499c/pytokens-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083", size = 160663, upload-time = "2026-01-30T01:03:06.473Z" }, + { url = "https://files.pythonhosted.org/packages/f0/e6/5bbc3019f8e6f21d09c41f8b8654536117e5e211a85d89212d59cbdab381/pytokens-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1", size = 255626, upload-time = "2026-01-30T01:03:08.177Z" }, + { url = "https://files.pythonhosted.org/packages/bf/3c/2d5297d82286f6f3d92770289fd439956b201c0a4fc7e72efb9b2293758e/pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1", size = 269779, upload-time = "2026-01-30T01:03:09.756Z" }, + { url = "https://files.pythonhosted.org/packages/20/01/7436e9ad693cebda0551203e0bf28f7669976c60ad07d6402098208476de/pytokens-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9", size = 268076, upload-time = "2026-01-30T01:03:10.957Z" }, + { url = "https://files.pythonhosted.org/packages/2e/df/533c82a3c752ba13ae7ef238b7f8cdd272cf1475f03c63ac6cf3fcfb00b6/pytokens-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68", size = 103552, upload-time = "2026-01-30T01:03:12.066Z" }, + { url = "https://files.pythonhosted.org/packages/cb/dc/08b1a080372afda3cceb4f3c0a7ba2bde9d6a5241f1edb02a22a019ee147/pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b", size = 160720, upload-time = "2026-01-30T01:03:13.843Z" }, + { url = "https://files.pythonhosted.org/packages/64/0c/41ea22205da480837a700e395507e6a24425151dfb7ead73343d6e2d7ffe/pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f", size = 254204, upload-time = "2026-01-30T01:03:14.886Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d2/afe5c7f8607018beb99971489dbb846508f1b8f351fcefc225fcf4b2adc0/pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1", size = 268423, upload-time = "2026-01-30T01:03:15.936Z" }, + { url = "https://files.pythonhosted.org/packages/68/d4/00ffdbd370410c04e9591da9220a68dc1693ef7499173eb3e30d06e05ed1/pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4", size = 266859, upload-time = "2026-01-30T01:03:17.458Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c9/c3161313b4ca0c601eeefabd3d3b576edaa9afdefd32da97210700e47652/pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78", size = 103520, upload-time = "2026-01-30T01:03:18.652Z" }, + { url = "https://files.pythonhosted.org/packages/8f/a7/b470f672e6fc5fee0a01d9e75005a0e617e162381974213a945fcd274843/pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321", size = 160821, upload-time = "2026-01-30T01:03:19.684Z" }, + { url = "https://files.pythonhosted.org/packages/80/98/e83a36fe8d170c911f864bfded690d2542bfcfacb9c649d11a9e6eb9dc41/pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa", size = 254263, upload-time = "2026-01-30T01:03:20.834Z" }, + { url = "https://files.pythonhosted.org/packages/0f/95/70d7041273890f9f97a24234c00b746e8da86df462620194cef1d411ddeb/pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d", size = 268071, upload-time = "2026-01-30T01:03:21.888Z" }, + { url = "https://files.pythonhosted.org/packages/da/79/76e6d09ae19c99404656d7db9c35dfd20f2086f3eb6ecb496b5b31163bad/pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324", size = 271716, upload-time = "2026-01-30T01:03:23.633Z" }, + { url = "https://files.pythonhosted.org/packages/79/37/482e55fa1602e0a7ff012661d8c946bafdc05e480ea5a32f4f7e336d4aa9/pytokens-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9", size = 104539, upload-time = "2026-01-30T01:03:24.788Z" }, + { url = "https://files.pythonhosted.org/packages/30/e8/20e7db907c23f3d63b0be3b8a4fd1927f6da2395f5bcc7f72242bb963dfe/pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb", size = 168474, upload-time = "2026-01-30T01:03:26.428Z" }, + { url = "https://files.pythonhosted.org/packages/d6/81/88a95ee9fafdd8f5f3452107748fd04c24930d500b9aba9738f3ade642cc/pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3", size = 290473, upload-time = "2026-01-30T01:03:27.415Z" }, + { url = "https://files.pythonhosted.org/packages/cf/35/3aa899645e29b6375b4aed9f8d21df219e7c958c4c186b465e42ee0a06bf/pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975", size = 303485, upload-time = "2026-01-30T01:03:28.558Z" }, + { url = "https://files.pythonhosted.org/packages/52/a0/07907b6ff512674d9b201859f7d212298c44933633c946703a20c25e9d81/pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a", size = 306698, upload-time = "2026-01-30T01:03:29.653Z" }, + { url = "https://files.pythonhosted.org/packages/39/2a/cbbf9250020a4a8dd53ba83a46c097b69e5eb49dd14e708f496f548c6612/pytokens-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918", size = 116287, upload-time = "2026-01-30T01:03:30.912Z" }, + { url = "https://files.pythonhosted.org/packages/c6/78/397db326746f0a342855b81216ae1f0a32965deccfd7c830a2dbc66d2483/pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de", size = 13729, upload-time = "2026-01-30T01:03:45.029Z" }, ] [[package]] @@ -1317,9 +1419,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" }, ] +[[package]] +name = "regex" +version = "2021.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/38/3f/4c42a98c9ad7d08c16e7d23b2194a0e4f3b2914662da8bc88986e4e6de1f/regex-2021.4.4.tar.gz", hash = "sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb", size = 693187, upload-time = "2021-04-04T16:50:49.77Z" } + [[package]] name = "requests" -version = "2.32.5" +version = "2.33.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -1327,9 +1435,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +sdist = { url = "https://files.pythonhosted.org/packages/34/64/8860370b167a9721e8956ae116825caff829224fbca0ca6e7bf8ddef8430/requests-2.33.0.tar.gz", hash = "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652", size = 134232, upload-time = "2026-03-25T15:10:41.586Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, + { url = "https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl", hash = "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b", size = 65017, upload-time = "2026-03-25T15:10:40.382Z" }, ] [[package]] @@ -1502,86 +1610,102 @@ wheels = [ [[package]] name = "scikit-learn" -version = "1.6.1" +version = "1.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "joblib" }, + { name = "narwhals" }, { name = "numpy" }, { name = "scipy" }, { name = "threadpoolctl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9e/a5/4ae3b3a0755f7b35a280ac90b28817d1f380318973cff14075ab41ef50d9/scikit_learn-1.6.1.tar.gz", hash = "sha256:b4fc2525eca2c69a59260f583c56a7557c6ccdf8deafdba6e060f94c1c59738e", size = 7068312, upload-time = "2025-01-10T08:07:55.348Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/18/c797c9b8c10380d05616db3bfb48e2a3358c767affd0857d56c2eb501caa/scikit_learn-1.6.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:926f207c804104677af4857b2c609940b743d04c4c35ce0ddc8ff4f053cddc1b", size = 12104516, upload-time = "2025-01-10T08:06:40.009Z" }, - { url = "https://files.pythonhosted.org/packages/c4/b7/2e35f8e289ab70108f8cbb2e7a2208f0575dc704749721286519dcf35f6f/scikit_learn-1.6.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c2cae262064e6a9b77eee1c8e768fc46aa0b8338c6a8297b9b6759720ec0ff2", size = 11167837, upload-time = "2025-01-10T08:06:43.305Z" }, - { url = "https://files.pythonhosted.org/packages/a4/f6/ff7beaeb644bcad72bcfd5a03ff36d32ee4e53a8b29a639f11bcb65d06cd/scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1061b7c028a8663fb9a1a1baf9317b64a257fcb036dae5c8752b2abef31d136f", size = 12253728, upload-time = "2025-01-10T08:06:47.618Z" }, - { url = "https://files.pythonhosted.org/packages/29/7a/8bce8968883e9465de20be15542f4c7e221952441727c4dad24d534c6d99/scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e69fab4ebfc9c9b580a7a80111b43d214ab06250f8a7ef590a4edf72464dd86", size = 13147700, upload-time = "2025-01-10T08:06:50.888Z" }, - { url = "https://files.pythonhosted.org/packages/62/27/585859e72e117fe861c2079bcba35591a84f801e21bc1ab85bce6ce60305/scikit_learn-1.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:70b1d7e85b1c96383f872a519b3375f92f14731e279a7b4c6cfd650cf5dffc52", size = 11110613, upload-time = "2025-01-10T08:06:54.115Z" }, - { url = "https://files.pythonhosted.org/packages/2e/59/8eb1872ca87009bdcdb7f3cdc679ad557b992c12f4b61f9250659e592c63/scikit_learn-1.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ffa1e9e25b3d93990e74a4be2c2fc61ee5af85811562f1288d5d055880c4322", size = 12010001, upload-time = "2025-01-10T08:06:58.613Z" }, - { url = "https://files.pythonhosted.org/packages/9d/05/f2fc4effc5b32e525408524c982c468c29d22f828834f0625c5ef3d601be/scikit_learn-1.6.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:dc5cf3d68c5a20ad6d571584c0750ec641cc46aeef1c1507be51300e6003a7e1", size = 11096360, upload-time = "2025-01-10T08:07:01.556Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e4/4195d52cf4f113573fb8ebc44ed5a81bd511a92c0228889125fac2f4c3d1/scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c06beb2e839ecc641366000ca84f3cf6fa9faa1777e29cf0c04be6e4d096a348", size = 12209004, upload-time = "2025-01-10T08:07:06.931Z" }, - { url = "https://files.pythonhosted.org/packages/94/be/47e16cdd1e7fcf97d95b3cb08bde1abb13e627861af427a3651fcb80b517/scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8ca8cb270fee8f1f76fa9bfd5c3507d60c6438bbee5687f81042e2bb98e5a97", size = 13171776, upload-time = "2025-01-10T08:07:11.715Z" }, - { url = "https://files.pythonhosted.org/packages/34/b0/ca92b90859070a1487827dbc672f998da95ce83edce1270fc23f96f1f61a/scikit_learn-1.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:7a1c43c8ec9fde528d664d947dc4c0789be4077a3647f232869f41d9bf50e0fb", size = 11071865, upload-time = "2025-01-10T08:07:16.088Z" }, - { url = "https://files.pythonhosted.org/packages/12/ae/993b0fb24a356e71e9a894e42b8a9eec528d4c70217353a1cd7a48bc25d4/scikit_learn-1.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a17c1dea1d56dcda2fac315712f3651a1fea86565b64b48fa1bc090249cbf236", size = 11955804, upload-time = "2025-01-10T08:07:20.385Z" }, - { url = "https://files.pythonhosted.org/packages/d6/54/32fa2ee591af44507eac86406fa6bba968d1eb22831494470d0a2e4a1eb1/scikit_learn-1.6.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6a7aa5f9908f0f28f4edaa6963c0a6183f1911e63a69aa03782f0d924c830a35", size = 11100530, upload-time = "2025-01-10T08:07:23.675Z" }, - { url = "https://files.pythonhosted.org/packages/3f/58/55856da1adec655bdce77b502e94a267bf40a8c0b89f8622837f89503b5a/scikit_learn-1.6.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0650e730afb87402baa88afbf31c07b84c98272622aaba002559b614600ca691", size = 12433852, upload-time = "2025-01-10T08:07:26.817Z" }, - { url = "https://files.pythonhosted.org/packages/ff/4f/c83853af13901a574f8f13b645467285a48940f185b690936bb700a50863/scikit_learn-1.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:3f59fe08dc03ea158605170eb52b22a105f238a5d512c4470ddeca71feae8e5f", size = 11337256, upload-time = "2025-01-10T08:07:31.084Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/fa/6f/37092bdb25f712817231799fc5674d8e704066a8a70c1d2d40517e18b4ab/scikit_learn-1.9.0.tar.gz", hash = "sha256:8833266989d3a5110178a9fae30783675460724d0e1efb13b14901d2c660c557", size = 7750767, upload-time = "2026-06-02T11:54:32.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/20/75f915ff375d6249e6550ac740fdbbd66159a068fd3af1400ff62036b07a/scikit_learn-1.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2bd41b0d201bc81575531b96b713d3eb5e5f50fb0b82101ff0f92294fdc236ac", size = 8741122, upload-time = "2026-06-02T11:53:24.08Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d5/2b5148f2279196775e1db2aeb85d14b70ac80e7e32b3b28e7ebeafb0901d/scikit_learn-1.9.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5be45aa4a42a68a533913a6ed736cf309de2226411c79ef8d609a5456f1939b1", size = 8261512, upload-time = "2026-06-02T11:53:27.183Z" }, + { url = "https://files.pythonhosted.org/packages/a0/ee/5adbc77656b71f9456a2f5a7a9fdb4bcf9207a6b962889f1c2f9323afa4e/scikit_learn-1.9.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e50ed4da51974e86e940690e9a3d82e729b62b5a49f7c9bac534d515d39d86f", size = 8837603, upload-time = "2026-06-02T11:53:30.328Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c2/63fdda36c56437eeb44aaf9493c8bcd62ce230ab1598924fc626ffbfa943/scikit_learn-1.9.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:056c92bb67ad4c28463c2f2653d9701449201e7e7a9e94e321be0f71c4fef2b8", size = 9132097, upload-time = "2026-06-02T11:53:33.456Z" }, + { url = "https://files.pythonhosted.org/packages/83/a4/c8e67227c680e2259c8864ae72ff48b06e16a6f51253a22167aa02a8aa4e/scikit_learn-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:4306775fad04cc4b472a1b15af1ae9cede1540fbfcc17fbce3767cd8dc7ae283", size = 8211173, upload-time = "2026-06-02T11:53:36.602Z" }, + { url = "https://files.pythonhosted.org/packages/cf/fd/3c0863792e98e67e9184aa4029288a175935eb65443afcd30d4f143450cf/scikit_learn-1.9.0-cp312-cp312-win_arm64.whl", hash = "sha256:26e22435f63bcdcf396b574273f29f13dd531f5ea035801f5be10ba1540a4e60", size = 7867451, upload-time = "2026-06-02T11:53:39.075Z" }, + { url = "https://files.pythonhosted.org/packages/3c/01/cf3310626b6d48d3e9be69a1223f9180360b5e6edb045f50fade723ce494/scikit_learn-1.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:80746d63bd4b6eaca54d36fe5feaf4d28bb38dc6f9470f81c7cad7c40155f119", size = 8705188, upload-time = "2026-06-02T11:53:41.964Z" }, + { url = "https://files.pythonhosted.org/packages/3e/04/5acd7ae280c5f93b6ac5ef6cdec14eef4c8d1cd91d85b3292989c94d96b1/scikit_learn-1.9.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5b934c45c252844a91d69fda3a34cff5e7307e1db10d77cb10a3980312c74713", size = 8228299, upload-time = "2026-06-02T11:53:44.817Z" }, + { url = "https://files.pythonhosted.org/packages/0c/39/ffe829a5b8ecb40a518724a997794657fdc354ada5e8fe8e64d998c0bac9/scikit_learn-1.9.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:38c3dcb9a1ffb85505ec53d54c7b4aea0cff70050425a7760c2af661ac85df05", size = 8789690, upload-time = "2026-06-02T11:53:47.461Z" }, + { url = "https://files.pythonhosted.org/packages/1f/88/8dab5de10c638c083772a6be83a3d8106ced492f74a928c8693638e5bb50/scikit_learn-1.9.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da76d09304a4706db7cc1e3ebaa3b6b98a67365cc11d2996c4f1e58ba47df714", size = 9087723, upload-time = "2026-06-02T11:53:50.702Z" }, + { url = "https://files.pythonhosted.org/packages/20/3f/7917ca72464038f6240ec70c29f94862d08a34a74291ae4d4ec5eb8186a0/scikit_learn-1.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:5808d98f15c6bf6d9d96d2348c1997392a5888ce7097e664105f930c4bca1277", size = 8184330, upload-time = "2026-06-02T11:53:53.396Z" }, + { url = "https://files.pythonhosted.org/packages/78/c7/15739eb2f61fda3c54639e9942414e5a19ad8a8d1f5a3266afad7cb7df80/scikit_learn-1.9.0-cp313-cp313-win_arm64.whl", hash = "sha256:d77f54c017633791bc0225a43e2f8d03745fdcfe4880268fcc4df15f505dec2e", size = 7840653, upload-time = "2026-06-02T11:53:56.035Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7d/c9a35cf59b20a86fec24d306f1547b78dec194b08d367ce2a3e4854169d9/scikit_learn-1.9.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9656acd4e93f74e0b66c8a36c88830a99252dfa900044d36bc2212ae89a47162", size = 8713289, upload-time = "2026-06-02T11:53:58.788Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a7/552a7821597c632b907f7bfe8f36f9f572777af8ef8a48353041cf8e091a/scikit_learn-1.9.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:24360002ae845e7866522b0a5bbf690802e7bc388cac8663502e78aa98598aa2", size = 8245141, upload-time = "2026-06-02T11:54:01.694Z" }, + { url = "https://files.pythonhosted.org/packages/7d/79/f4a0c4fe9711154cddabf913471153af79056382ddc612cfe5ee0ff4b72e/scikit_learn-1.9.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5162ad10a418c8a282dde04c9aa06965de3e9a65f33c1440c0ae69bb1a09d913", size = 8847671, upload-time = "2026-06-02T11:54:04.448Z" }, + { url = "https://files.pythonhosted.org/packages/f0/af/4d72d9e475ac83719160c662619e4bf7b95c19507cd582e7d0167a3c3dae/scikit_learn-1.9.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fea2cc5677ab49d6f5bade978c866da44957b712d92e9635e8b4f723013c3cb", size = 9118104, upload-time = "2026-06-02T11:54:07.205Z" }, + { url = "https://files.pythonhosted.org/packages/a2/d5/6a58eea2cb9abbb9b3f2bb8b2cfb3243d1152d69f442d256c7af71304769/scikit_learn-1.9.0-cp314-cp314-win_amd64.whl", hash = "sha256:64fa347efc1c839c487433e40c5144d38c336e8a2b59c81aa8660373945c2673", size = 8290674, upload-time = "2026-06-02T11:54:10.087Z" }, + { url = "https://files.pythonhosted.org/packages/65/5b/d4c879cf358f1187141cf90ced473f087183489090244f50c124a2ee478b/scikit_learn-1.9.0-cp314-cp314-win_arm64.whl", hash = "sha256:1b944b6db288f6b926e3650026ddafb988929de95d11fc2cc5fa117773c9ba42", size = 7978807, upload-time = "2026-06-02T11:54:12.769Z" }, + { url = "https://files.pythonhosted.org/packages/8a/43/bfae3121ec67ae09150d453c442c7c1cc166e9aefe056e6ab3b7728a5cfc/scikit_learn-1.9.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:4ccacf04ca5f4b492158a5f28afe0ace43f81b2571e4b9a66d34848b46128949", size = 9031941, upload-time = "2026-06-02T11:54:15.436Z" }, + { url = "https://files.pythonhosted.org/packages/75/b0/20a4546eb17f3b25d3c66df15810411c14ed5065bcfab50b53c96fb627b2/scikit_learn-1.9.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:ee1a8db2c18c08e34c7412d4b10be1cac214cd4ea7dc9715a6a327eb49a37c96", size = 8613528, upload-time = "2026-06-02T11:54:18.842Z" }, + { url = "https://files.pythonhosted.org/packages/18/3c/e440e039bb82cd19004edaaad00acbde0fb9b461083c3ecf37941c557312/scikit_learn-1.9.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:147e9329ef0e39f75d4cffa02b2aa48d827832684926cd5210d9a2cb5c57246b", size = 8855050, upload-time = "2026-06-02T11:54:21.699Z" }, + { url = "https://files.pythonhosted.org/packages/43/26/b341b8dab5998da6270a3a42c2152c578501354d36f944b5856757035ef8/scikit_learn-1.9.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bad8f8b9950321b54c965fdcbac6c6c55e79e16646b49977bcf3668d3870a1a", size = 9097190, upload-time = "2026-06-02T11:54:24.454Z" }, + { url = "https://files.pythonhosted.org/packages/fb/de/b650b4d69b84468cfa2e28a3ff7b8103743029e6446ce1a97fe060ef688c/scikit_learn-1.9.0-cp314-cp314t-win_amd64.whl", hash = "sha256:78fc56eafd4edb9575d2d8950d1dd152061abb573341a1cb7e099fc40f6c6666", size = 8963204, upload-time = "2026-06-02T11:54:27.428Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f3/ff83d76d7418112e5a61326443cdda87be3545dd8d6599c95b2481a4419e/scikit_learn-1.9.0-cp314-cp314t-win_arm64.whl", hash = "sha256:051075bda8b7aab87b1906ab3d4740a1e1224a19d7b3781a576736edc94e76aa", size = 8222661, upload-time = "2026-06-02T11:54:30.192Z" }, ] [[package]] name = "scipy" -version = "1.16.1" +version = "1.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f5/4a/b927028464795439faec8eaf0b03b011005c487bb2d07409f28bf30879c4/scipy-1.16.1.tar.gz", hash = "sha256:44c76f9e8b6e8e488a586190ab38016e4ed2f8a038af7cd3defa903c0a2238b3", size = 30580861, upload-time = "2025-07-27T16:33:30.834Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/d9/ec4864f5896232133f51382b54a08de91a9d1af7a76dfa372894026dfee2/scipy-1.16.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81b433bbeaf35728dad619afc002db9b189e45eebe2cd676effe1fb93fef2b9c", size = 36575194, upload-time = "2025-07-27T16:27:41.321Z" }, - { url = "https://files.pythonhosted.org/packages/5c/6d/40e81ecfb688e9d25d34a847dca361982a6addf8e31f0957b1a54fbfa994/scipy-1.16.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:886cc81fdb4c6903a3bb0464047c25a6d1016fef77bb97949817d0c0d79f9e04", size = 28594590, upload-time = "2025-07-27T16:27:49.204Z" }, - { url = "https://files.pythonhosted.org/packages/0e/37/9f65178edfcc629377ce9a64fc09baebea18c80a9e57ae09a52edf84880b/scipy-1.16.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:15240c3aac087a522b4eaedb09f0ad061753c5eebf1ea430859e5bf8640d5919", size = 20866458, upload-time = "2025-07-27T16:27:54.98Z" }, - { url = "https://files.pythonhosted.org/packages/2c/7b/749a66766871ea4cb1d1ea10f27004db63023074c22abed51f22f09770e0/scipy-1.16.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:65f81a25805f3659b48126b5053d9e823d3215e4a63730b5e1671852a1705921", size = 23539318, upload-time = "2025-07-27T16:28:01.604Z" }, - { url = "https://files.pythonhosted.org/packages/c4/db/8d4afec60eb833a666434d4541a3151eedbf2494ea6d4d468cbe877f00cd/scipy-1.16.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6c62eea7f607f122069b9bad3f99489ddca1a5173bef8a0c75555d7488b6f725", size = 33292899, upload-time = "2025-07-27T16:28:09.147Z" }, - { url = "https://files.pythonhosted.org/packages/51/1e/79023ca3bbb13a015d7d2757ecca3b81293c663694c35d6541b4dca53e98/scipy-1.16.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f965bbf3235b01c776115ab18f092a95aa74c271a52577bcb0563e85738fd618", size = 35162637, upload-time = "2025-07-27T16:28:17.535Z" }, - { url = "https://files.pythonhosted.org/packages/b6/49/0648665f9c29fdaca4c679182eb972935b3b4f5ace41d323c32352f29816/scipy-1.16.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f006e323874ffd0b0b816d8c6a8e7f9a73d55ab3b8c3f72b752b226d0e3ac83d", size = 35490507, upload-time = "2025-07-27T16:28:25.705Z" }, - { url = "https://files.pythonhosted.org/packages/62/8f/66cbb9d6bbb18d8c658f774904f42a92078707a7c71e5347e8bf2f52bb89/scipy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8fd15fc5085ab4cca74cb91fe0a4263b1f32e4420761ddae531ad60934c2119", size = 37923998, upload-time = "2025-07-27T16:28:34.339Z" }, - { url = "https://files.pythonhosted.org/packages/14/c3/61f273ae550fbf1667675701112e380881905e28448c080b23b5a181df7c/scipy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:f7b8013c6c066609577d910d1a2a077021727af07b6fab0ee22c2f901f22352a", size = 38508060, upload-time = "2025-07-27T16:28:43.242Z" }, - { url = "https://files.pythonhosted.org/packages/93/0b/b5c99382b839854a71ca9482c684e3472badc62620287cbbdab499b75ce6/scipy-1.16.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5451606823a5e73dfa621a89948096c6528e2896e40b39248295d3a0138d594f", size = 36533717, upload-time = "2025-07-27T16:28:51.706Z" }, - { url = "https://files.pythonhosted.org/packages/eb/e5/69ab2771062c91e23e07c12e7d5033a6b9b80b0903ee709c3c36b3eb520c/scipy-1.16.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:89728678c5ca5abd610aee148c199ac1afb16e19844401ca97d43dc548a354eb", size = 28570009, upload-time = "2025-07-27T16:28:57.017Z" }, - { url = "https://files.pythonhosted.org/packages/f4/69/bd75dbfdd3cf524f4d753484d723594aed62cfaac510123e91a6686d520b/scipy-1.16.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e756d688cb03fd07de0fffad475649b03cb89bee696c98ce508b17c11a03f95c", size = 20841942, upload-time = "2025-07-27T16:29:01.152Z" }, - { url = "https://files.pythonhosted.org/packages/ea/74/add181c87663f178ba7d6144b370243a87af8476664d5435e57d599e6874/scipy-1.16.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5aa2687b9935da3ed89c5dbed5234576589dd28d0bf7cd237501ccfbdf1ad608", size = 23498507, upload-time = "2025-07-27T16:29:05.202Z" }, - { url = "https://files.pythonhosted.org/packages/1d/74/ece2e582a0d9550cee33e2e416cc96737dce423a994d12bbe59716f47ff1/scipy-1.16.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0851f6a1e537fe9399f35986897e395a1aa61c574b178c0d456be5b1a0f5ca1f", size = 33286040, upload-time = "2025-07-27T16:29:10.201Z" }, - { url = "https://files.pythonhosted.org/packages/e4/82/08e4076df538fb56caa1d489588d880ec7c52d8273a606bb54d660528f7c/scipy-1.16.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fedc2cbd1baed37474b1924c331b97bdff611d762c196fac1a9b71e67b813b1b", size = 35176096, upload-time = "2025-07-27T16:29:17.091Z" }, - { url = "https://files.pythonhosted.org/packages/fa/79/cd710aab8c921375711a8321c6be696e705a120e3011a643efbbcdeeabcc/scipy-1.16.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2ef500e72f9623a6735769e4b93e9dcb158d40752cdbb077f305487e3e2d1f45", size = 35490328, upload-time = "2025-07-27T16:29:22.928Z" }, - { url = "https://files.pythonhosted.org/packages/71/73/e9cc3d35ee4526d784520d4494a3e1ca969b071fb5ae5910c036a375ceec/scipy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:978d8311674b05a8f7ff2ea6c6bce5d8b45a0cb09d4c5793e0318f448613ea65", size = 37939921, upload-time = "2025-07-27T16:29:29.108Z" }, - { url = "https://files.pythonhosted.org/packages/21/12/c0efd2941f01940119b5305c375ae5c0fcb7ec193f806bd8f158b73a1782/scipy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:81929ed0fa7a5713fcdd8b2e6f73697d3b4c4816d090dd34ff937c20fa90e8ab", size = 38479462, upload-time = "2025-07-27T16:30:24.078Z" }, - { url = "https://files.pythonhosted.org/packages/7a/19/c3d08b675260046a991040e1ea5d65f91f40c7df1045fffff412dcfc6765/scipy-1.16.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:bcc12db731858abda693cecdb3bdc9e6d4bd200213f49d224fe22df82687bdd6", size = 36938832, upload-time = "2025-07-27T16:29:35.057Z" }, - { url = "https://files.pythonhosted.org/packages/81/f2/ce53db652c033a414a5b34598dba6b95f3d38153a2417c5a3883da429029/scipy-1.16.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:744d977daa4becb9fc59135e75c069f8d301a87d64f88f1e602a9ecf51e77b27", size = 29093084, upload-time = "2025-07-27T16:29:40.201Z" }, - { url = "https://files.pythonhosted.org/packages/a9/ae/7a10ff04a7dc15f9057d05b33737ade244e4bd195caa3f7cc04d77b9e214/scipy-1.16.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:dc54f76ac18073bcecffb98d93f03ed6b81a92ef91b5d3b135dcc81d55a724c7", size = 21365098, upload-time = "2025-07-27T16:29:44.295Z" }, - { url = "https://files.pythonhosted.org/packages/36/ac/029ff710959932ad3c2a98721b20b405f05f752f07344622fd61a47c5197/scipy-1.16.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:367d567ee9fc1e9e2047d31f39d9d6a7a04e0710c86e701e053f237d14a9b4f6", size = 23896858, upload-time = "2025-07-27T16:29:48.784Z" }, - { url = "https://files.pythonhosted.org/packages/71/13/d1ef77b6bd7898720e1f0b6b3743cb945f6c3cafa7718eaac8841035ab60/scipy-1.16.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4cf5785e44e19dcd32a0e4807555e1e9a9b8d475c6afff3d21c3c543a6aa84f4", size = 33438311, upload-time = "2025-07-27T16:29:54.164Z" }, - { url = "https://files.pythonhosted.org/packages/2d/e0/e64a6821ffbb00b4c5b05169f1c1fddb4800e9307efe3db3788995a82a2c/scipy-1.16.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3d0b80fb26d3e13a794c71d4b837e2a589d839fd574a6bbb4ee1288c213ad4a3", size = 35279542, upload-time = "2025-07-27T16:30:00.249Z" }, - { url = "https://files.pythonhosted.org/packages/57/59/0dc3c8b43e118f1e4ee2b798dcc96ac21bb20014e5f1f7a8e85cc0653bdb/scipy-1.16.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8503517c44c18d1030d666cb70aaac1cc8913608816e06742498833b128488b7", size = 35667665, upload-time = "2025-07-27T16:30:05.916Z" }, - { url = "https://files.pythonhosted.org/packages/45/5f/844ee26e34e2f3f9f8febb9343748e72daeaec64fe0c70e9bf1ff84ec955/scipy-1.16.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:30cc4bb81c41831ecfd6dc450baf48ffd80ef5aed0f5cf3ea775740e80f16ecc", size = 38045210, upload-time = "2025-07-27T16:30:11.655Z" }, - { url = "https://files.pythonhosted.org/packages/8d/d7/210f2b45290f444f1de64bc7353aa598ece9f0e90c384b4a156f9b1a5063/scipy-1.16.1-cp313-cp313t-win_amd64.whl", hash = "sha256:c24fa02f7ed23ae514460a22c57eca8f530dbfa50b1cfdbf4f37c05b5309cc39", size = 38593661, upload-time = "2025-07-27T16:30:17.825Z" }, - { url = "https://files.pythonhosted.org/packages/81/ea/84d481a5237ed223bd3d32d6e82d7a6a96e34756492666c260cef16011d1/scipy-1.16.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:796a5a9ad36fa3a782375db8f4241ab02a091308eb079746bc0f874c9b998318", size = 36525921, upload-time = "2025-07-27T16:30:30.081Z" }, - { url = "https://files.pythonhosted.org/packages/4e/9f/d9edbdeff9f3a664807ae3aea383e10afaa247e8e6255e6d2aa4515e8863/scipy-1.16.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:3ea0733a2ff73fd6fdc5fecca54ee9b459f4d74f00b99aced7d9a3adb43fb1cc", size = 28564152, upload-time = "2025-07-27T16:30:35.336Z" }, - { url = "https://files.pythonhosted.org/packages/3b/95/8125bcb1fe04bc267d103e76516243e8d5e11229e6b306bda1024a5423d1/scipy-1.16.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:85764fb15a2ad994e708258bb4ed8290d1305c62a4e1ef07c414356a24fcfbf8", size = 20836028, upload-time = "2025-07-27T16:30:39.421Z" }, - { url = "https://files.pythonhosted.org/packages/77/9c/bf92e215701fc70bbcd3d14d86337cf56a9b912a804b9c776a269524a9e9/scipy-1.16.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:ca66d980469cb623b1759bdd6e9fd97d4e33a9fad5b33771ced24d0cb24df67e", size = 23489666, upload-time = "2025-07-27T16:30:43.663Z" }, - { url = "https://files.pythonhosted.org/packages/5e/00/5e941d397d9adac41b02839011594620d54d99488d1be5be755c00cde9ee/scipy-1.16.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e7cc1ffcc230f568549fc56670bcf3df1884c30bd652c5da8138199c8c76dae0", size = 33358318, upload-time = "2025-07-27T16:30:48.982Z" }, - { url = "https://files.pythonhosted.org/packages/0e/87/8db3aa10dde6e3e8e7eb0133f24baa011377d543f5b19c71469cf2648026/scipy-1.16.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ddfb1e8d0b540cb4ee9c53fc3dea3186f97711248fb94b4142a1b27178d8b4b", size = 35185724, upload-time = "2025-07-27T16:30:54.26Z" }, - { url = "https://files.pythonhosted.org/packages/89/b4/6ab9ae443216807622bcff02690262d8184078ea467efee2f8c93288a3b1/scipy-1.16.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4dc0e7be79e95d8ba3435d193e0d8ce372f47f774cffd882f88ea4e1e1ddc731", size = 35554335, upload-time = "2025-07-27T16:30:59.765Z" }, - { url = "https://files.pythonhosted.org/packages/9c/9a/d0e9dc03c5269a1afb60661118296a32ed5d2c24298af61b676c11e05e56/scipy-1.16.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f23634f9e5adb51b2a77766dac217063e764337fbc816aa8ad9aaebcd4397fd3", size = 37960310, upload-time = "2025-07-27T16:31:06.151Z" }, - { url = "https://files.pythonhosted.org/packages/5e/00/c8f3130a50521a7977874817ca89e0599b1b4ee8e938bad8ae798a0e1f0d/scipy-1.16.1-cp314-cp314-win_amd64.whl", hash = "sha256:57d75524cb1c5a374958a2eae3d84e1929bb971204cc9d52213fb8589183fc19", size = 39319239, upload-time = "2025-07-27T16:31:59.942Z" }, - { url = "https://files.pythonhosted.org/packages/f2/f2/1ca3eda54c3a7e4c92f6acef7db7b3a057deb135540d23aa6343ef8ad333/scipy-1.16.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:d8da7c3dd67bcd93f15618938f43ed0995982eb38973023d46d4646c4283ad65", size = 36939460, upload-time = "2025-07-27T16:31:11.865Z" }, - { url = "https://files.pythonhosted.org/packages/80/30/98c2840b293a132400c0940bb9e140171dcb8189588619048f42b2ce7b4f/scipy-1.16.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:cc1d2f2fd48ba1e0620554fe5bc44d3e8f5d4185c8c109c7fbdf5af2792cfad2", size = 29093322, upload-time = "2025-07-27T16:31:17.045Z" }, - { url = "https://files.pythonhosted.org/packages/c1/e6/1e6e006e850622cf2a039b62d1a6ddc4497d4851e58b68008526f04a9a00/scipy-1.16.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:21a611ced9275cb861bacadbada0b8c0623bc00b05b09eb97f23b370fc2ae56d", size = 21365329, upload-time = "2025-07-27T16:31:21.188Z" }, - { url = "https://files.pythonhosted.org/packages/8e/02/72a5aa5b820589dda9a25e329ca752842bfbbaf635e36bc7065a9b42216e/scipy-1.16.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8dfbb25dffc4c3dd9371d8ab456ca81beeaf6f9e1c2119f179392f0dc1ab7695", size = 23897544, upload-time = "2025-07-27T16:31:25.408Z" }, - { url = "https://files.pythonhosted.org/packages/2b/dc/7122d806a6f9eb8a33532982234bed91f90272e990f414f2830cfe656e0b/scipy-1.16.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f0ebb7204f063fad87fc0a0e4ff4a2ff40b2a226e4ba1b7e34bf4b79bf97cd86", size = 33442112, upload-time = "2025-07-27T16:31:30.62Z" }, - { url = "https://files.pythonhosted.org/packages/24/39/e383af23564daa1021a5b3afbe0d8d6a68ec639b943661841f44ac92de85/scipy-1.16.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f1b9e5962656f2734c2b285a8745358ecb4e4efbadd00208c80a389227ec61ff", size = 35286594, upload-time = "2025-07-27T16:31:36.112Z" }, - { url = "https://files.pythonhosted.org/packages/95/47/1a0b0aff40c3056d955f38b0df5d178350c3d74734ec54f9c68d23910be5/scipy-1.16.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e1a106f8c023d57a2a903e771228bf5c5b27b5d692088f457acacd3b54511e4", size = 35665080, upload-time = "2025-07-27T16:31:42.025Z" }, - { url = "https://files.pythonhosted.org/packages/64/df/ce88803e9ed6e27fe9b9abefa157cf2c80e4fa527cf17ee14be41f790ad4/scipy-1.16.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:709559a1db68a9abc3b2c8672c4badf1614f3b440b3ab326d86a5c0491eafae3", size = 38050306, upload-time = "2025-07-27T16:31:48.109Z" }, - { url = "https://files.pythonhosted.org/packages/6e/6c/a76329897a7cae4937d403e623aa6aaea616a0bb5b36588f0b9d1c9a3739/scipy-1.16.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c0c804d60492a0aad7f5b2bb1862f4548b990049e27e828391ff2bf6f7199998", size = 39427705, upload-time = "2025-07-27T16:31:53.96Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/48/b992b488d6f299dbe3f11a20b24d3dda3d46f1a635ede1c46b5b17a7b163/scipy-1.17.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:35c3a56d2ef83efc372eaec584314bd0ef2e2f0d2adb21c55e6ad5b344c0dcb8", size = 31610954, upload-time = "2026-02-23T00:17:49.855Z" }, + { url = "https://files.pythonhosted.org/packages/b2/02/cf107b01494c19dc100f1d0b7ac3cc08666e96ba2d64db7626066cee895e/scipy-1.17.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fcb310ddb270a06114bb64bbe53c94926b943f5b7f0842194d585c65eb4edd76", size = 28172662, upload-time = "2026-02-23T00:18:01.64Z" }, + { url = "https://files.pythonhosted.org/packages/cf/a9/599c28631bad314d219cf9ffd40e985b24d603fc8a2f4ccc5ae8419a535b/scipy-1.17.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:cc90d2e9c7e5c7f1a482c9875007c095c3194b1cfedca3c2f3291cdc2bc7c086", size = 20344366, upload-time = "2026-02-23T00:18:12.015Z" }, + { url = "https://files.pythonhosted.org/packages/35/f5/906eda513271c8deb5af284e5ef0206d17a96239af79f9fa0aebfe0e36b4/scipy-1.17.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:c80be5ede8f3f8eded4eff73cc99a25c388ce98e555b17d31da05287015ffa5b", size = 22704017, upload-time = "2026-02-23T00:18:21.502Z" }, + { url = "https://files.pythonhosted.org/packages/da/34/16f10e3042d2f1d6b66e0428308ab52224b6a23049cb2f5c1756f713815f/scipy-1.17.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e19ebea31758fac5893a2ac360fedd00116cbb7628e650842a6691ba7ca28a21", size = 32927842, upload-time = "2026-02-23T00:18:35.367Z" }, + { url = "https://files.pythonhosted.org/packages/01/8e/1e35281b8ab6d5d72ebe9911edcdffa3f36b04ed9d51dec6dd140396e220/scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02ae3b274fde71c5e92ac4d54bc06c42d80e399fec704383dcd99b301df37458", size = 35235890, upload-time = "2026-02-23T00:18:49.188Z" }, + { url = "https://files.pythonhosted.org/packages/c5/5c/9d7f4c88bea6e0d5a4f1bc0506a53a00e9fcb198de372bfe4d3652cef482/scipy-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a604bae87c6195d8b1045eddece0514d041604b14f2727bbc2b3020172045eb", size = 35003557, upload-time = "2026-02-23T00:18:54.74Z" }, + { url = "https://files.pythonhosted.org/packages/65/94/7698add8f276dbab7a9de9fb6b0e02fc13ee61d51c7c3f85ac28b65e1239/scipy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f590cd684941912d10becc07325a3eeb77886fe981415660d9265c4c418d0bea", size = 37625856, upload-time = "2026-02-23T00:19:00.307Z" }, + { url = "https://files.pythonhosted.org/packages/a2/84/dc08d77fbf3d87d3ee27f6a0c6dcce1de5829a64f2eae85a0ecc1f0daa73/scipy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:41b71f4a3a4cab9d366cd9065b288efc4d4f3c0b37a91a8e0947fb5bd7f31d87", size = 36549682, upload-time = "2026-02-23T00:19:07.67Z" }, + { url = "https://files.pythonhosted.org/packages/bc/98/fe9ae9ffb3b54b62559f52dedaebe204b408db8109a8c66fdd04869e6424/scipy-1.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:f4115102802df98b2b0db3cce5cb9b92572633a1197c77b7553e5203f284a5b3", size = 24547340, upload-time = "2026-02-23T00:19:12.024Z" }, + { url = "https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c", size = 31590199, upload-time = "2026-02-23T00:19:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f", size = 28154001, upload-time = "2026-02-23T00:19:22.241Z" }, + { url = "https://files.pythonhosted.org/packages/5b/58/3ce96251560107b381cbd6e8413c483bbb1228a6b919fa8652b0d4090e7f/scipy-1.17.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:7ff200bf9d24f2e4d5dc6ee8c3ac64d739d3a89e2326ba68aaf6c4a2b838fd7d", size = 20325719, upload-time = "2026-02-23T00:19:26.329Z" }, + { url = "https://files.pythonhosted.org/packages/b2/83/15087d945e0e4d48ce2377498abf5ad171ae013232ae31d06f336e64c999/scipy-1.17.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4b400bdc6f79fa02a4d86640310dde87a21fba0c979efff5248908c6f15fad1b", size = 22683595, upload-time = "2026-02-23T00:19:30.304Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e0/e58fbde4a1a594c8be8114eb4aac1a55bcd6587047efc18a61eb1f5c0d30/scipy-1.17.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b64ca7d4aee0102a97f3ba22124052b4bd2152522355073580bf4845e2550b6", size = 32896429, upload-time = "2026-02-23T00:19:35.536Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464", size = 35203952, upload-time = "2026-02-23T00:19:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a5/9afd17de24f657fdfe4df9a3f1ea049b39aef7c06000c13db1530d81ccca/scipy-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:beeda3d4ae615106d7094f7e7cef6218392e4465cc95d25f900bebabfded0950", size = 34979063, upload-time = "2026-02-23T00:19:47.547Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/88b1d2384b424bf7c924f2038c1c409f8d88bb2a8d49d097861dd64a57b2/scipy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6609bc224e9568f65064cfa72edc0f24ee6655b47575954ec6339534b2798369", size = 37598449, upload-time = "2026-02-23T00:19:53.238Z" }, + { url = "https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448", size = 36510943, upload-time = "2026-02-23T00:20:50.89Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fd/3be73c564e2a01e690e19cc618811540ba5354c67c8680dce3281123fb79/scipy-1.17.1-cp313-cp313-win_arm64.whl", hash = "sha256:5cf36e801231b6a2059bf354720274b7558746f3b1a4efb43fcf557ccd484a87", size = 24545621, upload-time = "2026-02-23T00:20:55.871Z" }, + { url = "https://files.pythonhosted.org/packages/6f/6b/17787db8b8114933a66f9dcc479a8272e4b4da75fe03b0c282f7b0ade8cd/scipy-1.17.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:d59c30000a16d8edc7e64152e30220bfbd724c9bbb08368c054e24c651314f0a", size = 31936708, upload-time = "2026-02-23T00:19:58.694Z" }, + { url = "https://files.pythonhosted.org/packages/38/2e/524405c2b6392765ab1e2b722a41d5da33dc5c7b7278184a8ad29b6cb206/scipy-1.17.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:010f4333c96c9bb1a4516269e33cb5917b08ef2166d5556ca2fd9f082a9e6ea0", size = 28570135, upload-time = "2026-02-23T00:20:03.934Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c3/5bd7199f4ea8556c0c8e39f04ccb014ac37d1468e6cfa6a95c6b3562b76e/scipy-1.17.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2ceb2d3e01c5f1d83c4189737a42d9cb2fc38a6eeed225e7515eef71ad301dce", size = 20741977, upload-time = "2026-02-23T00:20:07.935Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b8/8ccd9b766ad14c78386599708eb745f6b44f08400a5fd0ade7cf89b6fc93/scipy-1.17.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:844e165636711ef41f80b4103ed234181646b98a53c8f05da12ca5ca289134f6", size = 23029601, upload-time = "2026-02-23T00:20:12.161Z" }, + { url = "https://files.pythonhosted.org/packages/6d/a0/3cb6f4d2fb3e17428ad2880333cac878909ad1a89f678527b5328b93c1d4/scipy-1.17.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158dd96d2207e21c966063e1635b1063cd7787b627b6f07305315dd73d9c679e", size = 33019667, upload-time = "2026-02-23T00:20:17.208Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c3/2d834a5ac7bf3a0c806ad1508efc02dda3c8c61472a56132d7894c312dea/scipy-1.17.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74cbb80d93260fe2ffa334efa24cb8f2f0f622a9b9febf8b483c0b865bfb3475", size = 35264159, upload-time = "2026-02-23T00:20:23.087Z" }, + { url = "https://files.pythonhosted.org/packages/4d/77/d3ed4becfdbd217c52062fafe35a72388d1bd82c2d0ba5ca19d6fcc93e11/scipy-1.17.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dbc12c9f3d185f5c737d801da555fb74b3dcfa1a50b66a1a93e09190f41fab50", size = 35102771, upload-time = "2026-02-23T00:20:28.636Z" }, + { url = "https://files.pythonhosted.org/packages/bd/12/d19da97efde68ca1ee5538bb261d5d2c062f0c055575128f11a2730e3ac1/scipy-1.17.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94055a11dfebe37c656e70317e1996dc197e1a15bbcc351bcdd4610e128fe1ca", size = 37665910, upload-time = "2026-02-23T00:20:34.743Z" }, + { url = "https://files.pythonhosted.org/packages/06/1c/1172a88d507a4baaf72c5a09bb6c018fe2ae0ab622e5830b703a46cc9e44/scipy-1.17.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e30bdeaa5deed6bc27b4cc490823cd0347d7dae09119b8803ae576ea0ce52e4c", size = 36562980, upload-time = "2026-02-23T00:20:40.575Z" }, + { url = "https://files.pythonhosted.org/packages/70/b0/eb757336e5a76dfa7911f63252e3b7d1de00935d7705cf772db5b45ec238/scipy-1.17.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a720477885a9d2411f94a93d16f9d89bad0f28ca23c3f8daa521e2dcc3f44d49", size = 24856543, upload-time = "2026-02-23T00:20:45.313Z" }, + { url = "https://files.pythonhosted.org/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:a48a72c77a310327f6a3a920092fa2b8fd03d7deaa60f093038f22d98e096717", size = 31584510, upload-time = "2026-02-23T00:21:01.015Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:45abad819184f07240d8a696117a7aacd39787af9e0b719d00285549ed19a1e9", size = 28170131, upload-time = "2026-02-23T00:21:05.888Z" }, + { url = "https://files.pythonhosted.org/packages/db/7b/8624a203326675d7746a254083a187398090a179335b2e4a20e2ddc46e83/scipy-1.17.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3fd1fcdab3ea951b610dc4cef356d416d5802991e7e32b5254828d342f7b7e0b", size = 20342032, upload-time = "2026-02-23T00:21:09.904Z" }, + { url = "https://files.pythonhosted.org/packages/c9/35/2c342897c00775d688d8ff3987aced3426858fd89d5a0e26e020b660b301/scipy-1.17.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7bdf2da170b67fdf10bca777614b1c7d96ae3ca5794fd9587dce41eb2966e866", size = 22678766, upload-time = "2026-02-23T00:21:14.313Z" }, + { url = "https://files.pythonhosted.org/packages/ef/f2/7cdb8eb308a1a6ae1e19f945913c82c23c0c442a462a46480ce487fdc0ac/scipy-1.17.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adb2642e060a6549c343603a3851ba76ef0b74cc8c079a9a58121c7ec9fe2350", size = 32957007, upload-time = "2026-02-23T00:21:19.663Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118", size = 35221333, upload-time = "2026-02-23T00:21:25.278Z" }, + { url = "https://files.pythonhosted.org/packages/d9/77/5b8509d03b77f093a0d52e606d3c4f79e8b06d1d38c441dacb1e26cacf46/scipy-1.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d2650c1fb97e184d12d8ba010493ee7b322864f7d3d00d3f9bb97d9c21de4068", size = 35042066, upload-time = "2026-02-23T00:21:31.358Z" }, + { url = "https://files.pythonhosted.org/packages/f9/df/18f80fb99df40b4070328d5ae5c596f2f00fffb50167e31439e932f29e7d/scipy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:08b900519463543aa604a06bec02461558a6e1cef8fdbb8098f77a48a83c8118", size = 37612763, upload-time = "2026-02-23T00:21:37.247Z" }, + { url = "https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19", size = 37290984, upload-time = "2026-02-23T00:22:35.023Z" }, + { url = "https://files.pythonhosted.org/packages/7c/56/fe201e3b0f93d1a8bcf75d3379affd228a63d7e2d80ab45467a74b494947/scipy-1.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:f8885db0bc2bffa59d5c1b72fad7a6a92d3e80e7257f967dd81abb553a90d293", size = 25192877, upload-time = "2026-02-23T00:22:39.798Z" }, + { url = "https://files.pythonhosted.org/packages/96/ad/f8c414e121f82e02d76f310f16db9899c4fcde36710329502a6b2a3c0392/scipy-1.17.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:1cc682cea2ae55524432f3cdff9e9a3be743d52a7443d0cba9017c23c87ae2f6", size = 31949750, upload-time = "2026-02-23T00:21:42.289Z" }, + { url = "https://files.pythonhosted.org/packages/7c/b0/c741e8865d61b67c81e255f4f0a832846c064e426636cd7de84e74d209be/scipy-1.17.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:2040ad4d1795a0ae89bfc7e8429677f365d45aa9fd5e4587cf1ea737f927b4a1", size = 28585858, upload-time = "2026-02-23T00:21:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1b/3985219c6177866628fa7c2595bfd23f193ceebbe472c98a08824b9466ff/scipy-1.17.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:131f5aaea57602008f9822e2115029b55d4b5f7c070287699fe45c661d051e39", size = 20757723, upload-time = "2026-02-23T00:21:52.039Z" }, + { url = "https://files.pythonhosted.org/packages/c0/19/2a04aa25050d656d6f7b9e7b685cc83d6957fb101665bfd9369ca6534563/scipy-1.17.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9cdc1a2fcfd5c52cfb3045feb399f7b3ce822abdde3a193a6b9a60b3cb5854ca", size = 23043098, upload-time = "2026-02-23T00:21:56.185Z" }, + { url = "https://files.pythonhosted.org/packages/86/f1/3383beb9b5d0dbddd030335bf8a8b32d4317185efe495374f134d8be6cce/scipy-1.17.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e3dcd57ab780c741fde8dc68619de988b966db759a3c3152e8e9142c26295ad", size = 33030397, upload-time = "2026-02-23T00:22:01.404Z" }, + { url = "https://files.pythonhosted.org/packages/41/68/8f21e8a65a5a03f25a79165ec9d2b28c00e66dc80546cf5eb803aeeff35b/scipy-1.17.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9956e4d4f4a301ebf6cde39850333a6b6110799d470dbbb1e25326ac447f52a", size = 35281163, upload-time = "2026-02-23T00:22:07.024Z" }, + { url = "https://files.pythonhosted.org/packages/84/8d/c8a5e19479554007a5632ed7529e665c315ae7492b4f946b0deb39870e39/scipy-1.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a4328d245944d09fd639771de275701ccadf5f781ba0ff092ad141e017eccda4", size = 35116291, upload-time = "2026-02-23T00:22:12.585Z" }, + { url = "https://files.pythonhosted.org/packages/52/52/e57eceff0e342a1f50e274264ed47497b59e6a4e3118808ee58ddda7b74a/scipy-1.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a77cbd07b940d326d39a1d1b37817e2ee4d79cb30e7338f3d0cddffae70fcaa2", size = 37682317, upload-time = "2026-02-23T00:22:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/11/2f/b29eafe4a3fbc3d6de9662b36e028d5f039e72d345e05c250e121a230dd4/scipy-1.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:eb092099205ef62cd1782b006658db09e2fed75bffcae7cc0d44052d8aa0f484", size = 37345327, upload-time = "2026-02-23T00:22:24.442Z" }, + { url = "https://files.pythonhosted.org/packages/07/39/338d9219c4e87f3e708f18857ecd24d22a0c3094752393319553096b98af/scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21", size = 25489165, upload-time = "2026-02-23T00:22:29.563Z" }, ] [[package]] @@ -1642,6 +1766,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, ] +[[package]] +name = "sortedcontainers" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, +] + [[package]] name = "soupsieve" version = "2.8" @@ -1653,15 +1786,15 @@ wheels = [ [[package]] name = "starlette" -version = "0.48.0" +version = "1.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a7/a5/d6f429d43394057b67a6b5bbe6eae2f77a6bf7459d961fdb224bf206eee6/starlette-0.48.0.tar.gz", hash = "sha256:7e8cee469a8ab2352911528110ce9088fdc6a37d9876926e73da7ce4aa4c7a46", size = 2652949, upload-time = "2025-09-13T08:41:05.699Z" } +sdist = { url = "https://files.pythonhosted.org/packages/08/a3/84e821cc54b4ab50ae6dbc6ac3800a651b65ec35f045cc73785380654057/starlette-1.0.1.tar.gz", hash = "sha256:512399c5f1de7fac99c88572212ded9ddeddef2fb32afa82d724000e88b38f4f", size = 2659596, upload-time = "2026-05-21T21:58:58.433Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e1/b2df4bc09a1e51ff664c1e17018a4274b42e5e9352e4a478ea540512dc88/starlette-1.0.1-py3-none-any.whl", hash = "sha256:7c0e69b2ee1c848bd54669d908500117a3ee13de603a21427e5c6fc1adf98dcd", size = 72802, upload-time = "2026-05-21T21:58:56.551Z" }, ] [[package]] @@ -1720,14 +1853,14 @@ wheels = [ [[package]] name = "typing-inspection" -version = "0.4.1" +version = "0.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, ] [[package]] @@ -1739,65 +1872,13 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, ] -[[package]] -name = "ujson" -version = "5.11.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/d9/3f17e3c5773fb4941c68d9a37a47b1a79c9649d6c56aefbed87cc409d18a/ujson-5.11.0.tar.gz", hash = "sha256:e204ae6f909f099ba6b6b942131cee359ddda2b6e4ea39c12eb8b991fe2010e0", size = 7156583, upload-time = "2025-08-20T11:57:02.452Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/ef/a9cb1fce38f699123ff012161599fb9f2ff3f8d482b4b18c43a2dc35073f/ujson-5.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7895f0d2d53bd6aea11743bd56e3cb82d729980636cd0ed9b89418bf66591702", size = 55434, upload-time = "2025-08-20T11:55:34.987Z" }, - { url = "https://files.pythonhosted.org/packages/b1/05/dba51a00eb30bd947791b173766cbed3492269c150a7771d2750000c965f/ujson-5.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12b5e7e22a1fe01058000d1b317d3b65cc3daf61bd2ea7a2b76721fe160fa74d", size = 53190, upload-time = "2025-08-20T11:55:36.384Z" }, - { url = "https://files.pythonhosted.org/packages/03/3c/fd11a224f73fbffa299fb9644e425f38b38b30231f7923a088dd513aabb4/ujson-5.11.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0180a480a7d099082501cad1fe85252e4d4bf926b40960fb3d9e87a3a6fbbc80", size = 57600, upload-time = "2025-08-20T11:55:37.692Z" }, - { url = "https://files.pythonhosted.org/packages/55/b9/405103cae24899df688a3431c776e00528bd4799e7d68820e7ebcf824f92/ujson-5.11.0-cp312-cp312-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:fa79fdb47701942c2132a9dd2297a1a85941d966d8c87bfd9e29b0cf423f26cc", size = 59791, upload-time = "2025-08-20T11:55:38.877Z" }, - { url = "https://files.pythonhosted.org/packages/17/7b/2dcbc2bbfdbf68f2368fb21ab0f6735e872290bb604c75f6e06b81edcb3f/ujson-5.11.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8254e858437c00f17cb72e7a644fc42dad0ebb21ea981b71df6e84b1072aaa7c", size = 57356, upload-time = "2025-08-20T11:55:40.036Z" }, - { url = "https://files.pythonhosted.org/packages/d1/71/fea2ca18986a366c750767b694430d5ded6b20b6985fddca72f74af38a4c/ujson-5.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1aa8a2ab482f09f6c10fba37112af5f957689a79ea598399c85009f2f29898b5", size = 1036313, upload-time = "2025-08-20T11:55:41.408Z" }, - { url = "https://files.pythonhosted.org/packages/a3/bb/d4220bd7532eac6288d8115db51710fa2d7d271250797b0bfba9f1e755af/ujson-5.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a638425d3c6eed0318df663df44480f4a40dc87cc7c6da44d221418312f6413b", size = 1195782, upload-time = "2025-08-20T11:55:43.357Z" }, - { url = "https://files.pythonhosted.org/packages/80/47/226e540aa38878ce1194454385701d82df538ccb5ff8db2cf1641dde849a/ujson-5.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7e3cff632c1d78023b15f7e3a81c3745cd3f94c044d1e8fa8efbd6b161997bbc", size = 1088817, upload-time = "2025-08-20T11:55:45.262Z" }, - { url = "https://files.pythonhosted.org/packages/7e/81/546042f0b23c9040d61d46ea5ca76f0cc5e0d399180ddfb2ae976ebff5b5/ujson-5.11.0-cp312-cp312-win32.whl", hash = "sha256:be6b0eaf92cae8cdee4d4c9e074bde43ef1c590ed5ba037ea26c9632fb479c88", size = 39757, upload-time = "2025-08-20T11:55:46.522Z" }, - { url = "https://files.pythonhosted.org/packages/44/1b/27c05dc8c9728f44875d74b5bfa948ce91f6c33349232619279f35c6e817/ujson-5.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:b7b136cc6abc7619124fd897ef75f8e63105298b5ca9bdf43ebd0e1fa0ee105f", size = 43859, upload-time = "2025-08-20T11:55:47.987Z" }, - { url = "https://files.pythonhosted.org/packages/22/2d/37b6557c97c3409c202c838aa9c960ca3896843b4295c4b7bb2bbd260664/ujson-5.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:6cd2df62f24c506a0ba322d5e4fe4466d47a9467b57e881ee15a31f7ecf68ff6", size = 38361, upload-time = "2025-08-20T11:55:49.122Z" }, - { url = "https://files.pythonhosted.org/packages/1c/ec/2de9dd371d52c377abc05d2b725645326c4562fc87296a8907c7bcdf2db7/ujson-5.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:109f59885041b14ee9569bf0bb3f98579c3fa0652317b355669939e5fc5ede53", size = 55435, upload-time = "2025-08-20T11:55:50.243Z" }, - { url = "https://files.pythonhosted.org/packages/5b/a4/f611f816eac3a581d8a4372f6967c3ed41eddbae4008d1d77f223f1a4e0a/ujson-5.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a31c6b8004438e8c20fc55ac1c0e07dad42941db24176fe9acf2815971f8e752", size = 53193, upload-time = "2025-08-20T11:55:51.373Z" }, - { url = "https://files.pythonhosted.org/packages/e9/c5/c161940967184de96f5cbbbcce45b562a4bf851d60f4c677704b1770136d/ujson-5.11.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78c684fb21255b9b90320ba7e199780f653e03f6c2528663768965f4126a5b50", size = 57603, upload-time = "2025-08-20T11:55:52.583Z" }, - { url = "https://files.pythonhosted.org/packages/2b/d6/c7b2444238f5b2e2d0e3dab300b9ddc3606e4b1f0e4bed5a48157cebc792/ujson-5.11.0-cp313-cp313-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:4c9f5d6a27d035dd90a146f7761c2272cf7103de5127c9ab9c4cd39ea61e878a", size = 59794, upload-time = "2025-08-20T11:55:53.69Z" }, - { url = "https://files.pythonhosted.org/packages/fe/a3/292551f936d3d02d9af148f53e1bc04306b00a7cf1fcbb86fa0d1c887242/ujson-5.11.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:837da4d27fed5fdc1b630bd18f519744b23a0b5ada1bbde1a36ba463f2900c03", size = 57363, upload-time = "2025-08-20T11:55:54.843Z" }, - { url = "https://files.pythonhosted.org/packages/90/a6/82cfa70448831b1a9e73f882225980b5c689bf539ec6400b31656a60ea46/ujson-5.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:787aff4a84da301b7f3bac09bc696e2e5670df829c6f8ecf39916b4e7e24e701", size = 1036311, upload-time = "2025-08-20T11:55:56.197Z" }, - { url = "https://files.pythonhosted.org/packages/84/5c/96e2266be50f21e9b27acaee8ca8f23ea0b85cb998c33d4f53147687839b/ujson-5.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6dd703c3e86dc6f7044c5ac0b3ae079ed96bf297974598116aa5fb7f655c3a60", size = 1195783, upload-time = "2025-08-20T11:55:58.081Z" }, - { url = "https://files.pythonhosted.org/packages/8d/20/78abe3d808cf3bb3e76f71fca46cd208317bf461c905d79f0d26b9df20f1/ujson-5.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3772e4fe6b0c1e025ba3c50841a0ca4786825a4894c8411bf8d3afe3a8061328", size = 1088822, upload-time = "2025-08-20T11:55:59.469Z" }, - { url = "https://files.pythonhosted.org/packages/d8/50/8856e24bec5e2fc7f775d867aeb7a3f137359356200ac44658f1f2c834b2/ujson-5.11.0-cp313-cp313-win32.whl", hash = "sha256:8fa2af7c1459204b7a42e98263b069bd535ea0cd978b4d6982f35af5a04a4241", size = 39753, upload-time = "2025-08-20T11:56:01.345Z" }, - { url = "https://files.pythonhosted.org/packages/5b/d8/1baee0f4179a4d0f5ce086832147b6cc9b7731c24ca08e14a3fdb8d39c32/ujson-5.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:34032aeca4510a7c7102bd5933f59a37f63891f30a0706fb46487ab6f0edf8f0", size = 43866, upload-time = "2025-08-20T11:56:02.552Z" }, - { url = "https://files.pythonhosted.org/packages/a9/8c/6d85ef5be82c6d66adced3ec5ef23353ed710a11f70b0b6a836878396334/ujson-5.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:ce076f2df2e1aa62b685086fbad67f2b1d3048369664b4cdccc50707325401f9", size = 38363, upload-time = "2025-08-20T11:56:03.688Z" }, - { url = "https://files.pythonhosted.org/packages/28/08/4518146f4984d112764b1dfa6fb7bad691c44a401adadaa5e23ccd930053/ujson-5.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:65724738c73645db88f70ba1f2e6fb678f913281804d5da2fd02c8c5839af302", size = 55462, upload-time = "2025-08-20T11:56:04.873Z" }, - { url = "https://files.pythonhosted.org/packages/29/37/2107b9a62168867a692654d8766b81bd2fd1e1ba13e2ec90555861e02b0c/ujson-5.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29113c003ca33ab71b1b480bde952fbab2a0b6b03a4ee4c3d71687cdcbd1a29d", size = 53246, upload-time = "2025-08-20T11:56:06.054Z" }, - { url = "https://files.pythonhosted.org/packages/9b/f8/25583c70f83788edbe3ca62ce6c1b79eff465d78dec5eb2b2b56b3e98b33/ujson-5.11.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c44c703842024d796b4c78542a6fcd5c3cb948b9fc2a73ee65b9c86a22ee3638", size = 57631, upload-time = "2025-08-20T11:56:07.374Z" }, - { url = "https://files.pythonhosted.org/packages/ed/ca/19b3a632933a09d696f10dc1b0dfa1d692e65ad507d12340116ce4f67967/ujson-5.11.0-cp314-cp314-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:e750c436fb90edf85585f5c62a35b35082502383840962c6983403d1bd96a02c", size = 59877, upload-time = "2025-08-20T11:56:08.534Z" }, - { url = "https://files.pythonhosted.org/packages/55/7a/4572af5324ad4b2bfdd2321e898a527050290147b4ea337a79a0e4e87ec7/ujson-5.11.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f278b31a7c52eb0947b2db55a5133fbc46b6f0ef49972cd1a80843b72e135aba", size = 57363, upload-time = "2025-08-20T11:56:09.758Z" }, - { url = "https://files.pythonhosted.org/packages/7b/71/a2b8c19cf4e1efe53cf439cdf7198ac60ae15471d2f1040b490c1f0f831f/ujson-5.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ab2cb8351d976e788669c8281465d44d4e94413718af497b4e7342d7b2f78018", size = 1036394, upload-time = "2025-08-20T11:56:11.168Z" }, - { url = "https://files.pythonhosted.org/packages/7a/3e/7b98668cba3bb3735929c31b999b374ebc02c19dfa98dfebaeeb5c8597ca/ujson-5.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:090b4d11b380ae25453100b722d0609d5051ffe98f80ec52853ccf8249dfd840", size = 1195837, upload-time = "2025-08-20T11:56:12.6Z" }, - { url = "https://files.pythonhosted.org/packages/a1/ea/8870f208c20b43571a5c409ebb2fe9b9dba5f494e9e60f9314ac01ea8f78/ujson-5.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:80017e870d882d5517d28995b62e4e518a894f932f1e242cbc802a2fd64d365c", size = 1088837, upload-time = "2025-08-20T11:56:14.15Z" }, - { url = "https://files.pythonhosted.org/packages/63/b6/c0e6607e37fa47929920a685a968c6b990a802dec65e9c5181e97845985d/ujson-5.11.0-cp314-cp314-win32.whl", hash = "sha256:1d663b96eb34c93392e9caae19c099ec4133ba21654b081956613327f0e973ac", size = 41022, upload-time = "2025-08-20T11:56:15.509Z" }, - { url = "https://files.pythonhosted.org/packages/4e/56/f4fe86b4c9000affd63e9219e59b222dc48b01c534533093e798bf617a7e/ujson-5.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:849e65b696f0d242833f1df4182096cedc50d414215d1371fca85c541fbff629", size = 45111, upload-time = "2025-08-20T11:56:16.597Z" }, - { url = "https://files.pythonhosted.org/packages/0a/f3/669437f0280308db4783b12a6d88c00730b394327d8334cc7a32ef218e64/ujson-5.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:e73df8648c9470af2b6a6bf5250d4744ad2cf3d774dcf8c6e31f018bdd04d764", size = 39682, upload-time = "2025-08-20T11:56:17.763Z" }, - { url = "https://files.pythonhosted.org/packages/6e/cd/e9809b064a89fe5c4184649adeb13c1b98652db3f8518980b04227358574/ujson-5.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:de6e88f62796372fba1de973c11138f197d3e0e1d80bcb2b8aae1e826096d433", size = 55759, upload-time = "2025-08-20T11:56:18.882Z" }, - { url = "https://files.pythonhosted.org/packages/1b/be/ae26a6321179ebbb3a2e2685b9007c71bcda41ad7a77bbbe164005e956fc/ujson-5.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:49e56ef8066f11b80d620985ae36869a3ff7e4b74c3b6129182ec5d1df0255f3", size = 53634, upload-time = "2025-08-20T11:56:20.012Z" }, - { url = "https://files.pythonhosted.org/packages/ae/e9/fb4a220ee6939db099f4cfeeae796ecb91e7584ad4d445d4ca7f994a9135/ujson-5.11.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1a325fd2c3a056cf6c8e023f74a0c478dd282a93141356ae7f16d5309f5ff823", size = 58547, upload-time = "2025-08-20T11:56:21.175Z" }, - { url = "https://files.pythonhosted.org/packages/bd/f8/fc4b952b8f5fea09ea3397a0bd0ad019e474b204cabcb947cead5d4d1ffc/ujson-5.11.0-cp314-cp314t-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:a0af6574fc1d9d53f4ff371f58c96673e6d988ed2b5bf666a6143c782fa007e9", size = 60489, upload-time = "2025-08-20T11:56:22.342Z" }, - { url = "https://files.pythonhosted.org/packages/2e/e5/af5491dfda4f8b77e24cf3da68ee0d1552f99a13e5c622f4cef1380925c3/ujson-5.11.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10f29e71ecf4ecd93a6610bd8efa8e7b6467454a363c3d6416db65de883eb076", size = 58035, upload-time = "2025-08-20T11:56:23.92Z" }, - { url = "https://files.pythonhosted.org/packages/c4/09/0945349dd41f25cc8c38d78ace49f14c5052c5bbb7257d2f466fa7bdb533/ujson-5.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1a0a9b76a89827a592656fe12e000cf4f12da9692f51a841a4a07aa4c7ecc41c", size = 1037212, upload-time = "2025-08-20T11:56:25.274Z" }, - { url = "https://files.pythonhosted.org/packages/49/44/8e04496acb3d5a1cbee3a54828d9652f67a37523efa3d3b18a347339680a/ujson-5.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b16930f6a0753cdc7d637b33b4e8f10d5e351e1fb83872ba6375f1e87be39746", size = 1196500, upload-time = "2025-08-20T11:56:27.517Z" }, - { url = "https://files.pythonhosted.org/packages/64/ae/4bc825860d679a0f208a19af2f39206dfd804ace2403330fdc3170334a2f/ujson-5.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:04c41afc195fd477a59db3a84d5b83a871bd648ef371cf8c6f43072d89144eef", size = 1089487, upload-time = "2025-08-20T11:56:29.07Z" }, - { url = "https://files.pythonhosted.org/packages/30/ed/5a057199fb0a5deabe0957073a1c1c1c02a3e99476cd03daee98ea21fa57/ujson-5.11.0-cp314-cp314t-win32.whl", hash = "sha256:aa6d7a5e09217ff93234e050e3e380da62b084e26b9f2e277d2606406a2fc2e5", size = 41859, upload-time = "2025-08-20T11:56:30.495Z" }, - { url = "https://files.pythonhosted.org/packages/aa/03/b19c6176bdf1dc13ed84b886e99677a52764861b6cc023d5e7b6ebda249d/ujson-5.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:48055e1061c1bb1f79e75b4ac39e821f3f35a9b82de17fce92c3140149009bec", size = 46183, upload-time = "2025-08-20T11:56:31.574Z" }, - { url = "https://files.pythonhosted.org/packages/5d/ca/a0413a3874b2dc1708b8796ca895bf363292f9c70b2e8ca482b7dbc0259d/ujson-5.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1194b943e951092db611011cb8dbdb6cf94a3b816ed07906e14d3bc6ce0e90ab", size = 40264, upload-time = "2025-08-20T11:56:32.773Z" }, -] - [[package]] name = "urllib3" -version = "2.5.0" +version = "2.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, ] [[package]]