reconkit 0.2.0__tar.gz → 0.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- reconkit-0.2.1/.github/workflows/publish.yml +50 -0
- {reconkit-0.2.0 → reconkit-0.2.1}/.gitignore +30 -30
- {reconkit-0.2.0 → reconkit-0.2.1}/CHANGELOG.md +37 -32
- reconkit-0.2.1/LICENSE +38 -0
- {reconkit-0.2.0 → reconkit-0.2.1}/PKG-INFO +12 -3
- {reconkit-0.2.0 → reconkit-0.2.1}/README.md +10 -1
- {reconkit-0.2.0 → reconkit-0.2.1}/pyproject.toml +57 -57
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/__init__.py +22 -22
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/cli.py +247 -247
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/core/rate_limit.py +24 -24
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/forensics/exif.py +16 -16
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/forensics/hashing.py +22 -22
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/forensics/identify.py +12 -12
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/forensics/strings.py +47 -47
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/noir/__init__.py +54 -54
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/noir/errors.py +29 -29
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/noir/primitives.py +154 -154
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/noir/public_api.py +225 -225
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/osint/dns.py +18 -18
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/osint/ip.py +25 -25
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/osint/whois.py +14 -14
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/scraping/extract.py +36 -36
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/scraping/fetch.py +112 -112
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/scraping/robots.py +59 -59
- {reconkit-0.2.0 → reconkit-0.2.1}/tests/test_extract_links.py +13 -13
- {reconkit-0.2.0 → reconkit-0.2.1}/tests/test_hashing.py +9 -9
- {reconkit-0.2.0 → reconkit-0.2.1}/tests/test_noir_output_contract.py +23 -23
- {reconkit-0.2.0 → reconkit-0.2.1}/tests/test_noir_primitives.py +12 -12
- {reconkit-0.2.0 → reconkit-0.2.1}/tests/test_strings.py +11 -11
- reconkit-0.2.0/LICENSE +0 -21
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/core/__init__.py +0 -0
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/evidence/__init__.py +0 -0
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/evidence/archives.py +0 -0
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/evidence/custody.py +0 -0
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/evidence/iris.py +0 -0
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/evidence/manifest.py +0 -0
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/forensics/__init__.py +0 -0
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/osint/__init__.py +0 -0
- {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/scraping/__init__.py +0 -0
- {reconkit-0.2.0 → reconkit-0.2.1}/tests/test_evidence_exports.py +0 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
publish:
|
|
13
|
+
name: Build and publish
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
environment: pypi
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
|
|
19
|
+
- uses: actions/setup-python@v5
|
|
20
|
+
with:
|
|
21
|
+
python-version: "3.12"
|
|
22
|
+
|
|
23
|
+
- name: Install release tools
|
|
24
|
+
run: python -m pip install --upgrade build twine
|
|
25
|
+
|
|
26
|
+
- name: Confirm the tag matches the package version
|
|
27
|
+
env:
|
|
28
|
+
RELEASE_TAG: ${{ github.ref_name }}
|
|
29
|
+
run: |
|
|
30
|
+
python - <<'PY'
|
|
31
|
+
import os
|
|
32
|
+
import tomllib
|
|
33
|
+
from pathlib import Path
|
|
34
|
+
|
|
35
|
+
version = tomllib.loads(Path("pyproject.toml").read_text())["project"]["version"]
|
|
36
|
+
expected = f"v{version}"
|
|
37
|
+
if os.environ["RELEASE_TAG"] != expected:
|
|
38
|
+
raise SystemExit(f"Tag {os.environ['RELEASE_TAG']} does not match {expected}.")
|
|
39
|
+
PY
|
|
40
|
+
|
|
41
|
+
- name: Build distributions
|
|
42
|
+
run: python -m build
|
|
43
|
+
|
|
44
|
+
- name: Validate distributions
|
|
45
|
+
run: twine check dist/*
|
|
46
|
+
|
|
47
|
+
- name: Publish to PyPI
|
|
48
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
49
|
+
with:
|
|
50
|
+
password: ${{ secrets.PYPI_API_TOKEN }}
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
# Byte-compiled / optimized / DLL files
|
|
2
|
-
__pycache__/
|
|
3
|
-
*.py[cod]
|
|
4
|
-
*$py.class
|
|
5
|
-
|
|
6
|
-
# C extensions
|
|
7
|
-
*.so
|
|
8
|
-
|
|
9
|
-
# Distribution / packaging
|
|
10
|
-
build/
|
|
11
|
-
dist/
|
|
12
|
-
*.egg-info/
|
|
13
|
-
.eggs/
|
|
14
|
-
|
|
15
|
-
# Virtual environments
|
|
16
|
-
.venv/
|
|
17
|
-
venv/
|
|
18
|
-
ENV/
|
|
19
|
-
|
|
20
|
-
# Test / tooling caches
|
|
21
|
-
.pytest_cache/
|
|
22
|
-
.mypy_cache/
|
|
23
|
-
.ruff_cache/
|
|
24
|
-
.coverage
|
|
25
|
-
htmlcov/
|
|
26
|
-
|
|
27
|
-
# OS / editor
|
|
28
|
-
.DS_Store
|
|
29
|
-
Thumbs.db
|
|
30
|
-
.vscode/
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
build/
|
|
11
|
+
dist/
|
|
12
|
+
*.egg-info/
|
|
13
|
+
.eggs/
|
|
14
|
+
|
|
15
|
+
# Virtual environments
|
|
16
|
+
.venv/
|
|
17
|
+
venv/
|
|
18
|
+
ENV/
|
|
19
|
+
|
|
20
|
+
# Test / tooling caches
|
|
21
|
+
.pytest_cache/
|
|
22
|
+
.mypy_cache/
|
|
23
|
+
.ruff_cache/
|
|
24
|
+
.coverage
|
|
25
|
+
htmlcov/
|
|
26
|
+
|
|
27
|
+
# OS / editor
|
|
28
|
+
.DS_Store
|
|
29
|
+
Thumbs.db
|
|
30
|
+
.vscode/
|
|
@@ -1,32 +1,37 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to this project will be documented in this file.
|
|
4
|
-
|
|
5
|
-
Format: loosely based on *Keep a Changelog*. Versioning: SemVer where practical.
|
|
6
|
-
|
|
7
|
-
## [0.2.
|
|
8
|
-
|
|
9
|
-
###
|
|
10
|
-
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
###
|
|
21
|
-
-
|
|
22
|
-
|
|
23
|
-
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
Format: loosely based on *Keep a Changelog*. Versioning: SemVer where practical.
|
|
6
|
+
|
|
7
|
+
## [0.2.1] - 2026-11-04
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
- Replaced the MIT license with Noir Stack LLC's Proprietary Software License — Free Use, No Modification.
|
|
11
|
+
|
|
12
|
+
## [0.2.0] - 2026-11-04
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
- WARC 1.1 and WACZ 1.2 exports with an index, page list, SHA-256 fixity, and data-package digest.
|
|
16
|
+
- Hash-linked chain-of-custody ledgers and Ed25519-signed manifests.
|
|
17
|
+
- DFIR-IRIS v2 evidence-registration adapter.
|
|
18
|
+
- Redirect-chain recording and conservative public-destination checks for web capture.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
- Robots rules are checked at every redirect destination and fail closed by default.
|
|
22
|
+
|
|
23
|
+
## [0.1.0] - 2026-02-09
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
- Noir Stack public primitives: `EvidenceArtifact`, `EvidenceBundle`, `ProvenanceRecord`, `VerificationResult`.
|
|
27
|
+
- Domain-specific errors that describe trust boundaries and provenance constraints.
|
|
28
|
+
- Audit-grade CLI vocabulary: `evidence`, `boundary`, `verify`.
|
|
29
|
+
- Structured JSON outputs include: `decision_basis`, `verification_status`, `provenance_confidence`.
|
|
30
|
+
- `robots.txt` compliance (default) and rate limiting for web acquisition.
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
- Public-facing surface and CLI terminology refactored to evidence/verification framing.
|
|
34
|
+
|
|
35
|
+
### Notes
|
|
36
|
+
- This release is intentionally conservative.
|
|
37
|
+
- The system is capable of refusing to speculate. This is a feature.
|
reconkit-0.2.1/LICENSE
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
Proprietary Software License — Free Use, No Modification
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Noir Stack LLC. All rights reserved.
|
|
4
|
+
|
|
5
|
+
## 1. Grant of License
|
|
6
|
+
|
|
7
|
+
The copyright holder grants users a non-exclusive, worldwide, royalty-free license to download, install, and use this software for personal, educational, research, and commercial purposes, subject to the conditions below.
|
|
8
|
+
|
|
9
|
+
## 2. Restrictions
|
|
10
|
+
|
|
11
|
+
Users may not, without prior written permission from the copyright holder:
|
|
12
|
+
|
|
13
|
+
- Modify, adapt, translate, or create derivative works based on the software.
|
|
14
|
+
- Redistribute, publish, sell, sublicense, or repackage the software.
|
|
15
|
+
- Remove or alter copyright, attribution, or license notices.
|
|
16
|
+
- Claim ownership or authorship of the software.
|
|
17
|
+
|
|
18
|
+
## 3. Ownership
|
|
19
|
+
|
|
20
|
+
All rights, title, and interest in the software, including its source code and associated intellectual property, remain with the copyright holder.
|
|
21
|
+
|
|
22
|
+
No ownership rights are transferred under this license.
|
|
23
|
+
|
|
24
|
+
## 4. No Warranty
|
|
25
|
+
|
|
26
|
+
The software is provided "AS IS", without warranty of any kind, express or implied, to the extent permitted by applicable law.
|
|
27
|
+
|
|
28
|
+
## 5. Limitation of Liability
|
|
29
|
+
|
|
30
|
+
To the extent permitted by applicable law, the copyright holder shall not be liable for damages arising from the use or inability to use the software.
|
|
31
|
+
|
|
32
|
+
## 6. Termination
|
|
33
|
+
|
|
34
|
+
Permission to use the software terminates upon a material violation of this license, subject to applicable law.
|
|
35
|
+
|
|
36
|
+
## 7. Additional Permissions
|
|
37
|
+
|
|
38
|
+
Any permissions not expressly granted must be obtained in writing from the copyright holder.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: reconkit
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: Evidence collection, provenance, and preservation utilities for authorized investigations.
|
|
5
5
|
Author: reconkit
|
|
6
|
-
License:
|
|
6
|
+
License: Proprietary Software License — Free Use, No Modification
|
|
7
7
|
License-File: LICENSE
|
|
8
8
|
Keywords: forensics,osint,scraping,triage
|
|
9
9
|
Requires-Python: >=3.10
|
|
@@ -122,6 +122,15 @@ python -m build
|
|
|
122
122
|
twine check dist/*
|
|
123
123
|
```
|
|
124
124
|
|
|
125
|
+
## Releases
|
|
126
|
+
|
|
127
|
+
PyPI publication is automated by GitHub Actions. After updating the version in
|
|
128
|
+
`pyproject.toml` and the changelog, push the matching annotated tag (for example,
|
|
129
|
+
`v0.3.0`). The workflow verifies that the tag and package version match, builds
|
|
130
|
+
the distributions, validates them with Twine, and publishes using the repository's
|
|
131
|
+
`PYPI_API_TOKEN` Actions secret. Ordinary branch pushes never publish a release.
|
|
132
|
+
|
|
125
133
|
## License
|
|
126
134
|
|
|
127
|
-
|
|
135
|
+
Copyright © 2026 Noir Stack LLC. Licensed under the
|
|
136
|
+
[Proprietary Software License — Free Use, No Modification](LICENSE).
|
|
@@ -93,6 +93,15 @@ python -m build
|
|
|
93
93
|
twine check dist/*
|
|
94
94
|
```
|
|
95
95
|
|
|
96
|
+
## Releases
|
|
97
|
+
|
|
98
|
+
PyPI publication is automated by GitHub Actions. After updating the version in
|
|
99
|
+
`pyproject.toml` and the changelog, push the matching annotated tag (for example,
|
|
100
|
+
`v0.3.0`). The workflow verifies that the tag and package version match, builds
|
|
101
|
+
the distributions, validates them with Twine, and publishes using the repository's
|
|
102
|
+
`PYPI_API_TOKEN` Actions secret. Ordinary branch pushes never publish a release.
|
|
103
|
+
|
|
96
104
|
## License
|
|
97
105
|
|
|
98
|
-
|
|
106
|
+
Copyright © 2026 Noir Stack LLC. Licensed under the
|
|
107
|
+
[Proprietary Software License — Free Use, No Modification](LICENSE).
|
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
[build-system]
|
|
2
|
-
requires = ["hatchling>=1.25"]
|
|
3
|
-
build-backend = "hatchling.build"
|
|
4
|
-
|
|
5
|
-
[project]
|
|
6
|
-
name = "reconkit"
|
|
7
|
-
version = "0.2.
|
|
8
|
-
description = "Evidence collection, provenance, and preservation utilities for authorized investigations."
|
|
9
|
-
readme = "README.md"
|
|
10
|
-
requires-python = ">=3.10"
|
|
11
|
-
license = { text = "
|
|
12
|
-
authors = [{ name = "reconkit" }]
|
|
13
|
-
keywords = ["osint", "forensics", "scraping", "triage"]
|
|
14
|
-
dependencies = [
|
|
15
|
-
"httpx>=0.27",
|
|
16
|
-
"typer>=0.12",
|
|
17
|
-
"rich>=13.7",
|
|
18
|
-
"beautifulsoup4>=4.12",
|
|
19
|
-
"lxml>=5.1",
|
|
20
|
-
"dnspython>=2.6",
|
|
21
|
-
"python-whois>=0.9",
|
|
22
|
-
"ipwhois>=1.2",
|
|
23
|
-
"exifread>=3.0",
|
|
24
|
-
"filetype>=1.2",
|
|
25
|
-
"cryptography>=42",
|
|
26
|
-
]
|
|
27
|
-
|
|
28
|
-
[project.optional-dependencies]
|
|
29
|
-
dev = [
|
|
30
|
-
"build>=1.2",
|
|
31
|
-
"twine>=5.1",
|
|
32
|
-
"pytest>=8.0",
|
|
33
|
-
"pytest-asyncio>=0.23",
|
|
34
|
-
"ruff>=0.4",
|
|
35
|
-
"mypy>=1.10",
|
|
36
|
-
]
|
|
37
|
-
|
|
38
|
-
[project.scripts]
|
|
39
|
-
reconkit = "reconkit.cli:app"
|
|
40
|
-
|
|
41
|
-
[tool.hatch.build.targets.wheel]
|
|
42
|
-
packages = ["src/reconkit"]
|
|
43
|
-
|
|
44
|
-
[tool.pytest.ini_options]
|
|
45
|
-
addopts = "-q"
|
|
46
|
-
testpaths = ["tests"]
|
|
47
|
-
|
|
48
|
-
[tool.ruff]
|
|
49
|
-
line-length = 100
|
|
50
|
-
|
|
51
|
-
[tool.mypy]
|
|
52
|
-
python_version = "3.10"
|
|
53
|
-
warn_return_any = true
|
|
54
|
-
warn_unused_ignores = true
|
|
55
|
-
no_implicit_optional = true
|
|
56
|
-
strict_optional = true
|
|
57
|
-
ignore_missing_imports = true
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling>=1.25"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "reconkit"
|
|
7
|
+
version = "0.2.1"
|
|
8
|
+
description = "Evidence collection, provenance, and preservation utilities for authorized investigations."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
license = { text = "Proprietary Software License — Free Use, No Modification" }
|
|
12
|
+
authors = [{ name = "reconkit" }]
|
|
13
|
+
keywords = ["osint", "forensics", "scraping", "triage"]
|
|
14
|
+
dependencies = [
|
|
15
|
+
"httpx>=0.27",
|
|
16
|
+
"typer>=0.12",
|
|
17
|
+
"rich>=13.7",
|
|
18
|
+
"beautifulsoup4>=4.12",
|
|
19
|
+
"lxml>=5.1",
|
|
20
|
+
"dnspython>=2.6",
|
|
21
|
+
"python-whois>=0.9",
|
|
22
|
+
"ipwhois>=1.2",
|
|
23
|
+
"exifread>=3.0",
|
|
24
|
+
"filetype>=1.2",
|
|
25
|
+
"cryptography>=42",
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
[project.optional-dependencies]
|
|
29
|
+
dev = [
|
|
30
|
+
"build>=1.2",
|
|
31
|
+
"twine>=5.1",
|
|
32
|
+
"pytest>=8.0",
|
|
33
|
+
"pytest-asyncio>=0.23",
|
|
34
|
+
"ruff>=0.4",
|
|
35
|
+
"mypy>=1.10",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
[project.scripts]
|
|
39
|
+
reconkit = "reconkit.cli:app"
|
|
40
|
+
|
|
41
|
+
[tool.hatch.build.targets.wheel]
|
|
42
|
+
packages = ["src/reconkit"]
|
|
43
|
+
|
|
44
|
+
[tool.pytest.ini_options]
|
|
45
|
+
addopts = "-q"
|
|
46
|
+
testpaths = ["tests"]
|
|
47
|
+
|
|
48
|
+
[tool.ruff]
|
|
49
|
+
line-length = 100
|
|
50
|
+
|
|
51
|
+
[tool.mypy]
|
|
52
|
+
python_version = "3.10"
|
|
53
|
+
warn_return_any = true
|
|
54
|
+
warn_unused_ignores = true
|
|
55
|
+
no_implicit_optional = true
|
|
56
|
+
strict_optional = true
|
|
57
|
+
ignore_missing_imports = true
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
"""reconkit.
|
|
2
|
-
|
|
3
|
-
Public API: Noir Stack / Hexarch / Judicium surface lives under `reconkit.noir`.
|
|
4
|
-
Internal modules remain available but are not the supported public interface.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
__version__ = "0.2.
|
|
8
|
-
|
|
9
|
-
from reconkit.noir.primitives import ( # noqa: E402
|
|
10
|
-
EvidenceArtifact,
|
|
11
|
-
EvidenceBundle,
|
|
12
|
-
ProvenanceRecord,
|
|
13
|
-
VerificationResult,
|
|
14
|
-
)
|
|
15
|
-
|
|
16
|
-
__all__ = [
|
|
17
|
-
"__version__",
|
|
18
|
-
"EvidenceArtifact",
|
|
19
|
-
"EvidenceBundle",
|
|
20
|
-
"ProvenanceRecord",
|
|
21
|
-
"VerificationResult",
|
|
22
|
-
]
|
|
1
|
+
"""reconkit.
|
|
2
|
+
|
|
3
|
+
Public API: Noir Stack / Hexarch / Judicium surface lives under `reconkit.noir`.
|
|
4
|
+
Internal modules remain available but are not the supported public interface.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
__version__ = "0.2.1"
|
|
8
|
+
|
|
9
|
+
from reconkit.noir.primitives import ( # noqa: E402
|
|
10
|
+
EvidenceArtifact,
|
|
11
|
+
EvidenceBundle,
|
|
12
|
+
ProvenanceRecord,
|
|
13
|
+
VerificationResult,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"__version__",
|
|
18
|
+
"EvidenceArtifact",
|
|
19
|
+
"EvidenceBundle",
|
|
20
|
+
"ProvenanceRecord",
|
|
21
|
+
"VerificationResult",
|
|
22
|
+
]
|