From f91080e189780140e602f84638976fc35ffd4b22 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Thu, 14 Sep 2023 13:20:54 +0200
Subject: [PATCH 01/41] move test data

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 tests/__init__.py                                          | 3 ++-
 tests/{fixtures => _data/own}/README.md                    | 0
 .../{fixtures => _data/own}/json/1.2/bom_dependencies.json | 0
 .../own}/json/1.2/bom_dependencies_component.json          | 0
 .../own}/json/1.2/bom_external_references.json             | 0
 .../own}/json/1.2/bom_issue_275_components.json            | 0
 .../own}/json/1.2/bom_issue_328_components.json            | 0
 .../own}/json/1.2/bom_services_complex.json                | 0
 .../own}/json/1.2/bom_services_nested.json                 | 0
 .../own}/json/1.2/bom_services_simple.json                 | 0
 tests/{fixtures => _data/own}/json/1.2/bom_setuptools.json | 0
 .../own}/json/1.2/bom_setuptools_complete.json             | 0
 .../own}/json/1.2/bom_setuptools_no_version.json           | 0
 .../own}/json/1.2/bom_setuptools_with_cpe.json             | 0
 tests/{fixtures => _data/own}/json/1.2/bom_toml_1.json     | 0
 .../own}/json/1.2/bom_with_full_metadata.json              | 0
 .../{fixtures => _data/own}/json/1.3/bom_dependencies.json | 0
 .../own}/json/1.3/bom_dependencies_component.json          | 0
 .../own}/json/1.3/bom_external_references.json             | 0
 .../own}/json/1.3/bom_issue_275_components.json            | 0
 .../own}/json/1.3/bom_issue_328_components.json            | 0
 .../own}/json/1.3/bom_services_complex.json                | 0
 .../own}/json/1.3/bom_services_nested.json                 | 0
 .../own}/json/1.3/bom_services_simple.json                 | 0
 tests/{fixtures => _data/own}/json/1.3/bom_setuptools.json | 0
 .../own}/json/1.3/bom_setuptools_complete.json             | 0
 .../own}/json/1.3/bom_setuptools_no_version.json           | 0
 .../own}/json/1.3/bom_setuptools_with_cpe.json             | 0
 tests/{fixtures => _data/own}/json/1.3/bom_toml_1.json     | 0
 .../own}/json/1.3/bom_with_full_metadata.json              | 0
 .../{fixtures => _data/own}/json/1.4/bom_dependencies.json | 0
 .../own}/json/1.4/bom_dependencies_component.json          | 0
 .../own}/json/1.4/bom_external_references.json             | 0
 .../own}/json/1.4/bom_issue_275_components.json            | 0
 .../own}/json/1.4/bom_issue_328_components.json            | 0
 .../own}/json/1.4/bom_services_complex.json                | 0
 .../own}/json/1.4/bom_services_nested.json                 | 0
 .../own}/json/1.4/bom_services_simple.json                 | 0
 tests/{fixtures => _data/own}/json/1.4/bom_setuptools.json | 0
 .../own}/json/1.4/bom_setuptools_complete.json             | 0
 .../own}/json/1.4/bom_setuptools_no_version.json           | 0
 .../own}/json/1.4/bom_setuptools_with_cpe.json             | 0
 .../own}/json/1.4/bom_setuptools_with_release_notes.json   | 0
 .../own}/json/1.4/bom_setuptools_with_vulnerabilities.json | 0
 tests/{fixtures => _data/own}/json/1.4/bom_toml_1.json     | 0
 .../own}/json/1.4/bom_with_dependencies_hanging.json       | 0
 .../own}/json/1.4/bom_with_full_metadata.json              | 0
 tests/{fixtures => _data/own}/xml/1.0/bom_empty.xml        | 0
 .../own}/xml/1.0/bom_issue_275_components.xml              | 0
 .../own}/xml/1.0/bom_issue_328_components.xml              | 0
 tests/{fixtures => _data/own}/xml/1.0/bom_setuptools.xml   | 0
 .../own}/xml/1.0/bom_setuptools_complete.xml               | 0
 .../own}/xml/1.0/bom_setuptools_no_version.xml             | 0
 .../own}/xml/1.0/bom_setuptools_with_cpe.xml               | 0
 .../own}/xml/1.0/bom_toml_hashes_and_references.xml        | 0
 tests/{fixtures => _data/own}/xml/1.1/bom_dependencies.xml | 0
 tests/{fixtures => _data/own}/xml/1.1/bom_empty.xml        | 0
 .../own}/xml/1.1/bom_external_references.xml               | 0
 .../own}/xml/1.1/bom_issue_275_components.xml              | 0
 .../own}/xml/1.1/bom_issue_328_components.xml              | 0
 tests/{fixtures => _data/own}/xml/1.1/bom_setuptools.xml   | 0
 .../own}/xml/1.1/bom_setuptools_complete.xml               | 0
 .../own}/xml/1.1/bom_setuptools_no_version.xml             | 0
 .../own}/xml/1.1/bom_setuptools_with_cpe.xml               | 0
 .../own}/xml/1.1/bom_setuptools_with_vulnerabilities.xml   | 0
 .../own}/xml/1.1/bom_toml_hashes_and_references.xml        | 0
 tests/{fixtures => _data/own}/xml/1.2/bom_dependencies.xml | 0
 .../own}/xml/1.2/bom_dependencies_component.xml            | 0
 .../own}/xml/1.2/bom_external_references.xml               | 0
 .../own}/xml/1.2/bom_issue_275_components.xml              | 0
 .../own}/xml/1.2/bom_issue_328_components.xml              | 0
 .../own}/xml/1.2/bom_services_complex.xml                  | 0
 .../own}/xml/1.2/bom_services_nested.xml                   | 0
 .../own}/xml/1.2/bom_services_simple.xml                   | 0
 tests/{fixtures => _data/own}/xml/1.2/bom_setuptools.xml   | 0
 .../own}/xml/1.2/bom_setuptools_complete.xml               | 0
 .../own}/xml/1.2/bom_setuptools_no_version.xml             | 0
 .../own}/xml/1.2/bom_setuptools_with_cpe.xml               | 0
 .../own}/xml/1.2/bom_setuptools_with_vulnerabilities.xml   | 0
 .../own}/xml/1.2/bom_toml_hashes_and_references.xml        | 0
 .../own}/xml/1.2/bom_with_full_metadata.xml                | 0
 tests/{fixtures => _data/own}/xml/1.3/bom_dependencies.xml | 0
 .../own}/xml/1.3/bom_dependencies_component.xml            | 0
 .../own}/xml/1.3/bom_external_references.xml               | 0
 .../own}/xml/1.3/bom_issue_275_components.xml              | 0
 .../own}/xml/1.3/bom_issue_328_components.xml              | 0
 .../own}/xml/1.3/bom_services_complex.xml                  | 0
 .../own}/xml/1.3/bom_services_nested.xml                   | 0
 .../own}/xml/1.3/bom_services_simple.xml                   | 0
 tests/{fixtures => _data/own}/xml/1.3/bom_setuptools.xml   | 0
 .../own}/xml/1.3/bom_setuptools_complete.xml               | 0
 .../own}/xml/1.3/bom_setuptools_no_version.xml             | 0
 .../own}/xml/1.3/bom_setuptools_with_cpe.xml               | 0
 .../own}/xml/1.3/bom_setuptools_with_vulnerabilities.xml   | 0
 .../own}/xml/1.3/bom_toml_hashes_and_references.xml        | 0
 .../own}/xml/1.3/bom_with_full_metadata.xml                | 0
 tests/{fixtures => _data/own}/xml/1.4/bom_dependencies.xml | 0
 .../own}/xml/1.4/bom_dependencies_component.xml            | 0
 .../own}/xml/1.4/bom_external_references.xml               | 0
 .../own}/xml/1.4/bom_issue_275_components.xml              | 0
 .../own}/xml/1.4/bom_issue_328_components.xml              | 0
 .../own}/xml/1.4/bom_services_complex.xml                  | 0
 .../own}/xml/1.4/bom_services_nested.xml                   | 0
 .../own}/xml/1.4/bom_services_simple.xml                   | 0
 tests/{fixtures => _data/own}/xml/1.4/bom_setuptools.xml   | 0
 .../own}/xml/1.4/bom_setuptools_complete.xml               | 0
 .../own}/xml/1.4/bom_setuptools_no_version.xml             | 0
 .../own}/xml/1.4/bom_setuptools_with_cpe.xml               | 0
 .../own}/xml/1.4/bom_setuptools_with_release_notes.xml     | 0
 .../own}/xml/1.4/bom_setuptools_with_vulnerabilities.xml   | 0
 .../own}/xml/1.4/bom_toml_hashes_and_references.xml        | 0
 .../own}/xml/1.4/bom_with_dependencies_hanging.xml         | 0
 .../own}/xml/1.4/bom_with_full_metadata.xml                | 0
 tests/{fixtures => _data/own}/xml/1.4/webgoat-6.1.xml      | 0
 tests/test_component.py                                    | 6 ++++--
 tests/test_deserialize_json.py                             | 7 +++++--
 tests/test_deserialize_xml.py                              | 5 ++++-
 tests/test_output_json.py                                  | 7 +++++--
 tests/test_output_xml.py                                   | 6 ++++--
 tests/test_real_world_examples.py                          | 6 +++++-
 120 files changed, 29 insertions(+), 11 deletions(-)
 rename tests/{fixtures => _data/own}/README.md (100%)
 rename tests/{fixtures => _data/own}/json/1.2/bom_dependencies.json (100%)
 rename tests/{fixtures => _data/own}/json/1.2/bom_dependencies_component.json (100%)
 rename tests/{fixtures => _data/own}/json/1.2/bom_external_references.json (100%)
 rename tests/{fixtures => _data/own}/json/1.2/bom_issue_275_components.json (100%)
 rename tests/{fixtures => _data/own}/json/1.2/bom_issue_328_components.json (100%)
 rename tests/{fixtures => _data/own}/json/1.2/bom_services_complex.json (100%)
 rename tests/{fixtures => _data/own}/json/1.2/bom_services_nested.json (100%)
 rename tests/{fixtures => _data/own}/json/1.2/bom_services_simple.json (100%)
 rename tests/{fixtures => _data/own}/json/1.2/bom_setuptools.json (100%)
 rename tests/{fixtures => _data/own}/json/1.2/bom_setuptools_complete.json (100%)
 rename tests/{fixtures => _data/own}/json/1.2/bom_setuptools_no_version.json (100%)
 rename tests/{fixtures => _data/own}/json/1.2/bom_setuptools_with_cpe.json (100%)
 rename tests/{fixtures => _data/own}/json/1.2/bom_toml_1.json (100%)
 rename tests/{fixtures => _data/own}/json/1.2/bom_with_full_metadata.json (100%)
 rename tests/{fixtures => _data/own}/json/1.3/bom_dependencies.json (100%)
 rename tests/{fixtures => _data/own}/json/1.3/bom_dependencies_component.json (100%)
 rename tests/{fixtures => _data/own}/json/1.3/bom_external_references.json (100%)
 rename tests/{fixtures => _data/own}/json/1.3/bom_issue_275_components.json (100%)
 rename tests/{fixtures => _data/own}/json/1.3/bom_issue_328_components.json (100%)
 rename tests/{fixtures => _data/own}/json/1.3/bom_services_complex.json (100%)
 rename tests/{fixtures => _data/own}/json/1.3/bom_services_nested.json (100%)
 rename tests/{fixtures => _data/own}/json/1.3/bom_services_simple.json (100%)
 rename tests/{fixtures => _data/own}/json/1.3/bom_setuptools.json (100%)
 rename tests/{fixtures => _data/own}/json/1.3/bom_setuptools_complete.json (100%)
 rename tests/{fixtures => _data/own}/json/1.3/bom_setuptools_no_version.json (100%)
 rename tests/{fixtures => _data/own}/json/1.3/bom_setuptools_with_cpe.json (100%)
 rename tests/{fixtures => _data/own}/json/1.3/bom_toml_1.json (100%)
 rename tests/{fixtures => _data/own}/json/1.3/bom_with_full_metadata.json (100%)
 rename tests/{fixtures => _data/own}/json/1.4/bom_dependencies.json (100%)
 rename tests/{fixtures => _data/own}/json/1.4/bom_dependencies_component.json (100%)
 rename tests/{fixtures => _data/own}/json/1.4/bom_external_references.json (100%)
 rename tests/{fixtures => _data/own}/json/1.4/bom_issue_275_components.json (100%)
 rename tests/{fixtures => _data/own}/json/1.4/bom_issue_328_components.json (100%)
 rename tests/{fixtures => _data/own}/json/1.4/bom_services_complex.json (100%)
 rename tests/{fixtures => _data/own}/json/1.4/bom_services_nested.json (100%)
 rename tests/{fixtures => _data/own}/json/1.4/bom_services_simple.json (100%)
 rename tests/{fixtures => _data/own}/json/1.4/bom_setuptools.json (100%)
 rename tests/{fixtures => _data/own}/json/1.4/bom_setuptools_complete.json (100%)
 rename tests/{fixtures => _data/own}/json/1.4/bom_setuptools_no_version.json (100%)
 rename tests/{fixtures => _data/own}/json/1.4/bom_setuptools_with_cpe.json (100%)
 rename tests/{fixtures => _data/own}/json/1.4/bom_setuptools_with_release_notes.json (100%)
 rename tests/{fixtures => _data/own}/json/1.4/bom_setuptools_with_vulnerabilities.json (100%)
 rename tests/{fixtures => _data/own}/json/1.4/bom_toml_1.json (100%)
 rename tests/{fixtures => _data/own}/json/1.4/bom_with_dependencies_hanging.json (100%)
 rename tests/{fixtures => _data/own}/json/1.4/bom_with_full_metadata.json (100%)
 rename tests/{fixtures => _data/own}/xml/1.0/bom_empty.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.0/bom_issue_275_components.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.0/bom_issue_328_components.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.0/bom_setuptools.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.0/bom_setuptools_complete.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.0/bom_setuptools_no_version.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.0/bom_setuptools_with_cpe.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.0/bom_toml_hashes_and_references.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.1/bom_dependencies.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.1/bom_empty.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.1/bom_external_references.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.1/bom_issue_275_components.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.1/bom_issue_328_components.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.1/bom_setuptools.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.1/bom_setuptools_complete.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.1/bom_setuptools_no_version.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.1/bom_setuptools_with_cpe.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.1/bom_setuptools_with_vulnerabilities.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.1/bom_toml_hashes_and_references.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.2/bom_dependencies.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.2/bom_dependencies_component.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.2/bom_external_references.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.2/bom_issue_275_components.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.2/bom_issue_328_components.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.2/bom_services_complex.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.2/bom_services_nested.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.2/bom_services_simple.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.2/bom_setuptools.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.2/bom_setuptools_complete.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.2/bom_setuptools_no_version.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.2/bom_setuptools_with_cpe.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.2/bom_setuptools_with_vulnerabilities.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.2/bom_toml_hashes_and_references.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.2/bom_with_full_metadata.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.3/bom_dependencies.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.3/bom_dependencies_component.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.3/bom_external_references.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.3/bom_issue_275_components.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.3/bom_issue_328_components.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.3/bom_services_complex.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.3/bom_services_nested.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.3/bom_services_simple.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.3/bom_setuptools.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.3/bom_setuptools_complete.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.3/bom_setuptools_no_version.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.3/bom_setuptools_with_cpe.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.3/bom_setuptools_with_vulnerabilities.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.3/bom_toml_hashes_and_references.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.3/bom_with_full_metadata.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.4/bom_dependencies.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.4/bom_dependencies_component.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.4/bom_external_references.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.4/bom_issue_275_components.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.4/bom_issue_328_components.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.4/bom_services_complex.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.4/bom_services_nested.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.4/bom_services_simple.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.4/bom_setuptools.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.4/bom_setuptools_complete.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.4/bom_setuptools_no_version.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.4/bom_setuptools_with_cpe.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.4/bom_setuptools_with_release_notes.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.4/bom_setuptools_with_vulnerabilities.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.4/bom_toml_hashes_and_references.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.4/bom_with_dependencies_hanging.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.4/bom_with_full_metadata.xml (100%)
 rename tests/{fixtures => _data/own}/xml/1.4/webgoat-6.1.xml (100%)

diff --git a/tests/__init__.py b/tests/__init__.py
index 4c9653000..f2296f02b 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -21,9 +21,10 @@
 
 import cyclonedx
 
+# rework this path
 CDX_SCHEMA_DIRECTORY = path.join(path.dirname(cyclonedx.__file__), 'schema')
 
-FIXTURES_DIRECTORY = path.join(path.dirname(__file__), 'fixtures')
+TESTDATA_DIRECTORY = path.join(path.dirname(__file__),'_data')
 
 RECREATE_SNAPSHOTS = bool(getenv('CDX_TEST_RECREATE_SNAPSHOTS'))
 if RECREATE_SNAPSHOTS:
diff --git a/tests/fixtures/README.md b/tests/_data/own/README.md
similarity index 100%
rename from tests/fixtures/README.md
rename to tests/_data/own/README.md
diff --git a/tests/fixtures/json/1.2/bom_dependencies.json b/tests/_data/own/json/1.2/bom_dependencies.json
similarity index 100%
rename from tests/fixtures/json/1.2/bom_dependencies.json
rename to tests/_data/own/json/1.2/bom_dependencies.json
diff --git a/tests/fixtures/json/1.2/bom_dependencies_component.json b/tests/_data/own/json/1.2/bom_dependencies_component.json
similarity index 100%
rename from tests/fixtures/json/1.2/bom_dependencies_component.json
rename to tests/_data/own/json/1.2/bom_dependencies_component.json
diff --git a/tests/fixtures/json/1.2/bom_external_references.json b/tests/_data/own/json/1.2/bom_external_references.json
similarity index 100%
rename from tests/fixtures/json/1.2/bom_external_references.json
rename to tests/_data/own/json/1.2/bom_external_references.json
diff --git a/tests/fixtures/json/1.2/bom_issue_275_components.json b/tests/_data/own/json/1.2/bom_issue_275_components.json
similarity index 100%
rename from tests/fixtures/json/1.2/bom_issue_275_components.json
rename to tests/_data/own/json/1.2/bom_issue_275_components.json
diff --git a/tests/fixtures/json/1.2/bom_issue_328_components.json b/tests/_data/own/json/1.2/bom_issue_328_components.json
similarity index 100%
rename from tests/fixtures/json/1.2/bom_issue_328_components.json
rename to tests/_data/own/json/1.2/bom_issue_328_components.json
diff --git a/tests/fixtures/json/1.2/bom_services_complex.json b/tests/_data/own/json/1.2/bom_services_complex.json
similarity index 100%
rename from tests/fixtures/json/1.2/bom_services_complex.json
rename to tests/_data/own/json/1.2/bom_services_complex.json
diff --git a/tests/fixtures/json/1.2/bom_services_nested.json b/tests/_data/own/json/1.2/bom_services_nested.json
similarity index 100%
rename from tests/fixtures/json/1.2/bom_services_nested.json
rename to tests/_data/own/json/1.2/bom_services_nested.json
diff --git a/tests/fixtures/json/1.2/bom_services_simple.json b/tests/_data/own/json/1.2/bom_services_simple.json
similarity index 100%
rename from tests/fixtures/json/1.2/bom_services_simple.json
rename to tests/_data/own/json/1.2/bom_services_simple.json
diff --git a/tests/fixtures/json/1.2/bom_setuptools.json b/tests/_data/own/json/1.2/bom_setuptools.json
similarity index 100%
rename from tests/fixtures/json/1.2/bom_setuptools.json
rename to tests/_data/own/json/1.2/bom_setuptools.json
diff --git a/tests/fixtures/json/1.2/bom_setuptools_complete.json b/tests/_data/own/json/1.2/bom_setuptools_complete.json
similarity index 100%
rename from tests/fixtures/json/1.2/bom_setuptools_complete.json
rename to tests/_data/own/json/1.2/bom_setuptools_complete.json
diff --git a/tests/fixtures/json/1.2/bom_setuptools_no_version.json b/tests/_data/own/json/1.2/bom_setuptools_no_version.json
similarity index 100%
rename from tests/fixtures/json/1.2/bom_setuptools_no_version.json
rename to tests/_data/own/json/1.2/bom_setuptools_no_version.json
diff --git a/tests/fixtures/json/1.2/bom_setuptools_with_cpe.json b/tests/_data/own/json/1.2/bom_setuptools_with_cpe.json
similarity index 100%
rename from tests/fixtures/json/1.2/bom_setuptools_with_cpe.json
rename to tests/_data/own/json/1.2/bom_setuptools_with_cpe.json
diff --git a/tests/fixtures/json/1.2/bom_toml_1.json b/tests/_data/own/json/1.2/bom_toml_1.json
similarity index 100%
rename from tests/fixtures/json/1.2/bom_toml_1.json
rename to tests/_data/own/json/1.2/bom_toml_1.json
diff --git a/tests/fixtures/json/1.2/bom_with_full_metadata.json b/tests/_data/own/json/1.2/bom_with_full_metadata.json
similarity index 100%
rename from tests/fixtures/json/1.2/bom_with_full_metadata.json
rename to tests/_data/own/json/1.2/bom_with_full_metadata.json
diff --git a/tests/fixtures/json/1.3/bom_dependencies.json b/tests/_data/own/json/1.3/bom_dependencies.json
similarity index 100%
rename from tests/fixtures/json/1.3/bom_dependencies.json
rename to tests/_data/own/json/1.3/bom_dependencies.json
diff --git a/tests/fixtures/json/1.3/bom_dependencies_component.json b/tests/_data/own/json/1.3/bom_dependencies_component.json
similarity index 100%
rename from tests/fixtures/json/1.3/bom_dependencies_component.json
rename to tests/_data/own/json/1.3/bom_dependencies_component.json
diff --git a/tests/fixtures/json/1.3/bom_external_references.json b/tests/_data/own/json/1.3/bom_external_references.json
similarity index 100%
rename from tests/fixtures/json/1.3/bom_external_references.json
rename to tests/_data/own/json/1.3/bom_external_references.json
diff --git a/tests/fixtures/json/1.3/bom_issue_275_components.json b/tests/_data/own/json/1.3/bom_issue_275_components.json
similarity index 100%
rename from tests/fixtures/json/1.3/bom_issue_275_components.json
rename to tests/_data/own/json/1.3/bom_issue_275_components.json
diff --git a/tests/fixtures/json/1.3/bom_issue_328_components.json b/tests/_data/own/json/1.3/bom_issue_328_components.json
similarity index 100%
rename from tests/fixtures/json/1.3/bom_issue_328_components.json
rename to tests/_data/own/json/1.3/bom_issue_328_components.json
diff --git a/tests/fixtures/json/1.3/bom_services_complex.json b/tests/_data/own/json/1.3/bom_services_complex.json
similarity index 100%
rename from tests/fixtures/json/1.3/bom_services_complex.json
rename to tests/_data/own/json/1.3/bom_services_complex.json
diff --git a/tests/fixtures/json/1.3/bom_services_nested.json b/tests/_data/own/json/1.3/bom_services_nested.json
similarity index 100%
rename from tests/fixtures/json/1.3/bom_services_nested.json
rename to tests/_data/own/json/1.3/bom_services_nested.json
diff --git a/tests/fixtures/json/1.3/bom_services_simple.json b/tests/_data/own/json/1.3/bom_services_simple.json
similarity index 100%
rename from tests/fixtures/json/1.3/bom_services_simple.json
rename to tests/_data/own/json/1.3/bom_services_simple.json
diff --git a/tests/fixtures/json/1.3/bom_setuptools.json b/tests/_data/own/json/1.3/bom_setuptools.json
similarity index 100%
rename from tests/fixtures/json/1.3/bom_setuptools.json
rename to tests/_data/own/json/1.3/bom_setuptools.json
diff --git a/tests/fixtures/json/1.3/bom_setuptools_complete.json b/tests/_data/own/json/1.3/bom_setuptools_complete.json
similarity index 100%
rename from tests/fixtures/json/1.3/bom_setuptools_complete.json
rename to tests/_data/own/json/1.3/bom_setuptools_complete.json
diff --git a/tests/fixtures/json/1.3/bom_setuptools_no_version.json b/tests/_data/own/json/1.3/bom_setuptools_no_version.json
similarity index 100%
rename from tests/fixtures/json/1.3/bom_setuptools_no_version.json
rename to tests/_data/own/json/1.3/bom_setuptools_no_version.json
diff --git a/tests/fixtures/json/1.3/bom_setuptools_with_cpe.json b/tests/_data/own/json/1.3/bom_setuptools_with_cpe.json
similarity index 100%
rename from tests/fixtures/json/1.3/bom_setuptools_with_cpe.json
rename to tests/_data/own/json/1.3/bom_setuptools_with_cpe.json
diff --git a/tests/fixtures/json/1.3/bom_toml_1.json b/tests/_data/own/json/1.3/bom_toml_1.json
similarity index 100%
rename from tests/fixtures/json/1.3/bom_toml_1.json
rename to tests/_data/own/json/1.3/bom_toml_1.json
diff --git a/tests/fixtures/json/1.3/bom_with_full_metadata.json b/tests/_data/own/json/1.3/bom_with_full_metadata.json
similarity index 100%
rename from tests/fixtures/json/1.3/bom_with_full_metadata.json
rename to tests/_data/own/json/1.3/bom_with_full_metadata.json
diff --git a/tests/fixtures/json/1.4/bom_dependencies.json b/tests/_data/own/json/1.4/bom_dependencies.json
similarity index 100%
rename from tests/fixtures/json/1.4/bom_dependencies.json
rename to tests/_data/own/json/1.4/bom_dependencies.json
diff --git a/tests/fixtures/json/1.4/bom_dependencies_component.json b/tests/_data/own/json/1.4/bom_dependencies_component.json
similarity index 100%
rename from tests/fixtures/json/1.4/bom_dependencies_component.json
rename to tests/_data/own/json/1.4/bom_dependencies_component.json
diff --git a/tests/fixtures/json/1.4/bom_external_references.json b/tests/_data/own/json/1.4/bom_external_references.json
similarity index 100%
rename from tests/fixtures/json/1.4/bom_external_references.json
rename to tests/_data/own/json/1.4/bom_external_references.json
diff --git a/tests/fixtures/json/1.4/bom_issue_275_components.json b/tests/_data/own/json/1.4/bom_issue_275_components.json
similarity index 100%
rename from tests/fixtures/json/1.4/bom_issue_275_components.json
rename to tests/_data/own/json/1.4/bom_issue_275_components.json
diff --git a/tests/fixtures/json/1.4/bom_issue_328_components.json b/tests/_data/own/json/1.4/bom_issue_328_components.json
similarity index 100%
rename from tests/fixtures/json/1.4/bom_issue_328_components.json
rename to tests/_data/own/json/1.4/bom_issue_328_components.json
diff --git a/tests/fixtures/json/1.4/bom_services_complex.json b/tests/_data/own/json/1.4/bom_services_complex.json
similarity index 100%
rename from tests/fixtures/json/1.4/bom_services_complex.json
rename to tests/_data/own/json/1.4/bom_services_complex.json
diff --git a/tests/fixtures/json/1.4/bom_services_nested.json b/tests/_data/own/json/1.4/bom_services_nested.json
similarity index 100%
rename from tests/fixtures/json/1.4/bom_services_nested.json
rename to tests/_data/own/json/1.4/bom_services_nested.json
diff --git a/tests/fixtures/json/1.4/bom_services_simple.json b/tests/_data/own/json/1.4/bom_services_simple.json
similarity index 100%
rename from tests/fixtures/json/1.4/bom_services_simple.json
rename to tests/_data/own/json/1.4/bom_services_simple.json
diff --git a/tests/fixtures/json/1.4/bom_setuptools.json b/tests/_data/own/json/1.4/bom_setuptools.json
similarity index 100%
rename from tests/fixtures/json/1.4/bom_setuptools.json
rename to tests/_data/own/json/1.4/bom_setuptools.json
diff --git a/tests/fixtures/json/1.4/bom_setuptools_complete.json b/tests/_data/own/json/1.4/bom_setuptools_complete.json
similarity index 100%
rename from tests/fixtures/json/1.4/bom_setuptools_complete.json
rename to tests/_data/own/json/1.4/bom_setuptools_complete.json
diff --git a/tests/fixtures/json/1.4/bom_setuptools_no_version.json b/tests/_data/own/json/1.4/bom_setuptools_no_version.json
similarity index 100%
rename from tests/fixtures/json/1.4/bom_setuptools_no_version.json
rename to tests/_data/own/json/1.4/bom_setuptools_no_version.json
diff --git a/tests/fixtures/json/1.4/bom_setuptools_with_cpe.json b/tests/_data/own/json/1.4/bom_setuptools_with_cpe.json
similarity index 100%
rename from tests/fixtures/json/1.4/bom_setuptools_with_cpe.json
rename to tests/_data/own/json/1.4/bom_setuptools_with_cpe.json
diff --git a/tests/fixtures/json/1.4/bom_setuptools_with_release_notes.json b/tests/_data/own/json/1.4/bom_setuptools_with_release_notes.json
similarity index 100%
rename from tests/fixtures/json/1.4/bom_setuptools_with_release_notes.json
rename to tests/_data/own/json/1.4/bom_setuptools_with_release_notes.json
diff --git a/tests/fixtures/json/1.4/bom_setuptools_with_vulnerabilities.json b/tests/_data/own/json/1.4/bom_setuptools_with_vulnerabilities.json
similarity index 100%
rename from tests/fixtures/json/1.4/bom_setuptools_with_vulnerabilities.json
rename to tests/_data/own/json/1.4/bom_setuptools_with_vulnerabilities.json
diff --git a/tests/fixtures/json/1.4/bom_toml_1.json b/tests/_data/own/json/1.4/bom_toml_1.json
similarity index 100%
rename from tests/fixtures/json/1.4/bom_toml_1.json
rename to tests/_data/own/json/1.4/bom_toml_1.json
diff --git a/tests/fixtures/json/1.4/bom_with_dependencies_hanging.json b/tests/_data/own/json/1.4/bom_with_dependencies_hanging.json
similarity index 100%
rename from tests/fixtures/json/1.4/bom_with_dependencies_hanging.json
rename to tests/_data/own/json/1.4/bom_with_dependencies_hanging.json
diff --git a/tests/fixtures/json/1.4/bom_with_full_metadata.json b/tests/_data/own/json/1.4/bom_with_full_metadata.json
similarity index 100%
rename from tests/fixtures/json/1.4/bom_with_full_metadata.json
rename to tests/_data/own/json/1.4/bom_with_full_metadata.json
diff --git a/tests/fixtures/xml/1.0/bom_empty.xml b/tests/_data/own/xml/1.0/bom_empty.xml
similarity index 100%
rename from tests/fixtures/xml/1.0/bom_empty.xml
rename to tests/_data/own/xml/1.0/bom_empty.xml
diff --git a/tests/fixtures/xml/1.0/bom_issue_275_components.xml b/tests/_data/own/xml/1.0/bom_issue_275_components.xml
similarity index 100%
rename from tests/fixtures/xml/1.0/bom_issue_275_components.xml
rename to tests/_data/own/xml/1.0/bom_issue_275_components.xml
diff --git a/tests/fixtures/xml/1.0/bom_issue_328_components.xml b/tests/_data/own/xml/1.0/bom_issue_328_components.xml
similarity index 100%
rename from tests/fixtures/xml/1.0/bom_issue_328_components.xml
rename to tests/_data/own/xml/1.0/bom_issue_328_components.xml
diff --git a/tests/fixtures/xml/1.0/bom_setuptools.xml b/tests/_data/own/xml/1.0/bom_setuptools.xml
similarity index 100%
rename from tests/fixtures/xml/1.0/bom_setuptools.xml
rename to tests/_data/own/xml/1.0/bom_setuptools.xml
diff --git a/tests/fixtures/xml/1.0/bom_setuptools_complete.xml b/tests/_data/own/xml/1.0/bom_setuptools_complete.xml
similarity index 100%
rename from tests/fixtures/xml/1.0/bom_setuptools_complete.xml
rename to tests/_data/own/xml/1.0/bom_setuptools_complete.xml
diff --git a/tests/fixtures/xml/1.0/bom_setuptools_no_version.xml b/tests/_data/own/xml/1.0/bom_setuptools_no_version.xml
similarity index 100%
rename from tests/fixtures/xml/1.0/bom_setuptools_no_version.xml
rename to tests/_data/own/xml/1.0/bom_setuptools_no_version.xml
diff --git a/tests/fixtures/xml/1.0/bom_setuptools_with_cpe.xml b/tests/_data/own/xml/1.0/bom_setuptools_with_cpe.xml
similarity index 100%
rename from tests/fixtures/xml/1.0/bom_setuptools_with_cpe.xml
rename to tests/_data/own/xml/1.0/bom_setuptools_with_cpe.xml
diff --git a/tests/fixtures/xml/1.0/bom_toml_hashes_and_references.xml b/tests/_data/own/xml/1.0/bom_toml_hashes_and_references.xml
similarity index 100%
rename from tests/fixtures/xml/1.0/bom_toml_hashes_and_references.xml
rename to tests/_data/own/xml/1.0/bom_toml_hashes_and_references.xml
diff --git a/tests/fixtures/xml/1.1/bom_dependencies.xml b/tests/_data/own/xml/1.1/bom_dependencies.xml
similarity index 100%
rename from tests/fixtures/xml/1.1/bom_dependencies.xml
rename to tests/_data/own/xml/1.1/bom_dependencies.xml
diff --git a/tests/fixtures/xml/1.1/bom_empty.xml b/tests/_data/own/xml/1.1/bom_empty.xml
similarity index 100%
rename from tests/fixtures/xml/1.1/bom_empty.xml
rename to tests/_data/own/xml/1.1/bom_empty.xml
diff --git a/tests/fixtures/xml/1.1/bom_external_references.xml b/tests/_data/own/xml/1.1/bom_external_references.xml
similarity index 100%
rename from tests/fixtures/xml/1.1/bom_external_references.xml
rename to tests/_data/own/xml/1.1/bom_external_references.xml
diff --git a/tests/fixtures/xml/1.1/bom_issue_275_components.xml b/tests/_data/own/xml/1.1/bom_issue_275_components.xml
similarity index 100%
rename from tests/fixtures/xml/1.1/bom_issue_275_components.xml
rename to tests/_data/own/xml/1.1/bom_issue_275_components.xml
diff --git a/tests/fixtures/xml/1.1/bom_issue_328_components.xml b/tests/_data/own/xml/1.1/bom_issue_328_components.xml
similarity index 100%
rename from tests/fixtures/xml/1.1/bom_issue_328_components.xml
rename to tests/_data/own/xml/1.1/bom_issue_328_components.xml
diff --git a/tests/fixtures/xml/1.1/bom_setuptools.xml b/tests/_data/own/xml/1.1/bom_setuptools.xml
similarity index 100%
rename from tests/fixtures/xml/1.1/bom_setuptools.xml
rename to tests/_data/own/xml/1.1/bom_setuptools.xml
diff --git a/tests/fixtures/xml/1.1/bom_setuptools_complete.xml b/tests/_data/own/xml/1.1/bom_setuptools_complete.xml
similarity index 100%
rename from tests/fixtures/xml/1.1/bom_setuptools_complete.xml
rename to tests/_data/own/xml/1.1/bom_setuptools_complete.xml
diff --git a/tests/fixtures/xml/1.1/bom_setuptools_no_version.xml b/tests/_data/own/xml/1.1/bom_setuptools_no_version.xml
similarity index 100%
rename from tests/fixtures/xml/1.1/bom_setuptools_no_version.xml
rename to tests/_data/own/xml/1.1/bom_setuptools_no_version.xml
diff --git a/tests/fixtures/xml/1.1/bom_setuptools_with_cpe.xml b/tests/_data/own/xml/1.1/bom_setuptools_with_cpe.xml
similarity index 100%
rename from tests/fixtures/xml/1.1/bom_setuptools_with_cpe.xml
rename to tests/_data/own/xml/1.1/bom_setuptools_with_cpe.xml
diff --git a/tests/fixtures/xml/1.1/bom_setuptools_with_vulnerabilities.xml b/tests/_data/own/xml/1.1/bom_setuptools_with_vulnerabilities.xml
similarity index 100%
rename from tests/fixtures/xml/1.1/bom_setuptools_with_vulnerabilities.xml
rename to tests/_data/own/xml/1.1/bom_setuptools_with_vulnerabilities.xml
diff --git a/tests/fixtures/xml/1.1/bom_toml_hashes_and_references.xml b/tests/_data/own/xml/1.1/bom_toml_hashes_and_references.xml
similarity index 100%
rename from tests/fixtures/xml/1.1/bom_toml_hashes_and_references.xml
rename to tests/_data/own/xml/1.1/bom_toml_hashes_and_references.xml
diff --git a/tests/fixtures/xml/1.2/bom_dependencies.xml b/tests/_data/own/xml/1.2/bom_dependencies.xml
similarity index 100%
rename from tests/fixtures/xml/1.2/bom_dependencies.xml
rename to tests/_data/own/xml/1.2/bom_dependencies.xml
diff --git a/tests/fixtures/xml/1.2/bom_dependencies_component.xml b/tests/_data/own/xml/1.2/bom_dependencies_component.xml
similarity index 100%
rename from tests/fixtures/xml/1.2/bom_dependencies_component.xml
rename to tests/_data/own/xml/1.2/bom_dependencies_component.xml
diff --git a/tests/fixtures/xml/1.2/bom_external_references.xml b/tests/_data/own/xml/1.2/bom_external_references.xml
similarity index 100%
rename from tests/fixtures/xml/1.2/bom_external_references.xml
rename to tests/_data/own/xml/1.2/bom_external_references.xml
diff --git a/tests/fixtures/xml/1.2/bom_issue_275_components.xml b/tests/_data/own/xml/1.2/bom_issue_275_components.xml
similarity index 100%
rename from tests/fixtures/xml/1.2/bom_issue_275_components.xml
rename to tests/_data/own/xml/1.2/bom_issue_275_components.xml
diff --git a/tests/fixtures/xml/1.2/bom_issue_328_components.xml b/tests/_data/own/xml/1.2/bom_issue_328_components.xml
similarity index 100%
rename from tests/fixtures/xml/1.2/bom_issue_328_components.xml
rename to tests/_data/own/xml/1.2/bom_issue_328_components.xml
diff --git a/tests/fixtures/xml/1.2/bom_services_complex.xml b/tests/_data/own/xml/1.2/bom_services_complex.xml
similarity index 100%
rename from tests/fixtures/xml/1.2/bom_services_complex.xml
rename to tests/_data/own/xml/1.2/bom_services_complex.xml
diff --git a/tests/fixtures/xml/1.2/bom_services_nested.xml b/tests/_data/own/xml/1.2/bom_services_nested.xml
similarity index 100%
rename from tests/fixtures/xml/1.2/bom_services_nested.xml
rename to tests/_data/own/xml/1.2/bom_services_nested.xml
diff --git a/tests/fixtures/xml/1.2/bom_services_simple.xml b/tests/_data/own/xml/1.2/bom_services_simple.xml
similarity index 100%
rename from tests/fixtures/xml/1.2/bom_services_simple.xml
rename to tests/_data/own/xml/1.2/bom_services_simple.xml
diff --git a/tests/fixtures/xml/1.2/bom_setuptools.xml b/tests/_data/own/xml/1.2/bom_setuptools.xml
similarity index 100%
rename from tests/fixtures/xml/1.2/bom_setuptools.xml
rename to tests/_data/own/xml/1.2/bom_setuptools.xml
diff --git a/tests/fixtures/xml/1.2/bom_setuptools_complete.xml b/tests/_data/own/xml/1.2/bom_setuptools_complete.xml
similarity index 100%
rename from tests/fixtures/xml/1.2/bom_setuptools_complete.xml
rename to tests/_data/own/xml/1.2/bom_setuptools_complete.xml
diff --git a/tests/fixtures/xml/1.2/bom_setuptools_no_version.xml b/tests/_data/own/xml/1.2/bom_setuptools_no_version.xml
similarity index 100%
rename from tests/fixtures/xml/1.2/bom_setuptools_no_version.xml
rename to tests/_data/own/xml/1.2/bom_setuptools_no_version.xml
diff --git a/tests/fixtures/xml/1.2/bom_setuptools_with_cpe.xml b/tests/_data/own/xml/1.2/bom_setuptools_with_cpe.xml
similarity index 100%
rename from tests/fixtures/xml/1.2/bom_setuptools_with_cpe.xml
rename to tests/_data/own/xml/1.2/bom_setuptools_with_cpe.xml
diff --git a/tests/fixtures/xml/1.2/bom_setuptools_with_vulnerabilities.xml b/tests/_data/own/xml/1.2/bom_setuptools_with_vulnerabilities.xml
similarity index 100%
rename from tests/fixtures/xml/1.2/bom_setuptools_with_vulnerabilities.xml
rename to tests/_data/own/xml/1.2/bom_setuptools_with_vulnerabilities.xml
diff --git a/tests/fixtures/xml/1.2/bom_toml_hashes_and_references.xml b/tests/_data/own/xml/1.2/bom_toml_hashes_and_references.xml
similarity index 100%
rename from tests/fixtures/xml/1.2/bom_toml_hashes_and_references.xml
rename to tests/_data/own/xml/1.2/bom_toml_hashes_and_references.xml
diff --git a/tests/fixtures/xml/1.2/bom_with_full_metadata.xml b/tests/_data/own/xml/1.2/bom_with_full_metadata.xml
similarity index 100%
rename from tests/fixtures/xml/1.2/bom_with_full_metadata.xml
rename to tests/_data/own/xml/1.2/bom_with_full_metadata.xml
diff --git a/tests/fixtures/xml/1.3/bom_dependencies.xml b/tests/_data/own/xml/1.3/bom_dependencies.xml
similarity index 100%
rename from tests/fixtures/xml/1.3/bom_dependencies.xml
rename to tests/_data/own/xml/1.3/bom_dependencies.xml
diff --git a/tests/fixtures/xml/1.3/bom_dependencies_component.xml b/tests/_data/own/xml/1.3/bom_dependencies_component.xml
similarity index 100%
rename from tests/fixtures/xml/1.3/bom_dependencies_component.xml
rename to tests/_data/own/xml/1.3/bom_dependencies_component.xml
diff --git a/tests/fixtures/xml/1.3/bom_external_references.xml b/tests/_data/own/xml/1.3/bom_external_references.xml
similarity index 100%
rename from tests/fixtures/xml/1.3/bom_external_references.xml
rename to tests/_data/own/xml/1.3/bom_external_references.xml
diff --git a/tests/fixtures/xml/1.3/bom_issue_275_components.xml b/tests/_data/own/xml/1.3/bom_issue_275_components.xml
similarity index 100%
rename from tests/fixtures/xml/1.3/bom_issue_275_components.xml
rename to tests/_data/own/xml/1.3/bom_issue_275_components.xml
diff --git a/tests/fixtures/xml/1.3/bom_issue_328_components.xml b/tests/_data/own/xml/1.3/bom_issue_328_components.xml
similarity index 100%
rename from tests/fixtures/xml/1.3/bom_issue_328_components.xml
rename to tests/_data/own/xml/1.3/bom_issue_328_components.xml
diff --git a/tests/fixtures/xml/1.3/bom_services_complex.xml b/tests/_data/own/xml/1.3/bom_services_complex.xml
similarity index 100%
rename from tests/fixtures/xml/1.3/bom_services_complex.xml
rename to tests/_data/own/xml/1.3/bom_services_complex.xml
diff --git a/tests/fixtures/xml/1.3/bom_services_nested.xml b/tests/_data/own/xml/1.3/bom_services_nested.xml
similarity index 100%
rename from tests/fixtures/xml/1.3/bom_services_nested.xml
rename to tests/_data/own/xml/1.3/bom_services_nested.xml
diff --git a/tests/fixtures/xml/1.3/bom_services_simple.xml b/tests/_data/own/xml/1.3/bom_services_simple.xml
similarity index 100%
rename from tests/fixtures/xml/1.3/bom_services_simple.xml
rename to tests/_data/own/xml/1.3/bom_services_simple.xml
diff --git a/tests/fixtures/xml/1.3/bom_setuptools.xml b/tests/_data/own/xml/1.3/bom_setuptools.xml
similarity index 100%
rename from tests/fixtures/xml/1.3/bom_setuptools.xml
rename to tests/_data/own/xml/1.3/bom_setuptools.xml
diff --git a/tests/fixtures/xml/1.3/bom_setuptools_complete.xml b/tests/_data/own/xml/1.3/bom_setuptools_complete.xml
similarity index 100%
rename from tests/fixtures/xml/1.3/bom_setuptools_complete.xml
rename to tests/_data/own/xml/1.3/bom_setuptools_complete.xml
diff --git a/tests/fixtures/xml/1.3/bom_setuptools_no_version.xml b/tests/_data/own/xml/1.3/bom_setuptools_no_version.xml
similarity index 100%
rename from tests/fixtures/xml/1.3/bom_setuptools_no_version.xml
rename to tests/_data/own/xml/1.3/bom_setuptools_no_version.xml
diff --git a/tests/fixtures/xml/1.3/bom_setuptools_with_cpe.xml b/tests/_data/own/xml/1.3/bom_setuptools_with_cpe.xml
similarity index 100%
rename from tests/fixtures/xml/1.3/bom_setuptools_with_cpe.xml
rename to tests/_data/own/xml/1.3/bom_setuptools_with_cpe.xml
diff --git a/tests/fixtures/xml/1.3/bom_setuptools_with_vulnerabilities.xml b/tests/_data/own/xml/1.3/bom_setuptools_with_vulnerabilities.xml
similarity index 100%
rename from tests/fixtures/xml/1.3/bom_setuptools_with_vulnerabilities.xml
rename to tests/_data/own/xml/1.3/bom_setuptools_with_vulnerabilities.xml
diff --git a/tests/fixtures/xml/1.3/bom_toml_hashes_and_references.xml b/tests/_data/own/xml/1.3/bom_toml_hashes_and_references.xml
similarity index 100%
rename from tests/fixtures/xml/1.3/bom_toml_hashes_and_references.xml
rename to tests/_data/own/xml/1.3/bom_toml_hashes_and_references.xml
diff --git a/tests/fixtures/xml/1.3/bom_with_full_metadata.xml b/tests/_data/own/xml/1.3/bom_with_full_metadata.xml
similarity index 100%
rename from tests/fixtures/xml/1.3/bom_with_full_metadata.xml
rename to tests/_data/own/xml/1.3/bom_with_full_metadata.xml
diff --git a/tests/fixtures/xml/1.4/bom_dependencies.xml b/tests/_data/own/xml/1.4/bom_dependencies.xml
similarity index 100%
rename from tests/fixtures/xml/1.4/bom_dependencies.xml
rename to tests/_data/own/xml/1.4/bom_dependencies.xml
diff --git a/tests/fixtures/xml/1.4/bom_dependencies_component.xml b/tests/_data/own/xml/1.4/bom_dependencies_component.xml
similarity index 100%
rename from tests/fixtures/xml/1.4/bom_dependencies_component.xml
rename to tests/_data/own/xml/1.4/bom_dependencies_component.xml
diff --git a/tests/fixtures/xml/1.4/bom_external_references.xml b/tests/_data/own/xml/1.4/bom_external_references.xml
similarity index 100%
rename from tests/fixtures/xml/1.4/bom_external_references.xml
rename to tests/_data/own/xml/1.4/bom_external_references.xml
diff --git a/tests/fixtures/xml/1.4/bom_issue_275_components.xml b/tests/_data/own/xml/1.4/bom_issue_275_components.xml
similarity index 100%
rename from tests/fixtures/xml/1.4/bom_issue_275_components.xml
rename to tests/_data/own/xml/1.4/bom_issue_275_components.xml
diff --git a/tests/fixtures/xml/1.4/bom_issue_328_components.xml b/tests/_data/own/xml/1.4/bom_issue_328_components.xml
similarity index 100%
rename from tests/fixtures/xml/1.4/bom_issue_328_components.xml
rename to tests/_data/own/xml/1.4/bom_issue_328_components.xml
diff --git a/tests/fixtures/xml/1.4/bom_services_complex.xml b/tests/_data/own/xml/1.4/bom_services_complex.xml
similarity index 100%
rename from tests/fixtures/xml/1.4/bom_services_complex.xml
rename to tests/_data/own/xml/1.4/bom_services_complex.xml
diff --git a/tests/fixtures/xml/1.4/bom_services_nested.xml b/tests/_data/own/xml/1.4/bom_services_nested.xml
similarity index 100%
rename from tests/fixtures/xml/1.4/bom_services_nested.xml
rename to tests/_data/own/xml/1.4/bom_services_nested.xml
diff --git a/tests/fixtures/xml/1.4/bom_services_simple.xml b/tests/_data/own/xml/1.4/bom_services_simple.xml
similarity index 100%
rename from tests/fixtures/xml/1.4/bom_services_simple.xml
rename to tests/_data/own/xml/1.4/bom_services_simple.xml
diff --git a/tests/fixtures/xml/1.4/bom_setuptools.xml b/tests/_data/own/xml/1.4/bom_setuptools.xml
similarity index 100%
rename from tests/fixtures/xml/1.4/bom_setuptools.xml
rename to tests/_data/own/xml/1.4/bom_setuptools.xml
diff --git a/tests/fixtures/xml/1.4/bom_setuptools_complete.xml b/tests/_data/own/xml/1.4/bom_setuptools_complete.xml
similarity index 100%
rename from tests/fixtures/xml/1.4/bom_setuptools_complete.xml
rename to tests/_data/own/xml/1.4/bom_setuptools_complete.xml
diff --git a/tests/fixtures/xml/1.4/bom_setuptools_no_version.xml b/tests/_data/own/xml/1.4/bom_setuptools_no_version.xml
similarity index 100%
rename from tests/fixtures/xml/1.4/bom_setuptools_no_version.xml
rename to tests/_data/own/xml/1.4/bom_setuptools_no_version.xml
diff --git a/tests/fixtures/xml/1.4/bom_setuptools_with_cpe.xml b/tests/_data/own/xml/1.4/bom_setuptools_with_cpe.xml
similarity index 100%
rename from tests/fixtures/xml/1.4/bom_setuptools_with_cpe.xml
rename to tests/_data/own/xml/1.4/bom_setuptools_with_cpe.xml
diff --git a/tests/fixtures/xml/1.4/bom_setuptools_with_release_notes.xml b/tests/_data/own/xml/1.4/bom_setuptools_with_release_notes.xml
similarity index 100%
rename from tests/fixtures/xml/1.4/bom_setuptools_with_release_notes.xml
rename to tests/_data/own/xml/1.4/bom_setuptools_with_release_notes.xml
diff --git a/tests/fixtures/xml/1.4/bom_setuptools_with_vulnerabilities.xml b/tests/_data/own/xml/1.4/bom_setuptools_with_vulnerabilities.xml
similarity index 100%
rename from tests/fixtures/xml/1.4/bom_setuptools_with_vulnerabilities.xml
rename to tests/_data/own/xml/1.4/bom_setuptools_with_vulnerabilities.xml
diff --git a/tests/fixtures/xml/1.4/bom_toml_hashes_and_references.xml b/tests/_data/own/xml/1.4/bom_toml_hashes_and_references.xml
similarity index 100%
rename from tests/fixtures/xml/1.4/bom_toml_hashes_and_references.xml
rename to tests/_data/own/xml/1.4/bom_toml_hashes_and_references.xml
diff --git a/tests/fixtures/xml/1.4/bom_with_dependencies_hanging.xml b/tests/_data/own/xml/1.4/bom_with_dependencies_hanging.xml
similarity index 100%
rename from tests/fixtures/xml/1.4/bom_with_dependencies_hanging.xml
rename to tests/_data/own/xml/1.4/bom_with_dependencies_hanging.xml
diff --git a/tests/fixtures/xml/1.4/bom_with_full_metadata.xml b/tests/_data/own/xml/1.4/bom_with_full_metadata.xml
similarity index 100%
rename from tests/fixtures/xml/1.4/bom_with_full_metadata.xml
rename to tests/_data/own/xml/1.4/bom_with_full_metadata.xml
diff --git a/tests/fixtures/xml/1.4/webgoat-6.1.xml b/tests/_data/own/xml/1.4/webgoat-6.1.xml
similarity index 100%
rename from tests/fixtures/xml/1.4/webgoat-6.1.xml
rename to tests/_data/own/xml/1.4/webgoat-6.1.xml
diff --git a/tests/test_component.py b/tests/test_component.py
index d1cf3dfc0..883d704f4 100644
--- a/tests/test_component.py
+++ b/tests/test_component.py
@@ -27,8 +27,10 @@
 from cyclonedx.model.component import Component
 
 from .data import get_component_setuptools_simple
+from . import TESTDATA_DIRECTORY
 
-FIXTURES_DIRECTORY = join('fixtures', 'xml', '1.4')
+
+RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'own', 'xml', '1.4')
 
 
 class TestComponent(TestCase):
@@ -67,7 +69,7 @@ def test_purl_incorrect_name(self) -> None:
         self.assertEqual(purl.qualifiers, {'extension': 'tar.gz'})
 
     def test_from_file_with_path_for_bom(self) -> None:
-        test_file = join(dirname(__file__), FIXTURES_DIRECTORY, 'bom_setuptools.xml')
+        test_file = join(RELEVANT_TESTDATA_DIRECTORY, 'bom_setuptools.xml')
         c = Component.for_file(absolute_file_path=test_file, path_for_bom='fixtures/bom_setuptools.xml')
         sha1_hash: str = sha1sum(filename=test_file)
         expected_version = '0.0.0-{}'.format(sha1_hash[0:12])
diff --git a/tests/test_deserialize_json.py b/tests/test_deserialize_json.py
index 8962ee518..3ee573eee 100644
--- a/tests/test_deserialize_json.py
+++ b/tests/test_deserialize_json.py
@@ -54,6 +54,10 @@
     get_bom_with_services_simple,
 )
 
+from . import TESTDATA_DIRECTORY
+
+RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'own', 'json')
+
 
 def fixed_date_time() -> datetime:
     return datetime.fromisoformat('2023-01-07 13:44:32.312678+00:00')
@@ -417,8 +421,7 @@ def _validate_json_bom(self, bom: Bom, schema_version: SchemaVersion, fixture: s
             outputter = get_instance(bom=bom, output_format=OutputFormat.JSON, schema_version=schema_version)
             bom = cast(Bom, Bom.from_json(data=json.loads(outputter.output_as_string())))
 
-        with open(
-                join(dirname(__file__), f'fixtures/json/{schema_version.to_version()}/{fixture}')) as input_json:
+        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), fixture)) as input_json:
             deserialized_bom = cast(Bom, Bom.from_json(data=json.loads(input_json.read())))
 
             self.assertEqual(bom.metadata, deserialized_bom.metadata)
diff --git a/tests/test_deserialize_xml.py b/tests/test_deserialize_xml.py
index 81b174f53..626e0972c 100644
--- a/tests/test_deserialize_xml.py
+++ b/tests/test_deserialize_xml.py
@@ -53,6 +53,9 @@
     get_bom_with_services_simple,
 )
 
+from . import TESTDATA_DIRECTORY
+
+RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'own', 'xml')
 
 def fixed_date_time() -> datetime:
     return datetime.fromisoformat('2023-01-07 13:44:32.312678+00:00')
@@ -687,7 +690,7 @@ def _validate_xml_bom(self, bom: Bom, schema_version: SchemaVersion, fixture: st
             outputter = get_instance(bom=bom, output_format=OutputFormat.XML, schema_version=schema_version)
             bom = cast(Bom, Bom.from_xml(data=ElementTree.fromstring(outputter.output_as_string())))
 
-        with open(join(dirname(__file__), f'fixtures/xml/{schema_version.to_version()}/{fixture}')) as input_xml:
+        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), fixture)) as input_xml:
             xml = input_xml.read()
             deserialized_bom = cast(Bom, Bom.from_xml(data=ElementTree.fromstring(xml)))
 
diff --git a/tests/test_output_json.py b/tests/test_output_json.py
index f853da180..7b33859b7 100644
--- a/tests/test_output_json.py
+++ b/tests/test_output_json.py
@@ -52,6 +52,10 @@
 )
 
 
+from . import TESTDATA_DIRECTORY
+
+RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'own', 'json')
+
 @patch('cyclonedx.model.ThisTool._version', 'TESTING')
 class TestOutputJson(BaseJsonTestCase):
 
@@ -399,8 +403,7 @@ def test_bom_v1_4_warn_dependencies(self) -> None:
     def _validate_json_bom(self, bom: Bom, schema_version: SchemaVersion, fixture: str) -> None:
         outputter = get_instance(bom=bom, output_format=OutputFormat.JSON, schema_version=schema_version)
         self.assertEqual(outputter.schema_version, schema_version)
-        with open(
-                join(dirname(__file__), f'fixtures/json/{schema_version.to_version()}/{fixture}')) as expected_json:
+        with open(join(RELEVANT_TESTDATA_DIRECTORY,schema_version.to_version(), fixture)) as expected_json:
             output_as_string = outputter.output_as_string()
             self.assertValidAgainstSchema(bom_json=output_as_string, schema_version=schema_version)
             self.assertEqualJsonBom(expected_json.read(), output_as_string)
diff --git a/tests/test_output_xml.py b/tests/test_output_xml.py
index 101ce9523..03f2a79bf 100644
--- a/tests/test_output_xml.py
+++ b/tests/test_output_xml.py
@@ -50,6 +50,9 @@
     get_bom_with_services_simple,
 )
 
+from . import TESTDATA_DIRECTORY
+
+RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'own', 'xml')
 
 @patch('cyclonedx.model.ThisTool._version', 'TESTING')
 class TestOutputXml(BaseXmlTestCase):
@@ -529,8 +532,7 @@ def test_bom_v1_4_warn_dependencies(self) -> None:
     def _validate_xml_bom(self, bom: Bom, schema_version: SchemaVersion, fixture: str) -> None:
         outputter = get_instance(bom=bom, schema_version=schema_version)
         self.assertEqual(outputter.schema_version, schema_version)
-        with open(
-                join(dirname(__file__), f'fixtures/xml/{schema_version.to_version()}/{fixture}')) as expected_xml:
+        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), fixture)) as expected_xml:
             output_as_string = outputter.output_as_string()
             self.assertValidAgainstSchema(bom_xml=output_as_string, schema_version=schema_version)
             self.assertEqualXmlBom(
diff --git a/tests/test_real_world_examples.py b/tests/test_real_world_examples.py
index 43aa11a91..21a51d014 100644
--- a/tests/test_real_world_examples.py
+++ b/tests/test_real_world_examples.py
@@ -25,6 +25,10 @@
 from cyclonedx.model.bom import Bom
 from cyclonedx.schema import SchemaVersion
 
+from . import TESTDATA_DIRECTORY
+
+RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'own', 'xml')
+
 
 def fixed_date_time() -> datetime:
     return datetime.fromisoformat('2023-01-07 13:44:32.312678+00:00')
@@ -40,6 +44,6 @@ def test_webgoat_6_1(self) -> None:
         )
 
     def _attempt_load_example(self, schema_version: SchemaVersion, fixture: str) -> None:
-        with open(join(dirname(__file__), f'fixtures/xml/{schema_version.to_version()}/{fixture}')) as input_xml:
+        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), fixture)) as input_xml:
             xml = input_xml.read()
             cast(Bom, Bom.from_xml(data=ElementTree.fromstring(xml)))

From 75bbcfc4d4630d91ca46dfabb3f083d445ad5017 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Thu, 14 Sep 2023 13:27:38 +0200
Subject: [PATCH 02/41] test data fetcher

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 tests/_data/own/.gitattributes            |  2 ++
 tests/_data/schemaTestData/.gitattributes |  2 ++
 tests/_data/schemaTestData/README.md      |  2 ++
 tests/_data/schemaTestData/fetch.sh       | 21 +++++++++++++++++++++
 4 files changed, 27 insertions(+)
 create mode 100644 tests/_data/own/.gitattributes
 create mode 100644 tests/_data/schemaTestData/.gitattributes
 create mode 100644 tests/_data/schemaTestData/README.md
 create mode 100755 tests/_data/schemaTestData/fetch.sh

diff --git a/tests/_data/own/.gitattributes b/tests/_data/own/.gitattributes
new file mode 100644
index 000000000..6558d375e
--- /dev/null
+++ b/tests/_data/own/.gitattributes
@@ -0,0 +1,2 @@
+xml/*/*.xml     linguist-generated
+json/*/*.josn   linguist-generated
diff --git a/tests/_data/schemaTestData/.gitattributes b/tests/_data/schemaTestData/.gitattributes
new file mode 100644
index 000000000..bcf7bae75
--- /dev/null
+++ b/tests/_data/schemaTestData/.gitattributes
@@ -0,0 +1,2 @@
+*/*.json    linguist-vendored
+*/*.xml     linguist-vendored
diff --git a/tests/_data/schemaTestData/README.md b/tests/_data/schemaTestData/README.md
new file mode 100644
index 000000000..4f45a14d6
--- /dev/null
+++ b/tests/_data/schemaTestData/README.md
@@ -0,0 +1,2 @@
+files in here are taken from https://github.com/CycloneDX/specification/tree/master/tools/src/test/resources
+they are fetched via [`fetch.sh`](fetch.sh)
diff --git a/tests/_data/schemaTestData/fetch.sh b/tests/_data/schemaTestData/fetch.sh
new file mode 100755
index 000000000..8a3f34a20
--- /dev/null
+++ b/tests/_data/schemaTestData/fetch.sh
@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+set -eux
+
+SOURCE_PACKAGE='https://github.com/CycloneDX/specification/archive/refs/heads/master.zip'
+SOURCE_DIR='specification-master/tools/src/test/resources'
+
+THIS_DIR="$(dirname "$0")"
+TEMP_DIR="$(mktemp -d)"
+LOCAL_PACKAGE="$TEMP_DIR/source_package.zip"
+
+wget -O "$LOCAL_PACKAGE" "$SOURCE_PACKAGE"
+for SCHEMA_VERSION in '1.4' '1.3' '1.2' '1.1' '1.0'
+do
+  unzip -d "$TEMP_DIR" "$LOCAL_PACKAGE" "$SOURCE_DIR/$SCHEMA_VERSION/*"
+  rm -rf "${THIS_DIR:?}/$SCHEMA_VERSION"
+  mkdir -p "$THIS_DIR/$SCHEMA_VERSION"
+  cp -rf "$TEMP_DIR/$SOURCE_DIR/$SCHEMA_VERSION/"*.xml "$THIS_DIR/$SCHEMA_VERSION/"
+  cp -rf "$TEMP_DIR/$SOURCE_DIR/$SCHEMA_VERSION/"*.json "$THIS_DIR/$SCHEMA_VERSION/" || true
+done
+
+rm -rf "${TEMP_DIR:?}"

From 64749f9f9fb7274449de64fd98d77092bcd285f4 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Thu, 14 Sep 2023 13:29:21 +0200
Subject: [PATCH 03/41] fetched schema test data

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 .../schemaTestData/1.0/valid-bom-1.0.xml      |  69 +++++++
 .../1.0/valid-component-hashes-1.0.xml        |  19 ++
 .../1.1/invalid-component-ref-1.1.xml         |  15 ++
 .../1.1/invalid-component-type-1.1.xml        |   9 +
 .../1.1/invalid-empty-component-1.1.xml       |   7 +
 .../1.1/invalid-hash-alg-1.1.xml              |  16 ++
 .../1.1/invalid-hash-md5-1.1.xml              |  16 ++
 .../1.1/invalid-hash-sha1-1.1.xml             |  16 ++
 .../1.1/invalid-hash-sha256-1.1.xml           |  16 ++
 .../1.1/invalid-hash-sha512-1.1.xml           |  16 ++
 .../1.1/invalid-license-choice-1.1.xml        |  26 +++
 .../1.1/invalid-license-encoding-1.1.xml      |  27 +++
 .../1.1/invalid-license-id-1.1.xml            |  27 +++
 .../1.1/invalid-license-id-count-1.1.xml      |  27 +++
 .../1.1/invalid-license-name-count-1.1.xml    |  27 +++
 .../invalid-missing-component-type-1.1.xml    |   9 +
 .../1.1/invalid-namespace-1.1.xml             | 118 +++++++++++
 .../schemaTestData/1.1/invalid-scope-1.1.xml  |  10 +
 .../1.1/invalid-serialnumber-1.1.xml          | 118 +++++++++++
 .../schemaTestData/1.1/valid-bom-1.1.xml      | 118 +++++++++++
 .../1.1/valid-component-hashes-1.1.xml        |  18 ++
 .../1.1/valid-component-ref-1.1.xml           |  19 ++
 .../1.1/valid-component-types-1.1.xml         |  29 +++
 .../1.1/valid-empty-components-1.1.xml        |   5 +
 .../1.1/valid-external-elements-1.1.xml       | 158 ++++++++++++++
 .../1.1/valid-license-expression-1.1.xml      |  23 +++
 .../1.1/valid-license-id-1.1.xml              |  25 +++
 .../1.1/valid-license-name-1.1.xml            |  25 +++
 .../1.1/valid-minimal-viable-1.1.xml          |   9 +
 .../1.1/valid-random-attributes-1.1.xml       | 118 +++++++++++
 .../1.1/valid-xml-signature-1.1.xml           | 177 ++++++++++++++++
 .../1.2/invalid-bomformat-1.2.json            |   8 +
 .../1.2/invalid-component-ref-1.2.json        |  20 ++
 .../1.2/invalid-component-ref-1.2.xml         |  15 ++
 .../1.2/invalid-component-swid-1.2.json       |  18 ++
 .../1.2/invalid-component-swid-1.2.xml        |  11 +
 .../1.2/invalid-component-type-1.2.json       |  13 ++
 .../1.2/invalid-component-type-1.2.xml        |   9 +
 .../1.2/invalid-dependency-1.2.json           |  37 ++++
 .../1.2/invalid-dependency-1.2.xml            |  23 +++
 .../1.2/invalid-empty-component-1.2.xml       |   7 +
 .../1.2/invalid-hash-alg-1.2.json             |  32 +++
 .../1.2/invalid-hash-alg-1.2.xml              |  16 ++
 .../1.2/invalid-hash-md5-1.2.json             |  32 +++
 .../1.2/invalid-hash-md5-1.2.xml              |  16 ++
 .../1.2/invalid-hash-sha1-1.2.json            |  32 +++
 .../1.2/invalid-hash-sha1-1.2.xml             |  16 ++
 .../1.2/invalid-hash-sha256-1.2.json          |  32 +++
 .../1.2/invalid-hash-sha256-1.2.xml           |  16 ++
 .../1.2/invalid-hash-sha512-1.2.json          |  32 +++
 .../1.2/invalid-hash-sha512-1.2.xml           |  16 ++
 .../1.2/invalid-issue-type-1.2.json           |  48 +++++
 .../1.2/invalid-issue-type-1.2.xml            |  37 ++++
 .../1.2/invalid-license-choice-1.2.json       |  23 +++
 .../1.2/invalid-license-choice-1.2.xml        |  26 +++
 .../1.2/invalid-license-encoding-1.2.json     |  28 +++
 .../1.2/invalid-license-encoding-1.2.xml      |  27 +++
 .../1.2/invalid-license-id-1.2.json           |  22 ++
 .../1.2/invalid-license-id-1.2.xml            |  27 +++
 .../1.2/invalid-license-id-count-1.2.xml      |  27 +++
 .../1.2/invalid-license-name-count-1.2.xml    |  27 +++
 .../1.2/invalid-metadata-timestamp-1.2.json   |  10 +
 .../1.2/invalid-metadata-timestamp-1.2.xml    |   7 +
 .../invalid-missing-component-type-1.2.xml    |   9 +
 .../1.2/invalid-namespace-1.2.xml             | 118 +++++++++++
 .../1.2/invalid-patch-type-1.2.json           |  48 +++++
 .../1.2/invalid-patch-type-1.2.xml            |  37 ++++
 .../schemaTestData/1.2/invalid-scope-1.2.json |  14 ++
 .../schemaTestData/1.2/invalid-scope-1.2.xml  |  10 +
 .../1.2/invalid-serialnumber-1.2.json         |   8 +
 .../1.2/invalid-serialnumber-1.2.xml          | 118 +++++++++++
 .../1.2/invalid-service-data-1.2.json         |  20 ++
 .../1.2/invalid-service-data-1.2.xml          |  11 +
 .../1.2/skip_invalid-empty-component-1.2.json |  12 ++
 ...ip_invalid-missing-component-type-1.2.json |  13 ++
 .../1.2/valid-assembly-1.2.json               |  30 +++
 .../schemaTestData/1.2/valid-assembly-1.2.xml |  25 +++
 .../schemaTestData/1.2/valid-bom-1.2.json     | 177 ++++++++++++++++
 .../schemaTestData/1.2/valid-bom-1.2.xml      | 181 ++++++++++++++++
 .../1.2/valid-component-hashes-1.2.json       |  63 ++++++
 .../1.2/valid-component-hashes-1.2.xml        |  23 +++
 .../1.2/valid-component-ref-1.2.json          |  20 ++
 .../1.2/valid-component-ref-1.2.xml           |  19 ++
 .../1.2/valid-component-swid-1.2.json         |  19 ++
 .../1.2/valid-component-swid-1.2.xml          |  11 +
 .../1.2/valid-component-swid-full-1.2.json    |  24 +++
 .../1.2/valid-component-swid-full-1.2.xml     |  13 ++
 .../1.2/valid-component-types-1.2.json        |  48 +++++
 .../1.2/valid-component-types-1.2.xml         |  37 ++++
 .../1.2/valid-dependency-1.2.json             |  38 ++++
 .../1.2/valid-dependency-1.2.xml              |  23 +++
 .../1.2/valid-empty-components-1.2.json       |   8 +
 .../1.2/valid-empty-components-1.2.xml        |   5 +
 .../1.2/valid-external-elements-1.2.xml       | 158 ++++++++++++++
 .../1.2/valid-license-expression-1.2.json     |  20 ++
 .../1.2/valid-license-expression-1.2.xml      |  23 +++
 .../1.2/valid-license-id-1.2.json             |  22 ++
 .../1.2/valid-license-id-1.2.xml              |  25 +++
 .../1.2/valid-license-name-1.2.json           |  22 ++
 .../1.2/valid-license-name-1.2.xml            |  25 +++
 .../1.2/valid-metadata-author-1.2.json        |  16 ++
 .../1.2/valid-metadata-author-1.2.xml         |  13 ++
 .../1.2/valid-metadata-manufacture-1.2.json   |  21 ++
 .../1.2/valid-metadata-manufacture-1.2.xml    |  14 ++
 .../1.2/valid-metadata-supplier-1.2.json      |  21 ++
 .../1.2/valid-metadata-supplier-1.2.xml       |  14 ++
 .../1.2/valid-metadata-timestamp-1.2.json     |  10 +
 .../1.2/valid-metadata-timestamp-1.2.xml      |   7 +
 .../1.2/valid-metadata-tool-1.2.json          |  26 +++
 .../1.2/valid-metadata-tool-1.2.xml           |  17 ++
 .../1.2/valid-minimal-viable-1.2.json         |  13 ++
 .../1.2/valid-minimal-viable-1.2.xml          |   9 +
 .../schemaTestData/1.2/valid-patch-1.2.json   |  88 ++++++++
 .../schemaTestData/1.2/valid-patch-1.2.xml    |  70 +++++++
 .../1.2/valid-random-attributes-1.2.xml       | 118 +++++++++++
 .../schemaTestData/1.2/valid-service-1.2.json | 101 +++++++++
 .../schemaTestData/1.2/valid-service-1.2.xml  |  66 ++++++
 .../1.2/valid-service-empty-objects-1.2.json  |  22 ++
 .../1.2/valid-service-empty-objects-1.2.xml   |  16 ++
 .../1.2/valid-xml-signature-1.2.xml           | 177 ++++++++++++++++
 .../1.3/invalid-bomformat-1.3.json            |   8 +
 .../1.3/invalid-component-ref-1.3.json        |  20 ++
 .../1.3/invalid-component-ref-1.3.xml         |  15 ++
 .../1.3/invalid-component-swid-1.3.json       |  18 ++
 .../1.3/invalid-component-swid-1.3.xml        |  11 +
 .../1.3/invalid-component-type-1.3.json       |  13 ++
 .../1.3/invalid-component-type-1.3.xml        |   9 +
 .../1.3/invalid-dependency-1.3.json           |  37 ++++
 .../1.3/invalid-dependency-1.3.xml            |  23 +++
 .../1.3/invalid-empty-component-1.3.json      |  11 +
 .../1.3/invalid-empty-component-1.3.xml       |   7 +
 .../1.3/invalid-hash-alg-1.3.json             |  32 +++
 .../1.3/invalid-hash-alg-1.3.xml              |  16 ++
 .../1.3/invalid-hash-md5-1.3.json             |  32 +++
 .../1.3/invalid-hash-md5-1.3.xml              |  16 ++
 .../1.3/invalid-hash-sha1-1.3.json            |  32 +++
 .../1.3/invalid-hash-sha1-1.3.xml             |  16 ++
 .../1.3/invalid-hash-sha256-1.3.json          |  32 +++
 .../1.3/invalid-hash-sha256-1.3.xml           |  16 ++
 .../1.3/invalid-hash-sha512-1.3.json          |  32 +++
 .../1.3/invalid-hash-sha512-1.3.xml           |  16 ++
 .../1.3/invalid-issue-type-1.3.json           |  48 +++++
 .../1.3/invalid-issue-type-1.3.xml            |  37 ++++
 .../1.3/invalid-license-choice-1.3.json       |  23 +++
 .../1.3/invalid-license-choice-1.3.xml        |  26 +++
 .../1.3/invalid-license-encoding-1.3.json     |  28 +++
 .../1.3/invalid-license-encoding-1.3.xml      |  27 +++
 .../1.3/invalid-license-id-1.3.json           |  22 ++
 .../1.3/invalid-license-id-1.3.xml            |  27 +++
 .../1.3/invalid-license-id-count-1.3.xml      |  27 +++
 .../1.3/invalid-license-name-count-1.3.xml    |  27 +++
 .../1.3/invalid-metadata-license-1.3.json     |  16 ++
 .../1.3/invalid-metadata-license-1.3.xml      |  11 +
 .../1.3/invalid-metadata-timestamp-1.3.json   |  10 +
 .../1.3/invalid-metadata-timestamp-1.3.xml    |   7 +
 .../invalid-missing-component-type-1.3.json   |  12 ++
 .../invalid-missing-component-type-1.3.xml    |   9 +
 .../1.3/invalid-namespace-1.3.xml             | 118 +++++++++++
 .../1.3/invalid-patch-type-1.3.json           |  48 +++++
 .../1.3/invalid-patch-type-1.3.xml            |  37 ++++
 .../schemaTestData/1.3/invalid-scope-1.3.json |  14 ++
 .../schemaTestData/1.3/invalid-scope-1.3.xml  |  10 +
 .../1.3/invalid-serialnumber-1.3.json         |   8 +
 .../1.3/invalid-serialnumber-1.3.xml          | 118 +++++++++++
 .../1.3/invalid-service-data-1.3.json         |  20 ++
 .../1.3/invalid-service-data-1.3.xml          |  11 +
 .../1.3/valid-assembly-1.3.json               |  30 +++
 .../schemaTestData/1.3/valid-assembly-1.3.xml |  25 +++
 .../schemaTestData/1.3/valid-bom-1.3.json     | 177 ++++++++++++++++
 .../schemaTestData/1.3/valid-bom-1.3.xml      | 181 ++++++++++++++++
 .../1.3/valid-component-hashes-1.3.json       |  63 ++++++
 .../1.3/valid-component-hashes-1.3.xml        |  23 +++
 .../1.3/valid-component-ref-1.3.json          |  20 ++
 .../1.3/valid-component-ref-1.3.xml           |  19 ++
 .../1.3/valid-component-swid-1.3.json         |  19 ++
 .../1.3/valid-component-swid-1.3.xml          |  11 +
 .../1.3/valid-component-swid-full-1.3.json    |  24 +++
 .../1.3/valid-component-swid-full-1.3.xml     |  13 ++
 .../1.3/valid-component-types-1.3.json        |  48 +++++
 .../1.3/valid-component-types-1.3.xml         |  37 ++++
 .../1.3/valid-compositions-1.3.json           |  65 ++++++
 .../1.3/valid-compositions-1.3.xml            |  51 +++++
 .../1.3/valid-dependency-1.3.json             |  38 ++++
 .../1.3/valid-dependency-1.3.xml              |  23 +++
 .../1.3/valid-empty-components-1.3.json       |   8 +
 .../1.3/valid-empty-components-1.3.xml        |   5 +
 .../1.3/valid-evidence-1.3.json               |  53 +++++
 .../schemaTestData/1.3/valid-evidence-1.3.xml |  35 ++++
 .../1.3/valid-external-elements-1.3.xml       | 158 ++++++++++++++
 .../1.3/valid-external-reference-1.3.json     |  38 ++++
 .../1.3/valid-external-reference-1.3.xml      |  27 +++
 .../1.3/valid-license-expression-1.3.json     |  20 ++
 .../1.3/valid-license-expression-1.3.xml      |  23 +++
 .../1.3/valid-license-id-1.3.json             |  22 ++
 .../1.3/valid-license-id-1.3.xml              |  25 +++
 .../1.3/valid-license-name-1.3.json           |  22 ++
 .../1.3/valid-license-name-1.3.xml            |  25 +++
 .../1.3/valid-metadata-author-1.3.json        |  16 ++
 .../1.3/valid-metadata-author-1.3.xml         |  13 ++
 .../1.3/valid-metadata-license-1.3.json       |  16 ++
 .../1.3/valid-metadata-license-1.3.xml        |  11 +
 .../1.3/valid-metadata-manufacture-1.3.json   |  21 ++
 .../1.3/valid-metadata-manufacture-1.3.xml    |  14 ++
 .../1.3/valid-metadata-supplier-1.3.json      |  21 ++
 .../1.3/valid-metadata-supplier-1.3.xml       |  14 ++
 .../1.3/valid-metadata-timestamp-1.3.json     |  10 +
 .../1.3/valid-metadata-timestamp-1.3.xml      |   7 +
 .../1.3/valid-metadata-tool-1.3.json          |  26 +++
 .../1.3/valid-metadata-tool-1.3.xml           |  17 ++
 .../1.3/valid-minimal-viable-1.3.json         |  13 ++
 .../1.3/valid-minimal-viable-1.3.xml          |   9 +
 .../schemaTestData/1.3/valid-patch-1.3.json   |  88 ++++++++
 .../schemaTestData/1.3/valid-patch-1.3.xml    |  70 +++++++
 .../1.3/valid-properties-1.3.json             |  55 +++++
 .../1.3/valid-properties-1.3.xml              |  34 +++
 .../1.3/valid-random-attributes-1.3.xml       | 118 +++++++++++
 .../schemaTestData/1.3/valid-service-1.3.json | 101 +++++++++
 .../schemaTestData/1.3/valid-service-1.3.xml  |  66 ++++++
 .../1.3/valid-service-empty-objects-1.3.json  |  22 ++
 .../1.3/valid-service-empty-objects-1.3.xml   |  16 ++
 .../1.3/valid-xml-signature-1.3.xml           | 177 ++++++++++++++++
 .../1.4/invalid-bomformat-1.4.json            |   8 +
 .../1.4/invalid-component-ref-1.4.json        |  20 ++
 .../1.4/invalid-component-ref-1.4.xml         |  15 ++
 .../1.4/invalid-component-swid-1.4.json       |  18 ++
 .../1.4/invalid-component-swid-1.4.xml        |  11 +
 .../1.4/invalid-component-type-1.4.json       |  13 ++
 .../1.4/invalid-component-type-1.4.xml        |   9 +
 .../1.4/invalid-dependency-1.4.json           |  37 ++++
 .../1.4/invalid-dependency-1.4.xml            |  23 +++
 .../1.4/invalid-empty-component-1.4.json      |  11 +
 .../1.4/invalid-empty-component-1.4.xml       |   7 +
 .../1.4/invalid-hash-alg-1.4.json             |  32 +++
 .../1.4/invalid-hash-alg-1.4.xml              |  16 ++
 .../1.4/invalid-hash-md5-1.4.json             |  32 +++
 .../1.4/invalid-hash-md5-1.4.xml              |  16 ++
 .../1.4/invalid-hash-sha1-1.4.json            |  32 +++
 .../1.4/invalid-hash-sha1-1.4.xml             |  16 ++
 .../1.4/invalid-hash-sha256-1.4.json          |  32 +++
 .../1.4/invalid-hash-sha256-1.4.xml           |  16 ++
 .../1.4/invalid-hash-sha512-1.4.json          |  32 +++
 .../1.4/invalid-hash-sha512-1.4.xml           |  16 ++
 .../1.4/invalid-issue-type-1.4.json           |  48 +++++
 .../1.4/invalid-issue-type-1.4.xml            |  37 ++++
 .../1.4/invalid-license-choice-1.4.json       |  23 +++
 .../1.4/invalid-license-choice-1.4.xml        |  26 +++
 .../1.4/invalid-license-encoding-1.4.json     |  28 +++
 .../1.4/invalid-license-encoding-1.4.xml      |  27 +++
 .../1.4/invalid-license-id-1.4.json           |  22 ++
 .../1.4/invalid-license-id-1.4.xml            |  27 +++
 .../1.4/invalid-license-id-count-1.4.xml      |  27 +++
 .../1.4/invalid-license-name-count-1.4.xml    |  27 +++
 .../1.4/invalid-metadata-license-1.4.json     |  16 ++
 .../1.4/invalid-metadata-license-1.4.xml      |  11 +
 .../1.4/invalid-metadata-timestamp-1.4.json   |  10 +
 .../1.4/invalid-metadata-timestamp-1.4.xml    |   7 +
 .../invalid-missing-component-type-1.4.json   |  12 ++
 .../invalid-missing-component-type-1.4.xml    |   9 +
 .../1.4/invalid-namespace-1.4.xml             | 118 +++++++++++
 .../1.4/invalid-patch-type-1.4.json           |  48 +++++
 .../1.4/invalid-patch-type-1.4.xml            |  37 ++++
 .../schemaTestData/1.4/invalid-scope-1.4.json |  14 ++
 .../schemaTestData/1.4/invalid-scope-1.4.xml  |  10 +
 .../1.4/invalid-serialnumber-1.4.json         |   8 +
 .../1.4/invalid-serialnumber-1.4.xml          | 118 +++++++++++
 .../1.4/invalid-service-data-1.4.json         |  20 ++
 .../1.4/invalid-service-data-1.4.xml          |  11 +
 .../1.4/valid-assembly-1.4.json               |  30 +++
 .../schemaTestData/1.4/valid-assembly-1.4.xml |  25 +++
 .../schemaTestData/1.4/valid-bom-1.4.json     | 177 ++++++++++++++++
 .../schemaTestData/1.4/valid-bom-1.4.xml      | 181 ++++++++++++++++
 .../1.4/valid-component-hashes-1.4.json       |  63 ++++++
 .../1.4/valid-component-hashes-1.4.xml        |  23 +++
 .../1.4/valid-component-ref-1.4.json          |  20 ++
 .../1.4/valid-component-ref-1.4.xml           |  19 ++
 .../1.4/valid-component-swid-1.4.json         |  19 ++
 .../1.4/valid-component-swid-1.4.xml          |  11 +
 .../1.4/valid-component-swid-full-1.4.json    |  24 +++
 .../1.4/valid-component-swid-full-1.4.xml     |  13 ++
 .../1.4/valid-component-types-1.4.json        |  48 +++++
 .../1.4/valid-component-types-1.4.xml         |  37 ++++
 .../1.4/valid-compositions-1.4.json           |  65 ++++++
 .../1.4/valid-compositions-1.4.xml            |  51 +++++
 .../1.4/valid-dependency-1.4.json             |  38 ++++
 .../1.4/valid-dependency-1.4.xml              |  23 +++
 .../1.4/valid-empty-components-1.4.json       |   8 +
 .../1.4/valid-empty-components-1.4.xml        |   5 +
 .../1.4/valid-evidence-1.4.json               |  53 +++++
 .../schemaTestData/1.4/valid-evidence-1.4.xml |  35 ++++
 .../1.4/valid-external-elements-1.4.xml       | 158 ++++++++++++++
 .../1.4/valid-external-reference-1.4.json     |  38 ++++
 .../1.4/valid-external-reference-1.4.xml      |  27 +++
 .../1.4/valid-license-expression-1.4.json     |  20 ++
 .../1.4/valid-license-expression-1.4.xml      |  23 +++
 .../1.4/valid-license-id-1.4.json             |  22 ++
 .../1.4/valid-license-id-1.4.xml              |  25 +++
 .../1.4/valid-license-name-1.4.json           |  22 ++
 .../1.4/valid-license-name-1.4.xml            |  25 +++
 .../1.4/valid-metadata-author-1.4.json        |  16 ++
 .../1.4/valid-metadata-author-1.4.xml         |  13 ++
 .../1.4/valid-metadata-license-1.4.json       |  16 ++
 .../1.4/valid-metadata-license-1.4.xml        |  11 +
 .../1.4/valid-metadata-manufacture-1.4.json   |  21 ++
 .../1.4/valid-metadata-manufacture-1.4.xml    |  14 ++
 .../1.4/valid-metadata-supplier-1.4.json      |  21 ++
 .../1.4/valid-metadata-supplier-1.4.xml       |  14 ++
 .../1.4/valid-metadata-timestamp-1.4.json     |  10 +
 .../1.4/valid-metadata-timestamp-1.4.xml      |   7 +
 .../1.4/valid-metadata-tool-1.4.json          |  26 +++
 .../1.4/valid-metadata-tool-1.4.xml           |  17 ++
 .../1.4/valid-minimal-viable-1.4.json         |  12 ++
 .../1.4/valid-minimal-viable-1.4.xml          |   8 +
 .../schemaTestData/1.4/valid-patch-1.4.json   |  88 ++++++++
 .../schemaTestData/1.4/valid-patch-1.4.xml    |  70 +++++++
 .../1.4/valid-properties-1.4.json             |  55 +++++
 .../1.4/valid-properties-1.4.xml              |  34 +++
 .../1.4/valid-random-attributes-1.4.xml       | 118 +++++++++++
 .../1.4/valid-release-notes-1.4.json          | 194 ++++++++++++++++++
 .../1.4/valid-release-notes-1.4.xml           | 149 ++++++++++++++
 .../schemaTestData/1.4/valid-service-1.4.json | 101 +++++++++
 .../schemaTestData/1.4/valid-service-1.4.xml  |  66 ++++++
 .../1.4/valid-service-empty-objects-1.4.json  |  22 ++
 .../1.4/valid-service-empty-objects-1.4.xml   |  16 ++
 .../1.4/valid-signatures-1.4.json             |  78 +++++++
 .../1.4/valid-vulnerability-1.4.json          | 140 +++++++++++++
 .../1.4/valid-vulnerability-1.4.xml           | 127 ++++++++++++
 .../1.4/valid-xml-signature-1.4.xml           | 177 ++++++++++++++++
 327 files changed, 11896 insertions(+)
 create mode 100644 tests/_data/schemaTestData/1.0/valid-bom-1.0.xml
 create mode 100644 tests/_data/schemaTestData/1.0/valid-component-hashes-1.0.xml
 create mode 100644 tests/_data/schemaTestData/1.1/invalid-component-ref-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/invalid-component-type-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/invalid-empty-component-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/invalid-hash-alg-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/invalid-hash-md5-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/invalid-hash-sha1-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/invalid-hash-sha256-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/invalid-hash-sha512-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/invalid-license-choice-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/invalid-license-encoding-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/invalid-license-id-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/invalid-license-id-count-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/invalid-license-name-count-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/invalid-missing-component-type-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/invalid-namespace-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/invalid-scope-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/invalid-serialnumber-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/valid-bom-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/valid-component-hashes-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/valid-component-ref-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/valid-component-types-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/valid-empty-components-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/valid-external-elements-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/valid-license-expression-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/valid-license-id-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/valid-license-name-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/valid-minimal-viable-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/valid-random-attributes-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.1/valid-xml-signature-1.1.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-bomformat-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-component-ref-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-component-ref-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-component-swid-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-component-swid-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-component-type-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-component-type-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-dependency-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-dependency-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-empty-component-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-hash-alg-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-hash-alg-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-hash-md5-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-hash-md5-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-hash-sha1-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-hash-sha1-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-hash-sha256-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-hash-sha256-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-hash-sha512-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-hash-sha512-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-issue-type-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-issue-type-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-license-choice-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-license-choice-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-license-encoding-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-license-encoding-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-license-id-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-license-id-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-license-id-count-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-license-name-count-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-metadata-timestamp-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-metadata-timestamp-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-missing-component-type-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-namespace-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-patch-type-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-patch-type-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-scope-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-scope-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-serialnumber-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-serialnumber-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-service-data-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/invalid-service-data-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/skip_invalid-empty-component-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/skip_invalid-missing-component-type-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-assembly-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-assembly-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-bom-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-bom-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-component-hashes-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-component-hashes-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-component-ref-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-component-ref-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-component-swid-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-component-swid-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-component-swid-full-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-component-swid-full-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-component-types-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-component-types-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-dependency-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-dependency-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-empty-components-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-empty-components-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-external-elements-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-license-expression-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-license-expression-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-license-id-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-license-id-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-license-name-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-license-name-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-metadata-author-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-metadata-author-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-metadata-manufacture-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-metadata-manufacture-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-metadata-supplier-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-metadata-supplier-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-metadata-timestamp-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-metadata-timestamp-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-metadata-tool-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-metadata-tool-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-minimal-viable-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-minimal-viable-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-patch-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-patch-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-random-attributes-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-service-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-service-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-service-empty-objects-1.2.json
 create mode 100644 tests/_data/schemaTestData/1.2/valid-service-empty-objects-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.2/valid-xml-signature-1.2.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-bomformat-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-component-ref-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-component-ref-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-component-swid-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-component-swid-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-component-type-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-component-type-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-dependency-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-dependency-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-empty-component-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-empty-component-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-hash-alg-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-hash-alg-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-hash-md5-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-hash-md5-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-hash-sha1-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-hash-sha1-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-hash-sha256-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-hash-sha256-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-hash-sha512-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-hash-sha512-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-issue-type-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-issue-type-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-license-choice-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-license-choice-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-license-encoding-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-license-encoding-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-license-id-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-license-id-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-license-id-count-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-license-name-count-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-metadata-license-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-metadata-license-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-metadata-timestamp-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-metadata-timestamp-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-missing-component-type-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-missing-component-type-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-namespace-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-patch-type-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-patch-type-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-scope-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-scope-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-serialnumber-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-serialnumber-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-service-data-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/invalid-service-data-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-assembly-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-assembly-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-bom-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-bom-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-component-hashes-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-component-hashes-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-component-ref-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-component-ref-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-component-swid-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-component-swid-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-component-swid-full-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-component-swid-full-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-component-types-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-component-types-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-compositions-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-compositions-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-dependency-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-dependency-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-empty-components-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-empty-components-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-evidence-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-evidence-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-external-elements-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-external-reference-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-external-reference-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-license-expression-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-license-expression-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-license-id-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-license-id-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-license-name-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-license-name-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-metadata-author-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-metadata-author-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-metadata-license-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-metadata-license-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-metadata-manufacture-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-metadata-manufacture-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-metadata-supplier-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-metadata-supplier-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-metadata-timestamp-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-metadata-timestamp-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-metadata-tool-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-metadata-tool-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-minimal-viable-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-minimal-viable-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-patch-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-patch-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-properties-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-properties-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-random-attributes-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-service-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-service-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-service-empty-objects-1.3.json
 create mode 100644 tests/_data/schemaTestData/1.3/valid-service-empty-objects-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.3/valid-xml-signature-1.3.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-bomformat-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-component-ref-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-component-ref-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-component-swid-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-component-swid-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-component-type-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-component-type-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-dependency-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-dependency-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-empty-component-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-empty-component-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-hash-alg-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-hash-alg-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-hash-md5-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-hash-md5-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-hash-sha1-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-hash-sha1-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-hash-sha256-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-hash-sha256-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-hash-sha512-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-hash-sha512-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-issue-type-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-issue-type-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-license-choice-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-license-choice-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-license-encoding-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-license-encoding-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-license-id-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-license-id-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-license-id-count-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-license-name-count-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-metadata-license-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-metadata-license-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-metadata-timestamp-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-metadata-timestamp-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-missing-component-type-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-missing-component-type-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-namespace-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-patch-type-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-patch-type-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-scope-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-scope-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-serialnumber-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-serialnumber-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-service-data-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/invalid-service-data-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-assembly-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-assembly-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-bom-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-bom-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-component-hashes-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-component-hashes-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-component-ref-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-component-ref-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-component-swid-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-component-swid-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-component-swid-full-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-component-swid-full-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-component-types-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-component-types-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-compositions-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-compositions-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-dependency-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-dependency-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-empty-components-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-empty-components-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-evidence-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-evidence-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-external-elements-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-external-reference-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-external-reference-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-license-expression-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-license-expression-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-license-id-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-license-id-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-license-name-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-license-name-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-metadata-author-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-metadata-author-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-metadata-license-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-metadata-license-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-metadata-manufacture-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-metadata-manufacture-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-metadata-supplier-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-metadata-supplier-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-metadata-timestamp-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-metadata-timestamp-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-metadata-tool-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-metadata-tool-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-minimal-viable-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-minimal-viable-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-patch-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-patch-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-properties-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-properties-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-random-attributes-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-release-notes-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-release-notes-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-service-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-service-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-service-empty-objects-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-service-empty-objects-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-signatures-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-vulnerability-1.4.json
 create mode 100644 tests/_data/schemaTestData/1.4/valid-vulnerability-1.4.xml
 create mode 100644 tests/_data/schemaTestData/1.4/valid-xml-signature-1.4.xml

diff --git a/tests/_data/schemaTestData/1.0/valid-bom-1.0.xml b/tests/_data/schemaTestData/1.0/valid-bom-1.0.xml
new file mode 100644
index 000000000..f0bfba221
--- /dev/null
+++ b/tests/_data/schemaTestData/1.0/valid-bom-1.0.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
+    <components>
+        <component type="application">
+            <group>org.example</group>
+            <name>myapplication</name>
+            <version>1.0.0</version>
+            <description>An example application</description>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+
+            <!-- The application includes the following components -->
+            <components>
+                <component type="framework">
+                    <group>twitter</group>
+                    <name>bootstrap</name>
+                    <version>3.3.7</version>
+                    <description>The most popular front-end framework for developing responsive, mobile first projects on the web.</description>
+                    <hashes>
+                        <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                        <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                        <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                        <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+                    </hashes>
+                    <licenses>
+                        <license>
+                            <id>MIT</id>
+                        </license>
+                    </licenses>
+                    <purl>pkg:npm/bootstrap@3.3.7</purl>
+                    <modified>false</modified>
+                </component>
+                <component type="framework">
+                    <group>com.example</group>
+                    <name>myframework</name>
+                    <version>1.0.0</version>
+                    <description>Example Inc, enterprise framework</description>
+                    <hashes>
+                        <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                        <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                        <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                        <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+                    </hashes>
+                    <licenses>
+                        <license>
+                            <id>Apache-2.0</id>
+                        </license>
+                    </licenses>
+                    <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+                    <modified>false</modified>
+                </component>
+                <!-- continue adding additional components -->
+            </components>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.0/valid-component-hashes-1.0.xml b/tests/_data/schemaTestData/1.0/valid-component-hashes-1.0.xml
new file mode 100644
index 000000000..5e0286599
--- /dev/null
+++ b/tests/_data/schemaTestData/1.0/valid-component-hashes-1.0.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<bom version="1" xmlns="http://cyclonedx.org/schema/bom/1.0">
+    <components>
+        <component type="library">
+            <name>acme-example</name>
+            <version>1.0.0</version>
+            <hashes>
+                <hash alg="MD5">641b6e166f8b33c5e959e2adcc18b1c7</hash>
+                <hash alg="SHA-1">9188560f22e0b73070d2efce670c74af2bdf30af</hash>
+                <hash alg="SHA-256">d88bc4e70bfb34d18b5542136639acbb26a8ae2429aa1e47489332fb389cc964</hash>
+                <hash alg="SHA-384">d4835048a0f57c74b8fb617d5366ab81376fc92bebe9a93bf24ba7f9da6c9aeeb6179f5d1361f6533211b15f3224cbad</hash>
+                <hash alg="SHA-512">74a51ff45e4c11df9ba1f0094282c80489649cb157a75fa337992d2d4592a5a1b8cb4525de8db0ae25233553924d76c36e093ea7fa9df4e5b8b07fd2e074efd6</hash>
+                <hash alg="SHA3-256">7478c7cf41c883a04ee89f1813f687886d53fa86f791fff90690c6221e3853aa</hash>
+                <hash alg="SHA3-512">7d584825bc1767dfabe7e82b45ccb7a1119b145fa17e76b885e71429c706cef0a3171bc6575b968eec5da56a7966c02fec5402fcee55097ac01d40c550de9d20</hash>
+            </hashes>
+            <modified>false</modified>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.1/invalid-component-ref-1.1.xml b/tests/_data/schemaTestData/1.1/invalid-component-ref-1.1.xml
new file mode 100644
index 000000000..2eaaf7895
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/invalid-component-ref-1.1.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="library" bom-ref="123">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <components>
+                <component type="library" bom-ref="123">
+                    <name>acme-library</name>
+                    <version>1.0.0</version>
+                </component>
+            </components>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/invalid-component-type-1.1.xml b/tests/_data/schemaTestData/1.1/invalid-component-type-1.1.xml
new file mode 100644
index 000000000..125cf0962
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/invalid-component-type-1.1.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="foo">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/invalid-empty-component-1.1.xml b/tests/_data/schemaTestData/1.1/invalid-empty-component-1.1.xml
new file mode 100644
index 000000000..20d8ef394
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/invalid-empty-component-1.1.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="application">
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/invalid-hash-alg-1.1.xml b/tests/_data/schemaTestData/1.1/invalid-hash-alg-1.1.xml
new file mode 100644
index 000000000..e7c28b8e5
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/invalid-hash-alg-1.1.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="FOO">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/invalid-hash-md5-1.1.xml b/tests/_data/schemaTestData/1.1/invalid-hash-md5-1.1.xml
new file mode 100644
index 000000000..64473513f
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/invalid-hash-md5-1.1.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">foo</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/invalid-hash-sha1-1.1.xml b/tests/_data/schemaTestData/1.1/invalid-hash-sha1-1.1.xml
new file mode 100644
index 000000000..f13b5696d
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/invalid-hash-sha1-1.1.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">foo</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/invalid-hash-sha256-1.1.xml b/tests/_data/schemaTestData/1.1/invalid-hash-sha256-1.1.xml
new file mode 100644
index 000000000..a1815e43a
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/invalid-hash-sha256-1.1.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">foo</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/invalid-hash-sha512-1.1.xml b/tests/_data/schemaTestData/1.1/invalid-hash-sha512-1.1.xml
new file mode 100644
index 000000000..53d2bdd48
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/invalid-hash-sha512-1.1.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">foo</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/invalid-license-choice-1.1.xml b/tests/_data/schemaTestData/1.1/invalid-license-choice-1.1.xml
new file mode 100644
index 000000000..d217aa5e2
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/invalid-license-choice-1.1.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/invalid-license-encoding-1.1.xml b/tests/_data/schemaTestData/1.1/invalid-license-encoding-1.1.xml
new file mode 100644
index 000000000..a7d73d177
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/invalid-license-encoding-1.1.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base85">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/invalid-license-id-1.1.xml b/tests/_data/schemaTestData/1.1/invalid-license-id-1.1.xml
new file mode 100644
index 000000000..f9b083a43
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/invalid-license-id-1.1.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/invalid-license-id-count-1.1.xml b/tests/_data/schemaTestData/1.1/invalid-license-id-count-1.1.xml
new file mode 100644
index 000000000..7f89adf32
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/invalid-license-id-count-1.1.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>MIT</id>
+                    <!-- This was a defect in schema 1.0 and is no longer permitted -->
+                    <id>MIT</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/invalid-license-name-count-1.1.xml b/tests/_data/schemaTestData/1.1/invalid-license-name-count-1.1.xml
new file mode 100644
index 000000000..70470cb14
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/invalid-license-name-count-1.1.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Apache License 2.0</name>
+                    <!-- This was a defect in schema 1.0 and is no longer permitted -->
+                    <name>Apache License 2.0</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/invalid-missing-component-type-1.1.xml b/tests/_data/schemaTestData/1.1/invalid-missing-component-type-1.1.xml
new file mode 100644
index 000000000..8825945b1
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/invalid-missing-component-type-1.1.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component>
+            <name>acme-library</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/invalid-namespace-1.1.xml b/tests/_data/schemaTestData/1.1/invalid-namespace-1.1.xml
new file mode 100644
index 000000000..2e83863c9
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/invalid-namespace-1.1.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/11">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+                <notes>Commentary here</notes>
+            </pedigree>
+        </component>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="documentation">
+                    <url>http://example.org/docs</url>
+                    <comment>All component versions are documented here</comment>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.org/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+        <component type="framework">
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Some random license</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/invalid-scope-1.1.xml b/tests/_data/schemaTestData/1.1/invalid-scope-1.1.xml
new file mode 100644
index 000000000..f093dc144
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/invalid-scope-1.1.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>foo</scope>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/invalid-serialnumber-1.1.xml b/tests/_data/schemaTestData/1.1/invalid-serialnumber-1.1.xml
new file mode 100644
index 000000000..5149a031b
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/invalid-serialnumber-1.1.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+                <notes>Commentary here</notes>
+            </pedigree>
+        </component>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="documentation">
+                    <url>http://example.org/docs</url>
+                    <comment>All component versions are documented here</comment>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.org/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+        <component type="framework">
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Some random license</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/valid-bom-1.1.xml b/tests/_data/schemaTestData/1.1/valid-bom-1.1.xml
new file mode 100644
index 000000000..06fc5e870
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/valid-bom-1.1.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+                <notes>Commentary here</notes>
+            </pedigree>
+        </component>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="documentation">
+                    <url>http://example.org/docs</url>
+                    <comment>All component versions are documented here</comment>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.org/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+        <component type="framework">
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Some random license</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/valid-component-hashes-1.1.xml b/tests/_data/schemaTestData/1.1/valid-component-hashes-1.1.xml
new file mode 100644
index 000000000..0ee0e69b9
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/valid-component-hashes-1.1.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="library">
+            <name>acme-example</name>
+            <version>1.0.0</version>
+            <hashes>
+                <hash alg="MD5">641b6e166f8b33c5e959e2adcc18b1c7</hash>
+                <hash alg="SHA-1">9188560f22e0b73070d2efce670c74af2bdf30af</hash>
+                <hash alg="SHA-256">d88bc4e70bfb34d18b5542136639acbb26a8ae2429aa1e47489332fb389cc964</hash>
+                <hash alg="SHA-384">d4835048a0f57c74b8fb617d5366ab81376fc92bebe9a93bf24ba7f9da6c9aeeb6179f5d1361f6533211b15f3224cbad</hash>
+                <hash alg="SHA-512">74a51ff45e4c11df9ba1f0094282c80489649cb157a75fa337992d2d4592a5a1b8cb4525de8db0ae25233553924d76c36e093ea7fa9df4e5b8b07fd2e074efd6</hash>
+                <hash alg="SHA3-256">7478c7cf41c883a04ee89f1813f687886d53fa86f791fff90690c6221e3853aa</hash>
+                <hash alg="SHA3-512">7d584825bc1767dfabe7e82b45ccb7a1119b145fa17e76b885e71429c706cef0a3171bc6575b968eec5da56a7966c02fec5402fcee55097ac01d40c550de9d20</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.1/valid-component-ref-1.1.xml b/tests/_data/schemaTestData/1.1/valid-component-ref-1.1.xml
new file mode 100644
index 000000000..6712fb5a1
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/valid-component-ref-1.1.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="library" bom-ref="123">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <components>
+                <component type="library" bom-ref="456">
+                    <name>acme-library</name>
+                    <version>1.0.0</version>
+                </component>
+            </components>
+        </component>
+        <component type="library" bom-ref="789">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/valid-component-types-1.1.xml b/tests/_data/schemaTestData/1.1/valid-component-types-1.1.xml
new file mode 100644
index 000000000..714f6c716
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/valid-component-types-1.1.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="application">
+            <name>application-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="library">
+            <name>library-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="framework">
+            <name>framework-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="operating-system">
+            <name>operating-system-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="device">
+            <name>device-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="file">
+            <name>file-a</name>
+            <version>1.0</version>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.1/valid-empty-components-1.1.xml b/tests/_data/schemaTestData/1.1/valid-empty-components-1.1.xml
new file mode 100644
index 000000000..9763b2c43
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/valid-empty-components-1.1.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/valid-external-elements-1.1.xml b/tests/_data/schemaTestData/1.1/valid-external-elements-1.1.xml
new file mode 100644
index 000000000..6fab6f352
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/valid-external-elements-1.1.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                                <foo:fruit xmlns:foo="foo">
+                                    <foo:name>Banana</foo:name>
+                                </foo:fruit>
+                                <foo:fruit xmlns:foo="foo">
+                                    <foo:name>Banana</foo:name>
+                                </foo:fruit>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                        <foo:fruit xmlns:foo="foo">
+                            <foo:name>Banana</foo:name>
+                        </foo:fruit>
+                        <foo:fruit xmlns:foo="foo">
+                            <foo:name>Banana</foo:name>
+                        </foo:fruit>
+                    </component>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </ancestors>
+                <descendants>
+                    <component type="library">
+                        <name>foo</name>
+                        <version>1.0</version>
+                    </component>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </descendants>
+                <variants>
+                    <component type="library">
+                        <name>bar</name>
+                        <version>1.0</version>
+                    </component>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </variants>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                            <foo:fruit xmlns:foo="foo">
+                                <foo:name>Banana</foo:name>
+                            </foo:fruit>
+                            <foo:fruit xmlns:foo="foo">
+                                <foo:name>Banana</foo:name>
+                            </foo:fruit>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                            <foo:fruit xmlns:foo="foo">
+                                <foo:name>Banana</foo:name>
+                            </foo:fruit>
+                            <foo:fruit xmlns:foo="foo">
+                                <foo:name>Banana</foo:name>
+                            </foo:fruit>
+                        </committer>
+                        <message>Initial commit</message>
+                        <foo:fruit xmlns:foo="foo">
+                            <foo:name>Banana</foo:name>
+                        </foo:fruit>
+                        <foo:fruit xmlns:foo="foo">
+                            <foo:name>Banana</foo:name>
+                        </foo:fruit>
+                    </commit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </commits>
+                <notes>Commentary here</notes>
+                <foo:fruit xmlns:foo="foo">
+                    <foo:name>Banana</foo:name>
+                </foo:fruit>
+                <foo:fruit xmlns:foo="foo">
+                    <foo:name>Banana</foo:name>
+                </foo:fruit>
+            </pedigree>
+            <foo:fruit xmlns:foo="foo">
+                <foo:name>Banana</foo:name>
+            </foo:fruit>
+            <foo:fruit xmlns:foo="foo">
+                <foo:name>Banana</foo:name>
+            </foo:fruit>
+        </component>
+        <foo:fruit xmlns:foo="foo">
+            <foo:name>Banana</foo:name>
+        </foo:fruit>
+        <foo:fruit xmlns:foo="foo">
+            <foo:name>Banana</foo:name>
+        </foo:fruit>
+    </components>
+    <foo:fruit xmlns:foo="foo">
+        <foo:name>Banana</foo:name>
+    </foo:fruit>
+    <foo:fruit xmlns:foo="foo">
+        <foo:name>Banana</foo:name>
+    </foo:fruit>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/valid-license-expression-1.1.xml b/tests/_data/schemaTestData/1.1/valid-license-expression-1.1.xml
new file mode 100644
index 000000000..436c09a19
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/valid-license-expression-1.1.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/valid-license-id-1.1.xml b/tests/_data/schemaTestData/1.1/valid-license-id-1.1.xml
new file mode 100644
index 000000000..fdd25ac6f
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/valid-license-id-1.1.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/valid-license-name-1.1.xml b/tests/_data/schemaTestData/1.1/valid-license-name-1.1.xml
new file mode 100644
index 000000000..d3a72f137
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/valid-license-name-1.1.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Apache License 2.0</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/valid-minimal-viable-1.1.xml b/tests/_data/schemaTestData/1.1/valid-minimal-viable-1.1.xml
new file mode 100644
index 000000000..6d681aabc
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/valid-minimal-viable-1.1.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/valid-random-attributes-1.1.xml b/tests/_data/schemaTestData/1.1/valid-random-attributes-1.1.xml
new file mode 100644
index 000000000..15525e880
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/valid-random-attributes-1.1.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<bom foo="bar" bar="foo" serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components foo="bar" bar="foo" >
+        <component foo="bar" bar="foo"  type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors foo="bar" bar="foo">
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+                <notes>Commentary here</notes>
+            </pedigree>
+        </component>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="documentation">
+                    <url>http://example.org/docs</url>
+                    <comment>All component versions are documented here</comment>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.org/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+        <component type="framework">
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Some random license</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.1/valid-xml-signature-1.1.xml b/tests/_data/schemaTestData/1.1/valid-xml-signature-1.1.xml
new file mode 100644
index 000000000..b3a7ccaa9
--- /dev/null
+++ b/tests/_data/schemaTestData/1.1/valid-xml-signature-1.1.xml
@@ -0,0 +1,177 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.1">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                        
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>jdoe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>jdoe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+            </pedigree>
+        </component>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/xml" encoding="base64">blah</text>
+                    <url>fdaf</url>
+                </license>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+        </component>
+        <component type="framework">
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
+<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
+<ds:Reference URI="" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+<ds:Transforms xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
+</ds:Transforms>
+<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
+<ds:DigestValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">PrB8/rofGs34XwIX5OIdYSjV2aKSe5VaztJKBvsgjIk=</ds:DigestValue>
+</ds:Reference>
+</ds:SignedInfo>
+<ds:SignatureValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+ePGNg30Zl9CW7RZdcRn8gFCp1AlWncjudA9pQDXyqZOvyj9RC2YtkI688WdfDOdVRZs6mflJFXr7
+IKA9wY6jVrEqZmlef55Qp/8iGwOjOjWbwYsm2AhrdkUi9gaFSWEd8uITYHOpWbiPFSsnimiK9+ft
+56dkg/oJMLdXzlaukzq9iGkRcafRkW433OQcZIXwD2K8lg4cdD0pNNNqBa+PgIvzbxA5H84TyQDB
+HBcQiw/j1edRBJgPOwlqzZDUawOJaFhAPUQ+GGKMetIJH2FqqrHXGuV1NIwnbWTCg40RdOcBdCrl
+PDtDVjFh34uZ4dYBpJBIlM4daD2N4B6WPB5iHRyuZTczF2q03ObabuTgkpK6EeadFVqFNsEOOPPt
+MDDyda+Lwff5KjvUHvRRtUDIOm2rNIQKzaseulwYcA9UWQHAFcupJmWcLLM4zzY7F/uOdZuSurzh
+U6h5kdb76Juepof6ee4Q5YpwNOGNL5JfB4C3sc/Dbbv8dZ8OuXFYSZN7reUGZzCNksByqERPEbAe
+n1ldJu1HnRXRQpwaon8Asy9CuNmPfFCfDwOs2B4p4tb+tLNIKFHdRlpd19Zr9vCMCbltXeqq0Cpq
+OejSyLYGqSWzzzUh449dJrg6KTevrTNEln5GAlLBFSdjM5JA7KV2u/GyDVFwSEW7UKooGN4CtgU=
+</ds:SignatureValue>
+<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+<ds:X509Data xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+<ds:X509SubjectName xmlns:ds="http://www.w3.org/2000/09/xmldsig#">CN=bomsigner,OU=development,O=cyclonedx</ds:X509SubjectName>
+<ds:X509Certificate xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+MIIE+DCCAuCgAwIBAgIEXGzayTANBgkqhkiG9w0BAQsFADA+MRIwEAYDVQQKDAljeWNsb25lZHgx
+FDASBgNVBAsMC2RldmVsb3BtZW50MRIwEAYDVQQDDAlib21zaWduZXIwHhcNMTkwMjIwMDQ0MjQ5
+WhcNNDkwMjIwMDQ0MjQ5WjA+MRIwEAYDVQQKDAljeWNsb25lZHgxFDASBgNVBAsMC2RldmVsb3Bt
+ZW50MRIwEAYDVQQDDAlib21zaWduZXIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCo
+5JZsM4ZLfWW/dpRlU6CpnItWspddF+bEVDETKVwVj9tGpqR5jURgKS/BOQP2TGUsR3/ZJJBhYRll
+ONhrUQrVKV/I6wp3Z40qPEa1RJLE+QlG9iL8qBV52CnXkLmnUSax3dspSzmSct5vDiTnvpHG9jr0
+AKFeTjy7U9rv8GJybz0ijwlpBoO9JRdYPX2PrrzoSeJLoxKq+GwuyCZ5LhXRN0p1a+NAirTAmY+c
+G1ZTLkMmfeCUy1t6H/bG4RnYOSSPOvk7Rb68lQpUqb+pbbNuB2o/b9cDwtLLCtGVlu+5Wj8mrytY
+3FGFQM20j3yVeRInmGqTTDBelQa/CO4JKqBlmaeYEIvNYbFs9+AlqadivwDO51RpdPo9fPSpsBpy
+ZMv6S2bXNuUML+Rk99WyKJTPM0PTZhRLZ64ZXEhlz3kQWVoSlrcwwim6sj6LRUb5IRqA3lxRFUI6
+NXKyiQLamQp+t3/9OGW9L1rLCcw7yFo0s8LhMTPMiv4ol9/hQViT+8ICzDsr0OM9ZiF4/UagFRlt
+IClV70cjh1DpsZjzQIRVGaj8uQ/JdtfRz4E43Ki7U0a2Vpho/t6poLVndv46tkX5nYGtMW4WfMoD
+ZflQ9pajvvKtr2jB1wob6nsU+VTmAcWZy4BCPH+XyfDw/0SFBdUceJJJtPWIeYFDUY7onptf+wID
+AQABMA0GCSqGSIb3DQEBCwUAA4ICAQCOVariNgK+9OF/5T9ZaSvZbkk45RTmzgQNXtFc5xfRvqwP
+s+pu/DFXm1R+ltjyS5j3w6NBZUFUI5MqLQr6JEEDrbu8BvfBO57wJNAEATj1JIHEfDfh7BxnBF8f
+oYFOwbrh4jOt0wz0FW2obsSVmF4GSvS7tTlWqTcsxjdZVmwP40RWu18B9jzv7M61adrWD3ksDA5O
+amSOsZi3Nt0aacDkyGRdCIEFi0fplxQInXMtD1z3RhXu2JSTAIr54Cei49Bh71kAXSWHMCog/f8a
+lSrZyqZBty/ACfU9DqlPIM+giHePKm4z2bcdpUdKZk6wcKDn4CvuBOqsMBMg7L05UEyyqTPD/4dk
+2GwJ8Nv0E5gsYHCIXF2cZ3OUVsw0mB/ozleEJVDE02uZZN/1wW1Xq028LsMdgN0Wk1WvWyF5MEdh
+nPWuhqp6tNaDI/kK6XQF+LjYJUzua3AQFOHfYNLKhO6d+bJ4rr0833v4v3cLW34kbXkKb6U3Yv8X
+SK3jBGCACiPgnc0N6awkh1kDlrZQ7GMsl14c+2+vpl9Lf0sL0mRUIyICfSC8MjlsP/BZH3emyfsk
+iWivPALomycKqP+PSkt1WaWApGENZWk1wNN99FYSYlt6LViW2p6T97fRx4jPRlHu+wecfD2k9RP4
+bt5W2HWfOP0zNAS7SnAVLEl2QZxXKw==
+</ds:X509Certificate>
+</ds:X509Data>
+<ds:KeyValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+<ds:RSAKeyValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+<ds:Modulus xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+qOSWbDOGS31lv3aUZVOgqZyLVrKXXRfmxFQxEylcFY/bRqakeY1EYCkvwTkD9kxlLEd/2SSQYWEZ
+ZTjYa1EK1SlfyOsKd2eNKjxGtUSSxPkJRvYi/KgVedgp15C5p1Emsd3bKUs5knLebw4k576RxvY6
+9AChXk48u1Pa7/Bicm89Io8JaQaDvSUXWD19j6686EniS6MSqvhsLsgmeS4V0TdKdWvjQIq0wJmP
+nBtWUy5DJn3glMtbeh/2xuEZ2Dkkjzr5O0W+vJUKVKm/qW2zbgdqP2/XA8LSywrRlZbvuVo/Jq8r
+WNxRhUDNtI98lXkSJ5hqk0wwXpUGvwjuCSqgZZmnmBCLzWGxbPfgJamnYr8AzudUaXT6PXz0qbAa
+cmTL+ktm1zblDC/kZPfVsiiUzzND02YUS2euGVxIZc95EFlaEpa3MMIpurI+i0VG+SEagN5cURVC
+OjVysokC2pkKfrd//ThlvS9aywnMO8haNLPC4TEzzIr+KJff4UFYk/vCAsw7K9DjPWYheP1GoBUZ
+bSApVe9HI4dQ6bGY80CEVRmo/LkPyXbX0c+BONyou1NGtlaYaP7eqaC1Z3b+OrZF+Z2BrTFuFnzK
+A2X5UPaWo77yra9owdcKG+p7FPlU5gHFmcuAQjx/l8nw8P9EhQXVHHiSSbT1iHmBQ1GO6J6bX/s=
+</ds:Modulus>
+<ds:Exponent xmlns:ds="http://www.w3.org/2000/09/xmldsig#">AQAB</ds:Exponent>
+</ds:RSAKeyValue>
+</ds:KeyValue>
+</ds:KeyInfo>
+</ds:Signature></bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.2/invalid-bomformat-1.2.json b/tests/_data/schemaTestData/1.2/invalid-bomformat-1.2.json
new file mode 100644
index 000000000..ab493ea09
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-bomformat-1.2.json
@@ -0,0 +1,8 @@
+{
+  "bomFormat": "AnotherFormat",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-component-ref-1.2.json b/tests/_data/schemaTestData/1.2/invalid-component-ref-1.2.json
new file mode 100644
index 000000000..570520d4a
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-component-ref-1.2.json
@@ -0,0 +1,20 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "bom-ref": "123",
+      "name": "acme-library",
+      "version": "1.0.0"
+    },
+    {
+      "type": "library",
+      "bom-ref": "123",
+      "name": "acme-library",
+      "version": "1.0.0"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-component-ref-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-component-ref-1.2.xml
new file mode 100644
index 000000000..7ddef820b
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-component-ref-1.2.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="library" bom-ref="123">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <components>
+                <component type="library" bom-ref="123">
+                    <name>acme-library</name>
+                    <version>1.0.0</version>
+                </component>
+            </components>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-component-swid-1.2.json b/tests/_data/schemaTestData/1.2/invalid-component-swid-1.2.json
new file mode 100644
index 000000000..e93d6ed15
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-component-swid-1.2.json
@@ -0,0 +1,18 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "application",
+      "author": "Acme Super Heros",
+      "name": "Acme Application",
+      "version": "9.1.1",
+      "swid": {
+        "name": "Acme Application",
+        "version": "9.1.1"
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-component-swid-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-component-swid-1.2.xml
new file mode 100644
index 000000000..4aac9cbed
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-component-swid-1.2.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="application">
+            <author>Acme Super Heros</author>
+            <name>Acme Application</name>
+            <version>9.1.1</version>
+            <swid name="Acme Application" version="9.1.1" />
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-component-type-1.2.json b/tests/_data/schemaTestData/1.2/invalid-component-type-1.2.json
new file mode 100644
index 000000000..a34b26e31
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-component-type-1.2.json
@@ -0,0 +1,13 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "foo",
+      "name": "acme-library",
+      "version": "1.0.0"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-component-type-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-component-type-1.2.xml
new file mode 100644
index 000000000..881350ab2
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-component-type-1.2.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="foo">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-dependency-1.2.json b/tests/_data/schemaTestData/1.2/invalid-dependency-1.2.json
new file mode 100644
index 000000000..248d4f8f8
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-dependency-1.2.json
@@ -0,0 +1,37 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "bom-ref": "library-a",
+      "type": "library",
+      "name": "library-a",
+      "version": "1.0.0"
+    },
+    {
+      "bom-ref": "library-b",
+      "type": "library",
+      "name": "library-b",
+      "version": "1.0.0"
+    },
+    {
+      "bom-ref": "library-c",
+      "type": "library",
+      "name": "library-c",
+      "version": "1.0.0"
+    }
+  ],
+  "dependencies": [
+    {
+      "dependsOn": []
+    },
+    {
+      "ref": "library-b",
+      "dependsOn": [
+        "library-c"
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-dependency-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-dependency-1.2.xml
new file mode 100644
index 000000000..b954f29d4
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-dependency-1.2.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="library" bom-ref="library-a">
+            <name>acme-library-a</name>
+            <version>1.0.0</version>
+        </component>
+        <component type="library" bom-ref="library-b">
+            <name>acme-library-b</name>
+            <version>1.0.0</version>
+        </component>
+        <component type="library" bom-ref="library-c">
+            <name>acme-library-b</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+    <dependencies>
+        <dependency />
+        <dependency ref="library-b">
+            <dependency ref="library-c"/>
+        </dependency>
+    </dependencies>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-empty-component-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-empty-component-1.2.xml
new file mode 100644
index 000000000..af24c96ad
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-empty-component-1.2.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="application">
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-hash-alg-1.2.json b/tests/_data/schemaTestData/1.2/invalid-hash-alg-1.2.json
new file mode 100644
index 000000000..9a4a50472
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-hash-alg-1.2.json
@@ -0,0 +1,32 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "scope": "required",
+      "hashes": [
+        {
+          "alg": "FOO",
+          "content": "3942447fac867ae5cdb3229b658f4d48"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-hash-alg-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-hash-alg-1.2.xml
new file mode 100644
index 000000000..7f4f077f5
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-hash-alg-1.2.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="FOO">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-hash-md5-1.2.json b/tests/_data/schemaTestData/1.2/invalid-hash-md5-1.2.json
new file mode 100644
index 000000000..9edb2eb4f
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-hash-md5-1.2.json
@@ -0,0 +1,32 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "scope": "required",
+      "hashes": [
+        {
+          "alg": "MD5",
+          "content": "foo"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-hash-md5-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-hash-md5-1.2.xml
new file mode 100644
index 000000000..1f12a35b1
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-hash-md5-1.2.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">foo</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-hash-sha1-1.2.json b/tests/_data/schemaTestData/1.2/invalid-hash-sha1-1.2.json
new file mode 100644
index 000000000..7cfa1e04d
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-hash-sha1-1.2.json
@@ -0,0 +1,32 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "scope": "required",
+      "hashes": [
+        {
+          "alg": "MD5",
+          "content": "3942447fac867ae5cdb3229b658f4d48"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "foo"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-hash-sha1-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-hash-sha1-1.2.xml
new file mode 100644
index 000000000..8c660bda5
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-hash-sha1-1.2.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">foo</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-hash-sha256-1.2.json b/tests/_data/schemaTestData/1.2/invalid-hash-sha256-1.2.json
new file mode 100644
index 000000000..3ec0bdd5f
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-hash-sha256-1.2.json
@@ -0,0 +1,32 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "scope": "required",
+      "hashes": [
+        {
+          "alg": "MD5",
+          "content": "3942447fac867ae5cdb3229b658f4d48"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "foo"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-hash-sha256-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-hash-sha256-1.2.xml
new file mode 100644
index 000000000..13954ca39
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-hash-sha256-1.2.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">foo</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-hash-sha512-1.2.json b/tests/_data/schemaTestData/1.2/invalid-hash-sha512-1.2.json
new file mode 100644
index 000000000..a80fb9c86
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-hash-sha512-1.2.json
@@ -0,0 +1,32 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "scope": "required",
+      "hashes": [
+        {
+          "alg": "MD5",
+          "content": "3942447fac867ae5cdb3229b658f4d48"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "foo"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-hash-sha512-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-hash-sha512-1.2.xml
new file mode 100644
index 000000000..36bd80937
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-hash-sha512-1.2.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">foo</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-issue-type-1.2.json b/tests/_data/schemaTestData/1.2/invalid-issue-type-1.2.json
new file mode 100644
index 000000000..ce04bd3f5
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-issue-type-1.2.json
@@ -0,0 +1,48 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "group": "com.acme",
+      "name": "sample-library",
+      "version": "1.0.0",
+      "pedigree": {
+        "ancestors": [
+          {
+            "type": "library",
+            "group": "org.example",
+            "name": "sample-library",
+            "version": "1.0.0"
+          }
+        ],
+        "patches": [
+          {
+            "type": "unofficial",
+            "diff": {
+              "text": {
+                "contentType": "text/plain",
+                "encoding": "base64",
+                "content": "blah"
+              },
+              "url": "uri/to/changes.diff"
+            },
+            "resolves": [
+              {
+                "type": "foo",
+                "id": "JIRA-17240",
+                "description": "Great new feature that does something",
+                "source": {
+                  "name": "Acme Org",
+                  "url": "https://issues.acme.org/17240"
+                }
+              }
+            ]
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-issue-type-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-issue-type-1.2.xml
new file mode 100644
index 000000000..611fc2eba
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-issue-type-1.2.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="library">
+            <group>com.acme</group>
+            <name>sample-library</name>
+            <version>1.0.0</version>
+            <pedigree>
+                <ancestors>
+                    <component type="library">
+                        <group>org.example</group>
+                        <name>sample-library</name>
+                        <version>1.0.0</version>
+                    </component>
+                </ancestors>
+                <patches>
+                    <patch type="unofficial">
+                        <diff>
+                            <text content-type="text/plain" encoding="base64">blah</text>
+                            <url>uri/to/changes.diff</url>
+                        </diff>
+                        <resolves>
+                            <issue type="foo">
+                                <id>JIRA-17240</id>
+                                <description>Great new feature that does something</description>
+                                <source>
+                                    <name>Acme Org</name>
+                                    <url>https://issues.acme.org/17240</url>
+                                </source>
+                            </issue>
+                        </resolves>
+                    </patch>
+                </patches>
+            </pedigree>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-license-choice-1.2.json b/tests/_data/schemaTestData/1.2/invalid-license-choice-1.2.json
new file mode 100644
index 000000000..2084a1977
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-license-choice-1.2.json
@@ -0,0 +1,23 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "licenses": [
+        {
+          "expression": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0",
+          "license": {
+            "name": "Apache License 2.0"
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-license-choice-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-license-choice-1.2.xml
new file mode 100644
index 000000000..02396c08b
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-license-choice-1.2.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-license-encoding-1.2.json b/tests/_data/schemaTestData/1.2/invalid-license-encoding-1.2.json
new file mode 100644
index 000000000..c46dbce8e
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-license-encoding-1.2.json
@@ -0,0 +1,28 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "licenses": [
+        {
+          "license": {
+            "id": "Apache-2.0",
+            "text": {
+              "contentType": "text/plain",
+              "encoding": "base85",
+              "content": "CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4="
+            },
+            "url": "https://www.apache.org/licenses/LICENSE-2.0.txt"
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-license-encoding-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-license-encoding-1.2.xml
new file mode 100644
index 000000000..e003ce04e
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-license-encoding-1.2.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base85">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-license-id-1.2.json b/tests/_data/schemaTestData/1.2/invalid-license-id-1.2.json
new file mode 100644
index 000000000..3e16a5c6d
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-license-id-1.2.json
@@ -0,0 +1,22 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "licenses": [
+        {
+          "license": {
+            "id": "Apache-2"
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-license-id-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-license-id-1.2.xml
new file mode 100644
index 000000000..f85430021
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-license-id-1.2.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-license-id-count-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-license-id-count-1.2.xml
new file mode 100644
index 000000000..cca7e050e
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-license-id-count-1.2.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>MIT</id>
+                    <!-- This was a defect in schema 1.0 and is no longer permitted -->
+                    <id>MIT</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-license-name-count-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-license-name-count-1.2.xml
new file mode 100644
index 000000000..0d335e165
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-license-name-count-1.2.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Apache License 2.0</name>
+                    <!-- This was a defect in schema 1.0 and is no longer permitted -->
+                    <name>Apache License 2.0</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-metadata-timestamp-1.2.json b/tests/_data/schemaTestData/1.2/invalid-metadata-timestamp-1.2.json
new file mode 100644
index 000000000..b1dcfa8de
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-metadata-timestamp-1.2.json
@@ -0,0 +1,10 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "timestamp": "2020-04-13"
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-metadata-timestamp-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-metadata-timestamp-1.2.xml
new file mode 100644
index 000000000..b34b81e7f
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-metadata-timestamp-1.2.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <metadata>
+        <timestamp>2020-04-07</timestamp>
+    </metadata>
+    <components />
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-missing-component-type-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-missing-component-type-1.2.xml
new file mode 100644
index 000000000..91dd27755
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-missing-component-type-1.2.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component>
+            <name>acme-library</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-namespace-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-namespace-1.2.xml
new file mode 100644
index 000000000..9e42be401
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-namespace-1.2.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/12">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+                <notes>Commentary here</notes>
+            </pedigree>
+        </component>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="documentation">
+                    <url>http://example.org/docs</url>
+                    <comment>All component versions are documented here</comment>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.org/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+        <component type="framework">
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Some random license</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-patch-type-1.2.json b/tests/_data/schemaTestData/1.2/invalid-patch-type-1.2.json
new file mode 100644
index 000000000..4a1eb80aa
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-patch-type-1.2.json
@@ -0,0 +1,48 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "group": "com.acme",
+      "name": "sample-library",
+      "version": "1.0.0",
+      "pedigree": {
+        "ancestors": [
+          {
+            "type": "library",
+            "group": "org.example",
+            "name": "sample-library",
+            "version": "1.0.0"
+          }
+        ],
+        "patches": [
+          {
+            "type": "foo",
+            "diff": {
+              "text": {
+                "contentType": "text/plain",
+                "encoding": "base64",
+                "content": "blah"
+              },
+              "url": "uri/to/changes.diff"
+            },
+            "resolves": [
+              {
+                "type": "enhancement",
+                "id": "JIRA-17240",
+                "description": "Great new feature that does something",
+                "source": {
+                  "name": "Acme Org",
+                  "url": "https://issues.acme.org/17240"
+                }
+              }
+            ]
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-patch-type-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-patch-type-1.2.xml
new file mode 100644
index 000000000..8a5ba4609
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-patch-type-1.2.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="library">
+            <group>com.acme</group>
+            <name>sample-library</name>
+            <version>1.0.0</version>
+            <pedigree>
+                <ancestors>
+                    <component type="library">
+                        <group>org.example</group>
+                        <name>sample-library</name>
+                        <version>1.0.0</version>
+                    </component>
+                </ancestors>
+                <patches>
+                    <patch type="foo">
+                        <diff>
+                            <text content-type="text/plain" encoding="base64">blah</text>
+                            <url>uri/to/changes.diff</url>
+                        </diff>
+                        <resolves>
+                            <issue type="enhancement">
+                                <id>JIRA-17240</id>
+                                <description>Great new feature that does something</description>
+                                <source>
+                                    <name>Acme Org</name>
+                                    <url>https://issues.acme.org/17240</url>
+                                </source>
+                            </issue>
+                        </resolves>
+                    </patch>
+                </patches>
+            </pedigree>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-scope-1.2.json b/tests/_data/schemaTestData/1.2/invalid-scope-1.2.json
new file mode 100644
index 000000000..987481fce
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-scope-1.2.json
@@ -0,0 +1,14 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "scope": "foo"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-scope-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-scope-1.2.xml
new file mode 100644
index 000000000..b1e610126
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-scope-1.2.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>foo</scope>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-serialnumber-1.2.json b/tests/_data/schemaTestData/1.2/invalid-serialnumber-1.2.json
new file mode 100644
index 000000000..691956ad3
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-serialnumber-1.2.json
@@ -0,0 +1,8 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f",
+  "version": 1,
+  "components": [
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-serialnumber-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-serialnumber-1.2.xml
new file mode 100644
index 000000000..1fabd2436
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-serialnumber-1.2.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+                <notes>Commentary here</notes>
+            </pedigree>
+        </component>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="documentation">
+                    <url>http://example.org/docs</url>
+                    <comment>All component versions are documented here</comment>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.org/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+        <component type="framework">
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Some random license</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/invalid-service-data-1.2.json b/tests/_data/schemaTestData/1.2/invalid-service-data-1.2.json
new file mode 100644
index 000000000..b341c481f
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-service-data-1.2.json
@@ -0,0 +1,20 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "services": [
+    {
+      "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8",
+      "name": "Stock ticker service",
+      "authenticated": true,
+      "x-trust-boundary": true,
+      "data": [
+        {
+          "classification": "foo",
+          "flow": "bar"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/invalid-service-data-1.2.xml b/tests/_data/schemaTestData/1.2/invalid-service-data-1.2.xml
new file mode 100644
index 000000000..5ef788902
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/invalid-service-data-1.2.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <services>
+        <service bom-ref="b2a46a4b-8367-4bae-9820-95557cfe03a8">
+            <name>Stock ticker service</name>
+            <data>
+                <classification flow="foo">bar</classification>
+            </data>
+        </service>
+    </services>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/skip_invalid-empty-component-1.2.json b/tests/_data/schemaTestData/1.2/skip_invalid-empty-component-1.2.json
new file mode 100644
index 000000000..fa916a9e1
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/skip_invalid-empty-component-1.2.json
@@ -0,0 +1,12 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "$comment": "expected to fail, since `name` and `version` are missing. But in fact `name` and `version` are optional as they have a default value in CDX-v1.2"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/skip_invalid-missing-component-type-1.2.json b/tests/_data/schemaTestData/1.2/skip_invalid-missing-component-type-1.2.json
new file mode 100644
index 000000000..141da0727
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/skip_invalid-missing-component-type-1.2.json
@@ -0,0 +1,13 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "name": "acme-library",
+      "version": "1.0.0",
+      "$comment": "expected to fail, since `type` is missing. But in fact `type` is optional as it has a default value in CDX-v1.2"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-assembly-1.2.json b/tests/_data/schemaTestData/1.2/valid-assembly-1.2.json
new file mode 100644
index 000000000..2516922c6
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-assembly-1.2.json
@@ -0,0 +1,30 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library-a",
+      "version": "1.0.0",
+      "components": [
+        {
+          "type": "library",
+          "name": "acme-library-b",
+          "version": "2.0.0"
+        }
+      ]
+    }
+  ],
+  "services": [
+    {
+      "name": "acme-service-a",
+      "services": [
+        {
+          "name": "acme-service-b"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-assembly-1.2.xml b/tests/_data/schemaTestData/1.2/valid-assembly-1.2.xml
new file mode 100644
index 000000000..c58ef4d2a
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-assembly-1.2.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="library">
+            <name>acme-library-a</name>
+            <version>1.0.0</version>
+            <components>
+                <component type="library">
+                    <name>acme-library-b</name>
+                    <version>2.0.0</version>
+                </component>
+            </components>
+        </component>
+    </components>
+    <services>
+        <service>
+            <name>acme-service-a</name>
+            <services>
+                <service>
+                    <name>acme-service-b</name>
+                </service>
+            </services>
+        </service>
+    </services>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-bom-1.2.json b/tests/_data/schemaTestData/1.2/valid-bom-1.2.json
new file mode 100644
index 000000000..629793568
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-bom-1.2.json
@@ -0,0 +1,177 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "timestamp": "2020-04-13T20:20:39+00:00",
+    "tools": [
+      {
+        "vendor": "Awesome Vendor",
+        "name": "Awesome Tool",
+        "version": "9.1.2",
+        "hashes": [
+          {
+            "alg": "SHA-1",
+            "content": "25ed8e31b995bb927966616df2a42b979a2717f0"
+          },
+          {
+            "alg": "SHA-256",
+            "content": "a74f733635a19aefb1f73e5947cef59cd7440c6952ef0f03d09d974274cbd6df"
+          }
+        ]
+      }
+    ],
+    "authors": [
+      {
+        "name": "Samantha Wright",
+        "email": "samantha.wright@example.com",
+        "phone": "800-555-1212"
+      }
+    ],
+    "component": {
+      "type": "application",
+      "author": "Acme Super Heros",
+      "name": "Acme Application",
+      "version": "9.1.1",
+      "swid": {
+        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
+        "name": "Acme Application",
+        "version": "9.1.1",
+        "text": {
+          "contentType": "text/xml",
+          "encoding": "base64",
+          "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg=="
+        }
+      }
+    },
+    "manufacture": {
+      "name": "Acme, Inc.",
+      "url": [
+        "https://example.com"
+      ],
+      "contact": [
+        {
+          "name": "Acme Professional Services",
+          "email": "professional.services@example.com"
+        }
+      ]
+    },
+    "supplier": {
+      "name": "Acme, Inc.",
+      "url": [
+        "https://example.com"
+      ],
+      "contact": [
+        {
+          "name": "Acme Distribution",
+          "email": "distribution@example.com"
+        }
+      ]
+    }
+  },
+  "components": [
+    {
+      "bom-ref": "pkg:npm/acme/component@1.0.0",
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "hashes": [
+        {
+          "alg": "MD5",
+          "content": "3942447fac867ae5cdb3229b658f4d48"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282"
+        }
+      ],
+      "licenses": [
+        {
+          "license": {
+            "id": "Apache-2.0",
+            "text": {
+              "contentType": "text/plain",
+              "encoding": "base64",
+              "content": "CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4="
+            },
+            "url": "https://www.apache.org/licenses/LICENSE-2.0.txt"
+          }
+        }
+      ],
+      "purl": "pkg:npm/acme/component@1.0.0",
+      "pedigree": {
+        "ancestors": [
+          {
+            "type": "library",
+            "publisher": "Acme Inc",
+            "group": "com.acme",
+            "name": "tomcat-catalina",
+            "version": "9.0.14"
+          },
+          {
+            "type": "library",
+            "publisher": "Acme Inc",
+            "group": "com.acme",
+            "name": "tomcat-catalina",
+            "version": "9.0.14"
+          }
+        ],
+        "commits": [
+          {
+            "uid": "7638417db6d59f3c431d3e1f261cc637155684cd",
+            "url": "https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd",
+            "author": {
+              "timestamp": "2018-11-13T20:20:39+00:00",
+              "name": "me",
+              "email": "me@acme.org"
+            }
+          }
+        ]
+      }
+    },
+    {
+      "type": "library",
+      "supplier": {
+        "name": "Example, Inc.",
+        "url": [
+          "https://example.com",
+          "https://example.net"
+        ],
+        "contact": [
+          {
+            "name": "Example Support AMER Distribution",
+            "email": "support@example.com",
+            "phone": "800-555-1212"
+          },
+          {
+            "name": "Example Support APAC",
+            "email": "support@apac.example.com"
+          }
+        ]
+      },
+      "author": "Example Super Heros",
+      "group": "org.example",
+      "name": "mylibrary",
+      "version": "1.0.0"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:npm/acme/component@1.0.0",
+      "dependsOn": [
+        "pkg:npm/acme/component@1.0.0"
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-bom-1.2.xml b/tests/_data/schemaTestData/1.2/valid-bom-1.2.xml
new file mode 100644
index 000000000..6be1b4f06
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-bom-1.2.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <metadata>
+        <timestamp>2020-04-07T07:01:00Z</timestamp>
+        <tools>
+            <tool>
+                <vendor>Awesome Vendor</vendor>
+                <name>Awesome Tool</name>
+                <version>9.1.2</version>
+                <hashes>
+                    <hash alg="SHA-1">25ed8e31b995bb927966616df2a42b979a2717f0</hash>
+                    <hash alg="SHA-256">a74f733635a19aefb1f73e5947cef59cd7440c6952ef0f03d09d974274cbd6df</hash>
+                </hashes>
+            </tool>
+        </tools>
+        <authors>
+            <author>
+                <name>Samantha Wright</name>
+                <email>samantha.wright@example.com</email>
+                <phone>800-555-1212</phone>
+            </author>
+        </authors>
+        <component type="application">
+            <author>Acme Super Heros</author>
+            <name>Acme Application</name>
+            <version>9.1.1</version>
+            <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Acme Application" version="9.1.1">
+                <text content-type="text/xml" encoding="base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==</text>
+            </swid>
+        </component>
+        <manufacture>
+            <name>Acme, Inc.</name>
+            <url>https://example.com</url>
+            <contact>
+                <name>Acme Professional Services</name>
+                <email>professional.services@example.com</email>
+            </contact>
+        </manufacture>
+        <supplier>
+            <name>Acme, Inc.</name>
+            <url>https://example.com</url>
+            <contact>
+                <name>Acme Distribution</name>
+                <email>distribution@example.com</email>
+            </contact>
+        </supplier>
+    </metadata>
+    <components>
+        <component type="application">
+            <author>Acme Super Heros</author>
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <author>Apache Super Heros</author>
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+                <notes>Commentary here</notes>
+            </pedigree>
+        </component>
+        <component type="library">
+            <supplier>
+                <name>Example Inc.</name>
+                <url>https://example.com</url>
+                <url>https://example.net</url>
+                <contact>
+                    <name>Example Support AMER</name>
+                    <email>support@example.com</email>
+                    <phone>800-555-1212</phone>
+                </contact>
+                <contact>
+                    <name>Example Support APAC</name>
+                    <email>support@apac.example.com</email>
+                </contact>
+            </supplier>
+            <author>Example Super Heros</author>
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0-with-classpath-exception</expression>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="documentation">
+                    <url>http://example.org/docs</url>
+                    <comment>All component versions are documented here</comment>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.org/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+        <component type="framework">
+            <author>Example Super Heros</author>
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Some random license</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-component-hashes-1.2.json b/tests/_data/schemaTestData/1.2/valid-component-hashes-1.2.json
new file mode 100644
index 000000000..98d4285e5
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-component-hashes-1.2.json
@@ -0,0 +1,63 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-example",
+      "version": "1.0.0",
+      "hashes": [
+        {
+          "alg": "MD5",
+          "content": "641b6e166f8b33c5e959e2adcc18b1c7"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "9188560f22e0b73070d2efce670c74af2bdf30af"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "d88bc4e70bfb34d18b5542136639acbb26a8ae2429aa1e47489332fb389cc964"
+        },
+        {
+          "alg": "SHA-384",
+          "content": "d4835048a0f57c74b8fb617d5366ab81376fc92bebe9a93bf24ba7f9da6c9aeeb6179f5d1361f6533211b15f3224cbad"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "74a51ff45e4c11df9ba1f0094282c80489649cb157a75fa337992d2d4592a5a1b8cb4525de8db0ae25233553924d76c36e093ea7fa9df4e5b8b07fd2e074efd6"
+        },
+        {
+          "alg": "SHA3-256",
+          "content": "7478c7cf41c883a04ee89f1813f687886d53fa86f791fff90690c6221e3853aa"
+        },
+        {
+          "alg": "SHA3-384",
+          "content": "a1eea7229716487ad2ebe96b2f997a8408f32f14047994fbcc99b49012cf86c96dbd518e5d57a61b0e57dd37dd0b48f5"
+        },
+        {
+          "alg": "SHA3-512",
+          "content": "7d584825bc1767dfabe7e82b45ccb7a1119b145fa17e76b885e71429c706cef0a3171bc6575b968eec5da56a7966c02fec5402fcee55097ac01d40c550de9d20"
+        },
+        {
+          "alg": "BLAKE2b-256",
+          "content": "d8779633380c050bccf4e733b763ab2abd8ad2db60b517d47fd29bbf76433237"
+        },
+        {
+          "alg": "BLAKE2b-384",
+          "content": "e728ba56c2da995a559a178116c594e8bee4894a79ceb4399d8f479e5563cb1942b85936f646d14170717c576b14db7a"
+        },
+        {
+          "alg": "BLAKE2b-512",
+          "content": "f8ce8d612a6c85c96cf7cebc230f6ddef26e6cedcfbc4a41c766033cc08c6ba097d1470948226807fb2d88d2a2b6fc0ff5e5440e93a603086fdd568bafcd1a9d"
+        },
+        {
+          "alg": "BLAKE3",
+          "content": "26cdc7fb3fd65fc3b621a4ef70bc7d2489d5c19e70c76cf7ec20e538df0047cf"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-component-hashes-1.2.xml b/tests/_data/schemaTestData/1.2/valid-component-hashes-1.2.xml
new file mode 100644
index 000000000..309e0ee23
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-component-hashes-1.2.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="library">
+            <name>acme-example</name>
+            <version>1.0.0</version>
+            <hashes>
+                <hash alg="MD5">641b6e166f8b33c5e959e2adcc18b1c7</hash>
+                <hash alg="SHA-1">9188560f22e0b73070d2efce670c74af2bdf30af</hash>
+                <hash alg="SHA-256">d88bc4e70bfb34d18b5542136639acbb26a8ae2429aa1e47489332fb389cc964</hash>
+                <hash alg="SHA-384">d4835048a0f57c74b8fb617d5366ab81376fc92bebe9a93bf24ba7f9da6c9aeeb6179f5d1361f6533211b15f3224cbad</hash>
+                <hash alg="SHA-512">74a51ff45e4c11df9ba1f0094282c80489649cb157a75fa337992d2d4592a5a1b8cb4525de8db0ae25233553924d76c36e093ea7fa9df4e5b8b07fd2e074efd6</hash>
+                <hash alg="SHA3-256">7478c7cf41c883a04ee89f1813f687886d53fa86f791fff90690c6221e3853aa</hash>
+                <hash alg="SHA3-384">a1eea7229716487ad2ebe96b2f997a8408f32f14047994fbcc99b49012cf86c96dbd518e5d57a61b0e57dd37dd0b48f5</hash>
+                <hash alg="SHA3-512">7d584825bc1767dfabe7e82b45ccb7a1119b145fa17e76b885e71429c706cef0a3171bc6575b968eec5da56a7966c02fec5402fcee55097ac01d40c550de9d20</hash>
+                <hash alg="BLAKE2b-256">d8779633380c050bccf4e733b763ab2abd8ad2db60b517d47fd29bbf76433237</hash>
+                <hash alg="BLAKE2b-384">e728ba56c2da995a559a178116c594e8bee4894a79ceb4399d8f479e5563cb1942b85936f646d14170717c576b14db7a</hash>
+                <hash alg="BLAKE2b-512">f8ce8d612a6c85c96cf7cebc230f6ddef26e6cedcfbc4a41c766033cc08c6ba097d1470948226807fb2d88d2a2b6fc0ff5e5440e93a603086fdd568bafcd1a9d</hash>
+                <hash alg="BLAKE3">26cdc7fb3fd65fc3b621a4ef70bc7d2489d5c19e70c76cf7ec20e538df0047cf</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-component-ref-1.2.json b/tests/_data/schemaTestData/1.2/valid-component-ref-1.2.json
new file mode 100644
index 000000000..131af1d78
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-component-ref-1.2.json
@@ -0,0 +1,20 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "bom-ref": "123",
+      "name": "acme-library",
+      "version": "1.0.0"
+    },
+    {
+      "type": "library",
+      "bom-ref": "456",
+      "name": "acme-library",
+      "version": "1.0.0"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-component-ref-1.2.xml b/tests/_data/schemaTestData/1.2/valid-component-ref-1.2.xml
new file mode 100644
index 000000000..46d33c470
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-component-ref-1.2.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="library" bom-ref="123">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <components>
+                <component type="library" bom-ref="456">
+                    <name>acme-library</name>
+                    <version>1.0.0</version>
+                </component>
+            </components>
+        </component>
+        <component type="library" bom-ref="789">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-component-swid-1.2.json b/tests/_data/schemaTestData/1.2/valid-component-swid-1.2.json
new file mode 100644
index 000000000..96a0ae1c0
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-component-swid-1.2.json
@@ -0,0 +1,19 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "application",
+      "author": "Acme Super Heros",
+      "name": "Acme Application",
+      "version": "9.1.1",
+      "swid": {
+        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
+        "name": "Acme Application",
+        "version": "9.1.1"
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-component-swid-1.2.xml b/tests/_data/schemaTestData/1.2/valid-component-swid-1.2.xml
new file mode 100644
index 000000000..4e1fe5391
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-component-swid-1.2.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="application">
+            <author>Acme Super Heros</author>
+            <name>Acme Application</name>
+            <version>9.1.1</version>
+            <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Acme Application" version="9.1.1" />
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-component-swid-full-1.2.json b/tests/_data/schemaTestData/1.2/valid-component-swid-full-1.2.json
new file mode 100644
index 000000000..02b935e38
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-component-swid-full-1.2.json
@@ -0,0 +1,24 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "application",
+      "author": "Acme Super Heros",
+      "name": "Acme Application",
+      "version": "9.1.1",
+      "swid": {
+        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
+        "name": "Acme Application",
+        "version": "9.1.1",
+        "text": {
+          "contentType": "text/xml",
+          "encoding": "base64",
+          "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg=="
+        }
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-component-swid-full-1.2.xml b/tests/_data/schemaTestData/1.2/valid-component-swid-full-1.2.xml
new file mode 100644
index 000000000..d7bba6bce
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-component-swid-full-1.2.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="application">
+            <author>Acme Super Heros</author>
+            <name>Acme Application</name>
+            <version>9.1.1</version>
+            <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Acme Application" version="9.1.1">
+                <text content-type="text/xml" encoding="base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==</text>
+            </swid>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-component-types-1.2.json b/tests/_data/schemaTestData/1.2/valid-component-types-1.2.json
new file mode 100644
index 000000000..5ffcbd71d
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-component-types-1.2.json
@@ -0,0 +1,48 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "application",
+      "name": "application-a",
+      "version": "1.0"
+    },
+    {
+      "type": "library",
+      "name": "library-a",
+      "version": "1.0"
+    },
+    {
+      "type": "framework",
+      "name": "framework-a",
+      "version": "1.0"
+    },
+    {
+      "type": "container",
+      "name": "container-a",
+      "version": "1.0"
+    },
+    {
+      "type": "operating-system",
+      "name": "operating-system-a",
+      "version": "1.0"
+    },
+    {
+      "type": "firmware",
+      "name": "firmware-a",
+      "version": "1.0"
+    },
+    {
+      "type": "device",
+      "name": "device-a",
+      "version": "1.0"
+    },
+    {
+      "type": "file",
+      "name": "file-a",
+      "version": "1.0"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-component-types-1.2.xml b/tests/_data/schemaTestData/1.2/valid-component-types-1.2.xml
new file mode 100644
index 000000000..0349a1a45
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-component-types-1.2.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="application">
+            <name>application-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="library">
+            <name>library-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="framework">
+            <name>framework-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="container">
+            <name>container-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="operating-system">
+            <name>operating-system-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="firmware">
+            <name>firmware-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="device">
+            <name>device-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="file">
+            <name>file-a</name>
+            <version>1.0</version>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-dependency-1.2.json b/tests/_data/schemaTestData/1.2/valid-dependency-1.2.json
new file mode 100644
index 000000000..bf3a26494
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-dependency-1.2.json
@@ -0,0 +1,38 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "bom-ref": "library-a",
+      "type": "library",
+      "name": "library-a",
+      "version": "1.0.0"
+    },
+    {
+      "bom-ref": "library-b",
+      "type": "library",
+      "name": "library-b",
+      "version": "1.0.0"
+    },
+    {
+      "bom-ref": "library-c",
+      "type": "library",
+      "name": "library-c",
+      "version": "1.0.0"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "library-a",
+      "dependsOn": []
+    },
+    {
+      "ref": "library-b",
+      "dependsOn": [
+        "library-c"
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-dependency-1.2.xml b/tests/_data/schemaTestData/1.2/valid-dependency-1.2.xml
new file mode 100644
index 000000000..e245766ce
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-dependency-1.2.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="library" bom-ref="library-a">
+            <name>acme-library-a</name>
+            <version>1.0.0</version>
+        </component>
+        <component type="library" bom-ref="library-b">
+            <name>acme-library-b</name>
+            <version>1.0.0</version>
+        </component>
+        <component type="library" bom-ref="library-c">
+            <name>acme-library-b</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+    <dependencies>
+        <dependency ref="library-a"/>
+        <dependency ref="library-b">
+            <dependency ref="library-c"/>
+        </dependency>
+    </dependencies>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-empty-components-1.2.json b/tests/_data/schemaTestData/1.2/valid-empty-components-1.2.json
new file mode 100644
index 000000000..c3878bf6c
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-empty-components-1.2.json
@@ -0,0 +1,8 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-empty-components-1.2.xml b/tests/_data/schemaTestData/1.2/valid-empty-components-1.2.xml
new file mode 100644
index 000000000..cacbb9dfc
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-empty-components-1.2.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-external-elements-1.2.xml b/tests/_data/schemaTestData/1.2/valid-external-elements-1.2.xml
new file mode 100644
index 000000000..3231b7038
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-external-elements-1.2.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                                <foo:fruit xmlns:foo="foo">
+                                    <foo:name>Banana</foo:name>
+                                </foo:fruit>
+                                <foo:fruit xmlns:foo="foo">
+                                    <foo:name>Banana</foo:name>
+                                </foo:fruit>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                        <foo:fruit xmlns:foo="foo">
+                            <foo:name>Banana</foo:name>
+                        </foo:fruit>
+                        <foo:fruit xmlns:foo="foo">
+                            <foo:name>Banana</foo:name>
+                        </foo:fruit>
+                    </component>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </ancestors>
+                <descendants>
+                    <component type="library">
+                        <name>foo</name>
+                        <version>1.0</version>
+                    </component>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </descendants>
+                <variants>
+                    <component type="library">
+                        <name>bar</name>
+                        <version>1.0</version>
+                    </component>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </variants>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                            <foo:fruit xmlns:foo="foo">
+                                <foo:name>Banana</foo:name>
+                            </foo:fruit>
+                            <foo:fruit xmlns:foo="foo">
+                                <foo:name>Banana</foo:name>
+                            </foo:fruit>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                            <foo:fruit xmlns:foo="foo">
+                                <foo:name>Banana</foo:name>
+                            </foo:fruit>
+                            <foo:fruit xmlns:foo="foo">
+                                <foo:name>Banana</foo:name>
+                            </foo:fruit>
+                        </committer>
+                        <message>Initial commit</message>
+                        <foo:fruit xmlns:foo="foo">
+                            <foo:name>Banana</foo:name>
+                        </foo:fruit>
+                        <foo:fruit xmlns:foo="foo">
+                            <foo:name>Banana</foo:name>
+                        </foo:fruit>
+                    </commit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </commits>
+                <notes>Commentary here</notes>
+                <foo:fruit xmlns:foo="foo">
+                    <foo:name>Banana</foo:name>
+                </foo:fruit>
+                <foo:fruit xmlns:foo="foo">
+                    <foo:name>Banana</foo:name>
+                </foo:fruit>
+            </pedigree>
+            <foo:fruit xmlns:foo="foo">
+                <foo:name>Banana</foo:name>
+            </foo:fruit>
+            <foo:fruit xmlns:foo="foo">
+                <foo:name>Banana</foo:name>
+            </foo:fruit>
+        </component>
+        <foo:fruit xmlns:foo="foo">
+            <foo:name>Banana</foo:name>
+        </foo:fruit>
+        <foo:fruit xmlns:foo="foo">
+            <foo:name>Banana</foo:name>
+        </foo:fruit>
+    </components>
+    <foo:fruit xmlns:foo="foo">
+        <foo:name>Banana</foo:name>
+    </foo:fruit>
+    <foo:fruit xmlns:foo="foo">
+        <foo:name>Banana</foo:name>
+    </foo:fruit>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-license-expression-1.2.json b/tests/_data/schemaTestData/1.2/valid-license-expression-1.2.json
new file mode 100644
index 000000000..89c06c1ca
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-license-expression-1.2.json
@@ -0,0 +1,20 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "licenses": [
+        {
+          "expression": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-license-expression-1.2.xml b/tests/_data/schemaTestData/1.2/valid-license-expression-1.2.xml
new file mode 100644
index 000000000..53f5c1ca5
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-license-expression-1.2.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-license-id-1.2.json b/tests/_data/schemaTestData/1.2/valid-license-id-1.2.json
new file mode 100644
index 000000000..0b3ff68b1
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-license-id-1.2.json
@@ -0,0 +1,22 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "licenses": [
+        {
+          "license": {
+            "id": "Apache-2.0"
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-license-id-1.2.xml b/tests/_data/schemaTestData/1.2/valid-license-id-1.2.xml
new file mode 100644
index 000000000..2cf536cd2
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-license-id-1.2.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-license-name-1.2.json b/tests/_data/schemaTestData/1.2/valid-license-name-1.2.json
new file mode 100644
index 000000000..4dabe805b
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-license-name-1.2.json
@@ -0,0 +1,22 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "licenses": [
+        {
+          "license": {
+            "name": "Apache License 2.0"
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-license-name-1.2.xml b/tests/_data/schemaTestData/1.2/valid-license-name-1.2.xml
new file mode 100644
index 000000000..11cb08a6b
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-license-name-1.2.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Apache License 2.0</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-metadata-author-1.2.json b/tests/_data/schemaTestData/1.2/valid-metadata-author-1.2.json
new file mode 100644
index 000000000..e0c0b45ac
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-metadata-author-1.2.json
@@ -0,0 +1,16 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "authors": [
+      {
+        "name": "Samantha Wright",
+        "email": "samantha.wright@example.com",
+        "phone": "800-555-1212"
+      }
+    ]
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-metadata-author-1.2.xml b/tests/_data/schemaTestData/1.2/valid-metadata-author-1.2.xml
new file mode 100644
index 000000000..e37ac51d9
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-metadata-author-1.2.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <metadata>
+        <authors>
+            <author>
+                <name>Samantha Wright</name>
+                <email>samantha.wright@example.com</email>
+                <phone>800-555-1212</phone>
+            </author>
+        </authors>
+    </metadata>
+    <components />
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-metadata-manufacture-1.2.json b/tests/_data/schemaTestData/1.2/valid-metadata-manufacture-1.2.json
new file mode 100644
index 000000000..fb92230a6
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-metadata-manufacture-1.2.json
@@ -0,0 +1,21 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "manufacture": {
+      "name": "Acme, Inc.",
+      "url": [
+        "https://example.com"
+      ],
+      "contact": [
+        {
+          "name": "Acme Professional Services",
+          "email": "professional.services@example.com"
+        }
+      ]
+    }
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-metadata-manufacture-1.2.xml b/tests/_data/schemaTestData/1.2/valid-metadata-manufacture-1.2.xml
new file mode 100644
index 000000000..b6773a54e
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-metadata-manufacture-1.2.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <metadata>
+        <manufacture>
+            <name>Acme, Inc.</name>
+            <url>https://example.com</url>
+            <contact>
+                <name>Acme Professional Services</name>
+                <email>professional.services@example.com</email>
+            </contact>
+        </manufacture>
+    </metadata>
+    <components />
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-metadata-supplier-1.2.json b/tests/_data/schemaTestData/1.2/valid-metadata-supplier-1.2.json
new file mode 100644
index 000000000..5a241c788
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-metadata-supplier-1.2.json
@@ -0,0 +1,21 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "supplier": {
+      "name": "Acme, Inc.",
+      "url": [
+        "https://example.com"
+      ],
+      "contact": [
+        {
+          "name": "Acme Distribution",
+          "email": "distribution@example.com"
+        }
+      ]
+    }
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-metadata-supplier-1.2.xml b/tests/_data/schemaTestData/1.2/valid-metadata-supplier-1.2.xml
new file mode 100644
index 000000000..8a980b254
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-metadata-supplier-1.2.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <metadata>
+        <supplier>
+            <name>Acme, Inc.</name>
+            <url>https://example.com</url>
+            <contact>
+                <name>Acme Distribution</name>
+                <email>distribution@example.com</email>
+            </contact>
+        </supplier>
+    </metadata>
+    <components />
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-metadata-timestamp-1.2.json b/tests/_data/schemaTestData/1.2/valid-metadata-timestamp-1.2.json
new file mode 100644
index 000000000..cf242cca2
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-metadata-timestamp-1.2.json
@@ -0,0 +1,10 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "timestamp": "2020-04-13T20:20:39+00:00"
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-metadata-timestamp-1.2.xml b/tests/_data/schemaTestData/1.2/valid-metadata-timestamp-1.2.xml
new file mode 100644
index 000000000..4891b1a50
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-metadata-timestamp-1.2.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <metadata>
+        <timestamp>2020-04-07T07:01:00Z</timestamp>
+    </metadata>
+    <components />
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-metadata-tool-1.2.json b/tests/_data/schemaTestData/1.2/valid-metadata-tool-1.2.json
new file mode 100644
index 000000000..7adade0db
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-metadata-tool-1.2.json
@@ -0,0 +1,26 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "tools": [
+      {
+        "vendor": "Awesome Vendor",
+        "name": "Awesome Tool",
+        "version": "9.1.2",
+        "hashes": [
+          {
+            "alg": "SHA-1",
+            "content": "25ed8e31b995bb927966616df2a42b979a2717f0"
+          },
+          {
+            "alg": "SHA-256",
+            "content": "a74f733635a19aefb1f73e5947cef59cd7440c6952ef0f03d09d974274cbd6df"
+          }
+        ]
+      }
+    ]
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-metadata-tool-1.2.xml b/tests/_data/schemaTestData/1.2/valid-metadata-tool-1.2.xml
new file mode 100644
index 000000000..ebfc4085c
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-metadata-tool-1.2.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <metadata>
+        <tools>
+            <tool>
+                <vendor>Awesome Vendor</vendor>
+                <name>Awesome Tool</name>
+                <version>9.1.2</version>
+                <hashes>
+                    <hash alg="SHA-1">25ed8e31b995bb927966616df2a42b979a2717f0</hash>
+                    <hash alg="SHA-256">a74f733635a19aefb1f73e5947cef59cd7440c6952ef0f03d09d974274cbd6df</hash>
+                </hashes>
+            </tool>
+        </tools>
+    </metadata>
+    <components />
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-minimal-viable-1.2.json b/tests/_data/schemaTestData/1.2/valid-minimal-viable-1.2.json
new file mode 100644
index 000000000..5c9795c2e
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-minimal-viable-1.2.json
@@ -0,0 +1,13 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-minimal-viable-1.2.xml b/tests/_data/schemaTestData/1.2/valid-minimal-viable-1.2.xml
new file mode 100644
index 000000000..7088bb511
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-minimal-viable-1.2.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-patch-1.2.json b/tests/_data/schemaTestData/1.2/valid-patch-1.2.json
new file mode 100644
index 000000000..2b53cf4c5
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-patch-1.2.json
@@ -0,0 +1,88 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "group": "com.acme",
+      "name": "sample-library",
+      "version": "1.0.0",
+      "pedigree": {
+        "ancestors": [
+          {
+            "type": "library",
+            "group": "org.example",
+            "name": "sample-library",
+            "version": "1.0.0"
+          }
+        ],
+        "patches": [
+          {
+            "type": "unofficial",
+            "diff": {
+              "text": {
+                "contentType": "text/plain",
+                "encoding": "base64",
+                "content": "blah"
+              },
+              "url": "uri/to/changes.diff"
+            },
+            "resolves": [
+              {
+                "type": "enhancement",
+                "id": "JIRA-17240",
+                "description": "Great new feature that does something",
+                "source": {
+                  "name": "Acme Org",
+                  "url": "https://issues.acme.org/17240"
+                }
+              }
+            ]
+          },
+          {
+            "type": "backport",
+            "diff": {
+              "text": {
+                "contentType": "text/plain",
+                "encoding": "base64",
+                "content": "blah"
+              },
+              "url": "uri/to/changes.diff"
+            },
+            "resolves": [
+              {
+                "type": "security",
+                "id": "CVE-2019-9997",
+                "name": "CVE-2019-9997",
+                "description": "blah blah",
+                "source": {
+                  "name": "NVD",
+                  "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-9997"
+                },
+                "references": [
+                  "http://some/other/site-1",
+                  "http://some/other/site-2"
+                ]
+              },
+              {
+                "type": "defect",
+                "id": "JIRA-874319",
+                "description": "Enable to do something",
+                "source": {
+                  "name": "Example Org",
+                  "url": "https://issues.example.org/874319"
+                },
+                "references": [
+                  "http://some/other/site-1",
+                  "http://some/other/site-2"
+                ]
+              }
+            ]
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-patch-1.2.xml b/tests/_data/schemaTestData/1.2/valid-patch-1.2.xml
new file mode 100644
index 000000000..80f9984b2
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-patch-1.2.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="library">
+            <group>com.acme</group>
+            <name>sample-library</name>
+            <version>1.0.0</version>
+            <pedigree>
+                <ancestors>
+                    <component type="library">
+                        <group>org.example</group>
+                        <name>sample-library</name>
+                        <version>1.0.0</version>
+                    </component>
+                </ancestors>
+                <patches>
+                    <patch type="unofficial">
+                        <diff>
+                            <text content-type="text/plain" encoding="base64">blah</text>
+                            <url>uri/to/changes.diff</url>
+                        </diff>
+                        <resolves>
+                            <issue type="enhancement">
+                                <id>JIRA-17240</id>
+                                <description>Great new feature that does something</description>
+                                <source>
+                                    <name>Acme Org</name>
+                                    <url>https://issues.acme.org/17240</url>
+                                </source>
+                            </issue>
+                        </resolves>
+                    </patch>
+                    <patch type="backport">
+                        <diff>
+                            <text content-type="text/plain" encoding="base64">blah</text>
+                            <url>uri/to/changes.diff</url>
+                        </diff>
+                        <resolves>
+                            <issue type="security">
+                                <id>CVE-2019-9997</id>
+                                <name>CVE-2019-9997</name>
+                                <description>blah blah</description>
+                                <source>
+                                    <name>NVD</name>
+                                    <url>https://nvd.nist.gov/vuln/detail/CVE-2019-9997</url>
+                                </source>
+                                <references>
+                                    <url>http://some/other/site-1</url>
+                                    <url>http://some/other/site-2</url>
+                                </references>
+                            </issue>
+                            <issue type="defect">
+                                <id>JIRA-874319</id>
+                                <description>Enable to do something</description>
+                                <source>
+                                    <name>Example Org</name>
+                                    <url>https://issues.example.org/874319</url>
+                                </source>
+                                <references>
+                                    <url>http://some/other/site-1</url>
+                                    <url>http://some/other/site-2</url>
+                                </references>
+                            </issue>
+                        </resolves>
+                    </patch>
+                </patches>
+            </pedigree>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-random-attributes-1.2.xml b/tests/_data/schemaTestData/1.2/valid-random-attributes-1.2.xml
new file mode 100644
index 000000000..a76db616b
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-random-attributes-1.2.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<bom foo="bar" bar="foo" serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components foo="bar" bar="foo" >
+        <component foo="bar" bar="foo"  type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors foo="bar" bar="foo">
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+                <notes>Commentary here</notes>
+            </pedigree>
+        </component>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="documentation">
+                    <url>http://example.org/docs</url>
+                    <comment>All component versions are documented here</comment>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.org/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+        <component type="framework">
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Some random license</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-service-1.2.json b/tests/_data/schemaTestData/1.2/valid-service-1.2.json
new file mode 100644
index 000000000..2b75c68ba
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-service-1.2.json
@@ -0,0 +1,101 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "bom-ref": "pkg:maven/com.acme/stock-java-client@1.0.12",
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "stock-java-client",
+      "version": "1.0.12",
+      "hashes": [
+        {
+          "alg": "SHA-1",
+          "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a"
+        }
+      ],
+      "licenses": [
+        {
+          "license": {
+            "id": "Apache-2.0"
+          }
+        }
+      ],
+      "purl": "pkg:maven/com.acme/stock-java-client@1.0.12"
+    }
+  ],
+  "services": [
+    {
+      "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8",
+      "provider": {
+        "name": "Partner Org",
+        "url": [
+          "https://partner.org"
+        ],
+        "contact": [
+          {
+            "name": "Support",
+            "email": "support@partner",
+            "phone": "800-555-1212"
+          }
+        ]
+      },
+      "group": "org.partner",
+      "name": "Stock ticker service",
+      "version": "2020-Q2",
+      "description": "Provides real-time stock information",
+      "endpoints": [
+        "https://partner.org/api/v1/lookup",
+        "https://partner.org/api/v1/stock"
+      ],
+      "authenticated": true,
+      "x-trust-boundary": true,
+      "data": [
+        {
+          "classification": "PII",
+          "flow": "inbound"
+        },
+        {
+          "classification": "PIFI",
+          "flow": "outbound"
+        },
+        {
+          "classification": "pubic",
+          "flow": "bi-directional"
+        },
+        {
+          "classification": "partner-data",
+          "flow": "unknown"
+        }
+      ],
+      "licenses": [
+        {
+          "license": {
+            "name": "Partner license"
+          }
+        }
+      ],
+      "externalReferences": [
+        {
+          "type": "website",
+          "url": "http://partner.org"
+        },
+        {
+          "type": "documentation",
+          "url": "http://api.partner.org/swagger"
+        }
+      ]
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:maven/com.acme/stock-java-client@1.0.12",
+      "dependsOn": [
+        "b2a46a4b-8367-4bae-9820-95557cfe03a8"
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-service-1.2.xml b/tests/_data/schemaTestData/1.2/valid-service-1.2.xml
new file mode 100644
index 000000000..48ee7af2a
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-service-1.2.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="library" bom-ref="pkg:maven/com.acme/stock-java-client@1.0.12">
+            <group>com.acme</group>
+            <name>stock-java-client</name>
+            <version>1.0.12</version>
+            <hashes>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/stock-java-client@1.0.12</purl>
+        </component>
+    </components>
+    <services>
+        <service bom-ref="b2a46a4b-8367-4bae-9820-95557cfe03a8">
+            <provider>
+                <name>Partner Org</name>
+                <url>https://partner.org</url>
+                <contact>
+                    <name>Support</name>
+                    <email>support@partner</email>
+                    <phone>800-555-1212</phone>
+                </contact>
+            </provider>
+            <group>org.partner</group>
+            <name>Stock ticker service</name>
+            <version>2020-Q2</version>
+            <description>Provides real-time stock information</description>
+            <endpoints>
+                <endpoint>https://partner.org/api/v1/lookup</endpoint>
+                <endpoint>https://partner.org/api/v1/stock</endpoint>
+            </endpoints>
+            <authenticated>true</authenticated>
+            <x-trust-boundary>true</x-trust-boundary>
+            <data>
+                <classification flow="inbound">PII</classification>
+                <classification flow="outbound">PIFI</classification>
+                <classification flow="bi-directional">pubic</classification>
+                <classification flow="unknown">partner-data</classification>
+            </data>
+            <licenses>
+                <license>
+                    <name>Partner license</name>
+                </license>
+            </licenses>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://partner.org</url>
+                </reference>
+                <reference type="documentation">
+                    <url>http://api.partner.org/swagger</url>
+                </reference>
+            </externalReferences>
+        </service>
+    </services>
+    <dependencies>
+        <dependency ref="pkg:maven/com.acme/stock-java-client@1.0.12">
+            <dependency ref="b2a46a4b-8367-4bae-9820-95557cfe03a8"/>
+        </dependency>
+    </dependencies>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-service-empty-objects-1.2.json b/tests/_data/schemaTestData/1.2/valid-service-empty-objects-1.2.json
new file mode 100644
index 000000000..ece3a65f2
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-service-empty-objects-1.2.json
@@ -0,0 +1,22 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.2",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "services": [
+    {
+      "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8",
+      "provider": {
+        "contact": [
+        ]
+      },
+      "name": "Stock ticker service",
+      "endpoints": [
+      ],
+      "data": [
+      ],
+      "externalReferences": [
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.2/valid-service-empty-objects-1.2.xml b/tests/_data/schemaTestData/1.2/valid-service-empty-objects-1.2.xml
new file mode 100644
index 000000000..b1ecb31ed
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-service-empty-objects-1.2.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <services>
+        <service bom-ref="b2a46a4b-8367-4bae-9820-95557cfe03a8">
+            <provider>
+            </provider>
+            <name>Stock ticker service</name>
+            <endpoints>
+            </endpoints>
+            <data>
+            </data>
+            <licenses>
+            </licenses>
+        </service>
+    </services>
+</bom>
diff --git a/tests/_data/schemaTestData/1.2/valid-xml-signature-1.2.xml b/tests/_data/schemaTestData/1.2/valid-xml-signature-1.2.xml
new file mode 100644
index 000000000..96051448d
--- /dev/null
+++ b/tests/_data/schemaTestData/1.2/valid-xml-signature-1.2.xml
@@ -0,0 +1,177 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.2">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>jdoe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>jdoe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+            </pedigree>
+        </component>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/xml" encoding="base64">blah</text>
+                    <url>fdaf</url>
+                </license>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+        </component>
+        <component type="framework">
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+        <ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
+            <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
+            <ds:Reference URI="" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                <ds:Transforms xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                    <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
+                </ds:Transforms>
+                <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
+                <ds:DigestValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">PrB8/rofGs34XwIX5OIdYSjV2aKSe5VaztJKBvsgjIk=</ds:DigestValue>
+            </ds:Reference>
+        </ds:SignedInfo>
+        <ds:SignatureValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+            ePGNg30Zl9CW7RZdcRn8gFCp1AlWncjudA9pQDXyqZOvyj9RC2YtkI688WdfDOdVRZs6mflJFXr7
+            IKA9wY6jVrEqZmlef55Qp/8iGwOjOjWbwYsm2AhrdkUi9gaFSWEd8uITYHOpWbiPFSsnimiK9+ft
+            56dkg/oJMLdXzlaukzq9iGkRcafRkW433OQcZIXwD2K8lg4cdD0pNNNqBa+PgIvzbxA5H84TyQDB
+            HBcQiw/j1edRBJgPOwlqzZDUawOJaFhAPUQ+GGKMetIJH2FqqrHXGuV1NIwnbWTCg40RdOcBdCrl
+            PDtDVjFh34uZ4dYBpJBIlM4daD2N4B6WPB5iHRyuZTczF2q03ObabuTgkpK6EeadFVqFNsEOOPPt
+            MDDyda+Lwff5KjvUHvRRtUDIOm2rNIQKzaseulwYcA9UWQHAFcupJmWcLLM4zzY7F/uOdZuSurzh
+            U6h5kdb76Juepof6ee4Q5YpwNOGNL5JfB4C3sc/Dbbv8dZ8OuXFYSZN7reUGZzCNksByqERPEbAe
+            n1ldJu1HnRXRQpwaon8Asy9CuNmPfFCfDwOs2B4p4tb+tLNIKFHdRlpd19Zr9vCMCbltXeqq0Cpq
+            OejSyLYGqSWzzzUh449dJrg6KTevrTNEln5GAlLBFSdjM5JA7KV2u/GyDVFwSEW7UKooGN4CtgU=
+        </ds:SignatureValue>
+        <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+            <ds:X509Data xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                <ds:X509SubjectName xmlns:ds="http://www.w3.org/2000/09/xmldsig#">CN=bomsigner,OU=development,O=cyclonedx</ds:X509SubjectName>
+                <ds:X509Certificate xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                    MIIE+DCCAuCgAwIBAgIEXGzayTANBgkqhkiG9w0BAQsFADA+MRIwEAYDVQQKDAljeWNsb25lZHgx
+                    FDASBgNVBAsMC2RldmVsb3BtZW50MRIwEAYDVQQDDAlib21zaWduZXIwHhcNMTkwMjIwMDQ0MjQ5
+                    WhcNNDkwMjIwMDQ0MjQ5WjA+MRIwEAYDVQQKDAljeWNsb25lZHgxFDASBgNVBAsMC2RldmVsb3Bt
+                    ZW50MRIwEAYDVQQDDAlib21zaWduZXIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCo
+                    5JZsM4ZLfWW/dpRlU6CpnItWspddF+bEVDETKVwVj9tGpqR5jURgKS/BOQP2TGUsR3/ZJJBhYRll
+                    ONhrUQrVKV/I6wp3Z40qPEa1RJLE+QlG9iL8qBV52CnXkLmnUSax3dspSzmSct5vDiTnvpHG9jr0
+                    AKFeTjy7U9rv8GJybz0ijwlpBoO9JRdYPX2PrrzoSeJLoxKq+GwuyCZ5LhXRN0p1a+NAirTAmY+c
+                    G1ZTLkMmfeCUy1t6H/bG4RnYOSSPOvk7Rb68lQpUqb+pbbNuB2o/b9cDwtLLCtGVlu+5Wj8mrytY
+                    3FGFQM20j3yVeRInmGqTTDBelQa/CO4JKqBlmaeYEIvNYbFs9+AlqadivwDO51RpdPo9fPSpsBpy
+                    ZMv6S2bXNuUML+Rk99WyKJTPM0PTZhRLZ64ZXEhlz3kQWVoSlrcwwim6sj6LRUb5IRqA3lxRFUI6
+                    NXKyiQLamQp+t3/9OGW9L1rLCcw7yFo0s8LhMTPMiv4ol9/hQViT+8ICzDsr0OM9ZiF4/UagFRlt
+                    IClV70cjh1DpsZjzQIRVGaj8uQ/JdtfRz4E43Ki7U0a2Vpho/t6poLVndv46tkX5nYGtMW4WfMoD
+                    ZflQ9pajvvKtr2jB1wob6nsU+VTmAcWZy4BCPH+XyfDw/0SFBdUceJJJtPWIeYFDUY7onptf+wID
+                    AQABMA0GCSqGSIb3DQEBCwUAA4ICAQCOVariNgK+9OF/5T9ZaSvZbkk45RTmzgQNXtFc5xfRvqwP
+                    s+pu/DFXm1R+ltjyS5j3w6NBZUFUI5MqLQr6JEEDrbu8BvfBO57wJNAEATj1JIHEfDfh7BxnBF8f
+                    oYFOwbrh4jOt0wz0FW2obsSVmF4GSvS7tTlWqTcsxjdZVmwP40RWu18B9jzv7M61adrWD3ksDA5O
+                    amSOsZi3Nt0aacDkyGRdCIEFi0fplxQInXMtD1z3RhXu2JSTAIr54Cei49Bh71kAXSWHMCog/f8a
+                    lSrZyqZBty/ACfU9DqlPIM+giHePKm4z2bcdpUdKZk6wcKDn4CvuBOqsMBMg7L05UEyyqTPD/4dk
+                    2GwJ8Nv0E5gsYHCIXF2cZ3OUVsw0mB/ozleEJVDE02uZZN/1wW1Xq028LsMdgN0Wk1WvWyF5MEdh
+                    nPWuhqp6tNaDI/kK6XQF+LjYJUzua3AQFOHfYNLKhO6d+bJ4rr0833v4v3cLW34kbXkKb6U3Yv8X
+                    SK3jBGCACiPgnc0N6awkh1kDlrZQ7GMsl14c+2+vpl9Lf0sL0mRUIyICfSC8MjlsP/BZH3emyfsk
+                    iWivPALomycKqP+PSkt1WaWApGENZWk1wNN99FYSYlt6LViW2p6T97fRx4jPRlHu+wecfD2k9RP4
+                    bt5W2HWfOP0zNAS7SnAVLEl2QZxXKw==
+                </ds:X509Certificate>
+            </ds:X509Data>
+            <ds:KeyValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                <ds:RSAKeyValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                    <ds:Modulus xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                        qOSWbDOGS31lv3aUZVOgqZyLVrKXXRfmxFQxEylcFY/bRqakeY1EYCkvwTkD9kxlLEd/2SSQYWEZ
+                        ZTjYa1EK1SlfyOsKd2eNKjxGtUSSxPkJRvYi/KgVedgp15C5p1Emsd3bKUs5knLebw4k576RxvY6
+                        9AChXk48u1Pa7/Bicm89Io8JaQaDvSUXWD19j6686EniS6MSqvhsLsgmeS4V0TdKdWvjQIq0wJmP
+                        nBtWUy5DJn3glMtbeh/2xuEZ2Dkkjzr5O0W+vJUKVKm/qW2zbgdqP2/XA8LSywrRlZbvuVo/Jq8r
+                        WNxRhUDNtI98lXkSJ5hqk0wwXpUGvwjuCSqgZZmnmBCLzWGxbPfgJamnYr8AzudUaXT6PXz0qbAa
+                        cmTL+ktm1zblDC/kZPfVsiiUzzND02YUS2euGVxIZc95EFlaEpa3MMIpurI+i0VG+SEagN5cURVC
+                        OjVysokC2pkKfrd//ThlvS9aywnMO8haNLPC4TEzzIr+KJff4UFYk/vCAsw7K9DjPWYheP1GoBUZ
+                        bSApVe9HI4dQ6bGY80CEVRmo/LkPyXbX0c+BONyou1NGtlaYaP7eqaC1Z3b+OrZF+Z2BrTFuFnzK
+                        A2X5UPaWo77yra9owdcKG+p7FPlU5gHFmcuAQjx/l8nw8P9EhQXVHHiSSbT1iHmBQ1GO6J6bX/s=
+                    </ds:Modulus>
+                    <ds:Exponent xmlns:ds="http://www.w3.org/2000/09/xmldsig#">AQAB</ds:Exponent>
+                </ds:RSAKeyValue>
+            </ds:KeyValue>
+        </ds:KeyInfo>
+    </ds:Signature></bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-bomformat-1.3.json b/tests/_data/schemaTestData/1.3/invalid-bomformat-1.3.json
new file mode 100644
index 000000000..7df3cac2f
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-bomformat-1.3.json
@@ -0,0 +1,8 @@
+{
+  "bomFormat": "AnotherFormat",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-component-ref-1.3.json b/tests/_data/schemaTestData/1.3/invalid-component-ref-1.3.json
new file mode 100644
index 000000000..ba06096b8
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-component-ref-1.3.json
@@ -0,0 +1,20 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "bom-ref": "123",
+      "name": "acme-library",
+      "version": "1.0.0"
+    },
+    {
+      "type": "library",
+      "bom-ref": "123",
+      "name": "acme-library",
+      "version": "1.0.0"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-component-ref-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-component-ref-1.3.xml
new file mode 100644
index 000000000..4b5976dd3
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-component-ref-1.3.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="library" bom-ref="123">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <components>
+                <component type="library" bom-ref="123">
+                    <name>acme-library</name>
+                    <version>1.0.0</version>
+                </component>
+            </components>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-component-swid-1.3.json b/tests/_data/schemaTestData/1.3/invalid-component-swid-1.3.json
new file mode 100644
index 000000000..455f2f33f
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-component-swid-1.3.json
@@ -0,0 +1,18 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "application",
+      "author": "Acme Super Heros",
+      "name": "Acme Application",
+      "version": "9.1.1",
+      "swid": {
+        "name": "Acme Application",
+        "version": "9.1.1"
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-component-swid-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-component-swid-1.3.xml
new file mode 100644
index 000000000..868072da8
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-component-swid-1.3.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="application">
+            <author>Acme Super Heros</author>
+            <name>Acme Application</name>
+            <version>9.1.1</version>
+            <swid name="Acme Application" version="9.1.1" />
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-component-type-1.3.json b/tests/_data/schemaTestData/1.3/invalid-component-type-1.3.json
new file mode 100644
index 000000000..a22bf3888
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-component-type-1.3.json
@@ -0,0 +1,13 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "foo",
+      "name": "acme-library",
+      "version": "1.0.0"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-component-type-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-component-type-1.3.xml
new file mode 100644
index 000000000..2a9da0fbd
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-component-type-1.3.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="foo">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-dependency-1.3.json b/tests/_data/schemaTestData/1.3/invalid-dependency-1.3.json
new file mode 100644
index 000000000..988a04501
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-dependency-1.3.json
@@ -0,0 +1,37 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "bom-ref": "library-a",
+      "type": "library",
+      "name": "library-a",
+      "version": "1.0.0"
+    },
+    {
+      "bom-ref": "library-b",
+      "type": "library",
+      "name": "library-b",
+      "version": "1.0.0"
+    },
+    {
+      "bom-ref": "library-c",
+      "type": "library",
+      "name": "library-c",
+      "version": "1.0.0"
+    }
+  ],
+  "dependencies": [
+    {
+      "dependsOn": []
+    },
+    {
+      "ref": "library-b",
+      "dependsOn": [
+        "library-c"
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-dependency-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-dependency-1.3.xml
new file mode 100644
index 000000000..d3c1567bc
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-dependency-1.3.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="library" bom-ref="library-a">
+            <name>acme-library-a</name>
+            <version>1.0.0</version>
+        </component>
+        <component type="library" bom-ref="library-b">
+            <name>acme-library-b</name>
+            <version>1.0.0</version>
+        </component>
+        <component type="library" bom-ref="library-c">
+            <name>acme-library-b</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+    <dependencies>
+        <dependency />
+        <dependency ref="library-b">
+            <dependency ref="library-c"/>
+        </dependency>
+    </dependencies>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-empty-component-1.3.json b/tests/_data/schemaTestData/1.3/invalid-empty-component-1.3.json
new file mode 100644
index 000000000..31537b2ca
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-empty-component-1.3.json
@@ -0,0 +1,11 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-empty-component-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-empty-component-1.3.xml
new file mode 100644
index 000000000..c47376c04
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-empty-component-1.3.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="application">
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-hash-alg-1.3.json b/tests/_data/schemaTestData/1.3/invalid-hash-alg-1.3.json
new file mode 100644
index 000000000..625094c34
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-hash-alg-1.3.json
@@ -0,0 +1,32 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "scope": "required",
+      "hashes": [
+        {
+          "alg": "FOO",
+          "content": "3942447fac867ae5cdb3229b658f4d48"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-hash-alg-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-hash-alg-1.3.xml
new file mode 100644
index 000000000..541b2ed21
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-hash-alg-1.3.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="FOO">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-hash-md5-1.3.json b/tests/_data/schemaTestData/1.3/invalid-hash-md5-1.3.json
new file mode 100644
index 000000000..408128193
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-hash-md5-1.3.json
@@ -0,0 +1,32 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "scope": "required",
+      "hashes": [
+        {
+          "alg": "MD5",
+          "content": "foo"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-hash-md5-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-hash-md5-1.3.xml
new file mode 100644
index 000000000..9e63b8fde
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-hash-md5-1.3.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">foo</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-hash-sha1-1.3.json b/tests/_data/schemaTestData/1.3/invalid-hash-sha1-1.3.json
new file mode 100644
index 000000000..7b1e0036c
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-hash-sha1-1.3.json
@@ -0,0 +1,32 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "scope": "required",
+      "hashes": [
+        {
+          "alg": "MD5",
+          "content": "3942447fac867ae5cdb3229b658f4d48"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "foo"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-hash-sha1-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-hash-sha1-1.3.xml
new file mode 100644
index 000000000..082a82672
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-hash-sha1-1.3.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">foo</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-hash-sha256-1.3.json b/tests/_data/schemaTestData/1.3/invalid-hash-sha256-1.3.json
new file mode 100644
index 000000000..49f747e0c
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-hash-sha256-1.3.json
@@ -0,0 +1,32 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "scope": "required",
+      "hashes": [
+        {
+          "alg": "MD5",
+          "content": "3942447fac867ae5cdb3229b658f4d48"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "foo"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-hash-sha256-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-hash-sha256-1.3.xml
new file mode 100644
index 000000000..e29c2b22c
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-hash-sha256-1.3.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">foo</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-hash-sha512-1.3.json b/tests/_data/schemaTestData/1.3/invalid-hash-sha512-1.3.json
new file mode 100644
index 000000000..5e83aae6e
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-hash-sha512-1.3.json
@@ -0,0 +1,32 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "scope": "required",
+      "hashes": [
+        {
+          "alg": "MD5",
+          "content": "3942447fac867ae5cdb3229b658f4d48"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "foo"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-hash-sha512-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-hash-sha512-1.3.xml
new file mode 100644
index 000000000..463035235
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-hash-sha512-1.3.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">foo</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-issue-type-1.3.json b/tests/_data/schemaTestData/1.3/invalid-issue-type-1.3.json
new file mode 100644
index 000000000..cea6add44
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-issue-type-1.3.json
@@ -0,0 +1,48 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "group": "com.acme",
+      "name": "sample-library",
+      "version": "1.0.0",
+      "pedigree": {
+        "ancestors": [
+          {
+            "type": "library",
+            "group": "org.example",
+            "name": "sample-library",
+            "version": "1.0.0"
+          }
+        ],
+        "patches": [
+          {
+            "type": "unofficial",
+            "diff": {
+              "text": {
+                "contentType": "text/plain",
+                "encoding": "base64",
+                "content": "blah"
+              },
+              "url": "uri/to/changes.diff"
+            },
+            "resolves": [
+              {
+                "type": "foo",
+                "id": "JIRA-17240",
+                "description": "Great new feature that does something",
+                "source": {
+                  "name": "Acme Org",
+                  "url": "https://issues.acme.org/17240"
+                }
+              }
+            ]
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-issue-type-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-issue-type-1.3.xml
new file mode 100644
index 000000000..f3b80ba8a
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-issue-type-1.3.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="library">
+            <group>com.acme</group>
+            <name>sample-library</name>
+            <version>1.0.0</version>
+            <pedigree>
+                <ancestors>
+                    <component type="library">
+                        <group>org.example</group>
+                        <name>sample-library</name>
+                        <version>1.0.0</version>
+                    </component>
+                </ancestors>
+                <patches>
+                    <patch type="unofficial">
+                        <diff>
+                            <text content-type="text/plain" encoding="base64">blah</text>
+                            <url>uri/to/changes.diff</url>
+                        </diff>
+                        <resolves>
+                            <issue type="foo">
+                                <id>JIRA-17240</id>
+                                <description>Great new feature that does something</description>
+                                <source>
+                                    <name>Acme Org</name>
+                                    <url>https://issues.acme.org/17240</url>
+                                </source>
+                            </issue>
+                        </resolves>
+                    </patch>
+                </patches>
+            </pedigree>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-license-choice-1.3.json b/tests/_data/schemaTestData/1.3/invalid-license-choice-1.3.json
new file mode 100644
index 000000000..1218f847a
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-license-choice-1.3.json
@@ -0,0 +1,23 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "licenses": [
+        {
+          "expression": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0",
+          "license": {
+            "name": "Apache License 2.0"
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-license-choice-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-license-choice-1.3.xml
new file mode 100644
index 000000000..0a89d0247
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-license-choice-1.3.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-license-encoding-1.3.json b/tests/_data/schemaTestData/1.3/invalid-license-encoding-1.3.json
new file mode 100644
index 000000000..b61550ee0
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-license-encoding-1.3.json
@@ -0,0 +1,28 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "licenses": [
+        {
+          "license": {
+            "id": "Apache-2.0",
+            "text": {
+              "contentType": "text/plain",
+              "encoding": "base85",
+              "content": "CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4="
+            },
+            "url": "https://www.apache.org/licenses/LICENSE-2.0.txt"
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-license-encoding-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-license-encoding-1.3.xml
new file mode 100644
index 000000000..1518cb716
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-license-encoding-1.3.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base85">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-license-id-1.3.json b/tests/_data/schemaTestData/1.3/invalid-license-id-1.3.json
new file mode 100644
index 000000000..0d275dd0e
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-license-id-1.3.json
@@ -0,0 +1,22 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "licenses": [
+        {
+          "license": {
+            "id": "Apache-2"
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-license-id-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-license-id-1.3.xml
new file mode 100644
index 000000000..9adb85cee
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-license-id-1.3.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-license-id-count-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-license-id-count-1.3.xml
new file mode 100644
index 000000000..ce13178da
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-license-id-count-1.3.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>MIT</id>
+                    <!-- This was a defect in schema 1.0 and is no longer permitted -->
+                    <id>MIT</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-license-name-count-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-license-name-count-1.3.xml
new file mode 100644
index 000000000..85d87e5a6
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-license-name-count-1.3.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Apache License 2.0</name>
+                    <!-- This was a defect in schema 1.0 and is no longer permitted -->
+                    <name>Apache License 2.0</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-metadata-license-1.3.json b/tests/_data/schemaTestData/1.3/invalid-metadata-license-1.3.json
new file mode 100644
index 000000000..82a79226c
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-metadata-license-1.3.json
@@ -0,0 +1,16 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "licenses": [
+      {
+        "license": {
+          "id": "Apache-2"
+        }
+      }
+    ]
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-metadata-license-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-metadata-license-1.3.xml
new file mode 100644
index 000000000..07d4f9cbe
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-metadata-license-1.3.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <metadata>
+        <licenses>
+            <license>
+                <id>Apache-2</id>
+            </license>
+        </licenses>
+    </metadata>
+    <components />
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.3/invalid-metadata-timestamp-1.3.json b/tests/_data/schemaTestData/1.3/invalid-metadata-timestamp-1.3.json
new file mode 100644
index 000000000..a021eb672
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-metadata-timestamp-1.3.json
@@ -0,0 +1,10 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "timestamp": "2020-04-13"
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-metadata-timestamp-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-metadata-timestamp-1.3.xml
new file mode 100644
index 000000000..4154eed97
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-metadata-timestamp-1.3.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <metadata>
+        <timestamp>2020-04-07</timestamp>
+    </metadata>
+    <components />
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-missing-component-type-1.3.json b/tests/_data/schemaTestData/1.3/invalid-missing-component-type-1.3.json
new file mode 100644
index 000000000..f11a51ef7
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-missing-component-type-1.3.json
@@ -0,0 +1,12 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "name": "acme-library",
+      "version": "1.0.0"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-missing-component-type-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-missing-component-type-1.3.xml
new file mode 100644
index 000000000..ee10a82c9
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-missing-component-type-1.3.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component>
+            <name>acme-library</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-namespace-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-namespace-1.3.xml
new file mode 100644
index 000000000..9e42be401
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-namespace-1.3.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/12">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+                <notes>Commentary here</notes>
+            </pedigree>
+        </component>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="documentation">
+                    <url>http://example.org/docs</url>
+                    <comment>All component versions are documented here</comment>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.org/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+        <component type="framework">
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Some random license</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-patch-type-1.3.json b/tests/_data/schemaTestData/1.3/invalid-patch-type-1.3.json
new file mode 100644
index 000000000..a8897abd2
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-patch-type-1.3.json
@@ -0,0 +1,48 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "group": "com.acme",
+      "name": "sample-library",
+      "version": "1.0.0",
+      "pedigree": {
+        "ancestors": [
+          {
+            "type": "library",
+            "group": "org.example",
+            "name": "sample-library",
+            "version": "1.0.0"
+          }
+        ],
+        "patches": [
+          {
+            "type": "foo",
+            "diff": {
+              "text": {
+                "contentType": "text/plain",
+                "encoding": "base64",
+                "content": "blah"
+              },
+              "url": "uri/to/changes.diff"
+            },
+            "resolves": [
+              {
+                "type": "enhancement",
+                "id": "JIRA-17240",
+                "description": "Great new feature that does something",
+                "source": {
+                  "name": "Acme Org",
+                  "url": "https://issues.acme.org/17240"
+                }
+              }
+            ]
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-patch-type-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-patch-type-1.3.xml
new file mode 100644
index 000000000..c6d591e98
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-patch-type-1.3.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="library">
+            <group>com.acme</group>
+            <name>sample-library</name>
+            <version>1.0.0</version>
+            <pedigree>
+                <ancestors>
+                    <component type="library">
+                        <group>org.example</group>
+                        <name>sample-library</name>
+                        <version>1.0.0</version>
+                    </component>
+                </ancestors>
+                <patches>
+                    <patch type="foo">
+                        <diff>
+                            <text content-type="text/plain" encoding="base64">blah</text>
+                            <url>uri/to/changes.diff</url>
+                        </diff>
+                        <resolves>
+                            <issue type="enhancement">
+                                <id>JIRA-17240</id>
+                                <description>Great new feature that does something</description>
+                                <source>
+                                    <name>Acme Org</name>
+                                    <url>https://issues.acme.org/17240</url>
+                                </source>
+                            </issue>
+                        </resolves>
+                    </patch>
+                </patches>
+            </pedigree>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-scope-1.3.json b/tests/_data/schemaTestData/1.3/invalid-scope-1.3.json
new file mode 100644
index 000000000..38e5bb102
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-scope-1.3.json
@@ -0,0 +1,14 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "scope": "foo"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-scope-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-scope-1.3.xml
new file mode 100644
index 000000000..6d25da49c
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-scope-1.3.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>foo</scope>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-serialnumber-1.3.json b/tests/_data/schemaTestData/1.3/invalid-serialnumber-1.3.json
new file mode 100644
index 000000000..70d3112a0
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-serialnumber-1.3.json
@@ -0,0 +1,8 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f",
+  "version": 1,
+  "components": [
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-serialnumber-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-serialnumber-1.3.xml
new file mode 100644
index 000000000..b5578dc97
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-serialnumber-1.3.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+                <notes>Commentary here</notes>
+            </pedigree>
+        </component>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="documentation">
+                    <url>http://example.org/docs</url>
+                    <comment>All component versions are documented here</comment>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.org/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+        <component type="framework">
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Some random license</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/invalid-service-data-1.3.json b/tests/_data/schemaTestData/1.3/invalid-service-data-1.3.json
new file mode 100644
index 000000000..510684135
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-service-data-1.3.json
@@ -0,0 +1,20 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "services": [
+    {
+      "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8",
+      "name": "Stock ticker service",
+      "authenticated": true,
+      "x-trust-boundary": true,
+      "data": [
+        {
+          "classification": "foo",
+          "flow": "bar"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/invalid-service-data-1.3.xml b/tests/_data/schemaTestData/1.3/invalid-service-data-1.3.xml
new file mode 100644
index 000000000..af9ed8b34
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/invalid-service-data-1.3.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <services>
+        <service bom-ref="b2a46a4b-8367-4bae-9820-95557cfe03a8">
+            <name>Stock ticker service</name>
+            <data>
+                <classification flow="foo">bar</classification>
+            </data>
+        </service>
+    </services>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-assembly-1.3.json b/tests/_data/schemaTestData/1.3/valid-assembly-1.3.json
new file mode 100644
index 000000000..78720ccb5
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-assembly-1.3.json
@@ -0,0 +1,30 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library-a",
+      "version": "1.0.0",
+      "components": [
+        {
+          "type": "library",
+          "name": "acme-library-b",
+          "version": "2.0.0"
+        }
+      ]
+    }
+  ],
+  "services": [
+    {
+      "name": "acme-service-a",
+      "services": [
+        {
+          "name": "acme-service-b"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-assembly-1.3.xml b/tests/_data/schemaTestData/1.3/valid-assembly-1.3.xml
new file mode 100644
index 000000000..b53f3eb7d
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-assembly-1.3.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="library">
+            <name>acme-library-a</name>
+            <version>1.0.0</version>
+            <components>
+                <component type="library">
+                    <name>acme-library-b</name>
+                    <version>2.0.0</version>
+                </component>
+            </components>
+        </component>
+    </components>
+    <services>
+        <service>
+            <name>acme-service-a</name>
+            <services>
+                <service>
+                    <name>acme-service-b</name>
+                </service>
+            </services>
+        </service>
+    </services>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-bom-1.3.json b/tests/_data/schemaTestData/1.3/valid-bom-1.3.json
new file mode 100644
index 000000000..75550db71
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-bom-1.3.json
@@ -0,0 +1,177 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "timestamp": "2020-04-13T20:20:39+00:00",
+    "tools": [
+      {
+        "vendor": "Awesome Vendor",
+        "name": "Awesome Tool",
+        "version": "9.1.2",
+        "hashes": [
+          {
+            "alg": "SHA-1",
+            "content": "25ed8e31b995bb927966616df2a42b979a2717f0"
+          },
+          {
+            "alg": "SHA-256",
+            "content": "a74f733635a19aefb1f73e5947cef59cd7440c6952ef0f03d09d974274cbd6df"
+          }
+        ]
+      }
+    ],
+    "authors": [
+      {
+        "name": "Samantha Wright",
+        "email": "samantha.wright@example.com",
+        "phone": "800-555-1212"
+      }
+    ],
+    "component": {
+      "type": "application",
+      "author": "Acme Super Heros",
+      "name": "Acme Application",
+      "version": "9.1.1",
+      "swid": {
+        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
+        "name": "Acme Application",
+        "version": "9.1.1",
+        "text": {
+          "contentType": "text/xml",
+          "encoding": "base64",
+          "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg=="
+        }
+      }
+    },
+    "manufacture": {
+      "name": "Acme, Inc.",
+      "url": [
+        "https://example.com"
+      ],
+      "contact": [
+        {
+          "name": "Acme Professional Services",
+          "email": "professional.services@example.com"
+        }
+      ]
+    },
+    "supplier": {
+      "name": "Acme, Inc.",
+      "url": [
+        "https://example.com"
+      ],
+      "contact": [
+        {
+          "name": "Acme Distribution",
+          "email": "distribution@example.com"
+        }
+      ]
+    }
+  },
+  "components": [
+    {
+      "bom-ref": "pkg:npm/acme/component@1.0.0",
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "hashes": [
+        {
+          "alg": "MD5",
+          "content": "3942447fac867ae5cdb3229b658f4d48"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282"
+        }
+      ],
+      "licenses": [
+        {
+          "license": {
+            "id": "Apache-2.0",
+            "text": {
+              "contentType": "text/plain",
+              "encoding": "base64",
+              "content": "CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4="
+            },
+            "url": "https://www.apache.org/licenses/LICENSE-2.0.txt"
+          }
+        }
+      ],
+      "purl": "pkg:npm/acme/component@1.0.0",
+      "pedigree": {
+        "ancestors": [
+          {
+            "type": "library",
+            "publisher": "Acme Inc",
+            "group": "com.acme",
+            "name": "tomcat-catalina",
+            "version": "9.0.14"
+          },
+          {
+            "type": "library",
+            "publisher": "Acme Inc",
+            "group": "com.acme",
+            "name": "tomcat-catalina",
+            "version": "9.0.14"
+          }
+        ],
+        "commits": [
+          {
+            "uid": "7638417db6d59f3c431d3e1f261cc637155684cd",
+            "url": "https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd",
+            "author": {
+              "timestamp": "2018-11-13T20:20:39+00:00",
+              "name": "me",
+              "email": "me@acme.org"
+            }
+          }
+        ]
+      }
+    },
+    {
+      "type": "library",
+      "supplier": {
+        "name": "Example, Inc.",
+        "url": [
+          "https://example.com",
+          "https://example.net"
+        ],
+        "contact": [
+          {
+            "name": "Example Support AMER Distribution",
+            "email": "support@example.com",
+            "phone": "800-555-1212"
+          },
+          {
+            "name": "Example Support APAC",
+            "email": "support@apac.example.com"
+          }
+        ]
+      },
+      "author": "Example Super Heros",
+      "group": "org.example",
+      "name": "mylibrary",
+      "version": "1.0.0"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:npm/acme/component@1.0.0",
+      "dependsOn": [
+        "pkg:npm/acme/component@1.0.0"
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-bom-1.3.xml b/tests/_data/schemaTestData/1.3/valid-bom-1.3.xml
new file mode 100644
index 000000000..c9cda0c6d
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-bom-1.3.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <metadata>
+        <timestamp>2020-04-07T07:01:00Z</timestamp>
+        <tools>
+            <tool>
+                <vendor>Awesome Vendor</vendor>
+                <name>Awesome Tool</name>
+                <version>9.1.2</version>
+                <hashes>
+                    <hash alg="SHA-1">25ed8e31b995bb927966616df2a42b979a2717f0</hash>
+                    <hash alg="SHA-256">a74f733635a19aefb1f73e5947cef59cd7440c6952ef0f03d09d974274cbd6df</hash>
+                </hashes>
+            </tool>
+        </tools>
+        <authors>
+            <author>
+                <name>Samantha Wright</name>
+                <email>samantha.wright@example.com</email>
+                <phone>800-555-1212</phone>
+            </author>
+        </authors>
+        <component type="application">
+            <author>Acme Super Heros</author>
+            <name>Acme Application</name>
+            <version>9.1.1</version>
+            <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Acme Application" version="9.1.1">
+                <text content-type="text/xml" encoding="base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==</text>
+            </swid>
+        </component>
+        <manufacture>
+            <name>Acme, Inc.</name>
+            <url>https://example.com</url>
+            <contact>
+                <name>Acme Professional Services</name>
+                <email>professional.services@example.com</email>
+            </contact>
+        </manufacture>
+        <supplier>
+            <name>Acme, Inc.</name>
+            <url>https://example.com</url>
+            <contact>
+                <name>Acme Distribution</name>
+                <email>distribution@example.com</email>
+            </contact>
+        </supplier>
+    </metadata>
+    <components>
+        <component type="application">
+            <author>Acme Super Heros</author>
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <author>Apache Super Heros</author>
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+                <notes>Commentary here</notes>
+            </pedigree>
+        </component>
+        <component type="library">
+            <supplier>
+                <name>Example Inc.</name>
+                <url>https://example.com</url>
+                <url>https://example.net</url>
+                <contact>
+                    <name>Example Support AMER</name>
+                    <email>support@example.com</email>
+                    <phone>800-555-1212</phone>
+                </contact>
+                <contact>
+                    <name>Example Support APAC</name>
+                    <email>support@apac.example.com</email>
+                </contact>
+            </supplier>
+            <author>Example Super Heros</author>
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0-with-classpath-exception</expression>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="documentation">
+                    <url>http://example.org/docs</url>
+                    <comment>All component versions are documented here</comment>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.org/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+        <component type="framework">
+            <author>Example Super Heros</author>
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Some random license</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-component-hashes-1.3.json b/tests/_data/schemaTestData/1.3/valid-component-hashes-1.3.json
new file mode 100644
index 000000000..77be66513
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-component-hashes-1.3.json
@@ -0,0 +1,63 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-example",
+      "version": "1.0.0",
+      "hashes": [
+        {
+          "alg": "MD5",
+          "content": "641b6e166f8b33c5e959e2adcc18b1c7"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "9188560f22e0b73070d2efce670c74af2bdf30af"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "d88bc4e70bfb34d18b5542136639acbb26a8ae2429aa1e47489332fb389cc964"
+        },
+        {
+          "alg": "SHA-384",
+          "content": "d4835048a0f57c74b8fb617d5366ab81376fc92bebe9a93bf24ba7f9da6c9aeeb6179f5d1361f6533211b15f3224cbad"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "74a51ff45e4c11df9ba1f0094282c80489649cb157a75fa337992d2d4592a5a1b8cb4525de8db0ae25233553924d76c36e093ea7fa9df4e5b8b07fd2e074efd6"
+        },
+        {
+          "alg": "SHA3-256",
+          "content": "7478c7cf41c883a04ee89f1813f687886d53fa86f791fff90690c6221e3853aa"
+        },
+        {
+          "alg": "SHA3-384",
+          "content": "a1eea7229716487ad2ebe96b2f997a8408f32f14047994fbcc99b49012cf86c96dbd518e5d57a61b0e57dd37dd0b48f5"
+        },
+        {
+          "alg": "SHA3-512",
+          "content": "7d584825bc1767dfabe7e82b45ccb7a1119b145fa17e76b885e71429c706cef0a3171bc6575b968eec5da56a7966c02fec5402fcee55097ac01d40c550de9d20"
+        },
+        {
+          "alg": "BLAKE2b-256",
+          "content": "d8779633380c050bccf4e733b763ab2abd8ad2db60b517d47fd29bbf76433237"
+        },
+        {
+          "alg": "BLAKE2b-384",
+          "content": "e728ba56c2da995a559a178116c594e8bee4894a79ceb4399d8f479e5563cb1942b85936f646d14170717c576b14db7a"
+        },
+        {
+          "alg": "BLAKE2b-512",
+          "content": "f8ce8d612a6c85c96cf7cebc230f6ddef26e6cedcfbc4a41c766033cc08c6ba097d1470948226807fb2d88d2a2b6fc0ff5e5440e93a603086fdd568bafcd1a9d"
+        },
+        {
+          "alg": "BLAKE3",
+          "content": "26cdc7fb3fd65fc3b621a4ef70bc7d2489d5c19e70c76cf7ec20e538df0047cf"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-component-hashes-1.3.xml b/tests/_data/schemaTestData/1.3/valid-component-hashes-1.3.xml
new file mode 100644
index 000000000..53df1b7c7
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-component-hashes-1.3.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="library">
+            <name>acme-example</name>
+            <version>1.0.0</version>
+            <hashes>
+                <hash alg="MD5">641b6e166f8b33c5e959e2adcc18b1c7</hash>
+                <hash alg="SHA-1">9188560f22e0b73070d2efce670c74af2bdf30af</hash>
+                <hash alg="SHA-256">d88bc4e70bfb34d18b5542136639acbb26a8ae2429aa1e47489332fb389cc964</hash>
+                <hash alg="SHA-384">d4835048a0f57c74b8fb617d5366ab81376fc92bebe9a93bf24ba7f9da6c9aeeb6179f5d1361f6533211b15f3224cbad</hash>
+                <hash alg="SHA-512">74a51ff45e4c11df9ba1f0094282c80489649cb157a75fa337992d2d4592a5a1b8cb4525de8db0ae25233553924d76c36e093ea7fa9df4e5b8b07fd2e074efd6</hash>
+                <hash alg="SHA3-256">7478c7cf41c883a04ee89f1813f687886d53fa86f791fff90690c6221e3853aa</hash>
+                <hash alg="SHA3-384">a1eea7229716487ad2ebe96b2f997a8408f32f14047994fbcc99b49012cf86c96dbd518e5d57a61b0e57dd37dd0b48f5</hash>
+                <hash alg="SHA3-512">7d584825bc1767dfabe7e82b45ccb7a1119b145fa17e76b885e71429c706cef0a3171bc6575b968eec5da56a7966c02fec5402fcee55097ac01d40c550de9d20</hash>
+                <hash alg="BLAKE2b-256">d8779633380c050bccf4e733b763ab2abd8ad2db60b517d47fd29bbf76433237</hash>
+                <hash alg="BLAKE2b-384">e728ba56c2da995a559a178116c594e8bee4894a79ceb4399d8f479e5563cb1942b85936f646d14170717c576b14db7a</hash>
+                <hash alg="BLAKE2b-512">f8ce8d612a6c85c96cf7cebc230f6ddef26e6cedcfbc4a41c766033cc08c6ba097d1470948226807fb2d88d2a2b6fc0ff5e5440e93a603086fdd568bafcd1a9d</hash>
+                <hash alg="BLAKE3">26cdc7fb3fd65fc3b621a4ef70bc7d2489d5c19e70c76cf7ec20e538df0047cf</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-component-ref-1.3.json b/tests/_data/schemaTestData/1.3/valid-component-ref-1.3.json
new file mode 100644
index 000000000..b7e2bb386
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-component-ref-1.3.json
@@ -0,0 +1,20 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "bom-ref": "123",
+      "name": "acme-library",
+      "version": "1.0.0"
+    },
+    {
+      "type": "library",
+      "bom-ref": "456",
+      "name": "acme-library",
+      "version": "1.0.0"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-component-ref-1.3.xml b/tests/_data/schemaTestData/1.3/valid-component-ref-1.3.xml
new file mode 100644
index 000000000..89cdb8800
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-component-ref-1.3.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="library" bom-ref="123">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <components>
+                <component type="library" bom-ref="456">
+                    <name>acme-library</name>
+                    <version>1.0.0</version>
+                </component>
+            </components>
+        </component>
+        <component type="library" bom-ref="789">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-component-swid-1.3.json b/tests/_data/schemaTestData/1.3/valid-component-swid-1.3.json
new file mode 100644
index 000000000..4dbad442c
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-component-swid-1.3.json
@@ -0,0 +1,19 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "application",
+      "author": "Acme Super Heros",
+      "name": "Acme Application",
+      "version": "9.1.1",
+      "swid": {
+        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
+        "name": "Acme Application",
+        "version": "9.1.1"
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-component-swid-1.3.xml b/tests/_data/schemaTestData/1.3/valid-component-swid-1.3.xml
new file mode 100644
index 000000000..859c11d67
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-component-swid-1.3.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="application">
+            <author>Acme Super Heros</author>
+            <name>Acme Application</name>
+            <version>9.1.1</version>
+            <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Acme Application" version="9.1.1" />
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-component-swid-full-1.3.json b/tests/_data/schemaTestData/1.3/valid-component-swid-full-1.3.json
new file mode 100644
index 000000000..074dd07ec
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-component-swid-full-1.3.json
@@ -0,0 +1,24 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "application",
+      "author": "Acme Super Heros",
+      "name": "Acme Application",
+      "version": "9.1.1",
+      "swid": {
+        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
+        "name": "Acme Application",
+        "version": "9.1.1",
+        "text": {
+          "contentType": "text/xml",
+          "encoding": "base64",
+          "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg=="
+        }
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-component-swid-full-1.3.xml b/tests/_data/schemaTestData/1.3/valid-component-swid-full-1.3.xml
new file mode 100644
index 000000000..0896c06df
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-component-swid-full-1.3.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="application">
+            <author>Acme Super Heros</author>
+            <name>Acme Application</name>
+            <version>9.1.1</version>
+            <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Acme Application" version="9.1.1">
+                <text content-type="text/xml" encoding="base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==</text>
+            </swid>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-component-types-1.3.json b/tests/_data/schemaTestData/1.3/valid-component-types-1.3.json
new file mode 100644
index 000000000..591dd3bf9
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-component-types-1.3.json
@@ -0,0 +1,48 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "application",
+      "name": "application-a",
+      "version": "1.0"
+    },
+    {
+      "type": "library",
+      "name": "library-a",
+      "version": "1.0"
+    },
+    {
+      "type": "framework",
+      "name": "framework-a",
+      "version": "1.0"
+    },
+    {
+      "type": "container",
+      "name": "container-a",
+      "version": "1.0"
+    },
+    {
+      "type": "operating-system",
+      "name": "operating-system-a",
+      "version": "1.0"
+    },
+    {
+      "type": "firmware",
+      "name": "firmware-a",
+      "version": "1.0"
+    },
+    {
+      "type": "device",
+      "name": "device-a",
+      "version": "1.0"
+    },
+    {
+      "type": "file",
+      "name": "file-a",
+      "version": "1.0"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-component-types-1.3.xml b/tests/_data/schemaTestData/1.3/valid-component-types-1.3.xml
new file mode 100644
index 000000000..34676a638
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-component-types-1.3.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="application">
+            <name>application-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="library">
+            <name>library-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="framework">
+            <name>framework-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="container">
+            <name>container-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="operating-system">
+            <name>operating-system-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="firmware">
+            <name>firmware-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="device">
+            <name>device-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="file">
+            <name>file-a</name>
+            <version>1.0</version>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-compositions-1.3.json b/tests/_data/schemaTestData/1.3/valid-compositions-1.3.json
new file mode 100644
index 000000000..eeb6e48f6
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-compositions-1.3.json
@@ -0,0 +1,65 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "component": {
+      "bom-ref": "acme-application-1.0",
+      "type": "application",
+      "name": "Acme Application",
+      "version": "1.0"
+    }
+  },
+  "components": [
+    {
+      "bom-ref": "pkg:maven/partner/shaded-library@1.0",
+      "type": "library",
+      "name": "Partner Shaded Library",
+      "version": "1.0",
+      "purl": "pkg:maven/partner/shaded-library@1.0",
+      "components": [
+        {
+          "bom-ref": "pkg:maven/ossproject/library@2.0",
+          "type": "library",
+          "name": "Some Opensource Library",
+          "version": "2.0",
+          "purl": "pkg:maven/ossproject/library@2.0"
+        }
+      ]
+    },
+    {
+      "bom-ref": "pkg:maven/acme/library@3.0",
+      "type": "library",
+      "name": "Acme Library",
+      "version": "3.0",
+      "purl": "pkg:maven/acme/library@3.0"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "acme-application-1.0",
+      "dependsOn": [
+        "pkg:maven/partner/shaded-library@1.0",
+        "pkg:maven/acme/library@3.0"
+      ]
+    }
+  ],
+  "compositions": [
+    {
+      "aggregate": "complete",
+      "assemblies": [
+        "pkg:maven/partner/shaded-library@1.0"
+      ],
+      "dependencies": [
+        "acme-application-1.0"
+      ]
+    },
+    {
+      "aggregate": "unknown",
+      "assemblies": [
+        "pkg:maven/acme/library@3.0"
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-compositions-1.3.xml b/tests/_data/schemaTestData/1.3/valid-compositions-1.3.xml
new file mode 100644
index 000000000..2b2d78478
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-compositions-1.3.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <metadata>
+        <component type="application" bom-ref="acme-application-1.0">
+            <name>Acme Application</name>
+            <version>1.0</version>
+        </component>
+    </metadata>
+    <components>
+        <component type="library" bom-ref="pkg:maven/partner/shaded-library@1.0">
+            <name>Partner Shaded Library</name>
+            <version>1.0</version>
+            <purl>pkg:maven/partner/shaded-library@1.0</purl>
+            <components>
+                <component type="library" bom-ref="pkg:maven/ossproject/library@2.0">
+                    <name>Some Opensource Library</name>
+                    <version>2.0</version>
+                    <purl>pkg:maven/ossproject/library@2.0</purl>
+                </component>
+            </components>
+        </component>
+        <component type="library" bom-ref="pkg:maven/acme/library@3.0">
+            <name>Acme Library</name>
+            <version>2.0</version>
+            <purl>pkg:maven/acme/library@3.0</purl>
+        </component>
+    </components>
+    <dependencies>
+        <dependency ref="acme-application-1.0">
+            <dependency ref="pkg:maven/partner/shaded-library@1.0"/>
+            <dependency ref="pkg:maven/acme/library@3.0"/>
+        </dependency>
+    </dependencies>
+    <compositions>
+        <composition>
+            <aggregate>complete</aggregate>
+            <assemblies>
+                <assembly ref="pkg:maven/partner/shaded-library@1.0"/>
+            </assemblies>
+            <dependencies>
+                <dependency ref="acme-application-1.0"/>
+            </dependencies>
+        </composition>
+        <composition>
+            <aggregate>unknown</aggregate>
+            <assemblies>
+                <assembly ref="pkg:maven/acme/library@3.0"/>
+            </assemblies>
+        </composition>
+    </compositions>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-dependency-1.3.json b/tests/_data/schemaTestData/1.3/valid-dependency-1.3.json
new file mode 100644
index 000000000..87f70743d
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-dependency-1.3.json
@@ -0,0 +1,38 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "bom-ref": "library-a",
+      "type": "library",
+      "name": "library-a",
+      "version": "1.0.0"
+    },
+    {
+      "bom-ref": "library-b",
+      "type": "library",
+      "name": "library-b",
+      "version": "1.0.0"
+    },
+    {
+      "bom-ref": "library-c",
+      "type": "library",
+      "name": "library-c",
+      "version": "1.0.0"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "library-a",
+      "dependsOn": []
+    },
+    {
+      "ref": "library-b",
+      "dependsOn": [
+        "library-c"
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-dependency-1.3.xml b/tests/_data/schemaTestData/1.3/valid-dependency-1.3.xml
new file mode 100644
index 000000000..d02773b43
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-dependency-1.3.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="library" bom-ref="library-a">
+            <name>acme-library-a</name>
+            <version>1.0.0</version>
+        </component>
+        <component type="library" bom-ref="library-b">
+            <name>acme-library-b</name>
+            <version>1.0.0</version>
+        </component>
+        <component type="library" bom-ref="library-c">
+            <name>acme-library-b</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+    <dependencies>
+        <dependency ref="library-a"/>
+        <dependency ref="library-b">
+            <dependency ref="library-c"/>
+        </dependency>
+    </dependencies>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-empty-components-1.3.json b/tests/_data/schemaTestData/1.3/valid-empty-components-1.3.json
new file mode 100644
index 000000000..ba708657a
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-empty-components-1.3.json
@@ -0,0 +1,8 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-empty-components-1.3.xml b/tests/_data/schemaTestData/1.3/valid-empty-components-1.3.xml
new file mode 100644
index 000000000..0c37d3f30
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-empty-components-1.3.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-evidence-1.3.json b/tests/_data/schemaTestData/1.3/valid-evidence-1.3.json
new file mode 100644
index 000000000..4fc32ab8a
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-evidence-1.3.json
@@ -0,0 +1,53 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "application",
+      "group": "com.google.code.findbugs",
+      "name": "findbugs-project",
+      "version": "3.0.0",
+      "licenses": [
+        {
+          "license": {
+            "id": "LGPL-3.0-or-later",
+            "url": "https://www.gnu.org/licenses/lgpl-3.0-standalone.html"
+          }
+        }
+      ],
+      "purl": "pkg:maven/com.google.code.findbugs/findbugs-project@3.0.0",
+      "evidence": {
+        "licenses": [
+          {
+            "license": {
+              "id": "Apache-2.0",
+              "url": "http://www.apache.org/licenses/LICENSE-2.0"
+            }
+          },
+          {
+            "license": {
+              "id": "LGPL-2.1-only",
+              "url": "https://opensource.org/licenses/LGPL-2.1"
+            }
+          }
+        ],
+        "copyright": [
+          {
+            "text": "Copyright 2012 Google Inc. All Rights Reserved."
+          },
+          {
+            "text": "Copyright (C) 2004,2005 Dave Brosius <dbrosius@users.sourceforge.net>"
+          },
+          {
+            "text": "Copyright (C) 2005 William Pugh"
+          },
+          {
+            "text": "Copyright (C) 2004,2005 University of Maryland"
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-evidence-1.3.xml b/tests/_data/schemaTestData/1.3/valid-evidence-1.3.xml
new file mode 100644
index 000000000..c2435a4ba
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-evidence-1.3.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="application">
+            <group>com.google.code.findbugs</group>
+            <name>findbugs-project</name>
+            <version>3.0.0</version>
+            <licenses>
+                <license>
+                    <id>LGPL-3.0-or-later</id>
+                    <url>https://www.gnu.org/licenses/lgpl-3.0-standalone.html</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.google.code.findbugs/findbugs-project@3.0.0</purl>
+            <evidence>
+                <licenses>
+                    <license>
+                        <id>Apache-2.0</id>
+                        <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+                    </license>
+                    <license>
+                        <id>LGPL-2.1-only</id>
+                        <url>https://opensource.org/licenses/LGPL-2.1</url>
+                    </license>
+                </licenses>
+                <copyright>
+                    <text><![CDATA[Copyright 2012 Google Inc. All Rights Reserved.]]></text>
+                    <text><![CDATA[Copyright (C) 2004,2005 Dave Brosius <dbrosius@users.sourceforge.net>]]></text>
+                    <text><![CDATA[Copyright (C) 2005 William Pugh]]></text>
+                    <text><![CDATA[Copyright (C) 2004,2005 University of Maryland]]></text>
+                </copyright>
+            </evidence>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-external-elements-1.3.xml b/tests/_data/schemaTestData/1.3/valid-external-elements-1.3.xml
new file mode 100644
index 000000000..4fe8ffdf5
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-external-elements-1.3.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                                <foo:fruit xmlns:foo="foo">
+                                    <foo:name>Banana</foo:name>
+                                </foo:fruit>
+                                <foo:fruit xmlns:foo="foo">
+                                    <foo:name>Banana</foo:name>
+                                </foo:fruit>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                        <foo:fruit xmlns:foo="foo">
+                            <foo:name>Banana</foo:name>
+                        </foo:fruit>
+                        <foo:fruit xmlns:foo="foo">
+                            <foo:name>Banana</foo:name>
+                        </foo:fruit>
+                    </component>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </ancestors>
+                <descendants>
+                    <component type="library">
+                        <name>foo</name>
+                        <version>1.0</version>
+                    </component>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </descendants>
+                <variants>
+                    <component type="library">
+                        <name>bar</name>
+                        <version>1.0</version>
+                    </component>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </variants>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                            <foo:fruit xmlns:foo="foo">
+                                <foo:name>Banana</foo:name>
+                            </foo:fruit>
+                            <foo:fruit xmlns:foo="foo">
+                                <foo:name>Banana</foo:name>
+                            </foo:fruit>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                            <foo:fruit xmlns:foo="foo">
+                                <foo:name>Banana</foo:name>
+                            </foo:fruit>
+                            <foo:fruit xmlns:foo="foo">
+                                <foo:name>Banana</foo:name>
+                            </foo:fruit>
+                        </committer>
+                        <message>Initial commit</message>
+                        <foo:fruit xmlns:foo="foo">
+                            <foo:name>Banana</foo:name>
+                        </foo:fruit>
+                        <foo:fruit xmlns:foo="foo">
+                            <foo:name>Banana</foo:name>
+                        </foo:fruit>
+                    </commit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </commits>
+                <notes>Commentary here</notes>
+                <foo:fruit xmlns:foo="foo">
+                    <foo:name>Banana</foo:name>
+                </foo:fruit>
+                <foo:fruit xmlns:foo="foo">
+                    <foo:name>Banana</foo:name>
+                </foo:fruit>
+            </pedigree>
+            <foo:fruit xmlns:foo="foo">
+                <foo:name>Banana</foo:name>
+            </foo:fruit>
+            <foo:fruit xmlns:foo="foo">
+                <foo:name>Banana</foo:name>
+            </foo:fruit>
+        </component>
+        <foo:fruit xmlns:foo="foo">
+            <foo:name>Banana</foo:name>
+        </foo:fruit>
+        <foo:fruit xmlns:foo="foo">
+            <foo:name>Banana</foo:name>
+        </foo:fruit>
+    </components>
+    <foo:fruit xmlns:foo="foo">
+        <foo:name>Banana</foo:name>
+    </foo:fruit>
+    <foo:fruit xmlns:foo="foo">
+        <foo:name>Banana</foo:name>
+    </foo:fruit>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-external-reference-1.3.json b/tests/_data/schemaTestData/1.3/valid-external-reference-1.3.json
new file mode 100644
index 000000000..060770e12
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-external-reference-1.3.json
@@ -0,0 +1,38 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "org.example",
+      "name": "mylibrary",
+      "version": "1.0.0",
+      "externalReferences": [
+        {
+          "type": "advisories",
+          "url": "https://example.org/security/feed/csaf",
+          "comment": "Security advisories from the vendor"
+        },
+        {
+          "type": "bom",
+          "url": "https://example.org/support/sbom/portal-server/1.0.0",
+          "comment": "An external SBOM that describes what this component includes",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313"
+            }
+          ]
+        },
+        {
+          "type": "documentation",
+          "url": "https://example.org/support/documentation/portal-server/1.0.0",
+          "comment": "Vendor provided documentation for the product"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-external-reference-1.3.xml b/tests/_data/schemaTestData/1.3/valid-external-reference-1.3.xml
new file mode 100644
index 000000000..6a2888edb
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-external-reference-1.3.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <externalReferences>
+                <reference type="advisories">
+                    <url>https://example.org/security/feed/csaf</url>
+                    <comment>Security advisories from the vendor</comment>
+                </reference>
+                <reference type="bom">
+                    <url>https://example.org/support/sbom/portal-server/1.0.0</url>
+                    <comment>An external SBOM that describes what this component includes</comment>
+                    <hashes>
+                        <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                    </hashes>
+                </reference>
+                <reference type="documentation">
+                    <url>https://example.org/support/documentation/portal-server/1.0.0</url>
+                    <comment>Vendor provided documentation for the product</comment>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-license-expression-1.3.json b/tests/_data/schemaTestData/1.3/valid-license-expression-1.3.json
new file mode 100644
index 000000000..787a8cd61
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-license-expression-1.3.json
@@ -0,0 +1,20 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "licenses": [
+        {
+          "expression": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-license-expression-1.3.xml b/tests/_data/schemaTestData/1.3/valid-license-expression-1.3.xml
new file mode 100644
index 000000000..ae9099a24
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-license-expression-1.3.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-license-id-1.3.json b/tests/_data/schemaTestData/1.3/valid-license-id-1.3.json
new file mode 100644
index 000000000..e227babce
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-license-id-1.3.json
@@ -0,0 +1,22 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "licenses": [
+        {
+          "license": {
+            "id": "Apache-2.0"
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-license-id-1.3.xml b/tests/_data/schemaTestData/1.3/valid-license-id-1.3.xml
new file mode 100644
index 000000000..e25e92039
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-license-id-1.3.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-license-name-1.3.json b/tests/_data/schemaTestData/1.3/valid-license-name-1.3.json
new file mode 100644
index 000000000..9d865b992
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-license-name-1.3.json
@@ -0,0 +1,22 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "licenses": [
+        {
+          "license": {
+            "name": "Apache License 2.0"
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-license-name-1.3.xml b/tests/_data/schemaTestData/1.3/valid-license-name-1.3.xml
new file mode 100644
index 000000000..9097df575
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-license-name-1.3.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Apache License 2.0</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-metadata-author-1.3.json b/tests/_data/schemaTestData/1.3/valid-metadata-author-1.3.json
new file mode 100644
index 000000000..9c78197a0
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-metadata-author-1.3.json
@@ -0,0 +1,16 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "authors": [
+      {
+        "name": "Samantha Wright",
+        "email": "samantha.wright@example.com",
+        "phone": "800-555-1212"
+      }
+    ]
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-metadata-author-1.3.xml b/tests/_data/schemaTestData/1.3/valid-metadata-author-1.3.xml
new file mode 100644
index 000000000..e9492df03
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-metadata-author-1.3.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <metadata>
+        <authors>
+            <author>
+                <name>Samantha Wright</name>
+                <email>samantha.wright@example.com</email>
+                <phone>800-555-1212</phone>
+            </author>
+        </authors>
+    </metadata>
+    <components />
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-metadata-license-1.3.json b/tests/_data/schemaTestData/1.3/valid-metadata-license-1.3.json
new file mode 100644
index 000000000..8ab899620
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-metadata-license-1.3.json
@@ -0,0 +1,16 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "licenses": [
+      {
+        "license": {
+          "id": "Apache-2.0"
+        }
+      }
+    ]
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-metadata-license-1.3.xml b/tests/_data/schemaTestData/1.3/valid-metadata-license-1.3.xml
new file mode 100644
index 000000000..3c9d10d67
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-metadata-license-1.3.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <metadata>
+        <licenses>
+            <license>
+                <id>Apache-2.0</id>
+            </license>
+        </licenses>
+    </metadata>
+    <components />
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.3/valid-metadata-manufacture-1.3.json b/tests/_data/schemaTestData/1.3/valid-metadata-manufacture-1.3.json
new file mode 100644
index 000000000..e4c694983
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-metadata-manufacture-1.3.json
@@ -0,0 +1,21 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "manufacture": {
+      "name": "Acme, Inc.",
+      "url": [
+        "https://example.com"
+      ],
+      "contact": [
+        {
+          "name": "Acme Professional Services",
+          "email": "professional.services@example.com"
+        }
+      ]
+    }
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-metadata-manufacture-1.3.xml b/tests/_data/schemaTestData/1.3/valid-metadata-manufacture-1.3.xml
new file mode 100644
index 000000000..c94d01c92
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-metadata-manufacture-1.3.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <metadata>
+        <manufacture>
+            <name>Acme, Inc.</name>
+            <url>https://example.com</url>
+            <contact>
+                <name>Acme Professional Services</name>
+                <email>professional.services@example.com</email>
+            </contact>
+        </manufacture>
+    </metadata>
+    <components />
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-metadata-supplier-1.3.json b/tests/_data/schemaTestData/1.3/valid-metadata-supplier-1.3.json
new file mode 100644
index 000000000..103882ca2
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-metadata-supplier-1.3.json
@@ -0,0 +1,21 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "supplier": {
+      "name": "Acme, Inc.",
+      "url": [
+        "https://example.com"
+      ],
+      "contact": [
+        {
+          "name": "Acme Distribution",
+          "email": "distribution@example.com"
+        }
+      ]
+    }
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-metadata-supplier-1.3.xml b/tests/_data/schemaTestData/1.3/valid-metadata-supplier-1.3.xml
new file mode 100644
index 000000000..1235f4c23
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-metadata-supplier-1.3.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <metadata>
+        <supplier>
+            <name>Acme, Inc.</name>
+            <url>https://example.com</url>
+            <contact>
+                <name>Acme Distribution</name>
+                <email>distribution@example.com</email>
+            </contact>
+        </supplier>
+    </metadata>
+    <components />
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-metadata-timestamp-1.3.json b/tests/_data/schemaTestData/1.3/valid-metadata-timestamp-1.3.json
new file mode 100644
index 000000000..8f47f110a
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-metadata-timestamp-1.3.json
@@ -0,0 +1,10 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "timestamp": "2020-04-13T20:20:39+00:00"
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-metadata-timestamp-1.3.xml b/tests/_data/schemaTestData/1.3/valid-metadata-timestamp-1.3.xml
new file mode 100644
index 000000000..881349216
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-metadata-timestamp-1.3.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <metadata>
+        <timestamp>2020-04-07T07:01:00Z</timestamp>
+    </metadata>
+    <components />
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-metadata-tool-1.3.json b/tests/_data/schemaTestData/1.3/valid-metadata-tool-1.3.json
new file mode 100644
index 000000000..61bcaec34
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-metadata-tool-1.3.json
@@ -0,0 +1,26 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "tools": [
+      {
+        "vendor": "Awesome Vendor",
+        "name": "Awesome Tool",
+        "version": "9.1.2",
+        "hashes": [
+          {
+            "alg": "SHA-1",
+            "content": "25ed8e31b995bb927966616df2a42b979a2717f0"
+          },
+          {
+            "alg": "SHA-256",
+            "content": "a74f733635a19aefb1f73e5947cef59cd7440c6952ef0f03d09d974274cbd6df"
+          }
+        ]
+      }
+    ]
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-metadata-tool-1.3.xml b/tests/_data/schemaTestData/1.3/valid-metadata-tool-1.3.xml
new file mode 100644
index 000000000..8c2d17fea
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-metadata-tool-1.3.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <metadata>
+        <tools>
+            <tool>
+                <vendor>Awesome Vendor</vendor>
+                <name>Awesome Tool</name>
+                <version>9.1.2</version>
+                <hashes>
+                    <hash alg="SHA-1">25ed8e31b995bb927966616df2a42b979a2717f0</hash>
+                    <hash alg="SHA-256">a74f733635a19aefb1f73e5947cef59cd7440c6952ef0f03d09d974274cbd6df</hash>
+                </hashes>
+            </tool>
+        </tools>
+    </metadata>
+    <components />
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-minimal-viable-1.3.json b/tests/_data/schemaTestData/1.3/valid-minimal-viable-1.3.json
new file mode 100644
index 000000000..6a9e646d0
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-minimal-viable-1.3.json
@@ -0,0 +1,13 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-minimal-viable-1.3.xml b/tests/_data/schemaTestData/1.3/valid-minimal-viable-1.3.xml
new file mode 100644
index 000000000..6a9480298
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-minimal-viable-1.3.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-patch-1.3.json b/tests/_data/schemaTestData/1.3/valid-patch-1.3.json
new file mode 100644
index 000000000..eebdf67a1
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-patch-1.3.json
@@ -0,0 +1,88 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "group": "com.acme",
+      "name": "sample-library",
+      "version": "1.0.0",
+      "pedigree": {
+        "ancestors": [
+          {
+            "type": "library",
+            "group": "org.example",
+            "name": "sample-library",
+            "version": "1.0.0"
+          }
+        ],
+        "patches": [
+          {
+            "type": "unofficial",
+            "diff": {
+              "text": {
+                "contentType": "text/plain",
+                "encoding": "base64",
+                "content": "blah"
+              },
+              "url": "uri/to/changes.diff"
+            },
+            "resolves": [
+              {
+                "type": "enhancement",
+                "id": "JIRA-17240",
+                "description": "Great new feature that does something",
+                "source": {
+                  "name": "Acme Org",
+                  "url": "https://issues.acme.org/17240"
+                }
+              }
+            ]
+          },
+          {
+            "type": "backport",
+            "diff": {
+              "text": {
+                "contentType": "text/plain",
+                "encoding": "base64",
+                "content": "blah"
+              },
+              "url": "uri/to/changes.diff"
+            },
+            "resolves": [
+              {
+                "type": "security",
+                "id": "CVE-2019-9997",
+                "name": "CVE-2019-9997",
+                "description": "blah blah",
+                "source": {
+                  "name": "NVD",
+                  "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-9997"
+                },
+                "references": [
+                  "http://some/other/site-1",
+                  "http://some/other/site-2"
+                ]
+              },
+              {
+                "type": "defect",
+                "id": "JIRA-874319",
+                "description": "Enable to do something",
+                "source": {
+                  "name": "Example Org",
+                  "url": "https://issues.example.org/874319"
+                },
+                "references": [
+                  "http://some/other/site-1",
+                  "http://some/other/site-2"
+                ]
+              }
+            ]
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-patch-1.3.xml b/tests/_data/schemaTestData/1.3/valid-patch-1.3.xml
new file mode 100644
index 000000000..d6e1f4426
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-patch-1.3.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="library">
+            <group>com.acme</group>
+            <name>sample-library</name>
+            <version>1.0.0</version>
+            <pedigree>
+                <ancestors>
+                    <component type="library">
+                        <group>org.example</group>
+                        <name>sample-library</name>
+                        <version>1.0.0</version>
+                    </component>
+                </ancestors>
+                <patches>
+                    <patch type="unofficial">
+                        <diff>
+                            <text content-type="text/plain" encoding="base64">blah</text>
+                            <url>uri/to/changes.diff</url>
+                        </diff>
+                        <resolves>
+                            <issue type="enhancement">
+                                <id>JIRA-17240</id>
+                                <description>Great new feature that does something</description>
+                                <source>
+                                    <name>Acme Org</name>
+                                    <url>https://issues.acme.org/17240</url>
+                                </source>
+                            </issue>
+                        </resolves>
+                    </patch>
+                    <patch type="backport">
+                        <diff>
+                            <text content-type="text/plain" encoding="base64">blah</text>
+                            <url>uri/to/changes.diff</url>
+                        </diff>
+                        <resolves>
+                            <issue type="security">
+                                <id>CVE-2019-9997</id>
+                                <name>CVE-2019-9997</name>
+                                <description>blah blah</description>
+                                <source>
+                                    <name>NVD</name>
+                                    <url>https://nvd.nist.gov/vuln/detail/CVE-2019-9997</url>
+                                </source>
+                                <references>
+                                    <url>http://some/other/site-1</url>
+                                    <url>http://some/other/site-2</url>
+                                </references>
+                            </issue>
+                            <issue type="defect">
+                                <id>JIRA-874319</id>
+                                <description>Enable to do something</description>
+                                <source>
+                                    <name>Example Org</name>
+                                    <url>https://issues.example.org/874319</url>
+                                </source>
+                                <references>
+                                    <url>http://some/other/site-1</url>
+                                    <url>http://some/other/site-2</url>
+                                </references>
+                            </issue>
+                        </resolves>
+                    </patch>
+                </patches>
+            </pedigree>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-properties-1.3.json b/tests/_data/schemaTestData/1.3/valid-properties-1.3.json
new file mode 100644
index 000000000..f30e2dbe4
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-properties-1.3.json
@@ -0,0 +1,55 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "properties": [
+      {
+        "name": "Foo",
+        "value": "Bar"
+      },
+      {
+        "name": "Foo",
+        "value": "You"
+      },
+      {
+        "name": "Foo",
+        "value": "Two"
+      },
+      {
+        "name": "Bar",
+        "value": "Foo"
+      }
+    ]
+  },
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "properties": [
+        {
+          "name": "Foo",
+          "value": "Bar"
+        }
+      ]
+    }
+  ],
+  "services": [
+    {
+      "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8",
+      "group": "org.partner",
+      "name": "Stock ticker service",
+      "endpoints": [
+        "https://partner.org/api/v1/stock"
+      ],
+      "properties": [
+        {
+          "name": "Foo",
+          "value": "Bar"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-properties-1.3.xml b/tests/_data/schemaTestData/1.3/valid-properties-1.3.xml
new file mode 100644
index 000000000..79d49c2e4
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-properties-1.3.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <metadata>
+        <properties>
+            <property name="Foo">Bar</property>
+            <property name="Foo">You</property>
+            <property name="Foo">Two</property>
+            <property name="Bar">Foo</property>
+        </properties>
+    </metadata>
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <properties>
+                <property name="Foo">Bar</property>
+                <property name="Bar">Foo</property>
+            </properties>
+        </component>
+    </components>
+    <services>
+        <service bom-ref="b2a46a4b-8367-4bae-9820-95557cfe03a8">
+            <group>org.partner</group>
+            <name>Stock ticker service</name>
+            <endpoints>
+                <endpoint>https://partner.org/api/v1/stock</endpoint>
+            </endpoints>
+            <properties>
+                <property name="Foo">Bar</property>
+                <property name="Bar">Foo</property>
+            </properties>
+        </service>
+    </services>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-random-attributes-1.3.xml b/tests/_data/schemaTestData/1.3/valid-random-attributes-1.3.xml
new file mode 100644
index 000000000..b07d29db2
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-random-attributes-1.3.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<bom foo="bar" bar="foo" serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components foo="bar" bar="foo" >
+        <component foo="bar" bar="foo"  type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors foo="bar" bar="foo">
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+                <notes>Commentary here</notes>
+            </pedigree>
+        </component>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="documentation">
+                    <url>http://example.org/docs</url>
+                    <comment>All component versions are documented here</comment>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.org/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+        <component type="framework">
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Some random license</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-service-1.3.json b/tests/_data/schemaTestData/1.3/valid-service-1.3.json
new file mode 100644
index 000000000..1a627c4c3
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-service-1.3.json
@@ -0,0 +1,101 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "bom-ref": "pkg:maven/com.acme/stock-java-client@1.0.12",
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "stock-java-client",
+      "version": "1.0.12",
+      "hashes": [
+        {
+          "alg": "SHA-1",
+          "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a"
+        }
+      ],
+      "licenses": [
+        {
+          "license": {
+            "id": "Apache-2.0"
+          }
+        }
+      ],
+      "purl": "pkg:maven/com.acme/stock-java-client@1.0.12"
+    }
+  ],
+  "services": [
+    {
+      "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8",
+      "provider": {
+        "name": "Partner Org",
+        "url": [
+          "https://partner.org"
+        ],
+        "contact": [
+          {
+            "name": "Support",
+            "email": "support@partner",
+            "phone": "800-555-1212"
+          }
+        ]
+      },
+      "group": "org.partner",
+      "name": "Stock ticker service",
+      "version": "2020-Q2",
+      "description": "Provides real-time stock information",
+      "endpoints": [
+        "https://partner.org/api/v1/lookup",
+        "https://partner.org/api/v1/stock"
+      ],
+      "authenticated": true,
+      "x-trust-boundary": true,
+      "data": [
+        {
+          "classification": "PII",
+          "flow": "inbound"
+        },
+        {
+          "classification": "PIFI",
+          "flow": "outbound"
+        },
+        {
+          "classification": "pubic",
+          "flow": "bi-directional"
+        },
+        {
+          "classification": "partner-data",
+          "flow": "unknown"
+        }
+      ],
+      "licenses": [
+        {
+          "license": {
+            "name": "Partner license"
+          }
+        }
+      ],
+      "externalReferences": [
+        {
+          "type": "website",
+          "url": "http://partner.org"
+        },
+        {
+          "type": "documentation",
+          "url": "http://api.partner.org/swagger"
+        }
+      ]
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:maven/com.acme/stock-java-client@1.0.12",
+      "dependsOn": [
+        "b2a46a4b-8367-4bae-9820-95557cfe03a8"
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-service-1.3.xml b/tests/_data/schemaTestData/1.3/valid-service-1.3.xml
new file mode 100644
index 000000000..5fe3aa5ee
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-service-1.3.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="library" bom-ref="pkg:maven/com.acme/stock-java-client@1.0.12">
+            <group>com.acme</group>
+            <name>stock-java-client</name>
+            <version>1.0.12</version>
+            <hashes>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/stock-java-client@1.0.12</purl>
+        </component>
+    </components>
+    <services>
+        <service bom-ref="b2a46a4b-8367-4bae-9820-95557cfe03a8">
+            <provider>
+                <name>Partner Org</name>
+                <url>https://partner.org</url>
+                <contact>
+                    <name>Support</name>
+                    <email>support@partner</email>
+                    <phone>800-555-1212</phone>
+                </contact>
+            </provider>
+            <group>org.partner</group>
+            <name>Stock ticker service</name>
+            <version>2020-Q2</version>
+            <description>Provides real-time stock information</description>
+            <endpoints>
+                <endpoint>https://partner.org/api/v1/lookup</endpoint>
+                <endpoint>https://partner.org/api/v1/stock</endpoint>
+            </endpoints>
+            <authenticated>true</authenticated>
+            <x-trust-boundary>true</x-trust-boundary>
+            <data>
+                <classification flow="inbound">PII</classification>
+                <classification flow="outbound">PIFI</classification>
+                <classification flow="bi-directional">pubic</classification>
+                <classification flow="unknown">partner-data</classification>
+            </data>
+            <licenses>
+                <license>
+                    <name>Partner license</name>
+                </license>
+            </licenses>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://partner.org</url>
+                </reference>
+                <reference type="documentation">
+                    <url>http://api.partner.org/swagger</url>
+                </reference>
+            </externalReferences>
+        </service>
+    </services>
+    <dependencies>
+        <dependency ref="pkg:maven/com.acme/stock-java-client@1.0.12">
+            <dependency ref="b2a46a4b-8367-4bae-9820-95557cfe03a8"/>
+        </dependency>
+    </dependencies>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-service-empty-objects-1.3.json b/tests/_data/schemaTestData/1.3/valid-service-empty-objects-1.3.json
new file mode 100644
index 000000000..72c9ceae0
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-service-empty-objects-1.3.json
@@ -0,0 +1,22 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.3",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "services": [
+    {
+      "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8",
+      "provider": {
+        "contact": [
+        ]
+      },
+      "name": "Stock ticker service",
+      "endpoints": [
+      ],
+      "data": [
+      ],
+      "externalReferences": [
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.3/valid-service-empty-objects-1.3.xml b/tests/_data/schemaTestData/1.3/valid-service-empty-objects-1.3.xml
new file mode 100644
index 000000000..c5cdb1fbd
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-service-empty-objects-1.3.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <services>
+        <service bom-ref="b2a46a4b-8367-4bae-9820-95557cfe03a8">
+            <provider>
+            </provider>
+            <name>Stock ticker service</name>
+            <endpoints>
+            </endpoints>
+            <data>
+            </data>
+            <licenses>
+            </licenses>
+        </service>
+    </services>
+</bom>
diff --git a/tests/_data/schemaTestData/1.3/valid-xml-signature-1.3.xml b/tests/_data/schemaTestData/1.3/valid-xml-signature-1.3.xml
new file mode 100644
index 000000000..248018125
--- /dev/null
+++ b/tests/_data/schemaTestData/1.3/valid-xml-signature-1.3.xml
@@ -0,0 +1,177 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.3">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>jdoe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>jdoe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+            </pedigree>
+        </component>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/xml" encoding="base64">blah</text>
+                    <url>fdaf</url>
+                </license>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+        </component>
+        <component type="framework">
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+        <ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
+            <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
+            <ds:Reference URI="" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                <ds:Transforms xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                    <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
+                </ds:Transforms>
+                <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
+                <ds:DigestValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">PrB8/rofGs34XwIX5OIdYSjV2aKSe5VaztJKBvsgjIk=</ds:DigestValue>
+            </ds:Reference>
+        </ds:SignedInfo>
+        <ds:SignatureValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+            ePGNg30Zl9CW7RZdcRn8gFCp1AlWncjudA9pQDXyqZOvyj9RC2YtkI688WdfDOdVRZs6mflJFXr7
+            IKA9wY6jVrEqZmlef55Qp/8iGwOjOjWbwYsm2AhrdkUi9gaFSWEd8uITYHOpWbiPFSsnimiK9+ft
+            56dkg/oJMLdXzlaukzq9iGkRcafRkW433OQcZIXwD2K8lg4cdD0pNNNqBa+PgIvzbxA5H84TyQDB
+            HBcQiw/j1edRBJgPOwlqzZDUawOJaFhAPUQ+GGKMetIJH2FqqrHXGuV1NIwnbWTCg40RdOcBdCrl
+            PDtDVjFh34uZ4dYBpJBIlM4daD2N4B6WPB5iHRyuZTczF2q03ObabuTgkpK6EeadFVqFNsEOOPPt
+            MDDyda+Lwff5KjvUHvRRtUDIOm2rNIQKzaseulwYcA9UWQHAFcupJmWcLLM4zzY7F/uOdZuSurzh
+            U6h5kdb76Juepof6ee4Q5YpwNOGNL5JfB4C3sc/Dbbv8dZ8OuXFYSZN7reUGZzCNksByqERPEbAe
+            n1ldJu1HnRXRQpwaon8Asy9CuNmPfFCfDwOs2B4p4tb+tLNIKFHdRlpd19Zr9vCMCbltXeqq0Cpq
+            OejSyLYGqSWzzzUh449dJrg6KTevrTNEln5GAlLBFSdjM5JA7KV2u/GyDVFwSEW7UKooGN4CtgU=
+        </ds:SignatureValue>
+        <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+            <ds:X509Data xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                <ds:X509SubjectName xmlns:ds="http://www.w3.org/2000/09/xmldsig#">CN=bomsigner,OU=development,O=cyclonedx</ds:X509SubjectName>
+                <ds:X509Certificate xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                    MIIE+DCCAuCgAwIBAgIEXGzayTANBgkqhkiG9w0BAQsFADA+MRIwEAYDVQQKDAljeWNsb25lZHgx
+                    FDASBgNVBAsMC2RldmVsb3BtZW50MRIwEAYDVQQDDAlib21zaWduZXIwHhcNMTkwMjIwMDQ0MjQ5
+                    WhcNNDkwMjIwMDQ0MjQ5WjA+MRIwEAYDVQQKDAljeWNsb25lZHgxFDASBgNVBAsMC2RldmVsb3Bt
+                    ZW50MRIwEAYDVQQDDAlib21zaWduZXIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCo
+                    5JZsM4ZLfWW/dpRlU6CpnItWspddF+bEVDETKVwVj9tGpqR5jURgKS/BOQP2TGUsR3/ZJJBhYRll
+                    ONhrUQrVKV/I6wp3Z40qPEa1RJLE+QlG9iL8qBV52CnXkLmnUSax3dspSzmSct5vDiTnvpHG9jr0
+                    AKFeTjy7U9rv8GJybz0ijwlpBoO9JRdYPX2PrrzoSeJLoxKq+GwuyCZ5LhXRN0p1a+NAirTAmY+c
+                    G1ZTLkMmfeCUy1t6H/bG4RnYOSSPOvk7Rb68lQpUqb+pbbNuB2o/b9cDwtLLCtGVlu+5Wj8mrytY
+                    3FGFQM20j3yVeRInmGqTTDBelQa/CO4JKqBlmaeYEIvNYbFs9+AlqadivwDO51RpdPo9fPSpsBpy
+                    ZMv6S2bXNuUML+Rk99WyKJTPM0PTZhRLZ64ZXEhlz3kQWVoSlrcwwim6sj6LRUb5IRqA3lxRFUI6
+                    NXKyiQLamQp+t3/9OGW9L1rLCcw7yFo0s8LhMTPMiv4ol9/hQViT+8ICzDsr0OM9ZiF4/UagFRlt
+                    IClV70cjh1DpsZjzQIRVGaj8uQ/JdtfRz4E43Ki7U0a2Vpho/t6poLVndv46tkX5nYGtMW4WfMoD
+                    ZflQ9pajvvKtr2jB1wob6nsU+VTmAcWZy4BCPH+XyfDw/0SFBdUceJJJtPWIeYFDUY7onptf+wID
+                    AQABMA0GCSqGSIb3DQEBCwUAA4ICAQCOVariNgK+9OF/5T9ZaSvZbkk45RTmzgQNXtFc5xfRvqwP
+                    s+pu/DFXm1R+ltjyS5j3w6NBZUFUI5MqLQr6JEEDrbu8BvfBO57wJNAEATj1JIHEfDfh7BxnBF8f
+                    oYFOwbrh4jOt0wz0FW2obsSVmF4GSvS7tTlWqTcsxjdZVmwP40RWu18B9jzv7M61adrWD3ksDA5O
+                    amSOsZi3Nt0aacDkyGRdCIEFi0fplxQInXMtD1z3RhXu2JSTAIr54Cei49Bh71kAXSWHMCog/f8a
+                    lSrZyqZBty/ACfU9DqlPIM+giHePKm4z2bcdpUdKZk6wcKDn4CvuBOqsMBMg7L05UEyyqTPD/4dk
+                    2GwJ8Nv0E5gsYHCIXF2cZ3OUVsw0mB/ozleEJVDE02uZZN/1wW1Xq028LsMdgN0Wk1WvWyF5MEdh
+                    nPWuhqp6tNaDI/kK6XQF+LjYJUzua3AQFOHfYNLKhO6d+bJ4rr0833v4v3cLW34kbXkKb6U3Yv8X
+                    SK3jBGCACiPgnc0N6awkh1kDlrZQ7GMsl14c+2+vpl9Lf0sL0mRUIyICfSC8MjlsP/BZH3emyfsk
+                    iWivPALomycKqP+PSkt1WaWApGENZWk1wNN99FYSYlt6LViW2p6T97fRx4jPRlHu+wecfD2k9RP4
+                    bt5W2HWfOP0zNAS7SnAVLEl2QZxXKw==
+                </ds:X509Certificate>
+            </ds:X509Data>
+            <ds:KeyValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                <ds:RSAKeyValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                    <ds:Modulus xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                        qOSWbDOGS31lv3aUZVOgqZyLVrKXXRfmxFQxEylcFY/bRqakeY1EYCkvwTkD9kxlLEd/2SSQYWEZ
+                        ZTjYa1EK1SlfyOsKd2eNKjxGtUSSxPkJRvYi/KgVedgp15C5p1Emsd3bKUs5knLebw4k576RxvY6
+                        9AChXk48u1Pa7/Bicm89Io8JaQaDvSUXWD19j6686EniS6MSqvhsLsgmeS4V0TdKdWvjQIq0wJmP
+                        nBtWUy5DJn3glMtbeh/2xuEZ2Dkkjzr5O0W+vJUKVKm/qW2zbgdqP2/XA8LSywrRlZbvuVo/Jq8r
+                        WNxRhUDNtI98lXkSJ5hqk0wwXpUGvwjuCSqgZZmnmBCLzWGxbPfgJamnYr8AzudUaXT6PXz0qbAa
+                        cmTL+ktm1zblDC/kZPfVsiiUzzND02YUS2euGVxIZc95EFlaEpa3MMIpurI+i0VG+SEagN5cURVC
+                        OjVysokC2pkKfrd//ThlvS9aywnMO8haNLPC4TEzzIr+KJff4UFYk/vCAsw7K9DjPWYheP1GoBUZ
+                        bSApVe9HI4dQ6bGY80CEVRmo/LkPyXbX0c+BONyou1NGtlaYaP7eqaC1Z3b+OrZF+Z2BrTFuFnzK
+                        A2X5UPaWo77yra9owdcKG+p7FPlU5gHFmcuAQjx/l8nw8P9EhQXVHHiSSbT1iHmBQ1GO6J6bX/s=
+                    </ds:Modulus>
+                    <ds:Exponent xmlns:ds="http://www.w3.org/2000/09/xmldsig#">AQAB</ds:Exponent>
+                </ds:RSAKeyValue>
+            </ds:KeyValue>
+        </ds:KeyInfo>
+    </ds:Signature></bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-bomformat-1.4.json b/tests/_data/schemaTestData/1.4/invalid-bomformat-1.4.json
new file mode 100644
index 000000000..6959cab0c
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-bomformat-1.4.json
@@ -0,0 +1,8 @@
+{
+  "bomFormat": "AnotherFormat",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-component-ref-1.4.json b/tests/_data/schemaTestData/1.4/invalid-component-ref-1.4.json
new file mode 100644
index 000000000..3be019a3b
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-component-ref-1.4.json
@@ -0,0 +1,20 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "bom-ref": "123",
+      "name": "acme-library",
+      "version": "1.0.0"
+    },
+    {
+      "type": "library",
+      "bom-ref": "123",
+      "name": "acme-library",
+      "version": "1.0.0"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-component-ref-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-component-ref-1.4.xml
new file mode 100644
index 000000000..d44179094
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-component-ref-1.4.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library" bom-ref="123">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <components>
+                <component type="library" bom-ref="123">
+                    <name>acme-library</name>
+                    <version>1.0.0</version>
+                </component>
+            </components>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-component-swid-1.4.json b/tests/_data/schemaTestData/1.4/invalid-component-swid-1.4.json
new file mode 100644
index 000000000..4ad023c59
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-component-swid-1.4.json
@@ -0,0 +1,18 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "application",
+      "author": "Acme Super Heros",
+      "name": "Acme Application",
+      "version": "9.1.1",
+      "swid": {
+        "name": "Acme Application",
+        "version": "9.1.1"
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-component-swid-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-component-swid-1.4.xml
new file mode 100644
index 000000000..5ba6401e7
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-component-swid-1.4.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="application">
+            <author>Acme Super Heros</author>
+            <name>Acme Application</name>
+            <version>9.1.1</version>
+            <swid name="Acme Application" version="9.1.1" />
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-component-type-1.4.json b/tests/_data/schemaTestData/1.4/invalid-component-type-1.4.json
new file mode 100644
index 000000000..7c7bd8bb0
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-component-type-1.4.json
@@ -0,0 +1,13 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "foo",
+      "name": "acme-library",
+      "version": "1.0.0"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-component-type-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-component-type-1.4.xml
new file mode 100644
index 000000000..4f82adfec
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-component-type-1.4.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="foo">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-dependency-1.4.json b/tests/_data/schemaTestData/1.4/invalid-dependency-1.4.json
new file mode 100644
index 000000000..1e5f12a18
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-dependency-1.4.json
@@ -0,0 +1,37 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "bom-ref": "library-a",
+      "type": "library",
+      "name": "library-a",
+      "version": "1.0.0"
+    },
+    {
+      "bom-ref": "library-b",
+      "type": "library",
+      "name": "library-b",
+      "version": "1.0.0"
+    },
+    {
+      "bom-ref": "library-c",
+      "type": "library",
+      "name": "library-c",
+      "version": "1.0.0"
+    }
+  ],
+  "dependencies": [
+    {
+      "dependsOn": []
+    },
+    {
+      "ref": "library-b",
+      "dependsOn": [
+        "library-c"
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-dependency-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-dependency-1.4.xml
new file mode 100644
index 000000000..3c9e00497
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-dependency-1.4.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library" bom-ref="library-a">
+            <name>acme-library-a</name>
+            <version>1.0.0</version>
+        </component>
+        <component type="library" bom-ref="library-b">
+            <name>acme-library-b</name>
+            <version>1.0.0</version>
+        </component>
+        <component type="library" bom-ref="library-c">
+            <name>acme-library-b</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+    <dependencies>
+        <dependency />
+        <dependency ref="library-b">
+            <dependency ref="library-c"/>
+        </dependency>
+    </dependencies>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-empty-component-1.4.json b/tests/_data/schemaTestData/1.4/invalid-empty-component-1.4.json
new file mode 100644
index 000000000..2bbf057b7
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-empty-component-1.4.json
@@ -0,0 +1,11 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-empty-component-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-empty-component-1.4.xml
new file mode 100644
index 000000000..8d82fe536
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-empty-component-1.4.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="application">
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-hash-alg-1.4.json b/tests/_data/schemaTestData/1.4/invalid-hash-alg-1.4.json
new file mode 100644
index 000000000..9cb10fb0c
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-hash-alg-1.4.json
@@ -0,0 +1,32 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "scope": "required",
+      "hashes": [
+        {
+          "alg": "FOO",
+          "content": "3942447fac867ae5cdb3229b658f4d48"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-hash-alg-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-hash-alg-1.4.xml
new file mode 100644
index 000000000..51fd9fed0
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-hash-alg-1.4.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="FOO">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-hash-md5-1.4.json b/tests/_data/schemaTestData/1.4/invalid-hash-md5-1.4.json
new file mode 100644
index 000000000..07d0ac03e
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-hash-md5-1.4.json
@@ -0,0 +1,32 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "scope": "required",
+      "hashes": [
+        {
+          "alg": "MD5",
+          "content": "foo"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-hash-md5-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-hash-md5-1.4.xml
new file mode 100644
index 000000000..d964a5920
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-hash-md5-1.4.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">foo</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-hash-sha1-1.4.json b/tests/_data/schemaTestData/1.4/invalid-hash-sha1-1.4.json
new file mode 100644
index 000000000..9342157ae
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-hash-sha1-1.4.json
@@ -0,0 +1,32 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "scope": "required",
+      "hashes": [
+        {
+          "alg": "MD5",
+          "content": "3942447fac867ae5cdb3229b658f4d48"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "foo"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-hash-sha1-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-hash-sha1-1.4.xml
new file mode 100644
index 000000000..0c6c28143
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-hash-sha1-1.4.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">foo</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-hash-sha256-1.4.json b/tests/_data/schemaTestData/1.4/invalid-hash-sha256-1.4.json
new file mode 100644
index 000000000..a3a9a9dc8
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-hash-sha256-1.4.json
@@ -0,0 +1,32 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "scope": "required",
+      "hashes": [
+        {
+          "alg": "MD5",
+          "content": "3942447fac867ae5cdb3229b658f4d48"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "foo"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-hash-sha256-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-hash-sha256-1.4.xml
new file mode 100644
index 000000000..e753128e0
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-hash-sha256-1.4.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">foo</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-hash-sha512-1.4.json b/tests/_data/schemaTestData/1.4/invalid-hash-sha512-1.4.json
new file mode 100644
index 000000000..fdf1f5b88
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-hash-sha512-1.4.json
@@ -0,0 +1,32 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "scope": "required",
+      "hashes": [
+        {
+          "alg": "MD5",
+          "content": "3942447fac867ae5cdb3229b658f4d48"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "foo"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-hash-sha512-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-hash-sha512-1.4.xml
new file mode 100644
index 000000000..0339763df
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-hash-sha512-1.4.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">foo</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-issue-type-1.4.json b/tests/_data/schemaTestData/1.4/invalid-issue-type-1.4.json
new file mode 100644
index 000000000..e1f02ce8a
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-issue-type-1.4.json
@@ -0,0 +1,48 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "group": "com.acme",
+      "name": "sample-library",
+      "version": "1.0.0",
+      "pedigree": {
+        "ancestors": [
+          {
+            "type": "library",
+            "group": "org.example",
+            "name": "sample-library",
+            "version": "1.0.0"
+          }
+        ],
+        "patches": [
+          {
+            "type": "unofficial",
+            "diff": {
+              "text": {
+                "contentType": "text/plain",
+                "encoding": "base64",
+                "content": "blah"
+              },
+              "url": "uri/to/changes.diff"
+            },
+            "resolves": [
+              {
+                "type": "foo",
+                "id": "JIRA-17240",
+                "description": "Great new feature that does something",
+                "source": {
+                  "name": "Acme Org",
+                  "url": "https://issues.acme.org/17240"
+                }
+              }
+            ]
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-issue-type-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-issue-type-1.4.xml
new file mode 100644
index 000000000..0e005c280
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-issue-type-1.4.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library">
+            <group>com.acme</group>
+            <name>sample-library</name>
+            <version>1.0.0</version>
+            <pedigree>
+                <ancestors>
+                    <component type="library">
+                        <group>org.example</group>
+                        <name>sample-library</name>
+                        <version>1.0.0</version>
+                    </component>
+                </ancestors>
+                <patches>
+                    <patch type="unofficial">
+                        <diff>
+                            <text content-type="text/plain" encoding="base64">blah</text>
+                            <url>uri/to/changes.diff</url>
+                        </diff>
+                        <resolves>
+                            <issue type="foo">
+                                <id>JIRA-17240</id>
+                                <description>Great new feature that does something</description>
+                                <source>
+                                    <name>Acme Org</name>
+                                    <url>https://issues.acme.org/17240</url>
+                                </source>
+                            </issue>
+                        </resolves>
+                    </patch>
+                </patches>
+            </pedigree>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-license-choice-1.4.json b/tests/_data/schemaTestData/1.4/invalid-license-choice-1.4.json
new file mode 100644
index 000000000..82fcfdba8
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-license-choice-1.4.json
@@ -0,0 +1,23 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "licenses": [
+        {
+          "expression": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0",
+          "license": {
+            "name": "Apache License 2.0"
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-license-choice-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-license-choice-1.4.xml
new file mode 100644
index 000000000..83e4e3791
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-license-choice-1.4.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-license-encoding-1.4.json b/tests/_data/schemaTestData/1.4/invalid-license-encoding-1.4.json
new file mode 100644
index 000000000..ce76280fa
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-license-encoding-1.4.json
@@ -0,0 +1,28 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "licenses": [
+        {
+          "license": {
+            "id": "Apache-2.0",
+            "text": {
+              "contentType": "text/plain",
+              "encoding": "base85",
+              "content": "CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4="
+            },
+            "url": "https://www.apache.org/licenses/LICENSE-2.0.txt"
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-license-encoding-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-license-encoding-1.4.xml
new file mode 100644
index 000000000..95bd2bcb9
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-license-encoding-1.4.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base85">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-license-id-1.4.json b/tests/_data/schemaTestData/1.4/invalid-license-id-1.4.json
new file mode 100644
index 000000000..ed317a5be
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-license-id-1.4.json
@@ -0,0 +1,22 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "licenses": [
+        {
+          "license": {
+            "id": "Apache-2"
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-license-id-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-license-id-1.4.xml
new file mode 100644
index 000000000..68ca8efa7
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-license-id-1.4.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-license-id-count-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-license-id-count-1.4.xml
new file mode 100644
index 000000000..27f73e5d6
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-license-id-count-1.4.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>MIT</id>
+                    <!-- This was a defect in schema 1.0 and is no longer permitted -->
+                    <id>MIT</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-license-name-count-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-license-name-count-1.4.xml
new file mode 100644
index 000000000..e986db569
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-license-name-count-1.4.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Apache License 2.0</name>
+                    <!-- This was a defect in schema 1.0 and is no longer permitted -->
+                    <name>Apache License 2.0</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-metadata-license-1.4.json b/tests/_data/schemaTestData/1.4/invalid-metadata-license-1.4.json
new file mode 100644
index 000000000..0ea6d35a6
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-metadata-license-1.4.json
@@ -0,0 +1,16 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "licenses": [
+      {
+        "license": {
+          "id": "Apache-2"
+        }
+      }
+    ]
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-metadata-license-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-metadata-license-1.4.xml
new file mode 100644
index 000000000..51cbe10e6
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-metadata-license-1.4.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <metadata>
+        <licenses>
+            <license>
+                <id>Apache-2</id>
+            </license>
+        </licenses>
+    </metadata>
+    <components />
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.4/invalid-metadata-timestamp-1.4.json b/tests/_data/schemaTestData/1.4/invalid-metadata-timestamp-1.4.json
new file mode 100644
index 000000000..22ce0aa86
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-metadata-timestamp-1.4.json
@@ -0,0 +1,10 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "timestamp": "2020-04-13"
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-metadata-timestamp-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-metadata-timestamp-1.4.xml
new file mode 100644
index 000000000..544abc19c
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-metadata-timestamp-1.4.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <metadata>
+        <timestamp>2020-04-07</timestamp>
+    </metadata>
+    <components />
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-missing-component-type-1.4.json b/tests/_data/schemaTestData/1.4/invalid-missing-component-type-1.4.json
new file mode 100644
index 000000000..eee0ac3a2
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-missing-component-type-1.4.json
@@ -0,0 +1,12 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "name": "acme-library",
+      "version": "1.0.0"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-missing-component-type-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-missing-component-type-1.4.xml
new file mode 100644
index 000000000..7200d4ad0
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-missing-component-type-1.4.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component>
+            <name>acme-library</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-namespace-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-namespace-1.4.xml
new file mode 100644
index 000000000..9e42be401
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-namespace-1.4.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/12">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+                <notes>Commentary here</notes>
+            </pedigree>
+        </component>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="documentation">
+                    <url>http://example.org/docs</url>
+                    <comment>All component versions are documented here</comment>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.org/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+        <component type="framework">
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Some random license</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-patch-type-1.4.json b/tests/_data/schemaTestData/1.4/invalid-patch-type-1.4.json
new file mode 100644
index 000000000..1e35b0954
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-patch-type-1.4.json
@@ -0,0 +1,48 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "group": "com.acme",
+      "name": "sample-library",
+      "version": "1.0.0",
+      "pedigree": {
+        "ancestors": [
+          {
+            "type": "library",
+            "group": "org.example",
+            "name": "sample-library",
+            "version": "1.0.0"
+          }
+        ],
+        "patches": [
+          {
+            "type": "foo",
+            "diff": {
+              "text": {
+                "contentType": "text/plain",
+                "encoding": "base64",
+                "content": "blah"
+              },
+              "url": "uri/to/changes.diff"
+            },
+            "resolves": [
+              {
+                "type": "enhancement",
+                "id": "JIRA-17240",
+                "description": "Great new feature that does something",
+                "source": {
+                  "name": "Acme Org",
+                  "url": "https://issues.acme.org/17240"
+                }
+              }
+            ]
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-patch-type-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-patch-type-1.4.xml
new file mode 100644
index 000000000..0e8a30d10
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-patch-type-1.4.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library">
+            <group>com.acme</group>
+            <name>sample-library</name>
+            <version>1.0.0</version>
+            <pedigree>
+                <ancestors>
+                    <component type="library">
+                        <group>org.example</group>
+                        <name>sample-library</name>
+                        <version>1.0.0</version>
+                    </component>
+                </ancestors>
+                <patches>
+                    <patch type="foo">
+                        <diff>
+                            <text content-type="text/plain" encoding="base64">blah</text>
+                            <url>uri/to/changes.diff</url>
+                        </diff>
+                        <resolves>
+                            <issue type="enhancement">
+                                <id>JIRA-17240</id>
+                                <description>Great new feature that does something</description>
+                                <source>
+                                    <name>Acme Org</name>
+                                    <url>https://issues.acme.org/17240</url>
+                                </source>
+                            </issue>
+                        </resolves>
+                    </patch>
+                </patches>
+            </pedigree>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-scope-1.4.json b/tests/_data/schemaTestData/1.4/invalid-scope-1.4.json
new file mode 100644
index 000000000..7a9faeacd
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-scope-1.4.json
@@ -0,0 +1,14 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "scope": "foo"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-scope-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-scope-1.4.xml
new file mode 100644
index 000000000..9c34b135f
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-scope-1.4.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <scope>foo</scope>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-serialnumber-1.4.json b/tests/_data/schemaTestData/1.4/invalid-serialnumber-1.4.json
new file mode 100644
index 000000000..42569ecd0
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-serialnumber-1.4.json
@@ -0,0 +1,8 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f",
+  "version": 1,
+  "components": [
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-serialnumber-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-serialnumber-1.4.xml
new file mode 100644
index 000000000..c4637f265
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-serialnumber-1.4.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+                <notes>Commentary here</notes>
+            </pedigree>
+        </component>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="documentation">
+                    <url>http://example.org/docs</url>
+                    <comment>All component versions are documented here</comment>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.org/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+        <component type="framework">
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Some random license</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/invalid-service-data-1.4.json b/tests/_data/schemaTestData/1.4/invalid-service-data-1.4.json
new file mode 100644
index 000000000..3cc11be1f
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-service-data-1.4.json
@@ -0,0 +1,20 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "services": [
+    {
+      "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8",
+      "name": "Stock ticker service",
+      "authenticated": true,
+      "x-trust-boundary": true,
+      "data": [
+        {
+          "classification": "foo",
+          "flow": "bar"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/invalid-service-data-1.4.xml b/tests/_data/schemaTestData/1.4/invalid-service-data-1.4.xml
new file mode 100644
index 000000000..d999dca90
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/invalid-service-data-1.4.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <services>
+        <service bom-ref="b2a46a4b-8367-4bae-9820-95557cfe03a8">
+            <name>Stock ticker service</name>
+            <data>
+                <classification flow="foo">bar</classification>
+            </data>
+        </service>
+    </services>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-assembly-1.4.json b/tests/_data/schemaTestData/1.4/valid-assembly-1.4.json
new file mode 100644
index 000000000..6d8f82271
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-assembly-1.4.json
@@ -0,0 +1,30 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library-a",
+      "version": "1.0.0",
+      "components": [
+        {
+          "type": "library",
+          "name": "acme-library-b",
+          "version": "2.0.0"
+        }
+      ]
+    }
+  ],
+  "services": [
+    {
+      "name": "acme-service-a",
+      "services": [
+        {
+          "name": "acme-service-b"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-assembly-1.4.xml b/tests/_data/schemaTestData/1.4/valid-assembly-1.4.xml
new file mode 100644
index 000000000..7aa65a3f7
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-assembly-1.4.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library">
+            <name>acme-library-a</name>
+            <version>1.0.0</version>
+            <components>
+                <component type="library">
+                    <name>acme-library-b</name>
+                    <version>2.0.0</version>
+                </component>
+            </components>
+        </component>
+    </components>
+    <services>
+        <service>
+            <name>acme-service-a</name>
+            <services>
+                <service>
+                    <name>acme-service-b</name>
+                </service>
+            </services>
+        </service>
+    </services>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-bom-1.4.json b/tests/_data/schemaTestData/1.4/valid-bom-1.4.json
new file mode 100644
index 000000000..a6494a7b6
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-bom-1.4.json
@@ -0,0 +1,177 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "timestamp": "2020-04-13T20:20:39+00:00",
+    "tools": [
+      {
+        "vendor": "Awesome Vendor",
+        "name": "Awesome Tool",
+        "version": "9.1.2",
+        "hashes": [
+          {
+            "alg": "SHA-1",
+            "content": "25ed8e31b995bb927966616df2a42b979a2717f0"
+          },
+          {
+            "alg": "SHA-256",
+            "content": "a74f733635a19aefb1f73e5947cef59cd7440c6952ef0f03d09d974274cbd6df"
+          }
+        ]
+      }
+    ],
+    "authors": [
+      {
+        "name": "Samantha Wright",
+        "email": "samantha.wright@example.com",
+        "phone": "800-555-1212"
+      }
+    ],
+    "component": {
+      "type": "application",
+      "author": "Acme Super Heros",
+      "name": "Acme Application",
+      "version": "9.1.1",
+      "swid": {
+        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
+        "name": "Acme Application",
+        "version": "9.1.1",
+        "text": {
+          "contentType": "text/xml",
+          "encoding": "base64",
+          "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg=="
+        }
+      }
+    },
+    "manufacture": {
+      "name": "Acme, Inc.",
+      "url": [
+        "https://example.com"
+      ],
+      "contact": [
+        {
+          "name": "Acme Professional Services",
+          "email": "professional.services@example.com"
+        }
+      ]
+    },
+    "supplier": {
+      "name": "Acme, Inc.",
+      "url": [
+        "https://example.com"
+      ],
+      "contact": [
+        {
+          "name": "Acme Distribution",
+          "email": "distribution@example.com"
+        }
+      ]
+    }
+  },
+  "components": [
+    {
+      "bom-ref": "pkg:npm/acme/component@1.0.0",
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "hashes": [
+        {
+          "alg": "MD5",
+          "content": "3942447fac867ae5cdb3229b658f4d48"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282"
+        }
+      ],
+      "licenses": [
+        {
+          "license": {
+            "id": "Apache-2.0",
+            "text": {
+              "contentType": "text/plain",
+              "encoding": "base64",
+              "content": "CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4="
+            },
+            "url": "https://www.apache.org/licenses/LICENSE-2.0.txt"
+          }
+        }
+      ],
+      "purl": "pkg:npm/acme/component@1.0.0",
+      "pedigree": {
+        "ancestors": [
+          {
+            "type": "library",
+            "publisher": "Acme Inc",
+            "group": "com.acme",
+            "name": "tomcat-catalina",
+            "version": "9.0.14"
+          },
+          {
+            "type": "library",
+            "publisher": "Acme Inc",
+            "group": "com.acme",
+            "name": "tomcat-catalina",
+            "version": "9.0.14"
+          }
+        ],
+        "commits": [
+          {
+            "uid": "7638417db6d59f3c431d3e1f261cc637155684cd",
+            "url": "https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd",
+            "author": {
+              "timestamp": "2018-11-13T20:20:39+00:00",
+              "name": "me",
+              "email": "me@acme.org"
+            }
+          }
+        ]
+      }
+    },
+    {
+      "type": "library",
+      "supplier": {
+        "name": "Example, Inc.",
+        "url": [
+          "https://example.com",
+          "https://example.net"
+        ],
+        "contact": [
+          {
+            "name": "Example Support AMER Distribution",
+            "email": "support@example.com",
+            "phone": "800-555-1212"
+          },
+          {
+            "name": "Example Support APAC",
+            "email": "support@apac.example.com"
+          }
+        ]
+      },
+      "author": "Example Super Heros",
+      "group": "org.example",
+      "name": "mylibrary",
+      "version": "1.0.0"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:npm/acme/component@1.0.0",
+      "dependsOn": [
+        "pkg:npm/acme/component@1.0.0"
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-bom-1.4.xml b/tests/_data/schemaTestData/1.4/valid-bom-1.4.xml
new file mode 100644
index 000000000..a675a9676
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-bom-1.4.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <metadata>
+        <timestamp>2020-04-07T07:01:00Z</timestamp>
+        <tools>
+            <tool>
+                <vendor>Awesome Vendor</vendor>
+                <name>Awesome Tool</name>
+                <version>9.1.2</version>
+                <hashes>
+                    <hash alg="SHA-1">25ed8e31b995bb927966616df2a42b979a2717f0</hash>
+                    <hash alg="SHA-256">a74f733635a19aefb1f73e5947cef59cd7440c6952ef0f03d09d974274cbd6df</hash>
+                </hashes>
+            </tool>
+        </tools>
+        <authors>
+            <author>
+                <name>Samantha Wright</name>
+                <email>samantha.wright@example.com</email>
+                <phone>800-555-1212</phone>
+            </author>
+        </authors>
+        <component type="application">
+            <author>Acme Super Heros</author>
+            <name>Acme Application</name>
+            <version>9.1.1</version>
+            <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Acme Application" version="9.1.1">
+                <text content-type="text/xml" encoding="base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==</text>
+            </swid>
+        </component>
+        <manufacture>
+            <name>Acme, Inc.</name>
+            <url>https://example.com</url>
+            <contact>
+                <name>Acme Professional Services</name>
+                <email>professional.services@example.com</email>
+            </contact>
+        </manufacture>
+        <supplier>
+            <name>Acme, Inc.</name>
+            <url>https://example.com</url>
+            <contact>
+                <name>Acme Distribution</name>
+                <email>distribution@example.com</email>
+            </contact>
+        </supplier>
+    </metadata>
+    <components>
+        <component type="application">
+            <author>Acme Super Heros</author>
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <author>Apache Super Heros</author>
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+                <notes>Commentary here</notes>
+            </pedigree>
+        </component>
+        <component type="library">
+            <supplier>
+                <name>Example Inc.</name>
+                <url>https://example.com</url>
+                <url>https://example.net</url>
+                <contact>
+                    <name>Example Support AMER</name>
+                    <email>support@example.com</email>
+                    <phone>800-555-1212</phone>
+                </contact>
+                <contact>
+                    <name>Example Support APAC</name>
+                    <email>support@apac.example.com</email>
+                </contact>
+            </supplier>
+            <author>Example Super Heros</author>
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0-with-classpath-exception</expression>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="documentation">
+                    <url>http://example.org/docs</url>
+                    <comment>All component versions are documented here</comment>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.org/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+        <component type="framework">
+            <author>Example Super Heros</author>
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Some random license</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-component-hashes-1.4.json b/tests/_data/schemaTestData/1.4/valid-component-hashes-1.4.json
new file mode 100644
index 000000000..af90bd1f1
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-component-hashes-1.4.json
@@ -0,0 +1,63 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-example",
+      "version": "1.0.0",
+      "hashes": [
+        {
+          "alg": "MD5",
+          "content": "641b6e166f8b33c5e959e2adcc18b1c7"
+        },
+        {
+          "alg": "SHA-1",
+          "content": "9188560f22e0b73070d2efce670c74af2bdf30af"
+        },
+        {
+          "alg": "SHA-256",
+          "content": "d88bc4e70bfb34d18b5542136639acbb26a8ae2429aa1e47489332fb389cc964"
+        },
+        {
+          "alg": "SHA-384",
+          "content": "d4835048a0f57c74b8fb617d5366ab81376fc92bebe9a93bf24ba7f9da6c9aeeb6179f5d1361f6533211b15f3224cbad"
+        },
+        {
+          "alg": "SHA-512",
+          "content": "74a51ff45e4c11df9ba1f0094282c80489649cb157a75fa337992d2d4592a5a1b8cb4525de8db0ae25233553924d76c36e093ea7fa9df4e5b8b07fd2e074efd6"
+        },
+        {
+          "alg": "SHA3-256",
+          "content": "7478c7cf41c883a04ee89f1813f687886d53fa86f791fff90690c6221e3853aa"
+        },
+        {
+          "alg": "SHA3-384",
+          "content": "a1eea7229716487ad2ebe96b2f997a8408f32f14047994fbcc99b49012cf86c96dbd518e5d57a61b0e57dd37dd0b48f5"
+        },
+        {
+          "alg": "SHA3-512",
+          "content": "7d584825bc1767dfabe7e82b45ccb7a1119b145fa17e76b885e71429c706cef0a3171bc6575b968eec5da56a7966c02fec5402fcee55097ac01d40c550de9d20"
+        },
+        {
+          "alg": "BLAKE2b-256",
+          "content": "d8779633380c050bccf4e733b763ab2abd8ad2db60b517d47fd29bbf76433237"
+        },
+        {
+          "alg": "BLAKE2b-384",
+          "content": "e728ba56c2da995a559a178116c594e8bee4894a79ceb4399d8f479e5563cb1942b85936f646d14170717c576b14db7a"
+        },
+        {
+          "alg": "BLAKE2b-512",
+          "content": "f8ce8d612a6c85c96cf7cebc230f6ddef26e6cedcfbc4a41c766033cc08c6ba097d1470948226807fb2d88d2a2b6fc0ff5e5440e93a603086fdd568bafcd1a9d"
+        },
+        {
+          "alg": "BLAKE3",
+          "content": "26cdc7fb3fd65fc3b621a4ef70bc7d2489d5c19e70c76cf7ec20e538df0047cf"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-component-hashes-1.4.xml b/tests/_data/schemaTestData/1.4/valid-component-hashes-1.4.xml
new file mode 100644
index 000000000..5def2ebd7
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-component-hashes-1.4.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library">
+            <name>acme-example</name>
+            <version>1.0.0</version>
+            <hashes>
+                <hash alg="MD5">641b6e166f8b33c5e959e2adcc18b1c7</hash>
+                <hash alg="SHA-1">9188560f22e0b73070d2efce670c74af2bdf30af</hash>
+                <hash alg="SHA-256">d88bc4e70bfb34d18b5542136639acbb26a8ae2429aa1e47489332fb389cc964</hash>
+                <hash alg="SHA-384">d4835048a0f57c74b8fb617d5366ab81376fc92bebe9a93bf24ba7f9da6c9aeeb6179f5d1361f6533211b15f3224cbad</hash>
+                <hash alg="SHA-512">74a51ff45e4c11df9ba1f0094282c80489649cb157a75fa337992d2d4592a5a1b8cb4525de8db0ae25233553924d76c36e093ea7fa9df4e5b8b07fd2e074efd6</hash>
+                <hash alg="SHA3-256">7478c7cf41c883a04ee89f1813f687886d53fa86f791fff90690c6221e3853aa</hash>
+                <hash alg="SHA3-384">a1eea7229716487ad2ebe96b2f997a8408f32f14047994fbcc99b49012cf86c96dbd518e5d57a61b0e57dd37dd0b48f5</hash>
+                <hash alg="SHA3-512">7d584825bc1767dfabe7e82b45ccb7a1119b145fa17e76b885e71429c706cef0a3171bc6575b968eec5da56a7966c02fec5402fcee55097ac01d40c550de9d20</hash>
+                <hash alg="BLAKE2b-256">d8779633380c050bccf4e733b763ab2abd8ad2db60b517d47fd29bbf76433237</hash>
+                <hash alg="BLAKE2b-384">e728ba56c2da995a559a178116c594e8bee4894a79ceb4399d8f479e5563cb1942b85936f646d14170717c576b14db7a</hash>
+                <hash alg="BLAKE2b-512">f8ce8d612a6c85c96cf7cebc230f6ddef26e6cedcfbc4a41c766033cc08c6ba097d1470948226807fb2d88d2a2b6fc0ff5e5440e93a603086fdd568bafcd1a9d</hash>
+                <hash alg="BLAKE3">26cdc7fb3fd65fc3b621a4ef70bc7d2489d5c19e70c76cf7ec20e538df0047cf</hash>
+            </hashes>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-component-ref-1.4.json b/tests/_data/schemaTestData/1.4/valid-component-ref-1.4.json
new file mode 100644
index 000000000..f21c7fb7a
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-component-ref-1.4.json
@@ -0,0 +1,20 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "bom-ref": "123",
+      "name": "acme-library",
+      "version": "1.0.0"
+    },
+    {
+      "type": "library",
+      "bom-ref": "456",
+      "name": "acme-library",
+      "version": "1.0.0"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-component-ref-1.4.xml b/tests/_data/schemaTestData/1.4/valid-component-ref-1.4.xml
new file mode 100644
index 000000000..9c66ef416
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-component-ref-1.4.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library" bom-ref="123">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <components>
+                <component type="library" bom-ref="456">
+                    <name>acme-library</name>
+                    <version>1.0.0</version>
+                </component>
+            </components>
+        </component>
+        <component type="library" bom-ref="789">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-component-swid-1.4.json b/tests/_data/schemaTestData/1.4/valid-component-swid-1.4.json
new file mode 100644
index 000000000..fd037a2f6
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-component-swid-1.4.json
@@ -0,0 +1,19 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "application",
+      "author": "Acme Super Heros",
+      "name": "Acme Application",
+      "version": "9.1.1",
+      "swid": {
+        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
+        "name": "Acme Application",
+        "version": "9.1.1"
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-component-swid-1.4.xml b/tests/_data/schemaTestData/1.4/valid-component-swid-1.4.xml
new file mode 100644
index 000000000..f651bab27
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-component-swid-1.4.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="application">
+            <author>Acme Super Heros</author>
+            <name>Acme Application</name>
+            <version>9.1.1</version>
+            <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Acme Application" version="9.1.1" />
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-component-swid-full-1.4.json b/tests/_data/schemaTestData/1.4/valid-component-swid-full-1.4.json
new file mode 100644
index 000000000..fe6de2378
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-component-swid-full-1.4.json
@@ -0,0 +1,24 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "application",
+      "author": "Acme Super Heros",
+      "name": "Acme Application",
+      "version": "9.1.1",
+      "swid": {
+        "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1",
+        "name": "Acme Application",
+        "version": "9.1.1",
+        "text": {
+          "contentType": "text/xml",
+          "encoding": "base64",
+          "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg=="
+        }
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-component-swid-full-1.4.xml b/tests/_data/schemaTestData/1.4/valid-component-swid-full-1.4.xml
new file mode 100644
index 000000000..e0d968ddc
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-component-swid-full-1.4.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="application">
+            <author>Acme Super Heros</author>
+            <name>Acme Application</name>
+            <version>9.1.1</version>
+            <swid tagId="swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" name="Acme Application" version="9.1.1">
+                <text content-type="text/xml" encoding="base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==</text>
+            </swid>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-component-types-1.4.json b/tests/_data/schemaTestData/1.4/valid-component-types-1.4.json
new file mode 100644
index 000000000..dfcc9bcd3
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-component-types-1.4.json
@@ -0,0 +1,48 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "application",
+      "name": "application-a",
+      "version": "1.0"
+    },
+    {
+      "type": "library",
+      "name": "library-a",
+      "version": "1.0"
+    },
+    {
+      "type": "framework",
+      "name": "framework-a",
+      "version": "1.0"
+    },
+    {
+      "type": "container",
+      "name": "container-a",
+      "version": "1.0"
+    },
+    {
+      "type": "operating-system",
+      "name": "operating-system-a",
+      "version": "1.0"
+    },
+    {
+      "type": "firmware",
+      "name": "firmware-a",
+      "version": "1.0"
+    },
+    {
+      "type": "device",
+      "name": "device-a",
+      "version": "1.0"
+    },
+    {
+      "type": "file",
+      "name": "file-a",
+      "version": "1.0"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-component-types-1.4.xml b/tests/_data/schemaTestData/1.4/valid-component-types-1.4.xml
new file mode 100644
index 000000000..2c41ad6ec
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-component-types-1.4.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="application">
+            <name>application-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="library">
+            <name>library-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="framework">
+            <name>framework-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="container">
+            <name>container-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="operating-system">
+            <name>operating-system-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="firmware">
+            <name>firmware-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="device">
+            <name>device-a</name>
+            <version>1.0</version>
+        </component>
+        <component type="file">
+            <name>file-a</name>
+            <version>1.0</version>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-compositions-1.4.json b/tests/_data/schemaTestData/1.4/valid-compositions-1.4.json
new file mode 100644
index 000000000..ed86e4901
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-compositions-1.4.json
@@ -0,0 +1,65 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "component": {
+      "bom-ref": "acme-application-1.0",
+      "type": "application",
+      "name": "Acme Application",
+      "version": "1.0"
+    }
+  },
+  "components": [
+    {
+      "bom-ref": "pkg:maven/partner/shaded-library@1.0",
+      "type": "library",
+      "name": "Partner Shaded Library",
+      "version": "1.0",
+      "purl": "pkg:maven/partner/shaded-library@1.0",
+      "components": [
+        {
+          "bom-ref": "pkg:maven/ossproject/library@2.0",
+          "type": "library",
+          "name": "Some Opensource Library",
+          "version": "2.0",
+          "purl": "pkg:maven/ossproject/library@2.0"
+        }
+      ]
+    },
+    {
+      "bom-ref": "pkg:maven/acme/library@3.0",
+      "type": "library",
+      "name": "Acme Library",
+      "version": "3.0",
+      "purl": "pkg:maven/acme/library@3.0"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "acme-application-1.0",
+      "dependsOn": [
+        "pkg:maven/partner/shaded-library@1.0",
+        "pkg:maven/acme/library@3.0"
+      ]
+    }
+  ],
+  "compositions": [
+    {
+      "aggregate": "complete",
+      "assemblies": [
+        "pkg:maven/partner/shaded-library@1.0"
+      ],
+      "dependencies": [
+        "acme-application-1.0"
+      ]
+    },
+    {
+      "aggregate": "unknown",
+      "assemblies": [
+        "pkg:maven/acme/library@3.0"
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-compositions-1.4.xml b/tests/_data/schemaTestData/1.4/valid-compositions-1.4.xml
new file mode 100644
index 000000000..ae0b0ef80
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-compositions-1.4.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <metadata>
+        <component type="application" bom-ref="acme-application-1.0">
+            <name>Acme Application</name>
+            <version>1.0</version>
+        </component>
+    </metadata>
+    <components>
+        <component type="library" bom-ref="pkg:maven/partner/shaded-library@1.0">
+            <name>Partner Shaded Library</name>
+            <version>1.0</version>
+            <purl>pkg:maven/partner/shaded-library@1.0</purl>
+            <components>
+                <component type="library" bom-ref="pkg:maven/ossproject/library@2.0">
+                    <name>Some Opensource Library</name>
+                    <version>2.0</version>
+                    <purl>pkg:maven/ossproject/library@2.0</purl>
+                </component>
+            </components>
+        </component>
+        <component type="library" bom-ref="pkg:maven/acme/library@3.0">
+            <name>Acme Library</name>
+            <version>2.0</version>
+            <purl>pkg:maven/acme/library@3.0</purl>
+        </component>
+    </components>
+    <dependencies>
+        <dependency ref="acme-application-1.0">
+            <dependency ref="pkg:maven/partner/shaded-library@1.0"/>
+            <dependency ref="pkg:maven/acme/library@3.0"/>
+        </dependency>
+    </dependencies>
+    <compositions>
+        <composition>
+            <aggregate>complete</aggregate>
+            <assemblies>
+                <assembly ref="pkg:maven/partner/shaded-library@1.0"/>
+            </assemblies>
+            <dependencies>
+                <dependency ref="acme-application-1.0"/>
+            </dependencies>
+        </composition>
+        <composition>
+            <aggregate>unknown</aggregate>
+            <assemblies>
+                <assembly ref="pkg:maven/acme/library@3.0"/>
+            </assemblies>
+        </composition>
+    </compositions>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-dependency-1.4.json b/tests/_data/schemaTestData/1.4/valid-dependency-1.4.json
new file mode 100644
index 000000000..b15c6b92e
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-dependency-1.4.json
@@ -0,0 +1,38 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "bom-ref": "library-a",
+      "type": "library",
+      "name": "library-a",
+      "version": "1.0.0"
+    },
+    {
+      "bom-ref": "library-b",
+      "type": "library",
+      "name": "library-b",
+      "version": "1.0.0"
+    },
+    {
+      "bom-ref": "library-c",
+      "type": "library",
+      "name": "library-c",
+      "version": "1.0.0"
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "library-a",
+      "dependsOn": []
+    },
+    {
+      "ref": "library-b",
+      "dependsOn": [
+        "library-c"
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-dependency-1.4.xml b/tests/_data/schemaTestData/1.4/valid-dependency-1.4.xml
new file mode 100644
index 000000000..7e4bc15f7
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-dependency-1.4.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library" bom-ref="library-a">
+            <name>acme-library-a</name>
+            <version>1.0.0</version>
+        </component>
+        <component type="library" bom-ref="library-b">
+            <name>acme-library-b</name>
+            <version>1.0.0</version>
+        </component>
+        <component type="library" bom-ref="library-c">
+            <name>acme-library-b</name>
+            <version>1.0.0</version>
+        </component>
+    </components>
+    <dependencies>
+        <dependency ref="library-a"/>
+        <dependency ref="library-b">
+            <dependency ref="library-c"/>
+        </dependency>
+    </dependencies>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-empty-components-1.4.json b/tests/_data/schemaTestData/1.4/valid-empty-components-1.4.json
new file mode 100644
index 000000000..0cc93e13b
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-empty-components-1.4.json
@@ -0,0 +1,8 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-empty-components-1.4.xml b/tests/_data/schemaTestData/1.4/valid-empty-components-1.4.xml
new file mode 100644
index 000000000..5789e04cc
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-empty-components-1.4.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-evidence-1.4.json b/tests/_data/schemaTestData/1.4/valid-evidence-1.4.json
new file mode 100644
index 000000000..a588fdd29
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-evidence-1.4.json
@@ -0,0 +1,53 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "application",
+      "group": "com.google.code.findbugs",
+      "name": "findbugs-project",
+      "version": "3.0.0",
+      "licenses": [
+        {
+          "license": {
+            "id": "LGPL-3.0-or-later",
+            "url": "https://www.gnu.org/licenses/lgpl-3.0-standalone.html"
+          }
+        }
+      ],
+      "purl": "pkg:maven/com.google.code.findbugs/findbugs-project@3.0.0",
+      "evidence": {
+        "licenses": [
+          {
+            "license": {
+              "id": "Apache-2.0",
+              "url": "http://www.apache.org/licenses/LICENSE-2.0"
+            }
+          },
+          {
+            "license": {
+              "id": "LGPL-2.1-only",
+              "url": "https://opensource.org/licenses/LGPL-2.1"
+            }
+          }
+        ],
+        "copyright": [
+          {
+            "text": "Copyright 2012 Google Inc. All Rights Reserved."
+          },
+          {
+            "text": "Copyright (C) 2004,2005 Dave Brosius <dbrosius@users.sourceforge.net>"
+          },
+          {
+            "text": "Copyright (C) 2005 William Pugh"
+          },
+          {
+            "text": "Copyright (C) 2004,2005 University of Maryland"
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-evidence-1.4.xml b/tests/_data/schemaTestData/1.4/valid-evidence-1.4.xml
new file mode 100644
index 000000000..3e03c8c30
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-evidence-1.4.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="application">
+            <group>com.google.code.findbugs</group>
+            <name>findbugs-project</name>
+            <version>3.0.0</version>
+            <licenses>
+                <license>
+                    <id>LGPL-3.0-or-later</id>
+                    <url>https://www.gnu.org/licenses/lgpl-3.0-standalone.html</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.google.code.findbugs/findbugs-project@3.0.0</purl>
+            <evidence>
+                <licenses>
+                    <license>
+                        <id>Apache-2.0</id>
+                        <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+                    </license>
+                    <license>
+                        <id>LGPL-2.1-only</id>
+                        <url>https://opensource.org/licenses/LGPL-2.1</url>
+                    </license>
+                </licenses>
+                <copyright>
+                    <text><![CDATA[Copyright 2012 Google Inc. All Rights Reserved.]]></text>
+                    <text><![CDATA[Copyright (C) 2004,2005 Dave Brosius <dbrosius@users.sourceforge.net>]]></text>
+                    <text><![CDATA[Copyright (C) 2005 William Pugh]]></text>
+                    <text><![CDATA[Copyright (C) 2004,2005 University of Maryland]]></text>
+                </copyright>
+            </evidence>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-external-elements-1.4.xml b/tests/_data/schemaTestData/1.4/valid-external-elements-1.4.xml
new file mode 100644
index 000000000..25c7e5b75
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-external-elements-1.4.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                                <foo:fruit xmlns:foo="foo">
+                                    <foo:name>Banana</foo:name>
+                                </foo:fruit>
+                                <foo:fruit xmlns:foo="foo">
+                                    <foo:name>Banana</foo:name>
+                                </foo:fruit>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                        <foo:fruit xmlns:foo="foo">
+                            <foo:name>Banana</foo:name>
+                        </foo:fruit>
+                        <foo:fruit xmlns:foo="foo">
+                            <foo:name>Banana</foo:name>
+                        </foo:fruit>
+                    </component>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </ancestors>
+                <descendants>
+                    <component type="library">
+                        <name>foo</name>
+                        <version>1.0</version>
+                    </component>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </descendants>
+                <variants>
+                    <component type="library">
+                        <name>bar</name>
+                        <version>1.0</version>
+                    </component>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </variants>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                            <foo:fruit xmlns:foo="foo">
+                                <foo:name>Banana</foo:name>
+                            </foo:fruit>
+                            <foo:fruit xmlns:foo="foo">
+                                <foo:name>Banana</foo:name>
+                            </foo:fruit>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                            <foo:fruit xmlns:foo="foo">
+                                <foo:name>Banana</foo:name>
+                            </foo:fruit>
+                            <foo:fruit xmlns:foo="foo">
+                                <foo:name>Banana</foo:name>
+                            </foo:fruit>
+                        </committer>
+                        <message>Initial commit</message>
+                        <foo:fruit xmlns:foo="foo">
+                            <foo:name>Banana</foo:name>
+                        </foo:fruit>
+                        <foo:fruit xmlns:foo="foo">
+                            <foo:name>Banana</foo:name>
+                        </foo:fruit>
+                    </commit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                    <foo:fruit xmlns:foo="foo">
+                        <foo:name>Banana</foo:name>
+                    </foo:fruit>
+                </commits>
+                <notes>Commentary here</notes>
+                <foo:fruit xmlns:foo="foo">
+                    <foo:name>Banana</foo:name>
+                </foo:fruit>
+                <foo:fruit xmlns:foo="foo">
+                    <foo:name>Banana</foo:name>
+                </foo:fruit>
+            </pedigree>
+            <foo:fruit xmlns:foo="foo">
+                <foo:name>Banana</foo:name>
+            </foo:fruit>
+            <foo:fruit xmlns:foo="foo">
+                <foo:name>Banana</foo:name>
+            </foo:fruit>
+        </component>
+        <foo:fruit xmlns:foo="foo">
+            <foo:name>Banana</foo:name>
+        </foo:fruit>
+        <foo:fruit xmlns:foo="foo">
+            <foo:name>Banana</foo:name>
+        </foo:fruit>
+    </components>
+    <foo:fruit xmlns:foo="foo">
+        <foo:name>Banana</foo:name>
+    </foo:fruit>
+    <foo:fruit xmlns:foo="foo">
+        <foo:name>Banana</foo:name>
+    </foo:fruit>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-external-reference-1.4.json b/tests/_data/schemaTestData/1.4/valid-external-reference-1.4.json
new file mode 100644
index 000000000..088172ea1
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-external-reference-1.4.json
@@ -0,0 +1,38 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "org.example",
+      "name": "mylibrary",
+      "version": "1.0.0",
+      "externalReferences": [
+        {
+          "type": "advisories",
+          "url": "https://example.org/security/feed/csaf",
+          "comment": "Security advisories from the vendor"
+        },
+        {
+          "type": "bom",
+          "url": "https://example.org/support/sbom/portal-server/1.0.0",
+          "comment": "An external SBOM that describes what this component includes",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313"
+            }
+          ]
+        },
+        {
+          "type": "documentation",
+          "url": "https://example.org/support/documentation/portal-server/1.0.0",
+          "comment": "Vendor provided documentation for the product"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-external-reference-1.4.xml b/tests/_data/schemaTestData/1.4/valid-external-reference-1.4.xml
new file mode 100644
index 000000000..7e9ec93e9
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-external-reference-1.4.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <externalReferences>
+                <reference type="advisories">
+                    <url>https://example.org/security/feed/csaf</url>
+                    <comment>Security advisories from the vendor</comment>
+                </reference>
+                <reference type="bom">
+                    <url>https://example.org/support/sbom/portal-server/1.0.0</url>
+                    <comment>An external SBOM that describes what this component includes</comment>
+                    <hashes>
+                        <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                    </hashes>
+                </reference>
+                <reference type="documentation">
+                    <url>https://example.org/support/documentation/portal-server/1.0.0</url>
+                    <comment>Vendor provided documentation for the product</comment>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-license-expression-1.4.json b/tests/_data/schemaTestData/1.4/valid-license-expression-1.4.json
new file mode 100644
index 000000000..c101ebe99
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-license-expression-1.4.json
@@ -0,0 +1,20 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "licenses": [
+        {
+          "expression": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-license-expression-1.4.xml b/tests/_data/schemaTestData/1.4/valid-license-expression-1.4.xml
new file mode 100644
index 000000000..6e939d32d
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-license-expression-1.4.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-license-id-1.4.json b/tests/_data/schemaTestData/1.4/valid-license-id-1.4.json
new file mode 100644
index 000000000..1d0974852
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-license-id-1.4.json
@@ -0,0 +1,22 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "licenses": [
+        {
+          "license": {
+            "id": "Apache-2.0"
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-license-id-1.4.xml b/tests/_data/schemaTestData/1.4/valid-license-id-1.4.xml
new file mode 100644
index 000000000..e0b514f43
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-license-id-1.4.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-license-name-1.4.json b/tests/_data/schemaTestData/1.4/valid-license-name-1.4.json
new file mode 100644
index 000000000..03c884ca8
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-license-name-1.4.json
@@ -0,0 +1,22 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "tomcat-catalina",
+      "version": "9.0.14",
+      "licenses": [
+        {
+          "license": {
+            "name": "Apache License 2.0"
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-license-name-1.4.xml b/tests/_data/schemaTestData/1.4/valid-license-name-1.4.xml
new file mode 100644
index 000000000..7feade6b9
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-license-name-1.4.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Apache License 2.0</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-metadata-author-1.4.json b/tests/_data/schemaTestData/1.4/valid-metadata-author-1.4.json
new file mode 100644
index 000000000..febeed4fc
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-metadata-author-1.4.json
@@ -0,0 +1,16 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "authors": [
+      {
+        "name": "Samantha Wright",
+        "email": "samantha.wright@example.com",
+        "phone": "800-555-1212"
+      }
+    ]
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-metadata-author-1.4.xml b/tests/_data/schemaTestData/1.4/valid-metadata-author-1.4.xml
new file mode 100644
index 000000000..807fc5c64
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-metadata-author-1.4.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <metadata>
+        <authors>
+            <author>
+                <name>Samantha Wright</name>
+                <email>samantha.wright@example.com</email>
+                <phone>800-555-1212</phone>
+            </author>
+        </authors>
+    </metadata>
+    <components />
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-metadata-license-1.4.json b/tests/_data/schemaTestData/1.4/valid-metadata-license-1.4.json
new file mode 100644
index 000000000..10e75af0a
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-metadata-license-1.4.json
@@ -0,0 +1,16 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "licenses": [
+      {
+        "license": {
+          "id": "Apache-2.0"
+        }
+      }
+    ]
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-metadata-license-1.4.xml b/tests/_data/schemaTestData/1.4/valid-metadata-license-1.4.xml
new file mode 100644
index 000000000..295389f8d
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-metadata-license-1.4.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <metadata>
+        <licenses>
+            <license>
+                <id>Apache-2.0</id>
+            </license>
+        </licenses>
+    </metadata>
+    <components />
+</bom>
\ No newline at end of file
diff --git a/tests/_data/schemaTestData/1.4/valid-metadata-manufacture-1.4.json b/tests/_data/schemaTestData/1.4/valid-metadata-manufacture-1.4.json
new file mode 100644
index 000000000..68705c418
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-metadata-manufacture-1.4.json
@@ -0,0 +1,21 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "manufacture": {
+      "name": "Acme, Inc.",
+      "url": [
+        "https://example.com"
+      ],
+      "contact": [
+        {
+          "name": "Acme Professional Services",
+          "email": "professional.services@example.com"
+        }
+      ]
+    }
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-metadata-manufacture-1.4.xml b/tests/_data/schemaTestData/1.4/valid-metadata-manufacture-1.4.xml
new file mode 100644
index 000000000..36b70a5bb
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-metadata-manufacture-1.4.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <metadata>
+        <manufacture>
+            <name>Acme, Inc.</name>
+            <url>https://example.com</url>
+            <contact>
+                <name>Acme Professional Services</name>
+                <email>professional.services@example.com</email>
+            </contact>
+        </manufacture>
+    </metadata>
+    <components />
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-metadata-supplier-1.4.json b/tests/_data/schemaTestData/1.4/valid-metadata-supplier-1.4.json
new file mode 100644
index 000000000..33b1af255
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-metadata-supplier-1.4.json
@@ -0,0 +1,21 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "supplier": {
+      "name": "Acme, Inc.",
+      "url": [
+        "https://example.com"
+      ],
+      "contact": [
+        {
+          "name": "Acme Distribution",
+          "email": "distribution@example.com"
+        }
+      ]
+    }
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-metadata-supplier-1.4.xml b/tests/_data/schemaTestData/1.4/valid-metadata-supplier-1.4.xml
new file mode 100644
index 000000000..37a222daf
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-metadata-supplier-1.4.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <metadata>
+        <supplier>
+            <name>Acme, Inc.</name>
+            <url>https://example.com</url>
+            <contact>
+                <name>Acme Distribution</name>
+                <email>distribution@example.com</email>
+            </contact>
+        </supplier>
+    </metadata>
+    <components />
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-metadata-timestamp-1.4.json b/tests/_data/schemaTestData/1.4/valid-metadata-timestamp-1.4.json
new file mode 100644
index 000000000..26ab14ad6
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-metadata-timestamp-1.4.json
@@ -0,0 +1,10 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "timestamp": "2020-04-13T20:20:39+00:00"
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-metadata-timestamp-1.4.xml b/tests/_data/schemaTestData/1.4/valid-metadata-timestamp-1.4.xml
new file mode 100644
index 000000000..06adc1b0b
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-metadata-timestamp-1.4.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <metadata>
+        <timestamp>2020-04-07T07:01:00Z</timestamp>
+    </metadata>
+    <components />
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-metadata-tool-1.4.json b/tests/_data/schemaTestData/1.4/valid-metadata-tool-1.4.json
new file mode 100644
index 000000000..19175ee01
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-metadata-tool-1.4.json
@@ -0,0 +1,26 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "tools": [
+      {
+        "vendor": "Awesome Vendor",
+        "name": "Awesome Tool",
+        "version": "9.1.2",
+        "hashes": [
+          {
+            "alg": "SHA-1",
+            "content": "25ed8e31b995bb927966616df2a42b979a2717f0"
+          },
+          {
+            "alg": "SHA-256",
+            "content": "a74f733635a19aefb1f73e5947cef59cd7440c6952ef0f03d09d974274cbd6df"
+          }
+        ]
+      }
+    ]
+  },
+  "components": []
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-metadata-tool-1.4.xml b/tests/_data/schemaTestData/1.4/valid-metadata-tool-1.4.xml
new file mode 100644
index 000000000..ead4ea0dd
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-metadata-tool-1.4.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <metadata>
+        <tools>
+            <tool>
+                <vendor>Awesome Vendor</vendor>
+                <name>Awesome Tool</name>
+                <version>9.1.2</version>
+                <hashes>
+                    <hash alg="SHA-1">25ed8e31b995bb927966616df2a42b979a2717f0</hash>
+                    <hash alg="SHA-256">a74f733635a19aefb1f73e5947cef59cd7440c6952ef0f03d09d974274cbd6df</hash>
+                </hashes>
+            </tool>
+        </tools>
+    </metadata>
+    <components />
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-minimal-viable-1.4.json b/tests/_data/schemaTestData/1.4/valid-minimal-viable-1.4.json
new file mode 100644
index 000000000..c1029f0f6
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-minimal-viable-1.4.json
@@ -0,0 +1,12 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library"
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-minimal-viable-1.4.xml b/tests/_data/schemaTestData/1.4/valid-minimal-viable-1.4.xml
new file mode 100644
index 000000000..92ac5cc7d
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-minimal-viable-1.4.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-patch-1.4.json b/tests/_data/schemaTestData/1.4/valid-patch-1.4.json
new file mode 100644
index 000000000..66db19aa5
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-patch-1.4.json
@@ -0,0 +1,88 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "group": "com.acme",
+      "name": "sample-library",
+      "version": "1.0.0",
+      "pedigree": {
+        "ancestors": [
+          {
+            "type": "library",
+            "group": "org.example",
+            "name": "sample-library",
+            "version": "1.0.0"
+          }
+        ],
+        "patches": [
+          {
+            "type": "unofficial",
+            "diff": {
+              "text": {
+                "contentType": "text/plain",
+                "encoding": "base64",
+                "content": "blah"
+              },
+              "url": "uri/to/changes.diff"
+            },
+            "resolves": [
+              {
+                "type": "enhancement",
+                "id": "JIRA-17240",
+                "description": "Great new feature that does something",
+                "source": {
+                  "name": "Acme Org",
+                  "url": "https://issues.acme.org/17240"
+                }
+              }
+            ]
+          },
+          {
+            "type": "backport",
+            "diff": {
+              "text": {
+                "contentType": "text/plain",
+                "encoding": "base64",
+                "content": "blah"
+              },
+              "url": "uri/to/changes.diff"
+            },
+            "resolves": [
+              {
+                "type": "security",
+                "id": "CVE-2019-9997",
+                "name": "CVE-2019-9997",
+                "description": "blah blah",
+                "source": {
+                  "name": "NVD",
+                  "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-9997"
+                },
+                "references": [
+                  "http://some/other/site-1",
+                  "http://some/other/site-2"
+                ]
+              },
+              {
+                "type": "defect",
+                "id": "JIRA-874319",
+                "description": "Enable to do something",
+                "source": {
+                  "name": "Example Org",
+                  "url": "https://issues.example.org/874319"
+                },
+                "references": [
+                  "http://some/other/site-1",
+                  "http://some/other/site-2"
+                ]
+              }
+            ]
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-patch-1.4.xml b/tests/_data/schemaTestData/1.4/valid-patch-1.4.xml
new file mode 100644
index 000000000..7c0a3d77d
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-patch-1.4.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library">
+            <group>com.acme</group>
+            <name>sample-library</name>
+            <version>1.0.0</version>
+            <pedigree>
+                <ancestors>
+                    <component type="library">
+                        <group>org.example</group>
+                        <name>sample-library</name>
+                        <version>1.0.0</version>
+                    </component>
+                </ancestors>
+                <patches>
+                    <patch type="unofficial">
+                        <diff>
+                            <text content-type="text/plain" encoding="base64">blah</text>
+                            <url>uri/to/changes.diff</url>
+                        </diff>
+                        <resolves>
+                            <issue type="enhancement">
+                                <id>JIRA-17240</id>
+                                <description>Great new feature that does something</description>
+                                <source>
+                                    <name>Acme Org</name>
+                                    <url>https://issues.acme.org/17240</url>
+                                </source>
+                            </issue>
+                        </resolves>
+                    </patch>
+                    <patch type="backport">
+                        <diff>
+                            <text content-type="text/plain" encoding="base64">blah</text>
+                            <url>uri/to/changes.diff</url>
+                        </diff>
+                        <resolves>
+                            <issue type="security">
+                                <id>CVE-2019-9997</id>
+                                <name>CVE-2019-9997</name>
+                                <description>blah blah</description>
+                                <source>
+                                    <name>NVD</name>
+                                    <url>https://nvd.nist.gov/vuln/detail/CVE-2019-9997</url>
+                                </source>
+                                <references>
+                                    <url>http://some/other/site-1</url>
+                                    <url>http://some/other/site-2</url>
+                                </references>
+                            </issue>
+                            <issue type="defect">
+                                <id>JIRA-874319</id>
+                                <description>Enable to do something</description>
+                                <source>
+                                    <name>Example Org</name>
+                                    <url>https://issues.example.org/874319</url>
+                                </source>
+                                <references>
+                                    <url>http://some/other/site-1</url>
+                                    <url>http://some/other/site-2</url>
+                                </references>
+                            </issue>
+                        </resolves>
+                    </patch>
+                </patches>
+            </pedigree>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-properties-1.4.json b/tests/_data/schemaTestData/1.4/valid-properties-1.4.json
new file mode 100644
index 000000000..bdf67f7ee
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-properties-1.4.json
@@ -0,0 +1,55 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "metadata": {
+    "properties": [
+      {
+        "name": "Foo",
+        "value": "Bar"
+      },
+      {
+        "name": "Foo",
+        "value": "You"
+      },
+      {
+        "name": "Foo",
+        "value": "Two"
+      },
+      {
+        "name": "Bar",
+        "value": "Foo"
+      }
+    ]
+  },
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-library",
+      "version": "1.0.0",
+      "properties": [
+        {
+          "name": "Foo",
+          "value": "Bar"
+        }
+      ]
+    }
+  ],
+  "services": [
+    {
+      "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8",
+      "group": "org.partner",
+      "name": "Stock ticker service",
+      "endpoints": [
+        "https://partner.org/api/v1/stock"
+      ],
+      "properties": [
+        {
+          "name": "Foo",
+          "value": "Bar"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-properties-1.4.xml b/tests/_data/schemaTestData/1.4/valid-properties-1.4.xml
new file mode 100644
index 000000000..38d41faf2
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-properties-1.4.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <metadata>
+        <properties>
+            <property name="Foo">Bar</property>
+            <property name="Foo">You</property>
+            <property name="Foo">Two</property>
+            <property name="Bar">Foo</property>
+        </properties>
+    </metadata>
+    <components>
+        <component type="library">
+            <name>acme-library</name>
+            <version>1.0.0</version>
+            <properties>
+                <property name="Foo">Bar</property>
+                <property name="Bar">Foo</property>
+            </properties>
+        </component>
+    </components>
+    <services>
+        <service bom-ref="b2a46a4b-8367-4bae-9820-95557cfe03a8">
+            <group>org.partner</group>
+            <name>Stock ticker service</name>
+            <endpoints>
+                <endpoint>https://partner.org/api/v1/stock</endpoint>
+            </endpoints>
+            <properties>
+                <property name="Foo">Bar</property>
+                <property name="Bar">Foo</property>
+            </properties>
+        </service>
+    </services>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-random-attributes-1.4.xml b/tests/_data/schemaTestData/1.4/valid-random-attributes-1.4.xml
new file mode 100644
index 000000000..428692adb
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-random-attributes-1.4.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<bom foo="bar" bar="foo" serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components foo="bar" bar="foo" >
+        <component foo="bar" bar="foo"  type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <description>Modified version of Apache Catalina</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/plain" encoding="base64">CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=</text>
+                    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors foo="bar" bar="foo">
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <description>Apache Catalina</description>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>john.doe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>Jane Doe</name>
+                            <email>jane.doe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+                <notes>Commentary here</notes>
+            </pedigree>
+        </component>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <expression>EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0</expression>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="documentation">
+                    <url>http://example.org/docs</url>
+                    <comment>All component versions are documented here</comment>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.org/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+        <component type="framework">
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <name>Some random license</name>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-release-notes-1.4.json b/tests/_data/schemaTestData/1.4/valid-release-notes-1.4.json
new file mode 100644
index 000000000..bd45f9407
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-release-notes-1.4.json
@@ -0,0 +1,194 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "type": "library",
+      "name": "acme-example",
+      "version": "1.0.0",
+      "releaseNotes": {
+        "type": "major",
+        "title": "My new release",
+        "featuredImage": "https://example.com/featured_image.png",
+        "socialImage": "https://example.com/social_image.png",
+        "description": "The main description of your release",
+        "timestamp": "2021-09-17T00:51:18+00:00",
+        "aliases": [
+          "Project Orion"
+        ],
+        "tags": [
+          "CMS",
+          "SEO",
+          "wysiwyg"
+        ],
+        "resolves": [
+          {
+            "type": "enhancement",
+            "id": "JIRA-17240",
+            "description": "Great new feature that does something",
+            "source": {
+              "name": "Acme Org",
+              "url": "https://issues.example.com/17240"
+            }
+          },
+          {
+            "type": "security",
+            "id": "CVE-2019-9997",
+            "name": "CVE-2019-9997",
+            "description": "Great new feature that does something",
+            "source": {
+              "name": "NVD",
+              "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-9997"
+            },
+            "references": [
+              "http://some/other/site-1",
+              "http://some/other/site-2"
+            ]
+          }
+        ],
+        "notes": [
+          {
+            "locale": "en-US",
+            "text":  {
+              "contentType": "text/html",
+              "encoding": "base64",
+              "content": "PGgxPk15IG5ldyByZWxlYXNlPGgxPgo8cD5SZWxlYXNlIG5vdGVzIGhlcmU8L3A+"
+            }
+          },
+          {
+            "locale": "es",
+            "text":  {
+              "contentType": "text/html",
+              "encoding": "base64",
+              "content": "PGgxPk15IG5ldyByZWxlYXNlPGgxPgo8cD5Ob3RhcyBkZSBsYSB2ZXJzacOzbiBhcXXDrTwvcD4="
+            }
+          }
+        ]
+      }
+    }
+  ],
+  "services": [
+    {
+      "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8",
+      "provider": {
+        "name": "Partner Org",
+        "url": [
+          "https://partner.org"
+        ],
+        "contact": [
+          {
+            "name": "Support",
+            "email": "support@partner.org",
+            "phone": "800-555-1212"
+          }
+        ]
+      },
+      "group": "org.partner",
+      "name": "Stock ticker service",
+      "version": "2020-Q2",
+      "description": "Provides real-time stock information",
+      "endpoints": [
+        "https://partner.org/api/v1/lookup",
+        "https://partner.org/api/v1/stock"
+      ],
+      "authenticated": true,
+      "x-trust-boundary": true,
+      "data": [
+        {
+          "classification": "PII",
+          "flow": "inbound"
+        },
+        {
+          "classification": "PIFI",
+          "flow": "outbound"
+        },
+        {
+          "classification": "pubic",
+          "flow": "bi-directional"
+        },
+        {
+          "classification": "partner-data",
+          "flow": "unknown"
+        }
+      ],
+      "licenses": [
+        {
+          "license": {
+            "name": "Partner license"
+          }
+        }
+      ],
+      "externalReferences": [
+        {
+          "type": "website",
+          "url": "http://partner.org"
+        },
+        {
+          "type": "documentation",
+          "url": "http://api.partner.org/swagger"
+        }
+      ],
+      "releaseNotes": {
+        "type": "major",
+        "title": "My new release",
+        "featuredImage": "https://example.com/featured_image.png",
+        "socialImage": "https://example.com/social_image.png",
+        "description": "The main description of your release",
+        "timestamp": "2021-09-17T00:51:18+00:00",
+        "aliases": [
+          "Project Orion"
+        ],
+        "tags": [
+          "CMS",
+          "SEO",
+          "wysiwyg"
+        ],
+        "resolves": [
+          {
+            "type": "enhancement",
+            "id": "JIRA-17240",
+            "description": "Great new feature that does something",
+            "source": {
+              "name": "Acme Org",
+              "url": "https://issues.example.com/17240"
+            }
+          },
+          {
+            "type": "security",
+            "id": "CVE-2019-9997",
+            "name": "CVE-2019-9997",
+            "description": "Great new feature that does something",
+            "source": {
+              "name": "NVD",
+              "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-9997"
+            },
+            "references": [
+              "http://some/other/site-1",
+              "http://some/other/site-2"
+            ]
+          }
+        ],
+        "notes": [
+          {
+            "locale": "en-US",
+            "text":  {
+              "contentType": "text/html",
+              "encoding": "base64",
+              "content": "PGgxPk15IG5ldyByZWxlYXNlPGgxPgo8cD5SZWxlYXNlIG5vdGVzIGhlcmU8L3A+"
+            }
+          },
+          {
+            "locale": "es",
+            "text":  {
+              "contentType": "text/html",
+              "encoding": "base64",
+              "content": "PGgxPk15IG5ldyByZWxlYXNlPGgxPgo8cD5Ob3RhcyBkZSBsYSB2ZXJzacOzbiBhcXXDrTwvcD4="
+            }
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-release-notes-1.4.xml b/tests/_data/schemaTestData/1.4/valid-release-notes-1.4.xml
new file mode 100644
index 000000000..7102926fe
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-release-notes-1.4.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library">
+            <name>acme-example</name>
+            <version>1.0.0</version>
+            <releaseNotes>
+                <type>major</type>
+                <title>My new release</title>
+                <featuredImage>https://example.com/featured_image.png</featuredImage>
+                <socialImage>https://example.com/social_image.png</socialImage>
+                <description>The main description of your release</description>
+                <timestamp>2021-09-17T00:51:18+00:00</timestamp>
+                <aliases>
+                    <alias>Project Orion</alias>
+                </aliases>
+                <tags>
+                    <tag>CMS</tag>
+                    <tag>SEO</tag>
+                    <tag>wysiwyg</tag>
+                </tags>
+                <resolves>
+                    <issue type="enhancement">
+                        <id>JIRA-17240</id>
+                        <description>Great new feature that does something</description>
+                        <source>
+                            <name>Acme Org</name>
+                            <url>https://issues.example.com/17240</url>
+                        </source>
+                    </issue>
+                    <issue type="security">
+                        <id>CVE-2019-9997</id>
+                        <name>CVE-2019-9997</name>
+                        <description>A security issue was fixed that did something bad</description>
+                        <source>
+                            <name>NVD</name>
+                            <url>https://nvd.nist.gov/vuln/detail/CVE-2019-9997</url>
+                        </source>
+                        <references>
+                            <url>http://some/other/site-1</url>
+                            <url>http://some/other/site-2</url>
+                        </references>
+                    </issue>
+                </resolves>
+                <notes>
+                    <note>
+                        <locale>en-US</locale>
+                        <text content-type="text/html" encoding="base64">PGgxPk15IG5ldyByZWxlYXNlPGgxPgo8cD5SZWxlYXNlIG5vdGVzIGhlcmU8L3A+</text>
+                    </note>
+                    <note>
+                        <locale>es</locale>
+                        <text content-type="text/html" encoding="base64">PGgxPk15IG5ldyByZWxlYXNlPGgxPgo8cD5Ob3RhcyBkZSBsYSB2ZXJzacOzbiBhcXXDrTwvcD4=</text>
+                    </note>
+                </notes>
+            </releaseNotes>
+        </component>
+    </components>
+    <services>
+        <service bom-ref="b2a46a4b-8367-4bae-9820-95557cfe03a8">
+            <provider>
+                <name>Partner Org</name>
+                <url>https://partner.org</url>
+                <contact>
+                    <name>Support</name>
+                    <email>support@partner</email>
+                    <phone>800-555-1212</phone>
+                </contact>
+            </provider>
+            <group>org.partner</group>
+            <name>Stock ticker service</name>
+            <version>2020-Q2</version>
+            <description>Provides real-time stock information</description>
+            <endpoints>
+                <endpoint>https://partner.org/api/v1/lookup</endpoint>
+                <endpoint>https://partner.org/api/v1/stock</endpoint>
+            </endpoints>
+            <authenticated>true</authenticated>
+            <x-trust-boundary>true</x-trust-boundary>
+            <data>
+                <classification flow="inbound">PII</classification>
+                <classification flow="outbound">PIFI</classification>
+                <classification flow="bi-directional">pubic</classification>
+                <classification flow="unknown">partner-data</classification>
+            </data>
+            <licenses>
+                <license>
+                    <name>Partner license</name>
+                </license>
+            </licenses>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://partner.org</url>
+                </reference>
+                <reference type="documentation">
+                    <url>http://api.partner.org/swagger</url>
+                </reference>
+            </externalReferences>
+            <releaseNotes>
+                <type>major</type>
+                <title>My new release</title>
+                <featuredImage>https://example.com/featured_image.png</featuredImage>
+                <socialImage>https://example.com/social_image.png</socialImage>
+                <description>The main description of your release</description>
+                <timestamp>2021-09-17T00:51:18+00:00</timestamp>
+                <aliases>
+                    <alias>Project Orion</alias>
+                </aliases>
+                <tags>
+                    <tag>CMS</tag>
+                    <tag>SEO</tag>
+                    <tag>wysiwyg</tag>
+                </tags>
+                <resolves>
+                    <issue type="enhancement">
+                        <id>JIRA-17240</id>
+                        <description>Great new feature that does something</description>
+                        <source>
+                            <name>Acme Org</name>
+                            <url>https://issues.example.com/17240</url>
+                        </source>
+                    </issue>
+                    <issue type="security">
+                        <id>CVE-2019-9997</id>
+                        <name>CVE-2019-9997</name>
+                        <description>A security issue was fixed that did something bad</description>
+                        <source>
+                            <name>NVD</name>
+                            <url>https://nvd.nist.gov/vuln/detail/CVE-2019-9997</url>
+                        </source>
+                        <references>
+                            <url>http://some/other/site-1</url>
+                            <url>http://some/other/site-2</url>
+                        </references>
+                    </issue>
+                </resolves>
+                <notes>
+                    <note>
+                        <locale>en-US</locale>
+                        <text content-type="text/html" encoding="base64">PGgxPk15IG5ldyByZWxlYXNlPGgxPgo8cD5SZWxlYXNlIG5vdGVzIGhlcmU8L3A+</text>
+                    </note>
+                    <note>
+                        <locale>es</locale>
+                        <text content-type="text/html" encoding="base64">PGgxPk15IG5ldyByZWxlYXNlPGgxPgo8cD5Ob3RhcyBkZSBsYSB2ZXJzacOzbiBhcXXDrTwvcD4=</text>
+                    </note>
+                </notes>
+            </releaseNotes>
+        </service>
+    </services>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-service-1.4.json b/tests/_data/schemaTestData/1.4/valid-service-1.4.json
new file mode 100644
index 000000000..2b23fce28
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-service-1.4.json
@@ -0,0 +1,101 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "bom-ref": "pkg:maven/com.acme/stock-java-client@1.0.12",
+      "type": "library",
+      "publisher": "Acme Inc",
+      "group": "com.acme",
+      "name": "stock-java-client",
+      "version": "1.0.12",
+      "hashes": [
+        {
+          "alg": "SHA-1",
+          "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a"
+        }
+      ],
+      "licenses": [
+        {
+          "license": {
+            "id": "Apache-2.0"
+          }
+        }
+      ],
+      "purl": "pkg:maven/com.acme/stock-java-client@1.0.12"
+    }
+  ],
+  "services": [
+    {
+      "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8",
+      "provider": {
+        "name": "Partner Org",
+        "url": [
+          "https://partner.org"
+        ],
+        "contact": [
+          {
+            "name": "Support",
+            "email": "support@partner.org",
+            "phone": "800-555-1212"
+          }
+        ]
+      },
+      "group": "org.partner",
+      "name": "Stock ticker service",
+      "version": "2020-Q2",
+      "description": "Provides real-time stock information",
+      "endpoints": [
+        "https://partner.org/api/v1/lookup",
+        "https://partner.org/api/v1/stock"
+      ],
+      "authenticated": true,
+      "x-trust-boundary": true,
+      "data": [
+        {
+          "classification": "PII",
+          "flow": "inbound"
+        },
+        {
+          "classification": "PIFI",
+          "flow": "outbound"
+        },
+        {
+          "classification": "pubic",
+          "flow": "bi-directional"
+        },
+        {
+          "classification": "partner-data",
+          "flow": "unknown"
+        }
+      ],
+      "licenses": [
+        {
+          "license": {
+            "name": "Partner license"
+          }
+        }
+      ],
+      "externalReferences": [
+        {
+          "type": "website",
+          "url": "http://partner.org"
+        },
+        {
+          "type": "documentation",
+          "url": "http://api.partner.org/swagger"
+        }
+      ]
+    }
+  ],
+  "dependencies": [
+    {
+      "ref": "pkg:maven/com.acme/stock-java-client@1.0.12",
+      "dependsOn": [
+        "b2a46a4b-8367-4bae-9820-95557cfe03a8"
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-service-1.4.xml b/tests/_data/schemaTestData/1.4/valid-service-1.4.xml
new file mode 100644
index 000000000..c315ec045
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-service-1.4.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library" bom-ref="pkg:maven/com.acme/stock-java-client@1.0.12">
+            <group>com.acme</group>
+            <name>stock-java-client</name>
+            <version>1.0.12</version>
+            <hashes>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/stock-java-client@1.0.12</purl>
+        </component>
+    </components>
+    <services>
+        <service bom-ref="b2a46a4b-8367-4bae-9820-95557cfe03a8">
+            <provider>
+                <name>Partner Org</name>
+                <url>https://partner.org</url>
+                <contact>
+                    <name>Support</name>
+                    <email>support@partner</email>
+                    <phone>800-555-1212</phone>
+                </contact>
+            </provider>
+            <group>org.partner</group>
+            <name>Stock ticker service</name>
+            <version>2020-Q2</version>
+            <description>Provides real-time stock information</description>
+            <endpoints>
+                <endpoint>https://partner.org/api/v1/lookup</endpoint>
+                <endpoint>https://partner.org/api/v1/stock</endpoint>
+            </endpoints>
+            <authenticated>true</authenticated>
+            <x-trust-boundary>true</x-trust-boundary>
+            <data>
+                <classification flow="inbound">PII</classification>
+                <classification flow="outbound">PIFI</classification>
+                <classification flow="bi-directional">pubic</classification>
+                <classification flow="unknown">partner-data</classification>
+            </data>
+            <licenses>
+                <license>
+                    <name>Partner license</name>
+                </license>
+            </licenses>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://partner.org</url>
+                </reference>
+                <reference type="documentation">
+                    <url>http://api.partner.org/swagger</url>
+                </reference>
+            </externalReferences>
+        </service>
+    </services>
+    <dependencies>
+        <dependency ref="pkg:maven/com.acme/stock-java-client@1.0.12">
+            <dependency ref="b2a46a4b-8367-4bae-9820-95557cfe03a8"/>
+        </dependency>
+    </dependencies>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-service-empty-objects-1.4.json b/tests/_data/schemaTestData/1.4/valid-service-empty-objects-1.4.json
new file mode 100644
index 000000000..c54c1efe8
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-service-empty-objects-1.4.json
@@ -0,0 +1,22 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "services": [
+    {
+      "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8",
+      "provider": {
+        "contact": [
+        ]
+      },
+      "name": "Stock ticker service",
+      "endpoints": [
+      ],
+      "data": [
+      ],
+      "externalReferences": [
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-service-empty-objects-1.4.xml b/tests/_data/schemaTestData/1.4/valid-service-empty-objects-1.4.xml
new file mode 100644
index 000000000..4c97cfa81
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-service-empty-objects-1.4.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <services>
+        <service bom-ref="b2a46a4b-8367-4bae-9820-95557cfe03a8">
+            <provider>
+            </provider>
+            <name>Stock ticker service</name>
+            <endpoints>
+            </endpoints>
+            <data>
+            </data>
+            <licenses>
+            </licenses>
+        </service>
+    </services>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-signatures-1.4.json b/tests/_data/schemaTestData/1.4/valid-signatures-1.4.json
new file mode 100644
index 000000000..48dec3efe
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-signatures-1.4.json
@@ -0,0 +1,78 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "bom-ref": "5366293e-0740-4dcf-b1d0-0c1fc26e4981",
+      "type": "application",
+      "name": "amce app",
+      "version": "1.0",
+      "signature": {
+        "algorithm": "ES256",
+        "certificatePath": [
+          "MIIB-TCCAVigAwIBAgIGAWFcc4YkMAwGCCqGSM49BAMEBQAwLTELMAkGA1UEBhMCRVUxHjAcBgNVBAMTFVRydXN0IE5ldHdvcmsgU3ViIENBMzAeFw0xODAxMDEwMDAwMDBaFw0yMjEyMzEyMzU5NTlaMDIxCzAJBgNVBAYTAkZSMQ0wCwYDVQQFEwQ0NTAxMRQwEgYDVQQDEwtleGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHHp7A83DBJIInj8-g1we3A7sBXprIQBUfdFDVUBQoPExq8rze6ewG0-eVcSF72J77gKiD0IHnzpwHaU7t6nVeajXTBbMAkGA1UdEwQCMAAwDgYDVR0PAQH_BAQDAgP4MB0GA1UdDgQWBBQQyJ9rXSIskoUuA946von62LoxqzAfBgNVHSMEGDAWgBTUWrS54qC2NgG3UK6rVAr0gbQ0MTAMBggqhkjOPQQDBAUAA4GMADCBiAJCAaWoVQ0r6jFjhO5e0WJTgyMmA8BhpO1t7gXQ6xoKGso9jCOYf9OG9BFfZoVmdIyfYiwkhy1ld27tiOJ5X4m6WasRAkIBpEkUDf8irbSZ1V7zXALaR2mJTjKQV_5jRHsiBQWA-5DxEa-x_zJVRz8tpp-jjT2tSCU82bwUOBLu6te1YIDpWCA",
+          "MIIDsTCCAZmgAwIBAgIBAzANBgkqhkiG9w0BAQ0FADAuMQswCQYDVQQGEwJVUzEfMB0GA1UEAxMWVHJ1c3QgTmV0d29yayBSb290IENBMTAeFw0xNjA3MTAxMDAwMDBaFw0yNTA3MTAwOTU5NTlaMC0xCzAJBgNVBAYTAkVVMR4wHAYDVQQDExVUcnVzdCBOZXR3b3JrIFN1YiBDQTMwgZswEAYHKoZIzj0CAQYFK4EEACMDgYYABAGJzPZsjniwyZeXrgrlQM3Y13r3znR8FSQpKbC2bplrOWySQJPGm-GFObe5Dk4t3Jrtk_Pbs8-3VW_4q5drL0YqYwBYNJPhqjbSM6SGHrc6wNdPZRw_WnJVa0ELXKICC73lkjskWPfE-cLpZ3sTq1ovEmoNjgaySVRUH1wFDdkqyReJaKNjMGEwDwYDVR0TAQH_BAUwAwEB_zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNRatLnioLY2AbdQrqtUCvSBtDQxMB8GA1UdIwQYMBaAFEkmC1HDAh0fXehpiUhUGE868Hk2MA0GCSqGSIb3DQEBDQUAA4ICAQAs2KADYyGQCVy8tJZWakNtGdww4OumZpBuR66p_2xK7veRubQEhG-nJn7oVkJ4w5pEec3sYQEqtPbHyZcEKEYbOJ2cVf1nMH-DvFZ6ypQocGRp3WSWsTzL3SgqiWrQdPX1Y5dO6Hvx7p9ST9H2WgkxB-Q75Jov1gVF3bScAbxb7Mw7tf5z3Cvqmfo0Gatkgzz6-jDPrtUK7AAAOw3C0kHMbE3EnNarsfhBkUerE8QVmHIvz373mWt0SnguaHq0A9ZuSia_pF7bgfVRZi2ZzIzpu2O276sB2Yji9tcSn5l21jq63rXtvY_DLAi4kaLyf9sHT_tkH-gkTdkdkfQq8sA5ysRW21wPQbmjTIVwsfY4JjajVIUitjPbkUJqURpf2VD0JXdYQHS6KVPWqHWTlKPlsKbhw4ghuLqCMYda88L9rxWnSC5L8s0DJSuBBm-nq23NtHl5FbCzeXWcKRayIgimT-An1WIOeJP4F7-BctYLIooKoQzJZR1tOWvprUs22_xAivVBz7J_LmJyVlKesB2ic8qYdt7YVoCsWrnEUgoNoJPwLHeva8KPvd0gLXrwaMyTCCjeoemXFj6nCbbMHJeVffh6jYBAzlbcAEvTiZcdzrVVr54kOtWskyaeDnAcMXW4Of1vWdUJ2as5nyfletfTp4E6A9P2dZ5g7nMoL90yIw"
+        ],
+        "value": "tqITqIm0gUMWXIjqDgwqzqPw1CwTUKRewZQ5YpX3VwFMWV68NJgX4npU91cSwSC-MRlx1QfOYwSQkeU26VpXSg"
+      }
+    }
+  ],
+  "services": [
+    {
+      "bom-ref": "ee10d0a2-baba-4656-a5ac-d49e172a0d3d",
+      "group": "org.partner",
+      "name": "Stock ticker service",
+      "version": "2020-Q2",
+      "endpoints": [
+        "https://partner.org/api/v1/lookup",
+        "https://partner.org/api/v1/stock"
+      ],
+      "authenticated": true,
+      "x-trust-boundary": true,
+      "data": [
+        {
+          "classification": "PII",
+          "flow": "inbound"
+        }
+      ],
+      "signature": {
+        "algorithm": "ES256",
+        "certificatePath": [
+          "MIIB-TCCAVigAwIBAgIGAWFcc4YkMAwGCCqGSM49BAMEBQAwLTELMAkGA1UEBhMCRVUxHjAcBgNVBAMTFVRydXN0IE5ldHdvcmsgU3ViIENBMzAeFw0xODAxMDEwMDAwMDBaFw0yMjEyMzEyMzU5NTlaMDIxCzAJBgNVBAYTAkZSMQ0wCwYDVQQFEwQ0NTAxMRQwEgYDVQQDEwtleGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHHp7A83DBJIInj8-g1we3A7sBXprIQBUfdFDVUBQoPExq8rze6ewG0-eVcSF72J77gKiD0IHnzpwHaU7t6nVeajXTBbMAkGA1UdEwQCMAAwDgYDVR0PAQH_BAQDAgP4MB0GA1UdDgQWBBQQyJ9rXSIskoUuA946von62LoxqzAfBgNVHSMEGDAWgBTUWrS54qC2NgG3UK6rVAr0gbQ0MTAMBggqhkjOPQQDBAUAA4GMADCBiAJCAaWoVQ0r6jFjhO5e0WJTgyMmA8BhpO1t7gXQ6xoKGso9jCOYf9OG9BFfZoVmdIyfYiwkhy1ld27tiOJ5X4m6WasRAkIBpEkUDf8irbSZ1V7zXALaR2mJTjKQV_5jRHsiBQWA-5DxEa-x_zJVRz8tpp-jjT2tSCU82bwUOBLu6te1YIDpWCA",
+          "MIIDsTCCAZmgAwIBAgIBAzANBgkqhkiG9w0BAQ0FADAuMQswCQYDVQQGEwJVUzEfMB0GA1UEAxMWVHJ1c3QgTmV0d29yayBSb290IENBMTAeFw0xNjA3MTAxMDAwMDBaFw0yNTA3MTAwOTU5NTlaMC0xCzAJBgNVBAYTAkVVMR4wHAYDVQQDExVUcnVzdCBOZXR3b3JrIFN1YiBDQTMwgZswEAYHKoZIzj0CAQYFK4EEACMDgYYABAGJzPZsjniwyZeXrgrlQM3Y13r3znR8FSQpKbC2bplrOWySQJPGm-GFObe5Dk4t3Jrtk_Pbs8-3VW_4q5drL0YqYwBYNJPhqjbSM6SGHrc6wNdPZRw_WnJVa0ELXKICC73lkjskWPfE-cLpZ3sTq1ovEmoNjgaySVRUH1wFDdkqyReJaKNjMGEwDwYDVR0TAQH_BAUwAwEB_zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNRatLnioLY2AbdQrqtUCvSBtDQxMB8GA1UdIwQYMBaAFEkmC1HDAh0fXehpiUhUGE868Hk2MA0GCSqGSIb3DQEBDQUAA4ICAQAs2KADYyGQCVy8tJZWakNtGdww4OumZpBuR66p_2xK7veRubQEhG-nJn7oVkJ4w5pEec3sYQEqtPbHyZcEKEYbOJ2cVf1nMH-DvFZ6ypQocGRp3WSWsTzL3SgqiWrQdPX1Y5dO6Hvx7p9ST9H2WgkxB-Q75Jov1gVF3bScAbxb7Mw7tf5z3Cvqmfo0Gatkgzz6-jDPrtUK7AAAOw3C0kHMbE3EnNarsfhBkUerE8QVmHIvz373mWt0SnguaHq0A9ZuSia_pF7bgfVRZi2ZzIzpu2O276sB2Yji9tcSn5l21jq63rXtvY_DLAi4kaLyf9sHT_tkH-gkTdkdkfQq8sA5ysRW21wPQbmjTIVwsfY4JjajVIUitjPbkUJqURpf2VD0JXdYQHS6KVPWqHWTlKPlsKbhw4ghuLqCMYda88L9rxWnSC5L8s0DJSuBBm-nq23NtHl5FbCzeXWcKRayIgimT-An1WIOeJP4F7-BctYLIooKoQzJZR1tOWvprUs22_xAivVBz7J_LmJyVlKesB2ic8qYdt7YVoCsWrnEUgoNoJPwLHeva8KPvd0gLXrwaMyTCCjeoemXFj6nCbbMHJeVffh6jYBAzlbcAEvTiZcdzrVVr54kOtWskyaeDnAcMXW4Of1vWdUJ2as5nyfletfTp4E6A9P2dZ5g7nMoL90yIw"
+        ],
+        "value": "6A77T3RBTAuVpZOgFFFfOvGOQ1hqMbfSQ91VucRM1RIP6QqX9kEF1Pi1_vCl37qpVzK51kIyppgUF_i9s999XA"
+      }
+    }
+  ],
+  "compositions": [
+    {
+      "aggregate": "complete",
+      "assemblies": [
+        "5366293e-0740-4dcf-b1d0-0c1fc26e4981",
+        "ee10d0a2-baba-4656-a5ac-d49e172a0d3d"
+      ],
+      "dependencies": [
+        "5366293e-0740-4dcf-b1d0-0c1fc26e4981"
+      ],
+      "signature": {
+        "algorithm": "ES256",
+        "certificatePath": [
+          "MIIB-TCCAVigAwIBAgIGAWFcc4YkMAwGCCqGSM49BAMEBQAwLTELMAkGA1UEBhMCRVUxHjAcBgNVBAMTFVRydXN0IE5ldHdvcmsgU3ViIENBMzAeFw0xODAxMDEwMDAwMDBaFw0yMjEyMzEyMzU5NTlaMDIxCzAJBgNVBAYTAkZSMQ0wCwYDVQQFEwQ0NTAxMRQwEgYDVQQDEwtleGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHHp7A83DBJIInj8-g1we3A7sBXprIQBUfdFDVUBQoPExq8rze6ewG0-eVcSF72J77gKiD0IHnzpwHaU7t6nVeajXTBbMAkGA1UdEwQCMAAwDgYDVR0PAQH_BAQDAgP4MB0GA1UdDgQWBBQQyJ9rXSIskoUuA946von62LoxqzAfBgNVHSMEGDAWgBTUWrS54qC2NgG3UK6rVAr0gbQ0MTAMBggqhkjOPQQDBAUAA4GMADCBiAJCAaWoVQ0r6jFjhO5e0WJTgyMmA8BhpO1t7gXQ6xoKGso9jCOYf9OG9BFfZoVmdIyfYiwkhy1ld27tiOJ5X4m6WasRAkIBpEkUDf8irbSZ1V7zXALaR2mJTjKQV_5jRHsiBQWA-5DxEa-x_zJVRz8tpp-jjT2tSCU82bwUOBLu6te1YIDpWCA",
+          "MIIDsTCCAZmgAwIBAgIBAzANBgkqhkiG9w0BAQ0FADAuMQswCQYDVQQGEwJVUzEfMB0GA1UEAxMWVHJ1c3QgTmV0d29yayBSb290IENBMTAeFw0xNjA3MTAxMDAwMDBaFw0yNTA3MTAwOTU5NTlaMC0xCzAJBgNVBAYTAkVVMR4wHAYDVQQDExVUcnVzdCBOZXR3b3JrIFN1YiBDQTMwgZswEAYHKoZIzj0CAQYFK4EEACMDgYYABAGJzPZsjniwyZeXrgrlQM3Y13r3znR8FSQpKbC2bplrOWySQJPGm-GFObe5Dk4t3Jrtk_Pbs8-3VW_4q5drL0YqYwBYNJPhqjbSM6SGHrc6wNdPZRw_WnJVa0ELXKICC73lkjskWPfE-cLpZ3sTq1ovEmoNjgaySVRUH1wFDdkqyReJaKNjMGEwDwYDVR0TAQH_BAUwAwEB_zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNRatLnioLY2AbdQrqtUCvSBtDQxMB8GA1UdIwQYMBaAFEkmC1HDAh0fXehpiUhUGE868Hk2MA0GCSqGSIb3DQEBDQUAA4ICAQAs2KADYyGQCVy8tJZWakNtGdww4OumZpBuR66p_2xK7veRubQEhG-nJn7oVkJ4w5pEec3sYQEqtPbHyZcEKEYbOJ2cVf1nMH-DvFZ6ypQocGRp3WSWsTzL3SgqiWrQdPX1Y5dO6Hvx7p9ST9H2WgkxB-Q75Jov1gVF3bScAbxb7Mw7tf5z3Cvqmfo0Gatkgzz6-jDPrtUK7AAAOw3C0kHMbE3EnNarsfhBkUerE8QVmHIvz373mWt0SnguaHq0A9ZuSia_pF7bgfVRZi2ZzIzpu2O276sB2Yji9tcSn5l21jq63rXtvY_DLAi4kaLyf9sHT_tkH-gkTdkdkfQq8sA5ysRW21wPQbmjTIVwsfY4JjajVIUitjPbkUJqURpf2VD0JXdYQHS6KVPWqHWTlKPlsKbhw4ghuLqCMYda88L9rxWnSC5L8s0DJSuBBm-nq23NtHl5FbCzeXWcKRayIgimT-An1WIOeJP4F7-BctYLIooKoQzJZR1tOWvprUs22_xAivVBz7J_LmJyVlKesB2ic8qYdt7YVoCsWrnEUgoNoJPwLHeva8KPvd0gLXrwaMyTCCjeoemXFj6nCbbMHJeVffh6jYBAzlbcAEvTiZcdzrVVr54kOtWskyaeDnAcMXW4Of1vWdUJ2as5nyfletfTp4E6A9P2dZ5g7nMoL90yIw"
+        ],
+        "value": "lm6wx-elyBTbNMKNF8riooZhvrm6f5j8JpvgP9JtVv50dd7sXQLH7PqJcn9fmKV8eoF8cszPllEsQQhEQOM4hA"
+      }
+    }
+  ],
+  "signature": {
+    "algorithm": "ES256",
+    "certificatePath": [
+      "MIIB-TCCAVigAwIBAgIGAWFcc4YkMAwGCCqGSM49BAMEBQAwLTELMAkGA1UEBhMCRVUxHjAcBgNVBAMTFVRydXN0IE5ldHdvcmsgU3ViIENBMzAeFw0xODAxMDEwMDAwMDBaFw0yMjEyMzEyMzU5NTlaMDIxCzAJBgNVBAYTAkZSMQ0wCwYDVQQFEwQ0NTAxMRQwEgYDVQQDEwtleGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHHp7A83DBJIInj8-g1we3A7sBXprIQBUfdFDVUBQoPExq8rze6ewG0-eVcSF72J77gKiD0IHnzpwHaU7t6nVeajXTBbMAkGA1UdEwQCMAAwDgYDVR0PAQH_BAQDAgP4MB0GA1UdDgQWBBQQyJ9rXSIskoUuA946von62LoxqzAfBgNVHSMEGDAWgBTUWrS54qC2NgG3UK6rVAr0gbQ0MTAMBggqhkjOPQQDBAUAA4GMADCBiAJCAaWoVQ0r6jFjhO5e0WJTgyMmA8BhpO1t7gXQ6xoKGso9jCOYf9OG9BFfZoVmdIyfYiwkhy1ld27tiOJ5X4m6WasRAkIBpEkUDf8irbSZ1V7zXALaR2mJTjKQV_5jRHsiBQWA-5DxEa-x_zJVRz8tpp-jjT2tSCU82bwUOBLu6te1YIDpWCA",
+      "MIIDsTCCAZmgAwIBAgIBAzANBgkqhkiG9w0BAQ0FADAuMQswCQYDVQQGEwJVUzEfMB0GA1UEAxMWVHJ1c3QgTmV0d29yayBSb290IENBMTAeFw0xNjA3MTAxMDAwMDBaFw0yNTA3MTAwOTU5NTlaMC0xCzAJBgNVBAYTAkVVMR4wHAYDVQQDExVUcnVzdCBOZXR3b3JrIFN1YiBDQTMwgZswEAYHKoZIzj0CAQYFK4EEACMDgYYABAGJzPZsjniwyZeXrgrlQM3Y13r3znR8FSQpKbC2bplrOWySQJPGm-GFObe5Dk4t3Jrtk_Pbs8-3VW_4q5drL0YqYwBYNJPhqjbSM6SGHrc6wNdPZRw_WnJVa0ELXKICC73lkjskWPfE-cLpZ3sTq1ovEmoNjgaySVRUH1wFDdkqyReJaKNjMGEwDwYDVR0TAQH_BAUwAwEB_zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNRatLnioLY2AbdQrqtUCvSBtDQxMB8GA1UdIwQYMBaAFEkmC1HDAh0fXehpiUhUGE868Hk2MA0GCSqGSIb3DQEBDQUAA4ICAQAs2KADYyGQCVy8tJZWakNtGdww4OumZpBuR66p_2xK7veRubQEhG-nJn7oVkJ4w5pEec3sYQEqtPbHyZcEKEYbOJ2cVf1nMH-DvFZ6ypQocGRp3WSWsTzL3SgqiWrQdPX1Y5dO6Hvx7p9ST9H2WgkxB-Q75Jov1gVF3bScAbxb7Mw7tf5z3Cvqmfo0Gatkgzz6-jDPrtUK7AAAOw3C0kHMbE3EnNarsfhBkUerE8QVmHIvz373mWt0SnguaHq0A9ZuSia_pF7bgfVRZi2ZzIzpu2O276sB2Yji9tcSn5l21jq63rXtvY_DLAi4kaLyf9sHT_tkH-gkTdkdkfQq8sA5ysRW21wPQbmjTIVwsfY4JjajVIUitjPbkUJqURpf2VD0JXdYQHS6KVPWqHWTlKPlsKbhw4ghuLqCMYda88L9rxWnSC5L8s0DJSuBBm-nq23NtHl5FbCzeXWcKRayIgimT-An1WIOeJP4F7-BctYLIooKoQzJZR1tOWvprUs22_xAivVBz7J_LmJyVlKesB2ic8qYdt7YVoCsWrnEUgoNoJPwLHeva8KPvd0gLXrwaMyTCCjeoemXFj6nCbbMHJeVffh6jYBAzlbcAEvTiZcdzrVVr54kOtWskyaeDnAcMXW4Of1vWdUJ2as5nyfletfTp4E6A9P2dZ5g7nMoL90yIw"
+    ],
+    "value": "m4pMbQQVV61TlP4Og7a75SeY8lh00LkkUDXZ4PIhXsR512MPRgZmusFYorJlYq9wM3P9n9gM3T8BTg9XdFdQkQ"
+  }
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-vulnerability-1.4.json b/tests/_data/schemaTestData/1.4/valid-vulnerability-1.4.json
new file mode 100644
index 000000000..184a6641a
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-vulnerability-1.4.json
@@ -0,0 +1,140 @@
+{
+  "bomFormat": "CycloneDX",
+  "specVersion": "1.4",
+  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
+  "version": 1,
+  "components": [
+    {
+      "bom-ref": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.4",
+      "type": "library",
+      "group": "com.fasterxml.jackson.core",
+      "name": "jackson-databind",
+      "version": "2.9.4",
+      "purl": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.4"
+    }
+  ],
+  "vulnerabilities": [
+    {
+      "bom-ref": "6eee14da-8f42-4cc4-bb65-203235f02415",
+      "id": "SNYK-JAVA-COMFASTERXMLJACKSONCORE-32111",
+      "source": {
+        "name": "Snyk",
+        "url": "https://snyk.io/vuln/SNYK-JAVA-COMFASTERXMLJACKSONCORE-32111"
+      },
+      "references": [
+        {
+          "id": "CVE-2018-7489",
+          "source": {
+            "name": "NVD",
+            "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-9997"
+          }
+        }
+      ],
+      "ratings": [
+        {
+          "source": {
+            "name": "NVD",
+            "url": "https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H&version=3.0"
+          },
+          "score": 9.8,
+          "severity": "critical",
+          "method": "CVSSv3",
+          "vector": "AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
+          "justification": "An optional reason for rating the vulnerability as it was"
+        }
+      ],
+      "cwes": [
+        184,
+        502
+      ],
+      "description": "FasterXML jackson-databind before 2.7.9.3, 2.8.x before 2.8.11.1 and 2.9.x before 2.9.5 allows unauthenticated remote code execution because of an incomplete fix for the CVE-2017-7525 deserialization flaw. This is exploitable by sending maliciously crafted JSON input to the readValue method of the ObjectMapper, bypassing a blacklist that is ineffective if the c3p0 libraries are available in the classpath.",
+      "detail": "",
+      "recommendation": "Upgrade com.fasterxml.jackson.core:jackson-databind to version 2.6.7.5, 2.8.11.1, 2.9.5 or higher.",
+      "advisories": [
+        {
+          "title": "GitHub Commit",
+          "url": "https://github.com/FasterXML/jackson-databind/commit/6799f8f10cc78e9af6d443ed6982d00a13f2e7d2"
+        },
+        {
+          "title": "GitHub Issue",
+          "url": "https://github.com/FasterXML/jackson-databind/issues/1931"
+        }
+      ],
+      "created": "2021-01-01T00:00:00.000Z",
+      "published": "2021-01-01T00:00:00.000Z",
+      "updated": "2021-01-01T00:00:00.000Z",
+      "credits": {
+        "organizations": [
+          {
+            "name": "Acme, Inc.",
+            "url": [
+              "https://example.com"
+            ]
+          }
+        ],
+        "individuals": [
+          {
+            "name": "Jane Doe",
+            "email": "jane.doe@example.com"
+          }
+        ]
+      },
+      "tools": [
+        {
+          "vendor": "Snyk",
+          "name": "Snyk CLI (Linux)",
+          "version": "1.729.0",
+          "hashes": [
+            {
+              "alg": "SHA-256",
+              "content": "2eaf8c62831a1658c95d41fdc683cd177c147733c64a93e59cb2362829e45b7d"
+            }
+          ]
+        }
+      ],
+      "analysis": {
+        "state": "not_affected",
+        "justification": "code_not_reachable",
+        "response": ["will_not_fix", "update"],
+        "detail": "An optional explanation of why the application is not affected by the vulnerable component."
+      },
+      "affects": [
+        {
+          "ref": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.4",
+          "versions": [
+            {
+              "range": "vers:semver/<2.6.7.5",
+              "status": "affected"
+            },
+            {
+              "range": "vers:semver/2.7.0|<2.8.11.1",
+              "status": "affected"
+            },
+            {
+              "range": "vers:semver/2.9.0|<2.9.5",
+              "status": "affected"
+            }
+          ]
+        }
+      ],
+      "properties": [
+        {
+          "name": "Foo",
+          "value": "Bar"
+        },
+        {
+          "name": "Foo",
+          "value": "You"
+        },
+        {
+          "name": "Foo",
+          "value": "Two"
+        },
+        {
+          "name": "Bar",
+          "value": "Foo"
+        }
+      ]
+    }
+  ]
+}
diff --git a/tests/_data/schemaTestData/1.4/valid-vulnerability-1.4.xml b/tests/_data/schemaTestData/1.4/valid-vulnerability-1.4.xml
new file mode 100644
index 000000000..8e21f5522
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-vulnerability-1.4.xml
@@ -0,0 +1,127 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="library" bom-ref="pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.4">
+            <group>com.fasterxml.jackson.core</group>
+            <name>jackson-databind</name>
+            <version>2.9.4</version>
+            <purl>pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.4</purl>
+        </component>
+    </components>
+    <vulnerabilities>
+        <vulnerability bom-ref="6eee14da-8f42-4cc4-bb65-203235f02415">
+            <id>SNYK-JAVA-COMFASTERXMLJACKSONCORE-32111</id>
+            <source>
+                <name>Snyk</name>
+                <url>https://snyk.io/vuln/SNYK-JAVA-COMFASTERXMLJACKSONCORE-32111</url>
+            </source>
+            <references>
+                <reference>
+                    <id>CVE-2018-7489</id>
+                    <source>
+                        <name>NVD</name>
+                        <url>https://nvd.nist.gov/vuln/detail/CVE-2019-9997</url>
+                    </source>
+                </reference>
+                <reference>
+                    <id>CVE-2018-7489</id>
+                    <source>
+                        <name>NVD</name>
+                        <url>https://nvd.nist.gov/vuln/detail/CVE-2019-9997</url>
+                    </source>
+                </reference>
+            </references>
+            <ratings>
+                <rating>
+                    <source>
+                        <name>NVD</name>
+                        <url>https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H&amp;version=3.0</url>
+                    </source>
+                    <score>9.8</score>
+                    <severity>critical</severity>
+                    <method>CVSSv3</method>
+                    <vector>AN/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H</vector>
+                    <justification>An optional reason for rating the vulnerability as it was</justification>
+                </rating>
+            </ratings>
+            <cwes>
+                <cwe>184</cwe>
+                <cwe>502</cwe>
+            </cwes>
+            <description>FasterXML jackson-databind before 2.7.9.3, 2.8.x before 2.8.11.1 and 2.9.x before 2.9.5 allows unauthenticated remote code execution because of an incomplete fix for the CVE-2017-7525 deserialization flaw. This is exploitable by sending maliciously crafted JSON input to the readValue method of the ObjectMapper, bypassing a blacklist that is ineffective if the c3p0 libraries are available in the classpath.</description>
+            <detail></detail>
+            <recommendation>Upgrade com.fasterxml.jackson.core:jackson-databind to version 2.6.7.5, 2.8.11.1, 2.9.5 or higher.</recommendation>
+            <advisories>
+                <advisory>
+                    <title>GitHub Commit</title>
+                    <url>https://github.com/FasterXML/jackson-databind/commit/6799f8f10cc78e9af6d443ed6982d00a13f2e7d2</url>
+                </advisory>
+                <advisory>
+                    <title>GitHub Issue</title>
+                    <url>https://github.com/FasterXML/jackson-databind/issues/1931</url>
+                </advisory>
+            </advisories>
+            <created>2021-01-01T00:00:00.000Z</created>
+            <published>2021-01-01T00:00:00.000Z</published>
+            <updated>2021-01-01T00:00:00.000Z</updated>
+            <credits>
+                <organizations>
+                    <organization>
+                        <name>Acme, Inc.</name>
+                        <url>https://example.com</url>
+                    </organization>
+                </organizations>
+                <individuals>
+                    <individual>
+                        <name>Jane Doe</name>
+                        <email>jane.doe@example.com</email>
+                    </individual>
+                </individuals>
+            </credits>
+            <tools>
+                <tool>
+                    <vendor>Snyk</vendor>
+                    <name>Snyk CLI (Linux)</name>
+                    <version>1.729.0</version>
+                    <hashes>
+                        <hash alg="SHA-256">2eaf8c62831a1658c95d41fdc683cd177c147733c64a93e59cb2362829e45b7d</hash>
+                    </hashes>
+                </tool>
+            </tools>
+            <analysis>
+                <state>not_affected</state>
+                <justification>code_not_reachable</justification>
+                <responses>
+                    <response>will_not_fix</response>
+                    <response>update</response>
+                </responses>
+                <detail>An optional explanation of why the application is not affected by the vulnerable component.</detail>
+            </analysis>
+            <affects>
+                <target>
+                    <ref>pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.4</ref>
+                    <versions>
+                        <version>
+                            <range>vers:semver/&lt;2.6.7.5</range>
+                            <status>affected</status>
+                        </version>
+                        <version>
+                            <range>vers:semver/2.7.0|&lt;2.8.11.1</range>
+                            <status>affected</status>
+                        </version>
+                        <version>
+                            <range>vers:semver/2.9.0|&lt;2.9.5</range>
+                            <status>affected</status>
+                        </version>
+                    </versions>
+                </target>
+            </affects>
+            <properties>
+                <property name="Foo">Bar</property>
+                <property name="Foo">You</property>
+                <property name="Foo">Two</property>
+                <property name="Bar">Foo</property>
+            </properties>
+        </vulnerability>
+    </vulnerabilities>
+</bom>
diff --git a/tests/_data/schemaTestData/1.4/valid-xml-signature-1.4.xml b/tests/_data/schemaTestData/1.4/valid-xml-signature-1.4.xml
new file mode 100644
index 000000000..b3ee4e616
--- /dev/null
+++ b/tests/_data/schemaTestData/1.4/valid-xml-signature-1.4.xml
@@ -0,0 +1,177 @@
+<?xml version="1.0"?>
+<bom serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1" xmlns="http://cyclonedx.org/schema/bom/1.4">
+    <components>
+        <component type="application">
+            <publisher>Acme Inc</publisher>
+            <group>com.acme</group>
+            <name>tomcat-catalina</name>
+            <version>9.0.14</version>
+            <hashes>
+                <hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
+                <hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
+                <hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
+                <hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar</purl>
+            <pedigree>
+                <ancestors>
+                    <component type="application">
+                        <publisher>Apache</publisher>
+                        <group>org.apache.tomcat</group>
+                        <name>tomcat-catalina</name>
+                        <version>9.0.14</version>
+                        <licenses>
+                            <license>
+                                <id>Apache-2.0</id>
+                            </license>
+                        </licenses>
+                        <purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14?packaging=jar</purl>
+
+                    </component>
+                </ancestors>
+                <commits>
+                    <commit>
+                        <uid>7638417db6d59f3c431d3e1f261cc637155684cd</uid>
+                        <url>https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd</url>
+                        <author>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>jdoe@example.com</email>
+                        </author>
+                        <committer>
+                            <timestamp>2018-11-07T22:01:45Z</timestamp>
+                            <name>John Doe</name>
+                            <email>jdoe@example.com</email>
+                        </committer>
+                        <message>Initial commit</message>
+                    </commit>
+                </commits>
+            </pedigree>
+        </component>
+        <component type="library">
+            <group>org.example</group>
+            <name>mylibrary</name>
+            <version>1.0.0</version>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">2342c2eaf1feb9a80195dbaddf2ebaa3</hash>
+                <hash alg="SHA-1">68b78babe00a053f9e35ec6a2d9080f5b90122b0</hash>
+                <hash alg="SHA-256">708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313</hash>
+                <hash alg="SHA-512">387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                    <text content-type="text/xml" encoding="base64">blah</text>
+                    <url>fdaf</url>
+                </license>
+            </licenses>
+            <copyright>Copyright Example Inc. All rights reserved.</copyright>
+            <cpe>cpe:/a:example:myapplication:1.0.0</cpe>
+            <purl>pkg:maven/com.example/myapplication@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+        </component>
+        <component type="framework">
+            <group>com.example</group>
+            <name>myframework</name>
+            <version>1.0.0</version>
+            <description>Example Inc, enterprise framework</description>
+            <scope>required</scope>
+            <hashes>
+                <hash alg="MD5">cfcb0b64aacd2f81c1cd546543de965a</hash>
+                <hash alg="SHA-1">7fbeef2346c45d565c3341f037bce4e088af8a52</hash>
+                <hash alg="SHA-256">0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1</hash>
+                <hash alg="SHA-512">854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79</hash>
+            </hashes>
+            <licenses>
+                <license>
+                    <id>Apache-2.0</id>
+                </license>
+            </licenses>
+            <purl>pkg:maven/com.example/myframework@1.0.0?packaging=war</purl>
+            <modified>false</modified>
+            <externalReferences>
+                <reference type="website">
+                    <url>http://example.com/myframework</url>
+                </reference>
+                <reference type="advisories">
+                    <url>http://example.com/security</url>
+                </reference>
+            </externalReferences>
+        </component>
+    </components>
+    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+        <ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
+            <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
+            <ds:Reference URI="" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                <ds:Transforms xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                    <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
+                </ds:Transforms>
+                <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
+                <ds:DigestValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">PrB8/rofGs34XwIX5OIdYSjV2aKSe5VaztJKBvsgjIk=</ds:DigestValue>
+            </ds:Reference>
+        </ds:SignedInfo>
+        <ds:SignatureValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+            ePGNg30Zl9CW7RZdcRn8gFCp1AlWncjudA9pQDXyqZOvyj9RC2YtkI688WdfDOdVRZs6mflJFXr7
+            IKA9wY6jVrEqZmlef55Qp/8iGwOjOjWbwYsm2AhrdkUi9gaFSWEd8uITYHOpWbiPFSsnimiK9+ft
+            56dkg/oJMLdXzlaukzq9iGkRcafRkW433OQcZIXwD2K8lg4cdD0pNNNqBa+PgIvzbxA5H84TyQDB
+            HBcQiw/j1edRBJgPOwlqzZDUawOJaFhAPUQ+GGKMetIJH2FqqrHXGuV1NIwnbWTCg40RdOcBdCrl
+            PDtDVjFh34uZ4dYBpJBIlM4daD2N4B6WPB5iHRyuZTczF2q03ObabuTgkpK6EeadFVqFNsEOOPPt
+            MDDyda+Lwff5KjvUHvRRtUDIOm2rNIQKzaseulwYcA9UWQHAFcupJmWcLLM4zzY7F/uOdZuSurzh
+            U6h5kdb76Juepof6ee4Q5YpwNOGNL5JfB4C3sc/Dbbv8dZ8OuXFYSZN7reUGZzCNksByqERPEbAe
+            n1ldJu1HnRXRQpwaon8Asy9CuNmPfFCfDwOs2B4p4tb+tLNIKFHdRlpd19Zr9vCMCbltXeqq0Cpq
+            OejSyLYGqSWzzzUh449dJrg6KTevrTNEln5GAlLBFSdjM5JA7KV2u/GyDVFwSEW7UKooGN4CtgU=
+        </ds:SignatureValue>
+        <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+            <ds:X509Data xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                <ds:X509SubjectName xmlns:ds="http://www.w3.org/2000/09/xmldsig#">CN=bomsigner,OU=development,O=cyclonedx</ds:X509SubjectName>
+                <ds:X509Certificate xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                    MIIE+DCCAuCgAwIBAgIEXGzayTANBgkqhkiG9w0BAQsFADA+MRIwEAYDVQQKDAljeWNsb25lZHgx
+                    FDASBgNVBAsMC2RldmVsb3BtZW50MRIwEAYDVQQDDAlib21zaWduZXIwHhcNMTkwMjIwMDQ0MjQ5
+                    WhcNNDkwMjIwMDQ0MjQ5WjA+MRIwEAYDVQQKDAljeWNsb25lZHgxFDASBgNVBAsMC2RldmVsb3Bt
+                    ZW50MRIwEAYDVQQDDAlib21zaWduZXIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCo
+                    5JZsM4ZLfWW/dpRlU6CpnItWspddF+bEVDETKVwVj9tGpqR5jURgKS/BOQP2TGUsR3/ZJJBhYRll
+                    ONhrUQrVKV/I6wp3Z40qPEa1RJLE+QlG9iL8qBV52CnXkLmnUSax3dspSzmSct5vDiTnvpHG9jr0
+                    AKFeTjy7U9rv8GJybz0ijwlpBoO9JRdYPX2PrrzoSeJLoxKq+GwuyCZ5LhXRN0p1a+NAirTAmY+c
+                    G1ZTLkMmfeCUy1t6H/bG4RnYOSSPOvk7Rb68lQpUqb+pbbNuB2o/b9cDwtLLCtGVlu+5Wj8mrytY
+                    3FGFQM20j3yVeRInmGqTTDBelQa/CO4JKqBlmaeYEIvNYbFs9+AlqadivwDO51RpdPo9fPSpsBpy
+                    ZMv6S2bXNuUML+Rk99WyKJTPM0PTZhRLZ64ZXEhlz3kQWVoSlrcwwim6sj6LRUb5IRqA3lxRFUI6
+                    NXKyiQLamQp+t3/9OGW9L1rLCcw7yFo0s8LhMTPMiv4ol9/hQViT+8ICzDsr0OM9ZiF4/UagFRlt
+                    IClV70cjh1DpsZjzQIRVGaj8uQ/JdtfRz4E43Ki7U0a2Vpho/t6poLVndv46tkX5nYGtMW4WfMoD
+                    ZflQ9pajvvKtr2jB1wob6nsU+VTmAcWZy4BCPH+XyfDw/0SFBdUceJJJtPWIeYFDUY7onptf+wID
+                    AQABMA0GCSqGSIb3DQEBCwUAA4ICAQCOVariNgK+9OF/5T9ZaSvZbkk45RTmzgQNXtFc5xfRvqwP
+                    s+pu/DFXm1R+ltjyS5j3w6NBZUFUI5MqLQr6JEEDrbu8BvfBO57wJNAEATj1JIHEfDfh7BxnBF8f
+                    oYFOwbrh4jOt0wz0FW2obsSVmF4GSvS7tTlWqTcsxjdZVmwP40RWu18B9jzv7M61adrWD3ksDA5O
+                    amSOsZi3Nt0aacDkyGRdCIEFi0fplxQInXMtD1z3RhXu2JSTAIr54Cei49Bh71kAXSWHMCog/f8a
+                    lSrZyqZBty/ACfU9DqlPIM+giHePKm4z2bcdpUdKZk6wcKDn4CvuBOqsMBMg7L05UEyyqTPD/4dk
+                    2GwJ8Nv0E5gsYHCIXF2cZ3OUVsw0mB/ozleEJVDE02uZZN/1wW1Xq028LsMdgN0Wk1WvWyF5MEdh
+                    nPWuhqp6tNaDI/kK6XQF+LjYJUzua3AQFOHfYNLKhO6d+bJ4rr0833v4v3cLW34kbXkKb6U3Yv8X
+                    SK3jBGCACiPgnc0N6awkh1kDlrZQ7GMsl14c+2+vpl9Lf0sL0mRUIyICfSC8MjlsP/BZH3emyfsk
+                    iWivPALomycKqP+PSkt1WaWApGENZWk1wNN99FYSYlt6LViW2p6T97fRx4jPRlHu+wecfD2k9RP4
+                    bt5W2HWfOP0zNAS7SnAVLEl2QZxXKw==
+                </ds:X509Certificate>
+            </ds:X509Data>
+            <ds:KeyValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                <ds:RSAKeyValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                    <ds:Modulus xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+                        qOSWbDOGS31lv3aUZVOgqZyLVrKXXRfmxFQxEylcFY/bRqakeY1EYCkvwTkD9kxlLEd/2SSQYWEZ
+                        ZTjYa1EK1SlfyOsKd2eNKjxGtUSSxPkJRvYi/KgVedgp15C5p1Emsd3bKUs5knLebw4k576RxvY6
+                        9AChXk48u1Pa7/Bicm89Io8JaQaDvSUXWD19j6686EniS6MSqvhsLsgmeS4V0TdKdWvjQIq0wJmP
+                        nBtWUy5DJn3glMtbeh/2xuEZ2Dkkjzr5O0W+vJUKVKm/qW2zbgdqP2/XA8LSywrRlZbvuVo/Jq8r
+                        WNxRhUDNtI98lXkSJ5hqk0wwXpUGvwjuCSqgZZmnmBCLzWGxbPfgJamnYr8AzudUaXT6PXz0qbAa
+                        cmTL+ktm1zblDC/kZPfVsiiUzzND02YUS2euGVxIZc95EFlaEpa3MMIpurI+i0VG+SEagN5cURVC
+                        OjVysokC2pkKfrd//ThlvS9aywnMO8haNLPC4TEzzIr+KJff4UFYk/vCAsw7K9DjPWYheP1GoBUZ
+                        bSApVe9HI4dQ6bGY80CEVRmo/LkPyXbX0c+BONyou1NGtlaYaP7eqaC1Z3b+OrZF+Z2BrTFuFnzK
+                        A2X5UPaWo77yra9owdcKG+p7FPlU5gHFmcuAQjx/l8nw8P9EhQXVHHiSSbT1iHmBQ1GO6J6bX/s=
+                    </ds:Modulus>
+                    <ds:Exponent xmlns:ds="http://www.w3.org/2000/09/xmldsig#">AQAB</ds:Exponent>
+                </ds:RSAKeyValue>
+            </ds:KeyValue>
+        </ds:KeyInfo>
+    </ds:Signature></bom>

From 2285e4329b8009020dfcd07d3459f15698d69361 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Thu, 14 Sep 2023 13:45:26 +0200
Subject: [PATCH 04/41] moved res

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/__res/README.md                                  | 1 +
 cyclonedx/__res/schema/.gitattributes                      | 3 +++
 cyclonedx/{ => __res}/schema/bom-1.0.xsd                   | 0
 cyclonedx/{ => __res}/schema/bom-1.1.xsd                   | 0
 cyclonedx/{ => __res}/schema/bom-1.2-strict.schema.json    | 0
 cyclonedx/{ => __res}/schema/bom-1.2.schema.json           | 0
 cyclonedx/{ => __res}/schema/bom-1.2.xsd                   | 0
 cyclonedx/{ => __res}/schema/bom-1.2b.schema.json          | 0
 cyclonedx/{ => __res}/schema/bom-1.3-strict.schema.json    | 0
 cyclonedx/{ => __res}/schema/bom-1.3.proto                 | 0
 cyclonedx/{ => __res}/schema/bom-1.3.schema.json           | 0
 cyclonedx/{ => __res}/schema/bom-1.3.xsd                   | 0
 cyclonedx/{ => __res}/schema/bom-1.3a.schema.json          | 0
 cyclonedx/{ => __res}/schema/bom-1.4.schema.json           | 0
 cyclonedx/{ => __res}/schema/bom-1.4.xsd                   | 0
 cyclonedx/{ => __res}/schema/ext/bom-descriptor-0.9.xsd    | 0
 cyclonedx/{ => __res}/schema/ext/bom-descriptor-1.0.xsd    | 0
 cyclonedx/{ => __res}/schema/ext/dependency-graph-1.0.xsd  | 0
 .../schema/ext/vulnerability-1.0-SNAPSHOT.schema.json      | 0
 cyclonedx/{ => __res}/schema/ext/vulnerability-1.0.xsd     | 0
 cyclonedx/{ => __res}/schema/spdx.schema.json              | 0
 cyclonedx/{ => __res}/schema/spdx.xsd                      | 0
 cyclonedx/schema/__init__.py                               | 4 ++++
 cyclonedx/spdx.py                                          | 7 +++++--
 tests/__init__.py                                          | 5 -----
 tests/base.py                                              | 4 +++-
 tests/test_spdx.py                                         | 4 ++--
 27 files changed, 18 insertions(+), 10 deletions(-)
 create mode 100644 cyclonedx/__res/README.md
 create mode 100644 cyclonedx/__res/schema/.gitattributes
 rename cyclonedx/{ => __res}/schema/bom-1.0.xsd (100%)
 rename cyclonedx/{ => __res}/schema/bom-1.1.xsd (100%)
 rename cyclonedx/{ => __res}/schema/bom-1.2-strict.schema.json (100%)
 rename cyclonedx/{ => __res}/schema/bom-1.2.schema.json (100%)
 rename cyclonedx/{ => __res}/schema/bom-1.2.xsd (100%)
 rename cyclonedx/{ => __res}/schema/bom-1.2b.schema.json (100%)
 rename cyclonedx/{ => __res}/schema/bom-1.3-strict.schema.json (100%)
 rename cyclonedx/{ => __res}/schema/bom-1.3.proto (100%)
 rename cyclonedx/{ => __res}/schema/bom-1.3.schema.json (100%)
 rename cyclonedx/{ => __res}/schema/bom-1.3.xsd (100%)
 rename cyclonedx/{ => __res}/schema/bom-1.3a.schema.json (100%)
 rename cyclonedx/{ => __res}/schema/bom-1.4.schema.json (100%)
 rename cyclonedx/{ => __res}/schema/bom-1.4.xsd (100%)
 rename cyclonedx/{ => __res}/schema/ext/bom-descriptor-0.9.xsd (100%)
 rename cyclonedx/{ => __res}/schema/ext/bom-descriptor-1.0.xsd (100%)
 rename cyclonedx/{ => __res}/schema/ext/dependency-graph-1.0.xsd (100%)
 rename cyclonedx/{ => __res}/schema/ext/vulnerability-1.0-SNAPSHOT.schema.json (100%)
 rename cyclonedx/{ => __res}/schema/ext/vulnerability-1.0.xsd (100%)
 rename cyclonedx/{ => __res}/schema/spdx.schema.json (100%)
 rename cyclonedx/{ => __res}/schema/spdx.xsd (100%)

diff --git a/cyclonedx/__res/README.md b/cyclonedx/__res/README.md
new file mode 100644
index 000000000..4c5604cce
--- /dev/null
+++ b/cyclonedx/__res/README.md
@@ -0,0 +1 @@
+data in here are private, shipped resources
diff --git a/cyclonedx/__res/schema/.gitattributes b/cyclonedx/__res/schema/.gitattributes
new file mode 100644
index 000000000..00abe0d3d
--- /dev/null
+++ b/cyclonedx/__res/schema/.gitattributes
@@ -0,0 +1,3 @@
+*       linguist-generated
+*/*     linguist-generated
+**/*    linguist-generated
diff --git a/cyclonedx/schema/bom-1.0.xsd b/cyclonedx/__res/schema/bom-1.0.xsd
similarity index 100%
rename from cyclonedx/schema/bom-1.0.xsd
rename to cyclonedx/__res/schema/bom-1.0.xsd
diff --git a/cyclonedx/schema/bom-1.1.xsd b/cyclonedx/__res/schema/bom-1.1.xsd
similarity index 100%
rename from cyclonedx/schema/bom-1.1.xsd
rename to cyclonedx/__res/schema/bom-1.1.xsd
diff --git a/cyclonedx/schema/bom-1.2-strict.schema.json b/cyclonedx/__res/schema/bom-1.2-strict.schema.json
similarity index 100%
rename from cyclonedx/schema/bom-1.2-strict.schema.json
rename to cyclonedx/__res/schema/bom-1.2-strict.schema.json
diff --git a/cyclonedx/schema/bom-1.2.schema.json b/cyclonedx/__res/schema/bom-1.2.schema.json
similarity index 100%
rename from cyclonedx/schema/bom-1.2.schema.json
rename to cyclonedx/__res/schema/bom-1.2.schema.json
diff --git a/cyclonedx/schema/bom-1.2.xsd b/cyclonedx/__res/schema/bom-1.2.xsd
similarity index 100%
rename from cyclonedx/schema/bom-1.2.xsd
rename to cyclonedx/__res/schema/bom-1.2.xsd
diff --git a/cyclonedx/schema/bom-1.2b.schema.json b/cyclonedx/__res/schema/bom-1.2b.schema.json
similarity index 100%
rename from cyclonedx/schema/bom-1.2b.schema.json
rename to cyclonedx/__res/schema/bom-1.2b.schema.json
diff --git a/cyclonedx/schema/bom-1.3-strict.schema.json b/cyclonedx/__res/schema/bom-1.3-strict.schema.json
similarity index 100%
rename from cyclonedx/schema/bom-1.3-strict.schema.json
rename to cyclonedx/__res/schema/bom-1.3-strict.schema.json
diff --git a/cyclonedx/schema/bom-1.3.proto b/cyclonedx/__res/schema/bom-1.3.proto
similarity index 100%
rename from cyclonedx/schema/bom-1.3.proto
rename to cyclonedx/__res/schema/bom-1.3.proto
diff --git a/cyclonedx/schema/bom-1.3.schema.json b/cyclonedx/__res/schema/bom-1.3.schema.json
similarity index 100%
rename from cyclonedx/schema/bom-1.3.schema.json
rename to cyclonedx/__res/schema/bom-1.3.schema.json
diff --git a/cyclonedx/schema/bom-1.3.xsd b/cyclonedx/__res/schema/bom-1.3.xsd
similarity index 100%
rename from cyclonedx/schema/bom-1.3.xsd
rename to cyclonedx/__res/schema/bom-1.3.xsd
diff --git a/cyclonedx/schema/bom-1.3a.schema.json b/cyclonedx/__res/schema/bom-1.3a.schema.json
similarity index 100%
rename from cyclonedx/schema/bom-1.3a.schema.json
rename to cyclonedx/__res/schema/bom-1.3a.schema.json
diff --git a/cyclonedx/schema/bom-1.4.schema.json b/cyclonedx/__res/schema/bom-1.4.schema.json
similarity index 100%
rename from cyclonedx/schema/bom-1.4.schema.json
rename to cyclonedx/__res/schema/bom-1.4.schema.json
diff --git a/cyclonedx/schema/bom-1.4.xsd b/cyclonedx/__res/schema/bom-1.4.xsd
similarity index 100%
rename from cyclonedx/schema/bom-1.4.xsd
rename to cyclonedx/__res/schema/bom-1.4.xsd
diff --git a/cyclonedx/schema/ext/bom-descriptor-0.9.xsd b/cyclonedx/__res/schema/ext/bom-descriptor-0.9.xsd
similarity index 100%
rename from cyclonedx/schema/ext/bom-descriptor-0.9.xsd
rename to cyclonedx/__res/schema/ext/bom-descriptor-0.9.xsd
diff --git a/cyclonedx/schema/ext/bom-descriptor-1.0.xsd b/cyclonedx/__res/schema/ext/bom-descriptor-1.0.xsd
similarity index 100%
rename from cyclonedx/schema/ext/bom-descriptor-1.0.xsd
rename to cyclonedx/__res/schema/ext/bom-descriptor-1.0.xsd
diff --git a/cyclonedx/schema/ext/dependency-graph-1.0.xsd b/cyclonedx/__res/schema/ext/dependency-graph-1.0.xsd
similarity index 100%
rename from cyclonedx/schema/ext/dependency-graph-1.0.xsd
rename to cyclonedx/__res/schema/ext/dependency-graph-1.0.xsd
diff --git a/cyclonedx/schema/ext/vulnerability-1.0-SNAPSHOT.schema.json b/cyclonedx/__res/schema/ext/vulnerability-1.0-SNAPSHOT.schema.json
similarity index 100%
rename from cyclonedx/schema/ext/vulnerability-1.0-SNAPSHOT.schema.json
rename to cyclonedx/__res/schema/ext/vulnerability-1.0-SNAPSHOT.schema.json
diff --git a/cyclonedx/schema/ext/vulnerability-1.0.xsd b/cyclonedx/__res/schema/ext/vulnerability-1.0.xsd
similarity index 100%
rename from cyclonedx/schema/ext/vulnerability-1.0.xsd
rename to cyclonedx/__res/schema/ext/vulnerability-1.0.xsd
diff --git a/cyclonedx/schema/spdx.schema.json b/cyclonedx/__res/schema/spdx.schema.json
similarity index 100%
rename from cyclonedx/schema/spdx.schema.json
rename to cyclonedx/__res/schema/spdx.schema.json
diff --git a/cyclonedx/schema/spdx.xsd b/cyclonedx/__res/schema/spdx.xsd
similarity index 100%
rename from cyclonedx/schema/spdx.xsd
rename to cyclonedx/__res/schema/spdx.xsd
diff --git a/cyclonedx/schema/__init__.py b/cyclonedx/schema/__init__.py
index 9741a8e8f..a1d5b0c0e 100644
--- a/cyclonedx/schema/__init__.py
+++ b/cyclonedx/schema/__init__.py
@@ -15,6 +15,7 @@
 # SPDX-License-Identifier: Apache-2.0
 
 from enum import Enum
+from os.path import join, dirname
 
 
 class OutputFormat(str, Enum):
@@ -37,3 +38,6 @@ def to_version(self) -> str:
             `str` version
         """
         return f'{self.value[1]}.{self.value[5]}'
+
+
+__RES_DIR = join(dirname(dirname(__file__)), '__res', 'schema')
diff --git a/cyclonedx/spdx.py b/cyclonedx/spdx.py
index 8e59f376e..9c617a293 100644
--- a/cyclonedx/spdx.py
+++ b/cyclonedx/spdx.py
@@ -20,11 +20,14 @@
 ]
 
 from json import load as json_load
-from os.path import dirname, join as path_join
+from os.path import join as path_join
 from typing import TYPE_CHECKING, Dict, Optional, Set
 
 from license_expression import get_spdx_licensing  # type: ignore
 
+from .schema import __RES_DIR as __SCHEMA_RES_DIR
+
+
 if TYPE_CHECKING:
     from license_expression import Licensing
 
@@ -32,7 +35,7 @@
 # python's internal module loader will assure that this init-part runs only once.
 
 # !!! this requires to ship the actual schema data with the package.
-with open(path_join(dirname(__file__), 'schema', 'spdx.schema.json')) as schema:
+with open(path_join(__SCHEMA_RES_DIR, 'spdx.schema.json')) as schema:
     __IDS: Set[str] = set(json_load(schema).get('enum', []))
 assert len(__IDS) > 0, 'known SPDX-IDs should be non-empty set'
 
diff --git a/tests/__init__.py b/tests/__init__.py
index f2296f02b..4f31df0ab 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -19,11 +19,6 @@
 
 from os import getenv, path
 
-import cyclonedx
-
-# rework this path
-CDX_SCHEMA_DIRECTORY = path.join(path.dirname(cyclonedx.__file__), 'schema')
-
 TESTDATA_DIRECTORY = path.join(path.dirname(__file__),'_data')
 
 RECREATE_SNAPSHOTS = bool(getenv('CDX_TEST_RECREATE_SNAPSHOTS'))
diff --git a/tests/base.py b/tests/base.py
index 1727fa35e..9faf54c9c 100644
--- a/tests/base.py
+++ b/tests/base.py
@@ -37,7 +37,8 @@
 if sys.version_info >= (3, 7):
     from jsonschema import ValidationError, validate as json_validate
 
-from . import CDX_SCHEMA_DIRECTORY
+
+from cyclonedx.schema import __RES_DIR as CDX_SCHEMA_DIRECTORY
 
 single_uuid: str = 'urn:uuid:{}'.format(uuid4())
 
@@ -98,6 +99,7 @@ def assertEqualJsonBom(self, a: str, b: str) -> None:
 class BaseXmlTestCase(TestCase):
 
     def assertValidAgainstSchema(self, bom_xml: str, schema_version: SchemaVersion) -> None:
+        # rework access
         xsd_fn = os.path.join(CDX_SCHEMA_DIRECTORY, f'bom-{schema_version.name.replace("_", ".").replace("V", "")}.xsd')
         with open(xsd_fn) as xsd_fd:
             xsd_doc = etree.parse(xsd_fd)
diff --git a/tests/test_spdx.py b/tests/test_spdx.py
index d4399e31b..4c6f22d8c 100644
--- a/tests/test_spdx.py
+++ b/tests/test_spdx.py
@@ -25,9 +25,9 @@
 from ddt import data, ddt, idata, unpack
 
 from cyclonedx import spdx
+from cyclonedx.schema import __RES_DIR as CDX_SCHEMA_DIRECTORY
 
-from . import CDX_SCHEMA_DIRECTORY
-
+# rework access
 with open(path_join(CDX_SCHEMA_DIRECTORY, 'spdx.schema.json')) as spdx_schema:
     KNOWN_SPDX_IDS = json_load(spdx_schema)['enum']
 

From e299a0b9fba1066f96ab250cfbb596a08d2e3f75 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Thu, 14 Sep 2023 13:46:30 +0200
Subject: [PATCH 05/41] style

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/schema/__init__.py      | 2 +-
 cyclonedx/spdx.py                 | 1 -
 tests/__init__.py                 | 2 +-
 tests/test_component.py           | 5 ++---
 tests/test_deserialize_json.py    | 2 +-
 tests/test_deserialize_xml.py     | 3 ++-
 tests/test_output_json.py         | 6 +++---
 tests/test_output_xml.py          | 3 ++-
 tests/test_real_world_examples.py | 2 +-
 9 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/cyclonedx/schema/__init__.py b/cyclonedx/schema/__init__.py
index a1d5b0c0e..188055e1d 100644
--- a/cyclonedx/schema/__init__.py
+++ b/cyclonedx/schema/__init__.py
@@ -15,7 +15,7 @@
 # SPDX-License-Identifier: Apache-2.0
 
 from enum import Enum
-from os.path import join, dirname
+from os.path import dirname, join
 
 
 class OutputFormat(str, Enum):
diff --git a/cyclonedx/spdx.py b/cyclonedx/spdx.py
index 9c617a293..c6b4263f5 100644
--- a/cyclonedx/spdx.py
+++ b/cyclonedx/spdx.py
@@ -27,7 +27,6 @@
 
 from .schema import __RES_DIR as __SCHEMA_RES_DIR
 
-
 if TYPE_CHECKING:
     from license_expression import Licensing
 
diff --git a/tests/__init__.py b/tests/__init__.py
index 4f31df0ab..0b497f9e5 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -19,7 +19,7 @@
 
 from os import getenv, path
 
-TESTDATA_DIRECTORY = path.join(path.dirname(__file__),'_data')
+TESTDATA_DIRECTORY = path.join(path.dirname(__file__), '_data')
 
 RECREATE_SNAPSHOTS = bool(getenv('CDX_TEST_RECREATE_SNAPSHOTS'))
 if RECREATE_SNAPSHOTS:
diff --git a/tests/test_component.py b/tests/test_component.py
index 883d704f4..d2fe16fa4 100644
--- a/tests/test_component.py
+++ b/tests/test_component.py
@@ -17,7 +17,7 @@
 # SPDX-License-Identifier: Apache-2.0
 # Copyright (c) OWASP Foundation. All Rights Reserved.
 
-from os.path import dirname, join
+from os.path import join
 from unittest import TestCase
 
 # See https://github.com/package-url/packageurl-python/issues/65
@@ -26,9 +26,8 @@
 from cyclonedx.model import sha1sum
 from cyclonedx.model.component import Component
 
-from .data import get_component_setuptools_simple
 from . import TESTDATA_DIRECTORY
-
+from .data import get_component_setuptools_simple
 
 RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'own', 'xml', '1.4')
 
diff --git a/tests/test_deserialize_json.py b/tests/test_deserialize_json.py
index 3ee573eee..4535c8c05 100644
--- a/tests/test_deserialize_json.py
+++ b/tests/test_deserialize_json.py
@@ -19,7 +19,7 @@
 
 import json
 from datetime import datetime
-from os.path import dirname, join
+from os.path import join
 from typing import cast
 from unittest.mock import Mock, patch
 from uuid import UUID
diff --git a/tests/test_deserialize_xml.py b/tests/test_deserialize_xml.py
index 626e0972c..b097ab87f 100644
--- a/tests/test_deserialize_xml.py
+++ b/tests/test_deserialize_xml.py
@@ -18,7 +18,7 @@
 # Copyright (c) OWASP Foundation. All Rights Reserved.
 
 from datetime import datetime
-from os.path import dirname, join
+from os.path import join
 from typing import cast
 from unittest.mock import Mock, patch
 from uuid import UUID
@@ -57,6 +57,7 @@
 
 RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'own', 'xml')
 
+
 def fixed_date_time() -> datetime:
     return datetime.fromisoformat('2023-01-07 13:44:32.312678+00:00')
 
diff --git a/tests/test_output_json.py b/tests/test_output_json.py
index 7b33859b7..ab4303db0 100644
--- a/tests/test_output_json.py
+++ b/tests/test_output_json.py
@@ -16,7 +16,7 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 # Copyright (c) OWASP Foundation. All Rights Reserved.
-from os.path import dirname, join
+from os.path import join
 from unittest.mock import Mock, patch
 from uuid import UUID
 
@@ -51,11 +51,11 @@
     get_bom_with_services_simple,
 )
 
-
 from . import TESTDATA_DIRECTORY
 
 RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'own', 'json')
 
+
 @patch('cyclonedx.model.ThisTool._version', 'TESTING')
 class TestOutputJson(BaseJsonTestCase):
 
@@ -403,7 +403,7 @@ def test_bom_v1_4_warn_dependencies(self) -> None:
     def _validate_json_bom(self, bom: Bom, schema_version: SchemaVersion, fixture: str) -> None:
         outputter = get_instance(bom=bom, output_format=OutputFormat.JSON, schema_version=schema_version)
         self.assertEqual(outputter.schema_version, schema_version)
-        with open(join(RELEVANT_TESTDATA_DIRECTORY,schema_version.to_version(), fixture)) as expected_json:
+        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), fixture)) as expected_json:
             output_as_string = outputter.output_as_string()
             self.assertValidAgainstSchema(bom_json=output_as_string, schema_version=schema_version)
             self.assertEqualJsonBom(expected_json.read(), output_as_string)
diff --git a/tests/test_output_xml.py b/tests/test_output_xml.py
index 03f2a79bf..353cbf8d7 100644
--- a/tests/test_output_xml.py
+++ b/tests/test_output_xml.py
@@ -16,7 +16,7 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 # Copyright (c) OWASP Foundation. All Rights Reserved.
-from os.path import dirname, join
+from os.path import join
 from unittest.mock import Mock, patch
 from uuid import UUID
 
@@ -54,6 +54,7 @@
 
 RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'own', 'xml')
 
+
 @patch('cyclonedx.model.ThisTool._version', 'TESTING')
 class TestOutputXml(BaseXmlTestCase):
 
diff --git a/tests/test_real_world_examples.py b/tests/test_real_world_examples.py
index 21a51d014..185b51c8b 100644
--- a/tests/test_real_world_examples.py
+++ b/tests/test_real_world_examples.py
@@ -17,7 +17,7 @@
 # Copyright (c) OWASP Foundation. All Rights Reserved.
 import unittest
 from datetime import datetime
-from os.path import dirname, join
+from os.path import join
 from typing import cast
 from unittest.mock import patch
 from xml.etree import ElementTree

From bf84179dba100cd77100d3a61259164228ce56ee Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Thu, 14 Sep 2023 14:20:42 +0200
Subject: [PATCH 06/41] exclude dotfiles

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 pyproject.toml | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/pyproject.toml b/pyproject.toml
index 8f889159c..9631c5667 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -24,6 +24,10 @@ include = [
   "README.md", "LICENSE", "NOTICE",
   { path = "tests", format = "sdist" },
 ]
+exclude = [
+  # exclude dotfiles
+  "**/.*"
+]
 classifiers = [
   # Trove classifiers - https://packaging.python.org/specifications/core-metadata/#metadata-classifier
   # Full list: https://pypi.python.org/pypi?%3Aaction=list_classifiers

From 629ebe166c0e243813f27dcb4fb94f29686c34c2 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Thu, 14 Sep 2023 15:57:22 +0200
Subject: [PATCH 07/41] add extra dependencies

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 deps.lowest.r  |  2 ++
 pyproject.toml | 14 +++++++++++---
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/deps.lowest.r b/deps.lowest.r
index 70b35aaa9..d4d29f737 100644
--- a/deps.lowest.r
+++ b/deps.lowest.r
@@ -3,5 +3,7 @@
 
 packageurl-python == 0.11.1
 py-serializable == 0.11.1
+jsonschema == 4.0.0
+lxml == 4.0.0
 
 # file name is a untypical one, so dependabot does not bump this file
diff --git a/pyproject.toml b/pyproject.toml
index 9631c5667..5827fa297 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -7,7 +7,10 @@ name = "cyclonedx-python-lib"
 # !! version is managed by semantic_release
 version = "5.0.0-alpha.1"
 description = "A library for producing CycloneDX SBOM (Software Bill of Materials) files."
-authors = ["Paul Horton <phorton@sonatype.com>"]
+authors = [
+  "Paul Horton <phorton@sonatype.com>",
+  "Jan Kowalleck <jan.kowalleck@gmail.com>",
+]
 maintainers = [
   "Paul Horton <phorton@sonatype.com>",
   "Jan Kowalleck <jan.kowalleck@gmail.com>",
@@ -60,6 +63,13 @@ packageurl-python = ">= 0.11"
 py-serializable = "^0.11.1"
 sortedcontainers = "^2.4.0"
 license-expression = "^30"
+jsonschema = { version = "^4", optional = true}
+lxml = { version = "^4", optional = true }
+
+[tool.poetry.extras]
+validation = ["jsonschema", "lxml"]
+json-validation = ["jsonschema"]
+xml-validation = ["lxml"]
 
 [tool.poetry.dev-dependencies]
 ddt = "1.6.0"
@@ -70,9 +80,7 @@ flake8-bugbear = { version="23.9.16", python=">=3.8.1" }
 flake8-isort = "6.1.0 "
 isort = "5.12.0"
 autopep8 = "2.0.4"
-jsonschema = "4.17.3"
 mypy = "1.5.1"
-lxml = "4.9.3"
 tox = "4.11.3"
 xmldiff = "2.6.3"
 

From adb5f0d91b8bcedf37c7156f4065db23703a9486 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Fri, 15 Sep 2023 10:03:15 +0200
Subject: [PATCH 08/41] prep implementation

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/validation/__init__.py | 15 +++++++++++++++
 cyclonedx/validation/json.py     | 15 +++++++++++++++
 cyclonedx/validation/xml.py      | 15 +++++++++++++++
 3 files changed, 45 insertions(+)
 create mode 100644 cyclonedx/validation/__init__.py
 create mode 100644 cyclonedx/validation/json.py
 create mode 100644 cyclonedx/validation/xml.py

diff --git a/cyclonedx/validation/__init__.py b/cyclonedx/validation/__init__.py
new file mode 100644
index 000000000..5294f7ba6
--- /dev/null
+++ b/cyclonedx/validation/__init__.py
@@ -0,0 +1,15 @@
+# encoding: utf-8
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
diff --git a/cyclonedx/validation/json.py b/cyclonedx/validation/json.py
new file mode 100644
index 000000000..5294f7ba6
--- /dev/null
+++ b/cyclonedx/validation/json.py
@@ -0,0 +1,15 @@
+# encoding: utf-8
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
diff --git a/cyclonedx/validation/xml.py b/cyclonedx/validation/xml.py
new file mode 100644
index 000000000..5294f7ba6
--- /dev/null
+++ b/cyclonedx/validation/xml.py
@@ -0,0 +1,15 @@
+# encoding: utf-8
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0

From 18578415f200270d9db36f1ec7658ba144c7955f Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Fri, 15 Sep 2023 11:29:50 +0200
Subject: [PATCH 09/41] schema downloader & applied

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/__res/schema/.editorconfig          |   10 +
 cyclonedx/__res/schema/.gitattributes         |    9 +-
 cyclonedx/__res/schema/README.md              |   30 +
 .../{bom-1.0.xsd => bom-1.0.SNAPSHOT.xsd}     |    4 +-
 .../{bom-1.1.xsd => bom-1.1.SNAPSHOT.xsd}     |    2 +-
 ...on => bom-1.2-strict.SNAPSHOT.schema.json} |   11 +-
 ...hema.json => bom-1.2.SNAPSHOT.schema.json} |    5 +-
 .../{bom-1.2.xsd => bom-1.2.SNAPSHOT.xsd}     |    8 +-
 cyclonedx/__res/schema/bom-1.2b.schema.json   | 1026 --------
 ...on => bom-1.3-strict.SNAPSHOT.schema.json} |    7 +-
 ...hema.json => bom-1.3.SNAPSHOT.schema.json} |    5 +-
 .../{bom-1.3.xsd => bom-1.3.SNAPSHOT.xsd}     |    8 +-
 cyclonedx/__res/schema/bom-1.3.proto          |  452 ----
 cyclonedx/__res/schema/bom-1.3a.schema.json   | 1085 ---------
 ...hema.json => bom-1.4.SNAPSHOT.schema.json} |    9 +-
 .../{bom-1.4.xsd => bom-1.4.SNAPSHOT.xsd}     |   18 +-
 .../__res/schema/ext/bom-descriptor-0.9.xsd   |  175 --
 .../__res/schema/ext/bom-descriptor-1.0.xsd   |  183 --
 .../__res/schema/ext/dependency-graph-1.0.xsd |   70 -
 .../vulnerability-1.0-SNAPSHOT.schema.json    |  182 --
 .../__res/schema/ext/vulnerability-1.0.xsd    |  291 ---
 .../schema/jsf-0.82.SNAPSHOT.schema.json      |  244 ++
 ....schema.json => spdx.SNAPSHOT.schema.json} |  939 ++++----
 .../schema/{spdx.xsd => spdx.SNAPSHOT.xsd}    | 2123 ++++++++---------
 tools/schema-downloader.py                    |  109 +
 25 files changed, 1871 insertions(+), 5134 deletions(-)
 create mode 100644 cyclonedx/__res/schema/.editorconfig
 create mode 100644 cyclonedx/__res/schema/README.md
 rename cyclonedx/__res/schema/{bom-1.0.xsd => bom-1.0.SNAPSHOT.xsd} (99%)
 rename cyclonedx/__res/schema/{bom-1.1.xsd => bom-1.1.SNAPSHOT.xsd} (99%)
 rename cyclonedx/__res/schema/{bom-1.2-strict.schema.json => bom-1.2-strict.SNAPSHOT.schema.json} (99%)
 rename cyclonedx/__res/schema/{bom-1.2.schema.json => bom-1.2.SNAPSHOT.schema.json} (99%)
 rename cyclonedx/__res/schema/{bom-1.2.xsd => bom-1.2.SNAPSHOT.xsd} (99%)
 delete mode 100644 cyclonedx/__res/schema/bom-1.2b.schema.json
 rename cyclonedx/__res/schema/{bom-1.3-strict.schema.json => bom-1.3-strict.SNAPSHOT.schema.json} (99%)
 rename cyclonedx/__res/schema/{bom-1.3.schema.json => bom-1.3.SNAPSHOT.schema.json} (99%)
 rename cyclonedx/__res/schema/{bom-1.3.xsd => bom-1.3.SNAPSHOT.xsd} (99%)
 delete mode 100644 cyclonedx/__res/schema/bom-1.3.proto
 delete mode 100644 cyclonedx/__res/schema/bom-1.3a.schema.json
 rename cyclonedx/__res/schema/{bom-1.4.schema.json => bom-1.4.SNAPSHOT.schema.json} (99%)
 rename cyclonedx/__res/schema/{bom-1.4.xsd => bom-1.4.SNAPSHOT.xsd} (99%)
 delete mode 100644 cyclonedx/__res/schema/ext/bom-descriptor-0.9.xsd
 delete mode 100644 cyclonedx/__res/schema/ext/bom-descriptor-1.0.xsd
 delete mode 100644 cyclonedx/__res/schema/ext/dependency-graph-1.0.xsd
 delete mode 100644 cyclonedx/__res/schema/ext/vulnerability-1.0-SNAPSHOT.schema.json
 delete mode 100644 cyclonedx/__res/schema/ext/vulnerability-1.0.xsd
 create mode 100644 cyclonedx/__res/schema/jsf-0.82.SNAPSHOT.schema.json
 rename cyclonedx/__res/schema/{spdx.schema.json => spdx.SNAPSHOT.schema.json} (92%)
 rename cyclonedx/__res/schema/{spdx.xsd => spdx.SNAPSHOT.xsd} (93%)
 create mode 100644 tools/schema-downloader.py

diff --git a/cyclonedx/__res/schema/.editorconfig b/cyclonedx/__res/schema/.editorconfig
new file mode 100644
index 000000000..6fe0e5e40
--- /dev/null
+++ b/cyclonedx/__res/schema/.editorconfig
@@ -0,0 +1,10 @@
+
+# fix settings for files that are copied over, to keep them as is
+[*.SNAPSHOT.xsd]
+indent_size = 4
+indent_style = space
+trim_trailing_whitespace = false
+[*.SNAPSHOT.schema.json]
+indent_size = 2
+indent_style = space
+trim_trailing_whitespace = false
\ No newline at end of file
diff --git a/cyclonedx/__res/schema/.gitattributes b/cyclonedx/__res/schema/.gitattributes
index 00abe0d3d..41a9eb424 100644
--- a/cyclonedx/__res/schema/.gitattributes
+++ b/cyclonedx/__res/schema/.gitattributes
@@ -1,3 +1,6 @@
-*       linguist-generated
-*/*     linguist-generated
-**/*    linguist-generated
+# snapshots are vendored for offline use
+*.SNAPSHOT.*    linguist-vendored
+
+# specs are vendored for offline use
+*.xsd           linguist-vendored
+*.schema.json   linguist-vendored
diff --git a/cyclonedx/__res/schema/README.md b/cyclonedx/__res/schema/README.md
new file mode 100644
index 000000000..eb2eb377b
--- /dev/null
+++ b/cyclonedx/__res/schema/README.md
@@ -0,0 +1,30 @@
+# Resources: Schema files
+
+some schema for offline use as download via [script](../../tools/schema-downloader.py).
+original sources: <https://github.com/CycloneDX/specification/blob/1.4>
+
+Currently using version
+[ccbf7b5781ef534cd62616e3c4221004c7c82a66](https://github.com/CycloneDX/specification/commit/ccbf7b5781ef534cd62616e3c4221004c7c82a66)
+
+| file | note |
+|------|------|
+| [`bom-1.0.SNAPSHOT.xsd`](bom-1.0.SNAPSHOT.xsd) | applied changes: 1 |
+| [`bom-1.1.SNAPSHOT.xsd`](bom-1.1.SNAPSHOT.xsd) | applied changes: 1 |
+| [`bom-1.2.SNAPSHOT.xsd`](bom-1.2.SNAPSHOT.xsd) | applied changes: 1 |
+| [`bom-1.3.SNAPSHOT.xsd`](bom-1.3.SNAPSHOT.xsd) | applied changes: 1 |
+| [`bom-1.4.SNAPSHOT.xsd`](bom-1.4.SNAPSHOT.xsd) | applied changes: 1 |
+| [`bom-1.2.SNAPSHOT.schema.json`](bom-1.2.SNAPSHOT.schema.json) | applied changes: 2,3,4,5 |
+| [`bom-1.3.SNAPSHOT.schema.json`](bom-1.3.SNAPSHOT.schema.json) | applied changes: 2,3,4,5 |
+| [`bom-1.4.SNAPSHOT.schema.json`](bom-1.4.SNAPSHOT.schema.json) | applied changes: 2,3,4,5 |
+| [`bom-1.2-strict.SNAPSHOT.schema.json`](bom-1.2-strict.SNAPSHOT.schema.json) | applied changes: 2,3,4,5 |
+| [`bom-1.3-strict.SNAPSHOT.schema.json`](bom-1.3-strict.SNAPSHOT.schema.json) | applied changes: 2,3,4,5 |
+| [`spdx.SNAPSHOT.xsd`](spdx.SNAPSHOT.xsd) | |
+| [`spdx.SNAPSHOT.schema.json`](spdx.SNAPSHOT.schema.json) | |
+| [`jsf-0.82.SNAPSHOT.schema.json`](jsf-0.82.SNAPSHOT.schema.json) | |
+
+changes:
+1. `https?://cyclonedx.org/schema/spdx` was replaced with `spdx.SNAPSHOT.xsd`
+2. `spdx.schema.json` was replaced with `spdx.SNAPSHOT.schema.json`
+3. `jsf-0.82.schema.json` was replaced with `jsf-0.82.SNAPSHOT.schema.json`
+4. `properties.$schema.enum` was fixed to match `$id`
+5. `required.version` removed, as it is actually optional with default value
diff --git a/cyclonedx/__res/schema/bom-1.0.xsd b/cyclonedx/__res/schema/bom-1.0.SNAPSHOT.xsd
similarity index 99%
rename from cyclonedx/__res/schema/bom-1.0.xsd
rename to cyclonedx/__res/schema/bom-1.0.SNAPSHOT.xsd
index 815ed9ee8..64d0e33f9 100644
--- a/cyclonedx/__res/schema/bom-1.0.xsd
+++ b/cyclonedx/__res/schema/bom-1.0.SNAPSHOT.xsd
@@ -7,9 +7,9 @@
            targetNamespace="http://cyclonedx.org/schema/bom/1.0"
            vc:minVersion="1.0"
            vc:maxVersion="1.1"
-           version="1.0">
+           version="1.0.1">
 
-    <xs:import namespace="http://cyclonedx.org/schema/spdx" schemaLocation="spdx.xsd"/>
+    <xs:import namespace="http://cyclonedx.org/schema/spdx" schemaLocation="spdx.SNAPSHOT.xsd"/>
 
     <xs:complexType name="component">
         <xs:sequence>
diff --git a/cyclonedx/__res/schema/bom-1.1.xsd b/cyclonedx/__res/schema/bom-1.1.SNAPSHOT.xsd
similarity index 99%
rename from cyclonedx/__res/schema/bom-1.1.xsd
rename to cyclonedx/__res/schema/bom-1.1.SNAPSHOT.xsd
index 1e7bc1e05..8ddbaf62d 100644
--- a/cyclonedx/__res/schema/bom-1.1.xsd
+++ b/cyclonedx/__res/schema/bom-1.1.SNAPSHOT.xsd
@@ -24,7 +24,7 @@ limitations under the License.
            vc:maxVersion="1.1"
            version="1.1">
 
-    <xs:import namespace="http://cyclonedx.org/schema/spdx" schemaLocation="spdx.xsd"/>
+    <xs:import namespace="http://cyclonedx.org/schema/spdx" schemaLocation="spdx.SNAPSHOT.xsd"/>
 
     <xs:annotation>
         <xs:documentation>
diff --git a/cyclonedx/__res/schema/bom-1.2-strict.schema.json b/cyclonedx/__res/schema/bom-1.2-strict.SNAPSHOT.schema.json
similarity index 99%
rename from cyclonedx/__res/schema/bom-1.2-strict.schema.json
rename to cyclonedx/__res/schema/bom-1.2-strict.SNAPSHOT.schema.json
index 30dad527e..9a0f52d99 100644
--- a/cyclonedx/__res/schema/bom-1.2-strict.schema.json
+++ b/cyclonedx/__res/schema/bom-1.2-strict.SNAPSHOT.schema.json
@@ -6,11 +6,16 @@
   "$comment" : "CycloneDX JSON schema is published under the terms of the Apache License 2.0.",
   "required": [
     "bomFormat",
-    "specVersion",
-    "version"
+    "specVersion"
   ],
   "additionalProperties": false,
   "properties": {
+    "$schema": {
+      "type": "string",
+      "enum": [
+        "http://cyclonedx.org/schema/bom-1.2a.schema.json"
+      ]
+    },
     "bomFormat": {
       "$id": "#/properties/bomFormat",
       "type": "string",
@@ -589,7 +594,7 @@
       "additionalProperties": false,
       "properties": {
         "id": {
-          "$ref": "spdx.schema.json",
+          "$ref": "spdx.SNAPSHOT.schema.json",
           "title": "License ID (SPDX)",
           "description": "A valid SPDX license ID",
           "examples": ["Apache-2.0"]
diff --git a/cyclonedx/__res/schema/bom-1.2.schema.json b/cyclonedx/__res/schema/bom-1.2.SNAPSHOT.schema.json
similarity index 99%
rename from cyclonedx/__res/schema/bom-1.2.schema.json
rename to cyclonedx/__res/schema/bom-1.2.SNAPSHOT.schema.json
index 2e44d9422..539a78225 100644
--- a/cyclonedx/__res/schema/bom-1.2.schema.json
+++ b/cyclonedx/__res/schema/bom-1.2.SNAPSHOT.schema.json
@@ -6,8 +6,7 @@
   "$comment" : "CycloneDX JSON schema is published under the terms of the Apache License 2.0.",
   "required": [
     "bomFormat",
-    "specVersion",
-    "version"
+    "specVersion"
   ],
   "properties": {
     "bomFormat": {
@@ -577,7 +576,7 @@
       ],
       "properties": {
         "id": {
-          "$ref": "spdx.schema.json",
+          "$ref": "spdx.SNAPSHOT.schema.json",
           "title": "License ID (SPDX)",
           "description": "A valid SPDX license ID",
           "examples": ["Apache-2.0"]
diff --git a/cyclonedx/__res/schema/bom-1.2.xsd b/cyclonedx/__res/schema/bom-1.2.SNAPSHOT.xsd
similarity index 99%
rename from cyclonedx/__res/schema/bom-1.2.xsd
rename to cyclonedx/__res/schema/bom-1.2.SNAPSHOT.xsd
index 2eb7e4864..145874ba8 100644
--- a/cyclonedx/__res/schema/bom-1.2.xsd
+++ b/cyclonedx/__res/schema/bom-1.2.SNAPSHOT.xsd
@@ -22,9 +22,9 @@ limitations under the License.
            targetNamespace="http://cyclonedx.org/schema/bom/1.2"
            vc:minVersion="1.0"
            vc:maxVersion="1.1"
-           version="1.2.1">
+           version="1.2">
 
-    <xs:import namespace="http://cyclonedx.org/schema/spdx" schemaLocation="spdx.xsd"/>
+    <xs:import namespace="http://cyclonedx.org/schema/spdx" schemaLocation="spdx.SNAPSHOT.xsd"/>
 
     <xs:annotation>
         <xs:documentation>
@@ -593,7 +593,7 @@ limitations under the License.
 
     <xs:simpleType name="mimeType">
         <xs:restriction base="xs:token">
-            <xs:pattern value="[-+a-z0-9.]+/[-+a-z0-9.]+"/>
+            <xs:pattern value="^[-+a-z0-9.]+/[-+a-z0-9.]+$"/>
         </xs:restriction>
     </xs:simpleType>
 
@@ -1415,4 +1415,4 @@ limitations under the License.
             <xs:field xpath="@bom-ref"/>
         </xs:unique>
     </xs:element>
-</xs:schema>
\ No newline at end of file
+</xs:schema>
diff --git a/cyclonedx/__res/schema/bom-1.2b.schema.json b/cyclonedx/__res/schema/bom-1.2b.schema.json
deleted file mode 100644
index be21fb161..000000000
--- a/cyclonedx/__res/schema/bom-1.2b.schema.json
+++ /dev/null
@@ -1,1026 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-07/schema#",
-  "$id": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
-  "type": "object",
-  "title": "CycloneDX Software Bill-of-Material Specification",
-  "$comment" : "CycloneDX JSON schema is published under the terms of the Apache License 2.0.",
-  "required": [
-    "bomFormat",
-    "specVersion",
-    "version"
-  ],
-  "additionalProperties": false,
-  "properties": {
-    "$schema": {
-      "type": "string",
-      "enum": [
-        "http://cyclonedx.org/schema/bom-1.2a.schema.json"
-      ]
-    },
-    "bomFormat": {
-      "$id": "#/properties/bomFormat",
-      "type": "string",
-      "title": "BOM Format",
-      "description": "Specifies the format of the BOM. This helps to identify the file as CycloneDX since BOMs do not have a filename convention nor does JSON schema support namespaces.",
-      "enum": [
-        "CycloneDX"
-      ]
-    },
-    "specVersion": {
-      "$id": "#/properties/specVersion",
-      "type": "string",
-      "title": "CycloneDX Specification Version",
-      "description": "The version of the CycloneDX specification a BOM is written to (starting at version 1.2)",
-      "examples": ["1.2"]
-    },
-    "serialNumber": {
-      "$id": "#/properties/serialNumber",
-      "type": "string",
-      "title": "BOM Serial Number",
-      "description": "Every BOM generated should have a unique serial number, even if the contents of the BOM being generated have not changed over time. The process or tool responsible for creating the BOM should create random UUID's for every BOM generated.",
-      "default": "",
-      "examples": ["urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79"],
-      "pattern": "^urn:uuid:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
-    },
-    "version": {
-      "$id": "#/properties/version",
-      "type": "integer",
-      "title": "BOM Version",
-      "description": "The version allows component publishers/authors to make changes to existing BOMs to update various aspects of the document such as description or licenses. When a system is presented with multiple BOMs for the same component, the system should use the most recent version of the BOM. The default version is '1' and should be incremented for each version of the BOM that is published. Each version of a component should have a unique BOM and if no changes are made to the BOMs, then each BOM will have a version of '1'.",
-      "default": 1,
-      "examples": [1]
-    },
-    "metadata": {
-      "$id": "#/properties/metadata",
-      "$ref": "#/definitions/metadata",
-      "title": "BOM Metadata",
-      "description": "Provides additional information about a BOM."
-    },
-    "components": {
-      "$id": "#/properties/components",
-      "type": "array",
-      "items": {"$ref": "#/definitions/component"},
-      "uniqueItems": true,
-      "title": "Components"
-    },
-    "services": {
-      "$id": "#/properties/services",
-      "type": "array",
-      "items": {"$ref": "#/definitions/service"},
-      "uniqueItems": true,
-      "title": "Services"
-    },
-    "externalReferences": {
-      "$id": "#/properties/externalReferences",
-      "type": "array",
-      "items": {"$ref": "#/definitions/externalReference"},
-      "title": "External References",
-      "description": "External references provide a way to document systems, sites, and information that may be relevant but which are not included with the BOM."
-    },
-    "dependencies": {
-      "$id": "#/properties/dependencies",
-      "type": "array",
-      "items": {"$ref": "#/definitions/dependency"},
-      "uniqueItems": true,
-      "title": "Dependencies",
-      "description": "Provides the ability to document dependency relationships."
-    }
-  },
-  "definitions": {
-    "metadata": {
-      "type": "object",
-      "title": "BOM Metadata Object",
-      "additionalProperties": false,
-      "properties": {
-        "timestamp": {
-          "type": "string",
-          "format": "date-time",
-          "title": "Timestamp",
-          "description": "The date and time (timestamp) when the document was created."
-        },
-        "tools": {
-          "type": "array",
-          "title": "Creation Tools",
-          "description": "The tool(s) used in the creation of the BOM.",
-          "items": {"$ref": "#/definitions/tool"}
-        },
-        "authors" :{
-          "type": "array",
-          "title": "Authors",
-          "description": "The person(s) who created the BOM. Authors are common in BOMs created through manual processes. BOMs created through automated means may not have authors.",
-          "items": {"$ref": "#/definitions/organizationalContact"}
-        },
-        "component": {
-          "title": "Component",
-          "description": "The component that the BOM describes.",
-          "$ref": "#/definitions/component"
-        },
-        "manufacture": {
-          "title": "Manufacture",
-          "description": "The organization that manufactured the component that the BOM describes.",
-          "$ref": "#/definitions/organizationalEntity"
-        },
-        "supplier": {
-          "title": "Supplier",
-          "description": " The organization that supplied the component that the BOM describes. The supplier may often be the manufacture, but may also be a distributor or repackager.",
-          "$ref": "#/definitions/organizationalEntity"
-        }
-      }
-    },
-    "tool": {
-      "type": "object",
-      "title": "Tool",
-      "description": "The tool used to create the BOM.",
-      "additionalProperties": false,
-      "properties": {
-        "vendor": {
-          "type": "string",
-          "format": "string",
-          "title": "Tool Vendor",
-          "description": "The date and time (timestamp) when the document was created."
-        },
-        "name": {
-          "type": "string",
-          "format": "string",
-          "title": "Tool Name",
-          "description": "The date and time (timestamp) when the document was created."
-        },
-        "version": {
-          "type": "string",
-          "format": "string",
-          "title": "Tool Version",
-          "description": "The date and time (timestamp) when the document was created."
-        },
-        "hashes": {
-          "$id": "#/definitions/tool/properties/hashes",
-          "type": "array",
-          "items": {"$ref": "#/definitions/hash"},
-          "title": "Hashes",
-          "description": "The hashes of the tool (if applicable)."
-        }
-      }
-    },
-    "organizationalEntity": {
-      "type": "object",
-      "title": "Organizational Entity Object",
-      "description": "",
-      "additionalProperties": false,
-      "properties": {
-        "name": {
-          "type": "string",
-          "title": "Name",
-          "description": "The name of the organization",
-          "default": "",
-          "examples": [
-            "Example Inc."
-          ],
-          "pattern": "^(.*)$"
-        },
-        "url": {
-          "type": "array",
-          "title": "URL",
-          "description": "The URL of the organization. Multiple URLs are allowed.",
-          "default": "",
-          "examples": ["https://example.com"],
-          "pattern": "^(.*)$"
-        },
-        "contact": {
-          "type": "array",
-          "title": "Contact",
-          "description": "A contact at the organization. Multiple contacts are allowed.",
-          "items": {"$ref": "#/definitions/organizationalContact"}
-        }
-      }
-    },
-    "organizationalContact": {
-      "type": "object",
-      "title": "Organizational Contact Object",
-      "description": "",
-      "additionalProperties": false,
-      "properties": {
-        "name": {
-          "type": "string",
-          "title": "Name",
-          "description": "The name of a contact",
-          "default": "",
-          "examples": ["Contact name"],
-          "pattern": "^(.*)$"
-        },
-        "email": {
-          "type": "string",
-          "title": "Email Address",
-          "description": "The email address of the contact. Multiple email addresses are allowed.",
-          "default": "",
-          "examples": ["firstname.lastname@example.com"],
-          "pattern": "^(.*)$"
-        },
-        "phone": {
-          "type": "string",
-          "title": "Phone",
-          "description": "The phone number of the contact. Multiple phone numbers are allowed.",
-          "default": "",
-          "examples": ["800-555-1212"],
-          "pattern": "^(.*)$"
-        }
-      }
-    },
-    "component": {
-      "type": "object",
-      "title": "Component Object",
-      "required": [
-        "type",
-        "name",
-        "version"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "type": {
-          "type": "string",
-          "enum": [
-            "application",
-            "framework",
-            "library",
-            "container",
-            "operating-system",
-            "device",
-            "firmware",
-            "file"
-          ],
-          "title": "Component Type",
-          "description": "Specifies the type of component. For software components, classify as application if no more specific appropriate classification is available or cannot be determined for the component.",
-          "default": "",
-          "examples": ["library"],
-          "pattern": "^(.*)$"
-        },
-        "mime-type": {
-          "type": "string",
-          "title": "Mime-Type",
-          "description": "The optional mime-type of the component. When used on file components, the mime-type can provide additional context about the kind of file being represented such as an image, font, or executable. Some library or framework components may also have an associated mime-type.",
-          "default": "",
-          "examples": ["image/jpeg"],
-          "pattern": "^[-+a-z0-9.]+/[-+a-z0-9.]+$"
-        },
-        "bom-ref": {
-          "type": "string",
-          "title": "BOM Reference",
-          "description": "An optional identifier which can be used to reference the component elsewhere in the BOM. Every bom-ref should be unique.",
-          "default": "",
-          "pattern": "^(.*)$"
-        },
-        "supplier": {
-          "title": "Component Supplier",
-          "description": " The organization that supplied the component. The supplier may often be the manufacture, but may also be a distributor or repackager.",
-          "$ref": "#/definitions/organizationalEntity"
-        },
-        "author": {
-          "type": "string",
-          "title": "Component Author",
-          "description": "The person(s) or organization(s) that authored the component",
-          "default": "",
-          "examples": ["Acme Inc"],
-          "pattern": "^(.*)$"
-        },
-        "publisher": {
-          "type": "string",
-          "title": "Component Publisher",
-          "description": "The person(s) or organization(s) that published the component",
-          "default": "",
-          "examples": ["Acme Inc"],
-          "pattern": "^(.*)$"
-        },
-        "group": {
-          "type": "string",
-          "title": "Component Group",
-          "description": "The grouping name or identifier. This will often be a shortened, single name of the company or project that produced the component, or the source package or domain name. Whitespace and special characters should be avoided. Examples include: apache, org.apache.commons, and apache.org.",
-          "default": "",
-          "examples": ["com.acme"],
-          "pattern": "^(.*)$"
-        },
-        "name": {
-          "type": "string",
-          "title": "Component Name",
-          "description": "The name of the component. This will often be a shortened, single name of the component. Examples: commons-lang3 and jquery",
-          "default": "",
-          "examples": ["tomcat-catalina"],
-          "pattern": "^(.*)$"
-        },
-        "version": {
-          "type": "string",
-          "title": "Component Version",
-          "description": "The component version. The version should ideally comply with semantic versioning but is not enforced.",
-          "default": "",
-          "examples": ["9.0.14"],
-          "pattern": "^(.*)$"
-        },
-        "description": {
-          "type": "string",
-          "title": "Component Description",
-          "description": "Specifies a description for the component",
-          "default": "",
-          "pattern": "^(.*)$"
-        },
-        "scope": {
-          "type": "string",
-          "enum": [
-            "required",
-            "optional",
-            "excluded"
-          ],
-          "title": "Component Scope",
-          "description": "Specifies the scope of the component. If scope is not specified, 'required' scope should be assumed by the consumer of the BOM",
-          "default": "required",
-          "pattern": "^(.*)$"
-        },
-        "hashes": {
-          "type": "array",
-          "title": "Component Hashes",
-          "items": {"$ref": "#/definitions/hash"}
-        },
-        "licenses": {
-          "type": "array",
-          "title": "Component License(s)",
-          "items": {
-            "additionalProperties": false,
-            "properties": {
-              "license": {
-                "$ref": "#/definitions/license"
-              },
-              "expression": {
-                "type": "string",
-                "title": "SPDX License Expression",
-                "examples": [
-                  "Apache-2.0 AND (MIT OR GPL-2.0-only)",
-                  "GPL-3.0-only WITH Classpath-exception-2.0"
-                ],
-                "pattern": "^(.*)$"
-              }
-            },
-            "oneOf":[
-              {
-                "required": ["license"]
-              },
-              {
-                "required": ["expression"]
-              }
-            ]
-          }
-        },
-        "copyright": {
-          "type": "string",
-          "title": "Component Copyright",
-          "description": "An optional copyright notice informing users of the underlying claims to copyright ownership in a published work.",
-          "examples": ["Acme Inc"],
-          "pattern": "^(.*)$"
-        },
-        "cpe": {
-          "type": "string",
-          "title": "Component Common Platform Enumeration (CPE)",
-          "description": "DEPRECATED - DO NOT USE. This will be removed in a future version. Specifies a well-formed CPE name. See https://nvd.nist.gov/products/cpe",
-          "examples": ["cpe:2.3:a:acme:component_framework:-:*:*:*:*:*:*:*"],
-          "pattern": "^(.*)$"
-        },
-        "purl": {
-          "type": "string",
-          "title": "Component Package URL (purl)",
-          "default": "",
-          "examples": ["pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar"],
-          "pattern": "^(.*)$"
-        },
-        "swid": {
-          "$ref": "#/definitions/swid",
-          "title": "SWID Tag",
-          "description": "Specifies metadata and content for ISO-IEC 19770-2 Software Identification (SWID) Tags."
-        },
-        "modified": {
-          "type": "boolean",
-          "title": "Component Modified From Original",
-          "description": "DEPRECATED - DO NOT USE. This will be removed in a future version. Use the pedigree element instead to supply information on exactly how the component was modified. A boolean value indicating is the component has been modified from the original. A value of true indicates the component is a derivative of the original. A value of false indicates the component has not been modified from the original."
-        },
-        "pedigree": {
-          "type": "object",
-          "title": "Component Pedigree",
-          "description": "Component pedigree is a way to document complex supply chain scenarios where components are created, distributed, modified, redistributed, combined with other components, etc. Pedigree supports viewing this complex chain from the beginning, the end, or anywhere in the middle. It also provides a way to document variants where the exact relation may not be known.",
-          "additionalProperties": false,
-          "properties": {
-            "ancestors": {
-              "type": "array",
-              "title": "Ancestors",
-              "description": "Describes zero or more components in which a component is derived from. This is commonly used to describe forks from existing projects where the forked version contains a ancestor node containing the original component it was forked from. For example, Component A is the original component. Component B is the component being used and documented in the BOM. However, Component B contains a pedigree node with a single ancestor documenting Component A - the original component from which Component B is derived from.",
-              "items": {"$ref": "#/definitions/component"}
-            },
-            "descendants": {
-              "type": "array",
-              "title": "Descendants",
-              "description": "Descendants are the exact opposite of ancestors. This provides a way to document all forks (and their forks) of an original or root component.",
-              "items": {"$ref": "#/definitions/component"}
-            },
-            "variants": {
-              "type": "array",
-              "title": "Variants",
-              "description": "Variants describe relations where the relationship between the components are not known. For example, if Component A contains nearly identical code to Component B. They are both related, but it is unclear if one is derived from the other, or if they share a common ancestor.",
-              "items": {"$ref": "#/definitions/component"}
-            },
-            "commits": {
-              "type": "array",
-              "title": "Commits",
-              "description": "A list of zero or more commits which provide a trail describing how the component deviates from an ancestor, descendant, or variant.",
-              "items": {"$ref": "#/definitions/commit"}
-            },
-            "patches": {
-              "type": "array",
-              "title": "Patches",
-              "description": ">A list of zero or more patches describing how the component deviates from an ancestor, descendant, or variant. Patches may be complimentary to commits or may be used in place of commits.",
-              "items": {"$ref": "#/definitions/patch"}
-            },
-            "notes": {
-              "type": "string",
-              "title": "Notes",
-              "description": "Notes, observations, and other non-structured commentary describing the components pedigree.",
-              "pattern": "^(.*)$"
-            }
-          }
-        },
-        "externalReferences": {
-          "type": "array",
-          "items": {"$ref": "#/definitions/externalReference"},
-          "title": "External References"
-        },
-        "components": {
-          "$id": "#/definitions/component/properties/components",
-          "type": "array",
-          "items": {"$ref": "#/definitions/component"},
-          "uniqueItems": true,
-          "title": "Components"
-        }
-      }
-    },
-    "swid": {
-      "type": "object",
-      "title": "SWID Tag",
-      "description": "Specifies metadata and content for ISO-IEC 19770-2 Software Identification (SWID) Tags.",
-      "required": [
-        "tagId",
-        "name"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "tagId": {
-          "type": "string",
-          "title": "Tag ID",
-          "description": "Maps to the tagId of a SoftwareIdentity."
-        },
-        "name": {
-          "type": "string",
-          "title": "Name",
-          "description": "Maps to the name of a SoftwareIdentity."
-        },
-        "version": {
-          "type": "string",
-          "title": "Version",
-          "default": "0.0",
-          "description": "Maps to the version of a SoftwareIdentity."
-        },
-        "tagVersion": {
-          "type": "integer",
-          "title": "Tag Version",
-          "default": 0,
-          "description": "Maps to the tagVersion of a SoftwareIdentity."
-        },
-        "patch": {
-          "type": "boolean",
-          "title": "Patch",
-          "default": false,
-          "description": "Maps to the patch of a SoftwareIdentity."
-        },
-        "text": {
-          "title": "Attachment text",
-          "description": "Specifies the metadata and content of the SWID tag.",
-          "$ref": "#/definitions/attachment"
-        },
-        "url": {
-          "type": "string",
-          "title": "URL",
-          "default": "The URL to the SWID file.",
-          "pattern": "^(.*)$"
-        }
-      }
-    },
-    "attachment": {
-      "type": "object",
-      "title": "Attachment",
-      "description": "Specifies the metadata and content for an attachment.",
-      "required": [
-        "content"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "contentType": {
-          "type": "string",
-          "title": "Content-Type",
-          "description": "Specifies the content type of the text. Defaults to text/plain if not specified.",
-          "default": "text/plain"
-        },
-        "encoding": {
-          "type": "string",
-          "title": "Encoding",
-          "description": "Specifies the optional encoding the text is represented in.",
-          "enum": [
-            "base64"
-          ],
-          "default": "",
-          "pattern": "^(.*)$"
-        },
-        "content": {
-          "type": "string",
-          "title": "Attachment Text",
-          "description": "The attachment data"
-        }
-      }
-    },
-    "hash": {
-      "type": "object",
-      "title": "Hash Objects",
-      "required": [
-        "alg",
-        "content"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "alg": {
-          "$ref": "#/definitions/hash-alg"
-        },
-        "content": {
-          "$ref": "#/definitions/hash-content"
-        }
-      }
-    },
-    "hash-alg": {
-      "type": "string",
-      "enum": [
-        "MD5",
-        "SHA-1",
-        "SHA-256",
-        "SHA-384",
-        "SHA-512",
-        "SHA3-256",
-        "SHA3-384",
-        "SHA3-512",
-        "BLAKE2b-256",
-        "BLAKE2b-384",
-        "BLAKE2b-512",
-        "BLAKE3"
-      ],
-      "title": "Hash Algorithm",
-      "default": "",
-      "pattern": "^(.*)$"
-    },
-    "hash-content": {
-      "type": "string",
-      "title": "Hash Content (value)",
-      "default": "",
-      "examples": ["3942447fac867ae5cdb3229b658f4d48"],
-      "pattern": "^([a-fA-F0-9]{32}|[a-fA-F0-9]{40}|[a-fA-F0-9]{64}|[a-fA-F0-9]{96}|[a-fA-F0-9]{128})$"
-    },
-    "license": {
-      "type": "object",
-      "title": "License Object",
-      "oneOf": [
-        {
-          "required": ["id"]
-        },
-        {
-          "required": ["name"]
-        }
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "id": {
-          "$ref": "spdx.schema.json",
-          "title": "License ID (SPDX)",
-          "description": "A valid SPDX license ID",
-          "examples": ["Apache-2.0"]
-        },
-        "name": {
-          "type": "string",
-          "title": "License Name",
-          "description": "If SPDX does not define the license used, this field may be used to provide the license name",
-          "default": "",
-          "examples": ["Acme Software License"],
-          "pattern": "^(.*)$"
-        },
-        "text": {
-          "title": "License text",
-          "description": "An optional way to include the textual content of a license.",
-          "$ref": "#/definitions/attachment"
-        },
-        "url": {
-          "type": "string",
-          "title": "License URL",
-          "description": "The URL to the license file. If specified, a 'license' externalReference should also be specified for completeness",
-          "examples": ["https://www.apache.org/licenses/LICENSE-2.0.txt"],
-          "pattern": "^(.*)$"
-        }
-      }
-    },
-    "commit": {
-      "type": "object",
-      "title": "Commit",
-      "description": "Specifies an individual commit",
-      "additionalProperties": false,
-      "properties": {
-        "uid": {
-          "type": "string",
-          "title": "UID",
-          "description": "A unique identifier of the commit. This may be version control specific. For example, Subversion uses revision numbers whereas git uses commit hashes.",
-          "pattern": "^(.*)$"
-        },
-        "url": {
-          "type": "string",
-          "title": "URL",
-          "description": "The URL to the commit. This URL will typically point to a commit in a version control system.",
-          "format": "iri-reference"
-        },
-        "author": {
-          "title": "Author",
-          "description": "The author who created the changes in the commit",
-          "$ref": "#/definitions/identifiableAction"
-        },
-        "committer": {
-          "title": "Committer",
-          "description": "The person who committed or pushed the commit",
-          "$ref": "#/definitions/identifiableAction"
-        },
-        "message": {
-          "type": "string",
-          "title": "Message",
-          "description": "The text description of the contents of the commit",
-          "pattern": "^(.*)$"
-        }
-      }
-    },
-    "patch": {
-      "type": "object",
-      "title": "Patch",
-      "description": "Specifies an individual patch",
-      "required": [
-        "type"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "type": {
-          "type": "string",
-          "enum": [
-            "unofficial",
-            "monkey",
-            "backport",
-            "cherry-pick"
-          ],
-          "title": "Type",
-          "description": "Specifies the purpose for the patch including the resolution of defects, security issues, or new behavior or functionality"
-        },
-        "diff": {
-          "title": "Diff",
-          "description": "The patch file (or diff) that show changes. Refer to https://en.wikipedia.org/wiki/Diff",
-          "$ref": "#/definitions/diff"
-        },
-        "resolves": {
-          "type": "array",
-          "items": {"$ref": "#/definitions/issue"},
-          "title": "Resolves",
-          "description": "A collection of issues the patch resolves"
-        }
-      }
-    },
-    "diff": {
-      "type": "object",
-      "title": "Diff",
-      "description": "The patch file (or diff) that show changes. Refer to https://en.wikipedia.org/wiki/Diff",
-      "additionalProperties": false,
-      "properties": {
-        "text": {
-          "title": "Diff text",
-          "description": "Specifies the optional text of the diff",
-          "$ref": "#/definitions/attachment"
-        },
-        "url": {
-          "type": "string",
-          "title": "URL",
-          "description": "Specifies the URL to the diff",
-          "pattern": "^(.*)$"
-        }
-      }
-    },
-    "issue": {
-      "type": "object",
-      "title": "Diff",
-      "description": "The patch file (or diff) that show changes. Refer to https://en.wikipedia.org/wiki/Diff",
-      "required": [
-        "type"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "type": {
-          "type": "string",
-          "enum": [
-            "defect",
-            "enhancement",
-            "security"
-          ],
-          "title": "Type",
-          "description": "Specifies the type of issue"
-        },
-        "id": {
-          "type": "string",
-          "title": "ID",
-          "description": "The identifier of the issue assigned by the source of the issue",
-          "pattern": "^(.*)$"
-        },
-        "name": {
-          "type": "string",
-          "title": "Name",
-          "description": "The name of the issue",
-          "pattern": "^(.*)$"
-        },
-        "description": {
-          "type": "string",
-          "title": "Description",
-          "description": "A description of the issue",
-          "pattern": "^(.*)$"
-        },
-        "source": {
-          "type": "object",
-          "title": "Source",
-          "description": "The source of the issue where it is documented",
-          "additionalProperties": false,
-          "properties": {
-            "name": {
-              "type": "string",
-              "title": "Name",
-              "description": "The name of the source. For example 'National Vulnerability Database', 'NVD', and 'Apache'",
-              "pattern": "^(.*)$"
-            },
-            "url": {
-              "type": "string",
-              "title": "URL",
-              "description": "The url of the issue documentation as provided by the source",
-              "pattern": "^(.*)$"
-            }
-          }
-        },
-        "references": {
-          "type": "array",
-          "title": "References",
-          "description": "A collection of URL's for reference. Multiple URLs are allowed.",
-          "default": "",
-          "examples": ["https://example.com"],
-          "pattern": "^(.*)$"
-        }
-      }
-    },
-    "identifiableAction": {
-      "type": "object",
-      "title": "Identifiable Action",
-      "description": "Specifies an individual commit",
-      "additionalProperties": false,
-      "properties": {
-        "timestamp": {
-          "type": "string",
-          "format": "date-time",
-          "title": "Timestamp",
-          "description": "The timestamp in which the action occurred"
-        },
-        "name": {
-          "type": "string",
-          "title": "Name",
-          "description": "The name of the individual who performed the action",
-          "pattern": "^(.*)$"
-        },
-        "email": {
-          "type": "string",
-          "format": "idn-email",
-          "title": "E-mail",
-          "description": "The email address of the individual who performed the action"
-        }
-      }
-    },
-    "externalReference": {
-      "type": "object",
-      "title": "External Reference",
-      "description": "Specifies an individual external reference",
-      "required": [
-        "url",
-        "type"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "url": {
-          "type": "string",
-          "title": "URL",
-          "description": "The URL to the external reference",
-          "pattern": "^(.*)$"
-        },
-        "comment": {
-          "type": "string",
-          "title": "Comment",
-          "description": "An optional comment describing the external reference",
-          "pattern": "^(.*)$"
-        },
-        "type": {
-          "type": "string",
-          "title": "Type",
-          "description": "Specifies the type of external reference. There are built-in types to describe common references. If a type does not exist for the reference being referred to, use the \"other\" type.",
-          "enum": [
-            "vcs",
-            "issue-tracker",
-            "website",
-            "advisories",
-            "bom",
-            "mailing-list",
-            "social",
-            "chat",
-            "documentation",
-            "support",
-            "distribution",
-            "license",
-            "build-meta",
-            "build-system",
-            "other"
-          ]
-        }
-      }
-    },
-    "dependency": {
-      "type": "object",
-      "title": "Dependency",
-      "description": "Defines the direct dependencies of a component. Components that do not have their own dependencies MUST be declared as empty elements within the graph. Components that are not represented in the dependency graph MAY have unknown dependencies. It is RECOMMENDED that implementations assume this to be opaque and not an indicator of a component being dependency-free.",
-      "required": [
-        "ref"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "ref": {
-          "type": "string",
-          "format": "string",
-          "title": "Reference",
-          "description": "References a component by the components bom-ref attribute"
-        },
-        "dependsOn": {
-          "type": "array",
-          "uniqueItems": true,
-          "items": {
-            "type": "string"
-          },
-          "title": "Depends On",
-          "description": "The bom-ref identifiers of the components that are dependencies of this dependency object."
-        }
-      }
-    },
-    "service": {
-      "type": "object",
-      "title": "Service Object",
-      "required": [
-        "name"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "bom-ref": {
-          "type": "string",
-          "title": "BOM Reference",
-          "description": "An optional identifier which can be used to reference the service elsewhere in the BOM. Every bom-ref should be unique.",
-          "default": "",
-          "pattern": "^(.*)$"
-        },
-        "provider": {
-          "title": "Provider",
-          "description": "The organization that provides the service.",
-          "$ref": "#/definitions/organizationalEntity"
-        },
-        "group": {
-          "type": "string",
-          "title": "Service Group",
-          "description": "The grouping name, namespace, or identifier. This will often be a shortened, single name of the company or project that produced the service or domain name. Whitespace and special characters should be avoided.",
-          "default": "",
-          "examples": ["com.acme"],
-          "pattern": "^(.*)$"
-        },
-        "name": {
-          "type": "string",
-          "title": "Service Name",
-          "description": "The name of the service. This will often be a shortened, single name of the service.",
-          "default": "",
-          "examples": ["ticker-service"],
-          "pattern": "^(.*)$"
-        },
-        "version": {
-          "type": "string",
-          "title": "Service Version",
-          "description": "The service version.",
-          "default": "",
-          "examples": ["1.0.0"],
-          "pattern": "^(.*)$"
-        },
-        "description": {
-          "type": "string",
-          "title": "Service Description",
-          "description": "Specifies a description for the service",
-          "default": "",
-          "pattern": "^(.*)$"
-        },
-        "endpoints": {
-          "type": "array",
-          "title": "Endpoints",
-          "description": "The endpoint URIs of the service. Multiple endpoints are allowed.",
-          "default": "",
-          "examples": ["https://example.com/api/v1/ticker"],
-          "pattern": "^(.*)$"
-        },
-        "authenticated": {
-          "type": "boolean",
-          "title": "Authentication Required",
-          "description": "A boolean value indicating if the service requires authentication. A value of true indicates the service requires authentication prior to use. A value of false indicates the service does not require authentication."
-        },
-        "x-trust-boundary": {
-          "type": "boolean",
-          "title": "Crosses Trust Boundary",
-          "description": "A boolean value indicating if use of the service crosses a trust zone or boundary. A value of true indicates that by using the service, a trust boundary is crossed. A value of false indicates that by using the service, a trust boundary is not crossed."
-        },
-        "data": {
-          "type": "array",
-          "items": {"$ref": "#/definitions/dataClassification"},
-          "title": "Data Classification",
-          "description": "Specifies the data classification."
-        },
-        "licenses": {
-          "type": "array",
-          "title": "Component License(s)",
-          "items": {
-            "additionalProperties": false,
-            "properties": {
-              "license": {
-                "$ref": "#/definitions/license"
-              },
-              "expression": {
-                "type": "string",
-                "title": "SPDX License Expression",
-                "examples": [
-                  "Apache-2.0 AND (MIT OR GPL-2.0-only)",
-                  "GPL-3.0-only WITH Classpath-exception-2.0"
-                ],
-                "pattern": "^(.*)$"
-              }
-            },
-            "oneOf":[
-              {
-                "required": ["license"]
-              },
-              {
-                "required": ["expression"]
-              }
-            ]
-          }
-        },
-        "externalReferences": {
-          "type": "array",
-          "items": {"$ref": "#/definitions/externalReference"},
-          "title": "External References"
-        },
-        "services": {
-          "$id": "#/definitions/service/properties/services",
-          "type": "array",
-          "items": {"$ref": "#/definitions/service"},
-          "uniqueItems": true,
-          "title": "Services"
-        }
-      }
-    },
-    "dataClassification": {
-      "type": "object",
-      "title": "Hash Objects",
-      "required": [
-        "flow",
-        "classification"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "flow": {
-          "$ref": "#/definitions/dataFlow"
-        },
-        "classification": {
-          "type": "string"
-        }
-      }
-    },
-    "dataFlow": {
-      "type": "string",
-      "enum": [
-        "inbound",
-        "outbound",
-        "bi-directional",
-        "unknown"
-      ],
-      "title": "Data flow direction",
-      "default": "",
-      "pattern": "^(.*)$"
-    }
-  }
-}
diff --git a/cyclonedx/__res/schema/bom-1.3-strict.schema.json b/cyclonedx/__res/schema/bom-1.3-strict.SNAPSHOT.schema.json
similarity index 99%
rename from cyclonedx/__res/schema/bom-1.3-strict.schema.json
rename to cyclonedx/__res/schema/bom-1.3-strict.SNAPSHOT.schema.json
index 35c8c2e5e..5e9d273b4 100644
--- a/cyclonedx/__res/schema/bom-1.3-strict.schema.json
+++ b/cyclonedx/__res/schema/bom-1.3-strict.SNAPSHOT.schema.json
@@ -6,8 +6,7 @@
   "$comment" : "CycloneDX JSON schema is published under the terms of the Apache License 2.0.",
   "required": [
     "bomFormat",
-    "specVersion",
-    "version"
+    "specVersion"
   ],
   "additionalProperties": false,
   "properties": {
@@ -563,7 +562,7 @@
       "additionalProperties": false,
       "properties": {
         "id": {
-          "$ref": "spdx.schema.json",
+          "$ref": "spdx.SNAPSHOT.schema.json",
           "title": "License ID (SPDX)",
           "description": "A valid SPDX license ID",
           "examples": ["Apache-2.0"]
@@ -1082,4 +1081,4 @@
       }
     }
   }
-}
\ No newline at end of file
+}
diff --git a/cyclonedx/__res/schema/bom-1.3.schema.json b/cyclonedx/__res/schema/bom-1.3.SNAPSHOT.schema.json
similarity index 99%
rename from cyclonedx/__res/schema/bom-1.3.schema.json
rename to cyclonedx/__res/schema/bom-1.3.SNAPSHOT.schema.json
index fdec97367..5ccecf893 100644
--- a/cyclonedx/__res/schema/bom-1.3.schema.json
+++ b/cyclonedx/__res/schema/bom-1.3.SNAPSHOT.schema.json
@@ -6,8 +6,7 @@
   "$comment" : "CycloneDX JSON schema is published under the terms of the Apache License 2.0.",
   "required": [
     "bomFormat",
-    "specVersion",
-    "version"
+    "specVersion"
   ],
   "properties": {
     "bomFormat": {
@@ -546,7 +545,7 @@
       ],
       "properties": {
         "id": {
-          "$ref": "spdx.schema.json",
+          "$ref": "spdx.SNAPSHOT.schema.json",
           "title": "License ID (SPDX)",
           "description": "A valid SPDX license ID",
           "examples": ["Apache-2.0"]
diff --git a/cyclonedx/__res/schema/bom-1.3.xsd b/cyclonedx/__res/schema/bom-1.3.SNAPSHOT.xsd
similarity index 99%
rename from cyclonedx/__res/schema/bom-1.3.xsd
rename to cyclonedx/__res/schema/bom-1.3.SNAPSHOT.xsd
index 904d63698..0c411a3e3 100644
--- a/cyclonedx/__res/schema/bom-1.3.xsd
+++ b/cyclonedx/__res/schema/bom-1.3.SNAPSHOT.xsd
@@ -22,9 +22,9 @@ limitations under the License.
            targetNamespace="http://cyclonedx.org/schema/bom/1.3"
            vc:minVersion="1.0"
            vc:maxVersion="1.1"
-           version="1.3.1">
+           version="1.3">
 
-    <xs:import namespace="http://cyclonedx.org/schema/spdx" schemaLocation="spdx.xsd"/>
+    <xs:import namespace="http://cyclonedx.org/schema/spdx" schemaLocation="spdx.SNAPSHOT.xsd"/>
 
     <xs:annotation>
         <xs:documentation>
@@ -598,7 +598,7 @@ limitations under the License.
 
     <xs:simpleType name="mimeType">
         <xs:restriction base="xs:token">
-            <xs:pattern value="[-+a-z0-9.]+/[-+a-z0-9.]+"/>
+            <xs:pattern value="^[-+a-z0-9.]+/[-+a-z0-9.]+$"/>
         </xs:restriction>
     </xs:simpleType>
 
@@ -1628,4 +1628,4 @@ limitations under the License.
             <xs:field xpath="@bom-ref"/>
         </xs:unique>
     </xs:element>
-</xs:schema>
\ No newline at end of file
+</xs:schema>
diff --git a/cyclonedx/__res/schema/bom-1.3.proto b/cyclonedx/__res/schema/bom-1.3.proto
deleted file mode 100644
index 5c9926b20..000000000
--- a/cyclonedx/__res/schema/bom-1.3.proto
+++ /dev/null
@@ -1,452 +0,0 @@
-syntax = "proto3";
-package cyclonedx.v1_3;
-import "google/protobuf/timestamp.proto";
-
-// Specifies attributes of the text
-message AttachedText {
-  // Specifies the content type of the text. Defaults to text/plain if not specified.
-  optional string content_type = 1;
-  // Specifies the optional encoding the text is represented in
-  optional string encoding = 2;
-  // SimpleContent value of element
-  string value = 3;
-}
-
-message Bom {
-  // The version of the CycloneDX specification a BOM is written to (starting at version 1.3)
-  string spec_version = 1;
-  // The version allows component publishers/authors to make changes to existing BOMs to update various aspects of the document such as description or licenses. When a system is presented with multiple BOMs for the same component, the system should use the most recent version of the BOM. The default version is '1' and should be incremented for each version of the BOM that is published. Each version of a component should have a unique BOM and if no changes are made to the BOMs, then each BOM will have a version of '1'.
-  optional int32 version = 2;
-  // Every BOM generated should have a unique serial number, even if the contents of the BOM being generated have not changed over time. The process or tool responsible for creating the BOM should create random UUID's for every BOM generated.
-  optional string serial_number = 3;
-  // Provides additional information about a BOM.
-  optional Metadata metadata = 4;
-  // Provides the ability to document a list of components.
-  repeated Component components = 5;
-  // Provides the ability to document a list of external services.
-  repeated Service services = 6;
-  // Provides the ability to document external references related to the BOM or to the project the BOM describes.
-  repeated ExternalReference external_references = 7;
-  // Provides the ability to document dependency relationships.
-  repeated Dependency dependencies = 8;
-  // Provides the ability to document aggregate completeness
-  repeated Composition compositions = 9;
-}
-
-enum Classification {
-  CLASSIFICATION_NULL = 0;
-  // A software application. Refer to https://en.wikipedia.org/wiki/Application_software for information about applications.
-  CLASSIFICATION_APPLICATION = 1;
-  // A software framework. Refer to https://en.wikipedia.org/wiki/Software_framework for information on how frameworks vary slightly from libraries.
-  CLASSIFICATION_FRAMEWORK = 2;
-  // A software library. Refer to https://en.wikipedia.org/wiki/Library_(computing) for information about libraries. All third-party and open source reusable components will likely be a library. If the library also has key features of a framework, then it should be classified as a framework. If not, or is unknown, then specifying library is recommended.
-  CLASSIFICATION_LIBRARY = 3;
-  // A software operating system without regard to deployment model (i.e. installed on physical hardware, virtual machine, image, etc) Refer to https://en.wikipedia.org/wiki/Operating_system
-  CLASSIFICATION_OPERATING_SYSTEM = 4;
-  // A hardware device such as a processor, or chip-set. A hardware device containing firmware should include a component for the physical hardware itself, and another component of type 'firmware' or 'operating-system' (whichever is relevant), describing information about the software running on the device.
-  CLASSIFICATION_DEVICE = 5;
-  // A computer file. Refer to https://en.wikipedia.org/wiki/Computer_file for information about files.
-  CLASSIFICATION_FILE = 6;
-  // A packaging and/or runtime format, not specific to any particular technology, which isolates software inside the container from software outside of a container through virtualization technology. Refer to https://en.wikipedia.org/wiki/OS-level_virtualization
-  CLASSIFICATION_CONTAINER = 7;
-  // A special type of software that provides low-level control over a devices hardware. Refer to https://en.wikipedia.org/wiki/Firmware
-  CLASSIFICATION_FIRMWARE = 8;
-}
-
-message Commit {
-  // A unique identifier of the commit. This may be version control specific. For example, Subversion uses revision numbers whereas git uses commit hashes.
-  optional string uid = 1;
-  // The URL to the commit. This URL will typically point to a commit in a version control system.
-  optional string url = 2;
-  // The author who created the changes in the commit
-  optional IdentifiableAction author = 3;
-  // The person who committed or pushed the commit
-  optional IdentifiableAction committer = 4;
-  // The text description of the contents of the commit
-  optional string message = 5;
-}
-
-message Component {
-  // Specifies the type of component. For software components, classify as application if no more specific appropriate classification is available or cannot be determined for the component.
-  Classification type = 1;
-  // The optional mime-type of the component. When used on file components, the mime-type can provide additional context about the kind of file being represented such as an image, font, or executable. Some library or framework components may also have an associated mime-type.
-  optional string mime_type = 2;
-  // An optional identifier which can be used to reference the component elsewhere in the BOM. Uniqueness is enforced within all elements and children of the root-level bom element.
-  optional string bom_ref = 3;
-  // The organization that supplied the component. The supplier may often be the manufacture, but may also be a distributor or repackager.
-  optional OrganizationalEntity supplier = 4;
-  // The person(s) or organization(s) that authored the component
-  optional string author = 5;
-  // The person(s) or organization(s) that published the component
-  optional string publisher = 6;
-  // The grouping name or identifier. This will often be a shortened, single name of the company or project that produced the component, or the source package or domain name. Whitespace and special characters should be avoided. Examples include: apache, org.apache.commons, and apache.org.
-  optional string group = 7;
-  // The name of the component. This will often be a shortened, single name of the component. Examples: commons-lang3 and jquery
-  string name = 8;
-  // The component version. The version should ideally comply with semantic versioning but is not enforced.
-  string version = 9;
-  // Specifies a description for the component
-  optional string description = 10;
-  // Specifies the scope of the component. If scope is not specified, 'runtime' scope should be assumed by the consumer of the BOM
-  optional Scope scope = 11;
-  repeated Hash hashes = 12;
-  repeated LicenseChoice licenses = 13;
-  // An optional copyright notice informing users of the underlying claims to copyright ownership in a published work.
-  optional string copyright = 14;
-  // DEPRECATED - DO NOT USE. This will be removed in a future version. Specifies a well-formed CPE name. See https://nvd.nist.gov/products/cpe
-  optional string cpe = 15;
-  // Specifies the package-url (PURL). The purl, if specified, must be valid and conform to the specification defined at: https://github.com/package-url/purl-spec
-  optional string purl = 16;
-  // Specifies metadata and content for ISO-IEC 19770-2 Software Identification (SWID) Tags.
-  optional Swid swid = 17;
-  // DEPRECATED - DO NOT USE. This will be removed in a future version. Use the pedigree element instead to supply information on exactly how the component was modified. A boolean value indicating is the component has been modified from the original. A value of true indicates the component is a derivative of the original. A value of false indicates the component has not been modified from the original.
-  optional bool modified = 18;
-  // Component pedigree is a way to document complex supply chain scenarios where components are created, distributed, modified, redistributed, combined with other components, etc.
-  optional Pedigree pedigree = 19;
-  // Provides the ability to document external references related to the component or to the project the component describes.
-  repeated ExternalReference external_references = 20;
-  // Specifies optional sub-components. This is not a dependency tree. It provides a way to specify a hierarchical representation of component assemblies, similar to system -> subsystem -> parts assembly in physical supply chains.
-  repeated Component components = 21;
-  // Specifies optional, custom, properties
-  repeated Property properties = 22;
-  // Specifies optional license and copyright evidence
-  repeated Evidence evidence = 23;
-}
-
-// Specifies the data classification.
-message DataClassification {
-  // Specifies the flow direction of the data.
-  DataFlow flow = 1;
-  // SimpleContent value of element
-  string value = 2;
-}
-
-// Specifies the flow direction of the data. Valid values are: inbound, outbound, bi-directional, and unknown. Direction is relative to the service. Inbound flow states that data enters the service. Outbound flow states that data leaves the service. Bi-directional states that data flows both ways, and unknown states that the direction is not known.
-enum DataFlow {
-  DATA_FLOW_NULL = 0;
-  DATA_FLOW_INBOUND = 1;
-  DATA_FLOW_OUTBOUND = 2;
-  DATA_FLOW_BI_DIRECTIONAL = 3;
-  DATA_FLOW_UNKNOWN = 4;
-}
-
-message Dependency {
-  // References a component or service by the its bom-ref attribute
-  string ref = 1;
-  repeated Dependency dependencies = 2;
-}
-
-message Diff {
-  // Specifies the optional text of the diff
-  optional AttachedText text = 1;
-  // Specifies the URL to the diff
-  optional string url = 2;
-}
-
-message ExternalReference {
-  // Specifies the type of external reference. There are built-in types to describe common references. If a type does not exist for the reference being referred to, use the "other" type.
-  ExternalReferenceType type = 1;
-  // The URL to the external reference
-  string url = 2;
-  // An optional comment describing the external reference
-  optional string comment = 3;
-  // Optional integrity hashes for the external resource content
-  repeated Hash hashes = 4;
-}
-
-enum ExternalReferenceType {
-  // Use this if no other types accurately describe the purpose of the external reference
-  EXTERNAL_REFERENCE_TYPE_OTHER = 0;
-  // Version Control System
-  EXTERNAL_REFERENCE_TYPE_VCS = 1;
-  // Issue or defect tracking system, or an Application Lifecycle Management (ALM) system
-  EXTERNAL_REFERENCE_TYPE_ISSUE_TRACKER = 2;
-  // Website
-  EXTERNAL_REFERENCE_TYPE_WEBSITE = 3;
-  // Security advisories
-  EXTERNAL_REFERENCE_TYPE_ADVISORIES = 4;
-  // Bill-of-material document (CycloneDX, SPDX, SWID, etc)
-  EXTERNAL_REFERENCE_TYPE_BOM = 5;
-  // Mailing list or discussion group
-  EXTERNAL_REFERENCE_TYPE_MAILING_LIST = 6;
-  // Social media account
-  EXTERNAL_REFERENCE_TYPE_SOCIAL = 7;
-  // Real-time chat platform
-  EXTERNAL_REFERENCE_TYPE_CHAT = 8;
-  // Documentation, guides, or how-to instructions
-  EXTERNAL_REFERENCE_TYPE_DOCUMENTATION = 9;
-  // Community or commercial support
-  EXTERNAL_REFERENCE_TYPE_SUPPORT = 10;
-  // Direct or repository download location
-  EXTERNAL_REFERENCE_TYPE_DISTRIBUTION = 11;
-  // The URL to the license file. If a license URL has been defined in the license node, it should also be defined as an external reference for completeness
-  EXTERNAL_REFERENCE_TYPE_LICENSE = 12;
-  // Build-system specific meta file (i.e. pom.xml, package.json, .nuspec, etc)
-  EXTERNAL_REFERENCE_TYPE_BUILD_META = 13;
-  // URL to an automated build system
-  EXTERNAL_REFERENCE_TYPE_BUILD_SYSTEM = 14;
-}
-
-enum HashAlg {
-  HASH_ALG_NULL = 0;
-  HASH_ALG_MD_5 = 1;
-  HASH_ALG_SHA_1 = 2;
-  HASH_ALG_SHA_256 = 3;
-  HASH_ALG_SHA_384 = 4;
-  HASH_ALG_SHA_512 = 5;
-  HASH_ALG_SHA_3_256 = 6;
-  HASH_ALG_SHA_3_384 = 7;
-  HASH_ALG_SHA_3_512 = 8;
-  HASH_ALG_BLAKE_2_B_256 = 9;
-  HASH_ALG_BLAKE_2_B_384 = 10;
-  HASH_ALG_BLAKE_2_B_512 = 11;
-  HASH_ALG_BLAKE_3 = 12;
-}
-
-// Specifies the file hash of the component
-message Hash {
-  // Specifies the algorithm used to create the hash
-  HashAlg alg = 1;
-  // SimpleContent value of element
-  string value = 2;
-}
-
-message IdentifiableAction {
-  // The timestamp in which the action occurred
-  optional google.protobuf.Timestamp timestamp = 1;
-  // The name of the individual who performed the action
-  optional string name = 2;
-  // The email address of the individual who performed the action
-  optional string email = 3;
-}
-
-enum IssueClassification {
-  ISSUE_CLASSIFICATION_NULL = 0;
-  // A fault, flaw, or bug in software
-  ISSUE_CLASSIFICATION_DEFECT = 1;
-  // A new feature or behavior in software
-  ISSUE_CLASSIFICATION_ENHANCEMENT = 2;
-  // A special type of defect which impacts security
-  ISSUE_CLASSIFICATION_SECURITY = 3;
-}
-
-message Issue {
-  // Specifies the type of issue
-  IssueClassification type = 1;
-  // The identifier of the issue assigned by the source of the issue
-  optional string id = 2;
-  // The name of the issue
-  optional string name = 3;
-  // A description of the issue
-  optional string description = 4;
-  optional Source source = 5;
-  repeated string references = 6;
-}
-
-// The source of the issue where it is documented.
-message Source {
-  // The name of the source. For example "National Vulnerability Database", "NVD", and "Apache"
-  optional string name = 1;
-  // The url of the issue documentation as provided by the source
-  optional string url = 2;
-}
-
-message LicenseChoice {
-  oneof choice {
-    License license = 1;
-    string expression = 2;
-  }
-}
-
-message License {
-  oneof license {
-    // A valid SPDX license ID
-    string id = 1;
-    // If SPDX does not define the license used, this field may be used to provide the license name
-    string name = 2;
-  }
-  // Specifies the optional full text of the attachment
-  optional AttachedText text = 3;
-  // The URL to the attachment file. If the attachment is a license or BOM, an externalReference should also be specified for completeness.
-  optional string url = 4;
-}
-
-message Metadata {
-  // The date and time (timestamp) when the document was created.
-  optional google.protobuf.Timestamp timestamp = 1;
-  // The tool(s) used in the creation of the BOM.
-  repeated Tool tools = 2;
-  // The person(s) who created the BOM. Authors are common in BOMs created through manual processes. BOMs created through automated means may not have authors.
-  repeated OrganizationalContact authors = 3;
-  // The component that the BOM describes.
-  optional Component component = 4;
-  // The organization that manufactured the component that the BOM describes.
-  optional OrganizationalEntity manufacture = 5;
-  // The organization that supplied the component that the BOM describes. The supplier may often be the manufacture, but may also be a distributor or repackager.
-  optional OrganizationalEntity supplier = 6;
-  // The license information for the BOM document
-  optional LicenseChoice licenses = 7;
-  // Specifies optional, custom, properties
-  repeated Property properties = 8;
-}
-
-message OrganizationalContact {
-  // The name of the contact
-  optional string name = 1;
-  // The email address of the contact.
-  optional string email = 2;
-  // The phone number of the contact.
-  optional string phone = 3;
-}
-
-message OrganizationalEntity {
-  // The name of the organization
-  optional string name = 1;
-  // The URL of the organization. Multiple URLs are allowed.
-  repeated string url = 2;
-  // A contact person at the organization. Multiple contacts are allowed.
-  repeated OrganizationalContact contact = 3;
-}
-
-enum PatchClassification {
-  PATCH_CLASSIFICATION_NULL = 0;
-  // A patch which is not developed by the creators or maintainers of the software being patched. Refer to https://en.wikipedia.org/wiki/Unofficial_patch
-  PATCH_CLASSIFICATION_UNOFFICIAL = 1;
-  // A patch which dynamically modifies runtime behavior. Refer to https://en.wikipedia.org/wiki/Monkey_patch
-  PATCH_CLASSIFICATION_MONKEY = 2;
-  // A patch which takes code from a newer version of software and applies it to older versions of the same software. Refer to https://en.wikipedia.org/wiki/Backporting
-  PATCH_CLASSIFICATION_BACKPORT = 3;
-  // A patch created by selectively applying commits from other versions or branches of the same software.
-  PATCH_CLASSIFICATION_CHERRY_PICK = 4;
-}
-
-message Patch {
-  // Specifies the purpose for the patch including the resolution of defects, security issues, or new behavior or functionality
-  PatchClassification type = 1;
-  // The patch file (or diff) that show changes. Refer to https://en.wikipedia.org/wiki/Diff
-  optional Diff diff = 2;
-  repeated Issue resolves = 3;
-}
-
-// Component pedigree is a way to document complex supply chain scenarios where components are created, distributed, modified, redistributed, combined with other components, etc. Pedigree supports viewing this complex chain from the beginning, the end, or anywhere in the middle. It also provides a way to document variants where the exact relation may not be known.
-message Pedigree {
-  // Describes zero or more components in which a component is derived from. This is commonly used to describe forks from existing projects where the forked version contains a ancestor node containing the original component it was forked from. For example, Component A is the original component. Component B is the component being used and documented in the BOM. However, Component B contains a pedigree node with a single ancestor documenting Component A - the original component from which Component B is derived from.
-  repeated Component ancestors = 1;
-  // Descendants are the exact opposite of ancestors. This provides a way to document all forks (and their forks) of an original or root component.
-  repeated Component descendants = 2;
-  // Variants describe relations where the relationship between the components are not known. For example, if Component A contains nearly identical code to Component B. They are both related, but it is unclear if one is derived from the other, or if they share a common ancestor.
-  repeated Component variants = 3;
-  // A list of zero or more commits which provide a trail describing how the component deviates from an ancestor, descendant, or variant.
-  repeated Commit commits = 4;
-  // A list of zero or more patches describing how the component deviates from an ancestor, descendant, or variant. Patches may be complimentary to commits or may be used in place of commits.
-  repeated Patch patches = 5;
-  // Notes, observations, and other non-structured commentary describing the components pedigree.
-  optional string notes = 6;
-}
-
-enum Scope {
-  // Default
-  SCOPE_UNSPECIFIED = 0;
-  // The component is required for runtime
-  SCOPE_REQUIRED = 1;
-  // The component is optional at runtime. Optional components are components that are not capable of being called due to them not be installed or otherwise accessible by any means. Components that are installed but due to configuration or other restrictions are prohibited from being called must be scoped as 'required'.
-  SCOPE_OPTIONAL = 2;
-  // Components that are excluded provide the ability to document component usage for test and other non-runtime purposes. Excluded components are not reachable within a call graph at runtime.
-  SCOPE_EXCLUDED = 3;
-}
-
-message Service {
-  // An optional identifier which can be used to reference the service elsewhere in the BOM. Uniqueness is enforced within all elements and children of the root-level bom element.
-  optional string bom_ref = 1;
-  // The organization that provides the service.
-  optional OrganizationalEntity provider = 2;
-  // The grouping name, namespace, or identifier. This will often be a shortened, single name of the company or project that produced the service or domain name. Whitespace and special characters should be avoided.
-  optional string group = 3;
-  // The name of the service. This will often be a shortened, single name of the service.
-  string name = 4;
-  // The service version.
-  optional string version = 5;
-  // Specifies a description for the service.
-  optional string description = 6;
-  repeated string endpoints = 7;
-  // A boolean value indicating if the service requires authentication. A value of true indicates the service requires authentication prior to use. A value of false indicates the service does not require authentication.
-  optional bool authenticated = 8;
-  // A boolean value indicating if use of the service crosses a trust zone or boundary. A value of true indicates that by using the service, a trust boundary is crossed. A value of false indicates that by using the service, a trust boundary is not crossed.
-  optional bool x_trust_boundary = 9;
-  repeated DataClassification data = 10;
-  repeated LicenseChoice licenses = 11;
-  // Provides the ability to document external references related to the service.
-  repeated ExternalReference external_references = 12;
-  // Specifies optional sub-service. This is not a dependency tree. It provides a way to specify a hierarchical representation of service assemblies, similar to system -> subsystem -> parts assembly in physical supply chains.
-  repeated Service services = 13;
-  // Specifies optional, custom, properties
-  repeated Property properties = 14;
-}
-
-message Swid {
-  // Maps to the tagId of a SoftwareIdentity.
-  string tag_id = 1;
-  // Maps to the name of a SoftwareIdentity.
-  string name = 2;
-  // Maps to the version of a SoftwareIdentity.
-  optional string version = 3;
-  // Maps to the tagVersion of a SoftwareIdentity.
-  optional int32 tag_version = 4;
-  // Maps to the patch of a SoftwareIdentity.
-  optional bool patch = 5;
-  // Specifies the full content of the SWID tag.
-  optional AttachedText text = 6;
-  // The URL to the SWID file.
-  optional string url = 7;
-}
-
-// Specifies a tool (manual or automated).
-message Tool {
-  // The vendor of the tool used to create the BOM.
-  optional string vendor = 1;
-  // The name of the tool used to create the BOM.
-  optional string name = 2;
-  // The version of the tool used to create the BOM.
-  optional string version = 3;
-  repeated Hash hashes = 4;
-}
-
-// Specifies a property
-message Property {
-  string name = 1;
-  optional string value = 2;
-}
-
-enum Aggregate {
-  // Default, no statement about the aggregate completeness is being made
-  AGGREGATE_NOT_SPECIFIED = 0;
-  // The aggregate composition is complete
-  AGGREGATE_COMPLETE = 1;
-  // The aggregate composition is incomplete
-  AGGREGATE_INCOMPLETE = 2;
-  // The aggregate composition is incomplete for first party components, complete for third party components
-  AGGREGATE_INCOMPLETE_FIRST_PARTY_ONLY = 3;
-  // The aggregate composition is incomplete for third party components, complete for first party components
-  AGGREGATE_INCOMPLETE_THIRD_PARTY_ONLY = 4;
-  // The aggregate composition completeness is unknown
-  AGGREGATE_UNKNOWN = 5;
-}
-
-message Composition {
-  // Indicates the aggregate completeness
-  Aggregate aggregate = 1;
-  // The assemblies the aggregate completeness applies to
-  repeated string assemblies = 2;
-  // The dependencies the aggregate completeness applies to
-  repeated string dependencies = 3;
-}
-
-message EvidenceCopyright {
-  // Copyright text
-  string text = 1;
-}
-
-message Evidence {
-  repeated LicenseChoice licenses = 1;
-  repeated EvidenceCopyright copyright = 2;
-}
diff --git a/cyclonedx/__res/schema/bom-1.3a.schema.json b/cyclonedx/__res/schema/bom-1.3a.schema.json
deleted file mode 100644
index 41b0b9453..000000000
--- a/cyclonedx/__res/schema/bom-1.3a.schema.json
+++ /dev/null
@@ -1,1085 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-07/schema#",
-  "$id": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
-  "type": "object",
-  "title": "CycloneDX Software Bill-of-Material Specification",
-  "$comment" : "CycloneDX JSON schema is published under the terms of the Apache License 2.0.",
-  "required": [
-    "bomFormat",
-    "specVersion",
-    "version"
-  ],
-  "additionalProperties": false,
-  "properties": {
-    "$schema": {
-      "type": "string",
-      "enum": [
-        "http://cyclonedx.org/schema/bom-1.3.schema.json"
-      ]
-    },
-    "bomFormat": {
-      "$id": "#/properties/bomFormat",
-      "type": "string",
-      "title": "BOM Format",
-      "description": "Specifies the format of the BOM. This helps to identify the file as CycloneDX since BOMs do not have a filename convention nor does JSON schema support namespaces.",
-      "enum": [
-        "CycloneDX"
-      ]
-    },
-    "specVersion": {
-      "$id": "#/properties/specVersion",
-      "type": "string",
-      "title": "CycloneDX Specification Version",
-      "description": "The version of the CycloneDX specification a BOM is written to (starting at version 1.2)",
-      "examples": ["1.3"]
-    },
-    "serialNumber": {
-      "$id": "#/properties/serialNumber",
-      "type": "string",
-      "title": "BOM Serial Number",
-      "description": "Every BOM generated should have a unique serial number, even if the contents of the BOM being generated have not changed over time. The process or tool responsible for creating the BOM should create random UUID's for every BOM generated.",
-      "examples": ["urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79"],
-      "pattern": "^urn:uuid:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
-    },
-    "version": {
-      "$id": "#/properties/version",
-      "type": "integer",
-      "title": "BOM Version",
-      "description": "The version allows component publishers/authors to make changes to existing BOMs to update various aspects of the document such as description or licenses. When a system is presented with multiple BOMs for the same component, the system should use the most recent version of the BOM. The default version is '1' and should be incremented for each version of the BOM that is published. Each version of a component should have a unique BOM and if no changes are made to the BOMs, then each BOM will have a version of '1'.",
-      "default": 1,
-      "examples": [1]
-    },
-    "metadata": {
-      "$id": "#/properties/metadata",
-      "$ref": "#/definitions/metadata",
-      "title": "BOM Metadata",
-      "description": "Provides additional information about a BOM."
-    },
-    "components": {
-      "$id": "#/properties/components",
-      "type": "array",
-      "items": {"$ref": "#/definitions/component"},
-      "uniqueItems": true,
-      "title": "Components"
-    },
-    "services": {
-      "$id": "#/properties/services",
-      "type": "array",
-      "items": {"$ref": "#/definitions/service"},
-      "uniqueItems": true,
-      "title": "Services"
-    },
-    "externalReferences": {
-      "$id": "#/properties/externalReferences",
-      "type": "array",
-      "items": {"$ref": "#/definitions/externalReference"},
-      "title": "External References",
-      "description": "External references provide a way to document systems, sites, and information that may be relevant but which are not included with the BOM."
-    },
-    "dependencies": {
-      "$id": "#/properties/dependencies",
-      "type": "array",
-      "items": {"$ref": "#/definitions/dependency"},
-      "uniqueItems": true,
-      "title": "Dependencies",
-      "description": "Provides the ability to document dependency relationships."
-    },
-    "compositions": {
-      "$id": "#/properties/compositions",
-      "type": "array",
-      "items": {"$ref": "#/definitions/compositions"},
-      "uniqueItems": true,
-      "title": "Compositions",
-      "description": "Compositions describe constituent parts (including components, services, and dependency relationships) and their completeness."
-    }
-  },
-  "definitions": {
-    "metadata": {
-      "type": "object",
-      "title": "BOM Metadata Object",
-      "additionalProperties": false,
-      "properties": {
-        "timestamp": {
-          "type": "string",
-          "format": "date-time",
-          "title": "Timestamp",
-          "description": "The date and time (timestamp) when the document was created."
-        },
-        "tools": {
-          "type": "array",
-          "title": "Creation Tools",
-          "description": "The tool(s) used in the creation of the BOM.",
-          "items": {"$ref": "#/definitions/tool"}
-        },
-        "authors" :{
-          "type": "array",
-          "title": "Authors",
-          "description": "The person(s) who created the BOM. Authors are common in BOMs created through manual processes. BOMs created through automated means may not have authors.",
-          "items": {"$ref": "#/definitions/organizationalContact"}
-        },
-        "component": {
-          "title": "Component",
-          "description": "The component that the BOM describes.",
-          "$ref": "#/definitions/component"
-        },
-        "manufacture": {
-          "title": "Manufacture",
-          "description": "The organization that manufactured the component that the BOM describes.",
-          "$ref": "#/definitions/organizationalEntity"
-        },
-        "supplier": {
-          "title": "Supplier",
-          "description": " The organization that supplied the component that the BOM describes. The supplier may often be the manufacturer, but may also be a distributor or repackager.",
-          "$ref": "#/definitions/organizationalEntity"
-        },
-        "licenses": {
-          "type": "array",
-          "title": "BOM License(s)",
-          "items": {"$ref": "#/definitions/licenseChoice"}
-        },
-        "properties": {
-          "type": "array",
-          "title": "Properties",
-          "description": "Provides the ability to document properties in a name-value store. This provides flexibility to include data not officially supported in the standard without having to use additional namespaces or create extensions. Unlike key-value stores, properties support duplicate names, each potentially having different values.",
-          "items": {"$ref": "#/definitions/property"}
-        }
-      }
-    },
-    "tool": {
-      "type": "object",
-      "title": "Tool",
-      "description": "The tool used to create the BOM.",
-      "additionalProperties": false,
-      "properties": {
-        "vendor": {
-          "type": "string",
-          "title": "Tool Vendor",
-          "description": "The date and time (timestamp) when the document was created."
-        },
-        "name": {
-          "type": "string",
-          "title": "Tool Name",
-          "description": "The date and time (timestamp) when the document was created."
-        },
-        "version": {
-          "type": "string",
-          "title": "Tool Version",
-          "description": "The date and time (timestamp) when the document was created."
-        },
-        "hashes": {
-          "$id": "#/definitions/tool/properties/hashes",
-          "type": "array",
-          "items": {"$ref": "#/definitions/hash"},
-          "title": "Hashes",
-          "description": "The hashes of the tool (if applicable)."
-        }
-      }
-    },
-    "organizationalEntity": {
-      "type": "object",
-      "title": "Organizational Entity Object",
-      "description": "",
-      "additionalProperties": false,
-      "properties": {
-        "name": {
-          "type": "string",
-          "title": "Name",
-          "description": "The name of the organization",
-          "examples": [
-            "Example Inc."
-          ]
-        },
-        "url": {
-          "type": "array",
-          "items": {
-            "type": "string",
-            "format": "iri-reference"
-          },
-          "title": "URL",
-          "description": "The URL of the organization. Multiple URLs are allowed.",
-          "examples": ["https://example.com"]
-        },
-        "contact": {
-          "type": "array",
-          "title": "Contact",
-          "description": "A contact at the organization. Multiple contacts are allowed.",
-          "items": {"$ref": "#/definitions/organizationalContact"}
-        }
-      }
-    },
-    "organizationalContact": {
-      "type": "object",
-      "title": "Organizational Contact Object",
-      "description": "",
-      "additionalProperties": false,
-      "properties": {
-        "name": {
-          "type": "string",
-          "title": "Name",
-          "description": "The name of a contact",
-          "examples": ["Contact name"]
-        },
-        "email": {
-          "type": "string",
-          "title": "Email Address",
-          "description": "The email address of the contact.",
-          "examples": ["firstname.lastname@example.com"]
-        },
-        "phone": {
-          "type": "string",
-          "title": "Phone",
-          "description": "The phone number of the contact.",
-          "examples": ["800-555-1212"]
-        }
-      }
-    },
-    "component": {
-      "type": "object",
-      "title": "Component Object",
-      "required": [
-        "type",
-        "name",
-        "version"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "type": {
-          "type": "string",
-          "enum": [
-            "application",
-            "framework",
-            "library",
-            "container",
-            "operating-system",
-            "device",
-            "firmware",
-            "file"
-          ],
-          "title": "Component Type",
-          "description": "Specifies the type of component. For software components, classify as application if no more specific appropriate classification is available or cannot be determined for the component.",
-          "examples": ["library"]
-        },
-        "mime-type": {
-          "type": "string",
-          "title": "Mime-Type",
-          "description": "The optional mime-type of the component. When used on file components, the mime-type can provide additional context about the kind of file being represented such as an image, font, or executable. Some library or framework components may also have an associated mime-type.",
-          "examples": ["image/jpeg"],
-          "pattern": "^[-+a-z0-9.]+/[-+a-z0-9.]+$"
-        },
-        "bom-ref": {
-          "type": "string",
-          "title": "BOM Reference",
-          "description": "An optional identifier which can be used to reference the component elsewhere in the BOM. Every bom-ref should be unique."
-        },
-        "supplier": {
-          "title": "Component Supplier",
-          "description": " The organization that supplied the component. The supplier may often be the manufacturer, but may also be a distributor or repackager.",
-          "$ref": "#/definitions/organizationalEntity"
-        },
-        "author": {
-          "type": "string",
-          "title": "Component Author",
-          "description": "The person(s) or organization(s) that authored the component",
-          "examples": ["Acme Inc"]
-        },
-        "publisher": {
-          "type": "string",
-          "title": "Component Publisher",
-          "description": "The person(s) or organization(s) that published the component",
-          "examples": ["Acme Inc"]
-        },
-        "group": {
-          "type": "string",
-          "title": "Component Group",
-          "description": "The grouping name or identifier. This will often be a shortened, single name of the company or project that produced the component, or the source package or domain name. Whitespace and special characters should be avoided. Examples include: apache, org.apache.commons, and apache.org.",
-          "examples": ["com.acme"]
-        },
-        "name": {
-          "type": "string",
-          "title": "Component Name",
-          "description": "The name of the component. This will often be a shortened, single name of the component. Examples: commons-lang3 and jquery",
-          "examples": ["tomcat-catalina"]
-        },
-        "version": {
-          "type": "string",
-          "title": "Component Version",
-          "description": "The component version. The version should ideally comply with semantic versioning but is not enforced.",
-          "examples": ["9.0.14"]
-        },
-        "description": {
-          "type": "string",
-          "title": "Component Description",
-          "description": "Specifies a description for the component"
-        },
-        "scope": {
-          "type": "string",
-          "enum": [
-            "required",
-            "optional",
-            "excluded"
-          ],
-          "title": "Component Scope",
-          "description": "Specifies the scope of the component. If scope is not specified, 'required' scope should be assumed by the consumer of the BOM",
-          "default": "required"
-        },
-        "hashes": {
-          "type": "array",
-          "title": "Component Hashes",
-          "items": {"$ref": "#/definitions/hash"}
-        },
-        "licenses": {
-          "type": "array",
-          "items": {"$ref": "#/definitions/licenseChoice"},
-          "title": "Component License(s)"
-        },
-        "copyright": {
-          "type": "string",
-          "title": "Component Copyright",
-          "description": "An optional copyright notice informing users of the underlying claims to copyright ownership in a published work.",
-          "examples": ["Acme Inc"]
-        },
-        "cpe": {
-          "type": "string",
-          "title": "Component Common Platform Enumeration (CPE)",
-          "description": "DEPRECATED - DO NOT USE. This will be removed in a future version. Specifies a well-formed CPE name. See https://nvd.nist.gov/products/cpe",
-          "examples": ["cpe:2.3:a:acme:component_framework:-:*:*:*:*:*:*:*"]
-        },
-        "purl": {
-          "type": "string",
-          "title": "Component Package URL (purl)",
-          "examples": ["pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar"]
-        },
-        "swid": {
-          "$ref": "#/definitions/swid",
-          "title": "SWID Tag",
-          "description": "Specifies metadata and content for ISO-IEC 19770-2 Software Identification (SWID) Tags."
-        },
-        "modified": {
-          "type": "boolean",
-          "title": "Component Modified From Original",
-          "description": "DEPRECATED - DO NOT USE. This will be removed in a future version. Use the pedigree element instead to supply information on exactly how the component was modified. A boolean value indicating is the component has been modified from the original. A value of true indicates the component is a derivative of the original. A value of false indicates the component has not been modified from the original."
-        },
-        "pedigree": {
-          "type": "object",
-          "title": "Component Pedigree",
-          "description": "Component pedigree is a way to document complex supply chain scenarios where components are created, distributed, modified, redistributed, combined with other components, etc. Pedigree supports viewing this complex chain from the beginning, the end, or anywhere in the middle. It also provides a way to document variants where the exact relation may not be known.",
-          "additionalProperties": false,
-          "properties": {
-            "ancestors": {
-              "type": "array",
-              "title": "Ancestors",
-              "description": "Describes zero or more components in which a component is derived from. This is commonly used to describe forks from existing projects where the forked version contains a ancestor node containing the original component it was forked from. For example, Component A is the original component. Component B is the component being used and documented in the BOM. However, Component B contains a pedigree node with a single ancestor documenting Component A - the original component from which Component B is derived from.",
-              "items": {"$ref": "#/definitions/component"}
-            },
-            "descendants": {
-              "type": "array",
-              "title": "Descendants",
-              "description": "Descendants are the exact opposite of ancestors. This provides a way to document all forks (and their forks) of an original or root component.",
-              "items": {"$ref": "#/definitions/component"}
-            },
-            "variants": {
-              "type": "array",
-              "title": "Variants",
-              "description": "Variants describe relations where the relationship between the components are not known. For example, if Component A contains nearly identical code to Component B. They are both related, but it is unclear if one is derived from the other, or if they share a common ancestor.",
-              "items": {"$ref": "#/definitions/component"}
-            },
-            "commits": {
-              "type": "array",
-              "title": "Commits",
-              "description": "A list of zero or more commits which provide a trail describing how the component deviates from an ancestor, descendant, or variant.",
-              "items": {"$ref": "#/definitions/commit"}
-            },
-            "patches": {
-              "type": "array",
-              "title": "Patches",
-              "description": ">A list of zero or more patches describing how the component deviates from an ancestor, descendant, or variant. Patches may be complimentary to commits or may be used in place of commits.",
-              "items": {"$ref": "#/definitions/patch"}
-            },
-            "notes": {
-              "type": "string",
-              "title": "Notes",
-              "description": "Notes, observations, and other non-structured commentary describing the components pedigree."
-            }
-          }
-        },
-        "externalReferences": {
-          "type": "array",
-          "items": {"$ref": "#/definitions/externalReference"},
-          "title": "External References"
-        },
-        "components": {
-          "$id": "#/definitions/component/properties/components",
-          "type": "array",
-          "items": {"$ref": "#/definitions/component"},
-          "uniqueItems": true,
-          "title": "Components"
-        },
-        "evidence": {
-          "$ref": "#/definitions/componentEvidence",
-          "title": "Evidence",
-          "description": "Provides the ability to document evidence collected through various forms of extraction or analysis."
-        },
-        "properties": {
-          "type": "array",
-          "title": "Properties",
-          "description": "Provides the ability to document properties in a name-value store. This provides flexibility to include data not officially supported in the standard without having to use additional namespaces or create extensions. Unlike key-value stores, properties support duplicate names, each potentially having different values.",
-          "items": {"$ref": "#/definitions/property"}
-        }
-      }
-    },
-    "swid": {
-      "type": "object",
-      "title": "SWID Tag",
-      "description": "Specifies metadata and content for ISO-IEC 19770-2 Software Identification (SWID) Tags.",
-      "required": [
-        "tagId",
-        "name"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "tagId": {
-          "type": "string",
-          "title": "Tag ID",
-          "description": "Maps to the tagId of a SoftwareIdentity."
-        },
-        "name": {
-          "type": "string",
-          "title": "Name",
-          "description": "Maps to the name of a SoftwareIdentity."
-        },
-        "version": {
-          "type": "string",
-          "title": "Version",
-          "default": "0.0",
-          "description": "Maps to the version of a SoftwareIdentity."
-        },
-        "tagVersion": {
-          "type": "integer",
-          "title": "Tag Version",
-          "default": 0,
-          "description": "Maps to the tagVersion of a SoftwareIdentity."
-        },
-        "patch": {
-          "type": "boolean",
-          "title": "Patch",
-          "default": false,
-          "description": "Maps to the patch of a SoftwareIdentity."
-        },
-        "text": {
-          "title": "Attachment text",
-          "description": "Specifies the metadata and content of the SWID tag.",
-          "$ref": "#/definitions/attachment"
-        },
-        "url": {
-          "type": "string",
-          "title": "URL",
-          "description": "The URL to the SWID file.",
-          "format": "iri-reference"
-        }
-      }
-    },
-    "attachment": {
-      "type": "object",
-      "title": "Attachment",
-      "description": "Specifies the metadata and content for an attachment.",
-      "required": [
-        "content"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "contentType": {
-          "type": "string",
-          "title": "Content-Type",
-          "description": "Specifies the content type of the text. Defaults to text/plain if not specified.",
-          "default": "text/plain"
-        },
-        "encoding": {
-          "type": "string",
-          "title": "Encoding",
-          "description": "Specifies the optional encoding the text is represented in.",
-          "enum": [
-            "base64"
-          ]
-        },
-        "content": {
-          "type": "string",
-          "title": "Attachment Text",
-          "description": "The attachment data"
-        }
-      }
-    },
-    "hash": {
-      "type": "object",
-      "title": "Hash Objects",
-      "required": [
-        "alg",
-        "content"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "alg": {
-          "$ref": "#/definitions/hash-alg"
-        },
-        "content": {
-          "$ref": "#/definitions/hash-content"
-        }
-      }
-    },
-    "hash-alg": {
-      "type": "string",
-      "enum": [
-        "MD5",
-        "SHA-1",
-        "SHA-256",
-        "SHA-384",
-        "SHA-512",
-        "SHA3-256",
-        "SHA3-384",
-        "SHA3-512",
-        "BLAKE2b-256",
-        "BLAKE2b-384",
-        "BLAKE2b-512",
-        "BLAKE3"
-      ],
-      "title": "Hash Algorithm"
-    },
-    "hash-content": {
-      "type": "string",
-      "title": "Hash Content (value)",
-      "examples": ["3942447fac867ae5cdb3229b658f4d48"],
-      "pattern": "^([a-fA-F0-9]{32}|[a-fA-F0-9]{40}|[a-fA-F0-9]{64}|[a-fA-F0-9]{96}|[a-fA-F0-9]{128})$"
-    },
-    "license": {
-      "type": "object",
-      "title": "License Object",
-      "oneOf": [
-        {
-          "required": ["id"]
-        },
-        {
-          "required": ["name"]
-        }
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "id": {
-          "$ref": "spdx.schema.json",
-          "title": "License ID (SPDX)",
-          "description": "A valid SPDX license ID",
-          "examples": ["Apache-2.0"]
-        },
-        "name": {
-          "type": "string",
-          "title": "License Name",
-          "description": "If SPDX does not define the license used, this field may be used to provide the license name",
-          "examples": ["Acme Software License"]
-        },
-        "text": {
-          "title": "License text",
-          "description": "An optional way to include the textual content of a license.",
-          "$ref": "#/definitions/attachment"
-        },
-        "url": {
-          "type": "string",
-          "title": "License URL",
-          "description": "The URL to the license file. If specified, a 'license' externalReference should also be specified for completeness",
-          "examples": ["https://www.apache.org/licenses/LICENSE-2.0.txt"],
-          "format": "iri-reference"
-        }
-      }
-    },
-    "licenseChoice": {
-      "type": "object",
-      "title": "License(s)",
-      "additionalProperties": false,
-      "properties": {
-        "license": {
-          "$ref": "#/definitions/license"
-        },
-        "expression": {
-          "type": "string",
-          "title": "SPDX License Expression",
-          "examples": [
-            "Apache-2.0 AND (MIT OR GPL-2.0-only)",
-            "GPL-3.0-only WITH Classpath-exception-2.0"
-          ]
-        }
-      },
-      "oneOf":[
-        {
-          "required": ["license"]
-        },
-        {
-          "required": ["expression"]
-        }
-      ]
-    },
-    "commit": {
-      "type": "object",
-      "title": "Commit",
-      "description": "Specifies an individual commit",
-      "additionalProperties": false,
-      "properties": {
-        "uid": {
-          "type": "string",
-          "title": "UID",
-          "description": "A unique identifier of the commit. This may be version control specific. For example, Subversion uses revision numbers whereas git uses commit hashes."
-        },
-        "url": {
-          "type": "string",
-          "title": "URL",
-          "description": "The URL to the commit. This URL will typically point to a commit in a version control system.",
-          "format": "iri-reference"
-        },
-        "author": {
-          "title": "Author",
-          "description": "The author who created the changes in the commit",
-          "$ref": "#/definitions/identifiableAction"
-        },
-        "committer": {
-          "title": "Committer",
-          "description": "The person who committed or pushed the commit",
-          "$ref": "#/definitions/identifiableAction"
-        },
-        "message": {
-          "type": "string",
-          "title": "Message",
-          "description": "The text description of the contents of the commit"
-        }
-      }
-    },
-    "patch": {
-      "type": "object",
-      "title": "Patch",
-      "description": "Specifies an individual patch",
-      "required": [
-        "type"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "type": {
-          "type": "string",
-          "enum": [
-            "unofficial",
-            "monkey",
-            "backport",
-            "cherry-pick"
-          ],
-          "title": "Type",
-          "description": "Specifies the purpose for the patch including the resolution of defects, security issues, or new behavior or functionality"
-        },
-        "diff": {
-          "title": "Diff",
-          "description": "The patch file (or diff) that show changes. Refer to https://en.wikipedia.org/wiki/Diff",
-          "$ref": "#/definitions/diff"
-        },
-        "resolves": {
-          "type": "array",
-          "items": {"$ref": "#/definitions/issue"},
-          "title": "Resolves",
-          "description": "A collection of issues the patch resolves"
-        }
-      }
-    },
-    "diff": {
-      "type": "object",
-      "title": "Diff",
-      "description": "The patch file (or diff) that show changes. Refer to https://en.wikipedia.org/wiki/Diff",
-      "additionalProperties": false,
-      "properties": {
-        "text": {
-          "title": "Diff text",
-          "description": "Specifies the optional text of the diff",
-          "$ref": "#/definitions/attachment"
-        },
-        "url": {
-          "type": "string",
-          "title": "URL",
-          "description": "Specifies the URL to the diff",
-          "format": "iri-reference"
-        }
-      }
-    },
-    "issue": {
-      "type": "object",
-      "title": "Diff",
-      "description": "The patch file (or diff) that show changes. Refer to https://en.wikipedia.org/wiki/Diff",
-      "required": [
-        "type"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "type": {
-          "type": "string",
-          "enum": [
-            "defect",
-            "enhancement",
-            "security"
-          ],
-          "title": "Type",
-          "description": "Specifies the type of issue"
-        },
-        "id": {
-          "type": "string",
-          "title": "ID",
-          "description": "The identifier of the issue assigned by the source of the issue"
-        },
-        "name": {
-          "type": "string",
-          "title": "Name",
-          "description": "The name of the issue"
-        },
-        "description": {
-          "type": "string",
-          "title": "Description",
-          "description": "A description of the issue"
-        },
-        "source": {
-          "type": "object",
-          "title": "Source",
-          "description": "The source of the issue where it is documented",
-          "additionalProperties": false,
-          "properties": {
-            "name": {
-              "type": "string",
-              "title": "Name",
-              "description": "The name of the source. For example 'National Vulnerability Database', 'NVD', and 'Apache'"
-            },
-            "url": {
-              "type": "string",
-              "title": "URL",
-              "description": "The url of the issue documentation as provided by the source",
-              "format": "iri-reference"
-            }
-          }
-        },
-        "references": {
-          "type": "array",
-          "items": {
-            "type": "string",
-            "format": "iri-reference"
-          },
-          "title": "References",
-          "description": "A collection of URL's for reference. Multiple URLs are allowed.",
-          "examples": ["https://example.com"]
-        }
-      }
-    },
-    "identifiableAction": {
-      "type": "object",
-      "title": "Identifiable Action",
-      "description": "Specifies an individual commit",
-      "additionalProperties": false,
-      "properties": {
-        "timestamp": {
-          "type": "string",
-          "format": "date-time",
-          "title": "Timestamp",
-          "description": "The timestamp in which the action occurred"
-        },
-        "name": {
-          "type": "string",
-          "title": "Name",
-          "description": "The name of the individual who performed the action"
-        },
-        "email": {
-          "type": "string",
-          "format": "idn-email",
-          "title": "E-mail",
-          "description": "The email address of the individual who performed the action"
-        }
-      }
-    },
-    "externalReference": {
-      "type": "object",
-      "title": "External Reference",
-      "description": "Specifies an individual external reference",
-      "required": [
-        "url",
-        "type"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "url": {
-          "type": "string",
-          "title": "URL",
-          "description": "The URL to the external reference",
-          "format": "iri-reference"
-        },
-        "comment": {
-          "type": "string",
-          "title": "Comment",
-          "description": "An optional comment describing the external reference"
-        },
-        "type": {
-          "type": "string",
-          "title": "Type",
-          "description": "Specifies the type of external reference. There are built-in types to describe common references. If a type does not exist for the reference being referred to, use the \"other\" type.",
-          "enum": [
-            "vcs",
-            "issue-tracker",
-            "website",
-            "advisories",
-            "bom",
-            "mailing-list",
-            "social",
-            "chat",
-            "documentation",
-            "support",
-            "distribution",
-            "license",
-            "build-meta",
-            "build-system",
-            "other"
-          ]
-        },
-        "hashes": {
-          "$id": "#/definitions/externalReference/properties/hashes",
-          "type": "array",
-          "items": {"$ref": "#/definitions/hash"},
-          "title": "Hashes",
-          "description": "The hashes of the external reference (if applicable)."
-        }
-      }
-    },
-    "dependency": {
-      "type": "object",
-      "title": "Dependency",
-      "description": "Defines the direct dependencies of a component. Components that do not have their own dependencies MUST be declared as empty elements within the graph. Components that are not represented in the dependency graph MAY have unknown dependencies. It is RECOMMENDED that implementations assume this to be opaque and not an indicator of a component being dependency-free.",
-      "required": [
-        "ref"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "ref": {
-          "type": "string",
-          "title": "Reference",
-          "description": "References a component by the components bom-ref attribute"
-        },
-        "dependsOn": {
-          "type": "array",
-          "uniqueItems": true,
-          "items": {
-            "type": "string"
-          },
-          "title": "Depends On",
-          "description": "The bom-ref identifiers of the components that are dependencies of this dependency object."
-        }
-      }
-    },
-    "service": {
-      "type": "object",
-      "title": "Service Object",
-      "required": [
-        "name"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "bom-ref": {
-          "type": "string",
-          "title": "BOM Reference",
-          "description": "An optional identifier which can be used to reference the service elsewhere in the BOM. Every bom-ref should be unique."
-        },
-        "provider": {
-          "title": "Provider",
-          "description": "The organization that provides the service.",
-          "$ref": "#/definitions/organizationalEntity"
-        },
-        "group": {
-          "type": "string",
-          "title": "Service Group",
-          "description": "The grouping name, namespace, or identifier. This will often be a shortened, single name of the company or project that produced the service or domain name. Whitespace and special characters should be avoided.",
-          "examples": ["com.acme"]
-        },
-        "name": {
-          "type": "string",
-          "title": "Service Name",
-          "description": "The name of the service. This will often be a shortened, single name of the service.",
-          "examples": ["ticker-service"]
-        },
-        "version": {
-          "type": "string",
-          "title": "Service Version",
-          "description": "The service version.",
-          "examples": ["1.0.0"]
-        },
-        "description": {
-          "type": "string",
-          "title": "Service Description",
-          "description": "Specifies a description for the service"
-        },
-        "endpoints": {
-          "type": "array",
-          "items": {
-            "type": "string",
-            "format": "iri-reference"
-          },
-          "title": "Endpoints",
-          "description": "The endpoint URIs of the service. Multiple endpoints are allowed.",
-          "examples": ["https://example.com/api/v1/ticker"]
-        },
-        "authenticated": {
-          "type": "boolean",
-          "title": "Authentication Required",
-          "description": "A boolean value indicating if the service requires authentication. A value of true indicates the service requires authentication prior to use. A value of false indicates the service does not require authentication."
-        },
-        "x-trust-boundary": {
-          "type": "boolean",
-          "title": "Crosses Trust Boundary",
-          "description": "A boolean value indicating if use of the service crosses a trust zone or boundary. A value of true indicates that by using the service, a trust boundary is crossed. A value of false indicates that by using the service, a trust boundary is not crossed."
-        },
-        "data": {
-          "type": "array",
-          "items": {"$ref": "#/definitions/dataClassification"},
-          "title": "Data Classification",
-          "description": "Specifies the data classification."
-        },
-        "licenses": {
-          "type": "array",
-          "items": {"$ref": "#/definitions/licenseChoice"},
-          "title": "Component License(s)"
-        },
-        "externalReferences": {
-          "type": "array",
-          "items": {"$ref": "#/definitions/externalReference"},
-          "title": "External References"
-        },
-        "services": {
-          "$id": "#/definitions/service/properties/services",
-          "type": "array",
-          "items": {"$ref": "#/definitions/service"},
-          "uniqueItems": true,
-          "title": "Services"
-        },
-        "properties": {
-          "type": "array",
-          "title": "Properties",
-          "description": "Provides the ability to document properties in a name-value store. This provides flexibility to include data not officially supported in the standard without having to use additional namespaces or create extensions. Unlike key-value stores, properties support duplicate names, each potentially having different values.",
-          "items": {"$ref": "#/definitions/property"}
-        }
-      }
-    },
-    "dataClassification": {
-      "type": "object",
-      "title": "Hash Objects",
-      "required": [
-        "flow",
-        "classification"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "flow": {
-          "$ref": "#/definitions/dataFlow"
-        },
-        "classification": {
-          "type": "string"
-        }
-      }
-    },
-    "dataFlow": {
-      "type": "string",
-      "enum": [
-        "inbound",
-        "outbound",
-        "bi-directional",
-        "unknown"
-      ],
-      "title": "Data flow direction"
-    },
-
-    "copyright": {
-      "type": "object",
-      "title": "Copyright",
-      "required": [
-        "text"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "text": {
-          "type": "string",
-          "title": "Copyright Text"
-        }
-      }
-    },
-
-    "componentEvidence": {
-      "type": "object",
-      "title": "Evidence",
-      "description": "Provides the ability to document evidence collected through various forms of extraction or analysis.",
-      "additionalProperties": false,
-      "properties": {
-        "licenses": {
-          "type": "array",
-          "items": {"$ref": "#/definitions/licenseChoice"},
-          "title": "Component License(s)"
-        },
-        "copyright": {
-          "type": "array",
-          "items": {"$ref": "#/definitions/copyright"},
-          "title": "Copyright"
-        }
-      }
-    },
-    "compositions": {
-      "type": "object",
-      "title": "Compositions",
-      "required": [
-        "aggregate"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "aggregate": {
-          "$ref": "#/definitions/aggregateType",
-          "title": "Aggregate",
-          "description": "Specifies an aggregate type that describe how complete a relationship is."
-        },
-        "assemblies": {
-          "type": "array",
-          "uniqueItems": true,
-          "items": {
-            "type": "string"
-          },
-          "title": "BOM references",
-          "description": "The bom-ref identifiers of the components or services being described. Assemblies refer to nested relationships whereby a constituent part may include other constituent parts. References do not cascade to child parts. References are explicit for the specified constituent part only."
-        },
-        "dependencies": {
-          "type": "array",
-          "uniqueItems": true,
-          "items": {
-            "type": "string"
-          },
-          "title": "BOM references",
-          "description": "The bom-ref identifiers of the components or services being described. Dependencies refer to a relationship whereby an independent constituent part requires another independent constituent part. References do not cascade to transitive dependencies. References are explicit for the specified dependency only."
-        }
-      }
-    },
-    "aggregateType": {
-      "type": "string",
-      "default": "not_specified",
-      "enum": [
-        "complete",
-        "incomplete",
-        "incomplete_first_party_only",
-        "incomplete_third_party_only",
-        "unknown",
-        "not_specified"
-      ]
-    },
-    "property": {
-      "type": "object",
-      "title": "Lightweight name-value pair",
-      "properties": {
-        "name": {
-          "type": "string",
-          "title": "Name",
-          "description": "The name of the property. Duplicate names are allowed, each potentially having a different value."
-        },
-        "value": {
-          "type": "string",
-          "title": "Value",
-          "description": "The value of the property."
-        }
-      }
-    }
-  }
-}
diff --git a/cyclonedx/__res/schema/bom-1.4.schema.json b/cyclonedx/__res/schema/bom-1.4.SNAPSHOT.schema.json
similarity index 99%
rename from cyclonedx/__res/schema/bom-1.4.schema.json
rename to cyclonedx/__res/schema/bom-1.4.SNAPSHOT.schema.json
index 85684d769..83e27ceb4 100644
--- a/cyclonedx/__res/schema/bom-1.4.schema.json
+++ b/cyclonedx/__res/schema/bom-1.4.SNAPSHOT.schema.json
@@ -6,8 +6,7 @@
   "$comment" : "CycloneDX JSON schema is published under the terms of the Apache License 2.0.",
   "required": [
     "bomFormat",
-    "specVersion",
-    "version"
+    "specVersion"
   ],
   "additionalProperties": false,
   "properties": {
@@ -611,7 +610,7 @@
       "additionalProperties": false,
       "properties": {
         "id": {
-          "$ref": "spdx.schema.json",
+          "$ref": "spdx.SNAPSHOT.schema.json",
           "title": "License ID (SPDX)",
           "description": "A valid SPDX license ID",
           "examples": ["Apache-2.0"]
@@ -1689,9 +1688,9 @@
       "maxLength": 1024
     },
     "signature": {
-      "$ref": "jsf-0.82.schema.json#/definitions/signature",
+      "$ref": "jsf-0.82.SNAPSHOT.schema.json#/definitions/signature",
       "title": "Signature",
       "description": "Enveloped signature in [JSON Signature Format (JSF)](https://cyberphone.github.io/doc/security/jsf.html)."
     }
   }
-}
\ No newline at end of file
+}
diff --git a/cyclonedx/__res/schema/bom-1.4.xsd b/cyclonedx/__res/schema/bom-1.4.SNAPSHOT.xsd
similarity index 99%
rename from cyclonedx/__res/schema/bom-1.4.xsd
rename to cyclonedx/__res/schema/bom-1.4.SNAPSHOT.xsd
index 9cf8af240..27c68fb91 100644
--- a/cyclonedx/__res/schema/bom-1.4.xsd
+++ b/cyclonedx/__res/schema/bom-1.4.SNAPSHOT.xsd
@@ -22,9 +22,9 @@ limitations under the License.
            targetNamespace="http://cyclonedx.org/schema/bom/1.4"
            vc:minVersion="1.0"
            vc:maxVersion="1.1"
-           version="1.4.2">
+           version="1.4">
 
-    <xs:import namespace="http://cyclonedx.org/schema/spdx" schemaLocation="spdx.xsd"/>
+    <xs:import namespace="http://cyclonedx.org/schema/spdx" schemaLocation="spdx.SNAPSHOT.xsd"/>
 
     <xs:annotation>
         <xs:documentation>
@@ -620,7 +620,7 @@ limitations under the License.
 
     <xs:simpleType name="mimeType">
         <xs:restriction base="xs:token">
-            <xs:pattern value="[-+a-z0-9.]+/[-+a-z0-9.]+"/>
+            <xs:pattern value="^[-+a-z0-9.]+/[-+a-z0-9.]+$"/>
         </xs:restriction>
     </xs:simpleType>
 
@@ -2014,16 +2014,6 @@ limitations under the License.
                     </xs:sequence>
                 </xs:complexType>
             </xs:element>
-            <xs:element name="properties" type="bom:propertiesType" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation>Provides the ability to document properties in a key/value store.
-                        This provides flexibility to include data not officially supported in the standard
-                        without having to use additional namespaces or create extensions. Property names
-                        of interest to the general public are encouraged to be registered in the
-                        CycloneDX Property Taxonomy - https://github.com/CycloneDX/cyclonedx-property-taxonomy.
-                        Formal registration is OPTIONAL.</xs:documentation>
-                </xs:annotation>
-            </xs:element>
         </xs:sequence>
         <xs:attribute name="bom-ref" type="bom:refType">
             <xs:annotation>
@@ -2414,4 +2404,4 @@ limitations under the License.
             <xs:field xpath="@bom-ref"/>
         </xs:unique>
     </xs:element>
-</xs:schema>
\ No newline at end of file
+</xs:schema>
diff --git a/cyclonedx/__res/schema/ext/bom-descriptor-0.9.xsd b/cyclonedx/__res/schema/ext/bom-descriptor-0.9.xsd
deleted file mode 100644
index 605df12f7..000000000
--- a/cyclonedx/__res/schema/ext/bom-descriptor-0.9.xsd
+++ /dev/null
@@ -1,175 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-CycloneDX BOM Descriptor Extension
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
-           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
-           xmlns:bom="http://cyclonedx.org/schema/bom/1.1"
-           xmlns:desc="http://cyclonedx.org/schema/ext/bom-descriptor/0.9"
-           elementFormDefault="qualified"
-           targetNamespace="http://cyclonedx.org/schema/ext/bom-descriptor/0.9"
-           vc:minVersion="1.0"
-           vc:maxVersion="1.1"
-           version="0.9">
-
-    <xs:annotation>
-        <xs:documentation>
-            <name>CycloneDX BOM Descriptor Extension</name>
-            <url>https://cyclonedx.org/ext/bom-descriptor</url>
-            <license uri="http://www.apache.org/licenses/LICENSE-2.0"
-                     version="2.0">Apache License, Version 2.0</license>
-            <authors>
-                <author>Steve Springett</author>
-            </authors>
-        </xs:documentation>
-    </xs:annotation>
-
-    <xs:complexType name="metadata">
-        <xs:sequence minOccurs="0" maxOccurs="unbounded">
-            <xs:element name="softwareName" type="xs:normalizedString" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation>Specifies the name of the software the BOM describes.</xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="softwareVersion" type="xs:normalizedString" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation>Specifies the version of the software the BOM describes.</xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="softwareEdition" type="xs:normalizedString" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation>Specifies the edition of the software the BOM describes.</xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="hashes" minOccurs="0" maxOccurs="1">
-                <xs:complexType>
-                    <xs:sequence minOccurs="0" maxOccurs="unbounded">
-                        <xs:element name="hash" type="bom:hashType"/>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-            <xs:element name="licenses" minOccurs="0" maxOccurs="1">
-                <xs:complexType>
-                    <xs:choice>
-                        <xs:element name="license" type="bom:licenseType" minOccurs="0" maxOccurs="unbounded"/>
-                        <xs:element name="expression" type="xs:normalizedString" minOccurs="0" maxOccurs="1">
-                            <xs:annotation>
-                                <xs:documentation>A valid SPDX license expression.
-                                    Refer to https://spdx.org/specifications for syntax requirements</xs:documentation>
-                            </xs:annotation>
-                        </xs:element>
-                    </xs:choice>
-                </xs:complexType>
-            </xs:element>
-            <xs:element name="copyright" type="xs:normalizedString" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation>An optional copyright notice informing users of the underlying claims to
-                        copyright ownership in a published work.</xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="cpe" type="bom:cpe" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation>
-                        Specifies a well-formed CPE name. See https://nvd.nist.gov/products/cpe
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="purl" type="xs:anyURI" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation>
-                        Specifies the package-url (PURL). The purl, if specified, must be valid and conform
-                        to the specification defined at: https://github.com/package-url/purl-spec
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="manufacture" type="desc:organizationalEntity" minOccurs="0" maxOccurs="unbounded">
-                <xs:annotation>
-                    <xs:documentation>The organization that manufactured the software for which the BOM describes.</xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="supplier" type="desc:organizationalEntity" minOccurs="0" maxOccurs="unbounded">
-                <xs:annotation>
-                    <xs:documentation>The organization that supplied the software for which the BOM describes. The
-                    supplier may often be the manufacture, but may also be a distributor or repackager.</xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-        <xs:anyAttribute namespace="##other" processContents="lax">
-            <xs:annotation>
-                <xs:documentation>User-defined attributes may be used on this element as long as they
-                    do not have the same name as an existing attribute used by the schema.</xs:documentation>
-            </xs:annotation>
-        </xs:anyAttribute>
-    </xs:complexType>
-
-    <xs:complexType name="organizationalEntity">
-        <xs:sequence minOccurs="0" maxOccurs="1">
-            <xs:element name="name" type="xs:normalizedString" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation>The name of the organization</xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="url" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded">
-                <xs:annotation>
-                    <xs:documentation>The URL of the organization. Multiple URLs are allowed.</xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="contact" type="desc:organizationalPerson" minOccurs="0" maxOccurs="unbounded">
-                <xs:annotation>
-                    <xs:documentation>A contact person at the organization. Multiple contacts are allowed.</xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-        <xs:anyAttribute namespace="##other" processContents="lax">
-            <xs:annotation>
-                <xs:documentation>User-defined attributes may be used on this element as long as they
-                    do not have the same name as an existing attribute used by the schema.</xs:documentation>
-            </xs:annotation>
-        </xs:anyAttribute>
-    </xs:complexType>
-
-    <xs:complexType name="organizationalPerson">
-        <xs:sequence minOccurs="0" maxOccurs="1">
-            <xs:element name="name" type="xs:normalizedString" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation>The name of the person</xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="email" type="xs:normalizedString" minOccurs="0" maxOccurs="unbounded">
-                <xs:annotation>
-                    <xs:documentation>The email address of the person. Multiple email addresses are allowed.</xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="phone" type="xs:normalizedString" minOccurs="0" maxOccurs="unbounded">
-                <xs:annotation>
-                    <xs:documentation>The phone number of the person. Multiple phone numbers are allowed.</xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-        <xs:anyAttribute namespace="##other" processContents="lax">
-            <xs:annotation>
-                <xs:documentation>User-defined attributes may be used on this element as long as they
-                    do not have the same name as an existing attribute used by the schema.</xs:documentation>
-            </xs:annotation>
-        </xs:anyAttribute>
-    </xs:complexType>
-
-    <xs:element name="metadata" type="desc:metadata">
-        <xs:annotation>
-            <xs:documentation>Provides additional information about a BOM.</xs:documentation>
-        </xs:annotation>
-    </xs:element>
-
-</xs:schema>
diff --git a/cyclonedx/__res/schema/ext/bom-descriptor-1.0.xsd b/cyclonedx/__res/schema/ext/bom-descriptor-1.0.xsd
deleted file mode 100644
index 013f550eb..000000000
--- a/cyclonedx/__res/schema/ext/bom-descriptor-1.0.xsd
+++ /dev/null
@@ -1,183 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-CycloneDX BOM Descriptor Extension
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
-           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
-           xmlns:bom="http://cyclonedx.org/schema/bom/1.1"
-           xmlns:bd="http://cyclonedx.org/schema/ext/bom-descriptor/1.0"
-           elementFormDefault="qualified"
-           targetNamespace="http://cyclonedx.org/schema/ext/bom-descriptor/1.0"
-           vc:minVersion="1.0"
-           vc:maxVersion="1.1"
-           version="1.0">
-
-  <xs:annotation>
-    <xs:documentation>
-      <name>CycloneDX BOM Descriptor Extension</name>
-      <url>https://cyclonedx.org/ext/bom-descriptor</url>
-      <license uri="http://www.apache.org/licenses/LICENSE-2.0"
-               version="2.0">Apache License, Version 2.0</license>
-      <authors>
-        <author>Steve Springett</author>
-      </authors>
-    </xs:documentation>
-  </xs:annotation>
-
-  <xs:import namespace="http://cyclonedx.org/schema/bom/1.1" schemaLocation="http://cyclonedx.org/schema/bom/1.1"/>
-
-  <xs:complexType name="metadata">
-    <xs:sequence minOccurs="0" maxOccurs="1">
-      <xs:element name="timestamp" type="xs:dateTime" minOccurs="0">
-        <xs:annotation>
-          <xs:documentation>The date and time (timestamp) when the document was created.</xs:documentation>
-        </xs:annotation>
-      </xs:element>
-      <xs:element name="tool" minOccurs="0" type="bd:toolType">
-        <xs:annotation>
-          <xs:documentation>The tool used to create the BOM.</xs:documentation>
-        </xs:annotation>
-      </xs:element>
-      <xs:element name="authors" minOccurs="0" maxOccurs="1">
-        <xs:annotation>
-          <xs:documentation>The person(s) who created the BOM. Authors are common in BOMs created through
-            manual processes. BOMs created through automated means may not have authors.</xs:documentation>
-        </xs:annotation>
-        <xs:complexType>
-          <xs:sequence minOccurs="0" maxOccurs="unbounded">
-            <xs:element name="author" type="bd:organizationalPerson"/>
-          </xs:sequence>
-        </xs:complexType>
-      </xs:element>
-      <xs:element name="component" type="bom:component" minOccurs="0">
-        <xs:annotation>
-          <xs:documentation>The component that the BOM describes.</xs:documentation>
-        </xs:annotation>
-      </xs:element>
-      <xs:element name="manufacture" type="bd:organizationalEntity" minOccurs="0" maxOccurs="unbounded">
-        <xs:annotation>
-          <xs:documentation>The organization that manufactured the component that the BOM describes.</xs:documentation>
-        </xs:annotation>
-      </xs:element>
-      <xs:element name="supplier" type="bd:organizationalEntity" minOccurs="0" maxOccurs="unbounded">
-        <xs:annotation>
-          <xs:documentation>The organization that supplied the component that the BOM describes. The
-            supplier may often be the manufacture, but may also be a distributor or repackager.</xs:documentation>
-        </xs:annotation>
-      </xs:element>
-    </xs:sequence>
-    <xs:anyAttribute namespace="##other" processContents="lax">
-      <xs:annotation>
-        <xs:documentation>User-defined attributes may be used on this element as long as they
-          do not have the same name as an existing attribute used by the schema.</xs:documentation>
-      </xs:annotation>
-    </xs:anyAttribute>
-  </xs:complexType>
-
-  <xs:complexType name="organizationalEntity">
-    <xs:sequence minOccurs="0" maxOccurs="1">
-      <xs:element name="name" type="xs:normalizedString" minOccurs="0" maxOccurs="1">
-        <xs:annotation>
-          <xs:documentation>The name of the organization</xs:documentation>
-        </xs:annotation>
-      </xs:element>
-      <xs:element name="url" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded">
-        <xs:annotation>
-          <xs:documentation>The URL of the organization. Multiple URLs are allowed.</xs:documentation>
-        </xs:annotation>
-      </xs:element>
-      <xs:element name="contact" type="bd:organizationalPerson" minOccurs="0" maxOccurs="unbounded">
-        <xs:annotation>
-          <xs:documentation>A contact person at the organization. Multiple contacts are allowed.</xs:documentation>
-        </xs:annotation>
-      </xs:element>
-    </xs:sequence>
-    <xs:anyAttribute namespace="##other" processContents="lax">
-      <xs:annotation>
-        <xs:documentation>User-defined attributes may be used on this element as long as they
-          do not have the same name as an existing attribute used by the schema.</xs:documentation>
-      </xs:annotation>
-    </xs:anyAttribute>
-  </xs:complexType>
-
-  <xs:complexType name="toolType">
-    <xs:annotation>
-      <xs:documentation>Specifies a tool (manual or automated).</xs:documentation>
-    </xs:annotation>
-    <xs:sequence minOccurs="0" maxOccurs="1">
-      <xs:element name="vendor" minOccurs="0" maxOccurs="1" type="xs:normalizedString">
-        <xs:annotation>
-          <xs:documentation>The vendor of the tool used to create the BOM.</xs:documentation>
-        </xs:annotation>
-      </xs:element>
-      <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:normalizedString">
-        <xs:annotation>
-          <xs:documentation>The name of the tool used to create the BOM.</xs:documentation>
-        </xs:annotation>
-      </xs:element>
-      <xs:element name="version" minOccurs="0" maxOccurs="1" type="xs:normalizedString">
-        <xs:annotation>
-          <xs:documentation>The version of the tool used to create the BOM.</xs:documentation>
-        </xs:annotation>
-      </xs:element>
-      <xs:element name="hashes" minOccurs="0" maxOccurs="1">
-        <xs:complexType>
-          <xs:sequence minOccurs="0" maxOccurs="unbounded">
-            <xs:element name="hash" type="bom:hashType"/>
-          </xs:sequence>
-        </xs:complexType>
-      </xs:element>
-    </xs:sequence>
-    <xs:anyAttribute namespace="##other" processContents="lax">
-      <xs:annotation>
-        <xs:documentation>User-defined attributes may be used on this element as long as they
-          do not have the same name as an existing attribute used by the schema.</xs:documentation>
-      </xs:annotation>
-    </xs:anyAttribute>
-  </xs:complexType>
-
-  <xs:complexType name="organizationalPerson">
-    <xs:sequence minOccurs="0" maxOccurs="1">
-      <xs:element name="name" type="xs:normalizedString" minOccurs="0" maxOccurs="1">
-        <xs:annotation>
-          <xs:documentation>The name of the person</xs:documentation>
-        </xs:annotation>
-      </xs:element>
-      <xs:element name="email" type="xs:normalizedString" minOccurs="0" maxOccurs="unbounded">
-        <xs:annotation>
-          <xs:documentation>The email address of the person. Multiple email addresses are allowed.</xs:documentation>
-        </xs:annotation>
-      </xs:element>
-      <xs:element name="phone" type="xs:normalizedString" minOccurs="0" maxOccurs="unbounded">
-        <xs:annotation>
-          <xs:documentation>The phone number of the person. Multiple phone numbers are allowed.</xs:documentation>
-        </xs:annotation>
-      </xs:element>
-    </xs:sequence>
-    <xs:anyAttribute namespace="##other" processContents="lax">
-      <xs:annotation>
-        <xs:documentation>User-defined attributes may be used on this element as long as they
-          do not have the same name as an existing attribute used by the schema.</xs:documentation>
-      </xs:annotation>
-    </xs:anyAttribute>
-  </xs:complexType>
-
-  <xs:element name="metadata" type="bd:metadata">
-    <xs:annotation>
-      <xs:documentation>Provides additional information about a BOM.</xs:documentation>
-    </xs:annotation>
-  </xs:element>
-
-</xs:schema>
diff --git a/cyclonedx/__res/schema/ext/dependency-graph-1.0.xsd b/cyclonedx/__res/schema/ext/dependency-graph-1.0.xsd
deleted file mode 100644
index ddcb53656..000000000
--- a/cyclonedx/__res/schema/ext/dependency-graph-1.0.xsd
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-CycloneDX Dependency Graph Extension
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
-           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
-           xmlns:dg="http://cyclonedx.org/schema/ext/dependency-graph/1.0"
-           elementFormDefault="qualified"
-           targetNamespace="http://cyclonedx.org/schema/ext/dependency-graph/1.0"
-           vc:minVersion="1.0"
-           vc:maxVersion="1.1"
-           version="1.0">
-
-    <xs:annotation>
-        <xs:documentation>
-            <name>CycloneDX Dependency Graph Extension</name>
-            <url>https://cyclonedx.org/ext/dependency-graph</url>
-            <license uri="http://www.apache.org/licenses/LICENSE-2.0"
-                version="2.0">Apache License, Version 2.0</license>
-            <authors>
-                <author>Steve Springett</author>
-            </authors>
-        </xs:documentation>
-    </xs:annotation>
-
-    <xs:complexType name="dependency">
-        <xs:sequence minOccurs="0" maxOccurs="unbounded">
-            <xs:element name="dependency" type="dg:dependency"/>
-        </xs:sequence>
-        <xs:attribute name="ref" type="xs:string" use="required">
-            <xs:annotation>
-                <xs:documentation>References a component by the components bom-ref attribute</xs:documentation>
-            </xs:annotation>
-        </xs:attribute>
-        <xs:anyAttribute namespace="##other" processContents="lax">
-            <xs:annotation>
-                <xs:documentation>User-defined attributes may be used on this element as long as they
-                    do not have the same name as an existing attribute used by the schema.</xs:documentation>
-            </xs:annotation>
-        </xs:anyAttribute>
-    </xs:complexType>
-
-    <xs:element name="dependencies">
-        <xs:complexType>
-            <xs:sequence minOccurs="0" maxOccurs="unbounded">
-                <xs:element name="dependency" type="dg:dependency">
-                    <xs:annotation>
-                        <xs:documentation>Components that do not have their own dependencies MUST be declared as empty
-                            elements within the graph. Components that are not represented in the dependency graph MAY
-                            have unknown dependencies. It is RECOMMENDED that implementations assume this to be opaque
-                            and not an indicator of a component being dependency-free.</xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-</xs:schema>
diff --git a/cyclonedx/__res/schema/ext/vulnerability-1.0-SNAPSHOT.schema.json b/cyclonedx/__res/schema/ext/vulnerability-1.0-SNAPSHOT.schema.json
deleted file mode 100644
index 378bd498c..000000000
--- a/cyclonedx/__res/schema/ext/vulnerability-1.0-SNAPSHOT.schema.json
+++ /dev/null
@@ -1,182 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-07/schema#",
-  "$id": "http://cyclonedx.org/schema/ext/vulnerability-1.0-SNAPSHOT.schema.json",
-  "type": "object",
-  "title": "CycloneDX Vulnerability Extension",
-  "$comment" : "CycloneDX Vulnerability Extension for JSON Schema is published under the terms of the Apache License 2.0.",
-  "properties": {
-    "vulnerabilities": {
-      "$id": "#/properties/vulnerabilities",
-      "type": "array",
-      "items": {"$ref": "#/definitions/vulnerability"},
-      "title": "Vulnerabilities",
-      "description": "Defines a list of vulnerabilities."
-    }
-  },
-  "definitions": {
-    "cwe": {
-      "type": "integer",
-      "minimum": 1,
-      "title": "CWE",
-      "description": "Integer representation of a Common Weaknesses Enumerations (CWE). For example 399 (of https://cwe.mitre.org/data/definitions/399.html)"
-    },
-    "severity": {
-      "type": "string",
-      "title": "Severity",
-      "description": "Textual representation of the severity of the vulnerability adopted by the risk analysis method. If an other risk analysis method is used other than whats defined in scoreSourceType, the user is expected to translate appropriately to match with an element value below.",
-      "enum": [
-        "None",
-        "Low",
-        "Medium",
-        "High",
-        "Critical",
-        "Unknown"
-      ]
-    },
-    "scoreValue": {
-      "type": "number",
-      "title": "Score",
-      "description": "Numerical representation of the vulnerability score. Must be a number between 0 - 10 (maps to lowest severity - highest severity)",
-      "multipleOf": 0.1,
-      "examples": [7.9, 10.0]
-    },
-    "scoreSource": {
-      "type": "string",
-      "title": "Source",
-      "description": "Specifies the risk scoring methodology/standard used.",
-      "enum": [
-        "CVSSv2",
-        "CVSSv3",
-        "OWASP Risk",
-        "Open FAIR",
-        "Other"
-      ]
-    },
-    "score": {
-      "type": "object",
-      "title": "Score",
-      "description": "Defines the numerical risk score of a vulnerability",
-      "properties": {
-        "base": {
-          "type": "number",
-          "title": "Base Score",
-          "description": "The base score of the security vulnerability (Refer CVSS standard for example)",
-          "multipleOf": 0.1,
-          "examples": [2.9, 7.2]
-        },
-        "impact": {
-          "type": "number",
-          "title": "Impact Score",
-          "description": "The impact subscore of the security vulnerability (Refer CVSS standard for example)",
-          "multipleOf": 0.1,
-          "examples": [2.9, 7.2]
-        },
-        "exploitability": {
-          "type": "number",
-          "title": "Exploitability Score",
-          "description": "The exploitability subscore of the security vulnerability (Refer CVSS standard for example)",
-          "multipleOf": 0.1,
-          "examples": [2.9, 7.2]
-        }
-      }
-    },
-    "rating": {
-      "type": "object",
-      "title": "Rating",
-      "description": "Defines the risk rating of a vulnerability.",
-      "properties": {
-        "score": {
-          "$ref": "#/definitions/score"
-        },
-        "severity": {
-          "$ref": "#/definitions/severity"
-        },
-        "method": {
-          "$ref": "#/definitions/scoreSource"
-        },
-        "vector": {
-          "type": "string",
-          "title": "Vector",
-          "description": "Textual representation of the metric values used to score the vulnerability see attack vector in https://www.first.org/cvss/v3.1/specification-document"
-        }
-      }
-    },
-    "source": {
-      "type": "object",
-      "title": "Source",
-      "description": "The source of the vulnerability where it is documented. Usually the name of the organization publishing vulnerability information",
-      "properties": {
-        "url": {
-          "type": "string",
-          "title": "URL",
-          "description": "The url of the vulnerability documentation as provided by the source.",
-          "examples": [
-            "https://nvd.nist.gov/vuln/detail/CVE-2019-15842"
-          ]
-        },
-        "name": {
-          "type": "string",
-          "title": "Name",
-          "description": "The name of the source.",
-          "examples": [
-            "NVD", "National Vulnerability Database", "OSS Index", "VulnDB", "NPM Advisories"
-          ]
-        }
-      }
-    },
-    "vulnerability": {
-      "type": "object",
-      "title": "Vulnerability",
-      "description": "Defines the structure of a vulnerability.",
-      "properties": {
-        "ref": {
-          "type": "string",
-          "format": "string",
-          "title": "Reference",
-          "description": "References a component by the components bom-ref attribute"
-        },
-        "id": {
-          "type": "string",
-          "title": "ID",
-          "description": "The id of the vulnerability as defined by the risk scoring methodology. For example CVE-2019-15842 (of https://nvd.nist.gov/vuln/detail/CVE-2019-15842)"
-        },
-        "source": {
-          "$ref": "#/definitions/source"
-        },
-        "ratings": {
-          "type": "array",
-          "title": "Ratings",
-          "description": "List of the vulnerability ratings as defined by various risk rating methodologies.",
-          "items": {"$ref": "#/definitions/rating"}
-        },
-        "cwes": {
-          "type": "array",
-          "title": "CWEs",
-          "description": "List of Common Weaknesses Enumerations (CWEs) codes that describes this vulnerability. For example 399 (of https://cwe.mitre.org/data/definitions/399.html)",
-          "items": {"$ref": "#/definitions/cwe"}
-        },
-        "description": {
-          "type": "string",
-          "title": "Description",
-          "description": "Description of the vulnerability as provided by the source organization"
-        },
-        "recommendations": {
-          "type": "array",
-          "title": "Recommendations",
-          "description": "List of recommendations of how the particular vulnerability can be avoided/mitigated.",
-          "items": {
-            "type": "string"
-          }
-        },
-        "advisories": {
-          "type": "array",
-          "title": "Advisories",
-          "description": "Published advisories of the vulnerability if provided.",
-          "items": {
-            "type": "string"
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cyclonedx/__res/schema/ext/vulnerability-1.0.xsd b/cyclonedx/__res/schema/ext/vulnerability-1.0.xsd
deleted file mode 100644
index 2d6847458..000000000
--- a/cyclonedx/__res/schema/ext/vulnerability-1.0.xsd
+++ /dev/null
@@ -1,291 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-CycloneDX Vulnerability Extension
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
-           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
-           xmlns:vuln="http://cyclonedx.org/schema/ext/vulnerability/1.0"
-           elementFormDefault="qualified"
-           targetNamespace="http://cyclonedx.org/schema/ext/vulnerability/1.0"
-           vc:minVersion="1.0"
-           vc:maxVersion="1.1"
-           version="1.0.0">
-
-    <xs:annotation>
-        <xs:documentation>
-            <name>CycloneDX Vulnerability Extension</name>
-            <url>https://cyclonedx.org/ext/vulnerability</url>
-            <license uri="http://www.apache.org/licenses/LICENSE-2.0"
-                     version="2.0">Apache License, Version 2.0</license>
-        </xs:documentation>
-    </xs:annotation>
-
-    <xs:simpleType name="severityType" final="restriction">
-        <xs:annotation>
-            <xs:documentation xml:lang="en">
-                Textual representation of the severity of the vulnerability adopted by the risk analysis method.
-                If an other risk analysis method is used other than whats defined in scoreSourceType,
-                the user is expected to translate appropriately to match with an element value below.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:restriction base="xs:string">
-            <xs:enumeration value="None"/>
-            <xs:enumeration value="Low"/>
-            <xs:enumeration value="Medium"/>
-            <xs:enumeration value="High"/>
-            <xs:enumeration value="Critical"/>
-            <xs:enumeration value="Unknown"/>
-        </xs:restriction>
-    </xs:simpleType>
-
-    <xs:simpleType name="scoreValueType">
-        <xs:annotation>
-            <xs:documentation xml:lang="en">
-                Numerical representation of the vulnerability score.
-                Must be a number between 0 - 10 (maps to lowest severity - highest severity)
-            </xs:documentation>
-        </xs:annotation>
-        <xs:restriction base="xs:decimal">
-            <xs:minInclusive value="0"/>
-            <xs:fractionDigits value="1"/>
-            <xs:maxInclusive value="10"/>
-        </xs:restriction>
-    </xs:simpleType>
-
-    <xs:simpleType name="scoreSourceType" final="restriction">
-        <xs:annotation>
-            <xs:documentation xml:lang="en">
-                Specifies the risk scoring methodology/standard used.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:restriction base="xs:string">
-            <xs:enumeration value="CVSSv2">
-                <xs:annotation>
-                    <xs:documentation xml:lang="en">
-                        The rating is based on CVSS v2 standard
-                        https://www.first.org/cvss/v2/guide
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="CVSSv3">
-                <xs:annotation>
-                    <xs:documentation xml:lang="en">
-                        The rating is based on CVSS v3 standard
-                        https://www.first.org/cvss/v3.1/specification-document
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="OWASP Risk">
-                <xs:annotation>
-                    <xs:documentation xml:lang="en">
-                        The rating is based on OWASP Risk Rating
-                        https://www.owasp.org/index.php/OWASP_Risk_Rating_Methodology
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="Open FAIR">
-                <xs:annotation>
-                    <xs:documentation xml:lang="en">
-                        The rating is based on Open FAIR specification
-                        http://www.opengroup.org/subjectareas/security/risk
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="Other">
-                <xs:annotation>
-                    <xs:documentation xml:lang="en">
-                        Use this if the risk scoring methodology is not based on any of the options above
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-        </xs:restriction>
-    </xs:simpleType>
-
-    <xs:complexType name="scoreType">
-        <xs:annotation>
-            <xs:documentation xml:lang="en">
-                Defines the numerical risk score of a vulnerability
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="score" minOccurs="0" maxOccurs="1">
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="base" type="vuln:scoreValueType" minOccurs="0" maxOccurs="1">
-                            <xs:annotation>
-                                <xs:documentation xml:lang="en">
-                                    The base score of the security vulnerability (Refer CVSS standard for example)
-                                </xs:documentation>
-                            </xs:annotation>
-                        </xs:element>
-                        <xs:element name="impact" type="vuln:scoreValueType" minOccurs="0" maxOccurs="1">
-                            <xs:annotation>
-                                <xs:documentation xml:lang="en">
-                                    The impact subscore of the security vulnerability (Refer CVSS standard for example)
-                                </xs:documentation>
-                            </xs:annotation>
-                        </xs:element>
-                        <xs:element name="exploitability" type="vuln:scoreValueType" minOccurs="0" maxOccurs="1">
-                            <xs:annotation>
-                                <xs:documentation xml:lang="en">
-                                    The exploitability subscore of the security vulnerability (Refer CVSS standard for
-                                    example)
-                                </xs:documentation>
-                            </xs:annotation>
-                        </xs:element>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-            <xs:element name="severity" type="vuln:severityType" minOccurs="0" maxOccurs="1"/>
-            <xs:element name="method" type="vuln:scoreSourceType" minOccurs="0" maxOccurs="1"/>
-            <xs:element name="vector" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation xml:lang="en">
-                        Textual representation of the metric values used to score the vulnerability
-                        see attack vector in https://www.first.org/cvss/v3.1/specification-document
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="vulnerability">
-        <xs:annotation>
-            <xs:documentation xml:lang="en">
-                Defines the structure of a vulnerability.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="id" type="xs:normalizedString" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation xml:lang="en">
-                        The id of the vulnerability as defined by the risk scoring methodology
-                        For example CVE-2019-15842 (of https://nvd.nist.gov/vuln/detail/CVE-2019-15842)
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="source" minOccurs="0" maxOccurs="1">
-                <xs:complexType>
-                    <xs:annotation>
-                        <xs:documentation xml:lang="en">
-                            The source of the vulnerability where it is documented.
-                            Usually the name of the organization publishing vulnerability information
-                        </xs:documentation>
-                    </xs:annotation>
-                    <xs:sequence>
-                        <xs:element name="url" minOccurs="0" type="xs:anyURI" maxOccurs="1">
-                            <xs:annotation>
-                                <xs:documentation xml:lang="en">
-                                    The url of the vulnerability documentation as provided by the source
-                                    For example https://nvd.nist.gov/vuln/detail/CVE-2019-15842
-                                </xs:documentation>
-                            </xs:annotation>
-                        </xs:element>
-                    </xs:sequence>
-                    <xs:attribute name="name" type="xs:normalizedString" use="required">
-                        <xs:annotation>
-                            <xs:documentation xml:lang="en">
-                                The name of the source. For example "National Vulnerability Database"
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:attribute>
-                </xs:complexType>
-            </xs:element>
-            <xs:element name="ratings" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation xml:lang="en">
-                        List of the vulnerability ratings as defined by various risk rating methodologies.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="rating" type="vuln:scoreType" minOccurs="0" maxOccurs="unbounded"/>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-            <xs:element name="cwes" minOccurs="0" maxOccurs="1">
-                <xs:complexType>
-                    <xs:annotation>
-                        <xs:documentation xml:lang="en">
-                            List of Common Weaknesses Enumerations (CWEs) codes that describes this vulnerability.
-                            For example 399 (of https://cwe.mitre.org/data/definitions/399.html)
-                        </xs:documentation>
-                    </xs:annotation>
-                    <xs:sequence minOccurs="0" maxOccurs="unbounded">
-                        <xs:element name="cwe" type="xs:integer" minOccurs="0" maxOccurs="1"/>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-            <xs:element name="description" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation xml:lang="en">
-                        Description of the vulnerability as provided by the source organization
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="recommendations" minOccurs="0" maxOccurs="1">
-                <xs:complexType>
-                    <xs:annotation>
-                        <xs:documentation xml:lang="en">
-                            The remediation options for the vulnerability if available
-                        </xs:documentation>
-                    </xs:annotation>
-                    <xs:sequence minOccurs="0" maxOccurs="unbounded">
-                        <xs:element name="recommendation" type="xs:string">
-                            <xs:annotation>
-                                <xs:documentation xml:lang="en">
-                                    A recommendation of how the particular vulnerability can be avoided/mitigated.
-                                </xs:documentation>
-                            </xs:annotation>
-                        </xs:element>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-            <xs:element name="advisories" minOccurs="0" maxOccurs="1">
-                <xs:complexType>
-                    <xs:annotation>
-                        <xs:documentation xml:lang="en">
-                            Published advisories of the vulnerability if provided
-                        </xs:documentation>
-                    </xs:annotation>
-                    <xs:sequence minOccurs="0" maxOccurs="unbounded">
-                        <xs:element name="advisory" type="xs:string"/>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-        </xs:sequence>
-        <xs:attribute name="ref" type="xs:string" use="required">
-            <xs:annotation>
-                <xs:documentation>References a component by the components bom-ref attribute</xs:documentation>
-            </xs:annotation>
-        </xs:attribute>
-    </xs:complexType>
-
-    <xs:element name="vulnerabilities">
-        <xs:annotation>
-            <xs:documentation xml:lang="en">
-                Defines a list of vulnerabilities.
-                Vulnerabilities are intended to be used inside the BOM component element.
-                Extending a component ability to declare associated vulnerability information.
-                Each component element optionally can add a vulnerabilities element.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:complexType>
-            <xs:sequence minOccurs="0" maxOccurs="unbounded">
-                <xs:element name="vulnerability" type="vuln:vulnerability"/>
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-</xs:schema>
diff --git a/cyclonedx/__res/schema/jsf-0.82.SNAPSHOT.schema.json b/cyclonedx/__res/schema/jsf-0.82.SNAPSHOT.schema.json
new file mode 100644
index 000000000..20f16f9c3
--- /dev/null
+++ b/cyclonedx/__res/schema/jsf-0.82.SNAPSHOT.schema.json
@@ -0,0 +1,244 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "$id": "http://cyclonedx.org/schema/jsf-0.82.schema.json",
+  "type": "object",
+  "title": "JSON Signature Format (JSF) standard",
+  "$comment" : "JSON Signature Format schema is published under the terms of the Apache License 2.0. JSF was developed by Anders Rundgren (anders.rundgren.net@gmail.com) as a part of the OpenKeyStore project. This schema supports the entirely of the JSF standard excluding 'extensions'.",
+  "definitions": {
+    "signature": {
+      "type": "object",
+      "title": "Signature",
+      "oneOf": [
+        {
+          "additionalProperties": false,
+          "properties": {
+            "signers": {
+              "type": "array",
+              "title": "Signature",
+              "description": "Unique top level property for Multiple Signatures. (multisignature)",
+              "additionalItems": false,
+              "items": {"$ref": "#/definitions/signer"}
+            }
+          }
+        },
+        {
+          "additionalProperties": false,
+          "properties": {
+            "chain": {
+              "type": "array",
+              "title": "Signature",
+              "description": "Unique top level property for Signature Chains. (signaturechain)",
+              "additionalItems": false,
+              "items": {"$ref": "#/definitions/signer"}
+            }
+          }
+        },
+        {
+          "title": "Signature",
+          "description": "Unique top level property for simple signatures. (signaturecore)",
+          "$ref": "#/definitions/signer"
+        }
+      ]
+    },
+    "signer": {
+      "type": "object",
+      "title": "Signature",
+      "required": [
+        "algorithm",
+        "value"
+      ],
+      "additionalProperties": false,
+      "properties": {
+        "algorithm": {
+          "oneOf": [
+            {
+              "type": "string",
+              "title": "Algorithm",
+              "description": "Signature algorithm. The currently recognized JWA [RFC7518] and RFC8037 [RFC8037] asymmetric key algorithms. Note: Unlike RFC8037 [RFC8037] JSF requires explicit Ed* algorithm names instead of \"EdDSA\".",
+              "enum": [
+                "RS256",
+                "RS384",
+                "RS512",
+                "PS256",
+                "PS384",
+                "PS512",
+                "ES256",
+                "ES384",
+                "ES512",
+                "Ed25519",
+                "Ed448",
+                "HS256",
+                "HS384",
+                "HS512"
+              ]
+            },
+            {
+              "type": "string",
+              "title": "Algorithm",
+              "description": "Signature algorithm. Note: If proprietary signature algorithms are added, they must be expressed as URIs.",
+              "format": "uri"
+            }
+          ]
+        },
+        "keyId": {
+          "type": "string",
+          "title": "Key ID",
+          "description": "Optional. Application specific string identifying the signature key."
+        },
+        "publicKey": {
+          "title": "Public key",
+          "description": "Optional. Public key object.",
+          "$ref": "#/definitions/publicKey"
+        },
+        "certificatePath": {
+          "type": "array",
+          "title": "Certificate path",
+          "description": "Optional. Sorted array of X.509 [RFC5280] certificates, where the first element must contain the signature certificate. The certificate path must be contiguous but is not required to be complete.",
+          "additionalItems": false,
+          "items": {
+            "type": "string"
+          }
+        },
+        "excludes": {
+          "type": "array",
+          "title": "Excludes",
+          "description": "Optional. Array holding the names of one or more application level properties that must be excluded from the signature process. Note that the \"excludes\" property itself, must also be excluded from the signature process. Since both the \"excludes\" property and the associated data it points to are unsigned, a conforming JSF implementation must provide options for specifying which properties to accept.",
+          "additionalItems": false,
+          "items": {
+            "type": "string"
+          }
+        },
+        "value": {
+          "type": "string",
+          "title": "Signature",
+          "description": "The signature data. Note that the binary representation must follow the JWA [RFC7518] specifications."
+        }
+      }
+    },
+    "keyType": {
+      "type": "string",
+      "title": "Key type",
+      "description": "Key type indicator.",
+      "enum": [
+        "EC",
+        "OKP",
+        "RSA"
+      ]
+    },
+    "publicKey": {
+      "title": "Public key",
+      "description": "Optional. Public key object.",
+      "type": "object",
+      "required": [
+        "kty"
+      ],
+      "additionalProperties": true,
+      "properties": {
+        "kty": {
+          "$ref": "#/definitions/keyType"
+        }
+      },
+      "allOf": [
+        {
+          "if": {
+            "properties": { "kty": { "const": "EC" } }
+          },
+          "then": {
+            "required": [
+              "kty",
+              "crv",
+              "x",
+              "y"
+            ],
+            "additionalProperties": false,
+            "properties": {
+              "kty": {
+                "$ref": "#/definitions/keyType"
+              },
+              "crv": {
+                "type": "string",
+                "title": "Curve name",
+                "description": "EC curve name.",
+                "enum": [
+                  "P-256",
+                  "P-384",
+                  "P-521"
+                ]
+              },
+              "x": {
+                "type": "string",
+                "title": "Coordinate",
+                "description": "EC curve point X. The length of this field must be the full size of a coordinate for the curve specified in the \"crv\" parameter. For example, if the value of \"crv\" is \"P-521\", the decoded argument must be 66 bytes."
+              },
+              "y": {
+                "type": "string",
+                "title": "Coordinate",
+                "description": "EC curve point Y. The length of this field must be the full size of a coordinate for the curve specified in the \"crv\" parameter. For example, if the value of \"crv\" is \"P-256\", the decoded argument must be 32 bytes."
+              }
+            }
+          }
+        },
+        {
+          "if": {
+            "properties": { "kty": { "const": "OKP" } }
+          },
+          "then": {
+            "required": [
+              "kty",
+              "crv",
+              "x"
+            ],
+            "additionalProperties": false,
+            "properties": {
+              "kty": {
+                "$ref": "#/definitions/keyType"
+              },
+              "crv": {
+                "type": "string",
+                "title": "Curve name",
+                "description": "EdDSA curve name.",
+                "enum": [
+                  "Ed25519",
+                  "Ed448"
+                ]
+              },
+              "x": {
+                "type": "string",
+                "title": "Coordinate",
+                "description": "EdDSA curve point X. The length of this field must be the full size of a coordinate for the curve specified in the \"crv\" parameter. For example, if the value of \"crv\" is \"Ed25519\", the decoded argument must be 32 bytes."
+              }
+            }
+          }
+        },
+        {
+          "if": {
+            "properties": { "kty": { "const": "RSA" } }
+          },
+          "then": {
+            "required": [
+              "kty",
+              "n",
+              "e"
+            ],
+            "additionalProperties": false,
+            "properties": {
+              "kty": {
+                "$ref": "#/definitions/keyType"
+              },
+              "n": {
+                "type": "string",
+                "title": "Modulus",
+                "description": "RSA modulus."
+              },
+              "e": {
+                "type": "string",
+                "title": "Exponent",
+                "description": "RSA exponent."
+              }
+            }
+          }
+        }
+      ]
+    }
+  }
+}
diff --git a/cyclonedx/__res/schema/spdx.schema.json b/cyclonedx/__res/schema/spdx.SNAPSHOT.schema.json
similarity index 92%
rename from cyclonedx/__res/schema/spdx.schema.json
rename to cyclonedx/__res/schema/spdx.SNAPSHOT.schema.json
index 26013fa6b..af6d696d5 100644
--- a/cyclonedx/__res/schema/spdx.schema.json
+++ b/cyclonedx/__res/schema/spdx.SNAPSHOT.schema.json
@@ -1,538 +1,507 @@
 {
   "$schema": "http://json-schema.org/draft-07/schema#",
   "$id": "http://cyclonedx.org/schema/spdx.schema.json",
-  "$comment": "v1.0-3.17",
+  "$comment": "v1.0-3.12",
   "type": "string",
   "enum": [
-    "CC-BY-NC-ND-2.0",
-    "SGI-B-2.0",
-    "LPPL-1.3c",
-    "NIST-PD-fallback",
-    "libtiff",
-    "XSkat",
-    "PDDL-1.0",
-    "KiCad-libraries-exception",
-    "CC-BY-NC-SA-1.0",
-    "GFDL-1.1-no-invariants-only",
-    "Xerox",
-    "LPPL-1.1",
-    "VOSTROM",
-    "UCL-1.0",
-    "ADSL",
-    "OSL-2.0",
+    "AFL-2.0",
     "AAL",
-    "FDK-AAC",
-    "W3C-20150513",
+    "Adobe-2006",
+    "AFL-3.0",
+    "ADSL",
+    "0BSD",
+    "Afmparse",
+    "AFL-1.2",
+    "AGPL-1.0-or-later",
+    "AFL-2.1",
     "AFL-1.1",
-    "W3C",
-    "Sleepycat",
-    "CECILL-1.1",
-    "mpich2",
-    "SISSL",
-    "NLOD-1.0",
+    "AGPL-1.0",
+    "Adobe-Glyph",
+    "AMDPLPA",
+    "Aladdin",
     "ANTLR-PD",
-    "GPL-3.0-only",
-    "gnuplot",
-    "NLOD-2.0",
-    "BSD-3-Clause-Open-MPI",
-    "LiLiQ-P-1.1",
-    "BSD-3-Clause-Clear",
-    "FSFUL",
-    "CC-BY-NC-SA-2.0-UK",
-    "CERN-OHL-S-2.0",
-    "Spencer-94",
-    "CERN-OHL-1.2",
-    "GFDL-1.1-or-later",
-    "AGPL-1.0-or-later",
-    "Wsuipa",
     "AML",
-    "BSD-2-Clause",
-    "DSDP",
-    "CC-BY-2.5",
-    "MIT-CMU",
-    "Beerware",
-    "Sendmail",
-    "TU-Berlin-1.0",
-    "CNRI-Jython",
-    "mplus",
-    "CPOL-1.02",
-    "BSD-3-Clause-No-Nuclear-License-2014",
-    "ISC",
-    "CC-BY-SA-4.0",
-    "Eurosym",
-    "LGPL-3.0-only",
-    "OLDAP-1.3",
-    "GFDL-1.1-invariants-or-later",
-    "Glulxe",
-    "SimPL-2.0",
-    "CDLA-Permissive-2.0",
-    "GPL-2.0-with-font-exception",
-    "OGL-UK-2.0",
-    "CC-BY-SA-3.0-DE",
-    "CC-BY-ND-1.0",
-    "GFDL-1.1",
-    "CC-BY-4.0",
-    "OpenSSL",
-    "TU-Berlin-2.0",
-    "DOC",
-    "GFDL-1.2-no-invariants-or-later",
-    "QPL-1.0",
-    "OLDAP-2.8",
-    "OML",
-    "OLDAP-2.7",
-    "NIST-PD",
-    "Bitstream-Vera",
-    "GFDL-1.2-or-later",
-    "OFL-1.1-RFN",
+    "Apache-1.0",
+    "ANTLR-PD-fallback",
+    "Abstyles",
+    "AGPL-1.0-only",
+    "APAFML",
+    "APSL-1.0",
+    "APSL-1.1",
+    "APSL-2.0",
+    "AGPL-3.0-only",
+    "Apache-1.1",
+    "Apache-2.0",
+    "APL-1.0",
     "Bahyph",
-    "Barr",
-    "COIL-1.0",
-    "GFDL-1.3",
-    "CECILL-B",
-    "JPNIC",
-    "Zed",
-    "ICU",
-    "CC-BY-NC-SA-2.5",
-    "CC-BY-ND-3.0-DE",
-    "bzip2-1.0.5",
-    "SPL-1.0",
-    "YPL-1.0",
-    "OSET-PL-2.1",
-    "Noweb",
-    "RPSL-1.0",
-    "BSD-3-Clause-LBNL",
-    "CDLA-Sharing-1.0",
-    "CECILL-1.0",
+    "Artistic-1.0",
     "AMPAS",
-    "APAFML",
-    "CC-BY-ND-3.0",
-    "D-FSL-1.0",
-    "CC-BY-NC-3.0",
-    "libpng-2.0",
-    "PolyForm-Noncommercial-1.0.0",
-    "dvipdfm",
-    "GFDL-1.3-or-later",
-    "OGTSL",
-    "NPL-1.1",
-    "GPL-3.0",
-    "CERN-OHL-P-2.0",
-    "BlueOak-1.0.0",
+    "Barr",
     "AGPL-3.0-or-later",
+    "BlueOak-1.0.0",
+    "Beerware",
+    "Artistic-1.0-cl8",
     "blessing",
-    "ImageMagick",
-    "APSL-2.0",
-    "MIT-advertising",
-    "curl",
-    "CC0-1.0",
-    "Zimbra-1.4",
-    "SSPL-1.0",
-    "psutils",
-    "CC-BY-SA-2.0-UK",
-    "PSF-2.0",
-    "Net-SNMP",
-    "NAIST-2003",
-    "GFDL-1.2-invariants-or-later",
-    "SGI-B-1.0",
-    "NBPL-1.0",
-    "GFDL-1.2-invariants-only",
-    "W3C-19980720",
-    "OFL-1.0-no-RFN",
-    "NetCDF",
-    "TMate",
-    "NOSL",
-    "CNRI-Python-GPL-Compatible",
+    "Borceux",
+    "BSD-2-Clause-NetBSD",
     "BSD-1-Clause",
-    "CC-BY-NC-SA-3.0-DE",
-    "BSD-3-Clause-Modification",
-    "GLWTPL",
-    "GFDL-1.3-only",
-    "OLDAP-2.2",
-    "CC-BY-ND-4.0",
-    "CC-BY-NC-ND-3.0-DE",
-    "EUPL-1.0",
-    "Linux-OpenIB",
-    "LGPL-2.0-or-later",
-    "OSL-1.1",
-    "Spencer-86",
-    "LGPL-2.0",
-    "CC-PDDC",
-    "CC-BY-NC-ND-3.0",
-    "CDL-1.0",
-    "Elastic-2.0",
-    "CC-BY-2.0",
-    "BSD-3-Clause-No-Military-License",
-    "IJG",
-    "LPPL-1.3a",
-    "SAX-PD",
+    "BSD-2-Clause-Patent",
     "BitTorrent-1.0",
-    "OLDAP-2.0",
-    "Giftware",
+    "BSD-2-Clause-FreeBSD",
+    "BSD-3-Clause-Attribution",
+    "BSD-2-Clause",
+    "APSL-1.2",
+    "BSD-3-Clause-LBNL",
+    "Artistic-2.0",
+    "BSD-3-Clause-No-Nuclear-License-2014",
+    "BSD-3-Clause-Modification",
+    "BSD-4-Clause-Shortened",
+    "BSD-3-Clause",
+    "BSD-3-Clause-Open-MPI",
+    "BitTorrent-1.1",
+    "BSD-3-Clause-No-Nuclear-Warranty",
+    "BSD-Source-Code",
+    "BSD-Protection",
+    "AGPL-3.0",
+    "BUSL-1.1",
+    "Artistic-1.0-Perl",
+    "BSL-1.0",
+    "BSD-2-Clause-Views",
+    "CAL-1.0-Combined-Work-Exception",
+    "CATOSL-1.1",
+    "bzip2-1.0.5",
+    "bzip2-1.0.6",
+    "CC-BY-2.5",
+    "CC-BY-3.0-AT",
     "C-UDA-1.0",
-    "LGPL-2.0+",
-    "Rdisc",
-    "GPL-2.0-with-classpath-exception",
     "CC-BY-3.0-US",
-    "CDDL-1.0",
-    "Xnet",
-    "CPL-1.0",
-    "LGPL-3.0-or-later",
-    "NASA-1.3",
-    "BUSL-1.1",
-    "etalab-2.0",
-    "MIT-open-group",
-    "OLDAP-1.4",
-    "GFDL-1.1-invariants-only",
-    "RPL-1.1",
-    "CC-BY-NC-ND-2.5",
-    "FSFULLR",
-    "Saxpath",
-    "NTP-0",
-    "SISSL-1.2",
-    "GPL-3.0-or-later",
-    "Apache-1.1",
+    "CC-BY-1.0",
+    "CC-BY-NC-1.0",
+    "CC-BY-NC-2.0",
+    "CC-BY-NC-2.5",
+    "CC-BY-2.0",
+    "CC-BY-NC-4.0",
+    "CC-BY-NC-ND-1.0",
+    "CC-BY-NC-ND-2.0",
+    "CC-BY-NC-3.0",
+    "CC-BY-NC-ND-3.0-IGO",
+    "CC-BY-NC-ND-3.0",
+    "BSD-3-Clause-No-Nuclear-License",
+    "CC-BY-NC-ND-4.0",
+    "CC-BY-NC-SA-2.0",
+    "CC-BY-NC-SA-2.5",
+    "CC-BY-NC-SA-3.0",
+    "CC-BY-NC-SA-4.0",
+    "CC-BY-ND-1.0",
+    "BSD-3-Clause-Clear",
+    "CC-BY-ND-2.5",
+    "CC-BY-ND-3.0",
+    "CC-BY-ND-4.0",
+    "CC-BY-SA-1.0",
+    "CC-BY-SA-2.0-UK",
+    "CC-BY-SA-2.0",
     "CC-BY-SA-2.1-JP",
-    "AGPL-3.0-only",
-    "GPL-2.0-with-autoconf-exception",
-    "Artistic-2.0",
-    "App-s2p",
-    "Unicode-DFS-2015",
-    "diffmark",
-    "SNIA",
+    "CC-BY-ND-2.0",
+    "CC-BY-SA-3.0-AT",
+    "CC-BY-SA-3.0",
+    "CC-BY-SA-4.0",
     "CC-BY-SA-2.5",
-    "Linux-man-pages-copyleft",
-    "HPND-sell-variant",
-    "ZPL-2.1",
-    "BSD-4-Clause-UC",
-    "LAL-1.2",
-    "AGPL-1.0-only",
-    "MIT-enna",
-    "Condor-1.1",
-    "Naumen",
-    "GFDL-1.3-no-invariants-or-later",
-    "RPL-1.5",
-    "PolyForm-Small-Business-1.0.0",
-    "EFL-1.0",
-    "MirOS",
-    "CC-BY-2.5-AU",
-    "Afmparse",
-    "MPL-2.0-no-copyleft-exception",
-    "LiLiQ-Rplus-1.1",
-    "AFL-1.2",
-    "OSL-1.0",
-    "GPL-1.0-only",
-    "APSL-1.0",
-    "OGL-Canada-2.0",
-    "CPAL-1.0",
-    "Latex2e",
-    "Zend-2.0",
-    "Unlicense",
-    "xpp",
-    "CC-BY-NC-1.0",
-    "GPL-3.0-with-autoconf-exception",
-    "CC-BY-NC-SA-3.0",
-    "TCP-wrappers",
-    "SCEA",
-    "SSH-short",
-    "CC-BY-3.0-NL",
-    "SchemeReport",
     "CC-BY-3.0",
-    "MPL-2.0",
-    "Unicode-TOU",
-    "CC-BY-NC-ND-1.0",
+    "CDDL-1.0",
+    "CC0-1.0",
+    "CC-BY-NC-ND-2.5",
+    "CC-BY-NC-SA-1.0",
+    "Caldera",
+    "CDLA-Permissive-1.0",
+    "CC-BY-4.0",
+    "CC-PDDC",
+    "BSD-4-Clause-UC",
+    "BSD-4-Clause",
+    "CAL-1.0",
+    "CDDL-1.1",
+    "CERN-OHL-1.2",
+    "CERN-OHL-1.1",
+    "CERN-OHL-P-2.0",
+    "CERN-OHL-S-2.0",
+    "CECILL-1.1",
+    "CECILL-2.0",
+    "CECILL-1.0",
+    "CNRI-Python",
+    "CNRI-Python-GPL-Compatible",
+    "copyleft-next-0.3.0",
+    "CPAL-1.0",
+    "copyleft-next-0.3.1",
+    "CPL-1.0",
+    "ClArtistic",
+    "CECILL-C",
+    "CNRI-Jython",
+    "Condor-1.1",
+    "CPOL-1.02",
+    "curl",
+    "diffmark",
+    "Crossword",
+    "Dotseqn",
+    "DOC",
+    "DSDP",
+    "DRL-1.0",
+    "ECL-1.0",
+    "ECL-2.0",
+    "eCos-2.0",
+    "CrystalStacker",
+    "CERN-OHL-W-2.0",
+    "D-FSL-1.0",
+    "eGenix",
+    "EPICS",
     "Entessa",
-    "BSD-3-Clause-No-Nuclear-License",
-    "SWL",
-    "GFDL-1.2-no-invariants-only",
-    "Parity-7.0.0",
-    "OLDAP-2.2.1",
-    "SGI-B-1.1",
+    "EPL-1.0",
+    "EFL-2.0",
+    "CUA-OPL-1.0",
+    "etalab-2.0",
+    "EUPL-1.0",
+    "ErlPL-1.1",
+    "EUDatagrid",
+    "EUPL-1.1",
+    "Cube",
+    "dvipdfm",
+    "FreeBSD-DOC",
+    "Eurosym",
+    "FSFAP",
+    "FreeImage",
+    "FSFULLR",
+    "FSFUL",
+    "GD",
+    "GFDL-1.1-invariants-only",
+    "EUPL-1.2",
+    "EPL-2.0",
+    "GFDL-1.1-no-invariants-or-later",
+    "GFDL-1.1-only",
+    "GFDL-1.1-or-later",
+    "GFDL-1.1",
     "FTL",
-    "OLDAP-2.4",
-    "CC-BY-NC-4.0",
-    "bzip2-1.0.6",
-    "copyleft-next-0.3.0",
-    "MakeIndex",
-    "NRL",
-    "GFDL-1.3-invariants-or-later",
-    "CC-BY-NC-2.0",
-    "SugarCRM-1.1.3",
-    "AFL-2.1",
-    "GPL-2.0-only",
+    "GFDL-1.2-invariants-or-later",
+    "GFDL-1.1-invariants-or-later",
+    "GFDL-1.2-invariants-only",
+    "GFDL-1.2-only",
+    "GFDL-1.2-or-later",
+    "GFDL-1.2",
+    "GFDL-1.2-no-invariants-only",
     "GFDL-1.3-invariants-only",
-    "TORQUE-1.1",
-    "Ruby",
-    "X11",
-    "Borceux",
-    "Libpng",
-    "X11-distribute-modifications-variant",
+    "GFDL-1.3-no-invariants-only",
+    "GFDL-1.3-invariants-or-later",
+    "GFDL-1.2-no-invariants-or-later",
+    "Fair",
     "Frameworx-1.0",
-    "NCGL-UK-2.0",
-    "CECILL-2.1",
-    "CC-BY-3.0-AT",
-    "CNRI-Python",
-    "NCSA",
-    "gSOAP-1.3b",
-    "EUPL-1.1",
-    "AMDPLPA",
-    "Imlib2",
-    "CDDL-1.1",
-    "WTFPL",
-    "LPL-1.0",
-    "EPL-1.0",
-    "BSD-3-Clause-Attribution",
-    "OSL-3.0",
-    "RHeCos-1.1",
-    "PHP-3.0",
-    "BSD-Protection",
-    "CC-BY-NC-3.0-DE",
-    "APL-1.0",
-    "EUDatagrid",
+    "Giftware",
+    "GFDL-1.1-no-invariants-only",
+    "GL2PS",
+    "Glulxe",
+    "Glide",
+    "gnuplot",
+    "GLWTPL",
+    "GPL-1.0-only",
+    "GPL-1.0-or-later",
     "GPL-1.0",
-    "SHL-0.5",
-    "CC-BY-SA-2.0",
-    "CC-BY-SA-3.0-AT",
-    "CC-BY-NC-SA-3.0-IGO",
-    "Adobe-2006",
-    "Newsletr",
-    "Nunit",
-    "Multics",
-    "OGL-UK-1.0",
-    "Vim",
-    "eCos-2.0",
-    "Zimbra-1.3",
-    "eGenix",
-    "IBM-pibs",
-    "BitTorrent-1.1",
-    "OFL-1.1-no-RFN",
-    "psfrag",
-    "CC-BY-ND-2.0",
-    "SHL-0.51",
-    "FreeBSD-DOC",
-    "Python-2.0",
-    "Mup",
-    "BSD-4-Clause-Shortened",
-    "CC-BY-NC-SA-4.0",
-    "HPND",
-    "OLDAP-2.6",
-    "MPL-1.1",
+    "GFDL-1.3-only",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-2.0-with-autoconf-exception",
+    "GPL-2.0+",
+    "GFDL-1.3",
+    "GPL-1.0+",
+    "CDLA-Sharing-1.0",
+    "GPL-2.0-with-classpath-exception",
     "GPL-2.0-with-GCC-exception",
+    "GPL-2.0-with-bison-exception",
+    "GPL-2.0-with-font-exception",
+    "GPL-2.0",
+    "CECILL-2.1",
+    "GPL-3.0",
+    "GPL-3.0+",
+    "GPL-3.0-with-autoconf-exception",
+    "GPL-3.0-only",
+    "Hippocratic-2.1",
+    "HPND",
+    "HTMLTIDY",
+    "GPL-3.0-with-GCC-exception",
     "HaskellReport",
-    "ECL-1.0",
+    "GPL-3.0-or-later",
+    "ICU",
+    "ImageMagick",
+    "iMatix",
+    "IBM-pibs",
+    "Intel-ACPI",
+    "Intel",
+    "Info-ZIP",
+    "IPA",
+    "IJG",
+    "ISC",
+    "JasPer-2.0",
+    "JPNIC",
+    "JSON",
+    "LAL-1.2",
+    "LAL-1.3",
+    "Latex2e",
+    "Leptonica",
+    "HPND-sell-variant",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "Imlib2",
+    "IPL-1.0",
+    "LGPL-2.1-only",
     "LGPL-2.1-or-later",
-    "OFL-1.0",
-    "APSL-1.1",
-    "MITNFA",
-    "CECILL-2.0",
-    "Crossword",
-    "Aladdin",
-    "Baekmuk",
-    "XFree86-1.1",
-    "GPL-1.0-or-later",
-    "CERN-OHL-W-2.0",
-    "CC-BY-SA-1.0",
-    "NTP",
-    "PHP-3.01",
-    "OCLC-2.0",
-    "CC-BY-3.0-DE",
-    "CC-BY-NC-2.5",
-    "Zlib",
-    "CATOSL-1.1",
+    "LGPL-2.0+",
+    "LGPL-2.0",
+    "CECILL-B",
+    "LGPL-3.0-or-later",
+    "LGPL-3.0-only",
+    "LGPLLR",
+    "libpng-2.0",
+    "Libpng",
+    "libselinux-1.0",
     "LGPL-3.0+",
-    "CAL-1.0",
-    "NPL-1.0",
-    "SMLNJ",
-    "GPL-2.0+",
-    "OLDAP-2.5",
-    "JasPer-2.0",
-    "GPL-2.0-or-later",
-    "BSD-2-Clause-Patent",
+    "EFL-1.0",
+    "libtiff",
+    "GFDL-1.3-no-invariants-or-later",
+    "LiLiQ-Rplus-1.1",
+    "LiLiQ-R-1.1",
+    "LPL-1.0",
+    "LiLiQ-P-1.1",
+    "Linux-OpenIB",
+    "LPPL-1.0",
+    "LPPL-1.2",
+    "LPPL-1.3a",
+    "LPL-1.02",
+    "LPPL-1.3c",
+    "MakeIndex",
+    "LGPL-2.1+",
+    "LPPL-1.1",
+    "MIT-CMU",
+    "MirOS",
+    "MIT-advertising",
+    "MIT-Modern-Variant",
+    "MIT",
+    "MIT-enna",
+    "MIT-open-group",
+    "MIT-feh",
+    "MITNFA",
+    "MPL-1.0",
+    "mpich2",
+    "MPL-2.0",
+    "MPL-2.0-no-copyleft-exception",
     "MS-RL",
-    "CUA-OPL-1.0",
-    "IPA",
+    "MTLL",
+    "MPL-1.1",
+    "MulanPSL-2.0",
+    "Motosoto",
+    "Mup",
+    "MulanPSL-1.0",
+    "NAIST-2003",
+    "Naumen",
+    "Multics",
+    "NBPL-1.0",
+    "NCSA",
+    "Net-SNMP",
+    "NetCDF",
+    "NASA-1.3",
+    "NGPL",
+    "NIST-PD-fallback",
+    "NIST-PD",
+    "Newsletr",
     "NLPL",
+    "Nokia",
+    "NOSL",
+    "Noweb",
+    "NLOD-1.0",
+    "NPL-1.0",
+    "NCGL-UK-2.0",
+    "NRL",
+    "NTP-0",
+    "NTP",
+    "GFDL-1.3-or-later",
+    "Nunit",
     "O-UDA-1.0",
-    "MIT-Modern-Variant",
-    "OLDAP-1.2",
-    "BSD-2-Clause-FreeBSD",
-    "Info-ZIP",
-    "CC-BY-NC-SA-2.0-FR",
-    "0BSD",
-    "Unicode-DFS-2016",
+    "NPL-1.1",
+    "OCCT-PL",
+    "ODC-By-1.0",
+    "OFL-1.0-no-RFN",
+    "OCLC-2.0",
     "OFL-1.0-RFN",
-    "Intel",
-    "AFL-2.0",
-    "GL2PS",
-    "TAPR-OHL-1.0",
-    "Apache-1.0",
-    "MTLL",
-    "Motosoto",
+    "OFL-1.0",
+    "OFL-1.1-no-RFN",
+    "OFL-1.1-RFN",
+    "OFL-1.1",
+    "OGDL-Taiwan-1.0",
+    "OGC-1.0",
+    "OGL-UK-1.0",
+    "OGL-UK-2.0",
+    "OGL-UK-3.0",
+    "OGTSL",
+    "OLDAP-1.1",
+    "OLDAP-1.2",
+    "OLDAP-1.3",
+    "OGL-Canada-2.0",
+    "OLDAP-2.0.1",
+    "OLDAP-2.0",
+    "OLDAP-2.1",
+    "OLDAP-2.2.1",
+    "OLDAP-2.2.2",
+    "OLDAP-2.2",
+    "ODbL-1.0",
+    "OLDAP-2.4",
+    "OLDAP-1.4",
+    "OLDAP-2.3",
+    "OLDAP-2.7",
+    "OLDAP-2.8",
+    "OML",
+    "OpenSSL",
+    "OLDAP-2.6",
+    "OPL-1.0",
+    "OSL-1.0",
+    "OSL-1.1",
+    "OSL-2.0",
+    "OSET-PL-2.1",
+    "OSL-2.1",
+    "Parity-6.0.0",
+    "Parity-7.0.0",
+    "PDDL-1.0",
+    "PHP-3.0",
+    "OSL-3.0",
+    "Plexus",
+    "MS-PL",
+    "PolyForm-Small-Business-1.0.0",
+    "PolyForm-Noncommercial-1.0.0",
+    "PSF-2.0",
+    "psfrag",
+    "PostgreSQL",
+    "psutils",
+    "Qhull",
+    "QPL-1.0",
+    "Rdisc",
+    "Python-2.0",
+    "RPL-1.1",
+    "RPL-1.5",
+    "RHeCos-1.1",
     "RSA-MD",
-    "Community-Spec-1.0",
-    "ODC-By-1.0",
-    "zlib-acknowledgement",
-    "DL-DE-BY-2.0",
-    "VSL-1.0",
-    "LiLiQ-R-1.1",
-    "OPL-1.0",
-    "GPL-3.0+",
-    "MulanPSL-2.0",
-    "APSL-1.2",
-    "OGDL-Taiwan-1.0",
     "RSCPL",
-    "OGC-1.0",
-    "EFL-2.0",
-    "CAL-1.0-Combined-Work-Exception",
-    "MS-PL",
-    "Plexus",
+    "Ruby",
+    "SAX-PD",
+    "Saxpath",
+    "SCEA",
     "Sendmail-8.23",
-    "Cube",
-    "JSON",
-    "EUPL-1.2",
-    "Adobe-Glyph",
-    "FreeImage",
-    "Watcom-1.0",
-    "Jam",
-    "Hippocratic-2.1",
-    "OLDAP-2.0.1",
-    "CC-BY-NC-SA-2.0",
-    "Nokia",
-    "OCCT-PL",
-    "ErlPL-1.1",
+    "Sendmail",
+    "SGI-B-1.0",
+    "SGI-B-1.1",
+    "SGI-B-2.0",
+    "SHL-0.5",
+    "SHL-0.51",
+    "SimPL-2.0",
+    "SISSL-1.2",
+    "SISSL",
+    "Sleepycat",
+    "SMLNJ",
+    "SMPPL",
+    "SNIA",
+    "Spencer-86",
+    "Spencer-94",
+    "Spencer-99",
+    "SPL-1.0",
+    "SSH-OpenSSH",
+    "PHP-3.01",
+    "SSH-short",
+    "MIT-0",
+    "RPSL-1.0",
+    "SWL",
+    "SugarCRM-1.1.3",
+    "TCL",
+    "TCP-wrappers",
+    "SSPL-1.0",
+    "TMate",
     "TOSL",
-    "OSL-2.1",
-    "ClArtistic",
+    "TORQUE-1.1",
+    "TAPR-OHL-1.0",
+    "UCL-1.0",
+    "Unicode-DFS-2015",
+    "Unicode-DFS-2016",
+    "Unicode-TOU",
+    "TU-Berlin-1.0",
+    "UPL-1.0",
+    "Unlicense",
+    "VOSTROM",
+    "Vim",
+    "VSL-1.0",
+    "W3C-20150513",
+    "W3C",
+    "W3C-19980720",
+    "Wsuipa",
+    "Watcom-1.0",
+    "WTFPL",
+    "X11",
+    "Xerox",
+    "XFree86-1.1",
     "xinetd",
-    "GPL-3.0-with-GCC-exception",
-    "ODbL-1.0",
-    "MIT",
-    "LGPL-2.1+",
-    "LGPL-2.1-only",
-    "CrystalStacker",
-    "ECL-2.0",
-    "LPPL-1.0",
-    "iMatix",
-    "CC-BY-NC-ND-3.0-IGO",
-    "BSD-Source-Code",
-    "Parity-6.0.0",
-    "TCL",
-    "Arphic-1999",
-    "CC-BY-SA-3.0",
-    "Caldera",
-    "AGPL-1.0",
-    "IPL-1.0",
-    "LAL-1.3",
-    "EPICS",
-    "NGPL",
-    "DRL-1.0",
-    "BSD-2-Clause-NetBSD",
-    "ZPL-1.1",
-    "GD",
-    "LPPL-1.2",
-    "Dotseqn",
-    "Spencer-99",
-    "OLDAP-2.3",
+    "Xnet",
+    "xpp",
+    "XSkat",
+    "YPL-1.0",
     "YPL-1.1",
-    "Fair",
-    "Qhull",
-    "GFDL-1.1-no-invariants-or-later",
-    "CECILL-C",
-    "MulanPSL-1.0",
-    "OLDAP-1.1",
-    "OLDAP-2.1",
-    "LPL-1.02",
-    "UPL-1.0",
-    "Abstyles",
+    "Zed",
+    "Zend-2.0",
+    "TU-Berlin-2.0",
+    "Zimbra-1.4",
+    "zlib-acknowledgement",
+    "Zlib",
+    "ZPL-1.1",
     "ZPL-2.0",
-    "MIT-0",
-    "LGPL-2.0-only",
-    "GFDL-1.3-no-invariants-only",
-    "AGPL-3.0",
-    "EPL-2.0",
-    "AFL-3.0",
-    "CDLA-Permissive-1.0",
-    "Artistic-1.0",
-    "CC-BY-NC-ND-4.0",
-    "HTMLTIDY",
-    "Glide",
-    "FSFAP",
-    "LGPLLR",
-    "OGL-UK-3.0",
-    "GFDL-1.2",
-    "SSH-OpenSSH",
-    "GFDL-1.1-only",
-    "MIT-feh",
-    "MPL-1.0",
-    "PostgreSQL",
-    "OLDAP-2.2.2",
-    "SMPPL",
-    "OFL-1.1",
-    "Leptonica",
-    "CERN-OHL-1.1",
-    "BSD-3-Clause-No-Nuclear-Warranty",
-    "CC-BY-ND-2.5",
-    "CC-BY-1.0",
-    "GFDL-1.2-only",
-    "OPUBL-1.0",
-    "libselinux-1.0",
-    "BSD-3-Clause",
-    "ANTLR-PD-fallback",
-    "copyleft-next-0.3.1",
-    "GPL-1.0+",
+    "ZPL-2.1",
     "wxWindows",
-    "LGPL-3.0",
-    "LGPL-2.1",
-    "StandardML-NJ",
-    "BSD-4-Clause",
-    "GPL-2.0-with-bison-exception",
-    "Apache-2.0",
-    "Artistic-1.0-cl8",
-    "GPL-2.0",
-    "Intel-ACPI",
-    "BSL-1.0",
-    "Artistic-1.0-Perl",
-    "BSD-2-Clause-Views",
+    "Zimbra-1.3",
+    "gSOAP-1.3b",
     "Interbase-1.0",
+    "LGPL-2.1",
+    "LGPL-3.0",
     "NPOSL-3.0",
-    "FLTK-exception",
-    "Bootloader-exception",
-    "WxWindows-exception-3.1",
-    "Linux-syscall-note",
-    "Qt-LGPL-exception-1.1",
-    "LLVM-exception",
-    "PS-or-PDF-font-exception-20170817",
-    "GCC-exception-3.1",
+    "OLDAP-2.5",
+    "StandardML-NJ",
+    "389-exception",
+    "Autoconf-exception-2.0",
     "Autoconf-exception-3.0",
-    "LGPL-3.0-linking-exception",
-    "GCC-exception-2.0",
     "Bison-exception-2.2",
-    "openvpn-openssl-exception",
-    "Libtool-exception",
-    "Autoconf-exception-2.0",
+    "Bootloader-exception",
+    "Classpath-exception-2.0",
+    "CLISP-exception-2.0",
+    "DigiRule-FOSS-exception",
+    "eCos-exception-2.0",
+    "Fawkes-Runtime-exception",
+    "FLTK-exception",
+    "Font-exception-2.0",
+    "freertos-exception-2.0",
+    "GCC-exception-2.0",
+    "GCC-exception-3.1",
+    "gnu-javamail-exception",
+    "GPL-3.0-linking-exception",
     "GPL-3.0-linking-source-exception",
     "GPL-CC-1.0",
-    "OCaml-LGPL-linking-exception",
-    "Universal-FOSS-exception-1.0",
     "i2p-gpl-java-exception",
-    "CLISP-exception-2.0",
+    "LGPL-3.0-linking-exception",
+    "Libtool-exception",
+    "Linux-syscall-note",
+    "LLVM-exception",
+    "LZMA-exception",
+    "mif-exception",
+    "Nokia-Qt-exception-1.1",
+    "OCaml-LGPL-linking-exception",
     "OCCT-exception-1.0",
-    "Qwt-exception-1.0",
-    "gnu-javamail-exception",
-    "u-boot-exception-2.0",
-    "freertos-exception-2.0",
-    "Qt-GPL-exception-1.0",
     "OpenJDK-assembly-exception-1.0",
+    "openvpn-openssl-exception",
+    "PS-or-PDF-font-exception-20170817",
+    "Qt-GPL-exception-1.0",
+    "Qt-LGPL-exception-1.1",
+    "Qwt-exception-1.0",
+    "SHL-2.0",
     "SHL-2.1",
-    "mif-exception",
-    "Fawkes-Runtime-exception",
     "Swift-exception",
-    "GPL-3.0-linking-exception",
-    "SHL-2.0",
-    "Classpath-exception-2.0",
-    "LZMA-exception",
-    "Font-exception-2.0",
-    "Nokia-Qt-exception-1.1",
-    "DigiRule-FOSS-exception",
-    "eCos-exception-2.0",
-    "389-exception"
+    "u-boot-exception-2.0",
+    "Universal-FOSS-exception-1.0",
+    "WxWindows-exception-3.1"
   ]
-}
\ No newline at end of file
+}
diff --git a/cyclonedx/__res/schema/spdx.xsd b/cyclonedx/__res/schema/spdx.SNAPSHOT.xsd
similarity index 93%
rename from cyclonedx/__res/schema/spdx.xsd
rename to cyclonedx/__res/schema/spdx.SNAPSHOT.xsd
index 4fb43642d..b45e2de06 100644
--- a/cyclonedx/__res/schema/spdx.xsd
+++ b/cyclonedx/__res/schema/spdx.SNAPSHOT.xsd
@@ -2,2059 +2,2049 @@
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
            elementFormDefault="qualified"
            targetNamespace="http://cyclonedx.org/schema/spdx"
-           version="1.0-3.17">
+           version="1.0-3.12">
 
     <xs:simpleType name="licenseId">
         <xs:restriction base="xs:string">
             <!-- Licenses -->
-            <xs:enumeration value="CC-BY-NC-ND-2.0">
+            <xs:enumeration value="AFL-2.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 2.0 Generic</xs:documentation>
+                    <xs:documentation>Academic Free License v2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SGI-B-2.0">
+            <xs:enumeration value="AAL">
                 <xs:annotation>
-                    <xs:documentation>SGI Free Software License B v2.0</xs:documentation>
+                    <xs:documentation>Attribution Assurance License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LPPL-1.3c">
+            <xs:enumeration value="Adobe-2006">
                 <xs:annotation>
-                    <xs:documentation>LaTeX Project Public License v1.3c</xs:documentation>
+                    <xs:documentation>Adobe Systems Incorporated Source Code License Agreement</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NIST-PD-fallback">
+            <xs:enumeration value="AFL-3.0">
                 <xs:annotation>
-                    <xs:documentation>NIST Public Domain Notice with license fallback</xs:documentation>
+                    <xs:documentation>Academic Free License v3.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="libtiff">
+            <xs:enumeration value="ADSL">
                 <xs:annotation>
-                    <xs:documentation>libtiff License</xs:documentation>
+                    <xs:documentation>Amazon Digital Services License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="XSkat">
+            <xs:enumeration value="0BSD">
                 <xs:annotation>
-                    <xs:documentation>XSkat License</xs:documentation>
+                    <xs:documentation>BSD Zero Clause License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="PDDL-1.0">
+            <xs:enumeration value="Afmparse">
                 <xs:annotation>
-                    <xs:documentation>Open Data Commons Public Domain Dedication &amp; License 1.0</xs:documentation>
+                    <xs:documentation>Afmparse License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="KiCad-libraries-exception">
+            <xs:enumeration value="AFL-1.2">
                 <xs:annotation>
-                    <xs:documentation>KiCad Libraries Exception</xs:documentation>
+                    <xs:documentation>Academic Free License v1.2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-SA-1.0">
+            <xs:enumeration value="AGPL-1.0-or-later">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 1.0 Generic</xs:documentation>
+                    <xs:documentation>Affero General Public License v1.0 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.1-no-invariants-only">
+            <xs:enumeration value="AFL-2.1">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.1 only - no invariants</xs:documentation>
+                    <xs:documentation>Academic Free License v2.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Xerox">
+            <xs:enumeration value="AFL-1.1">
                 <xs:annotation>
-                    <xs:documentation>Xerox License</xs:documentation>
+                    <xs:documentation>Academic Free License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LPPL-1.1">
+            <xs:enumeration value="AGPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>LaTeX Project Public License v1.1</xs:documentation>
+                    <xs:documentation>Affero General Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="VOSTROM">
+            <xs:enumeration value="Adobe-Glyph">
                 <xs:annotation>
-                    <xs:documentation>VOSTROM Public License for Open Source</xs:documentation>
+                    <xs:documentation>Adobe Glyph List License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="UCL-1.0">
+            <xs:enumeration value="AMDPLPA">
                 <xs:annotation>
-                    <xs:documentation>Upstream Compatibility License v1.0</xs:documentation>
+                    <xs:documentation>AMD&apos;s plpa_map.c License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="ADSL">
+            <xs:enumeration value="Aladdin">
                 <xs:annotation>
-                    <xs:documentation>Amazon Digital Services License</xs:documentation>
+                    <xs:documentation>Aladdin Free Public License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OSL-2.0">
+            <xs:enumeration value="ANTLR-PD">
                 <xs:annotation>
-                    <xs:documentation>Open Software License 2.0</xs:documentation>
+                    <xs:documentation>ANTLR Software Rights Notice</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AAL">
+            <xs:enumeration value="AML">
                 <xs:annotation>
-                    <xs:documentation>Attribution Assurance License</xs:documentation>
+                    <xs:documentation>Apple MIT License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="FDK-AAC">
+            <xs:enumeration value="Apache-1.0">
                 <xs:annotation>
-                    <xs:documentation>Fraunhofer FDK AAC Codec Library</xs:documentation>
+                    <xs:documentation>Apache License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="W3C-20150513">
+            <xs:enumeration value="ANTLR-PD-fallback">
                 <xs:annotation>
-                    <xs:documentation>W3C Software Notice and Document License (2015-05-13)</xs:documentation>
+                    <xs:documentation>ANTLR Software Rights Notice with license fallback</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AFL-1.1">
+            <xs:enumeration value="Abstyles">
                 <xs:annotation>
-                    <xs:documentation>Academic Free License v1.1</xs:documentation>
+                    <xs:documentation>Abstyles License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="W3C">
+            <xs:enumeration value="AGPL-1.0-only">
                 <xs:annotation>
-                    <xs:documentation>W3C Software Notice and License (2002-12-31)</xs:documentation>
+                    <xs:documentation>Affero General Public License v1.0 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Sleepycat">
+            <xs:enumeration value="APAFML">
                 <xs:annotation>
-                    <xs:documentation>Sleepycat License</xs:documentation>
+                    <xs:documentation>Adobe Postscript AFM License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CECILL-1.1">
+            <xs:enumeration value="APSL-1.0">
                 <xs:annotation>
-                    <xs:documentation>CeCILL Free Software License Agreement v1.1</xs:documentation>
+                    <xs:documentation>Apple Public Source License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="mpich2">
+            <xs:enumeration value="APSL-1.1">
                 <xs:annotation>
-                    <xs:documentation>mpich2 License</xs:documentation>
+                    <xs:documentation>Apple Public Source License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SISSL">
+            <xs:enumeration value="APSL-2.0">
                 <xs:annotation>
-                    <xs:documentation>Sun Industry Standards Source License v1.1</xs:documentation>
+                    <xs:documentation>Apple Public Source License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NLOD-1.0">
+            <xs:enumeration value="AGPL-3.0-only">
                 <xs:annotation>
-                    <xs:documentation>Norwegian Licence for Open Government Data (NLOD) 1.0</xs:documentation>
+                    <xs:documentation>GNU Affero General Public License v3.0 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="ANTLR-PD">
+            <xs:enumeration value="Apache-1.1">
                 <xs:annotation>
-                    <xs:documentation>ANTLR Software Rights Notice</xs:documentation>
+                    <xs:documentation>Apache License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-3.0-only">
+            <xs:enumeration value="Apache-2.0">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v3.0 only</xs:documentation>
+                    <xs:documentation>Apache License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="gnuplot">
+            <xs:enumeration value="APL-1.0">
                 <xs:annotation>
-                    <xs:documentation>gnuplot License</xs:documentation>
+                    <xs:documentation>Adaptive Public License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NLOD-2.0">
+            <xs:enumeration value="Bahyph">
                 <xs:annotation>
-                    <xs:documentation>Norwegian Licence for Open Government Data (NLOD) 2.0</xs:documentation>
+                    <xs:documentation>Bahyph License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-3-Clause-Open-MPI">
+            <xs:enumeration value="Artistic-1.0">
                 <xs:annotation>
-                    <xs:documentation>BSD 3-Clause Open MPI variant</xs:documentation>
+                    <xs:documentation>Artistic License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LiLiQ-P-1.1">
+            <xs:enumeration value="AMPAS">
                 <xs:annotation>
-                    <xs:documentation>Licence Libre du Québec – Permissive version 1.1</xs:documentation>
+                    <xs:documentation>Academy of Motion Picture Arts and Sciences BSD</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-3-Clause-Clear">
+            <xs:enumeration value="Barr">
                 <xs:annotation>
-                    <xs:documentation>BSD 3-Clause Clear License</xs:documentation>
+                    <xs:documentation>Barr License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="FSFUL">
+            <xs:enumeration value="AGPL-3.0-or-later">
                 <xs:annotation>
-                    <xs:documentation>FSF Unlimited License</xs:documentation>
+                    <xs:documentation>GNU Affero General Public License v3.0 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-SA-2.0-UK">
+            <xs:enumeration value="BlueOak-1.0.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 2.0 England and Wales</xs:documentation>
+                    <xs:documentation>Blue Oak Model License 1.0.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CERN-OHL-S-2.0">
+            <xs:enumeration value="Beerware">
                 <xs:annotation>
-                    <xs:documentation>CERN Open Hardware Licence Version 2 - Strongly Reciprocal</xs:documentation>
+                    <xs:documentation>Beerware License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Spencer-94">
+            <xs:enumeration value="Artistic-1.0-cl8">
                 <xs:annotation>
-                    <xs:documentation>Spencer License 94</xs:documentation>
+                    <xs:documentation>Artistic License 1.0 w/clause 8</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CERN-OHL-1.2">
+            <xs:enumeration value="blessing">
                 <xs:annotation>
-                    <xs:documentation>CERN Open Hardware Licence v1.2</xs:documentation>
+                    <xs:documentation>SQLite Blessing</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.1-or-later">
+            <xs:enumeration value="Borceux">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.1 or later</xs:documentation>
+                    <xs:documentation>Borceux license</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AGPL-1.0-or-later">
+            <xs:enumeration value="BSD-2-Clause-NetBSD">
                 <xs:annotation>
-                    <xs:documentation>Affero General Public License v1.0 or later</xs:documentation>
+                    <xs:documentation>BSD 2-Clause NetBSD License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Wsuipa">
+            <xs:enumeration value="BSD-1-Clause">
                 <xs:annotation>
-                    <xs:documentation>Wsuipa License</xs:documentation>
+                    <xs:documentation>BSD 1-Clause License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AML">
+            <xs:enumeration value="BSD-2-Clause-Patent">
                 <xs:annotation>
-                    <xs:documentation>Apple MIT License</xs:documentation>
+                    <xs:documentation>BSD-2-Clause Plus Patent License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-2-Clause">
+            <xs:enumeration value="BitTorrent-1.0">
                 <xs:annotation>
-                    <xs:documentation>BSD 2-Clause &quot;Simplified&quot; License</xs:documentation>
+                    <xs:documentation>BitTorrent Open Source License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="DSDP">
+            <xs:enumeration value="BSD-2-Clause-FreeBSD">
                 <xs:annotation>
-                    <xs:documentation>DSDP License</xs:documentation>
+                    <xs:documentation>BSD 2-Clause FreeBSD License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-2.5">
+            <xs:enumeration value="BSD-3-Clause-Attribution">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution 2.5 Generic</xs:documentation>
+                    <xs:documentation>BSD with attribution</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MIT-CMU">
+            <xs:enumeration value="BSD-2-Clause">
                 <xs:annotation>
-                    <xs:documentation>CMU License</xs:documentation>
+                    <xs:documentation>BSD 2-Clause &quot;Simplified&quot; License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Beerware">
+            <xs:enumeration value="APSL-1.2">
                 <xs:annotation>
-                    <xs:documentation>Beerware License</xs:documentation>
+                    <xs:documentation>Apple Public Source License 1.2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Sendmail">
+            <xs:enumeration value="BSD-3-Clause-LBNL">
                 <xs:annotation>
-                    <xs:documentation>Sendmail License</xs:documentation>
+                    <xs:documentation>Lawrence Berkeley National Labs BSD variant license</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="TU-Berlin-1.0">
+            <xs:enumeration value="Artistic-2.0">
                 <xs:annotation>
-                    <xs:documentation>Technische Universitaet Berlin License 1.0</xs:documentation>
+                    <xs:documentation>Artistic License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CNRI-Jython">
+            <xs:enumeration value="BSD-3-Clause-No-Nuclear-License-2014">
                 <xs:annotation>
-                    <xs:documentation>CNRI Jython License</xs:documentation>
+                    <xs:documentation>BSD 3-Clause No Nuclear License 2014</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="mplus">
+            <xs:enumeration value="BSD-3-Clause-Modification">
                 <xs:annotation>
-                    <xs:documentation>mplus Font License</xs:documentation>
+                    <xs:documentation>BSD 3-Clause Modification</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CPOL-1.02">
+            <xs:enumeration value="BSD-4-Clause-Shortened">
                 <xs:annotation>
-                    <xs:documentation>Code Project Open License 1.02</xs:documentation>
+                    <xs:documentation>BSD 4 Clause Shortened</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-3-Clause-No-Nuclear-License-2014">
+            <xs:enumeration value="BSD-3-Clause">
                 <xs:annotation>
-                    <xs:documentation>BSD 3-Clause No Nuclear License 2014</xs:documentation>
+                    <xs:documentation>BSD 3-Clause &quot;New&quot; or &quot;Revised&quot; License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="ISC">
+            <xs:enumeration value="BSD-3-Clause-Open-MPI">
                 <xs:annotation>
-                    <xs:documentation>ISC License</xs:documentation>
+                    <xs:documentation>BSD 3-Clause Open MPI variant</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-SA-4.0">
+            <xs:enumeration value="BitTorrent-1.1">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Share Alike 4.0 International</xs:documentation>
+                    <xs:documentation>BitTorrent Open Source License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Eurosym">
+            <xs:enumeration value="BSD-3-Clause-No-Nuclear-Warranty">
                 <xs:annotation>
-                    <xs:documentation>Eurosym License</xs:documentation>
+                    <xs:documentation>BSD 3-Clause No Nuclear Warranty</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LGPL-3.0-only">
+            <xs:enumeration value="BSD-Source-Code">
                 <xs:annotation>
-                    <xs:documentation>GNU Lesser General Public License v3.0 only</xs:documentation>
+                    <xs:documentation>BSD Source Code Attribution</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-1.3">
+            <xs:enumeration value="BSD-Protection">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v1.3</xs:documentation>
+                    <xs:documentation>BSD Protection License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.1-invariants-or-later">
+            <xs:enumeration value="AGPL-3.0">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.1 or later - invariants</xs:documentation>
+                    <xs:documentation>GNU Affero General Public License v3.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Glulxe">
+            <xs:enumeration value="BUSL-1.1">
                 <xs:annotation>
-                    <xs:documentation>Glulxe License</xs:documentation>
+                    <xs:documentation>Business Source License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SimPL-2.0">
+            <xs:enumeration value="Artistic-1.0-Perl">
                 <xs:annotation>
-                    <xs:documentation>Simple Public License 2.0</xs:documentation>
+                    <xs:documentation>Artistic License 1.0 (Perl)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CDLA-Permissive-2.0">
+            <xs:enumeration value="BSL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Community Data License Agreement Permissive 2.0</xs:documentation>
+                    <xs:documentation>Boost Software License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-2.0-with-font-exception">
+            <xs:enumeration value="BSD-2-Clause-Views">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v2.0 w/Font exception</xs:documentation>
+                    <xs:documentation>BSD 2-Clause with views sentence</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OGL-UK-2.0">
+            <xs:enumeration value="CAL-1.0-Combined-Work-Exception">
                 <xs:annotation>
-                    <xs:documentation>Open Government Licence v2.0</xs:documentation>
+                    <xs:documentation>Cryptographic Autonomy License 1.0 (Combined Work Exception)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-SA-3.0-DE">
+            <xs:enumeration value="CATOSL-1.1">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Share Alike 3.0 Germany</xs:documentation>
+                    <xs:documentation>Computer Associates Trusted Open Source License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-ND-1.0">
+            <xs:enumeration value="bzip2-1.0.5">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution No Derivatives 1.0 Generic</xs:documentation>
+                    <xs:documentation>bzip2 and libbzip2 License v1.0.5</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.1">
+            <xs:enumeration value="bzip2-1.0.6">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.1</xs:documentation>
+                    <xs:documentation>bzip2 and libbzip2 License v1.0.6</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-4.0">
+            <xs:enumeration value="CC-BY-2.5">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution 4.0 International</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution 2.5 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OpenSSL">
+            <xs:enumeration value="CC-BY-3.0-AT">
                 <xs:annotation>
-                    <xs:documentation>OpenSSL License</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution 3.0 Austria</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="TU-Berlin-2.0">
+            <xs:enumeration value="C-UDA-1.0">
                 <xs:annotation>
-                    <xs:documentation>Technische Universitaet Berlin License 2.0</xs:documentation>
+                    <xs:documentation>Computational Use of Data Agreement v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="DOC">
+            <xs:enumeration value="CC-BY-3.0-US">
                 <xs:annotation>
-                    <xs:documentation>DOC License</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution 3.0 United States</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.2-no-invariants-or-later">
+            <xs:enumeration value="CC-BY-1.0">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.2 or later - no invariants</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution 1.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="QPL-1.0">
+            <xs:enumeration value="CC-BY-NC-1.0">
                 <xs:annotation>
-                    <xs:documentation>Q Public License 1.0</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial 1.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-2.8">
+            <xs:enumeration value="CC-BY-NC-2.0">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v2.8</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial 2.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OML">
+            <xs:enumeration value="CC-BY-NC-2.5">
                 <xs:annotation>
-                    <xs:documentation>Open Market License</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial 2.5 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-2.7">
+            <xs:enumeration value="CC-BY-2.0">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v2.7</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution 2.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NIST-PD">
+            <xs:enumeration value="CC-BY-NC-4.0">
                 <xs:annotation>
-                    <xs:documentation>NIST Public Domain Notice</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial 4.0 International</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Bitstream-Vera">
+            <xs:enumeration value="CC-BY-NC-ND-1.0">
                 <xs:annotation>
-                    <xs:documentation>Bitstream Vera Font License</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 1.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.2-or-later">
+            <xs:enumeration value="CC-BY-NC-ND-2.0">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.2 or later</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 2.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OFL-1.1-RFN">
+            <xs:enumeration value="CC-BY-NC-3.0">
                 <xs:annotation>
-                    <xs:documentation>SIL Open Font License 1.1 with Reserved Font Name</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial 3.0 Unported</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Bahyph">
+            <xs:enumeration value="CC-BY-NC-ND-3.0-IGO">
                 <xs:annotation>
-                    <xs:documentation>Bahyph License</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 3.0 IGO</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Barr">
+            <xs:enumeration value="CC-BY-NC-ND-3.0">
                 <xs:annotation>
-                    <xs:documentation>Barr License</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 3.0 Unported</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="COIL-1.0">
+            <xs:enumeration value="BSD-3-Clause-No-Nuclear-License">
                 <xs:annotation>
-                    <xs:documentation>Copyfree Open Innovation License</xs:documentation>
+                    <xs:documentation>BSD 3-Clause No Nuclear License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.3">
+            <xs:enumeration value="CC-BY-NC-ND-4.0">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.3</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 4.0 International</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CECILL-B">
+            <xs:enumeration value="CC-BY-NC-SA-2.0">
                 <xs:annotation>
-                    <xs:documentation>CeCILL-B Free Software License Agreement</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 2.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="JPNIC">
+            <xs:enumeration value="CC-BY-NC-SA-2.5">
                 <xs:annotation>
-                    <xs:documentation>Japan Network Information Center License</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 2.5 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Zed">
+            <xs:enumeration value="CC-BY-NC-SA-3.0">
                 <xs:annotation>
-                    <xs:documentation>Zed License</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 3.0 Unported</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="ICU">
+            <xs:enumeration value="CC-BY-NC-SA-4.0">
                 <xs:annotation>
-                    <xs:documentation>ICU License</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 4.0 International</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-SA-2.5">
+            <xs:enumeration value="CC-BY-ND-1.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 2.5 Generic</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution No Derivatives 1.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-ND-3.0-DE">
+            <xs:enumeration value="BSD-3-Clause-Clear">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution No Derivatives 3.0 Germany</xs:documentation>
+                    <xs:documentation>BSD 3-Clause Clear License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="bzip2-1.0.5">
+            <xs:enumeration value="CC-BY-ND-2.5">
                 <xs:annotation>
-                    <xs:documentation>bzip2 and libbzip2 License v1.0.5</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution No Derivatives 2.5 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SPL-1.0">
+            <xs:enumeration value="CC-BY-ND-3.0">
                 <xs:annotation>
-                    <xs:documentation>Sun Public License v1.0</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution No Derivatives 3.0 Unported</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="YPL-1.0">
+            <xs:enumeration value="CC-BY-ND-4.0">
                 <xs:annotation>
-                    <xs:documentation>Yahoo! Public License v1.0</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution No Derivatives 4.0 International</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OSET-PL-2.1">
+            <xs:enumeration value="CC-BY-SA-1.0">
                 <xs:annotation>
-                    <xs:documentation>OSET Public License version 2.1</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Share Alike 1.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Noweb">
+            <xs:enumeration value="CC-BY-SA-2.0-UK">
                 <xs:annotation>
-                    <xs:documentation>Noweb License</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Share Alike 2.0 England and Wales</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="RPSL-1.0">
+            <xs:enumeration value="CC-BY-SA-2.0">
                 <xs:annotation>
-                    <xs:documentation>RealNetworks Public Source License v1.0</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Share Alike 2.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-3-Clause-LBNL">
+            <xs:enumeration value="CC-BY-SA-2.1-JP">
                 <xs:annotation>
-                    <xs:documentation>Lawrence Berkeley National Labs BSD variant license</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Share Alike 2.1 Japan</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CDLA-Sharing-1.0">
+            <xs:enumeration value="CC-BY-ND-2.0">
                 <xs:annotation>
-                    <xs:documentation>Community Data License Agreement Sharing 1.0</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution No Derivatives 2.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CECILL-1.0">
+            <xs:enumeration value="CC-BY-SA-3.0-AT">
                 <xs:annotation>
-                    <xs:documentation>CeCILL Free Software License Agreement v1.0</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution-Share Alike 3.0 Austria</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AMPAS">
+            <xs:enumeration value="CC-BY-SA-3.0">
                 <xs:annotation>
-                    <xs:documentation>Academy of Motion Picture Arts and Sciences BSD</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Share Alike 3.0 Unported</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="APAFML">
+            <xs:enumeration value="CC-BY-SA-4.0">
                 <xs:annotation>
-                    <xs:documentation>Adobe Postscript AFM License</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Share Alike 4.0 International</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-ND-3.0">
+            <xs:enumeration value="CC-BY-SA-2.5">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution No Derivatives 3.0 Unported</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Share Alike 2.5 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="D-FSL-1.0">
+            <xs:enumeration value="CC-BY-3.0">
                 <xs:annotation>
-                    <xs:documentation>Deutsche Freie Software Lizenz</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution 3.0 Unported</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-3.0">
+            <xs:enumeration value="CDDL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial 3.0 Unported</xs:documentation>
+                    <xs:documentation>Common Development and Distribution License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="libpng-2.0">
+            <xs:enumeration value="CC0-1.0">
                 <xs:annotation>
-                    <xs:documentation>PNG Reference Library version 2</xs:documentation>
+                    <xs:documentation>Creative Commons Zero v1.0 Universal</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="PolyForm-Noncommercial-1.0.0">
+            <xs:enumeration value="CC-BY-NC-ND-2.5">
                 <xs:annotation>
-                    <xs:documentation>PolyForm Noncommercial License 1.0.0</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 2.5 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="dvipdfm">
+            <xs:enumeration value="CC-BY-NC-SA-1.0">
                 <xs:annotation>
-                    <xs:documentation>dvipdfm License</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 1.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.3-or-later">
+            <xs:enumeration value="Caldera">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.3 or later</xs:documentation>
+                    <xs:documentation>Caldera License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OGTSL">
+            <xs:enumeration value="CDLA-Permissive-1.0">
                 <xs:annotation>
-                    <xs:documentation>Open Group Test Suite License</xs:documentation>
+                    <xs:documentation>Community Data License Agreement Permissive 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NPL-1.1">
+            <xs:enumeration value="CC-BY-4.0">
                 <xs:annotation>
-                    <xs:documentation>Netscape Public License v1.1</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution 4.0 International</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-3.0">
+            <xs:enumeration value="CC-PDDC">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v3.0 only</xs:documentation>
+                    <xs:documentation>Creative Commons Public Domain Dedication and Certification</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CERN-OHL-P-2.0">
+            <xs:enumeration value="BSD-4-Clause-UC">
                 <xs:annotation>
-                    <xs:documentation>CERN Open Hardware Licence Version 2 - Permissive</xs:documentation>
+                    <xs:documentation>BSD-4-Clause (University of California-Specific)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BlueOak-1.0.0">
+            <xs:enumeration value="BSD-4-Clause">
                 <xs:annotation>
-                    <xs:documentation>Blue Oak Model License 1.0.0</xs:documentation>
+                    <xs:documentation>BSD 4-Clause &quot;Original&quot; or &quot;Old&quot; License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AGPL-3.0-or-later">
+            <xs:enumeration value="CAL-1.0">
                 <xs:annotation>
-                    <xs:documentation>GNU Affero General Public License v3.0 or later</xs:documentation>
+                    <xs:documentation>Cryptographic Autonomy License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="blessing">
+            <xs:enumeration value="CDDL-1.1">
                 <xs:annotation>
-                    <xs:documentation>SQLite Blessing</xs:documentation>
+                    <xs:documentation>Common Development and Distribution License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="ImageMagick">
+            <xs:enumeration value="CERN-OHL-1.2">
                 <xs:annotation>
-                    <xs:documentation>ImageMagick License</xs:documentation>
+                    <xs:documentation>CERN Open Hardware Licence v1.2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="APSL-2.0">
+            <xs:enumeration value="CERN-OHL-1.1">
                 <xs:annotation>
-                    <xs:documentation>Apple Public Source License 2.0</xs:documentation>
+                    <xs:documentation>CERN Open Hardware Licence v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MIT-advertising">
+            <xs:enumeration value="CERN-OHL-P-2.0">
                 <xs:annotation>
-                    <xs:documentation>Enlightenment License (e16)</xs:documentation>
+                    <xs:documentation>CERN Open Hardware Licence Version 2 - Permissive</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="curl">
+            <xs:enumeration value="CERN-OHL-S-2.0">
                 <xs:annotation>
-                    <xs:documentation>curl License</xs:documentation>
+                    <xs:documentation>CERN Open Hardware Licence Version 2 - Strongly Reciprocal</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC0-1.0">
+            <xs:enumeration value="CECILL-1.1">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Zero v1.0 Universal</xs:documentation>
+                    <xs:documentation>CeCILL Free Software License Agreement v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Zimbra-1.4">
+            <xs:enumeration value="CECILL-2.0">
                 <xs:annotation>
-                    <xs:documentation>Zimbra Public License v1.4</xs:documentation>
+                    <xs:documentation>CeCILL Free Software License Agreement v2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SSPL-1.0">
+            <xs:enumeration value="CECILL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Server Side Public License, v 1</xs:documentation>
+                    <xs:documentation>CeCILL Free Software License Agreement v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="psutils">
+            <xs:enumeration value="CNRI-Python">
                 <xs:annotation>
-                    <xs:documentation>psutils License</xs:documentation>
+                    <xs:documentation>CNRI Python License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-SA-2.0-UK">
+            <xs:enumeration value="CNRI-Python-GPL-Compatible">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Share Alike 2.0 England and Wales</xs:documentation>
+                    <xs:documentation>CNRI Python Open Source GPL Compatible License Agreement</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="PSF-2.0">
+            <xs:enumeration value="copyleft-next-0.3.0">
                 <xs:annotation>
-                    <xs:documentation>Python Software Foundation License 2.0</xs:documentation>
+                    <xs:documentation>copyleft-next 0.3.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Net-SNMP">
+            <xs:enumeration value="CPAL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Net-SNMP License</xs:documentation>
+                    <xs:documentation>Common Public Attribution License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NAIST-2003">
+            <xs:enumeration value="copyleft-next-0.3.1">
                 <xs:annotation>
-                    <xs:documentation>Nara Institute of Science and Technology License (2003)</xs:documentation>
+                    <xs:documentation>copyleft-next 0.3.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.2-invariants-or-later">
+            <xs:enumeration value="CPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.2 or later - invariants</xs:documentation>
+                    <xs:documentation>Common Public License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SGI-B-1.0">
+            <xs:enumeration value="ClArtistic">
                 <xs:annotation>
-                    <xs:documentation>SGI Free Software License B v1.0</xs:documentation>
+                    <xs:documentation>Clarified Artistic License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NBPL-1.0">
+            <xs:enumeration value="CECILL-C">
                 <xs:annotation>
-                    <xs:documentation>Net Boolean Public License v1</xs:documentation>
+                    <xs:documentation>CeCILL-C Free Software License Agreement</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.2-invariants-only">
+            <xs:enumeration value="CNRI-Jython">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.2 only - invariants</xs:documentation>
+                    <xs:documentation>CNRI Jython License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="W3C-19980720">
+            <xs:enumeration value="Condor-1.1">
                 <xs:annotation>
-                    <xs:documentation>W3C Software Notice and License (1998-07-20)</xs:documentation>
+                    <xs:documentation>Condor Public License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OFL-1.0-no-RFN">
+            <xs:enumeration value="CPOL-1.02">
                 <xs:annotation>
-                    <xs:documentation>SIL Open Font License 1.0 with no Reserved Font Name</xs:documentation>
+                    <xs:documentation>Code Project Open License 1.02</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NetCDF">
+            <xs:enumeration value="curl">
                 <xs:annotation>
-                    <xs:documentation>NetCDF license</xs:documentation>
+                    <xs:documentation>curl License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="TMate">
+            <xs:enumeration value="diffmark">
                 <xs:annotation>
-                    <xs:documentation>TMate Open Source License</xs:documentation>
+                    <xs:documentation>diffmark license</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NOSL">
+            <xs:enumeration value="Crossword">
                 <xs:annotation>
-                    <xs:documentation>Netizen Open Source License</xs:documentation>
+                    <xs:documentation>Crossword License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CNRI-Python-GPL-Compatible">
+            <xs:enumeration value="Dotseqn">
                 <xs:annotation>
-                    <xs:documentation>CNRI Python Open Source GPL Compatible License Agreement</xs:documentation>
+                    <xs:documentation>Dotseqn License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-1-Clause">
+            <xs:enumeration value="DOC">
                 <xs:annotation>
-                    <xs:documentation>BSD 1-Clause License</xs:documentation>
+                    <xs:documentation>DOC License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-SA-3.0-DE">
+            <xs:enumeration value="DSDP">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 3.0 Germany</xs:documentation>
+                    <xs:documentation>DSDP License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-3-Clause-Modification">
+            <xs:enumeration value="DRL-1.0">
                 <xs:annotation>
-                    <xs:documentation>BSD 3-Clause Modification</xs:documentation>
+                    <xs:documentation>Detection Rule License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GLWTPL">
+            <xs:enumeration value="ECL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Good Luck With That Public License</xs:documentation>
+                    <xs:documentation>Educational Community License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.3-only">
+            <xs:enumeration value="ECL-2.0">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.3 only</xs:documentation>
+                    <xs:documentation>Educational Community License v2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-2.2">
+            <xs:enumeration value="eCos-2.0">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v2.2</xs:documentation>
+                    <xs:documentation>eCos license version 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-ND-4.0">
+            <xs:enumeration value="CrystalStacker">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution No Derivatives 4.0 International</xs:documentation>
+                    <xs:documentation>CrystalStacker License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-ND-3.0-DE">
+            <xs:enumeration value="CERN-OHL-W-2.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 3.0 Germany</xs:documentation>
+                    <xs:documentation>CERN Open Hardware Licence Version 2 - Weakly Reciprocal</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="EUPL-1.0">
+            <xs:enumeration value="D-FSL-1.0">
                 <xs:annotation>
-                    <xs:documentation>European Union Public License 1.0</xs:documentation>
+                    <xs:documentation>Deutsche Freie Software Lizenz</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Linux-OpenIB">
+            <xs:enumeration value="eGenix">
                 <xs:annotation>
-                    <xs:documentation>Linux Kernel Variant of OpenIB.org license</xs:documentation>
+                    <xs:documentation>eGenix.com Public License 1.1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LGPL-2.0-or-later">
+            <xs:enumeration value="EPICS">
                 <xs:annotation>
-                    <xs:documentation>GNU Library General Public License v2 or later</xs:documentation>
+                    <xs:documentation>EPICS Open License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OSL-1.1">
+            <xs:enumeration value="Entessa">
                 <xs:annotation>
-                    <xs:documentation>Open Software License 1.1</xs:documentation>
+                    <xs:documentation>Entessa Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Spencer-86">
+            <xs:enumeration value="EPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Spencer License 86</xs:documentation>
+                    <xs:documentation>Eclipse Public License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LGPL-2.0">
+            <xs:enumeration value="EFL-2.0">
                 <xs:annotation>
-                    <xs:documentation>GNU Library General Public License v2 only</xs:documentation>
+                    <xs:documentation>Eiffel Forum License v2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-PDDC">
+            <xs:enumeration value="CUA-OPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Public Domain Dedication and Certification</xs:documentation>
+                    <xs:documentation>CUA Office Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-ND-3.0">
+            <xs:enumeration value="etalab-2.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 3.0 Unported</xs:documentation>
+                    <xs:documentation>Etalab Open License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CDL-1.0">
+            <xs:enumeration value="EUPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Common Documentation License 1.0</xs:documentation>
+                    <xs:documentation>European Union Public License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Elastic-2.0">
+            <xs:enumeration value="ErlPL-1.1">
                 <xs:annotation>
-                    <xs:documentation>Elastic License 2.0</xs:documentation>
+                    <xs:documentation>Erlang Public License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-2.0">
+            <xs:enumeration value="EUDatagrid">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution 2.0 Generic</xs:documentation>
+                    <xs:documentation>EU DataGrid Software License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-3-Clause-No-Military-License">
+            <xs:enumeration value="EUPL-1.1">
                 <xs:annotation>
-                    <xs:documentation>BSD 3-Clause No Military License</xs:documentation>
+                    <xs:documentation>European Union Public License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="IJG">
+            <xs:enumeration value="Cube">
                 <xs:annotation>
-                    <xs:documentation>Independent JPEG Group License</xs:documentation>
+                    <xs:documentation>Cube License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LPPL-1.3a">
+            <xs:enumeration value="dvipdfm">
                 <xs:annotation>
-                    <xs:documentation>LaTeX Project Public License v1.3a</xs:documentation>
+                    <xs:documentation>dvipdfm License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SAX-PD">
+            <xs:enumeration value="FreeBSD-DOC">
                 <xs:annotation>
-                    <xs:documentation>Sax Public Domain Notice</xs:documentation>
+                    <xs:documentation>FreeBSD Documentation License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BitTorrent-1.0">
+            <xs:enumeration value="Eurosym">
                 <xs:annotation>
-                    <xs:documentation>BitTorrent Open Source License v1.0</xs:documentation>
+                    <xs:documentation>Eurosym License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-2.0">
+            <xs:enumeration value="FSFAP">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)</xs:documentation>
+                    <xs:documentation>FSF All Permissive License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Giftware">
+            <xs:enumeration value="FreeImage">
                 <xs:annotation>
-                    <xs:documentation>Giftware License</xs:documentation>
+                    <xs:documentation>FreeImage Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="C-UDA-1.0">
+            <xs:enumeration value="FSFULLR">
                 <xs:annotation>
-                    <xs:documentation>Computational Use of Data Agreement v1.0</xs:documentation>
+                    <xs:documentation>FSF Unlimited License (with License Retention)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LGPL-2.0+">
+            <xs:enumeration value="FSFUL">
                 <xs:annotation>
-                    <xs:documentation>GNU Library General Public License v2 or later</xs:documentation>
+                    <xs:documentation>FSF Unlimited License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Rdisc">
+            <xs:enumeration value="GD">
                 <xs:annotation>
-                    <xs:documentation>Rdisc License</xs:documentation>
+                    <xs:documentation>GD License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-2.0-with-classpath-exception">
+            <xs:enumeration value="GFDL-1.1-invariants-only">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v2.0 w/Classpath exception</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.1 only - invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-3.0-US">
+            <xs:enumeration value="EUPL-1.2">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution 3.0 United States</xs:documentation>
+                    <xs:documentation>European Union Public License 1.2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CDDL-1.0">
+            <xs:enumeration value="EPL-2.0">
                 <xs:annotation>
-                    <xs:documentation>Common Development and Distribution License 1.0</xs:documentation>
+                    <xs:documentation>Eclipse Public License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Xnet">
+            <xs:enumeration value="GFDL-1.1-no-invariants-or-later">
                 <xs:annotation>
-                    <xs:documentation>X.Net License</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.1 or later - no invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CPL-1.0">
+            <xs:enumeration value="GFDL-1.1-only">
                 <xs:annotation>
-                    <xs:documentation>Common Public License 1.0</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.1 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LGPL-3.0-or-later">
+            <xs:enumeration value="GFDL-1.1-or-later">
                 <xs:annotation>
-                    <xs:documentation>GNU Lesser General Public License v3.0 or later</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.1 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NASA-1.3">
+            <xs:enumeration value="GFDL-1.1">
                 <xs:annotation>
-                    <xs:documentation>NASA Open Source Agreement 1.3</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BUSL-1.1">
+            <xs:enumeration value="FTL">
                 <xs:annotation>
-                    <xs:documentation>Business Source License 1.1</xs:documentation>
+                    <xs:documentation>Freetype Project License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="etalab-2.0">
+            <xs:enumeration value="GFDL-1.2-invariants-or-later">
                 <xs:annotation>
-                    <xs:documentation>Etalab Open License 2.0</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.2 or later - invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MIT-open-group">
+            <xs:enumeration value="GFDL-1.1-invariants-or-later">
                 <xs:annotation>
-                    <xs:documentation>MIT Open Group variant</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.1 or later - invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-1.4">
+            <xs:enumeration value="GFDL-1.2-invariants-only">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v1.4</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.2 only - invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.1-invariants-only">
+            <xs:enumeration value="GFDL-1.2-only">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.1 only - invariants</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.2 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="RPL-1.1">
+            <xs:enumeration value="GFDL-1.2-or-later">
                 <xs:annotation>
-                    <xs:documentation>Reciprocal Public License 1.1</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.2 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-ND-2.5">
+            <xs:enumeration value="GFDL-1.2">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 2.5 Generic</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="FSFULLR">
+            <xs:enumeration value="GFDL-1.2-no-invariants-only">
                 <xs:annotation>
-                    <xs:documentation>FSF Unlimited License (with License Retention)</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.2 only - no invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Saxpath">
+            <xs:enumeration value="GFDL-1.3-invariants-only">
                 <xs:annotation>
-                    <xs:documentation>Saxpath License</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.3 only - invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NTP-0">
+            <xs:enumeration value="GFDL-1.3-no-invariants-only">
                 <xs:annotation>
-                    <xs:documentation>NTP No Attribution</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.3 only - no invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SISSL-1.2">
+            <xs:enumeration value="GFDL-1.3-invariants-or-later">
                 <xs:annotation>
-                    <xs:documentation>Sun Industry Standards Source License v1.2</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.3 or later - invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-3.0-or-later">
+            <xs:enumeration value="GFDL-1.2-no-invariants-or-later">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v3.0 or later</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.2 or later - no invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Apache-1.1">
+            <xs:enumeration value="Fair">
                 <xs:annotation>
-                    <xs:documentation>Apache License 1.1</xs:documentation>
+                    <xs:documentation>Fair License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-SA-2.1-JP">
+            <xs:enumeration value="Frameworx-1.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Share Alike 2.1 Japan</xs:documentation>
+                    <xs:documentation>Frameworx Open License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AGPL-3.0-only">
+            <xs:enumeration value="Giftware">
                 <xs:annotation>
-                    <xs:documentation>GNU Affero General Public License v3.0 only</xs:documentation>
+                    <xs:documentation>Giftware License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-2.0-with-autoconf-exception">
+            <xs:enumeration value="GFDL-1.1-no-invariants-only">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v2.0 w/Autoconf exception</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.1 only - no invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Artistic-2.0">
+            <xs:enumeration value="GL2PS">
                 <xs:annotation>
-                    <xs:documentation>Artistic License 2.0</xs:documentation>
+                    <xs:documentation>GL2PS License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="App-s2p">
+            <xs:enumeration value="Glulxe">
                 <xs:annotation>
-                    <xs:documentation>App::s2p License</xs:documentation>
+                    <xs:documentation>Glulxe License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Unicode-DFS-2015">
+            <xs:enumeration value="Glide">
                 <xs:annotation>
-                    <xs:documentation>Unicode License Agreement - Data Files and Software (2015)</xs:documentation>
+                    <xs:documentation>3dfx Glide License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="diffmark">
+            <xs:enumeration value="gnuplot">
                 <xs:annotation>
-                    <xs:documentation>diffmark license</xs:documentation>
+                    <xs:documentation>gnuplot License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SNIA">
+            <xs:enumeration value="GLWTPL">
                 <xs:annotation>
-                    <xs:documentation>SNIA Public License 1.1</xs:documentation>
+                    <xs:documentation>Good Luck With That Public License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-SA-2.5">
+            <xs:enumeration value="GPL-1.0-only">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Share Alike 2.5 Generic</xs:documentation>
+                    <xs:documentation>GNU General Public License v1.0 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Linux-man-pages-copyleft">
+            <xs:enumeration value="GPL-1.0-or-later">
                 <xs:annotation>
-                    <xs:documentation>Linux man-pages Copyleft</xs:documentation>
+                    <xs:documentation>GNU General Public License v1.0 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="HPND-sell-variant">
+            <xs:enumeration value="GPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Historical Permission Notice and Disclaimer - sell variant</xs:documentation>
+                    <xs:documentation>GNU General Public License v1.0 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="ZPL-2.1">
+            <xs:enumeration value="GFDL-1.3-only">
                 <xs:annotation>
-                    <xs:documentation>Zope Public License 2.1</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.3 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-4-Clause-UC">
+            <xs:enumeration value="GPL-2.0-only">
                 <xs:annotation>
-                    <xs:documentation>BSD-4-Clause (University of California-Specific)</xs:documentation>
+                    <xs:documentation>GNU General Public License v2.0 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LAL-1.2">
+            <xs:enumeration value="GPL-2.0-or-later">
                 <xs:annotation>
-                    <xs:documentation>Licence Art Libre 1.2</xs:documentation>
+                    <xs:documentation>GNU General Public License v2.0 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AGPL-1.0-only">
+            <xs:enumeration value="GPL-2.0-with-autoconf-exception">
                 <xs:annotation>
-                    <xs:documentation>Affero General Public License v1.0 only</xs:documentation>
+                    <xs:documentation>GNU General Public License v2.0 w/Autoconf exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MIT-enna">
+            <xs:enumeration value="GPL-2.0+">
                 <xs:annotation>
-                    <xs:documentation>enna License</xs:documentation>
+                    <xs:documentation>GNU General Public License v2.0 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Condor-1.1">
+            <xs:enumeration value="GFDL-1.3">
                 <xs:annotation>
-                    <xs:documentation>Condor Public License v1.1</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.3</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Naumen">
+            <xs:enumeration value="GPL-1.0+">
                 <xs:annotation>
-                    <xs:documentation>Naumen Public License</xs:documentation>
+                    <xs:documentation>GNU General Public License v1.0 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.3-no-invariants-or-later">
+            <xs:enumeration value="CDLA-Sharing-1.0">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.3 or later - no invariants</xs:documentation>
+                    <xs:documentation>Community Data License Agreement Sharing 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="RPL-1.5">
+            <xs:enumeration value="GPL-2.0-with-classpath-exception">
                 <xs:annotation>
-                    <xs:documentation>Reciprocal Public License 1.5</xs:documentation>
+                    <xs:documentation>GNU General Public License v2.0 w/Classpath exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="PolyForm-Small-Business-1.0.0">
+            <xs:enumeration value="GPL-2.0-with-GCC-exception">
                 <xs:annotation>
-                    <xs:documentation>PolyForm Small Business License 1.0.0</xs:documentation>
+                    <xs:documentation>GNU General Public License v2.0 w/GCC Runtime Library exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="EFL-1.0">
+            <xs:enumeration value="GPL-2.0-with-bison-exception">
                 <xs:annotation>
-                    <xs:documentation>Eiffel Forum License v1.0</xs:documentation>
+                    <xs:documentation>GNU General Public License v2.0 w/Bison exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MirOS">
+            <xs:enumeration value="GPL-2.0-with-font-exception">
                 <xs:annotation>
-                    <xs:documentation>The MirOS Licence</xs:documentation>
+                    <xs:documentation>GNU General Public License v2.0 w/Font exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-2.5-AU">
+            <xs:enumeration value="GPL-2.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution 2.5 Australia</xs:documentation>
+                    <xs:documentation>GNU General Public License v2.0 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Afmparse">
+            <xs:enumeration value="CECILL-2.1">
                 <xs:annotation>
-                    <xs:documentation>Afmparse License</xs:documentation>
+                    <xs:documentation>CeCILL Free Software License Agreement v2.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MPL-2.0-no-copyleft-exception">
+            <xs:enumeration value="GPL-3.0">
                 <xs:annotation>
-                    <xs:documentation>Mozilla Public License 2.0 (no copyleft exception)</xs:documentation>
+                    <xs:documentation>GNU General Public License v3.0 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LiLiQ-Rplus-1.1">
+            <xs:enumeration value="GPL-3.0+">
                 <xs:annotation>
-                    <xs:documentation>Licence Libre du Québec – Réciprocité forte version 1.1</xs:documentation>
+                    <xs:documentation>GNU General Public License v3.0 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AFL-1.2">
+            <xs:enumeration value="GPL-3.0-with-autoconf-exception">
                 <xs:annotation>
-                    <xs:documentation>Academic Free License v1.2</xs:documentation>
+                    <xs:documentation>GNU General Public License v3.0 w/Autoconf exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OSL-1.0">
+            <xs:enumeration value="GPL-3.0-only">
                 <xs:annotation>
-                    <xs:documentation>Open Software License 1.0</xs:documentation>
+                    <xs:documentation>GNU General Public License v3.0 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-1.0-only">
+            <xs:enumeration value="Hippocratic-2.1">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v1.0 only</xs:documentation>
+                    <xs:documentation>Hippocratic License 2.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="APSL-1.0">
+            <xs:enumeration value="HPND">
                 <xs:annotation>
-                    <xs:documentation>Apple Public Source License 1.0</xs:documentation>
+                    <xs:documentation>Historical Permission Notice and Disclaimer</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OGL-Canada-2.0">
+            <xs:enumeration value="HTMLTIDY">
                 <xs:annotation>
-                    <xs:documentation>Open Government Licence - Canada</xs:documentation>
+                    <xs:documentation>HTML Tidy License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CPAL-1.0">
+            <xs:enumeration value="GPL-3.0-with-GCC-exception">
                 <xs:annotation>
-                    <xs:documentation>Common Public Attribution License 1.0</xs:documentation>
+                    <xs:documentation>GNU General Public License v3.0 w/GCC Runtime Library exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Latex2e">
+            <xs:enumeration value="HaskellReport">
                 <xs:annotation>
-                    <xs:documentation>Latex2e License</xs:documentation>
+                    <xs:documentation>Haskell Language Report License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Zend-2.0">
+            <xs:enumeration value="GPL-3.0-or-later">
                 <xs:annotation>
-                    <xs:documentation>Zend License v2.0</xs:documentation>
+                    <xs:documentation>GNU General Public License v3.0 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Unlicense">
+            <xs:enumeration value="ICU">
                 <xs:annotation>
-                    <xs:documentation>The Unlicense</xs:documentation>
+                    <xs:documentation>ICU License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="xpp">
+            <xs:enumeration value="ImageMagick">
                 <xs:annotation>
-                    <xs:documentation>XPP License</xs:documentation>
+                    <xs:documentation>ImageMagick License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-1.0">
+            <xs:enumeration value="iMatix">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial 1.0 Generic</xs:documentation>
+                    <xs:documentation>iMatix Standard Function Library Agreement</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-3.0-with-autoconf-exception">
+            <xs:enumeration value="IBM-pibs">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v3.0 w/Autoconf exception</xs:documentation>
+                    <xs:documentation>IBM PowerPC Initialization and Boot Software</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-SA-3.0">
+            <xs:enumeration value="Intel-ACPI">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 3.0 Unported</xs:documentation>
+                    <xs:documentation>Intel ACPI Software License Agreement</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="TCP-wrappers">
+            <xs:enumeration value="Intel">
                 <xs:annotation>
-                    <xs:documentation>TCP Wrappers License</xs:documentation>
+                    <xs:documentation>Intel Open Source License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SCEA">
+            <xs:enumeration value="Info-ZIP">
                 <xs:annotation>
-                    <xs:documentation>SCEA Shared Source License</xs:documentation>
+                    <xs:documentation>Info-ZIP License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SSH-short">
+            <xs:enumeration value="IPA">
                 <xs:annotation>
-                    <xs:documentation>SSH short notice</xs:documentation>
+                    <xs:documentation>IPA Font License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-3.0-NL">
+            <xs:enumeration value="IJG">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution 3.0 Netherlands</xs:documentation>
+                    <xs:documentation>Independent JPEG Group License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SchemeReport">
+            <xs:enumeration value="ISC">
                 <xs:annotation>
-                    <xs:documentation>Scheme Language Report License</xs:documentation>
+                    <xs:documentation>ISC License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-3.0">
+            <xs:enumeration value="JasPer-2.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution 3.0 Unported</xs:documentation>
+                    <xs:documentation>JasPer License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MPL-2.0">
+            <xs:enumeration value="JPNIC">
                 <xs:annotation>
-                    <xs:documentation>Mozilla Public License 2.0</xs:documentation>
+                    <xs:documentation>Japan Network Information Center License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Unicode-TOU">
+            <xs:enumeration value="JSON">
                 <xs:annotation>
-                    <xs:documentation>Unicode Terms of Use</xs:documentation>
+                    <xs:documentation>JSON License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-ND-1.0">
+            <xs:enumeration value="LAL-1.2">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 1.0 Generic</xs:documentation>
+                    <xs:documentation>Licence Art Libre 1.2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Entessa">
+            <xs:enumeration value="LAL-1.3">
                 <xs:annotation>
-                    <xs:documentation>Entessa Public License v1.0</xs:documentation>
+                    <xs:documentation>Licence Art Libre 1.3</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-3-Clause-No-Nuclear-License">
+            <xs:enumeration value="Latex2e">
                 <xs:annotation>
-                    <xs:documentation>BSD 3-Clause No Nuclear License</xs:documentation>
+                    <xs:documentation>Latex2e License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SWL">
+            <xs:enumeration value="Leptonica">
                 <xs:annotation>
-                    <xs:documentation>Scheme Widget Library (SWL) Software License Agreement</xs:documentation>
+                    <xs:documentation>Leptonica License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.2-no-invariants-only">
+            <xs:enumeration value="HPND-sell-variant">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.2 only - no invariants</xs:documentation>
+                    <xs:documentation>Historical Permission Notice and Disclaimer - sell variant</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Parity-7.0.0">
+            <xs:enumeration value="LGPL-2.0-only">
                 <xs:annotation>
-                    <xs:documentation>The Parity Public License 7.0.0</xs:documentation>
+                    <xs:documentation>GNU Library General Public License v2 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-2.2.1">
+            <xs:enumeration value="LGPL-2.0-or-later">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v2.2.1</xs:documentation>
+                    <xs:documentation>GNU Library General Public License v2 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SGI-B-1.1">
+            <xs:enumeration value="Imlib2">
                 <xs:annotation>
-                    <xs:documentation>SGI Free Software License B v1.1</xs:documentation>
+                    <xs:documentation>Imlib2 License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="FTL">
+            <xs:enumeration value="IPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Freetype Project License</xs:documentation>
+                    <xs:documentation>IBM Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-2.4">
+            <xs:enumeration value="LGPL-2.1-only">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v2.4</xs:documentation>
+                    <xs:documentation>GNU Lesser General Public License v2.1 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-4.0">
+            <xs:enumeration value="LGPL-2.1-or-later">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial 4.0 International</xs:documentation>
+                    <xs:documentation>GNU Lesser General Public License v2.1 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="bzip2-1.0.6">
+            <xs:enumeration value="LGPL-2.0+">
                 <xs:annotation>
-                    <xs:documentation>bzip2 and libbzip2 License v1.0.6</xs:documentation>
+                    <xs:documentation>GNU Library General Public License v2 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="copyleft-next-0.3.0">
+            <xs:enumeration value="LGPL-2.0">
                 <xs:annotation>
-                    <xs:documentation>copyleft-next 0.3.0</xs:documentation>
+                    <xs:documentation>GNU Library General Public License v2 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MakeIndex">
+            <xs:enumeration value="CECILL-B">
                 <xs:annotation>
-                    <xs:documentation>MakeIndex License</xs:documentation>
+                    <xs:documentation>CeCILL-B Free Software License Agreement</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NRL">
+            <xs:enumeration value="LGPL-3.0-or-later">
                 <xs:annotation>
-                    <xs:documentation>NRL License</xs:documentation>
+                    <xs:documentation>GNU Lesser General Public License v3.0 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.3-invariants-or-later">
+            <xs:enumeration value="LGPL-3.0-only">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.3 or later - invariants</xs:documentation>
+                    <xs:documentation>GNU Lesser General Public License v3.0 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-2.0">
+            <xs:enumeration value="LGPLLR">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial 2.0 Generic</xs:documentation>
+                    <xs:documentation>Lesser General Public License For Linguistic Resources</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SugarCRM-1.1.3">
+            <xs:enumeration value="libpng-2.0">
                 <xs:annotation>
-                    <xs:documentation>SugarCRM Public License v1.1.3</xs:documentation>
+                    <xs:documentation>PNG Reference Library version 2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AFL-2.1">
+            <xs:enumeration value="Libpng">
                 <xs:annotation>
-                    <xs:documentation>Academic Free License v2.1</xs:documentation>
+                    <xs:documentation>libpng License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-2.0-only">
+            <xs:enumeration value="libselinux-1.0">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v2.0 only</xs:documentation>
+                    <xs:documentation>libselinux public domain notice</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.3-invariants-only">
+            <xs:enumeration value="LGPL-3.0+">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.3 only - invariants</xs:documentation>
+                    <xs:documentation>GNU Lesser General Public License v3.0 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="TORQUE-1.1">
+            <xs:enumeration value="EFL-1.0">
                 <xs:annotation>
-                    <xs:documentation>TORQUE v2.5+ Software License v1.1</xs:documentation>
+                    <xs:documentation>Eiffel Forum License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Ruby">
+            <xs:enumeration value="libtiff">
                 <xs:annotation>
-                    <xs:documentation>Ruby License</xs:documentation>
+                    <xs:documentation>libtiff License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="X11">
+            <xs:enumeration value="GFDL-1.3-no-invariants-or-later">
                 <xs:annotation>
-                    <xs:documentation>X11 License</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.3 or later - no invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Borceux">
+            <xs:enumeration value="LiLiQ-Rplus-1.1">
                 <xs:annotation>
-                    <xs:documentation>Borceux license</xs:documentation>
+                    <xs:documentation>Licence Libre du Québec – Réciprocité forte version 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Libpng">
+            <xs:enumeration value="LiLiQ-R-1.1">
                 <xs:annotation>
-                    <xs:documentation>libpng License</xs:documentation>
+                    <xs:documentation>Licence Libre du Québec – Réciprocité version 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="X11-distribute-modifications-variant">
+            <xs:enumeration value="LPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>X11 License Distribution Modification Variant</xs:documentation>
+                    <xs:documentation>Lucent Public License Version 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Frameworx-1.0">
+            <xs:enumeration value="LiLiQ-P-1.1">
                 <xs:annotation>
-                    <xs:documentation>Frameworx Open License 1.0</xs:documentation>
+                    <xs:documentation>Licence Libre du Québec – Permissive version 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NCGL-UK-2.0">
+            <xs:enumeration value="Linux-OpenIB">
                 <xs:annotation>
-                    <xs:documentation>Non-Commercial Government Licence</xs:documentation>
+                    <xs:documentation>Linux Kernel Variant of OpenIB.org license</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CECILL-2.1">
+            <xs:enumeration value="LPPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>CeCILL Free Software License Agreement v2.1</xs:documentation>
+                    <xs:documentation>LaTeX Project Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-3.0-AT">
+            <xs:enumeration value="LPPL-1.2">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution 3.0 Austria</xs:documentation>
+                    <xs:documentation>LaTeX Project Public License v1.2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CNRI-Python">
+            <xs:enumeration value="LPPL-1.3a">
                 <xs:annotation>
-                    <xs:documentation>CNRI Python License</xs:documentation>
+                    <xs:documentation>LaTeX Project Public License v1.3a</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NCSA">
+            <xs:enumeration value="LPL-1.02">
                 <xs:annotation>
-                    <xs:documentation>University of Illinois/NCSA Open Source License</xs:documentation>
+                    <xs:documentation>Lucent Public License v1.02</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="gSOAP-1.3b">
+            <xs:enumeration value="LPPL-1.3c">
                 <xs:annotation>
-                    <xs:documentation>gSOAP Public License v1.3b</xs:documentation>
+                    <xs:documentation>LaTeX Project Public License v1.3c</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="EUPL-1.1">
+            <xs:enumeration value="MakeIndex">
                 <xs:annotation>
-                    <xs:documentation>European Union Public License 1.1</xs:documentation>
+                    <xs:documentation>MakeIndex License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AMDPLPA">
+            <xs:enumeration value="LGPL-2.1+">
                 <xs:annotation>
-                    <xs:documentation>AMD&apos;s plpa_map.c License</xs:documentation>
+                    <xs:documentation>GNU Library General Public License v2.1 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Imlib2">
+            <xs:enumeration value="LPPL-1.1">
                 <xs:annotation>
-                    <xs:documentation>Imlib2 License</xs:documentation>
+                    <xs:documentation>LaTeX Project Public License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CDDL-1.1">
+            <xs:enumeration value="MIT-CMU">
                 <xs:annotation>
-                    <xs:documentation>Common Development and Distribution License 1.1</xs:documentation>
+                    <xs:documentation>CMU License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="WTFPL">
+            <xs:enumeration value="MirOS">
                 <xs:annotation>
-                    <xs:documentation>Do What The F*ck You Want To Public License</xs:documentation>
+                    <xs:documentation>The MirOS Licence</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LPL-1.0">
+            <xs:enumeration value="MIT-advertising">
                 <xs:annotation>
-                    <xs:documentation>Lucent Public License Version 1.0</xs:documentation>
+                    <xs:documentation>Enlightenment License (e16)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="EPL-1.0">
+            <xs:enumeration value="MIT-Modern-Variant">
                 <xs:annotation>
-                    <xs:documentation>Eclipse Public License 1.0</xs:documentation>
+                    <xs:documentation>MIT License Modern Variant</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-3-Clause-Attribution">
+            <xs:enumeration value="MIT">
                 <xs:annotation>
-                    <xs:documentation>BSD with attribution</xs:documentation>
+                    <xs:documentation>MIT License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OSL-3.0">
+            <xs:enumeration value="MIT-enna">
                 <xs:annotation>
-                    <xs:documentation>Open Software License 3.0</xs:documentation>
+                    <xs:documentation>enna License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="RHeCos-1.1">
+            <xs:enumeration value="MIT-open-group">
                 <xs:annotation>
-                    <xs:documentation>Red Hat eCos Public License v1.1</xs:documentation>
+                    <xs:documentation>MIT Open Group variant</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="PHP-3.0">
+            <xs:enumeration value="MIT-feh">
                 <xs:annotation>
-                    <xs:documentation>PHP License v3.0</xs:documentation>
+                    <xs:documentation>feh License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-Protection">
+            <xs:enumeration value="MITNFA">
                 <xs:annotation>
-                    <xs:documentation>BSD Protection License</xs:documentation>
+                    <xs:documentation>MIT +no-false-attribs license</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-3.0-DE">
+            <xs:enumeration value="MPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial 3.0 Germany</xs:documentation>
+                    <xs:documentation>Mozilla Public License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="APL-1.0">
+            <xs:enumeration value="mpich2">
                 <xs:annotation>
-                    <xs:documentation>Adaptive Public License 1.0</xs:documentation>
+                    <xs:documentation>mpich2 License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="EUDatagrid">
+            <xs:enumeration value="MPL-2.0">
                 <xs:annotation>
-                    <xs:documentation>EU DataGrid Software License</xs:documentation>
+                    <xs:documentation>Mozilla Public License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-1.0">
+            <xs:enumeration value="MPL-2.0-no-copyleft-exception">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v1.0 only</xs:documentation>
+                    <xs:documentation>Mozilla Public License 2.0 (no copyleft exception)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SHL-0.5">
+            <xs:enumeration value="MS-RL">
                 <xs:annotation>
-                    <xs:documentation>Solderpad Hardware License v0.5</xs:documentation>
+                    <xs:documentation>Microsoft Reciprocal License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-SA-2.0">
+            <xs:enumeration value="MTLL">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Share Alike 2.0 Generic</xs:documentation>
+                    <xs:documentation>Matrix Template Library License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-SA-3.0-AT">
+            <xs:enumeration value="MPL-1.1">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Share Alike 3.0 Austria</xs:documentation>
+                    <xs:documentation>Mozilla Public License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-SA-3.0-IGO">
+            <xs:enumeration value="MulanPSL-2.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 3.0 IGO</xs:documentation>
+                    <xs:documentation>Mulan Permissive Software License, Version 2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Adobe-2006">
+            <xs:enumeration value="Motosoto">
                 <xs:annotation>
-                    <xs:documentation>Adobe Systems Incorporated Source Code License Agreement</xs:documentation>
+                    <xs:documentation>Motosoto License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Newsletr">
+            <xs:enumeration value="Mup">
                 <xs:annotation>
-                    <xs:documentation>Newsletr License</xs:documentation>
+                    <xs:documentation>Mup License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Nunit">
+            <xs:enumeration value="MulanPSL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Nunit License</xs:documentation>
+                    <xs:documentation>Mulan Permissive Software License, Version 1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Multics">
+            <xs:enumeration value="NAIST-2003">
                 <xs:annotation>
-                    <xs:documentation>Multics License</xs:documentation>
+                    <xs:documentation>Nara Institute of Science and Technology License (2003)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OGL-UK-1.0">
+            <xs:enumeration value="Naumen">
                 <xs:annotation>
-                    <xs:documentation>Open Government Licence v1.0</xs:documentation>
+                    <xs:documentation>Naumen Public License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Vim">
+            <xs:enumeration value="Multics">
                 <xs:annotation>
-                    <xs:documentation>Vim License</xs:documentation>
+                    <xs:documentation>Multics License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="eCos-2.0">
+            <xs:enumeration value="NBPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>eCos license version 2.0</xs:documentation>
+                    <xs:documentation>Net Boolean Public License v1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Zimbra-1.3">
+            <xs:enumeration value="NCSA">
                 <xs:annotation>
-                    <xs:documentation>Zimbra Public License v1.3</xs:documentation>
+                    <xs:documentation>University of Illinois/NCSA Open Source License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="eGenix">
+            <xs:enumeration value="Net-SNMP">
                 <xs:annotation>
-                    <xs:documentation>eGenix.com Public License 1.1.0</xs:documentation>
+                    <xs:documentation>Net-SNMP License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="IBM-pibs">
+            <xs:enumeration value="NetCDF">
                 <xs:annotation>
-                    <xs:documentation>IBM PowerPC Initialization and Boot Software</xs:documentation>
+                    <xs:documentation>NetCDF license</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BitTorrent-1.1">
+            <xs:enumeration value="NASA-1.3">
                 <xs:annotation>
-                    <xs:documentation>BitTorrent Open Source License v1.1</xs:documentation>
+                    <xs:documentation>NASA Open Source Agreement 1.3</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OFL-1.1-no-RFN">
+            <xs:enumeration value="NGPL">
                 <xs:annotation>
-                    <xs:documentation>SIL Open Font License 1.1 with no Reserved Font Name</xs:documentation>
+                    <xs:documentation>Nethack General Public License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="psfrag">
+            <xs:enumeration value="NIST-PD-fallback">
                 <xs:annotation>
-                    <xs:documentation>psfrag License</xs:documentation>
+                    <xs:documentation>NIST Public Domain Notice with license fallback</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-ND-2.0">
+            <xs:enumeration value="NIST-PD">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution No Derivatives 2.0 Generic</xs:documentation>
+                    <xs:documentation>NIST Public Domain Notice</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SHL-0.51">
+            <xs:enumeration value="Newsletr">
                 <xs:annotation>
-                    <xs:documentation>Solderpad Hardware License, Version 0.51</xs:documentation>
+                    <xs:documentation>Newsletr License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="FreeBSD-DOC">
+            <xs:enumeration value="NLPL">
                 <xs:annotation>
-                    <xs:documentation>FreeBSD Documentation License</xs:documentation>
+                    <xs:documentation>No Limit Public License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Python-2.0">
+            <xs:enumeration value="Nokia">
                 <xs:annotation>
-                    <xs:documentation>Python License 2.0</xs:documentation>
+                    <xs:documentation>Nokia Open Source License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Mup">
+            <xs:enumeration value="NOSL">
                 <xs:annotation>
-                    <xs:documentation>Mup License</xs:documentation>
+                    <xs:documentation>Netizen Open Source License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-4-Clause-Shortened">
+            <xs:enumeration value="Noweb">
                 <xs:annotation>
-                    <xs:documentation>BSD 4 Clause Shortened</xs:documentation>
+                    <xs:documentation>Noweb License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-SA-4.0">
+            <xs:enumeration value="NLOD-1.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 4.0 International</xs:documentation>
+                    <xs:documentation>Norwegian Licence for Open Government Data</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="HPND">
+            <xs:enumeration value="NPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Historical Permission Notice and Disclaimer</xs:documentation>
+                    <xs:documentation>Netscape Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-2.6">
+            <xs:enumeration value="NCGL-UK-2.0">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v2.6</xs:documentation>
+                    <xs:documentation>Non-Commercial Government Licence</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MPL-1.1">
+            <xs:enumeration value="NRL">
                 <xs:annotation>
-                    <xs:documentation>Mozilla Public License 1.1</xs:documentation>
+                    <xs:documentation>NRL License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-2.0-with-GCC-exception">
+            <xs:enumeration value="NTP-0">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v2.0 w/GCC Runtime Library exception</xs:documentation>
+                    <xs:documentation>NTP No Attribution</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="HaskellReport">
+            <xs:enumeration value="NTP">
                 <xs:annotation>
-                    <xs:documentation>Haskell Language Report License</xs:documentation>
+                    <xs:documentation>NTP License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="ECL-1.0">
+            <xs:enumeration value="GFDL-1.3-or-later">
                 <xs:annotation>
-                    <xs:documentation>Educational Community License v1.0</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.3 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LGPL-2.1-or-later">
+            <xs:enumeration value="Nunit">
                 <xs:annotation>
-                    <xs:documentation>GNU Lesser General Public License v2.1 or later</xs:documentation>
+                    <xs:documentation>Nunit License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OFL-1.0">
+            <xs:enumeration value="O-UDA-1.0">
                 <xs:annotation>
-                    <xs:documentation>SIL Open Font License 1.0</xs:documentation>
+                    <xs:documentation>Open Use of Data Agreement v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="APSL-1.1">
+            <xs:enumeration value="NPL-1.1">
                 <xs:annotation>
-                    <xs:documentation>Apple Public Source License 1.1</xs:documentation>
+                    <xs:documentation>Netscape Public License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MITNFA">
+            <xs:enumeration value="OCCT-PL">
                 <xs:annotation>
-                    <xs:documentation>MIT +no-false-attribs license</xs:documentation>
+                    <xs:documentation>Open CASCADE Technology Public License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CECILL-2.0">
+            <xs:enumeration value="ODC-By-1.0">
                 <xs:annotation>
-                    <xs:documentation>CeCILL Free Software License Agreement v2.0</xs:documentation>
+                    <xs:documentation>Open Data Commons Attribution License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Crossword">
+            <xs:enumeration value="OFL-1.0-no-RFN">
                 <xs:annotation>
-                    <xs:documentation>Crossword License</xs:documentation>
+                    <xs:documentation>SIL Open Font License 1.0 with no Reserved Font Name</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Aladdin">
+            <xs:enumeration value="OCLC-2.0">
                 <xs:annotation>
-                    <xs:documentation>Aladdin Free Public License</xs:documentation>
+                    <xs:documentation>OCLC Research Public License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Baekmuk">
+            <xs:enumeration value="OFL-1.0-RFN">
                 <xs:annotation>
-                    <xs:documentation>Baekmuk License</xs:documentation>
+                    <xs:documentation>SIL Open Font License 1.0 with Reserved Font Name</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="XFree86-1.1">
+            <xs:enumeration value="OFL-1.0">
                 <xs:annotation>
-                    <xs:documentation>XFree86 License 1.1</xs:documentation>
+                    <xs:documentation>SIL Open Font License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-1.0-or-later">
+            <xs:enumeration value="OFL-1.1-no-RFN">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v1.0 or later</xs:documentation>
+                    <xs:documentation>SIL Open Font License 1.1 with no Reserved Font Name</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CERN-OHL-W-2.0">
+            <xs:enumeration value="OFL-1.1-RFN">
                 <xs:annotation>
-                    <xs:documentation>CERN Open Hardware Licence Version 2 - Weakly Reciprocal</xs:documentation>
+                    <xs:documentation>SIL Open Font License 1.1 with Reserved Font Name</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-SA-1.0">
+            <xs:enumeration value="OFL-1.1">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Share Alike 1.0 Generic</xs:documentation>
+                    <xs:documentation>SIL Open Font License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NTP">
+            <xs:enumeration value="OGDL-Taiwan-1.0">
                 <xs:annotation>
-                    <xs:documentation>NTP License</xs:documentation>
+                    <xs:documentation>Taiwan Open Government Data License, version 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="PHP-3.01">
+            <xs:enumeration value="OGC-1.0">
                 <xs:annotation>
-                    <xs:documentation>PHP License v3.01</xs:documentation>
+                    <xs:documentation>OGC Software License, Version 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OCLC-2.0">
+            <xs:enumeration value="OGL-UK-1.0">
                 <xs:annotation>
-                    <xs:documentation>OCLC Research Public License 2.0</xs:documentation>
+                    <xs:documentation>Open Government Licence v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-3.0-DE">
+            <xs:enumeration value="OGL-UK-2.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution 3.0 Germany</xs:documentation>
+                    <xs:documentation>Open Government Licence v2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-2.5">
+            <xs:enumeration value="OGL-UK-3.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial 2.5 Generic</xs:documentation>
+                    <xs:documentation>Open Government Licence v3.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Zlib">
+            <xs:enumeration value="OGTSL">
                 <xs:annotation>
-                    <xs:documentation>zlib License</xs:documentation>
+                    <xs:documentation>Open Group Test Suite License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CATOSL-1.1">
+            <xs:enumeration value="OLDAP-1.1">
                 <xs:annotation>
-                    <xs:documentation>Computer Associates Trusted Open Source License 1.1</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LGPL-3.0+">
+            <xs:enumeration value="OLDAP-1.2">
                 <xs:annotation>
-                    <xs:documentation>GNU Lesser General Public License v3.0 or later</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v1.2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CAL-1.0">
+            <xs:enumeration value="OLDAP-1.3">
                 <xs:annotation>
-                    <xs:documentation>Cryptographic Autonomy License 1.0</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v1.3</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NPL-1.0">
+            <xs:enumeration value="OGL-Canada-2.0">
                 <xs:annotation>
-                    <xs:documentation>Netscape Public License v1.0</xs:documentation>
+                    <xs:documentation>Open Government Licence - Canada</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SMLNJ">
+            <xs:enumeration value="OLDAP-2.0.1">
                 <xs:annotation>
-                    <xs:documentation>Standard ML of New Jersey License</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v2.0.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-2.0+">
+            <xs:enumeration value="OLDAP-2.0">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v2.0 or later</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-2.5">
+            <xs:enumeration value="OLDAP-2.1">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v2.5</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v2.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="JasPer-2.0">
+            <xs:enumeration value="OLDAP-2.2.1">
                 <xs:annotation>
-                    <xs:documentation>JasPer License</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v2.2.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-2.0-or-later">
+            <xs:enumeration value="OLDAP-2.2.2">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v2.0 or later</xs:documentation>
+                    <xs:documentation>Open LDAP Public License 2.2.2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-2-Clause-Patent">
+            <xs:enumeration value="OLDAP-2.2">
                 <xs:annotation>
-                    <xs:documentation>BSD-2-Clause Plus Patent License</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v2.2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MS-RL">
+            <xs:enumeration value="ODbL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Microsoft Reciprocal License</xs:documentation>
+                    <xs:documentation>Open Data Commons Open Database License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CUA-OPL-1.0">
+            <xs:enumeration value="OLDAP-2.4">
                 <xs:annotation>
-                    <xs:documentation>CUA Office Public License v1.0</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v2.4</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="IPA">
+            <xs:enumeration value="OLDAP-1.4">
                 <xs:annotation>
-                    <xs:documentation>IPA Font License</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v1.4</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NLPL">
+            <xs:enumeration value="OLDAP-2.3">
                 <xs:annotation>
-                    <xs:documentation>No Limit Public License</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v2.3</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="O-UDA-1.0">
+            <xs:enumeration value="OLDAP-2.7">
                 <xs:annotation>
-                    <xs:documentation>Open Use of Data Agreement v1.0</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v2.7</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MIT-Modern-Variant">
+            <xs:enumeration value="OLDAP-2.8">
                 <xs:annotation>
-                    <xs:documentation>MIT License Modern Variant</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v2.8</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-1.2">
+            <xs:enumeration value="OML">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v1.2</xs:documentation>
+                    <xs:documentation>Open Market License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-2-Clause-FreeBSD">
+            <xs:enumeration value="OpenSSL">
                 <xs:annotation>
-                    <xs:documentation>BSD 2-Clause FreeBSD License</xs:documentation>
+                    <xs:documentation>OpenSSL License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Info-ZIP">
+            <xs:enumeration value="OLDAP-2.6">
                 <xs:annotation>
-                    <xs:documentation>Info-ZIP License</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v2.6</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-SA-2.0-FR">
+            <xs:enumeration value="OPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution-NonCommercial-ShareAlike 2.0 France</xs:documentation>
+                    <xs:documentation>Open Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="0BSD">
+            <xs:enumeration value="OSL-1.0">
                 <xs:annotation>
-                    <xs:documentation>BSD Zero Clause License</xs:documentation>
+                    <xs:documentation>Open Software License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Unicode-DFS-2016">
+            <xs:enumeration value="OSL-1.1">
                 <xs:annotation>
-                    <xs:documentation>Unicode License Agreement - Data Files and Software (2016)</xs:documentation>
+                    <xs:documentation>Open Software License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OFL-1.0-RFN">
+            <xs:enumeration value="OSL-2.0">
                 <xs:annotation>
-                    <xs:documentation>SIL Open Font License 1.0 with Reserved Font Name</xs:documentation>
+                    <xs:documentation>Open Software License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Intel">
+            <xs:enumeration value="OSET-PL-2.1">
                 <xs:annotation>
-                    <xs:documentation>Intel Open Source License</xs:documentation>
+                    <xs:documentation>OSET Public License version 2.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AFL-2.0">
+            <xs:enumeration value="OSL-2.1">
                 <xs:annotation>
-                    <xs:documentation>Academic Free License v2.0</xs:documentation>
+                    <xs:documentation>Open Software License 2.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GL2PS">
+            <xs:enumeration value="Parity-6.0.0">
                 <xs:annotation>
-                    <xs:documentation>GL2PS License</xs:documentation>
+                    <xs:documentation>The Parity Public License 6.0.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="TAPR-OHL-1.0">
+            <xs:enumeration value="Parity-7.0.0">
                 <xs:annotation>
-                    <xs:documentation>TAPR Open Hardware License v1.0</xs:documentation>
+                    <xs:documentation>The Parity Public License 7.0.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Apache-1.0">
+            <xs:enumeration value="PDDL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Apache License 1.0</xs:documentation>
+                    <xs:documentation>Open Data Commons Public Domain Dedication &amp; License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MTLL">
+            <xs:enumeration value="PHP-3.0">
                 <xs:annotation>
-                    <xs:documentation>Matrix Template Library License</xs:documentation>
+                    <xs:documentation>PHP License v3.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Motosoto">
+            <xs:enumeration value="OSL-3.0">
                 <xs:annotation>
-                    <xs:documentation>Motosoto License</xs:documentation>
+                    <xs:documentation>Open Software License 3.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="RSA-MD">
+            <xs:enumeration value="Plexus">
                 <xs:annotation>
-                    <xs:documentation>RSA Message-Digest License</xs:documentation>
+                    <xs:documentation>Plexus Classworlds License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Community-Spec-1.0">
+            <xs:enumeration value="MS-PL">
                 <xs:annotation>
-                    <xs:documentation>Community Specification License 1.0</xs:documentation>
+                    <xs:documentation>Microsoft Public License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="ODC-By-1.0">
+            <xs:enumeration value="PolyForm-Small-Business-1.0.0">
                 <xs:annotation>
-                    <xs:documentation>Open Data Commons Attribution License v1.0</xs:documentation>
+                    <xs:documentation>PolyForm Small Business License 1.0.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="zlib-acknowledgement">
+            <xs:enumeration value="PolyForm-Noncommercial-1.0.0">
                 <xs:annotation>
-                    <xs:documentation>zlib/libpng License with Acknowledgement</xs:documentation>
+                    <xs:documentation>PolyForm Noncommercial License 1.0.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="DL-DE-BY-2.0">
+            <xs:enumeration value="PSF-2.0">
                 <xs:annotation>
-                    <xs:documentation>Data licence Germany – attribution – version 2.0</xs:documentation>
+                    <xs:documentation>Python Software Foundation License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="VSL-1.0">
+            <xs:enumeration value="psfrag">
                 <xs:annotation>
-                    <xs:documentation>Vovida Software License v1.0</xs:documentation>
+                    <xs:documentation>psfrag License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LiLiQ-R-1.1">
+            <xs:enumeration value="PostgreSQL">
                 <xs:annotation>
-                    <xs:documentation>Licence Libre du Québec – Réciprocité version 1.1</xs:documentation>
+                    <xs:documentation>PostgreSQL License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OPL-1.0">
+            <xs:enumeration value="psutils">
                 <xs:annotation>
-                    <xs:documentation>Open Public License v1.0</xs:documentation>
+                    <xs:documentation>psutils License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-3.0+">
+            <xs:enumeration value="Qhull">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v3.0 or later</xs:documentation>
+                    <xs:documentation>Qhull License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MulanPSL-2.0">
+            <xs:enumeration value="QPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Mulan Permissive Software License, Version 2</xs:documentation>
+                    <xs:documentation>Q Public License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="APSL-1.2">
+            <xs:enumeration value="Rdisc">
                 <xs:annotation>
-                    <xs:documentation>Apple Public Source License 1.2</xs:documentation>
+                    <xs:documentation>Rdisc License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OGDL-Taiwan-1.0">
+            <xs:enumeration value="Python-2.0">
                 <xs:annotation>
-                    <xs:documentation>Taiwan Open Government Data License, version 1.0</xs:documentation>
+                    <xs:documentation>Python License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="RSCPL">
+            <xs:enumeration value="RPL-1.1">
                 <xs:annotation>
-                    <xs:documentation>Ricoh Source Code Public License</xs:documentation>
+                    <xs:documentation>Reciprocal Public License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OGC-1.0">
+            <xs:enumeration value="RPL-1.5">
                 <xs:annotation>
-                    <xs:documentation>OGC Software License, Version 1.0</xs:documentation>
+                    <xs:documentation>Reciprocal Public License 1.5</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="EFL-2.0">
+            <xs:enumeration value="RHeCos-1.1">
                 <xs:annotation>
-                    <xs:documentation>Eiffel Forum License v2.0</xs:documentation>
+                    <xs:documentation>Red Hat eCos Public License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CAL-1.0-Combined-Work-Exception">
+            <xs:enumeration value="RSA-MD">
                 <xs:annotation>
-                    <xs:documentation>Cryptographic Autonomy License 1.0 (Combined Work Exception)</xs:documentation>
+                    <xs:documentation>RSA Message-Digest License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MS-PL">
+            <xs:enumeration value="RSCPL">
                 <xs:annotation>
-                    <xs:documentation>Microsoft Public License</xs:documentation>
+                    <xs:documentation>Ricoh Source Code Public License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Plexus">
+            <xs:enumeration value="Ruby">
                 <xs:annotation>
-                    <xs:documentation>Plexus Classworlds License</xs:documentation>
+                    <xs:documentation>Ruby License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Sendmail-8.23">
+            <xs:enumeration value="SAX-PD">
                 <xs:annotation>
-                    <xs:documentation>Sendmail License 8.23</xs:documentation>
+                    <xs:documentation>Sax Public Domain Notice</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Cube">
+            <xs:enumeration value="Saxpath">
                 <xs:annotation>
-                    <xs:documentation>Cube License</xs:documentation>
+                    <xs:documentation>Saxpath License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="JSON">
+            <xs:enumeration value="SCEA">
                 <xs:annotation>
-                    <xs:documentation>JSON License</xs:documentation>
+                    <xs:documentation>SCEA Shared Source License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="EUPL-1.2">
+            <xs:enumeration value="Sendmail-8.23">
                 <xs:annotation>
-                    <xs:documentation>European Union Public License 1.2</xs:documentation>
+                    <xs:documentation>Sendmail License 8.23</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Adobe-Glyph">
+            <xs:enumeration value="Sendmail">
                 <xs:annotation>
-                    <xs:documentation>Adobe Glyph List License</xs:documentation>
+                    <xs:documentation>Sendmail License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="FreeImage">
+            <xs:enumeration value="SGI-B-1.0">
                 <xs:annotation>
-                    <xs:documentation>FreeImage Public License v1.0</xs:documentation>
+                    <xs:documentation>SGI Free Software License B v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Watcom-1.0">
+            <xs:enumeration value="SGI-B-1.1">
                 <xs:annotation>
-                    <xs:documentation>Sybase Open Watcom Public License 1.0</xs:documentation>
+                    <xs:documentation>SGI Free Software License B v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Jam">
+            <xs:enumeration value="SGI-B-2.0">
                 <xs:annotation>
-                    <xs:documentation>Jam License</xs:documentation>
+                    <xs:documentation>SGI Free Software License B v2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Hippocratic-2.1">
+            <xs:enumeration value="SHL-0.5">
                 <xs:annotation>
-                    <xs:documentation>Hippocratic License 2.1</xs:documentation>
+                    <xs:documentation>Solderpad Hardware License v0.5</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-2.0.1">
+            <xs:enumeration value="SHL-0.51">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v2.0.1</xs:documentation>
+                    <xs:documentation>Solderpad Hardware License, Version 0.51</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-SA-2.0">
+            <xs:enumeration value="SimPL-2.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 2.0 Generic</xs:documentation>
+                    <xs:documentation>Simple Public License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Nokia">
+            <xs:enumeration value="SISSL-1.2">
                 <xs:annotation>
-                    <xs:documentation>Nokia Open Source License</xs:documentation>
+                    <xs:documentation>Sun Industry Standards Source License v1.2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OCCT-PL">
+            <xs:enumeration value="SISSL">
                 <xs:annotation>
-                    <xs:documentation>Open CASCADE Technology Public License</xs:documentation>
+                    <xs:documentation>Sun Industry Standards Source License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="ErlPL-1.1">
+            <xs:enumeration value="Sleepycat">
                 <xs:annotation>
-                    <xs:documentation>Erlang Public License v1.1</xs:documentation>
+                    <xs:documentation>Sleepycat License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="TOSL">
+            <xs:enumeration value="SMLNJ">
                 <xs:annotation>
-                    <xs:documentation>Trusster Open Source License</xs:documentation>
+                    <xs:documentation>Standard ML of New Jersey License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OSL-2.1">
+            <xs:enumeration value="SMPPL">
                 <xs:annotation>
-                    <xs:documentation>Open Software License 2.1</xs:documentation>
+                    <xs:documentation>Secure Messaging Protocol Public License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="ClArtistic">
+            <xs:enumeration value="SNIA">
                 <xs:annotation>
-                    <xs:documentation>Clarified Artistic License</xs:documentation>
+                    <xs:documentation>SNIA Public License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="xinetd">
+            <xs:enumeration value="Spencer-86">
                 <xs:annotation>
-                    <xs:documentation>xinetd License</xs:documentation>
+                    <xs:documentation>Spencer License 86</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-3.0-with-GCC-exception">
+            <xs:enumeration value="Spencer-94">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v3.0 w/GCC Runtime Library exception</xs:documentation>
+                    <xs:documentation>Spencer License 94</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="ODbL-1.0">
+            <xs:enumeration value="Spencer-99">
                 <xs:annotation>
-                    <xs:documentation>Open Data Commons Open Database License v1.0</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="MIT">
-                <xs:annotation>
-                    <xs:documentation>MIT License</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="LGPL-2.1+">
-                <xs:annotation>
-                    <xs:documentation>GNU Library General Public License v2.1 or later</xs:documentation>
+                    <xs:documentation>Spencer License 99</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LGPL-2.1-only">
+            <xs:enumeration value="SPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>GNU Lesser General Public License v2.1 only</xs:documentation>
+                    <xs:documentation>Sun Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CrystalStacker">
+            <xs:enumeration value="SSH-OpenSSH">
                 <xs:annotation>
-                    <xs:documentation>CrystalStacker License</xs:documentation>
+                    <xs:documentation>SSH OpenSSH license</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="ECL-2.0">
+            <xs:enumeration value="PHP-3.01">
                 <xs:annotation>
-                    <xs:documentation>Educational Community License v2.0</xs:documentation>
+                    <xs:documentation>PHP License v3.01</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LPPL-1.0">
+            <xs:enumeration value="SSH-short">
                 <xs:annotation>
-                    <xs:documentation>LaTeX Project Public License v1.0</xs:documentation>
+                    <xs:documentation>SSH short notice</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="iMatix">
+            <xs:enumeration value="MIT-0">
                 <xs:annotation>
-                    <xs:documentation>iMatix Standard Function Library Agreement</xs:documentation>
+                    <xs:documentation>MIT No Attribution</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-ND-3.0-IGO">
+            <xs:enumeration value="RPSL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 3.0 IGO</xs:documentation>
+                    <xs:documentation>RealNetworks Public Source License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-Source-Code">
+            <xs:enumeration value="SWL">
                 <xs:annotation>
-                    <xs:documentation>BSD Source Code Attribution</xs:documentation>
+                    <xs:documentation>Scheme Widget Library (SWL) Software License Agreement</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Parity-6.0.0">
+            <xs:enumeration value="SugarCRM-1.1.3">
                 <xs:annotation>
-                    <xs:documentation>The Parity Public License 6.0.0</xs:documentation>
+                    <xs:documentation>SugarCRM Public License v1.1.3</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="TCL">
@@ -2062,129 +2052,59 @@
                     <xs:documentation>TCL/TK License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Arphic-1999">
-                <xs:annotation>
-                    <xs:documentation>Arphic Public License</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="CC-BY-SA-3.0">
-                <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Share Alike 3.0 Unported</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="Caldera">
-                <xs:annotation>
-                    <xs:documentation>Caldera License</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="AGPL-1.0">
-                <xs:annotation>
-                    <xs:documentation>Affero General Public License v1.0</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="IPL-1.0">
-                <xs:annotation>
-                    <xs:documentation>IBM Public License v1.0</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="LAL-1.3">
-                <xs:annotation>
-                    <xs:documentation>Licence Art Libre 1.3</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="EPICS">
-                <xs:annotation>
-                    <xs:documentation>EPICS Open License</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="NGPL">
-                <xs:annotation>
-                    <xs:documentation>Nethack General Public License</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="DRL-1.0">
-                <xs:annotation>
-                    <xs:documentation>Detection Rule License 1.0</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="BSD-2-Clause-NetBSD">
-                <xs:annotation>
-                    <xs:documentation>BSD 2-Clause NetBSD License</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="ZPL-1.1">
-                <xs:annotation>
-                    <xs:documentation>Zope Public License 1.1</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="GD">
-                <xs:annotation>
-                    <xs:documentation>GD License</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="LPPL-1.2">
-                <xs:annotation>
-                    <xs:documentation>LaTeX Project Public License v1.2</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="Dotseqn">
-                <xs:annotation>
-                    <xs:documentation>Dotseqn License</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="Spencer-99">
+            <xs:enumeration value="TCP-wrappers">
                 <xs:annotation>
-                    <xs:documentation>Spencer License 99</xs:documentation>
+                    <xs:documentation>TCP Wrappers License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-2.3">
+            <xs:enumeration value="SSPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v2.3</xs:documentation>
+                    <xs:documentation>Server Side Public License, v 1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="YPL-1.1">
+            <xs:enumeration value="TMate">
                 <xs:annotation>
-                    <xs:documentation>Yahoo! Public License v1.1</xs:documentation>
+                    <xs:documentation>TMate Open Source License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Fair">
+            <xs:enumeration value="TOSL">
                 <xs:annotation>
-                    <xs:documentation>Fair License</xs:documentation>
+                    <xs:documentation>Trusster Open Source License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Qhull">
+            <xs:enumeration value="TORQUE-1.1">
                 <xs:annotation>
-                    <xs:documentation>Qhull License</xs:documentation>
+                    <xs:documentation>TORQUE v2.5+ Software License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.1-no-invariants-or-later">
+            <xs:enumeration value="TAPR-OHL-1.0">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.1 or later - no invariants</xs:documentation>
+                    <xs:documentation>TAPR Open Hardware License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CECILL-C">
+            <xs:enumeration value="UCL-1.0">
                 <xs:annotation>
-                    <xs:documentation>CeCILL-C Free Software License Agreement</xs:documentation>
+                    <xs:documentation>Upstream Compatibility License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MulanPSL-1.0">
+            <xs:enumeration value="Unicode-DFS-2015">
                 <xs:annotation>
-                    <xs:documentation>Mulan Permissive Software License, Version 1</xs:documentation>
+                    <xs:documentation>Unicode License Agreement - Data Files and Software (2015)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-1.1">
+            <xs:enumeration value="Unicode-DFS-2016">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v1.1</xs:documentation>
+                    <xs:documentation>Unicode License Agreement - Data Files and Software (2016)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-2.1">
+            <xs:enumeration value="Unicode-TOU">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v2.1</xs:documentation>
+                    <xs:documentation>Unicode Terms of Use</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LPL-1.02">
+            <xs:enumeration value="TU-Berlin-1.0">
                 <xs:annotation>
-                    <xs:documentation>Lucent Public License v1.02</xs:documentation>
+                    <xs:documentation>Technische Universitaet Berlin License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="UPL-1.0">
@@ -2192,270 +2112,210 @@
                     <xs:documentation>Universal Permissive License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Abstyles">
-                <xs:annotation>
-                    <xs:documentation>Abstyles License</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="ZPL-2.0">
-                <xs:annotation>
-                    <xs:documentation>Zope Public License 2.0</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="MIT-0">
-                <xs:annotation>
-                    <xs:documentation>MIT No Attribution</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="LGPL-2.0-only">
-                <xs:annotation>
-                    <xs:documentation>GNU Library General Public License v2 only</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="GFDL-1.3-no-invariants-only">
-                <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.3 only - no invariants</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="AGPL-3.0">
-                <xs:annotation>
-                    <xs:documentation>GNU Affero General Public License v3.0</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="EPL-2.0">
-                <xs:annotation>
-                    <xs:documentation>Eclipse Public License 2.0</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="AFL-3.0">
-                <xs:annotation>
-                    <xs:documentation>Academic Free License v3.0</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="CDLA-Permissive-1.0">
-                <xs:annotation>
-                    <xs:documentation>Community Data License Agreement Permissive 1.0</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="Artistic-1.0">
-                <xs:annotation>
-                    <xs:documentation>Artistic License 1.0</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-ND-4.0">
-                <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 4.0 International</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="HTMLTIDY">
-                <xs:annotation>
-                    <xs:documentation>HTML Tidy License</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="Glide">
+            <xs:enumeration value="Unlicense">
                 <xs:annotation>
-                    <xs:documentation>3dfx Glide License</xs:documentation>
+                    <xs:documentation>The Unlicense</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="FSFAP">
+            <xs:enumeration value="VOSTROM">
                 <xs:annotation>
-                    <xs:documentation>FSF All Permissive License</xs:documentation>
+                    <xs:documentation>VOSTROM Public License for Open Source</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LGPLLR">
+            <xs:enumeration value="Vim">
                 <xs:annotation>
-                    <xs:documentation>Lesser General Public License For Linguistic Resources</xs:documentation>
+                    <xs:documentation>Vim License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OGL-UK-3.0">
+            <xs:enumeration value="VSL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Open Government Licence v3.0</xs:documentation>
+                    <xs:documentation>Vovida Software License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.2">
+            <xs:enumeration value="W3C-20150513">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.2</xs:documentation>
+                    <xs:documentation>W3C Software Notice and Document License (2015-05-13)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SSH-OpenSSH">
+            <xs:enumeration value="W3C">
                 <xs:annotation>
-                    <xs:documentation>SSH OpenSSH license</xs:documentation>
+                    <xs:documentation>W3C Software Notice and License (2002-12-31)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.1-only">
+            <xs:enumeration value="W3C-19980720">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.1 only</xs:documentation>
+                    <xs:documentation>W3C Software Notice and License (1998-07-20)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MIT-feh">
+            <xs:enumeration value="Wsuipa">
                 <xs:annotation>
-                    <xs:documentation>feh License</xs:documentation>
+                    <xs:documentation>Wsuipa License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MPL-1.0">
+            <xs:enumeration value="Watcom-1.0">
                 <xs:annotation>
-                    <xs:documentation>Mozilla Public License 1.0</xs:documentation>
+                    <xs:documentation>Sybase Open Watcom Public License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="PostgreSQL">
+            <xs:enumeration value="WTFPL">
                 <xs:annotation>
-                    <xs:documentation>PostgreSQL License</xs:documentation>
+                    <xs:documentation>Do What The F*ck You Want To Public License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-2.2.2">
+            <xs:enumeration value="X11">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License 2.2.2</xs:documentation>
+                    <xs:documentation>X11 License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SMPPL">
+            <xs:enumeration value="Xerox">
                 <xs:annotation>
-                    <xs:documentation>Secure Messaging Protocol Public License</xs:documentation>
+                    <xs:documentation>Xerox License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OFL-1.1">
+            <xs:enumeration value="XFree86-1.1">
                 <xs:annotation>
-                    <xs:documentation>SIL Open Font License 1.1</xs:documentation>
+                    <xs:documentation>XFree86 License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Leptonica">
+            <xs:enumeration value="xinetd">
                 <xs:annotation>
-                    <xs:documentation>Leptonica License</xs:documentation>
+                    <xs:documentation>xinetd License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CERN-OHL-1.1">
+            <xs:enumeration value="Xnet">
                 <xs:annotation>
-                    <xs:documentation>CERN Open Hardware Licence v1.1</xs:documentation>
+                    <xs:documentation>X.Net License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-3-Clause-No-Nuclear-Warranty">
+            <xs:enumeration value="xpp">
                 <xs:annotation>
-                    <xs:documentation>BSD 3-Clause No Nuclear Warranty</xs:documentation>
+                    <xs:documentation>XPP License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-ND-2.5">
+            <xs:enumeration value="XSkat">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution No Derivatives 2.5 Generic</xs:documentation>
+                    <xs:documentation>XSkat License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-1.0">
+            <xs:enumeration value="YPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution 1.0 Generic</xs:documentation>
+                    <xs:documentation>Yahoo! Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.2-only">
+            <xs:enumeration value="YPL-1.1">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.2 only</xs:documentation>
+                    <xs:documentation>Yahoo! Public License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OPUBL-1.0">
+            <xs:enumeration value="Zed">
                 <xs:annotation>
-                    <xs:documentation>Open Publication License v1.0</xs:documentation>
+                    <xs:documentation>Zed License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="libselinux-1.0">
+            <xs:enumeration value="Zend-2.0">
                 <xs:annotation>
-                    <xs:documentation>libselinux public domain notice</xs:documentation>
+                    <xs:documentation>Zend License v2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-3-Clause">
+            <xs:enumeration value="TU-Berlin-2.0">
                 <xs:annotation>
-                    <xs:documentation>BSD 3-Clause &quot;New&quot; or &quot;Revised&quot; License</xs:documentation>
+                    <xs:documentation>Technische Universitaet Berlin License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="ANTLR-PD-fallback">
+            <xs:enumeration value="Zimbra-1.4">
                 <xs:annotation>
-                    <xs:documentation>ANTLR Software Rights Notice with license fallback</xs:documentation>
+                    <xs:documentation>Zimbra Public License v1.4</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="copyleft-next-0.3.1">
+            <xs:enumeration value="zlib-acknowledgement">
                 <xs:annotation>
-                    <xs:documentation>copyleft-next 0.3.1</xs:documentation>
+                    <xs:documentation>zlib/libpng License with Acknowledgement</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-1.0+">
+            <xs:enumeration value="Zlib">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v1.0 or later</xs:documentation>
+                    <xs:documentation>zlib License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="wxWindows">
+            <xs:enumeration value="ZPL-1.1">
                 <xs:annotation>
-                    <xs:documentation>wxWindows Library License</xs:documentation>
+                    <xs:documentation>Zope Public License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LGPL-3.0">
+            <xs:enumeration value="ZPL-2.0">
                 <xs:annotation>
-                    <xs:documentation>GNU Lesser General Public License v3.0 only</xs:documentation>
+                    <xs:documentation>Zope Public License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LGPL-2.1">
+            <xs:enumeration value="ZPL-2.1">
                 <xs:annotation>
-                    <xs:documentation>GNU Lesser General Public License v2.1 only</xs:documentation>
+                    <xs:documentation>Zope Public License 2.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="StandardML-NJ">
+            <xs:enumeration value="wxWindows">
                 <xs:annotation>
-                    <xs:documentation>Standard ML of New Jersey License</xs:documentation>
+                    <xs:documentation>wxWindows Library License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-4-Clause">
+            <xs:enumeration value="Zimbra-1.3">
                 <xs:annotation>
-                    <xs:documentation>BSD 4-Clause &quot;Original&quot; or &quot;Old&quot; License</xs:documentation>
+                    <xs:documentation>Zimbra Public License v1.3</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-2.0-with-bison-exception">
+            <xs:enumeration value="gSOAP-1.3b">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v2.0 w/Bison exception</xs:documentation>
+                    <xs:documentation>gSOAP Public License v1.3b</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Apache-2.0">
+            <xs:enumeration value="Interbase-1.0">
                 <xs:annotation>
-                    <xs:documentation>Apache License 2.0</xs:documentation>
+                    <xs:documentation>Interbase Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Artistic-1.0-cl8">
+            <xs:enumeration value="LGPL-2.1">
                 <xs:annotation>
-                    <xs:documentation>Artistic License 1.0 w/clause 8</xs:documentation>
+                    <xs:documentation>GNU Lesser General Public License v2.1 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-2.0">
+            <xs:enumeration value="LGPL-3.0">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v2.0 only</xs:documentation>
+                    <xs:documentation>GNU Lesser General Public License v3.0 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Intel-ACPI">
+            <xs:enumeration value="NPOSL-3.0">
                 <xs:annotation>
-                    <xs:documentation>Intel ACPI Software License Agreement</xs:documentation>
+                    <xs:documentation>Non-Profit Open Software License 3.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSL-1.0">
+            <xs:enumeration value="OLDAP-2.5">
                 <xs:annotation>
-                    <xs:documentation>Boost Software License 1.0</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v2.5</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Artistic-1.0-Perl">
+            <xs:enumeration value="StandardML-NJ">
                 <xs:annotation>
-                    <xs:documentation>Artistic License 1.0 (Perl)</xs:documentation>
+                    <xs:documentation>Standard ML of New Jersey License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-2-Clause-Views">
+            <!-- Exceptions -->
+            <xs:enumeration value="389-exception">
                 <xs:annotation>
-                    <xs:documentation>BSD 2-Clause with views sentence</xs:documentation>
+                    <xs:documentation>389 Directory Server Exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Interbase-1.0">
+            <xs:enumeration value="Autoconf-exception-2.0">
                 <xs:annotation>
-                    <xs:documentation>Interbase Public License v1.0</xs:documentation>
+                    <xs:documentation>Autoconf exception 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NPOSL-3.0">
+            <xs:enumeration value="Autoconf-exception-3.0">
                 <xs:annotation>
-                    <xs:documentation>Non-Profit Open Software License 3.0</xs:documentation>
+                    <xs:documentation>Autoconf exception 3.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <!-- Exceptions -->
-            <xs:enumeration value="FLTK-exception">
+            <xs:enumeration value="Bison-exception-2.2">
                 <xs:annotation>
-                    <xs:documentation>FLTK exception</xs:documentation>
+                    <xs:documentation>Bison exception 2.2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Bootloader-exception">
@@ -2463,44 +2323,44 @@
                     <xs:documentation>Bootloader Distribution Exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="WxWindows-exception-3.1">
+            <xs:enumeration value="Classpath-exception-2.0">
                 <xs:annotation>
-                    <xs:documentation>WxWindows Library Exception 3.1</xs:documentation>
+                    <xs:documentation>Classpath exception 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Linux-syscall-note">
+            <xs:enumeration value="CLISP-exception-2.0">
                 <xs:annotation>
-                    <xs:documentation>Linux Syscall Note</xs:documentation>
+                    <xs:documentation>CLISP exception 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Qt-LGPL-exception-1.1">
+            <xs:enumeration value="DigiRule-FOSS-exception">
                 <xs:annotation>
-                    <xs:documentation>Qt LGPL exception 1.1</xs:documentation>
+                    <xs:documentation>DigiRule FOSS License Exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LLVM-exception">
+            <xs:enumeration value="eCos-exception-2.0">
                 <xs:annotation>
-                    <xs:documentation>LLVM Exception</xs:documentation>
+                    <xs:documentation>eCos exception 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="PS-or-PDF-font-exception-20170817">
+            <xs:enumeration value="Fawkes-Runtime-exception">
                 <xs:annotation>
-                    <xs:documentation>PS/PDF font exception (2017-08-17)</xs:documentation>
+                    <xs:documentation>Fawkes Runtime Exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GCC-exception-3.1">
+            <xs:enumeration value="FLTK-exception">
                 <xs:annotation>
-                    <xs:documentation>GCC Runtime Library exception 3.1</xs:documentation>
+                    <xs:documentation>FLTK exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Autoconf-exception-3.0">
+            <xs:enumeration value="Font-exception-2.0">
                 <xs:annotation>
-                    <xs:documentation>Autoconf exception 3.0</xs:documentation>
+                    <xs:documentation>Font exception 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LGPL-3.0-linking-exception">
+            <xs:enumeration value="freertos-exception-2.0">
                 <xs:annotation>
-                    <xs:documentation>LGPL-3.0 Linking Exception</xs:documentation>
+                    <xs:documentation>FreeRTOS Exception 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="GCC-exception-2.0">
@@ -2508,24 +2368,19 @@
                     <xs:documentation>GCC Runtime Library exception 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Bison-exception-2.2">
-                <xs:annotation>
-                    <xs:documentation>Bison exception 2.2</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="openvpn-openssl-exception">
+            <xs:enumeration value="GCC-exception-3.1">
                 <xs:annotation>
-                    <xs:documentation>OpenVPN OpenSSL Exception</xs:documentation>
+                    <xs:documentation>GCC Runtime Library exception 3.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Libtool-exception">
+            <xs:enumeration value="gnu-javamail-exception">
                 <xs:annotation>
-                    <xs:documentation>Libtool Exception</xs:documentation>
+                    <xs:documentation>GNU JavaMail exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Autoconf-exception-2.0">
+            <xs:enumeration value="GPL-3.0-linking-exception">
                 <xs:annotation>
-                    <xs:documentation>Autoconf exception 2.0</xs:documentation>
+                    <xs:documentation>GPL-3.0 Linking Exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="GPL-3.0-linking-source-exception">
@@ -2538,54 +2393,54 @@
                     <xs:documentation>GPL Cooperation Commitment 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OCaml-LGPL-linking-exception">
+            <xs:enumeration value="i2p-gpl-java-exception">
                 <xs:annotation>
-                    <xs:documentation>OCaml LGPL Linking Exception</xs:documentation>
+                    <xs:documentation>i2p GPL+Java Exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Universal-FOSS-exception-1.0">
+            <xs:enumeration value="LGPL-3.0-linking-exception">
                 <xs:annotation>
-                    <xs:documentation>Universal FOSS Exception, Version 1.0</xs:documentation>
+                    <xs:documentation>LGPL-3.0 Linking Exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="i2p-gpl-java-exception">
+            <xs:enumeration value="Libtool-exception">
                 <xs:annotation>
-                    <xs:documentation>i2p GPL+Java Exception</xs:documentation>
+                    <xs:documentation>Libtool Exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CLISP-exception-2.0">
+            <xs:enumeration value="Linux-syscall-note">
                 <xs:annotation>
-                    <xs:documentation>CLISP exception 2.0</xs:documentation>
+                    <xs:documentation>Linux Syscall Note</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OCCT-exception-1.0">
+            <xs:enumeration value="LLVM-exception">
                 <xs:annotation>
-                    <xs:documentation>Open CASCADE Exception 1.0</xs:documentation>
+                    <xs:documentation>LLVM Exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Qwt-exception-1.0">
+            <xs:enumeration value="LZMA-exception">
                 <xs:annotation>
-                    <xs:documentation>Qwt exception 1.0</xs:documentation>
+                    <xs:documentation>LZMA exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="gnu-javamail-exception">
+            <xs:enumeration value="mif-exception">
                 <xs:annotation>
-                    <xs:documentation>GNU JavaMail exception</xs:documentation>
+                    <xs:documentation>Macros and Inline Functions Exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="u-boot-exception-2.0">
+            <xs:enumeration value="Nokia-Qt-exception-1.1">
                 <xs:annotation>
-                    <xs:documentation>U-Boot exception 2.0</xs:documentation>
+                    <xs:documentation>Nokia Qt LGPL exception 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="freertos-exception-2.0">
+            <xs:enumeration value="OCaml-LGPL-linking-exception">
                 <xs:annotation>
-                    <xs:documentation>FreeRTOS Exception 2.0</xs:documentation>
+                    <xs:documentation>OCaml LGPL Linking Exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Qt-GPL-exception-1.0">
+            <xs:enumeration value="OCCT-exception-1.0">
                 <xs:annotation>
-                    <xs:documentation>Qt GPL exception 1.0</xs:documentation>
+                    <xs:documentation>Open CASCADE Exception 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="OpenJDK-assembly-exception-1.0">
@@ -2593,29 +2448,29 @@
                     <xs:documentation>OpenJDK Assembly exception 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SHL-2.1">
+            <xs:enumeration value="openvpn-openssl-exception">
                 <xs:annotation>
-                    <xs:documentation>Solderpad Hardware License v2.1</xs:documentation>
+                    <xs:documentation>OpenVPN OpenSSL Exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="mif-exception">
+            <xs:enumeration value="PS-or-PDF-font-exception-20170817">
                 <xs:annotation>
-                    <xs:documentation>Macros and Inline Functions Exception</xs:documentation>
+                    <xs:documentation>PS/PDF font exception (2017-08-17)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Fawkes-Runtime-exception">
+            <xs:enumeration value="Qt-GPL-exception-1.0">
                 <xs:annotation>
-                    <xs:documentation>Fawkes Runtime Exception</xs:documentation>
+                    <xs:documentation>Qt GPL exception 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Swift-exception">
+            <xs:enumeration value="Qt-LGPL-exception-1.1">
                 <xs:annotation>
-                    <xs:documentation>Swift Exception</xs:documentation>
+                    <xs:documentation>Qt LGPL exception 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-3.0-linking-exception">
+            <xs:enumeration value="Qwt-exception-1.0">
                 <xs:annotation>
-                    <xs:documentation>GPL-3.0 Linking Exception</xs:documentation>
+                    <xs:documentation>Qwt exception 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="SHL-2.0">
@@ -2623,39 +2478,29 @@
                     <xs:documentation>Solderpad Hardware License v2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Classpath-exception-2.0">
-                <xs:annotation>
-                    <xs:documentation>Classpath exception 2.0</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="LZMA-exception">
-                <xs:annotation>
-                    <xs:documentation>LZMA exception</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="Font-exception-2.0">
+            <xs:enumeration value="SHL-2.1">
                 <xs:annotation>
-                    <xs:documentation>Font exception 2.0</xs:documentation>
+                    <xs:documentation>Solderpad Hardware License v2.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Nokia-Qt-exception-1.1">
+            <xs:enumeration value="Swift-exception">
                 <xs:annotation>
-                    <xs:documentation>Nokia Qt LGPL exception 1.1</xs:documentation>
+                    <xs:documentation>Swift Exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="DigiRule-FOSS-exception">
+            <xs:enumeration value="u-boot-exception-2.0">
                 <xs:annotation>
-                    <xs:documentation>DigiRule FOSS License Exception</xs:documentation>
+                    <xs:documentation>U-Boot exception 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="eCos-exception-2.0">
+            <xs:enumeration value="Universal-FOSS-exception-1.0">
                 <xs:annotation>
-                    <xs:documentation>eCos exception 2.0</xs:documentation>
+                    <xs:documentation>Universal FOSS Exception, Version 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="389-exception">
+            <xs:enumeration value="WxWindows-exception-3.1">
                 <xs:annotation>
-                    <xs:documentation>389 Directory Server Exception</xs:documentation>
+                    <xs:documentation>WxWindows Library Exception 3.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
         </xs:restriction>
diff --git a/tools/schema-downloader.py b/tools/schema-downloader.py
new file mode 100644
index 000000000..2ff3e668a
--- /dev/null
+++ b/tools/schema-downloader.py
@@ -0,0 +1,109 @@
+# encoding: utf-8
+import re
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+from os.path import dirname, join
+from urllib.request import urlretrieve
+import re
+
+SOURCE_ROOT = 'https://raw.githubusercontent.com/CycloneDX/specification/1.4/schema/'
+TARGET_ROOT = join(dirname(__file__), '..', 'cyclonedx', '__res', 'schema')
+
+bom_xsd = {
+    'versions': ['1.4', '1.3', '1.2', '1.1', '1.0'],
+    'sourcePattern': f'{SOURCE_ROOT}bom-%s.xsd',
+    'targetPattern': join(TARGET_ROOT, 'bom-%s.SNAPSHOT.xsd'),
+    'replace': [],
+    'replaceRE': [
+        (re.compile(r'schemaLocation="https?://cyclonedx.org/schema/spdx"'), 'schemaLocation="spdx.SNAPSHOT.xsd"')
+    ]
+}
+
+# "version" is not required but optional with a default value!
+#   this is wrong in schema<1.5
+_bomSchemaEnumMatch = re.compile(
+    r'("\$id": "(http://cyclonedx\.org/schema/bom.+?\.schema\.json)".*"enum": \[\s+")http://cyclonedx\.org/schema/bom.+?\.schema\.json"',
+    re.DOTALL)
+_bomSchemaEnumReplace = r'\1\2"'
+
+
+# "version" is not required but optional with a default value!
+# this is wrong in schema<1.5
+_bomRequired = """
+  "required": [
+    "bomFormat",
+    "specVersion",
+    "version"
+  ],"""
+_bomRequiredReplace = """
+  "required": [
+    "bomFormat",
+    "specVersion"
+  ],"""
+
+
+# there was a case where the default value did not match the own pattern ...
+# this is wrong in schema<1.5
+_defaultWithPatternMatch = re.compile(r'\s+"default": "",(?![^}]*?"pattern": "\^\(\.\*\)\$")', re.MULTILINE)
+_defaultWithPatternReplace = r''
+
+bom_json_lax = {
+    'versions': ['1.4', '1.3', '1.2'],
+    'sourcePattern': f'{SOURCE_ROOT}bom-%s.schema.json',
+    'targetPattern': join(TARGET_ROOT, 'bom-%s.SNAPSHOT.schema.json'),
+    'replace': [
+        ('spdx.schema.json', 'spdx.SNAPSHOT.schema.json'),
+        ('jsf-0.82.schema.json', 'jsf-0.82.SNAPSHOT.schema.json'),
+        (_bomRequired, _bomRequiredReplace),
+    ],
+    'replaceRE': [
+        (_bomSchemaEnumMatch, _bomSchemaEnumReplace),
+        # there was a case where the default value did not match the own pattern ...
+        # this is wrong in schema<1.5
+        # with current SchemaValidator this is no longer required, as defaults are not applied
+        # (re.compile(r'\s+"default": "",(?![^}]*?"pattern": "\^\(\.\*\)\$")', re.MULTILINE), '')
+    ]
+}
+
+bom_json_strict = {
+    'versions': ['1.3', '1.2'],
+    'sourcePattern': f'{SOURCE_ROOT}bom-%s-strict.schema.json',
+    'targetPattern': join(TARGET_ROOT, 'bom-%s-strict.SNAPSHOT.schema.json'),
+    'replace': bom_json_lax['replace'],
+    'replaceRE': bom_json_lax['replaceRE']
+}
+
+other_downloadables = [
+    (f'{SOURCE_ROOT}spdx.schema.json', join(TARGET_ROOT, 'spdx.SNAPSHOT.schema.json')),
+    (f'{SOURCE_ROOT}spdx.xsd', join(TARGET_ROOT, 'spdx.SNAPSHOT.xsd')),
+    (f'{SOURCE_ROOT}jsf-0.82.schema.json', join(TARGET_ROOT, 'jsf-0.82.SNAPSHOT.schema.json')),
+]
+
+for dspec in (bom_xsd, bom_json_lax, bom_json_strict):
+    for version in dspec['versions']:
+        source = dspec['sourcePattern'].replace('%s', version)
+        target = dspec['targetPattern'].replace('%s', version)
+        tempfile, _ = urlretrieve(source)
+        with open(tempfile, 'r') as tmpf:
+            with open(target, 'w') as tarf:
+                text = tmpf.read()
+                for search, replace in dspec['replace']:
+                    text = text.replace(search, replace)
+                for search, replace in dspec['replaceRE']:
+                    text = search.sub(replace, text)
+                tarf.write(text)
+
+for source, target in other_downloadables:
+    urlretrieve(source, target)

From 20e4b054df0d12b8af602c8fbbcd2b8c5b7e403b Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Fri, 15 Sep 2023 19:56:47 +0200
Subject: [PATCH 10/41] wip

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/schema/__init__.py     |  2 +-
 cyclonedx/spdx.py                |  4 +-
 cyclonedx/validation/__init__.py | 29 ++++++++++++
 cyclonedx/validation/json.py     | 75 ++++++++++++++++++++++++++++++++
 pyproject.toml                   |  2 +-
 tests/base.py                    | 10 ++---
 tests/test_spdx.py               |  4 +-
 tests/test_validation_json.py    | 62 ++++++++++++++++++++++++++
 8 files changed, 175 insertions(+), 13 deletions(-)
 create mode 100644 tests/test_validation_json.py

diff --git a/cyclonedx/schema/__init__.py b/cyclonedx/schema/__init__.py
index 188055e1d..871a37797 100644
--- a/cyclonedx/schema/__init__.py
+++ b/cyclonedx/schema/__init__.py
@@ -40,4 +40,4 @@ def to_version(self) -> str:
         return f'{self.value[1]}.{self.value[5]}'
 
 
-__RES_DIR = join(dirname(dirname(__file__)), '__res', 'schema')
+_RES_DIR = join(dirname(dirname(__file__)), '__res', 'schema')
diff --git a/cyclonedx/spdx.py b/cyclonedx/spdx.py
index c6b4263f5..e2b51c50c 100644
--- a/cyclonedx/spdx.py
+++ b/cyclonedx/spdx.py
@@ -25,7 +25,7 @@
 
 from license_expression import get_spdx_licensing  # type: ignore
 
-from .schema import __RES_DIR as __SCHEMA_RES_DIR
+from .schema import _RES_DIR as __SCHEMA_RES_DIR
 
 if TYPE_CHECKING:
     from license_expression import Licensing
@@ -34,7 +34,7 @@
 # python's internal module loader will assure that this init-part runs only once.
 
 # !!! this requires to ship the actual schema data with the package.
-with open(path_join(__SCHEMA_RES_DIR, 'spdx.schema.json')) as schema:
+with open(path_join(__SCHEMA_RES_DIR, 'spdx.SNAPSHOT.schema.json')) as schema:
     __IDS: Set[str] = set(json_load(schema).get('enum', []))
 assert len(__IDS) > 0, 'known SPDX-IDs should be non-empty set'
 
diff --git a/cyclonedx/validation/__init__.py b/cyclonedx/validation/__init__.py
index 5294f7ba6..2f8de348d 100644
--- a/cyclonedx/validation/__init__.py
+++ b/cyclonedx/validation/__init__.py
@@ -13,3 +13,32 @@
 # limitations under the License.
 #
 # SPDX-License-Identifier: Apache-2.0
+
+from abc import ABC, abstractmethod
+from typing import Optional, Any, TYPE_CHECKING
+from os.path import isfile
+
+if TYPE_CHECKING:
+    from ..schema import SchemaVersion
+
+
+class ValidationError:
+    def __init__(self, data: Any) -> None:
+        self.data = data
+
+
+class _BaseValidator(ABC):
+
+    @property
+    @abstractmethod
+    def _schema_file(self) -> str:
+        ...
+
+    def __init__(self, schema_version: 'SchemaVersion') -> None:
+        self.schema_version = schema_version
+        if not isfile(self._schema_file):
+            raise NotImplementedError(f'not implemented for schema {schema_version}')
+
+    @abstractmethod
+    def validate(self, data: str) -> Optional[ValidationError]:
+        ...
diff --git a/cyclonedx/validation/json.py b/cyclonedx/validation/json.py
index 5294f7ba6..8b34d249b 100644
--- a/cyclonedx/validation/json.py
+++ b/cyclonedx/validation/json.py
@@ -13,3 +13,78 @@
 # limitations under the License.
 #
 # SPDX-License-Identifier: Apache-2.0
+
+__all__ = ['JsonValidator', 'JsonStrictValidator']
+
+from . import _BaseValidator, ValidationError
+from typing import Optional, TYPE_CHECKING
+from ..schema import _RES_DIR as _SCHEMA_RES_DIR
+from os.path import join
+from json import loads as json_loads
+from abc import ABC
+
+functionality_not_implemented_error: Optional[NotImplementedError] = None
+try:
+    from jsonschema.validators import validator_for
+    from jsonschema.exceptions import ValidationError as JsonValidationError
+    from referencing import Registry, Resource
+    from referencing.exceptions import NoSuchResource
+
+    if TYPE_CHECKING:
+        from jsonschema.protocols import Validator as JsonSchemaValidator
+except ImportError as err:
+    functionality_not_implemented_error = NotImplementedError(
+        'this functionality requires optional dependencies.\n'
+        'please install the extra "json-validation"\n'
+        f'---\nprevious: {err}'
+    )
+
+
+class _BaseJsonValidator(_BaseValidator, ABC):
+    __validator: Optional['JsonSchemaValidator']
+
+    @staticmethod
+    def __fetch_schema_file(uri: str) -> 'Resource':
+        if not uri.startswith("http://cyclonedx.org/schema/"):
+            raise NoSuchResource(ref=uri)
+
+        file = join(_SCHEMA_RES_DIR, uri.removeprefix("http://cyclonedx.org/schema/"))
+        with open(file, 'r') as fh:
+            return Resource.from_contents(json_loads(fh.read()))
+
+    @property
+    def _validator(self) -> 'JsonSchemaValidator':
+        if not self.__validator:
+            if functionality_not_implemented_error:
+                raise functionality_not_implemented_error
+
+            schema_registry = Registry(retrieve=self.__fetch_schema_file)
+            with open(self._schema_file, 'r') as sf:
+                schema = json_loads(sf.read())
+            self.__validator = validator_for(schema)(schema, registry=schema_registry)
+        return self.__validator
+
+    def validate(self, data: str) -> Optional[ValidationError]:
+        if functionality_not_implemented_error:
+            raise functionality_not_implemented_error
+
+        structure = json_loads(data)
+        validator = self._validator  # may throw on error that MUST NOT be caught
+        try:
+            validator.validate(structure)
+        except JsonValidationError as error:
+            return ValidationError(error)
+
+
+class JsonValidator(_BaseJsonValidator):
+
+    @property
+    def _schema_file(self) -> str:
+        return join(_SCHEMA_RES_DIR, f'bom-{self.schema_version.to_version()}.SNAPSHOT.schema.json')
+
+
+class JsonStrictValidator(_BaseJsonValidator):
+
+    @property
+    def _schema_file(self) -> str:
+        return join(_SCHEMA_RES_DIR, f'bom-{self.schema_version.to_version()}-strict.SNAPSHOT.schema.json')
diff --git a/pyproject.toml b/pyproject.toml
index 5827fa297..129b5ec34 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -63,7 +63,7 @@ packageurl-python = ">= 0.11"
 py-serializable = "^0.11.1"
 sortedcontainers = "^2.4.0"
 license-expression = "^30"
-jsonschema = { version = "^4", optional = true}
+jsonschema = { version = "^4", extras=['format'], optional = true}
 lxml = { version = "^4", optional = true }
 
 [tool.poetry.extras]
diff --git a/tests/base.py b/tests/base.py
index 9faf54c9c..e2b84363f 100644
--- a/tests/base.py
+++ b/tests/base.py
@@ -34,11 +34,10 @@
 
 from cyclonedx.output import SchemaVersion
 
-if sys.version_info >= (3, 7):
-    from jsonschema import ValidationError, validate as json_validate
+from jsonschema import ValidationError, validate as json_validate
 
 
-from cyclonedx.schema import __RES_DIR as CDX_SCHEMA_DIRECTORY
+from cyclonedx.schema import _RES_DIR as CDX_SCHEMA_DIRECTORY
 
 single_uuid: str = 'urn:uuid:{}'.format(uuid4())
 
@@ -46,10 +45,7 @@
 class BaseJsonTestCase(TestCase):
 
     def assertValidAgainstSchema(self, bom_json: str, schema_version: SchemaVersion) -> None:
-        schema_fn = os.path.join(
-            CDX_SCHEMA_DIRECTORY,
-            f'bom-{schema_version.name.replace("_", ".").replace("V", "")}.schema.json'
-        )
+        schema_fn = os.path.join(CDX_SCHEMA_DIRECTORY, f'bom-{schema_version.to_version()}.SNAPSHOT.schema.json')
         with open(schema_fn) as schema_fd:
             schema_doc = json.load(schema_fd)
 
diff --git a/tests/test_spdx.py b/tests/test_spdx.py
index 4c6f22d8c..173de7449 100644
--- a/tests/test_spdx.py
+++ b/tests/test_spdx.py
@@ -25,10 +25,10 @@
 from ddt import data, ddt, idata, unpack
 
 from cyclonedx import spdx
-from cyclonedx.schema import __RES_DIR as CDX_SCHEMA_DIRECTORY
+from cyclonedx.schema import _RES_DIR as CDX_SCHEMA_DIRECTORY
 
 # rework access
-with open(path_join(CDX_SCHEMA_DIRECTORY, 'spdx.schema.json')) as spdx_schema:
+with open(path_join(CDX_SCHEMA_DIRECTORY, 'spdx.SNAPSHOT.schema.json')) as spdx_schema:
     KNOWN_SPDX_IDS = json_load(spdx_schema)['enum']
 
 VALID_COMPOUND_EXPRESSIONS = {
diff --git a/tests/test_validation_json.py b/tests/test_validation_json.py
new file mode 100644
index 000000000..01c88d7b2
--- /dev/null
+++ b/tests/test_validation_json.py
@@ -0,0 +1,62 @@
+# encoding: utf-8
+
+# This file is part of CycloneDX Python Lib
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+# Copyright (c) OWASP Foundation. All Rights Reserved.
+
+from unittest import TestCase
+from ddt import ddt, idata, data, unpack
+from glob import iglob
+from os.path import join
+
+from . import TESTDATA_DIRECTORY
+
+from cyclonedx.schema import SchemaVersion
+from cyclonedx.validation.json import JsonValidator
+
+RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'schemaTestData')
+
+UNSUPPORTED_SCHEMA_VERSIONS = (SchemaVersion.V1_0, SchemaVersion.V1_1,)
+
+
+@ddt
+class TestJsonValidator(TestCase):
+
+    @data(*UNSUPPORTED_SCHEMA_VERSIONS)
+    def test_throws_with_unsupported_schema_version(self, schema_version: SchemaVersion) -> None:
+        with self.assertRaisesRegex(NotImplementedError, 'not implemented for schema'):
+            JsonValidator(schema_version)
+
+    @idata((sv, tf) for sv in SchemaVersion if sv not in UNSUPPORTED_SCHEMA_VERSIONS for tf in
+           iglob('valid-*.json', root_dir=join(RELEVANT_TESTDATA_DIRECTORY, sv.to_version())))
+    @unpack
+    def test_validate_returns_none(self, schema_version: SchemaVersion, test_data_file: str) -> None:
+        validator = JsonValidator(schema_version)
+        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), test_data_file), 'r') as tdfh:
+            test_data = tdfh.read()
+        error = validator.validate(test_data)
+        self.assertIsNone(error)
+
+    @idata((sv, tf) for sv in SchemaVersion if sv not in UNSUPPORTED_SCHEMA_VERSIONS for tf in
+           iglob('invalid-*.json', root_dir=join(RELEVANT_TESTDATA_DIRECTORY, sv.to_version())))
+    @unpack
+    def test_validate_returns_error(self, schema_version: SchemaVersion, test_data_file: str) -> None:
+        validator = JsonValidator(schema_version)
+        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), test_data_file), 'r') as tdfh:
+            test_data = tdfh.read()
+        error = validator.validate(test_data)
+        self.assertIsNotNone(error)
+        self.assertIsNotNone(error.data)

From 299c33e1625c8358fce3019e2d6ce6bfab927c84 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sat, 16 Sep 2023 10:12:55 +0200
Subject: [PATCH 11/41] wip

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/validation/__init__.py |  2 +-
 cyclonedx/validation/json.py     | 82 ++++++++++++++++++--------------
 pyproject.toml                   |  4 +-
 tests/test_validation_json.py    |  8 ++--
 4 files changed, 54 insertions(+), 42 deletions(-)

diff --git a/cyclonedx/validation/__init__.py b/cyclonedx/validation/__init__.py
index 2f8de348d..5854e1c0b 100644
--- a/cyclonedx/validation/__init__.py
+++ b/cyclonedx/validation/__init__.py
@@ -40,5 +40,5 @@ def __init__(self, schema_version: 'SchemaVersion') -> None:
             raise NotImplementedError(f'not implemented for schema {schema_version}')
 
     @abstractmethod
-    def validate(self, data: str) -> Optional[ValidationError]:
+    def validate_str(self, data: str) -> Optional[ValidationError]:
         ...
diff --git a/cyclonedx/validation/json.py b/cyclonedx/validation/json.py
index 8b34d249b..c10588c79 100644
--- a/cyclonedx/validation/json.py
+++ b/cyclonedx/validation/json.py
@@ -17,7 +17,7 @@
 __all__ = ['JsonValidator', 'JsonStrictValidator']
 
 from . import _BaseValidator, ValidationError
-from typing import Optional, TYPE_CHECKING
+from typing import Optional, TYPE_CHECKING, Any, Never
 from ..schema import _RES_DIR as _SCHEMA_RES_DIR
 from os.path import join
 from json import loads as json_loads
@@ -25,9 +25,11 @@
 
 functionality_not_implemented_error: Optional[NotImplementedError] = None
 try:
-    from jsonschema.validators import validator_for
+    from jsonschema.validators import Draft7Validator
+    from jsonschema.protocols import Validator
     from jsonschema.exceptions import ValidationError as JsonValidationError
     from referencing import Registry, Resource
+    from referencing.jsonschema import DRAFT7
     from referencing.exceptions import NoSuchResource
 
     if TYPE_CHECKING:
@@ -36,44 +38,54 @@
     functionality_not_implemented_error = NotImplementedError(
         'this functionality requires optional dependencies.\n'
         'please install the extra "json-validation"\n'
-        f'---\nprevious: {err}'
+        f'----\nprevious: {err}'
     )
 
+if functionality_not_implemented_error:
+    class _BaseJsonValidator(_BaseValidator, ABC):
+        def validate_str(self, data: str) -> Optional[ValidationError]:
+            raise functionality_not_implemented_error
 
-class _BaseJsonValidator(_BaseValidator, ABC):
-    __validator: Optional['JsonSchemaValidator']
-
-    @staticmethod
-    def __fetch_schema_file(uri: str) -> 'Resource':
-        if not uri.startswith("http://cyclonedx.org/schema/"):
-            raise NoSuchResource(ref=uri)
-
-        file = join(_SCHEMA_RES_DIR, uri.removeprefix("http://cyclonedx.org/schema/"))
-        with open(file, 'r') as fh:
-            return Resource.from_contents(json_loads(fh.read()))
-
-    @property
-    def _validator(self) -> 'JsonSchemaValidator':
-        if not self.__validator:
-            if functionality_not_implemented_error:
-                raise functionality_not_implemented_error
-
-            schema_registry = Registry(retrieve=self.__fetch_schema_file)
-            with open(self._schema_file, 'r') as sf:
-                schema = json_loads(sf.read())
-            self.__validator = validator_for(schema)(schema, registry=schema_registry)
-        return self.__validator
-
-    def validate(self, data: str) -> Optional[ValidationError]:
-        if functionality_not_implemented_error:
+        def validata_data(self, data: Any) -> Optional[ValidationError]:
             raise functionality_not_implemented_error
 
-        structure = json_loads(data)
-        validator = self._validator  # may throw on error that MUST NOT be caught
-        try:
-            validator.validate(structure)
-        except JsonValidationError as error:
-            return ValidationError(error)
+else:
+    class _BaseJsonValidator(_BaseValidator, ABC):
+        __validator: Optional['JsonSchemaValidator'] = None
+
+        @staticmethod
+        def __make_validator_registry() -> 'Registry':
+            def _prevent_retrieve(uri: str) -> Never:
+                raise NoSuchResource(ref=uri)
+
+            schema_prefix = 'http://cyclonedx.org/schema/'
+            spdx = open(join(_SCHEMA_RES_DIR, 'spdx.SNAPSHOT.schema.json'))
+            jsf = open(join(_SCHEMA_RES_DIR, 'jsf-0.82.SNAPSHOT.schema.json'))
+            with spdx, jsf:
+                return Registry(
+                    retrieve=_prevent_retrieve
+                ).with_resources([
+                    (f'{schema_prefix}spdx.SNAPSHOT.schema.json', DRAFT7.create_resource(json_loads(spdx.read()))),
+                    (f'{schema_prefix}jsf-0.82.SNAPSHOT.schema.json', DRAFT7.create_resource(json_loads(jsf.read()))),
+                ])
+
+        @property
+        def _validator(self) -> 'JsonSchemaValidator':
+            if not self.__validator:
+                with open(self._schema_file) as sf:
+                    schema = json_loads(sf.read())
+                self.__validator = Draft7Validator(schema, registry=self.__make_validator_registry())
+            return self.__validator
+
+        def validate_str(self, data: str) -> Optional[ValidationError]:
+            return self.validata_data(json_loads(data))
+
+        def validata_data(self, data: Any) -> Optional[ValidationError]:
+            validator = self._validator  # may throw on error that MUST NOT be caught
+            try:
+                validator.validate(data)
+            except JsonValidationError as error:
+                return ValidationError(error)
 
 
 class JsonValidator(_BaseJsonValidator):
diff --git a/pyproject.toml b/pyproject.toml
index 129b5ec34..d0bc7f55b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -63,8 +63,8 @@ packageurl-python = ">= 0.11"
 py-serializable = "^0.11.1"
 sortedcontainers = "^2.4.0"
 license-expression = "^30"
-jsonschema = { version = "^4", extras=['format'], optional = true}
-lxml = { version = "^4", optional = true }
+jsonschema = { version = "^4.18", extras=['format'], optional=true, python="^3.8" }
+lxml = { version="^4", optional=true }
 
 [tool.poetry.extras]
 validation = ["jsonschema", "lxml"]
diff --git a/tests/test_validation_json.py b/tests/test_validation_json.py
index 01c88d7b2..c21a065ff 100644
--- a/tests/test_validation_json.py
+++ b/tests/test_validation_json.py
@@ -43,20 +43,20 @@ def test_throws_with_unsupported_schema_version(self, schema_version: SchemaVers
     @idata((sv, tf) for sv in SchemaVersion if sv not in UNSUPPORTED_SCHEMA_VERSIONS for tf in
            iglob('valid-*.json', root_dir=join(RELEVANT_TESTDATA_DIRECTORY, sv.to_version())))
     @unpack
-    def test_validate_returns_none(self, schema_version: SchemaVersion, test_data_file: str) -> None:
+    def test_validate_no_none(self, schema_version: SchemaVersion, test_data_file: str) -> None:
         validator = JsonValidator(schema_version)
         with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), test_data_file), 'r') as tdfh:
             test_data = tdfh.read()
-        error = validator.validate(test_data)
+        error = validator.validate_str(test_data)
         self.assertIsNone(error)
 
     @idata((sv, tf) for sv in SchemaVersion if sv not in UNSUPPORTED_SCHEMA_VERSIONS for tf in
            iglob('invalid-*.json', root_dir=join(RELEVANT_TESTDATA_DIRECTORY, sv.to_version())))
     @unpack
-    def test_validate_returns_error(self, schema_version: SchemaVersion, test_data_file: str) -> None:
+    def test_validate_expected_error(self, schema_version: SchemaVersion, test_data_file: str) -> None:
         validator = JsonValidator(schema_version)
         with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), test_data_file), 'r') as tdfh:
             test_data = tdfh.read()
-        error = validator.validate(test_data)
+        error = validator.validate_str(test_data)
         self.assertIsNotNone(error)
         self.assertIsNotNone(error.data)

From 70c17a3a43937ba2d78955a7938a89c3b1c4d3af Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sat, 16 Sep 2023 11:58:42 +0200
Subject: [PATCH 12/41] wip

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/validation/json.py | 24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)

diff --git a/cyclonedx/validation/json.py b/cyclonedx/validation/json.py
index c10588c79..eda22e0e9 100644
--- a/cyclonedx/validation/json.py
+++ b/cyclonedx/validation/json.py
@@ -17,14 +17,15 @@
 __all__ = ['JsonValidator', 'JsonStrictValidator']
 
 from . import _BaseValidator, ValidationError
-from typing import Optional, TYPE_CHECKING, Any, Never
+from typing import Optional, TYPE_CHECKING, Any, Never, Tuple
 from ..schema import _RES_DIR as _SCHEMA_RES_DIR
 from os.path import join
 from json import loads as json_loads
 from abc import ABC
 
-functionality_not_implemented_error: Optional[NotImplementedError] = None
+functionality_not_implemented_error: Optional[Tuple[NotImplementedError, Any]] = None
 try:
+    from jsonschema import FormatChecker
     from jsonschema.validators import Draft7Validator
     from jsonschema.protocols import Validator
     from jsonschema.exceptions import ValidationError as JsonValidationError
@@ -36,25 +37,24 @@
         from jsonschema.protocols import Validator as JsonSchemaValidator
 except ImportError as err:
     functionality_not_implemented_error = NotImplementedError(
-        'this functionality requires optional dependencies.\n'
-        'please install the extra "json-validation"\n'
-        f'----\nprevious: {err}'
-    )
+        'This functionality requires optional dependencies.\n'
+        'Please install `cyclonedx-python-lib` with the extra "json-validation".\n'
+    ), err
 
 if functionality_not_implemented_error:
     class _BaseJsonValidator(_BaseValidator, ABC):
         def validate_str(self, data: str) -> Optional[ValidationError]:
-            raise functionality_not_implemented_error
+            raise functionality_not_implemented_error[0]  # from functionality_not_implemented_error[1]
 
         def validata_data(self, data: Any) -> Optional[ValidationError]:
-            raise functionality_not_implemented_error
+            raise functionality_not_implemented_error[0]  # from functionality_not_implemented_error[1]
 
 else:
     class _BaseJsonValidator(_BaseValidator, ABC):
         __validator: Optional['JsonSchemaValidator'] = None
 
         @staticmethod
-        def __make_validator_registry() -> 'Registry':
+        def __make_validator_registry() -> Registry:
             def _prevent_retrieve(uri: str) -> Never:
                 raise NoSuchResource(ref=uri)
 
@@ -63,7 +63,7 @@ def _prevent_retrieve(uri: str) -> Never:
             jsf = open(join(_SCHEMA_RES_DIR, 'jsf-0.82.SNAPSHOT.schema.json'))
             with spdx, jsf:
                 return Registry(
-                    retrieve=_prevent_retrieve
+                    retrieve=_prevent_retrieve  # prevent unexpected outbound access
                 ).with_resources([
                     (f'{schema_prefix}spdx.SNAPSHOT.schema.json', DRAFT7.create_resource(json_loads(spdx.read()))),
                     (f'{schema_prefix}jsf-0.82.SNAPSHOT.schema.json', DRAFT7.create_resource(json_loads(jsf.read()))),
@@ -74,7 +74,9 @@ def _validator(self) -> 'JsonSchemaValidator':
             if not self.__validator:
                 with open(self._schema_file) as sf:
                     schema = json_loads(sf.read())
-                self.__validator = Draft7Validator(schema, registry=self.__make_validator_registry())
+                self.__validator = Draft7Validator(schema,
+                                                   registry=self.__make_validator_registry(),
+                                                   format_checker=Draft7Validator.FORMAT_CHECKER)
             return self.__validator
 
         def validate_str(self, data: str) -> Optional[ValidationError]:

From 4fb97b0f75893efa3ad73a243017e61d81a5cd84 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sat, 16 Sep 2023 12:00:21 +0200
Subject: [PATCH 13/41] wip

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/validation/__init__.py |  2 +-
 cyclonedx/validation/json.py     | 17 +++++++++--------
 tests/base.py                    |  5 +----
 tests/test_validation_json.py    |  7 ++++---
 4 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/cyclonedx/validation/__init__.py b/cyclonedx/validation/__init__.py
index 5854e1c0b..ee09b93c0 100644
--- a/cyclonedx/validation/__init__.py
+++ b/cyclonedx/validation/__init__.py
@@ -15,8 +15,8 @@
 # SPDX-License-Identifier: Apache-2.0
 
 from abc import ABC, abstractmethod
-from typing import Optional, Any, TYPE_CHECKING
 from os.path import isfile
+from typing import TYPE_CHECKING, Any, Optional
 
 if TYPE_CHECKING:
     from ..schema import SchemaVersion
diff --git a/cyclonedx/validation/json.py b/cyclonedx/validation/json.py
index eda22e0e9..0acab749e 100644
--- a/cyclonedx/validation/json.py
+++ b/cyclonedx/validation/json.py
@@ -16,22 +16,23 @@
 
 __all__ = ['JsonValidator', 'JsonStrictValidator']
 
-from . import _BaseValidator, ValidationError
-from typing import Optional, TYPE_CHECKING, Any, Never, Tuple
-from ..schema import _RES_DIR as _SCHEMA_RES_DIR
-from os.path import join
-from json import loads as json_loads
 from abc import ABC
+from json import loads as json_loads
+from os.path import join
+from typing import TYPE_CHECKING, Any, Never, Optional, Tuple
+
+from ..schema import _RES_DIR as _SCHEMA_RES_DIR
+from . import ValidationError, _BaseValidator
 
 functionality_not_implemented_error: Optional[Tuple[NotImplementedError, Any]] = None
 try:
     from jsonschema import FormatChecker
-    from jsonschema.validators import Draft7Validator
-    from jsonschema.protocols import Validator
     from jsonschema.exceptions import ValidationError as JsonValidationError
+    from jsonschema.protocols import Validator
+    from jsonschema.validators import Draft7Validator
     from referencing import Registry, Resource
-    from referencing.jsonschema import DRAFT7
     from referencing.exceptions import NoSuchResource
+    from referencing.jsonschema import DRAFT7
 
     if TYPE_CHECKING:
         from jsonschema.protocols import Validator as JsonSchemaValidator
diff --git a/tests/base.py b/tests/base.py
index e2b84363f..760f376a8 100644
--- a/tests/base.py
+++ b/tests/base.py
@@ -27,16 +27,13 @@
 from unittest import TestCase
 from uuid import uuid4
 
+from jsonschema import ValidationError, validate as json_validate
 from lxml import etree
 from lxml.etree import DocumentInvalid
 from xmldiff import main
 from xmldiff.actions import MoveNode
 
 from cyclonedx.output import SchemaVersion
-
-from jsonschema import ValidationError, validate as json_validate
-
-
 from cyclonedx.schema import _RES_DIR as CDX_SCHEMA_DIRECTORY
 
 single_uuid: str = 'urn:uuid:{}'.format(uuid4())
diff --git a/tests/test_validation_json.py b/tests/test_validation_json.py
index c21a065ff..446aa5314 100644
--- a/tests/test_validation_json.py
+++ b/tests/test_validation_json.py
@@ -17,16 +17,17 @@
 # SPDX-License-Identifier: Apache-2.0
 # Copyright (c) OWASP Foundation. All Rights Reserved.
 
-from unittest import TestCase
-from ddt import ddt, idata, data, unpack
 from glob import iglob
 from os.path import join
+from unittest import TestCase
 
-from . import TESTDATA_DIRECTORY
+from ddt import data, ddt, idata, unpack
 
 from cyclonedx.schema import SchemaVersion
 from cyclonedx.validation.json import JsonValidator
 
+from . import TESTDATA_DIRECTORY
+
 RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'schemaTestData')
 
 UNSUPPORTED_SCHEMA_VERSIONS = (SchemaVersion.V1_0, SchemaVersion.V1_1,)

From 0c3de0401e4d616b22636c89367be1a16d0bdbf4 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sat, 16 Sep 2023 12:29:19 +0200
Subject: [PATCH 14/41] wip

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/validation/__init__.py | 10 ++++++++++
 cyclonedx/validation/json.py     | 20 ++++++++++----------
 tests/base.py                    | 18 +++++++-----------
 3 files changed, 27 insertions(+), 21 deletions(-)

diff --git a/cyclonedx/validation/__init__.py b/cyclonedx/validation/__init__.py
index ee09b93c0..ad8fea975 100644
--- a/cyclonedx/validation/__init__.py
+++ b/cyclonedx/validation/__init__.py
@@ -22,10 +22,20 @@
     from ..schema import SchemaVersion
 
 
+class MissingOptionalDependencyException(BaseException):
+    pass
+
+
 class ValidationError:
     def __init__(self, data: Any) -> None:
         self.data = data
 
+    def __repr__(self) -> str:
+        return repr(self.data)
+
+    def __str__(self) -> str:
+        return str(self.data)
+
 
 class _BaseValidator(ABC):
 
diff --git a/cyclonedx/validation/json.py b/cyclonedx/validation/json.py
index 0acab749e..1c4b5b531 100644
--- a/cyclonedx/validation/json.py
+++ b/cyclonedx/validation/json.py
@@ -22,9 +22,9 @@
 from typing import TYPE_CHECKING, Any, Never, Optional, Tuple
 
 from ..schema import _RES_DIR as _SCHEMA_RES_DIR
-from . import ValidationError, _BaseValidator
+from . import MissingOptionalDependencyException, ValidationError, _BaseValidator
 
-functionality_not_implemented_error: Optional[Tuple[NotImplementedError, Any]] = None
+_missing_deps_error: Optional[Tuple[MissingOptionalDependencyException, ImportError]] = None
 try:
     from jsonschema import FormatChecker
     from jsonschema.exceptions import ValidationError as JsonValidationError
@@ -37,21 +37,21 @@
     if TYPE_CHECKING:
         from jsonschema.protocols import Validator as JsonSchemaValidator
 except ImportError as err:
-    functionality_not_implemented_error = NotImplementedError(
+    _missing_deps_error = MissingOptionalDependencyException(
         'This functionality requires optional dependencies.\n'
         'Please install `cyclonedx-python-lib` with the extra "json-validation".\n'
     ), err
 
-if functionality_not_implemented_error:
-    class _BaseJsonValidator(_BaseValidator, ABC):
+if _missing_deps_error:
+    class __BaseJsonValidator(_BaseValidator, ABC):
         def validate_str(self, data: str) -> Optional[ValidationError]:
-            raise functionality_not_implemented_error[0]  # from functionality_not_implemented_error[1]
+            raise _missing_deps_error[0]  # from functionality_not_implemented_error[1]
 
         def validata_data(self, data: Any) -> Optional[ValidationError]:
-            raise functionality_not_implemented_error[0]  # from functionality_not_implemented_error[1]
+            raise _missing_deps_error[0]  # from functionality_not_implemented_error[1]
 
 else:
-    class _BaseJsonValidator(_BaseValidator, ABC):
+    class __BaseJsonValidator(_BaseValidator, ABC):
         __validator: Optional['JsonSchemaValidator'] = None
 
         @staticmethod
@@ -91,14 +91,14 @@ def validata_data(self, data: Any) -> Optional[ValidationError]:
                 return ValidationError(error)
 
 
-class JsonValidator(_BaseJsonValidator):
+class JsonValidator(__BaseJsonValidator):
 
     @property
     def _schema_file(self) -> str:
         return join(_SCHEMA_RES_DIR, f'bom-{self.schema_version.to_version()}.SNAPSHOT.schema.json')
 
 
-class JsonStrictValidator(_BaseJsonValidator):
+class JsonStrictValidator(__BaseJsonValidator):
 
     @property
     def _schema_file(self) -> str:
diff --git a/tests/base.py b/tests/base.py
index 760f376a8..91b5c4f0f 100644
--- a/tests/base.py
+++ b/tests/base.py
@@ -20,14 +20,12 @@
 import io
 import json
 import os
-import sys
 import xml.etree.ElementTree
 from datetime import datetime, timezone
 from typing import Any
 from unittest import TestCase
 from uuid import uuid4
 
-from jsonschema import ValidationError, validate as json_validate
 from lxml import etree
 from lxml.etree import DocumentInvalid
 from xmldiff import main
@@ -35,6 +33,8 @@
 
 from cyclonedx.output import SchemaVersion
 from cyclonedx.schema import _RES_DIR as CDX_SCHEMA_DIRECTORY
+from cyclonedx.validation import MissingOptionalDependencyException
+from cyclonedx.validation.json import JsonValidator
 
 single_uuid: str = 'urn:uuid:{}'.format(uuid4())
 
@@ -42,16 +42,12 @@
 class BaseJsonTestCase(TestCase):
 
     def assertValidAgainstSchema(self, bom_json: str, schema_version: SchemaVersion) -> None:
-        schema_fn = os.path.join(CDX_SCHEMA_DIRECTORY, f'bom-{schema_version.to_version()}.SNAPSHOT.schema.json')
-        with open(schema_fn) as schema_fd:
-            schema_doc = json.load(schema_fd)
-
         try:
-            json_validate(instance=json.loads(bom_json), schema=schema_doc)
-        except ValidationError as e:
-            self.assertTrue(False, f'Failed to validate SBOM against JSON schema: {str(e)}')
-
-        self.assertTrue(True)
+            validation_error = JsonValidator(schema_version).validate_str(bom_json)
+        except MissingOptionalDependencyException:
+            return  # some deps are missing - skip the validation
+        self.assertIsNone(validation_error,
+                          f'Failed to validate SBOM against JSON schema: {str(validation_error)}')
 
     @staticmethod
     def _sort_json_dict(item: object) -> Any:

From 53dc87d7eb4b7148326f8b2c74a5ab839a45d807 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sat, 16 Sep 2023 15:41:09 +0200
Subject: [PATCH 15/41] move res

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/__res/README.md                     |  1 -
 cyclonedx/schema/__init__.py                  |  4 --
 .../schema => schema/_res}/.editorconfig      |  0
 .../schema => schema/_res}/.gitattributes     |  0
 .../{__res/schema => schema/_res}/README.md   |  2 +-
 cyclonedx/schema/_res/__init__.py             | 60 +++++++++++++++++++
 .../_res}/bom-1.0.SNAPSHOT.xsd                |  0
 .../_res}/bom-1.1.SNAPSHOT.xsd                |  0
 .../_res}/bom-1.2-strict.SNAPSHOT.schema.json |  0
 .../_res}/bom-1.2.SNAPSHOT.schema.json        |  0
 .../_res}/bom-1.2.SNAPSHOT.xsd                |  0
 .../_res}/bom-1.3-strict.SNAPSHOT.schema.json |  0
 .../_res}/bom-1.3.SNAPSHOT.schema.json        |  0
 .../_res}/bom-1.3.SNAPSHOT.xsd                |  0
 .../_res}/bom-1.4.SNAPSHOT.schema.json        |  0
 .../_res}/bom-1.4.SNAPSHOT.xsd                |  0
 .../_res}/jsf-0.82.SNAPSHOT.schema.json       |  0
 .../_res}/spdx.SNAPSHOT.schema.json           |  0
 .../schema => schema/_res}/spdx.SNAPSHOT.xsd  |  0
 cyclonedx/spdx.py                             |  5 +-
 cyclonedx/validation/__init__.py              | 15 +++--
 cyclonedx/validation/json.py                  | 56 ++++++++---------
 tests/test_schema__res.py                     | 44 ++++++++++++++
 tests/test_spdx.py                            |  5 +-
 tests/test_validation_json.py                 | 44 ++++++++++++--
 tools/schema-downloader.py                    |  2 +-
 26 files changed, 183 insertions(+), 55 deletions(-)
 delete mode 100644 cyclonedx/__res/README.md
 rename cyclonedx/{__res/schema => schema/_res}/.editorconfig (100%)
 rename cyclonedx/{__res/schema => schema/_res}/.gitattributes (100%)
 rename cyclonedx/{__res/schema => schema/_res}/README.md (94%)
 create mode 100644 cyclonedx/schema/_res/__init__.py
 rename cyclonedx/{__res/schema => schema/_res}/bom-1.0.SNAPSHOT.xsd (100%)
 rename cyclonedx/{__res/schema => schema/_res}/bom-1.1.SNAPSHOT.xsd (100%)
 rename cyclonedx/{__res/schema => schema/_res}/bom-1.2-strict.SNAPSHOT.schema.json (100%)
 rename cyclonedx/{__res/schema => schema/_res}/bom-1.2.SNAPSHOT.schema.json (100%)
 rename cyclonedx/{__res/schema => schema/_res}/bom-1.2.SNAPSHOT.xsd (100%)
 rename cyclonedx/{__res/schema => schema/_res}/bom-1.3-strict.SNAPSHOT.schema.json (100%)
 rename cyclonedx/{__res/schema => schema/_res}/bom-1.3.SNAPSHOT.schema.json (100%)
 rename cyclonedx/{__res/schema => schema/_res}/bom-1.3.SNAPSHOT.xsd (100%)
 rename cyclonedx/{__res/schema => schema/_res}/bom-1.4.SNAPSHOT.schema.json (100%)
 rename cyclonedx/{__res/schema => schema/_res}/bom-1.4.SNAPSHOT.xsd (100%)
 rename cyclonedx/{__res/schema => schema/_res}/jsf-0.82.SNAPSHOT.schema.json (100%)
 rename cyclonedx/{__res/schema => schema/_res}/spdx.SNAPSHOT.schema.json (100%)
 rename cyclonedx/{__res/schema => schema/_res}/spdx.SNAPSHOT.xsd (100%)
 create mode 100644 tests/test_schema__res.py

diff --git a/cyclonedx/__res/README.md b/cyclonedx/__res/README.md
deleted file mode 100644
index 4c5604cce..000000000
--- a/cyclonedx/__res/README.md
+++ /dev/null
@@ -1 +0,0 @@
-data in here are private, shipped resources
diff --git a/cyclonedx/schema/__init__.py b/cyclonedx/schema/__init__.py
index 871a37797..9741a8e8f 100644
--- a/cyclonedx/schema/__init__.py
+++ b/cyclonedx/schema/__init__.py
@@ -15,7 +15,6 @@
 # SPDX-License-Identifier: Apache-2.0
 
 from enum import Enum
-from os.path import dirname, join
 
 
 class OutputFormat(str, Enum):
@@ -38,6 +37,3 @@ def to_version(self) -> str:
             `str` version
         """
         return f'{self.value[1]}.{self.value[5]}'
-
-
-_RES_DIR = join(dirname(dirname(__file__)), '__res', 'schema')
diff --git a/cyclonedx/__res/schema/.editorconfig b/cyclonedx/schema/_res/.editorconfig
similarity index 100%
rename from cyclonedx/__res/schema/.editorconfig
rename to cyclonedx/schema/_res/.editorconfig
diff --git a/cyclonedx/__res/schema/.gitattributes b/cyclonedx/schema/_res/.gitattributes
similarity index 100%
rename from cyclonedx/__res/schema/.gitattributes
rename to cyclonedx/schema/_res/.gitattributes
diff --git a/cyclonedx/__res/schema/README.md b/cyclonedx/schema/_res/README.md
similarity index 94%
rename from cyclonedx/__res/schema/README.md
rename to cyclonedx/schema/_res/README.md
index eb2eb377b..9eea5b696 100644
--- a/cyclonedx/__res/schema/README.md
+++ b/cyclonedx/schema/_res/README.md
@@ -1,6 +1,6 @@
 # Resources: Schema files
 
-some schema for offline use as download via [script](../../tools/schema-downloader.py).
+some schema for offline use as download via [script](../../../tools/schema-downloader.py).
 original sources: <https://github.com/CycloneDX/specification/blob/1.4>
 
 Currently using version
diff --git a/cyclonedx/schema/_res/__init__.py b/cyclonedx/schema/_res/__init__.py
new file mode 100644
index 000000000..13b30823e
--- /dev/null
+++ b/cyclonedx/schema/_res/__init__.py
@@ -0,0 +1,60 @@
+# encoding: utf-8
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+from os.path import dirname, join
+from typing import Dict, Optional
+
+from .. import SchemaVersion
+
+"""
+Content in here is internal, not for public use.
+Breaking changes without notice may happen.
+"""
+
+__DIR = dirname(__file__)
+
+BOM_XML: Dict[SchemaVersion, Optional[str]] = {
+    SchemaVersion.V1_4: join(__DIR, 'bom-1.4.SNAPSHOT.xsd'),
+    SchemaVersion.V1_3: join(__DIR, 'bom-1.3.SNAPSHOT.xsd'),
+    SchemaVersion.V1_2: join(__DIR, 'bom-1.2.SNAPSHOT.xsd'),
+    SchemaVersion.V1_1: join(__DIR, 'bom-1.1.SNAPSHOT.xsd'),
+    SchemaVersion.V1_0: join(__DIR, 'bom-1.0.SNAPSHOT.xsd'),
+}
+
+BOM_JSON: Dict[SchemaVersion, Optional[str]] = {
+    SchemaVersion.V1_4: join(__DIR, 'bom-1.4.SNAPSHOT.schema.json'),
+    SchemaVersion.V1_3: join(__DIR, 'bom-1.3.SNAPSHOT.schema.json'),
+    SchemaVersion.V1_2: join(__DIR, 'bom-1.2.SNAPSHOT.schema.json'),
+    # <= v1.1 is not defined in JSON
+    SchemaVersion.V1_1: None,
+    SchemaVersion.V1_0: None,
+}
+
+BOM_JSON_STRICT: Dict[SchemaVersion, Optional[str]] = {
+    # >= v1.4 is already strict - no special file here
+    SchemaVersion.V1_4: join(__DIR, 'bom-1.4.SNAPSHOT.schema.json'),
+    # <= 1.3 need special files
+    SchemaVersion.V1_3: join(__DIR, 'bom-1.3-strict.SNAPSHOT.schema.json'),
+    SchemaVersion.V1_2: join(__DIR, 'bom-1.2-strict.SNAPSHOT.schema.json'),
+    # <= v1.1 is not defined in JSON
+    SchemaVersion.V1_1: None,
+    SchemaVersion.V1_0: None,
+}
+
+SPDX_JSON = join(__DIR, 'spdx.SNAPSHOT.schema.json')
+SPDX_XML = join(__DIR, 'spdx.SNAPSHOT.xsd')
+
+JSF = join(__DIR, 'jsf-0.82.SNAPSHOT.schema.json')
diff --git a/cyclonedx/__res/schema/bom-1.0.SNAPSHOT.xsd b/cyclonedx/schema/_res/bom-1.0.SNAPSHOT.xsd
similarity index 100%
rename from cyclonedx/__res/schema/bom-1.0.SNAPSHOT.xsd
rename to cyclonedx/schema/_res/bom-1.0.SNAPSHOT.xsd
diff --git a/cyclonedx/__res/schema/bom-1.1.SNAPSHOT.xsd b/cyclonedx/schema/_res/bom-1.1.SNAPSHOT.xsd
similarity index 100%
rename from cyclonedx/__res/schema/bom-1.1.SNAPSHOT.xsd
rename to cyclonedx/schema/_res/bom-1.1.SNAPSHOT.xsd
diff --git a/cyclonedx/__res/schema/bom-1.2-strict.SNAPSHOT.schema.json b/cyclonedx/schema/_res/bom-1.2-strict.SNAPSHOT.schema.json
similarity index 100%
rename from cyclonedx/__res/schema/bom-1.2-strict.SNAPSHOT.schema.json
rename to cyclonedx/schema/_res/bom-1.2-strict.SNAPSHOT.schema.json
diff --git a/cyclonedx/__res/schema/bom-1.2.SNAPSHOT.schema.json b/cyclonedx/schema/_res/bom-1.2.SNAPSHOT.schema.json
similarity index 100%
rename from cyclonedx/__res/schema/bom-1.2.SNAPSHOT.schema.json
rename to cyclonedx/schema/_res/bom-1.2.SNAPSHOT.schema.json
diff --git a/cyclonedx/__res/schema/bom-1.2.SNAPSHOT.xsd b/cyclonedx/schema/_res/bom-1.2.SNAPSHOT.xsd
similarity index 100%
rename from cyclonedx/__res/schema/bom-1.2.SNAPSHOT.xsd
rename to cyclonedx/schema/_res/bom-1.2.SNAPSHOT.xsd
diff --git a/cyclonedx/__res/schema/bom-1.3-strict.SNAPSHOT.schema.json b/cyclonedx/schema/_res/bom-1.3-strict.SNAPSHOT.schema.json
similarity index 100%
rename from cyclonedx/__res/schema/bom-1.3-strict.SNAPSHOT.schema.json
rename to cyclonedx/schema/_res/bom-1.3-strict.SNAPSHOT.schema.json
diff --git a/cyclonedx/__res/schema/bom-1.3.SNAPSHOT.schema.json b/cyclonedx/schema/_res/bom-1.3.SNAPSHOT.schema.json
similarity index 100%
rename from cyclonedx/__res/schema/bom-1.3.SNAPSHOT.schema.json
rename to cyclonedx/schema/_res/bom-1.3.SNAPSHOT.schema.json
diff --git a/cyclonedx/__res/schema/bom-1.3.SNAPSHOT.xsd b/cyclonedx/schema/_res/bom-1.3.SNAPSHOT.xsd
similarity index 100%
rename from cyclonedx/__res/schema/bom-1.3.SNAPSHOT.xsd
rename to cyclonedx/schema/_res/bom-1.3.SNAPSHOT.xsd
diff --git a/cyclonedx/__res/schema/bom-1.4.SNAPSHOT.schema.json b/cyclonedx/schema/_res/bom-1.4.SNAPSHOT.schema.json
similarity index 100%
rename from cyclonedx/__res/schema/bom-1.4.SNAPSHOT.schema.json
rename to cyclonedx/schema/_res/bom-1.4.SNAPSHOT.schema.json
diff --git a/cyclonedx/__res/schema/bom-1.4.SNAPSHOT.xsd b/cyclonedx/schema/_res/bom-1.4.SNAPSHOT.xsd
similarity index 100%
rename from cyclonedx/__res/schema/bom-1.4.SNAPSHOT.xsd
rename to cyclonedx/schema/_res/bom-1.4.SNAPSHOT.xsd
diff --git a/cyclonedx/__res/schema/jsf-0.82.SNAPSHOT.schema.json b/cyclonedx/schema/_res/jsf-0.82.SNAPSHOT.schema.json
similarity index 100%
rename from cyclonedx/__res/schema/jsf-0.82.SNAPSHOT.schema.json
rename to cyclonedx/schema/_res/jsf-0.82.SNAPSHOT.schema.json
diff --git a/cyclonedx/__res/schema/spdx.SNAPSHOT.schema.json b/cyclonedx/schema/_res/spdx.SNAPSHOT.schema.json
similarity index 100%
rename from cyclonedx/__res/schema/spdx.SNAPSHOT.schema.json
rename to cyclonedx/schema/_res/spdx.SNAPSHOT.schema.json
diff --git a/cyclonedx/__res/schema/spdx.SNAPSHOT.xsd b/cyclonedx/schema/_res/spdx.SNAPSHOT.xsd
similarity index 100%
rename from cyclonedx/__res/schema/spdx.SNAPSHOT.xsd
rename to cyclonedx/schema/_res/spdx.SNAPSHOT.xsd
diff --git a/cyclonedx/spdx.py b/cyclonedx/spdx.py
index e2b51c50c..6a684f978 100644
--- a/cyclonedx/spdx.py
+++ b/cyclonedx/spdx.py
@@ -20,12 +20,11 @@
 ]
 
 from json import load as json_load
-from os.path import join as path_join
 from typing import TYPE_CHECKING, Dict, Optional, Set
 
 from license_expression import get_spdx_licensing  # type: ignore
 
-from .schema import _RES_DIR as __SCHEMA_RES_DIR
+from .schema._res import SPDX_JSON as __SPDX_JSON_SCHEMA
 
 if TYPE_CHECKING:
     from license_expression import Licensing
@@ -34,7 +33,7 @@
 # python's internal module loader will assure that this init-part runs only once.
 
 # !!! this requires to ship the actual schema data with the package.
-with open(path_join(__SCHEMA_RES_DIR, 'spdx.SNAPSHOT.schema.json')) as schema:
+with open(__SPDX_JSON_SCHEMA) as schema:
     __IDS: Set[str] = set(json_load(schema).get('enum', []))
 assert len(__IDS) > 0, 'known SPDX-IDs should be non-empty set'
 
diff --git a/cyclonedx/validation/__init__.py b/cyclonedx/validation/__init__.py
index ad8fea975..7e8603e3c 100644
--- a/cyclonedx/validation/__init__.py
+++ b/cyclonedx/validation/__init__.py
@@ -15,7 +15,6 @@
 # SPDX-License-Identifier: Apache-2.0
 
 from abc import ABC, abstractmethod
-from os.path import isfile
 from typing import TYPE_CHECKING, Any, Optional
 
 if TYPE_CHECKING:
@@ -39,15 +38,19 @@ def __str__(self) -> str:
 
 class _BaseValidator(ABC):
 
+    def __init__(self, schema_version: 'SchemaVersion') -> None:
+        self.__schema_version = schema_version
+        if not self._schema_file:
+            raise NotImplementedError(f'not implemented for schema {schema_version}')
+
     @property
     @abstractmethod
-    def _schema_file(self) -> str:
+    def _schema_file(self) -> Optional[str]:
         ...
 
-    def __init__(self, schema_version: 'SchemaVersion') -> None:
-        self.schema_version = schema_version
-        if not isfile(self._schema_file):
-            raise NotImplementedError(f'not implemented for schema {schema_version}')
+    @property
+    def schema_version(self) -> 'SchemaVersion':
+        return self.__schema_version
 
     @abstractmethod
     def validate_str(self, data: str) -> Optional[ValidationError]:
diff --git a/cyclonedx/validation/json.py b/cyclonedx/validation/json.py
index 1c4b5b531..c6a613acf 100644
--- a/cyclonedx/validation/json.py
+++ b/cyclonedx/validation/json.py
@@ -18,19 +18,16 @@
 
 from abc import ABC
 from json import loads as json_loads
-from os.path import join
 from typing import TYPE_CHECKING, Any, Never, Optional, Tuple
 
-from ..schema import _RES_DIR as _SCHEMA_RES_DIR
+from ..schema._res import BOM_JSON as _S_BOM, BOM_JSON_STRICT as _S_BOM_STRICT, JSF as _S_JSF, SPDX_JSON as _S_SPPDX
 from . import MissingOptionalDependencyException, ValidationError, _BaseValidator
 
 _missing_deps_error: Optional[Tuple[MissingOptionalDependencyException, ImportError]] = None
 try:
-    from jsonschema import FormatChecker
     from jsonschema.exceptions import ValidationError as JsonValidationError
-    from jsonschema.protocols import Validator
     from jsonschema.validators import Draft7Validator
-    from referencing import Registry, Resource
+    from referencing import Registry
     from referencing.exceptions import NoSuchResource
     from referencing.jsonschema import DRAFT7
 
@@ -42,17 +39,24 @@
         'Please install `cyclonedx-python-lib` with the extra "json-validation".\n'
     ), err
 
-if _missing_deps_error:
-    class __BaseJsonValidator(_BaseValidator, ABC):
+
+class __BaseJsonValidator(_BaseValidator, ABC):
+    if _missing_deps_error:
         def validate_str(self, data: str) -> Optional[ValidationError]:
             raise _missing_deps_error[0]  # from functionality_not_implemented_error[1]
 
         def validata_data(self, data: Any) -> Optional[ValidationError]:
             raise _missing_deps_error[0]  # from functionality_not_implemented_error[1]
+    else:
+        def validate_str(self, data: str) -> Optional[ValidationError]:
+            return self.validata_data(json_loads(data))
 
-else:
-    class __BaseJsonValidator(_BaseValidator, ABC):
-        __validator: Optional['JsonSchemaValidator'] = None
+        def validata_data(self, data: Any) -> Optional[ValidationError]:
+            validator = self._validator  # may throw on error that MUST NOT be caught
+            try:
+                validator.validate(data)
+            except JsonValidationError as error:
+                return ValidationError(error)
 
         @staticmethod
         def __make_validator_registry() -> Registry:
@@ -60,9 +64,7 @@ def _prevent_retrieve(uri: str) -> Never:
                 raise NoSuchResource(ref=uri)
 
             schema_prefix = 'http://cyclonedx.org/schema/'
-            spdx = open(join(_SCHEMA_RES_DIR, 'spdx.SNAPSHOT.schema.json'))
-            jsf = open(join(_SCHEMA_RES_DIR, 'jsf-0.82.SNAPSHOT.schema.json'))
-            with spdx, jsf:
+            with open(_S_SPPDX) as spdx, open(_S_JSF) as jsf:
                 return Registry(
                     retrieve=_prevent_retrieve  # prevent unexpected outbound access
                 ).with_resources([
@@ -70,36 +72,28 @@ def _prevent_retrieve(uri: str) -> Never:
                     (f'{schema_prefix}jsf-0.82.SNAPSHOT.schema.json', DRAFT7.create_resource(json_loads(jsf.read()))),
                 ])
 
+        __validator: Optional['JsonSchemaValidator'] = None
+
         @property
         def _validator(self) -> 'JsonSchemaValidator':
             if not self.__validator:
                 with open(self._schema_file) as sf:
-                    schema = json_loads(sf.read())
-                self.__validator = Draft7Validator(schema,
-                                                   registry=self.__make_validator_registry(),
-                                                   format_checker=Draft7Validator.FORMAT_CHECKER)
+                    self.__validator = Draft7Validator(
+                        json_loads(sf.read()),
+                        registry=self.__make_validator_registry(),
+                        format_checker=Draft7Validator.FORMAT_CHECKER)
             return self.__validator
 
-        def validate_str(self, data: str) -> Optional[ValidationError]:
-            return self.validata_data(json_loads(data))
-
-        def validata_data(self, data: Any) -> Optional[ValidationError]:
-            validator = self._validator  # may throw on error that MUST NOT be caught
-            try:
-                validator.validate(data)
-            except JsonValidationError as error:
-                return ValidationError(error)
-
 
 class JsonValidator(__BaseJsonValidator):
 
     @property
-    def _schema_file(self) -> str:
-        return join(_SCHEMA_RES_DIR, f'bom-{self.schema_version.to_version()}.SNAPSHOT.schema.json')
+    def _schema_file(self) -> Optional[str]:
+        return _S_BOM.get(self.schema_version)
 
 
 class JsonStrictValidator(__BaseJsonValidator):
 
     @property
-    def _schema_file(self) -> str:
-        return join(_SCHEMA_RES_DIR, f'bom-{self.schema_version.to_version()}-strict.SNAPSHOT.schema.json')
+    def _schema_file(self) -> Optional[str]:
+        return _S_BOM_STRICT.get(self.schema_version)
diff --git a/tests/test_schema__res.py b/tests/test_schema__res.py
new file mode 100644
index 000000000..89622a4bb
--- /dev/null
+++ b/tests/test_schema__res.py
@@ -0,0 +1,44 @@
+# encoding: utf-8
+
+# This file is part of CycloneDX Python Lib
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+# Copyright (c) OWASP Foundation. All Rights Reserved.
+
+from os.path import isfile
+from typing import Generator
+from unittest import TestCase
+
+from ddt import ddt, idata
+
+from cyclonedx.schema import _res
+
+
+def _dp_files() -> Generator:
+    for bom in (_res.BOM_XML, _res.BOM_JSON, _res.BOM_JSON):
+        for file in bom.values():
+            if file is not None:
+                yield file
+    yield _res.SPDX_JSON
+    yield _res.SPDX_XML
+    yield _res.JSF
+
+
+@ddt
+class SchemaRes(TestCase):
+
+    @idata(_dp_files())
+    def test_file_exists(self, file) -> None:
+        self.assertTrue(isfile(file), file)
diff --git a/tests/test_spdx.py b/tests/test_spdx.py
index 173de7449..98c51dc69 100644
--- a/tests/test_spdx.py
+++ b/tests/test_spdx.py
@@ -19,16 +19,15 @@
 
 from itertools import chain
 from json import load as json_load
-from os.path import join as path_join
 from unittest import TestCase
 
 from ddt import data, ddt, idata, unpack
 
 from cyclonedx import spdx
-from cyclonedx.schema import _RES_DIR as CDX_SCHEMA_DIRECTORY
+from cyclonedx.schema._res import SPDX_JSON
 
 # rework access
-with open(path_join(CDX_SCHEMA_DIRECTORY, 'spdx.SNAPSHOT.schema.json')) as spdx_schema:
+with open(SPDX_JSON) as spdx_schema:
     KNOWN_SPDX_IDS = json_load(spdx_schema)['enum']
 
 VALID_COMPOUND_EXPRESSIONS = {
diff --git a/tests/test_validation_json.py b/tests/test_validation_json.py
index 446aa5314..7e213aa19 100644
--- a/tests/test_validation_json.py
+++ b/tests/test_validation_json.py
@@ -19,12 +19,13 @@
 
 from glob import iglob
 from os.path import join
+from typing import Generator
 from unittest import TestCase
 
 from ddt import data, ddt, idata, unpack
 
 from cyclonedx.schema import SchemaVersion
-from cyclonedx.validation.json import JsonValidator
+from cyclonedx.validation.json import JsonStrictValidator, JsonValidator
 
 from . import TESTDATA_DIRECTORY
 
@@ -33,6 +34,13 @@
 UNSUPPORTED_SCHEMA_VERSIONS = (SchemaVersion.V1_0, SchemaVersion.V1_1,)
 
 
+def _dp(prefix: str) -> Generator:
+    return (
+        (sv, tf) for sv in SchemaVersion if sv not in UNSUPPORTED_SCHEMA_VERSIONS
+        for tf in iglob(f'{prefix}-*.json', root_dir=join(RELEVANT_TESTDATA_DIRECTORY, sv.to_version()))
+    )
+
+
 @ddt
 class TestJsonValidator(TestCase):
 
@@ -41,8 +49,7 @@ def test_throws_with_unsupported_schema_version(self, schema_version: SchemaVers
         with self.assertRaisesRegex(NotImplementedError, 'not implemented for schema'):
             JsonValidator(schema_version)
 
-    @idata((sv, tf) for sv in SchemaVersion if sv not in UNSUPPORTED_SCHEMA_VERSIONS for tf in
-           iglob('valid-*.json', root_dir=join(RELEVANT_TESTDATA_DIRECTORY, sv.to_version())))
+    @idata(_dp('valid'))
     @unpack
     def test_validate_no_none(self, schema_version: SchemaVersion, test_data_file: str) -> None:
         validator = JsonValidator(schema_version)
@@ -51,8 +58,7 @@ def test_validate_no_none(self, schema_version: SchemaVersion, test_data_file: s
         error = validator.validate_str(test_data)
         self.assertIsNone(error)
 
-    @idata((sv, tf) for sv in SchemaVersion if sv not in UNSUPPORTED_SCHEMA_VERSIONS for tf in
-           iglob('invalid-*.json', root_dir=join(RELEVANT_TESTDATA_DIRECTORY, sv.to_version())))
+    @idata(_dp('invalid'))
     @unpack
     def test_validate_expected_error(self, schema_version: SchemaVersion, test_data_file: str) -> None:
         validator = JsonValidator(schema_version)
@@ -61,3 +67,31 @@ def test_validate_expected_error(self, schema_version: SchemaVersion, test_data_
         error = validator.validate_str(test_data)
         self.assertIsNotNone(error)
         self.assertIsNotNone(error.data)
+
+
+@ddt
+class TestJsonValidator(TestCase):
+
+    @data(*UNSUPPORTED_SCHEMA_VERSIONS)
+    def test_throws_with_unsupported_schema_version(self, schema_version: SchemaVersion) -> None:
+        with self.assertRaisesRegex(NotImplementedError, 'not implemented for schema'):
+            JsonStrictValidator(schema_version)
+
+    @idata(_dp('valid'))
+    @unpack
+    def test_validate_no_none(self, schema_version: SchemaVersion, test_data_file: str) -> None:
+        validator = JsonStrictValidator(schema_version)
+        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), test_data_file), 'r') as tdfh:
+            test_data = tdfh.read()
+        error = validator.validate_str(test_data)
+        self.assertIsNone(error)
+
+    @idata(_dp('invalid'))
+    @unpack
+    def test_validate_expected_error(self, schema_version: SchemaVersion, test_data_file: str) -> None:
+        validator = JsonStrictValidator(schema_version)
+        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), test_data_file), 'r') as tdfh:
+            test_data = tdfh.read()
+        error = validator.validate_str(test_data)
+        self.assertIsNotNone(error)
+        self.assertIsNotNone(error.data)
diff --git a/tools/schema-downloader.py b/tools/schema-downloader.py
index 2ff3e668a..735a306c7 100644
--- a/tools/schema-downloader.py
+++ b/tools/schema-downloader.py
@@ -19,7 +19,7 @@
 import re
 
 SOURCE_ROOT = 'https://raw.githubusercontent.com/CycloneDX/specification/1.4/schema/'
-TARGET_ROOT = join(dirname(__file__), '..', 'cyclonedx', '__res', 'schema')
+TARGET_ROOT = join(dirname(__file__), '..', 'cyclonedx', 'schema', '_res')
 
 bom_xsd = {
     'versions': ['1.4', '1.3', '1.2', '1.1', '1.0'],

From 43cd4ca30b25cd93d4b01c472cdf5d0935766f79 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sat, 16 Sep 2023 16:46:14 +0200
Subject: [PATCH 16/41] cleanup

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/validation/json.py | 42 +++++++++++++++++++-----------------
 1 file changed, 22 insertions(+), 20 deletions(-)

diff --git a/cyclonedx/validation/json.py b/cyclonedx/validation/json.py
index c6a613acf..cb3ed1072 100644
--- a/cyclonedx/validation/json.py
+++ b/cyclonedx/validation/json.py
@@ -25,14 +25,14 @@
 
 _missing_deps_error: Optional[Tuple[MissingOptionalDependencyException, ImportError]] = None
 try:
-    from jsonschema.exceptions import ValidationError as JsonValidationError
-    from jsonschema.validators import Draft7Validator
+    from jsonschema.exceptions import ValidationError as JsonValidationError  # type: ignore
+    from jsonschema.validators import Draft7Validator  # type: ignore
     from referencing import Registry
     from referencing.exceptions import NoSuchResource
     from referencing.jsonschema import DRAFT7
 
     if TYPE_CHECKING:
-        from jsonschema.protocols import Validator as JsonSchemaValidator
+        from jsonschema.protocols import Validator as JsonSchemaValidator  # type: ignore
 except ImportError as err:
     _missing_deps_error = MissingOptionalDependencyException(
         'This functionality requires optional dependencies.\n'
@@ -42,11 +42,13 @@
 
 class __BaseJsonValidator(_BaseValidator, ABC):
     if _missing_deps_error:
+        __MDERROR = _missing_deps_error
+
         def validate_str(self, data: str) -> Optional[ValidationError]:
-            raise _missing_deps_error[0]  # from functionality_not_implemented_error[1]
+            raise self.__MDERROR[0]  # from functionality_not_implemented_error[1]
 
         def validata_data(self, data: Any) -> Optional[ValidationError]:
-            raise _missing_deps_error[0]  # from functionality_not_implemented_error[1]
+            raise self.__MDERROR[0]  # from functionality_not_implemented_error[1]
     else:
         def validate_str(self, data: str) -> Optional[ValidationError]:
             return self.validata_data(json_loads(data))
@@ -57,33 +59,33 @@ def validata_data(self, data: Any) -> Optional[ValidationError]:
                 validator.validate(data)
             except JsonValidationError as error:
                 return ValidationError(error)
-
-        @staticmethod
-        def __make_validator_registry() -> Registry:
-            def _prevent_retrieve(uri: str) -> Never:
-                raise NoSuchResource(ref=uri)
-
-            schema_prefix = 'http://cyclonedx.org/schema/'
-            with open(_S_SPPDX) as spdx, open(_S_JSF) as jsf:
-                return Registry(
-                    retrieve=_prevent_retrieve  # prevent unexpected outbound access
-                ).with_resources([
-                    (f'{schema_prefix}spdx.SNAPSHOT.schema.json', DRAFT7.create_resource(json_loads(spdx.read()))),
-                    (f'{schema_prefix}jsf-0.82.SNAPSHOT.schema.json', DRAFT7.create_resource(json_loads(jsf.read()))),
-                ])
+            return None
 
         __validator: Optional['JsonSchemaValidator'] = None
 
         @property
         def _validator(self) -> 'JsonSchemaValidator':
             if not self.__validator:
-                with open(self._schema_file) as sf:
+                schema_file = self._schema_file
+                if schema_file is None:
+                    raise NotImplementedError('mising schema file')
+                with open(schema_file) as sf:
                     self.__validator = Draft7Validator(
                         json_loads(sf.read()),
                         registry=self.__make_validator_registry(),
                         format_checker=Draft7Validator.FORMAT_CHECKER)
+            assert self.__validator
             return self.__validator
 
+        @staticmethod
+        def __make_validator_registry() -> Registry[Any]:
+            schema_prefix = 'http://cyclonedx.org/schema/'
+            with open(_S_SPPDX) as spdx, open(_S_JSF) as jsf:
+                return Registry().with_resources([
+                    (f'{schema_prefix}spdx.SNAPSHOT.schema.json', DRAFT7.create_resource(json_loads(spdx.read()))),
+                    (f'{schema_prefix}jsf-0.82.SNAPSHOT.schema.json', DRAFT7.create_resource(json_loads(jsf.read()))),
+                ])
+
 
 class JsonValidator(__BaseJsonValidator):
 

From 41af342ebe6d93d4f7c8ef34d37f2c521cf0d853 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sat, 16 Sep 2023 17:11:41 +0200
Subject: [PATCH 17/41] bump schema

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/schema/_res/README.md               |    4 +-
 cyclonedx/schema/_res/bom-1.1.SNAPSHOT.xsd    |    9 +-
 .../_res/bom-1.2-strict.SNAPSHOT.schema.json  |   23 +-
 .../schema/_res/bom-1.2.SNAPSHOT.schema.json  |   20 +-
 cyclonedx/schema/_res/bom-1.2.SNAPSHOT.xsd    |   17 +-
 .../_res/bom-1.3-strict.SNAPSHOT.schema.json  |   24 +-
 .../schema/_res/bom-1.3.SNAPSHOT.schema.json  |   22 +-
 cyclonedx/schema/_res/bom-1.3.SNAPSHOT.xsd    |   23 +-
 .../schema/_res/bom-1.4.SNAPSHOT.schema.json  |    6 +-
 cyclonedx/schema/_res/bom-1.4.SNAPSHOT.xsd    |   20 +-
 .../schema/_res/jsf-0.82.SNAPSHOT.schema.json |    4 -
 .../schema/_res/spdx.SNAPSHOT.schema.json     |  510 ++++--
 cyclonedx/schema/_res/spdx.SNAPSHOT.xsd       | 1598 +++++++++++------
 13 files changed, 1505 insertions(+), 775 deletions(-)

diff --git a/cyclonedx/schema/_res/README.md b/cyclonedx/schema/_res/README.md
index 9eea5b696..d7df06985 100644
--- a/cyclonedx/schema/_res/README.md
+++ b/cyclonedx/schema/_res/README.md
@@ -1,10 +1,10 @@
 # Resources: Schema files
 
 some schema for offline use as download via [script](../../../tools/schema-downloader.py).
-original sources: <https://github.com/CycloneDX/specification/blob/1.4>
+original sources: <https://github.com/CycloneDX/specification/tree/master/schema>
 
 Currently using version
-[ccbf7b5781ef534cd62616e3c4221004c7c82a66](https://github.com/CycloneDX/specification/commit/ccbf7b5781ef534cd62616e3c4221004c7c82a66)
+[fd4d383658196992364e5d62568a48c431ace515](https://github.com/CycloneDX/specification/commit/fd4d383658196992364e5d62568a48c431ace515)
 
 | file | note |
 |------|------|
diff --git a/cyclonedx/schema/_res/bom-1.1.SNAPSHOT.xsd b/cyclonedx/schema/_res/bom-1.1.SNAPSHOT.xsd
index 8ddbaf62d..f21e9907d 100644
--- a/cyclonedx/schema/_res/bom-1.1.SNAPSHOT.xsd
+++ b/cyclonedx/schema/_res/bom-1.1.SNAPSHOT.xsd
@@ -38,6 +38,13 @@ limitations under the License.
         </xs:documentation>
     </xs:annotation>
 
+    <xs:simpleType name="refType">
+        <xs:annotation>
+            <xs:documentation>Identifier-DataType for interlinked elements.</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:string" />
+    </xs:simpleType>
+
     <xs:complexType name="componentsType">
         <xs:sequence minOccurs="0" maxOccurs="unbounded">
             <xs:element name="component" type="bom:component"/>
@@ -201,7 +208,7 @@ limitations under the License.
                 </xs:documentation>
             </xs:annotation>
         </xs:attribute>
-        <xs:attribute name="bom-ref" type="xs:string">
+        <xs:attribute name="bom-ref" type="bom:refType">
             <xs:annotation>
                 <xs:documentation>
                     An optional identifier which can be used to reference the component elsewhere in the BOM.
diff --git a/cyclonedx/schema/_res/bom-1.2-strict.SNAPSHOT.schema.json b/cyclonedx/schema/_res/bom-1.2-strict.SNAPSHOT.schema.json
index 9a0f52d99..682cf739d 100644
--- a/cyclonedx/schema/_res/bom-1.2-strict.SNAPSHOT.schema.json
+++ b/cyclonedx/schema/_res/bom-1.2-strict.SNAPSHOT.schema.json
@@ -1,6 +1,6 @@
 {
   "$schema": "http://json-schema.org/draft-07/schema#",
-  "$id": "http://cyclonedx.org/schema/bom-1.2a.schema.json",
+  "$id": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
   "type": "object",
   "title": "CycloneDX Software Bill-of-Material Specification",
   "$comment" : "CycloneDX JSON schema is published under the terms of the Apache License 2.0.",
@@ -13,7 +13,7 @@
     "$schema": {
       "type": "string",
       "enum": [
-        "http://cyclonedx.org/schema/bom-1.2a.schema.json"
+        "http://cyclonedx.org/schema/bom-1.2b.schema.json"
       ]
     },
     "bomFormat": {
@@ -86,6 +86,10 @@
     }
   },
   "definitions": {
+    "refType": {
+      "$comment": "Identifier-DataType for interlinked elements.",
+      "type": "string"
+    },
     "metadata": {
       "type": "object",
       "title": "BOM Metadata Object",
@@ -151,7 +155,7 @@
           "description": "The date and time (timestamp) when the document was created."
         },
         "hashes": {
-          "$id": "#/properties/hashes",
+          "$id": "#/definitions/tool/properties/hashes",
           "type": "array",
           "items": {"$ref": "#/definitions/hash"},
           "title": "Hashes",
@@ -260,7 +264,7 @@
           "pattern": "^[-+a-z0-9.]+/[-+a-z0-9.]+$"
         },
         "bom-ref": {
-          "type": "string",
+          "$ref": "#/definitions/refType",
           "title": "BOM Reference",
           "description": "An optional identifier which can be used to reference the component elsewhere in the BOM. Every bom-ref should be unique.",
           "default": "",
@@ -445,7 +449,7 @@
           "title": "External References"
         },
         "components": {
-          "$id": "#/properties/components",
+          "$id": "#/definitions/component/properties/components",
           "type": "array",
           "items": {"$ref": "#/definitions/component"},
           "uniqueItems": true,
@@ -858,8 +862,7 @@
       "additionalProperties": false,
       "properties": {
         "ref": {
-          "type": "string",
-          "format": "string",
+          "$ref": "#/definitions/refType",
           "title": "Reference",
           "description": "References a component by the components bom-ref attribute"
         },
@@ -867,7 +870,7 @@
           "type": "array",
           "uniqueItems": true,
           "items": {
-            "type": "string"
+            "$ref": "#/definitions/refType"
           },
           "title": "Depends On",
           "description": "The bom-ref identifiers of the components that are dependencies of this dependency object."
@@ -883,7 +886,7 @@
       "additionalProperties": false,
       "properties": {
         "bom-ref": {
-          "type": "string",
+          "$ref": "#/definitions/refType",
           "title": "BOM Reference",
           "description": "An optional identifier which can be used to reference the service elsewhere in the BOM. Every bom-ref should be unique.",
           "default": "",
@@ -984,7 +987,7 @@
           "title": "External References"
         },
         "services": {
-          "$id": "#/properties/services",
+          "$id": "#/definitions/service/properties/services",
           "type": "array",
           "items": {"$ref": "#/definitions/service"},
           "uniqueItems": true,
diff --git a/cyclonedx/schema/_res/bom-1.2.SNAPSHOT.schema.json b/cyclonedx/schema/_res/bom-1.2.SNAPSHOT.schema.json
index 539a78225..d23f683b5 100644
--- a/cyclonedx/schema/_res/bom-1.2.SNAPSHOT.schema.json
+++ b/cyclonedx/schema/_res/bom-1.2.SNAPSHOT.schema.json
@@ -1,6 +1,6 @@
 {
   "$schema": "http://json-schema.org/draft-07/schema#",
-  "$id": "http://cyclonedx.org/schema/bom-1.2a.schema.json",
+  "$id": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
   "type": "object",
   "title": "CycloneDX Software Bill-of-Material Specification",
   "$comment" : "CycloneDX JSON schema is published under the terms of the Apache License 2.0.",
@@ -79,6 +79,10 @@
     }
   },
   "definitions": {
+    "refType": {
+      "$comment": "Identifier-DataType for interlinked elements.",
+      "type": "string"
+    },
     "metadata": {
       "type": "object",
       "title": "BOM Metadata Object",
@@ -142,7 +146,7 @@
           "description": "The date and time (timestamp) when the document was created."
         },
         "hashes": {
-          "$id": "#/properties/hashes",
+          "$id": "#/definitions/tool/properties/hashes",
           "type": "array",
           "items": {"$ref": "#/definitions/hash"},
           "title": "Hashes",
@@ -248,7 +252,7 @@
           "pattern": "^[-+a-z0-9.]+/[-+a-z0-9.]+$"
         },
         "bom-ref": {
-          "type": "string",
+          "$ref": "#/definitions/refType",
           "title": "BOM Reference",
           "description": "An optional identifier which can be used to reference the component elsewhere in the BOM. Every bom-ref should be unique.",
           "default": "",
@@ -431,7 +435,7 @@
           "title": "External References"
         },
         "components": {
-          "$id": "#/properties/components",
+          "$id": "#/definitions/component/properties/components",
           "type": "array",
           "items": {"$ref": "#/definitions/component"},
           "uniqueItems": true,
@@ -832,7 +836,7 @@
       ],
       "properties": {
         "ref": {
-          "type": "string",
+          "$ref": "#/definitions/refType",
           "format": "string",
           "title": "Reference",
           "description": "References a component by the components bom-ref attribute"
@@ -841,7 +845,7 @@
           "type": "array",
           "uniqueItems": true,
           "items": {
-            "type": "string"
+            "$ref": "#/definitions/refType"
           },
           "title": "Depends On",
           "description": "The bom-ref identifiers of the components that are dependencies of this dependency object."
@@ -856,7 +860,7 @@
       ],
       "properties": {
         "bom-ref": {
-          "type": "string",
+          "$ref": "#/definitions/refType",
           "title": "BOM Reference",
           "description": "An optional identifier which can be used to reference the service elsewhere in the BOM. Every bom-ref should be unique.",
           "default": "",
@@ -956,7 +960,7 @@
           "title": "External References"
         },
         "services": {
-          "$id": "#/properties/services",
+          "$id": "#/definitions/service/properties/services",
           "type": "array",
           "items": {"$ref": "#/definitions/service"},
           "uniqueItems": true,
diff --git a/cyclonedx/schema/_res/bom-1.2.SNAPSHOT.xsd b/cyclonedx/schema/_res/bom-1.2.SNAPSHOT.xsd
index 145874ba8..763e6ee66 100644
--- a/cyclonedx/schema/_res/bom-1.2.SNAPSHOT.xsd
+++ b/cyclonedx/schema/_res/bom-1.2.SNAPSHOT.xsd
@@ -22,7 +22,7 @@ limitations under the License.
            targetNamespace="http://cyclonedx.org/schema/bom/1.2"
            vc:minVersion="1.0"
            vc:maxVersion="1.1"
-           version="1.2">
+           version="1.2.1">
 
     <xs:import namespace="http://cyclonedx.org/schema/spdx" schemaLocation="spdx.SNAPSHOT.xsd"/>
 
@@ -38,6 +38,13 @@ limitations under the License.
         </xs:documentation>
     </xs:annotation>
 
+    <xs:simpleType name="refType">
+        <xs:annotation>
+            <xs:documentation>Identifier-DataType for interlinked elements.</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:string" />
+    </xs:simpleType>
+
     <xs:complexType name="metadata">
         <xs:sequence minOccurs="0" maxOccurs="1">
             <xs:element name="timestamp" type="xs:dateTime" minOccurs="0">
@@ -395,7 +402,7 @@ limitations under the License.
                 </xs:documentation>
             </xs:annotation>
         </xs:attribute>
-        <xs:attribute name="bom-ref" type="xs:string">
+        <xs:attribute name="bom-ref" type="bom:refType">
             <xs:annotation>
                 <xs:documentation>
                     An optional identifier which can be used to reference the component elsewhere in the BOM.
@@ -593,7 +600,7 @@ limitations under the License.
 
     <xs:simpleType name="mimeType">
         <xs:restriction base="xs:token">
-            <xs:pattern value="^[-+a-z0-9.]+/[-+a-z0-9.]+$"/>
+            <xs:pattern value="[-+a-z0-9.]+/[-+a-z0-9.]+"/>
         </xs:restriction>
     </xs:simpleType>
 
@@ -1144,7 +1151,7 @@ limitations under the License.
         <xs:sequence minOccurs="0" maxOccurs="unbounded">
             <xs:element name="dependency" type="bom:dependencyType"/>
         </xs:sequence>
-        <xs:attribute name="ref" type="xs:string" use="required">
+        <xs:attribute name="ref" type="bom:refType" use="required">
             <xs:annotation>
                 <xs:documentation>References a component or service by the its bom-ref attribute</xs:documentation>
             </xs:annotation>
@@ -1302,7 +1309,7 @@ limitations under the License.
                 </xs:annotation>
             </xs:any>
         </xs:sequence>
-        <xs:attribute name="bom-ref" type="xs:string">
+        <xs:attribute name="bom-ref" type="bom:refType">
             <xs:annotation>
                 <xs:documentation>
                     An optional identifier which can be used to reference the service elsewhere in the BOM.
diff --git a/cyclonedx/schema/_res/bom-1.3-strict.SNAPSHOT.schema.json b/cyclonedx/schema/_res/bom-1.3-strict.SNAPSHOT.schema.json
index 5e9d273b4..a11426201 100644
--- a/cyclonedx/schema/_res/bom-1.3-strict.SNAPSHOT.schema.json
+++ b/cyclonedx/schema/_res/bom-1.3-strict.SNAPSHOT.schema.json
@@ -1,6 +1,6 @@
 {
   "$schema": "http://json-schema.org/draft-07/schema#",
-  "$id": "http://cyclonedx.org/schema/bom-1.3.schema.json",
+  "$id": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
   "type": "object",
   "title": "CycloneDX Software Bill-of-Material Specification",
   "$comment" : "CycloneDX JSON schema is published under the terms of the Apache License 2.0.",
@@ -13,7 +13,7 @@
     "$schema": {
       "type": "string",
       "enum": [
-        "http://cyclonedx.org/schema/bom-1.3.schema.json"
+        "http://cyclonedx.org/schema/bom-1.3a.schema.json"
       ]
     },
     "bomFormat": {
@@ -93,6 +93,10 @@
     }
   },
   "definitions": {
+    "refType": {
+      "$comment": "Identifier-DataType for interlinked elements.",
+      "type": "string"
+    },
     "metadata": {
       "type": "object",
       "title": "BOM Metadata Object",
@@ -166,7 +170,7 @@
           "description": "The date and time (timestamp) when the document was created."
         },
         "hashes": {
-          "$id": "#/properties/hashes",
+          "$id": "#/definitions/tool/properties/hashes",
           "type": "array",
           "items": {"$ref": "#/definitions/hash"},
           "title": "Hashes",
@@ -266,7 +270,7 @@
           "pattern": "^[-+a-z0-9.]+/[-+a-z0-9.]+$"
         },
         "bom-ref": {
-          "type": "string",
+          "$ref": "#/definitions/refType",
           "title": "BOM Reference",
           "description": "An optional identifier which can be used to reference the component elsewhere in the BOM. Every bom-ref should be unique."
         },
@@ -407,7 +411,7 @@
           "title": "External References"
         },
         "components": {
-          "$id": "#/properties/components",
+          "$id": "#/definitions/component/properties/components",
           "type": "array",
           "items": {"$ref": "#/definitions/component"},
           "uniqueItems": true,
@@ -833,7 +837,7 @@
           ]
         },
         "hashes": {
-          "$id": "#/properties/hashes",
+          "$id": "#/definitions/externalReference/properties/hashes",
           "type": "array",
           "items": {"$ref": "#/definitions/hash"},
           "title": "Hashes",
@@ -851,7 +855,7 @@
       "additionalProperties": false,
       "properties": {
         "ref": {
-          "type": "string",
+          "$ref": "#/definitions/refType",
           "title": "Reference",
           "description": "References a component by the components bom-ref attribute"
         },
@@ -859,7 +863,7 @@
           "type": "array",
           "uniqueItems": true,
           "items": {
-            "type": "string"
+            "$ref": "#/definitions/refType"
           },
           "title": "Depends On",
           "description": "The bom-ref identifiers of the components that are dependencies of this dependency object."
@@ -875,7 +879,7 @@
       "additionalProperties": false,
       "properties": {
         "bom-ref": {
-          "type": "string",
+          "$ref": "#/definitions/refType",
           "title": "BOM Reference",
           "description": "An optional identifier which can be used to reference the service elsewhere in the BOM. Every bom-ref should be unique."
         },
@@ -944,7 +948,7 @@
           "title": "External References"
         },
         "services": {
-          "$id": "#/properties/services",
+          "$id": "#/definitions/service/properties/services",
           "type": "array",
           "items": {"$ref": "#/definitions/service"},
           "uniqueItems": true,
diff --git a/cyclonedx/schema/_res/bom-1.3.SNAPSHOT.schema.json b/cyclonedx/schema/_res/bom-1.3.SNAPSHOT.schema.json
index 5ccecf893..a269ebd75 100644
--- a/cyclonedx/schema/_res/bom-1.3.SNAPSHOT.schema.json
+++ b/cyclonedx/schema/_res/bom-1.3.SNAPSHOT.schema.json
@@ -1,6 +1,6 @@
 {
   "$schema": "http://json-schema.org/draft-07/schema#",
-  "$id": "http://cyclonedx.org/schema/bom-1.3.schema.json",
+  "$id": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
   "type": "object",
   "title": "CycloneDX Software Bill-of-Material Specification",
   "$comment" : "CycloneDX JSON schema is published under the terms of the Apache License 2.0.",
@@ -86,6 +86,10 @@
     }
   },
   "definitions": {
+    "refType": {
+      "$comment": "Identifier-DataType for interlinked elements.",
+      "type": "string"
+    },
     "metadata": {
       "type": "object",
       "title": "BOM Metadata Object",
@@ -157,7 +161,7 @@
           "description": "The date and time (timestamp) when the document was created."
         },
         "hashes": {
-          "$id": "#/properties/hashes",
+          "$id": "#/definitions/tool/properties/hashes",
           "type": "array",
           "items": {"$ref": "#/definitions/hash"},
           "title": "Hashes",
@@ -254,7 +258,7 @@
           "pattern": "^[-+a-z0-9.]+/[-+a-z0-9.]+$"
         },
         "bom-ref": {
-          "type": "string",
+          "$ref": "#/definitions/refType",
           "title": "BOM Reference",
           "description": "An optional identifier which can be used to reference the component elsewhere in the BOM. Every bom-ref should be unique."
         },
@@ -394,7 +398,7 @@
           "title": "External References"
         },
         "components": {
-          "$id": "#/properties/components",
+          "$id": "#/definitions/component/properties/components",
           "type": "array",
           "items": {"$ref": "#/definitions/component"},
           "uniqueItems": true,
@@ -808,7 +812,7 @@
           ]
         },
         "hashes": {
-          "$id": "#/properties/hashes",
+          "$id": "#/definitions/externalReference/properties/hashes",
           "type": "array",
           "items": {"$ref": "#/definitions/hash"},
           "title": "Hashes",
@@ -825,7 +829,7 @@
       ],
       "properties": {
         "ref": {
-          "type": "string",
+          "$ref": "#/definitions/refType",
           "title": "Reference",
           "description": "References a component by the components bom-ref attribute"
         },
@@ -833,7 +837,7 @@
           "type": "array",
           "uniqueItems": true,
           "items": {
-            "type": "string"
+            "$ref": "#/definitions/refType"
           },
           "title": "Depends On",
           "description": "The bom-ref identifiers of the components that are dependencies of this dependency object."
@@ -848,7 +852,7 @@
       ],
       "properties": {
         "bom-ref": {
-          "type": "string",
+          "$ref": "#/definitions/refType",
           "title": "BOM Reference",
           "description": "An optional identifier which can be used to reference the service elsewhere in the BOM. Every bom-ref should be unique."
         },
@@ -917,7 +921,7 @@
           "title": "External References"
         },
         "services": {
-          "$id": "#/properties/services",
+          "$id": "#/definitions/service/properties/services",
           "type": "array",
           "items": {"$ref": "#/definitions/service"},
           "uniqueItems": true,
diff --git a/cyclonedx/schema/_res/bom-1.3.SNAPSHOT.xsd b/cyclonedx/schema/_res/bom-1.3.SNAPSHOT.xsd
index 0c411a3e3..150de4449 100644
--- a/cyclonedx/schema/_res/bom-1.3.SNAPSHOT.xsd
+++ b/cyclonedx/schema/_res/bom-1.3.SNAPSHOT.xsd
@@ -22,7 +22,7 @@ limitations under the License.
            targetNamespace="http://cyclonedx.org/schema/bom/1.3"
            vc:minVersion="1.0"
            vc:maxVersion="1.1"
-           version="1.3">
+           version="1.3.1">
 
     <xs:import namespace="http://cyclonedx.org/schema/spdx" schemaLocation="spdx.SNAPSHOT.xsd"/>
 
@@ -35,6 +35,13 @@ limitations under the License.
         </xs:documentation>
     </xs:annotation>
 
+    <xs:simpleType name="refType">
+        <xs:annotation>
+            <xs:documentation>Identifier-DataType for interlinked elements.</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:string" />
+    </xs:simpleType>
+
     <xs:complexType name="metadata">
         <xs:sequence minOccurs="0" maxOccurs="1">
             <xs:element name="timestamp" type="xs:dateTime" minOccurs="0">
@@ -400,7 +407,7 @@ limitations under the License.
                 </xs:documentation>
             </xs:annotation>
         </xs:attribute>
-        <xs:attribute name="bom-ref" type="xs:string">
+        <xs:attribute name="bom-ref" type="bom:refType">
             <xs:annotation>
                 <xs:documentation>
                     An optional identifier which can be used to reference the component elsewhere in the BOM.
@@ -555,7 +562,9 @@ limitations under the License.
                     <xs:documentation>A hardware device such as a processor, or chip-set. A hardware device
                         containing firmware should include a component for the physical hardware itself, and another
                         component of type 'firmware' or 'operating-system' (whichever is relevant), describing
-                        information about the software running on the device.</xs:documentation>
+                        information about the software running on the device.
+                        See also the list of known device properties: https://github.com/CycloneDX/cyclonedx-property-taxonomy/blob/main/cdx/device.md
+                    </xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="firmware">
@@ -598,7 +607,7 @@ limitations under the License.
 
     <xs:simpleType name="mimeType">
         <xs:restriction base="xs:token">
-            <xs:pattern value="^[-+a-z0-9.]+/[-+a-z0-9.]+$"/>
+            <xs:pattern value="[-+a-z0-9.]+/[-+a-z0-9.]+"/>
         </xs:restriction>
     </xs:simpleType>
 
@@ -1156,7 +1165,7 @@ limitations under the License.
         <xs:sequence minOccurs="0" maxOccurs="unbounded">
             <xs:element name="dependency" type="bom:dependencyType"/>
         </xs:sequence>
-        <xs:attribute name="ref" type="xs:string" use="required">
+        <xs:attribute name="ref" type="bom:refType" use="required">
             <xs:annotation>
                 <xs:documentation>References a component or service by the its bom-ref attribute</xs:documentation>
             </xs:annotation>
@@ -1309,7 +1318,7 @@ limitations under the License.
                 </xs:annotation>
             </xs:any>
         </xs:sequence>
-        <xs:attribute name="bom-ref" type="xs:string">
+        <xs:attribute name="bom-ref" type="bom:refType">
             <xs:annotation>
                 <xs:documentation>
                     An optional identifier which can be used to reference the service elsewhere in the BOM.
@@ -1502,7 +1511,7 @@ limitations under the License.
     </xs:simpleType>
 
     <xs:complexType name="bomReferenceType">
-        <xs:attribute name="ref" type="xs:string" use="required">
+        <xs:attribute name="ref" type="bom:refType" use="required">
             <xs:annotation>
                 <xs:documentation>References a component or service by the its bom-ref attribute</xs:documentation>
             </xs:annotation>
diff --git a/cyclonedx/schema/_res/bom-1.4.SNAPSHOT.schema.json b/cyclonedx/schema/_res/bom-1.4.SNAPSHOT.schema.json
index 83e27ceb4..1a8858104 100644
--- a/cyclonedx/schema/_res/bom-1.4.SNAPSHOT.schema.json
+++ b/cyclonedx/schema/_res/bom-1.4.SNAPSHOT.schema.json
@@ -281,7 +281,7 @@
             "file"
           ],
           "title": "Component Type",
-          "description": "Specifies the type of component. For software components, classify as application if no more specific appropriate classification is available or cannot be determined for the component. Types include:\n\n* __application__ = A software application. Refer to [https://en.wikipedia.org/wiki/Application_software](https://en.wikipedia.org/wiki/Application_software) for information about applications.\n* __framework__ = A software framework. Refer to [https://en.wikipedia.org/wiki/Software_framework](https://en.wikipedia.org/wiki/Software_framework) for information on how frameworks vary slightly from libraries.\n* __library__ = A software library. Refer to [https://en.wikipedia.org/wiki/Library_(computing)](https://en.wikipedia.org/wiki/Library_(computing))\n for information about libraries. All third-party and open source reusable components will likely be a library. If the library also has key features of a framework, then it should be classified as a framework. If not, or is unknown, then specifying library is RECOMMENDED.\n* __container__ = A packaging and/or runtime format, not specific to any particular technology, which isolates software inside the container from software outside of a container through virtualization technology. Refer to [https://en.wikipedia.org/wiki/OS-level_virtualization](https://en.wikipedia.org/wiki/OS-level_virtualization)\n* __operating-system__ = A software operating system without regard to deployment model (i.e. installed on physical hardware, virtual machine, image, etc) Refer to [https://en.wikipedia.org/wiki/Operating_system](https://en.wikipedia.org/wiki/Operating_system)\n* __device__ = A hardware device such as a processor, or chip-set. A hardware device containing firmware SHOULD include a component for the physical hardware itself, and another component of type 'firmware' or 'operating-system' (whichever is relevant), describing information about the software running on the device.\n* __firmware__ = A special type of software that provides low-level control over a devices hardware. Refer to [https://en.wikipedia.org/wiki/Firmware](https://en.wikipedia.org/wiki/Firmware)\n* __file__ = A computer file. Refer to [https://en.wikipedia.org/wiki/Computer_file](https://en.wikipedia.org/wiki/Computer_file) for information about files.",
+          "description": "Specifies the type of component. For software components, classify as application if no more specific appropriate classification is available or cannot be determined for the component. Types include:\n\n* __application__ = A software application. Refer to [https://en.wikipedia.org/wiki/Application_software](https://en.wikipedia.org/wiki/Application_software) for information about applications.\n* __framework__ = A software framework. Refer to [https://en.wikipedia.org/wiki/Software_framework](https://en.wikipedia.org/wiki/Software_framework) for information on how frameworks vary slightly from libraries.\n* __library__ = A software library. Refer to [https://en.wikipedia.org/wiki/Library_(computing)](https://en.wikipedia.org/wiki/Library_(computing))\n for information about libraries. All third-party and open source reusable components will likely be a library. If the library also has key features of a framework, then it should be classified as a framework. If not, or is unknown, then specifying library is RECOMMENDED.\n* __container__ = A packaging and/or runtime format, not specific to any particular technology, which isolates software inside the container from software outside of a container through virtualization technology. Refer to [https://en.wikipedia.org/wiki/OS-level_virtualization](https://en.wikipedia.org/wiki/OS-level_virtualization)\n* __operating-system__ = A software operating system without regard to deployment model (i.e. installed on physical hardware, virtual machine, image, etc) Refer to [https://en.wikipedia.org/wiki/Operating_system](https://en.wikipedia.org/wiki/Operating_system)\n* __device__ = A hardware device such as a processor, or chip-set. A hardware device containing firmware SHOULD include a component for the physical hardware itself, and another component of type 'firmware' or 'operating-system' (whichever is relevant), describing information about the software running on the device.\n  See also the list of [known device properties](https://github.com/CycloneDX/cyclonedx-property-taxonomy/blob/main/cdx/device.md).\n* __firmware__ = A special type of software that provides low-level control over a devices hardware. Refer to [https://en.wikipedia.org/wiki/Firmware](https://en.wikipedia.org/wiki/Firmware)\n* __file__ = A computer file. Refer to [https://en.wikipedia.org/wiki/Computer_file](https://en.wikipedia.org/wiki/Computer_file) for information about files.",
           "examples": ["library"]
         },
         "mime-type": {
@@ -1487,7 +1487,7 @@
           "type": "array",
           "title": "CWEs",
           "description": "List of Common Weaknesses Enumerations (CWEs) codes that describes this vulnerability. For example 399 (of https://cwe.mitre.org/data/definitions/399.html)",
-          "examples": ["399"],
+          "examples": [399],
           "additionalItems": false,
           "items": {
             "$ref": "#/definitions/cwe"
@@ -1640,7 +1640,7 @@
                     },
                     "range": {
                       "description": "A version range specified in Package URL Version Range syntax (vers) which is defined at https://github.com/package-url/purl-spec/VERSION-RANGE-SPEC.rst",
-                      "$ref": "#/definitions/version"
+                      "$ref": "#/definitions/range"
                     },
                     "status": {
                       "description": "The vulnerability status for the version or range of versions.",
diff --git a/cyclonedx/schema/_res/bom-1.4.SNAPSHOT.xsd b/cyclonedx/schema/_res/bom-1.4.SNAPSHOT.xsd
index 27c68fb91..4b3b250d4 100644
--- a/cyclonedx/schema/_res/bom-1.4.SNAPSHOT.xsd
+++ b/cyclonedx/schema/_res/bom-1.4.SNAPSHOT.xsd
@@ -22,7 +22,7 @@ limitations under the License.
            targetNamespace="http://cyclonedx.org/schema/bom/1.4"
            vc:minVersion="1.0"
            vc:maxVersion="1.1"
-           version="1.4">
+           version="1.4.2">
 
     <xs:import namespace="http://cyclonedx.org/schema/spdx" schemaLocation="spdx.SNAPSHOT.xsd"/>
 
@@ -577,7 +577,9 @@ limitations under the License.
                     <xs:documentation>A hardware device such as a processor, or chip-set. A hardware device
                         containing firmware SHOULD include a component for the physical hardware itself, and another
                         component of type 'firmware' or 'operating-system' (whichever is relevant), describing
-                        information about the software running on the device.</xs:documentation>
+                        information about the software running on the device.
+                        See also the list of known device properties: https://github.com/CycloneDX/cyclonedx-property-taxonomy/blob/main/cdx/device.md
+                    </xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="firmware">
@@ -620,7 +622,7 @@ limitations under the License.
 
     <xs:simpleType name="mimeType">
         <xs:restriction base="xs:token">
-            <xs:pattern value="^[-+a-z0-9.]+/[-+a-z0-9.]+$"/>
+            <xs:pattern value="[-+a-z0-9.]+/[-+a-z0-9.]+"/>
         </xs:restriction>
     </xs:simpleType>
 
@@ -1969,7 +1971,7 @@ limitations under the License.
                         <xs:element name="target">
                             <xs:complexType>
                                 <xs:sequence minOccurs="0" maxOccurs="1">
-                                    <xs:element name="ref" minOccurs="1" maxOccurs="1">
+                                    <xs:element name="ref" type="bom:refType" minOccurs="1" maxOccurs="1">
                                         <xs:annotation>
                                             <xs:documentation>References a component or service by the objects bom-ref.</xs:documentation>
                                         </xs:annotation>
@@ -2014,6 +2016,16 @@ limitations under the License.
                     </xs:sequence>
                 </xs:complexType>
             </xs:element>
+            <xs:element name="properties" type="bom:propertiesType" minOccurs="0" maxOccurs="1">
+                <xs:annotation>
+                    <xs:documentation>Provides the ability to document properties in a key/value store.
+                        This provides flexibility to include data not officially supported in the standard
+                        without having to use additional namespaces or create extensions. Property names
+                        of interest to the general public are encouraged to be registered in the
+                        CycloneDX Property Taxonomy - https://github.com/CycloneDX/cyclonedx-property-taxonomy.
+                        Formal registration is OPTIONAL.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
         </xs:sequence>
         <xs:attribute name="bom-ref" type="bom:refType">
             <xs:annotation>
diff --git a/cyclonedx/schema/_res/jsf-0.82.SNAPSHOT.schema.json b/cyclonedx/schema/_res/jsf-0.82.SNAPSHOT.schema.json
index 20f16f9c3..f46bfb1e5 100644
--- a/cyclonedx/schema/_res/jsf-0.82.SNAPSHOT.schema.json
+++ b/cyclonedx/schema/_res/jsf-0.82.SNAPSHOT.schema.json
@@ -16,7 +16,6 @@
               "type": "array",
               "title": "Signature",
               "description": "Unique top level property for Multiple Signatures. (multisignature)",
-              "additionalItems": false,
               "items": {"$ref": "#/definitions/signer"}
             }
           }
@@ -28,7 +27,6 @@
               "type": "array",
               "title": "Signature",
               "description": "Unique top level property for Signature Chains. (signaturechain)",
-              "additionalItems": false,
               "items": {"$ref": "#/definitions/signer"}
             }
           }
@@ -94,7 +92,6 @@
           "type": "array",
           "title": "Certificate path",
           "description": "Optional. Sorted array of X.509 [RFC5280] certificates, where the first element must contain the signature certificate. The certificate path must be contiguous but is not required to be complete.",
-          "additionalItems": false,
           "items": {
             "type": "string"
           }
@@ -103,7 +100,6 @@
           "type": "array",
           "title": "Excludes",
           "description": "Optional. Array holding the names of one or more application level properties that must be excluded from the signature process. Note that the \"excludes\" property itself, must also be excluded from the signature process. Since both the \"excludes\" property and the associated data it points to are unsigned, a conforming JSF implementation must provide options for specifying which properties to accept.",
-          "additionalItems": false,
           "items": {
             "type": "string"
           }
diff --git a/cyclonedx/schema/_res/spdx.SNAPSHOT.schema.json b/cyclonedx/schema/_res/spdx.SNAPSHOT.schema.json
index af6d696d5..f04d013c7 100644
--- a/cyclonedx/schema/_res/spdx.SNAPSHOT.schema.json
+++ b/cyclonedx/schema/_res/spdx.SNAPSHOT.schema.json
@@ -1,337 +1,422 @@
 {
   "$schema": "http://json-schema.org/draft-07/schema#",
   "$id": "http://cyclonedx.org/schema/spdx.schema.json",
-  "$comment": "v1.0-3.12",
+  "$comment": "v1.0-3.21",
   "type": "string",
   "enum": [
-    "AFL-2.0",
+    "0BSD",
     "AAL",
+    "Abstyles",
+    "AdaCore-doc",
     "Adobe-2006",
-    "AFL-3.0",
+    "Adobe-Glyph",
     "ADSL",
-    "0BSD",
-    "Afmparse",
+    "AFL-1.1",
     "AFL-1.2",
-    "AGPL-1.0-or-later",
+    "AFL-2.0",
     "AFL-2.1",
-    "AFL-1.1",
+    "AFL-3.0",
+    "Afmparse",
     "AGPL-1.0",
-    "Adobe-Glyph",
-    "AMDPLPA",
+    "AGPL-1.0-only",
+    "AGPL-1.0-or-later",
+    "AGPL-3.0",
+    "AGPL-3.0-only",
+    "AGPL-3.0-or-later",
     "Aladdin",
-    "ANTLR-PD",
+    "AMDPLPA",
     "AML",
-    "Apache-1.0",
+    "AMPAS",
+    "ANTLR-PD",
     "ANTLR-PD-fallback",
-    "Abstyles",
-    "AGPL-1.0-only",
+    "Apache-1.0",
+    "Apache-1.1",
+    "Apache-2.0",
     "APAFML",
+    "APL-1.0",
+    "App-s2p",
     "APSL-1.0",
     "APSL-1.1",
+    "APSL-1.2",
     "APSL-2.0",
-    "AGPL-3.0-only",
-    "Apache-1.1",
-    "Apache-2.0",
-    "APL-1.0",
-    "Bahyph",
+    "Arphic-1999",
     "Artistic-1.0",
-    "AMPAS",
+    "Artistic-1.0-cl8",
+    "Artistic-1.0-Perl",
+    "Artistic-2.0",
+    "ASWF-Digital-Assets-1.0",
+    "ASWF-Digital-Assets-1.1",
+    "Baekmuk",
+    "Bahyph",
     "Barr",
-    "AGPL-3.0-or-later",
-    "BlueOak-1.0.0",
     "Beerware",
-    "Artistic-1.0-cl8",
+    "Bitstream-Charter",
+    "Bitstream-Vera",
+    "BitTorrent-1.0",
+    "BitTorrent-1.1",
     "blessing",
+    "BlueOak-1.0.0",
+    "Boehm-GC",
     "Borceux",
-    "BSD-2-Clause-NetBSD",
+    "Brian-Gladman-3-Clause",
     "BSD-1-Clause",
-    "BSD-2-Clause-Patent",
-    "BitTorrent-1.0",
+    "BSD-2-Clause",
     "BSD-2-Clause-FreeBSD",
+    "BSD-2-Clause-NetBSD",
+    "BSD-2-Clause-Patent",
+    "BSD-2-Clause-Views",
+    "BSD-3-Clause",
     "BSD-3-Clause-Attribution",
-    "BSD-2-Clause",
-    "APSL-1.2",
+    "BSD-3-Clause-Clear",
     "BSD-3-Clause-LBNL",
-    "Artistic-2.0",
-    "BSD-3-Clause-No-Nuclear-License-2014",
     "BSD-3-Clause-Modification",
-    "BSD-4-Clause-Shortened",
-    "BSD-3-Clause",
-    "BSD-3-Clause-Open-MPI",
-    "BitTorrent-1.1",
+    "BSD-3-Clause-No-Military-License",
+    "BSD-3-Clause-No-Nuclear-License",
+    "BSD-3-Clause-No-Nuclear-License-2014",
     "BSD-3-Clause-No-Nuclear-Warranty",
-    "BSD-Source-Code",
+    "BSD-3-Clause-Open-MPI",
+    "BSD-4-Clause",
+    "BSD-4-Clause-Shortened",
+    "BSD-4-Clause-UC",
+    "BSD-4.3RENO",
+    "BSD-4.3TAHOE",
+    "BSD-Advertising-Acknowledgement",
+    "BSD-Attribution-HPND-disclaimer",
     "BSD-Protection",
-    "AGPL-3.0",
-    "BUSL-1.1",
-    "Artistic-1.0-Perl",
+    "BSD-Source-Code",
     "BSL-1.0",
-    "BSD-2-Clause-Views",
-    "CAL-1.0-Combined-Work-Exception",
-    "CATOSL-1.1",
+    "BUSL-1.1",
     "bzip2-1.0.5",
     "bzip2-1.0.6",
+    "C-UDA-1.0",
+    "CAL-1.0",
+    "CAL-1.0-Combined-Work-Exception",
+    "Caldera",
+    "CATOSL-1.1",
+    "CC-BY-1.0",
+    "CC-BY-2.0",
     "CC-BY-2.5",
+    "CC-BY-2.5-AU",
+    "CC-BY-3.0",
     "CC-BY-3.0-AT",
-    "C-UDA-1.0",
+    "CC-BY-3.0-DE",
+    "CC-BY-3.0-IGO",
+    "CC-BY-3.0-NL",
     "CC-BY-3.0-US",
-    "CC-BY-1.0",
+    "CC-BY-4.0",
     "CC-BY-NC-1.0",
     "CC-BY-NC-2.0",
     "CC-BY-NC-2.5",
-    "CC-BY-2.0",
+    "CC-BY-NC-3.0",
+    "CC-BY-NC-3.0-DE",
     "CC-BY-NC-4.0",
     "CC-BY-NC-ND-1.0",
     "CC-BY-NC-ND-2.0",
-    "CC-BY-NC-3.0",
-    "CC-BY-NC-ND-3.0-IGO",
+    "CC-BY-NC-ND-2.5",
     "CC-BY-NC-ND-3.0",
-    "BSD-3-Clause-No-Nuclear-License",
+    "CC-BY-NC-ND-3.0-DE",
+    "CC-BY-NC-ND-3.0-IGO",
     "CC-BY-NC-ND-4.0",
+    "CC-BY-NC-SA-1.0",
     "CC-BY-NC-SA-2.0",
+    "CC-BY-NC-SA-2.0-DE",
+    "CC-BY-NC-SA-2.0-FR",
+    "CC-BY-NC-SA-2.0-UK",
     "CC-BY-NC-SA-2.5",
     "CC-BY-NC-SA-3.0",
+    "CC-BY-NC-SA-3.0-DE",
+    "CC-BY-NC-SA-3.0-IGO",
     "CC-BY-NC-SA-4.0",
     "CC-BY-ND-1.0",
-    "BSD-3-Clause-Clear",
+    "CC-BY-ND-2.0",
     "CC-BY-ND-2.5",
     "CC-BY-ND-3.0",
+    "CC-BY-ND-3.0-DE",
     "CC-BY-ND-4.0",
     "CC-BY-SA-1.0",
-    "CC-BY-SA-2.0-UK",
     "CC-BY-SA-2.0",
+    "CC-BY-SA-2.0-UK",
     "CC-BY-SA-2.1-JP",
-    "CC-BY-ND-2.0",
-    "CC-BY-SA-3.0-AT",
+    "CC-BY-SA-2.5",
     "CC-BY-SA-3.0",
+    "CC-BY-SA-3.0-AT",
+    "CC-BY-SA-3.0-DE",
+    "CC-BY-SA-3.0-IGO",
     "CC-BY-SA-4.0",
-    "CC-BY-SA-2.5",
-    "CC-BY-3.0",
-    "CDDL-1.0",
-    "CC0-1.0",
-    "CC-BY-NC-ND-2.5",
-    "CC-BY-NC-SA-1.0",
-    "Caldera",
-    "CDLA-Permissive-1.0",
-    "CC-BY-4.0",
     "CC-PDDC",
-    "BSD-4-Clause-UC",
-    "BSD-4-Clause",
-    "CAL-1.0",
+    "CC0-1.0",
+    "CDDL-1.0",
     "CDDL-1.1",
-    "CERN-OHL-1.2",
+    "CDL-1.0",
+    "CDLA-Permissive-1.0",
+    "CDLA-Permissive-2.0",
+    "CDLA-Sharing-1.0",
+    "CECILL-1.0",
+    "CECILL-1.1",
+    "CECILL-2.0",
+    "CECILL-2.1",
+    "CECILL-B",
+    "CECILL-C",
     "CERN-OHL-1.1",
+    "CERN-OHL-1.2",
     "CERN-OHL-P-2.0",
     "CERN-OHL-S-2.0",
-    "CECILL-1.1",
-    "CECILL-2.0",
-    "CECILL-1.0",
+    "CERN-OHL-W-2.0",
+    "CFITSIO",
+    "checkmk",
+    "ClArtistic",
+    "Clips",
+    "CMU-Mach",
+    "CNRI-Jython",
     "CNRI-Python",
     "CNRI-Python-GPL-Compatible",
+    "COIL-1.0",
+    "Community-Spec-1.0",
+    "Condor-1.1",
     "copyleft-next-0.3.0",
-    "CPAL-1.0",
     "copyleft-next-0.3.1",
+    "Cornell-Lossless-JPEG",
+    "CPAL-1.0",
     "CPL-1.0",
-    "ClArtistic",
-    "CECILL-C",
-    "CNRI-Jython",
-    "Condor-1.1",
     "CPOL-1.02",
+    "Crossword",
+    "CrystalStacker",
+    "CUA-OPL-1.0",
+    "Cube",
     "curl",
+    "D-FSL-1.0",
     "diffmark",
-    "Crossword",
-    "Dotseqn",
+    "DL-DE-BY-2.0",
     "DOC",
-    "DSDP",
+    "Dotseqn",
     "DRL-1.0",
+    "DSDP",
+    "dtoa",
+    "dvipdfm",
     "ECL-1.0",
     "ECL-2.0",
     "eCos-2.0",
-    "CrystalStacker",
-    "CERN-OHL-W-2.0",
-    "D-FSL-1.0",
+    "EFL-1.0",
+    "EFL-2.0",
     "eGenix",
-    "EPICS",
+    "Elastic-2.0",
     "Entessa",
+    "EPICS",
     "EPL-1.0",
-    "EFL-2.0",
-    "CUA-OPL-1.0",
-    "etalab-2.0",
-    "EUPL-1.0",
+    "EPL-2.0",
     "ErlPL-1.1",
+    "etalab-2.0",
     "EUDatagrid",
+    "EUPL-1.0",
     "EUPL-1.1",
-    "Cube",
-    "dvipdfm",
-    "FreeBSD-DOC",
+    "EUPL-1.2",
     "Eurosym",
-    "FSFAP",
+    "Fair",
+    "FDK-AAC",
+    "Frameworx-1.0",
+    "FreeBSD-DOC",
     "FreeImage",
-    "FSFULLR",
+    "FSFAP",
     "FSFUL",
+    "FSFULLR",
+    "FSFULLRWD",
+    "FTL",
     "GD",
+    "GFDL-1.1",
     "GFDL-1.1-invariants-only",
-    "EUPL-1.2",
-    "EPL-2.0",
+    "GFDL-1.1-invariants-or-later",
+    "GFDL-1.1-no-invariants-only",
     "GFDL-1.1-no-invariants-or-later",
     "GFDL-1.1-only",
     "GFDL-1.1-or-later",
-    "GFDL-1.1",
-    "FTL",
-    "GFDL-1.2-invariants-or-later",
-    "GFDL-1.1-invariants-or-later",
+    "GFDL-1.2",
     "GFDL-1.2-invariants-only",
+    "GFDL-1.2-invariants-or-later",
+    "GFDL-1.2-no-invariants-only",
+    "GFDL-1.2-no-invariants-or-later",
     "GFDL-1.2-only",
     "GFDL-1.2-or-later",
-    "GFDL-1.2",
-    "GFDL-1.2-no-invariants-only",
+    "GFDL-1.3",
     "GFDL-1.3-invariants-only",
-    "GFDL-1.3-no-invariants-only",
     "GFDL-1.3-invariants-or-later",
-    "GFDL-1.2-no-invariants-or-later",
-    "Fair",
-    "Frameworx-1.0",
+    "GFDL-1.3-no-invariants-only",
+    "GFDL-1.3-no-invariants-or-later",
+    "GFDL-1.3-only",
+    "GFDL-1.3-or-later",
     "Giftware",
-    "GFDL-1.1-no-invariants-only",
     "GL2PS",
-    "Glulxe",
     "Glide",
-    "gnuplot",
+    "Glulxe",
     "GLWTPL",
+    "gnuplot",
+    "GPL-1.0",
+    "GPL-1.0+",
     "GPL-1.0-only",
     "GPL-1.0-or-later",
-    "GPL-1.0",
-    "GFDL-1.3-only",
+    "GPL-2.0",
+    "GPL-2.0+",
     "GPL-2.0-only",
     "GPL-2.0-or-later",
     "GPL-2.0-with-autoconf-exception",
-    "GPL-2.0+",
-    "GFDL-1.3",
-    "GPL-1.0+",
-    "CDLA-Sharing-1.0",
-    "GPL-2.0-with-classpath-exception",
-    "GPL-2.0-with-GCC-exception",
     "GPL-2.0-with-bison-exception",
+    "GPL-2.0-with-classpath-exception",
     "GPL-2.0-with-font-exception",
-    "GPL-2.0",
-    "CECILL-2.1",
+    "GPL-2.0-with-GCC-exception",
     "GPL-3.0",
     "GPL-3.0+",
-    "GPL-3.0-with-autoconf-exception",
     "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "GPL-3.0-with-autoconf-exception",
+    "GPL-3.0-with-GCC-exception",
+    "Graphics-Gems",
+    "gSOAP-1.3b",
+    "HaskellReport",
     "Hippocratic-2.1",
+    "HP-1986",
     "HPND",
+    "HPND-export-US",
+    "HPND-Markus-Kuhn",
+    "HPND-sell-variant",
+    "HPND-sell-variant-MIT-disclaimer",
     "HTMLTIDY",
-    "GPL-3.0-with-GCC-exception",
-    "HaskellReport",
-    "GPL-3.0-or-later",
+    "IBM-pibs",
     "ICU",
+    "IEC-Code-Components-EULA",
+    "IJG",
+    "IJG-short",
     "ImageMagick",
     "iMatix",
-    "IBM-pibs",
-    "Intel-ACPI",
-    "Intel",
+    "Imlib2",
     "Info-ZIP",
+    "Inner-Net-2.0",
+    "Intel",
+    "Intel-ACPI",
+    "Interbase-1.0",
     "IPA",
-    "IJG",
+    "IPL-1.0",
     "ISC",
+    "Jam",
     "JasPer-2.0",
+    "JPL-image",
     "JPNIC",
     "JSON",
+    "Kazlib",
+    "Knuth-CTAN",
     "LAL-1.2",
     "LAL-1.3",
     "Latex2e",
+    "Latex2e-translated-notice",
     "Leptonica",
-    "HPND-sell-variant",
+    "LGPL-2.0",
+    "LGPL-2.0+",
     "LGPL-2.0-only",
     "LGPL-2.0-or-later",
-    "Imlib2",
-    "IPL-1.0",
+    "LGPL-2.1",
+    "LGPL-2.1+",
     "LGPL-2.1-only",
     "LGPL-2.1-or-later",
-    "LGPL-2.0+",
-    "LGPL-2.0",
-    "CECILL-B",
-    "LGPL-3.0-or-later",
+    "LGPL-3.0",
+    "LGPL-3.0+",
     "LGPL-3.0-only",
+    "LGPL-3.0-or-later",
     "LGPLLR",
-    "libpng-2.0",
     "Libpng",
+    "libpng-2.0",
     "libselinux-1.0",
-    "LGPL-3.0+",
-    "EFL-1.0",
     "libtiff",
-    "GFDL-1.3-no-invariants-or-later",
-    "LiLiQ-Rplus-1.1",
-    "LiLiQ-R-1.1",
-    "LPL-1.0",
+    "libutil-David-Nugent",
     "LiLiQ-P-1.1",
+    "LiLiQ-R-1.1",
+    "LiLiQ-Rplus-1.1",
+    "Linux-man-pages-1-para",
+    "Linux-man-pages-copyleft",
+    "Linux-man-pages-copyleft-2-para",
+    "Linux-man-pages-copyleft-var",
     "Linux-OpenIB",
+    "LOOP",
+    "LPL-1.0",
+    "LPL-1.02",
     "LPPL-1.0",
+    "LPPL-1.1",
     "LPPL-1.2",
     "LPPL-1.3a",
-    "LPL-1.02",
     "LPPL-1.3c",
+    "LZMA-SDK-9.11-to-9.20",
+    "LZMA-SDK-9.22",
     "MakeIndex",
-    "LGPL-2.1+",
-    "LPPL-1.1",
-    "MIT-CMU",
+    "Martin-Birgmeier",
+    "metamail",
+    "Minpack",
     "MirOS",
-    "MIT-advertising",
-    "MIT-Modern-Variant",
     "MIT",
+    "MIT-0",
+    "MIT-advertising",
+    "MIT-CMU",
     "MIT-enna",
-    "MIT-open-group",
     "MIT-feh",
+    "MIT-Festival",
+    "MIT-Modern-Variant",
+    "MIT-open-group",
+    "MIT-Wu",
     "MITNFA",
-    "MPL-1.0",
+    "Motosoto",
+    "mpi-permissive",
     "mpich2",
+    "MPL-1.0",
+    "MPL-1.1",
     "MPL-2.0",
     "MPL-2.0-no-copyleft-exception",
+    "mplus",
+    "MS-LPL",
+    "MS-PL",
     "MS-RL",
     "MTLL",
-    "MPL-1.1",
+    "MulanPSL-1.0",
     "MulanPSL-2.0",
-    "Motosoto",
+    "Multics",
     "Mup",
-    "MulanPSL-1.0",
     "NAIST-2003",
+    "NASA-1.3",
     "Naumen",
-    "Multics",
     "NBPL-1.0",
+    "NCGL-UK-2.0",
     "NCSA",
     "Net-SNMP",
     "NetCDF",
-    "NASA-1.3",
+    "Newsletr",
     "NGPL",
-    "NIST-PD-fallback",
+    "NICTA-1.0",
     "NIST-PD",
-    "Newsletr",
+    "NIST-PD-fallback",
+    "NIST-Software",
+    "NLOD-1.0",
+    "NLOD-2.0",
     "NLPL",
     "Nokia",
     "NOSL",
     "Noweb",
-    "NLOD-1.0",
     "NPL-1.0",
-    "NCGL-UK-2.0",
+    "NPL-1.1",
+    "NPOSL-3.0",
     "NRL",
-    "NTP-0",
     "NTP",
-    "GFDL-1.3-or-later",
+    "NTP-0",
     "Nunit",
     "O-UDA-1.0",
-    "NPL-1.1",
     "OCCT-PL",
+    "OCLC-2.0",
+    "ODbL-1.0",
     "ODC-By-1.0",
+    "OFFIS",
+    "OFL-1.0",
     "OFL-1.0-no-RFN",
-    "OCLC-2.0",
     "OFL-1.0-RFN",
-    "OFL-1.0",
+    "OFL-1.1",
     "OFL-1.1-no-RFN",
     "OFL-1.1-RFN",
-    "OFL-1.1",
-    "OGDL-Taiwan-1.0",
     "OGC-1.0",
+    "OGDL-Taiwan-1.0",
+    "OGL-Canada-2.0",
     "OGL-UK-1.0",
     "OGL-UK-2.0",
     "OGL-UK-3.0",
@@ -339,106 +424,129 @@
     "OLDAP-1.1",
     "OLDAP-1.2",
     "OLDAP-1.3",
-    "OGL-Canada-2.0",
-    "OLDAP-2.0.1",
+    "OLDAP-1.4",
     "OLDAP-2.0",
+    "OLDAP-2.0.1",
     "OLDAP-2.1",
+    "OLDAP-2.2",
     "OLDAP-2.2.1",
     "OLDAP-2.2.2",
-    "OLDAP-2.2",
-    "ODbL-1.0",
-    "OLDAP-2.4",
-    "OLDAP-1.4",
     "OLDAP-2.3",
+    "OLDAP-2.4",
+    "OLDAP-2.5",
+    "OLDAP-2.6",
     "OLDAP-2.7",
     "OLDAP-2.8",
+    "OLFL-1.3",
     "OML",
+    "OpenPBS-2.3",
     "OpenSSL",
-    "OLDAP-2.6",
     "OPL-1.0",
+    "OPL-UK-3.0",
+    "OPUBL-1.0",
+    "OSET-PL-2.1",
     "OSL-1.0",
     "OSL-1.1",
     "OSL-2.0",
-    "OSET-PL-2.1",
     "OSL-2.1",
+    "OSL-3.0",
     "Parity-6.0.0",
     "Parity-7.0.0",
     "PDDL-1.0",
     "PHP-3.0",
-    "OSL-3.0",
+    "PHP-3.01",
     "Plexus",
-    "MS-PL",
-    "PolyForm-Small-Business-1.0.0",
     "PolyForm-Noncommercial-1.0.0",
+    "PolyForm-Small-Business-1.0.0",
+    "PostgreSQL",
     "PSF-2.0",
     "psfrag",
-    "PostgreSQL",
     "psutils",
+    "Python-2.0",
+    "Python-2.0.1",
     "Qhull",
     "QPL-1.0",
+    "QPL-1.0-INRIA-2004",
     "Rdisc",
-    "Python-2.0",
+    "RHeCos-1.1",
     "RPL-1.1",
     "RPL-1.5",
-    "RHeCos-1.1",
+    "RPSL-1.0",
     "RSA-MD",
     "RSCPL",
     "Ruby",
     "SAX-PD",
     "Saxpath",
     "SCEA",
-    "Sendmail-8.23",
+    "SchemeReport",
     "Sendmail",
+    "Sendmail-8.23",
     "SGI-B-1.0",
     "SGI-B-1.1",
     "SGI-B-2.0",
+    "SGP4",
     "SHL-0.5",
     "SHL-0.51",
     "SimPL-2.0",
-    "SISSL-1.2",
     "SISSL",
+    "SISSL-1.2",
     "Sleepycat",
     "SMLNJ",
     "SMPPL",
     "SNIA",
+    "snprintf",
     "Spencer-86",
     "Spencer-94",
     "Spencer-99",
     "SPL-1.0",
     "SSH-OpenSSH",
-    "PHP-3.01",
     "SSH-short",
-    "MIT-0",
-    "RPSL-1.0",
-    "SWL",
+    "SSPL-1.0",
+    "StandardML-NJ",
     "SugarCRM-1.1.3",
+    "SunPro",
+    "SWL",
+    "Symlinks",
+    "TAPR-OHL-1.0",
     "TCL",
     "TCP-wrappers",
-    "SSPL-1.0",
+    "TermReadKey",
     "TMate",
-    "TOSL",
     "TORQUE-1.1",
-    "TAPR-OHL-1.0",
+    "TOSL",
+    "TPDL",
+    "TPL-1.0",
+    "TTWL",
+    "TU-Berlin-1.0",
+    "TU-Berlin-2.0",
+    "UCAR",
     "UCL-1.0",
     "Unicode-DFS-2015",
     "Unicode-DFS-2016",
     "Unicode-TOU",
-    "TU-Berlin-1.0",
-    "UPL-1.0",
+    "UnixCrypt",
     "Unlicense",
-    "VOSTROM",
+    "UPL-1.0",
     "Vim",
+    "VOSTROM",
     "VSL-1.0",
-    "W3C-20150513",
     "W3C",
     "W3C-19980720",
-    "Wsuipa",
+    "W3C-20150513",
+    "w3m",
     "Watcom-1.0",
+    "Widget-Workshop",
+    "Wsuipa",
     "WTFPL",
+    "wxWindows",
     "X11",
+    "X11-distribute-modifications-variant",
+    "Xdebug-1.03",
     "Xerox",
+    "Xfig",
     "XFree86-1.1",
     "xinetd",
+    "xlock",
     "Xnet",
     "xpp",
     "XSkat",
@@ -446,29 +554,24 @@
     "YPL-1.1",
     "Zed",
     "Zend-2.0",
-    "TU-Berlin-2.0",
+    "Zimbra-1.3",
     "Zimbra-1.4",
-    "zlib-acknowledgement",
     "Zlib",
+    "zlib-acknowledgement",
     "ZPL-1.1",
     "ZPL-2.0",
     "ZPL-2.1",
-    "wxWindows",
-    "Zimbra-1.3",
-    "gSOAP-1.3b",
-    "Interbase-1.0",
-    "LGPL-2.1",
-    "LGPL-3.0",
-    "NPOSL-3.0",
-    "OLDAP-2.5",
-    "StandardML-NJ",
     "389-exception",
+    "Asterisk-exception",
     "Autoconf-exception-2.0",
     "Autoconf-exception-3.0",
+    "Autoconf-exception-generic",
+    "Autoconf-exception-macro",
     "Bison-exception-2.2",
     "Bootloader-exception",
     "Classpath-exception-2.0",
     "CLISP-exception-2.0",
+    "cryptsetup-OpenSSL-exception",
     "DigiRule-FOSS-exception",
     "eCos-exception-2.0",
     "Fawkes-Runtime-exception",
@@ -477,14 +580,21 @@
     "freertos-exception-2.0",
     "GCC-exception-2.0",
     "GCC-exception-3.1",
+    "GNAT-exception",
     "gnu-javamail-exception",
+    "GPL-3.0-interface-exception",
     "GPL-3.0-linking-exception",
     "GPL-3.0-linking-source-exception",
     "GPL-CC-1.0",
+    "GStreamer-exception-2005",
+    "GStreamer-exception-2008",
     "i2p-gpl-java-exception",
+    "KiCad-libraries-exception",
     "LGPL-3.0-linking-exception",
+    "libpri-OpenH323-exception",
     "Libtool-exception",
     "Linux-syscall-note",
+    "LLGPL",
     "LLVM-exception",
     "LZMA-exception",
     "mif-exception",
@@ -494,14 +604,18 @@
     "OpenJDK-assembly-exception-1.0",
     "openvpn-openssl-exception",
     "PS-or-PDF-font-exception-20170817",
+    "QPL-1.0-INRIA-2004-exception",
     "Qt-GPL-exception-1.0",
     "Qt-LGPL-exception-1.1",
     "Qwt-exception-1.0",
     "SHL-2.0",
     "SHL-2.1",
+    "SWI-exception",
     "Swift-exception",
     "u-boot-exception-2.0",
     "Universal-FOSS-exception-1.0",
-    "WxWindows-exception-3.1"
+    "vsftpd-openssl-exception",
+    "WxWindows-exception-3.1",
+    "x11vnc-openssl-exception"
   ]
 }
diff --git a/cyclonedx/schema/_res/spdx.SNAPSHOT.xsd b/cyclonedx/schema/_res/spdx.SNAPSHOT.xsd
index b45e2de06..5d086dbe1 100644
--- a/cyclonedx/schema/_res/spdx.SNAPSHOT.xsd
+++ b/cyclonedx/schema/_res/spdx.SNAPSHOT.xsd
@@ -2,14 +2,14 @@
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
            elementFormDefault="qualified"
            targetNamespace="http://cyclonedx.org/schema/spdx"
-           version="1.0-3.12">
+           version="1.0-3.21">
 
     <xs:simpleType name="licenseId">
         <xs:restriction base="xs:string">
             <!-- Licenses -->
-            <xs:enumeration value="AFL-2.0">
+            <xs:enumeration value="0BSD">
                 <xs:annotation>
-                    <xs:documentation>Academic Free License v2.0</xs:documentation>
+                    <xs:documentation>BSD Zero Clause License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="AAL">
@@ -17,14 +17,24 @@
                     <xs:documentation>Attribution Assurance License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="Abstyles">
+                <xs:annotation>
+                    <xs:documentation>Abstyles License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="AdaCore-doc">
+                <xs:annotation>
+                    <xs:documentation>AdaCore Doc License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="Adobe-2006">
                 <xs:annotation>
                     <xs:documentation>Adobe Systems Incorporated Source Code License Agreement</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AFL-3.0">
+            <xs:enumeration value="Adobe-Glyph">
                 <xs:annotation>
-                    <xs:documentation>Academic Free License v3.0</xs:documentation>
+                    <xs:documentation>Adobe Glyph List License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="ADSL">
@@ -32,14 +42,9 @@
                     <xs:documentation>Amazon Digital Services License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="0BSD">
-                <xs:annotation>
-                    <xs:documentation>BSD Zero Clause License</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="Afmparse">
+            <xs:enumeration value="AFL-1.1">
                 <xs:annotation>
-                    <xs:documentation>Afmparse License</xs:documentation>
+                    <xs:documentation>Academic Free License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="AFL-1.2">
@@ -47,9 +52,9 @@
                     <xs:documentation>Academic Free License v1.2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AGPL-1.0-or-later">
+            <xs:enumeration value="AFL-2.0">
                 <xs:annotation>
-                    <xs:documentation>Affero General Public License v1.0 or later</xs:documentation>
+                    <xs:documentation>Academic Free License v2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="AFL-2.1">
@@ -57,9 +62,14 @@
                     <xs:documentation>Academic Free License v2.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AFL-1.1">
+            <xs:enumeration value="AFL-3.0">
                 <xs:annotation>
-                    <xs:documentation>Academic Free License v1.1</xs:documentation>
+                    <xs:documentation>Academic Free License v3.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="Afmparse">
+                <xs:annotation>
+                    <xs:documentation>Afmparse License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="AGPL-1.0">
@@ -67,14 +77,29 @@
                     <xs:documentation>Affero General Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Adobe-Glyph">
+            <xs:enumeration value="AGPL-1.0-only">
                 <xs:annotation>
-                    <xs:documentation>Adobe Glyph List License</xs:documentation>
+                    <xs:documentation>Affero General Public License v1.0 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AMDPLPA">
+            <xs:enumeration value="AGPL-1.0-or-later">
                 <xs:annotation>
-                    <xs:documentation>AMD&apos;s plpa_map.c License</xs:documentation>
+                    <xs:documentation>Affero General Public License v1.0 or later</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="AGPL-3.0">
+                <xs:annotation>
+                    <xs:documentation>GNU Affero General Public License v3.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="AGPL-3.0-only">
+                <xs:annotation>
+                    <xs:documentation>GNU Affero General Public License v3.0 only</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="AGPL-3.0-or-later">
+                <xs:annotation>
+                    <xs:documentation>GNU Affero General Public License v3.0 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Aladdin">
@@ -82,9 +107,9 @@
                     <xs:documentation>Aladdin Free Public License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="ANTLR-PD">
+            <xs:enumeration value="AMDPLPA">
                 <xs:annotation>
-                    <xs:documentation>ANTLR Software Rights Notice</xs:documentation>
+                    <xs:documentation>AMD&apos;s plpa_map.c License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="AML">
@@ -92,9 +117,14 @@
                     <xs:documentation>Apple MIT License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Apache-1.0">
+            <xs:enumeration value="AMPAS">
                 <xs:annotation>
-                    <xs:documentation>Apache License 1.0</xs:documentation>
+                    <xs:documentation>Academy of Motion Picture Arts and Sciences BSD</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="ANTLR-PD">
+                <xs:annotation>
+                    <xs:documentation>ANTLR Software Rights Notice</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="ANTLR-PD-fallback">
@@ -102,14 +132,19 @@
                     <xs:documentation>ANTLR Software Rights Notice with license fallback</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Abstyles">
+            <xs:enumeration value="Apache-1.0">
                 <xs:annotation>
-                    <xs:documentation>Abstyles License</xs:documentation>
+                    <xs:documentation>Apache License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AGPL-1.0-only">
+            <xs:enumeration value="Apache-1.1">
                 <xs:annotation>
-                    <xs:documentation>Affero General Public License v1.0 only</xs:documentation>
+                    <xs:documentation>Apache License 1.1</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="Apache-2.0">
+                <xs:annotation>
+                    <xs:documentation>Apache License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="APAFML">
@@ -117,6 +152,16 @@
                     <xs:documentation>Adobe Postscript AFM License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="APL-1.0">
+                <xs:annotation>
+                    <xs:documentation>Adaptive Public License 1.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="App-s2p">
+                <xs:annotation>
+                    <xs:documentation>App::s2p License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="APSL-1.0">
                 <xs:annotation>
                     <xs:documentation>Apple Public Source License 1.0</xs:documentation>
@@ -127,59 +172,64 @@
                     <xs:documentation>Apple Public Source License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="APSL-1.2">
+                <xs:annotation>
+                    <xs:documentation>Apple Public Source License 1.2</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="APSL-2.0">
                 <xs:annotation>
                     <xs:documentation>Apple Public Source License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AGPL-3.0-only">
+            <xs:enumeration value="Arphic-1999">
                 <xs:annotation>
-                    <xs:documentation>GNU Affero General Public License v3.0 only</xs:documentation>
+                    <xs:documentation>Arphic Public License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Apache-1.1">
+            <xs:enumeration value="Artistic-1.0">
                 <xs:annotation>
-                    <xs:documentation>Apache License 1.1</xs:documentation>
+                    <xs:documentation>Artistic License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Apache-2.0">
+            <xs:enumeration value="Artistic-1.0-cl8">
                 <xs:annotation>
-                    <xs:documentation>Apache License 2.0</xs:documentation>
+                    <xs:documentation>Artistic License 1.0 w/clause 8</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="APL-1.0">
+            <xs:enumeration value="Artistic-1.0-Perl">
                 <xs:annotation>
-                    <xs:documentation>Adaptive Public License 1.0</xs:documentation>
+                    <xs:documentation>Artistic License 1.0 (Perl)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Bahyph">
+            <xs:enumeration value="Artistic-2.0">
                 <xs:annotation>
-                    <xs:documentation>Bahyph License</xs:documentation>
+                    <xs:documentation>Artistic License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Artistic-1.0">
+            <xs:enumeration value="ASWF-Digital-Assets-1.0">
                 <xs:annotation>
-                    <xs:documentation>Artistic License 1.0</xs:documentation>
+                    <xs:documentation>ASWF Digital Assets License version 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AMPAS">
+            <xs:enumeration value="ASWF-Digital-Assets-1.1">
                 <xs:annotation>
-                    <xs:documentation>Academy of Motion Picture Arts and Sciences BSD</xs:documentation>
+                    <xs:documentation>ASWF Digital Assets License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Barr">
+            <xs:enumeration value="Baekmuk">
                 <xs:annotation>
-                    <xs:documentation>Barr License</xs:documentation>
+                    <xs:documentation>Baekmuk License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AGPL-3.0-or-later">
+            <xs:enumeration value="Bahyph">
                 <xs:annotation>
-                    <xs:documentation>GNU Affero General Public License v3.0 or later</xs:documentation>
+                    <xs:documentation>Bahyph License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BlueOak-1.0.0">
+            <xs:enumeration value="Barr">
                 <xs:annotation>
-                    <xs:documentation>Blue Oak Model License 1.0.0</xs:documentation>
+                    <xs:documentation>Barr License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Beerware">
@@ -187,9 +237,24 @@
                     <xs:documentation>Beerware License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Artistic-1.0-cl8">
+            <xs:enumeration value="Bitstream-Charter">
                 <xs:annotation>
-                    <xs:documentation>Artistic License 1.0 w/clause 8</xs:documentation>
+                    <xs:documentation>Bitstream Charter Font License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="Bitstream-Vera">
+                <xs:annotation>
+                    <xs:documentation>Bitstream Vera Font License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="BitTorrent-1.0">
+                <xs:annotation>
+                    <xs:documentation>BitTorrent Open Source License v1.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="BitTorrent-1.1">
+                <xs:annotation>
+                    <xs:documentation>BitTorrent Open Source License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="blessing">
@@ -197,14 +262,24 @@
                     <xs:documentation>SQLite Blessing</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="BlueOak-1.0.0">
+                <xs:annotation>
+                    <xs:documentation>Blue Oak Model License 1.0.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="Boehm-GC">
+                <xs:annotation>
+                    <xs:documentation>Boehm-Demers-Weiser GC License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="Borceux">
                 <xs:annotation>
                     <xs:documentation>Borceux license</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-2-Clause-NetBSD">
+            <xs:enumeration value="Brian-Gladman-3-Clause">
                 <xs:annotation>
-                    <xs:documentation>BSD 2-Clause NetBSD License</xs:documentation>
+                    <xs:documentation>Brian Gladman 3-Clause License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="BSD-1-Clause">
@@ -212,19 +287,34 @@
                     <xs:documentation>BSD 1-Clause License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="BSD-2-Clause">
+                <xs:annotation>
+                    <xs:documentation>BSD 2-Clause &quot;Simplified&quot; License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="BSD-2-Clause-FreeBSD">
+                <xs:annotation>
+                    <xs:documentation>BSD 2-Clause FreeBSD License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="BSD-2-Clause-NetBSD">
+                <xs:annotation>
+                    <xs:documentation>BSD 2-Clause NetBSD License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="BSD-2-Clause-Patent">
                 <xs:annotation>
                     <xs:documentation>BSD-2-Clause Plus Patent License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BitTorrent-1.0">
+            <xs:enumeration value="BSD-2-Clause-Views">
                 <xs:annotation>
-                    <xs:documentation>BitTorrent Open Source License v1.0</xs:documentation>
+                    <xs:documentation>BSD 2-Clause with views sentence</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-2-Clause-FreeBSD">
+            <xs:enumeration value="BSD-3-Clause">
                 <xs:annotation>
-                    <xs:documentation>BSD 2-Clause FreeBSD License</xs:documentation>
+                    <xs:documentation>BSD 3-Clause &quot;New&quot; or &quot;Revised&quot; License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="BSD-3-Clause-Attribution">
@@ -232,24 +322,29 @@
                     <xs:documentation>BSD with attribution</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-2-Clause">
+            <xs:enumeration value="BSD-3-Clause-Clear">
                 <xs:annotation>
-                    <xs:documentation>BSD 2-Clause &quot;Simplified&quot; License</xs:documentation>
+                    <xs:documentation>BSD 3-Clause Clear License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="APSL-1.2">
+            <xs:enumeration value="BSD-3-Clause-LBNL">
                 <xs:annotation>
-                    <xs:documentation>Apple Public Source License 1.2</xs:documentation>
+                    <xs:documentation>Lawrence Berkeley National Labs BSD variant license</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-3-Clause-LBNL">
+            <xs:enumeration value="BSD-3-Clause-Modification">
                 <xs:annotation>
-                    <xs:documentation>Lawrence Berkeley National Labs BSD variant license</xs:documentation>
+                    <xs:documentation>BSD 3-Clause Modification</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Artistic-2.0">
+            <xs:enumeration value="BSD-3-Clause-No-Military-License">
                 <xs:annotation>
-                    <xs:documentation>Artistic License 2.0</xs:documentation>
+                    <xs:documentation>BSD 3-Clause No Military License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="BSD-3-Clause-No-Nuclear-License">
+                <xs:annotation>
+                    <xs:documentation>BSD 3-Clause No Nuclear License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="BSD-3-Clause-No-Nuclear-License-2014">
@@ -257,9 +352,19 @@
                     <xs:documentation>BSD 3-Clause No Nuclear License 2014</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-3-Clause-Modification">
+            <xs:enumeration value="BSD-3-Clause-No-Nuclear-Warranty">
                 <xs:annotation>
-                    <xs:documentation>BSD 3-Clause Modification</xs:documentation>
+                    <xs:documentation>BSD 3-Clause No Nuclear Warranty</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="BSD-3-Clause-Open-MPI">
+                <xs:annotation>
+                    <xs:documentation>BSD 3-Clause Open MPI variant</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="BSD-4-Clause">
+                <xs:annotation>
+                    <xs:documentation>BSD 4-Clause &quot;Original&quot; or &quot;Old&quot; License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="BSD-4-Clause-Shortened">
@@ -267,29 +372,29 @@
                     <xs:documentation>BSD 4 Clause Shortened</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-3-Clause">
+            <xs:enumeration value="BSD-4-Clause-UC">
                 <xs:annotation>
-                    <xs:documentation>BSD 3-Clause &quot;New&quot; or &quot;Revised&quot; License</xs:documentation>
+                    <xs:documentation>BSD-4-Clause (University of California-Specific)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-3-Clause-Open-MPI">
+            <xs:enumeration value="BSD-4.3RENO">
                 <xs:annotation>
-                    <xs:documentation>BSD 3-Clause Open MPI variant</xs:documentation>
+                    <xs:documentation>BSD 4.3 RENO License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BitTorrent-1.1">
+            <xs:enumeration value="BSD-4.3TAHOE">
                 <xs:annotation>
-                    <xs:documentation>BitTorrent Open Source License v1.1</xs:documentation>
+                    <xs:documentation>BSD 4.3 TAHOE License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-3-Clause-No-Nuclear-Warranty">
+            <xs:enumeration value="BSD-Advertising-Acknowledgement">
                 <xs:annotation>
-                    <xs:documentation>BSD 3-Clause No Nuclear Warranty</xs:documentation>
+                    <xs:documentation>BSD Advertising Acknowledgement License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-Source-Code">
+            <xs:enumeration value="BSD-Attribution-HPND-disclaimer">
                 <xs:annotation>
-                    <xs:documentation>BSD Source Code Attribution</xs:documentation>
+                    <xs:documentation>BSD with Attribution and HPND disclaimer</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="BSD-Protection">
@@ -297,9 +402,14 @@
                     <xs:documentation>BSD Protection License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="AGPL-3.0">
+            <xs:enumeration value="BSD-Source-Code">
                 <xs:annotation>
-                    <xs:documentation>GNU Affero General Public License v3.0</xs:documentation>
+                    <xs:documentation>BSD Source Code Attribution</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="BSL-1.0">
+                <xs:annotation>
+                    <xs:documentation>Boost Software License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="BUSL-1.1">
@@ -307,19 +417,24 @@
                     <xs:documentation>Business Source License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Artistic-1.0-Perl">
+            <xs:enumeration value="bzip2-1.0.5">
                 <xs:annotation>
-                    <xs:documentation>Artistic License 1.0 (Perl)</xs:documentation>
+                    <xs:documentation>bzip2 and libbzip2 License v1.0.5</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSL-1.0">
+            <xs:enumeration value="bzip2-1.0.6">
                 <xs:annotation>
-                    <xs:documentation>Boost Software License 1.0</xs:documentation>
+                    <xs:documentation>bzip2 and libbzip2 License v1.0.6</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-2-Clause-Views">
+            <xs:enumeration value="C-UDA-1.0">
                 <xs:annotation>
-                    <xs:documentation>BSD 2-Clause with views sentence</xs:documentation>
+                    <xs:documentation>Computational Use of Data Agreement v1.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="CAL-1.0">
+                <xs:annotation>
+                    <xs:documentation>Cryptographic Autonomy License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="CAL-1.0-Combined-Work-Exception">
@@ -327,19 +442,24 @@
                     <xs:documentation>Cryptographic Autonomy License 1.0 (Combined Work Exception)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="Caldera">
+                <xs:annotation>
+                    <xs:documentation>Caldera License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="CATOSL-1.1">
                 <xs:annotation>
                     <xs:documentation>Computer Associates Trusted Open Source License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="bzip2-1.0.5">
+            <xs:enumeration value="CC-BY-1.0">
                 <xs:annotation>
-                    <xs:documentation>bzip2 and libbzip2 License v1.0.5</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution 1.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="bzip2-1.0.6">
+            <xs:enumeration value="CC-BY-2.0">
                 <xs:annotation>
-                    <xs:documentation>bzip2 and libbzip2 License v1.0.6</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution 2.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="CC-BY-2.5">
@@ -347,14 +467,34 @@
                     <xs:documentation>Creative Commons Attribution 2.5 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="CC-BY-2.5-AU">
+                <xs:annotation>
+                    <xs:documentation>Creative Commons Attribution 2.5 Australia</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="CC-BY-3.0">
+                <xs:annotation>
+                    <xs:documentation>Creative Commons Attribution 3.0 Unported</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="CC-BY-3.0-AT">
                 <xs:annotation>
                     <xs:documentation>Creative Commons Attribution 3.0 Austria</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="C-UDA-1.0">
+            <xs:enumeration value="CC-BY-3.0-DE">
                 <xs:annotation>
-                    <xs:documentation>Computational Use of Data Agreement v1.0</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution 3.0 Germany</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="CC-BY-3.0-IGO">
+                <xs:annotation>
+                    <xs:documentation>Creative Commons Attribution 3.0 IGO</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="CC-BY-3.0-NL">
+                <xs:annotation>
+                    <xs:documentation>Creative Commons Attribution 3.0 Netherlands</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="CC-BY-3.0-US">
@@ -362,9 +502,9 @@
                     <xs:documentation>Creative Commons Attribution 3.0 United States</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-1.0">
+            <xs:enumeration value="CC-BY-4.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution 1.0 Generic</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution 4.0 International</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="CC-BY-NC-1.0">
@@ -382,9 +522,14 @@
                     <xs:documentation>Creative Commons Attribution Non Commercial 2.5 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-2.0">
+            <xs:enumeration value="CC-BY-NC-3.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution 2.0 Generic</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial 3.0 Unported</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="CC-BY-NC-3.0-DE">
+                <xs:annotation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial 3.0 Germany</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="CC-BY-NC-4.0">
@@ -402,24 +547,24 @@
                     <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 2.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-3.0">
+            <xs:enumeration value="CC-BY-NC-ND-2.5">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial 3.0 Unported</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 2.5 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-ND-3.0-IGO">
+            <xs:enumeration value="CC-BY-NC-ND-3.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 3.0 IGO</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 3.0 Unported</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-ND-3.0">
+            <xs:enumeration value="CC-BY-NC-ND-3.0-DE">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 3.0 Unported</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 3.0 Germany</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-3-Clause-No-Nuclear-License">
+            <xs:enumeration value="CC-BY-NC-ND-3.0-IGO">
                 <xs:annotation>
-                    <xs:documentation>BSD 3-Clause No Nuclear License</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 3.0 IGO</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="CC-BY-NC-ND-4.0">
@@ -427,11 +572,31 @@
                     <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 4.0 International</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="CC-BY-NC-SA-1.0">
+                <xs:annotation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 1.0 Generic</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="CC-BY-NC-SA-2.0">
                 <xs:annotation>
                     <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 2.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="CC-BY-NC-SA-2.0-DE">
+                <xs:annotation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 2.0 Germany</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="CC-BY-NC-SA-2.0-FR">
+                <xs:annotation>
+                    <xs:documentation>Creative Commons Attribution-NonCommercial-ShareAlike 2.0 France</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="CC-BY-NC-SA-2.0-UK">
+                <xs:annotation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 2.0 England and Wales</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="CC-BY-NC-SA-2.5">
                 <xs:annotation>
                     <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 2.5 Generic</xs:documentation>
@@ -442,6 +607,16 @@
                     <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 3.0 Unported</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="CC-BY-NC-SA-3.0-DE">
+                <xs:annotation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 3.0 Germany</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="CC-BY-NC-SA-3.0-IGO">
+                <xs:annotation>
+                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 3.0 IGO</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="CC-BY-NC-SA-4.0">
                 <xs:annotation>
                     <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 4.0 International</xs:documentation>
@@ -452,9 +627,9 @@
                     <xs:documentation>Creative Commons Attribution No Derivatives 1.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-3-Clause-Clear">
+            <xs:enumeration value="CC-BY-ND-2.0">
                 <xs:annotation>
-                    <xs:documentation>BSD 3-Clause Clear License</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution No Derivatives 2.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="CC-BY-ND-2.5">
@@ -467,6 +642,11 @@
                     <xs:documentation>Creative Commons Attribution No Derivatives 3.0 Unported</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="CC-BY-ND-3.0-DE">
+                <xs:annotation>
+                    <xs:documentation>Creative Commons Attribution No Derivatives 3.0 Germany</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="CC-BY-ND-4.0">
                 <xs:annotation>
                     <xs:documentation>Creative Commons Attribution No Derivatives 4.0 International</xs:documentation>
@@ -477,14 +657,14 @@
                     <xs:documentation>Creative Commons Attribution Share Alike 1.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-SA-2.0-UK">
+            <xs:enumeration value="CC-BY-SA-2.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Share Alike 2.0 England and Wales</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Share Alike 2.0 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-SA-2.0">
+            <xs:enumeration value="CC-BY-SA-2.0-UK">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Share Alike 2.0 Generic</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Share Alike 2.0 England and Wales</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="CC-BY-SA-2.1-JP">
@@ -492,39 +672,39 @@
                     <xs:documentation>Creative Commons Attribution Share Alike 2.1 Japan</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-ND-2.0">
+            <xs:enumeration value="CC-BY-SA-2.5">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution No Derivatives 2.0 Generic</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Share Alike 2.5 Generic</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-SA-3.0-AT">
+            <xs:enumeration value="CC-BY-SA-3.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution-Share Alike 3.0 Austria</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Share Alike 3.0 Unported</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-SA-3.0">
+            <xs:enumeration value="CC-BY-SA-3.0-AT">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Share Alike 3.0 Unported</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Share Alike 3.0 Austria</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-SA-4.0">
+            <xs:enumeration value="CC-BY-SA-3.0-DE">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Share Alike 4.0 International</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Share Alike 3.0 Germany</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-SA-2.5">
+            <xs:enumeration value="CC-BY-SA-3.0-IGO">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Share Alike 2.5 Generic</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution-ShareAlike 3.0 IGO</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-3.0">
+            <xs:enumeration value="CC-BY-SA-4.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution 3.0 Unported</xs:documentation>
+                    <xs:documentation>Creative Commons Attribution Share Alike 4.0 International</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CDDL-1.0">
+            <xs:enumeration value="CC-PDDC">
                 <xs:annotation>
-                    <xs:documentation>Common Development and Distribution License 1.0</xs:documentation>
+                    <xs:documentation>Creative Commons Public Domain Dedication and Certification</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="CC0-1.0">
@@ -532,19 +712,19 @@
                     <xs:documentation>Creative Commons Zero v1.0 Universal</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-ND-2.5">
+            <xs:enumeration value="CDDL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial No Derivatives 2.5 Generic</xs:documentation>
+                    <xs:documentation>Common Development and Distribution License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-NC-SA-1.0">
+            <xs:enumeration value="CDDL-1.1">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution Non Commercial Share Alike 1.0 Generic</xs:documentation>
+                    <xs:documentation>Common Development and Distribution License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Caldera">
+            <xs:enumeration value="CDL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Caldera License</xs:documentation>
+                    <xs:documentation>Common Documentation License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="CDLA-Permissive-1.0">
@@ -552,39 +732,44 @@
                     <xs:documentation>Community Data License Agreement Permissive 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-BY-4.0">
+            <xs:enumeration value="CDLA-Permissive-2.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Attribution 4.0 International</xs:documentation>
+                    <xs:documentation>Community Data License Agreement Permissive 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CC-PDDC">
+            <xs:enumeration value="CDLA-Sharing-1.0">
                 <xs:annotation>
-                    <xs:documentation>Creative Commons Public Domain Dedication and Certification</xs:documentation>
+                    <xs:documentation>Community Data License Agreement Sharing 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-4-Clause-UC">
+            <xs:enumeration value="CECILL-1.0">
                 <xs:annotation>
-                    <xs:documentation>BSD-4-Clause (University of California-Specific)</xs:documentation>
+                    <xs:documentation>CeCILL Free Software License Agreement v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="BSD-4-Clause">
+            <xs:enumeration value="CECILL-1.1">
                 <xs:annotation>
-                    <xs:documentation>BSD 4-Clause &quot;Original&quot; or &quot;Old&quot; License</xs:documentation>
+                    <xs:documentation>CeCILL Free Software License Agreement v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CAL-1.0">
+            <xs:enumeration value="CECILL-2.0">
                 <xs:annotation>
-                    <xs:documentation>Cryptographic Autonomy License 1.0</xs:documentation>
+                    <xs:documentation>CeCILL Free Software License Agreement v2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CDDL-1.1">
+            <xs:enumeration value="CECILL-2.1">
                 <xs:annotation>
-                    <xs:documentation>Common Development and Distribution License 1.1</xs:documentation>
+                    <xs:documentation>CeCILL Free Software License Agreement v2.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CERN-OHL-1.2">
+            <xs:enumeration value="CECILL-B">
                 <xs:annotation>
-                    <xs:documentation>CERN Open Hardware Licence v1.2</xs:documentation>
+                    <xs:documentation>CeCILL-B Free Software License Agreement</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="CECILL-C">
+                <xs:annotation>
+                    <xs:documentation>CeCILL-C Free Software License Agreement</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="CERN-OHL-1.1">
@@ -592,6 +777,11 @@
                     <xs:documentation>CERN Open Hardware Licence v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="CERN-OHL-1.2">
+                <xs:annotation>
+                    <xs:documentation>CERN Open Hardware Licence v1.2</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="CERN-OHL-P-2.0">
                 <xs:annotation>
                     <xs:documentation>CERN Open Hardware Licence Version 2 - Permissive</xs:documentation>
@@ -602,19 +792,39 @@
                     <xs:documentation>CERN Open Hardware Licence Version 2 - Strongly Reciprocal</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CECILL-1.1">
+            <xs:enumeration value="CERN-OHL-W-2.0">
                 <xs:annotation>
-                    <xs:documentation>CeCILL Free Software License Agreement v1.1</xs:documentation>
+                    <xs:documentation>CERN Open Hardware Licence Version 2 - Weakly Reciprocal</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CECILL-2.0">
+            <xs:enumeration value="CFITSIO">
                 <xs:annotation>
-                    <xs:documentation>CeCILL Free Software License Agreement v2.0</xs:documentation>
+                    <xs:documentation>CFITSIO License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CECILL-1.0">
+            <xs:enumeration value="checkmk">
                 <xs:annotation>
-                    <xs:documentation>CeCILL Free Software License Agreement v1.0</xs:documentation>
+                    <xs:documentation>Checkmk License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="ClArtistic">
+                <xs:annotation>
+                    <xs:documentation>Clarified Artistic License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="Clips">
+                <xs:annotation>
+                    <xs:documentation>Clips License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="CMU-Mach">
+                <xs:annotation>
+                    <xs:documentation>CMU Mach License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="CNRI-Jython">
+                <xs:annotation>
+                    <xs:documentation>CNRI Jython License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="CNRI-Python">
@@ -627,14 +837,24 @@
                     <xs:documentation>CNRI Python Open Source GPL Compatible License Agreement</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="copyleft-next-0.3.0">
+            <xs:enumeration value="COIL-1.0">
                 <xs:annotation>
-                    <xs:documentation>copyleft-next 0.3.0</xs:documentation>
+                    <xs:documentation>Copyfree Open Innovation License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CPAL-1.0">
+            <xs:enumeration value="Community-Spec-1.0">
                 <xs:annotation>
-                    <xs:documentation>Common Public Attribution License 1.0</xs:documentation>
+                    <xs:documentation>Community Specification License 1.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="Condor-1.1">
+                <xs:annotation>
+                    <xs:documentation>Condor Public License v1.1</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="copyleft-next-0.3.0">
+                <xs:annotation>
+                    <xs:documentation>copyleft-next 0.3.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="copyleft-next-0.3.1">
@@ -642,34 +862,44 @@
                     <xs:documentation>copyleft-next 0.3.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="Cornell-Lossless-JPEG">
+                <xs:annotation>
+                    <xs:documentation>Cornell Lossless JPEG License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="CPAL-1.0">
+                <xs:annotation>
+                    <xs:documentation>Common Public Attribution License 1.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="CPL-1.0">
                 <xs:annotation>
                     <xs:documentation>Common Public License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="ClArtistic">
+            <xs:enumeration value="CPOL-1.02">
                 <xs:annotation>
-                    <xs:documentation>Clarified Artistic License</xs:documentation>
+                    <xs:documentation>Code Project Open License 1.02</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CECILL-C">
+            <xs:enumeration value="Crossword">
                 <xs:annotation>
-                    <xs:documentation>CeCILL-C Free Software License Agreement</xs:documentation>
+                    <xs:documentation>Crossword License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CNRI-Jython">
+            <xs:enumeration value="CrystalStacker">
                 <xs:annotation>
-                    <xs:documentation>CNRI Jython License</xs:documentation>
+                    <xs:documentation>CrystalStacker License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Condor-1.1">
+            <xs:enumeration value="CUA-OPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Condor Public License v1.1</xs:documentation>
+                    <xs:documentation>CUA Office Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CPOL-1.02">
+            <xs:enumeration value="Cube">
                 <xs:annotation>
-                    <xs:documentation>Code Project Open License 1.02</xs:documentation>
+                    <xs:documentation>Cube License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="curl">
@@ -677,14 +907,24 @@
                     <xs:documentation>curl License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="D-FSL-1.0">
+                <xs:annotation>
+                    <xs:documentation>Deutsche Freie Software Lizenz</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="diffmark">
                 <xs:annotation>
                     <xs:documentation>diffmark license</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Crossword">
+            <xs:enumeration value="DL-DE-BY-2.0">
                 <xs:annotation>
-                    <xs:documentation>Crossword License</xs:documentation>
+                    <xs:documentation>Data licence Germany – attribution – version 2.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="DOC">
+                <xs:annotation>
+                    <xs:documentation>DOC License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Dotseqn">
@@ -692,9 +932,9 @@
                     <xs:documentation>Dotseqn License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="DOC">
+            <xs:enumeration value="DRL-1.0">
                 <xs:annotation>
-                    <xs:documentation>DOC License</xs:documentation>
+                    <xs:documentation>Detection Rule License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="DSDP">
@@ -702,9 +942,14 @@
                     <xs:documentation>DSDP License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="DRL-1.0">
+            <xs:enumeration value="dtoa">
                 <xs:annotation>
-                    <xs:documentation>Detection Rule License 1.0</xs:documentation>
+                    <xs:documentation>David M. Gay dtoa License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="dvipdfm">
+                <xs:annotation>
+                    <xs:documentation>dvipdfm License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="ECL-1.0">
@@ -722,19 +967,14 @@
                     <xs:documentation>eCos license version 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CrystalStacker">
-                <xs:annotation>
-                    <xs:documentation>CrystalStacker License</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="CERN-OHL-W-2.0">
+            <xs:enumeration value="EFL-1.0">
                 <xs:annotation>
-                    <xs:documentation>CERN Open Hardware Licence Version 2 - Weakly Reciprocal</xs:documentation>
+                    <xs:documentation>Eiffel Forum License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="D-FSL-1.0">
+            <xs:enumeration value="EFL-2.0">
                 <xs:annotation>
-                    <xs:documentation>Deutsche Freie Software Lizenz</xs:documentation>
+                    <xs:documentation>Eiffel Forum License v2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="eGenix">
@@ -742,9 +982,9 @@
                     <xs:documentation>eGenix.com Public License 1.1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="EPICS">
+            <xs:enumeration value="Elastic-2.0">
                 <xs:annotation>
-                    <xs:documentation>EPICS Open License</xs:documentation>
+                    <xs:documentation>Elastic License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Entessa">
@@ -752,19 +992,24 @@
                     <xs:documentation>Entessa Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="EPICS">
+                <xs:annotation>
+                    <xs:documentation>EPICS Open License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="EPL-1.0">
                 <xs:annotation>
                     <xs:documentation>Eclipse Public License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="EFL-2.0">
+            <xs:enumeration value="EPL-2.0">
                 <xs:annotation>
-                    <xs:documentation>Eiffel Forum License v2.0</xs:documentation>
+                    <xs:documentation>Eclipse Public License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CUA-OPL-1.0">
+            <xs:enumeration value="ErlPL-1.1">
                 <xs:annotation>
-                    <xs:documentation>CUA Office Public License v1.0</xs:documentation>
+                    <xs:documentation>Erlang Public License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="etalab-2.0">
@@ -772,34 +1017,44 @@
                     <xs:documentation>Etalab Open License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="EUDatagrid">
+                <xs:annotation>
+                    <xs:documentation>EU DataGrid Software License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="EUPL-1.0">
                 <xs:annotation>
                     <xs:documentation>European Union Public License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="ErlPL-1.1">
+            <xs:enumeration value="EUPL-1.1">
                 <xs:annotation>
-                    <xs:documentation>Erlang Public License v1.1</xs:documentation>
+                    <xs:documentation>European Union Public License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="EUDatagrid">
+            <xs:enumeration value="EUPL-1.2">
                 <xs:annotation>
-                    <xs:documentation>EU DataGrid Software License</xs:documentation>
+                    <xs:documentation>European Union Public License 1.2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="EUPL-1.1">
+            <xs:enumeration value="Eurosym">
                 <xs:annotation>
-                    <xs:documentation>European Union Public License 1.1</xs:documentation>
+                    <xs:documentation>Eurosym License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Cube">
+            <xs:enumeration value="Fair">
                 <xs:annotation>
-                    <xs:documentation>Cube License</xs:documentation>
+                    <xs:documentation>Fair License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="dvipdfm">
+            <xs:enumeration value="FDK-AAC">
                 <xs:annotation>
-                    <xs:documentation>dvipdfm License</xs:documentation>
+                    <xs:documentation>Fraunhofer FDK AAC Codec Library</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="Frameworx-1.0">
+                <xs:annotation>
+                    <xs:documentation>Frameworx Open License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="FreeBSD-DOC">
@@ -807,9 +1062,9 @@
                     <xs:documentation>FreeBSD Documentation License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Eurosym">
+            <xs:enumeration value="FreeImage">
                 <xs:annotation>
-                    <xs:documentation>Eurosym License</xs:documentation>
+                    <xs:documentation>FreeImage Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="FSFAP">
@@ -817,9 +1072,9 @@
                     <xs:documentation>FSF All Permissive License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="FreeImage">
+            <xs:enumeration value="FSFUL">
                 <xs:annotation>
-                    <xs:documentation>FreeImage Public License v1.0</xs:documentation>
+                    <xs:documentation>FSF Unlimited License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="FSFULLR">
@@ -827,9 +1082,14 @@
                     <xs:documentation>FSF Unlimited License (with License Retention)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="FSFUL">
+            <xs:enumeration value="FSFULLRWD">
                 <xs:annotation>
-                    <xs:documentation>FSF Unlimited License</xs:documentation>
+                    <xs:documentation>FSF Unlimited License (With License Retention and Warranty Disclaimer)</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="FTL">
+                <xs:annotation>
+                    <xs:documentation>Freetype Project License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="GD">
@@ -837,19 +1097,24 @@
                     <xs:documentation>GD License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="GFDL-1.1">
+                <xs:annotation>
+                    <xs:documentation>GNU Free Documentation License v1.1</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="GFDL-1.1-invariants-only">
                 <xs:annotation>
                     <xs:documentation>GNU Free Documentation License v1.1 only - invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="EUPL-1.2">
+            <xs:enumeration value="GFDL-1.1-invariants-or-later">
                 <xs:annotation>
-                    <xs:documentation>European Union Public License 1.2</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.1 or later - invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="EPL-2.0">
+            <xs:enumeration value="GFDL-1.1-no-invariants-only">
                 <xs:annotation>
-                    <xs:documentation>Eclipse Public License 2.0</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.1 only - no invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="GFDL-1.1-no-invariants-or-later">
@@ -867,14 +1132,14 @@
                     <xs:documentation>GNU Free Documentation License v1.1 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.1">
+            <xs:enumeration value="GFDL-1.2">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.1</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="FTL">
+            <xs:enumeration value="GFDL-1.2-invariants-only">
                 <xs:annotation>
-                    <xs:documentation>Freetype Project License</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.2 only - invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="GFDL-1.2-invariants-or-later">
@@ -882,14 +1147,14 @@
                     <xs:documentation>GNU Free Documentation License v1.2 or later - invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.1-invariants-or-later">
+            <xs:enumeration value="GFDL-1.2-no-invariants-only">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.1 or later - invariants</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.2 only - no invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.2-invariants-only">
+            <xs:enumeration value="GFDL-1.2-no-invariants-or-later">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.2 only - invariants</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.2 or later - no invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="GFDL-1.2-only">
@@ -902,14 +1167,9 @@
                     <xs:documentation>GNU Free Documentation License v1.2 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.2">
-                <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.2</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="GFDL-1.2-no-invariants-only">
+            <xs:enumeration value="GFDL-1.3">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.2 only - no invariants</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.3</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="GFDL-1.3-invariants-only">
@@ -917,29 +1177,29 @@
                     <xs:documentation>GNU Free Documentation License v1.3 only - invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.3-no-invariants-only">
+            <xs:enumeration value="GFDL-1.3-invariants-or-later">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.3 only - no invariants</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.3 or later - invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.3-invariants-or-later">
+            <xs:enumeration value="GFDL-1.3-no-invariants-only">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.3 or later - invariants</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.3 only - no invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.2-no-invariants-or-later">
+            <xs:enumeration value="GFDL-1.3-no-invariants-or-later">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.2 or later - no invariants</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.3 or later - no invariants</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Fair">
+            <xs:enumeration value="GFDL-1.3-only">
                 <xs:annotation>
-                    <xs:documentation>Fair License</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.3 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Frameworx-1.0">
+            <xs:enumeration value="GFDL-1.3-or-later">
                 <xs:annotation>
-                    <xs:documentation>Frameworx Open License 1.0</xs:documentation>
+                    <xs:documentation>GNU Free Documentation License v1.3 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Giftware">
@@ -947,14 +1207,14 @@
                     <xs:documentation>Giftware License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.1-no-invariants-only">
+            <xs:enumeration value="GL2PS">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.1 only - no invariants</xs:documentation>
+                    <xs:documentation>GL2PS License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GL2PS">
+            <xs:enumeration value="Glide">
                 <xs:annotation>
-                    <xs:documentation>GL2PS License</xs:documentation>
+                    <xs:documentation>3dfx Glide License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Glulxe">
@@ -962,9 +1222,9 @@
                     <xs:documentation>Glulxe License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Glide">
+            <xs:enumeration value="GLWTPL">
                 <xs:annotation>
-                    <xs:documentation>3dfx Glide License</xs:documentation>
+                    <xs:documentation>Good Luck With That Public License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="gnuplot">
@@ -972,9 +1232,14 @@
                     <xs:documentation>gnuplot License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GLWTPL">
+            <xs:enumeration value="GPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Good Luck With That Public License</xs:documentation>
+                    <xs:documentation>GNU General Public License v1.0 only</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="GPL-1.0+">
+                <xs:annotation>
+                    <xs:documentation>GNU General Public License v1.0 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="GPL-1.0-only">
@@ -987,14 +1252,14 @@
                     <xs:documentation>GNU General Public License v1.0 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-1.0">
+            <xs:enumeration value="GPL-2.0">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v1.0 only</xs:documentation>
+                    <xs:documentation>GNU General Public License v2.0 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.3-only">
+            <xs:enumeration value="GPL-2.0+">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.3 only</xs:documentation>
+                    <xs:documentation>GNU General Public License v2.0 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="GPL-2.0-only">
@@ -1012,79 +1277,79 @@
                     <xs:documentation>GNU General Public License v2.0 w/Autoconf exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-2.0+">
+            <xs:enumeration value="GPL-2.0-with-bison-exception">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v2.0 or later</xs:documentation>
+                    <xs:documentation>GNU General Public License v2.0 w/Bison exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.3">
+            <xs:enumeration value="GPL-2.0-with-classpath-exception">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.3</xs:documentation>
+                    <xs:documentation>GNU General Public License v2.0 w/Classpath exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-1.0+">
+            <xs:enumeration value="GPL-2.0-with-font-exception">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v1.0 or later</xs:documentation>
+                    <xs:documentation>GNU General Public License v2.0 w/Font exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CDLA-Sharing-1.0">
+            <xs:enumeration value="GPL-2.0-with-GCC-exception">
                 <xs:annotation>
-                    <xs:documentation>Community Data License Agreement Sharing 1.0</xs:documentation>
+                    <xs:documentation>GNU General Public License v2.0 w/GCC Runtime Library exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-2.0-with-classpath-exception">
+            <xs:enumeration value="GPL-3.0">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v2.0 w/Classpath exception</xs:documentation>
+                    <xs:documentation>GNU General Public License v3.0 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-2.0-with-GCC-exception">
+            <xs:enumeration value="GPL-3.0+">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v2.0 w/GCC Runtime Library exception</xs:documentation>
+                    <xs:documentation>GNU General Public License v3.0 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-2.0-with-bison-exception">
+            <xs:enumeration value="GPL-3.0-only">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v2.0 w/Bison exception</xs:documentation>
+                    <xs:documentation>GNU General Public License v3.0 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-2.0-with-font-exception">
+            <xs:enumeration value="GPL-3.0-or-later">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v2.0 w/Font exception</xs:documentation>
+                    <xs:documentation>GNU General Public License v3.0 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-2.0">
+            <xs:enumeration value="GPL-3.0-with-autoconf-exception">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v2.0 only</xs:documentation>
+                    <xs:documentation>GNU General Public License v3.0 w/Autoconf exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CECILL-2.1">
+            <xs:enumeration value="GPL-3.0-with-GCC-exception">
                 <xs:annotation>
-                    <xs:documentation>CeCILL Free Software License Agreement v2.1</xs:documentation>
+                    <xs:documentation>GNU General Public License v3.0 w/GCC Runtime Library exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-3.0">
+            <xs:enumeration value="Graphics-Gems">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v3.0 only</xs:documentation>
+                    <xs:documentation>Graphics Gems License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-3.0+">
+            <xs:enumeration value="gSOAP-1.3b">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v3.0 or later</xs:documentation>
+                    <xs:documentation>gSOAP Public License v1.3b</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-3.0-with-autoconf-exception">
+            <xs:enumeration value="HaskellReport">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v3.0 w/Autoconf exception</xs:documentation>
+                    <xs:documentation>Haskell Language Report License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-3.0-only">
+            <xs:enumeration value="Hippocratic-2.1">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v3.0 only</xs:documentation>
+                    <xs:documentation>Hippocratic License 2.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Hippocratic-2.1">
+            <xs:enumeration value="HP-1986">
                 <xs:annotation>
-                    <xs:documentation>Hippocratic License 2.1</xs:documentation>
+                    <xs:documentation>Hewlett-Packard 1986 License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="HPND">
@@ -1092,24 +1357,34 @@
                     <xs:documentation>Historical Permission Notice and Disclaimer</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="HTMLTIDY">
+            <xs:enumeration value="HPND-export-US">
                 <xs:annotation>
-                    <xs:documentation>HTML Tidy License</xs:documentation>
+                    <xs:documentation>HPND with US Government export control warning</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-3.0-with-GCC-exception">
+            <xs:enumeration value="HPND-Markus-Kuhn">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v3.0 w/GCC Runtime Library exception</xs:documentation>
+                    <xs:documentation>Historical Permission Notice and Disclaimer - Markus Kuhn variant</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="HaskellReport">
+            <xs:enumeration value="HPND-sell-variant">
                 <xs:annotation>
-                    <xs:documentation>Haskell Language Report License</xs:documentation>
+                    <xs:documentation>Historical Permission Notice and Disclaimer - sell variant</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GPL-3.0-or-later">
+            <xs:enumeration value="HPND-sell-variant-MIT-disclaimer">
                 <xs:annotation>
-                    <xs:documentation>GNU General Public License v3.0 or later</xs:documentation>
+                    <xs:documentation>HPND sell variant with MIT disclaimer</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="HTMLTIDY">
+                <xs:annotation>
+                    <xs:documentation>HTML Tidy License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="IBM-pibs">
+                <xs:annotation>
+                    <xs:documentation>IBM PowerPC Initialization and Boot Software</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="ICU">
@@ -1117,6 +1392,21 @@
                     <xs:documentation>ICU License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="IEC-Code-Components-EULA">
+                <xs:annotation>
+                    <xs:documentation>IEC    Code Components End-user licence agreement</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="IJG">
+                <xs:annotation>
+                    <xs:documentation>Independent JPEG Group License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="IJG-short">
+                <xs:annotation>
+                    <xs:documentation>Independent JPEG Group License - short</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="ImageMagick">
                 <xs:annotation>
                     <xs:documentation>ImageMagick License</xs:documentation>
@@ -1127,14 +1417,19 @@
                     <xs:documentation>iMatix Standard Function Library Agreement</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="IBM-pibs">
+            <xs:enumeration value="Imlib2">
                 <xs:annotation>
-                    <xs:documentation>IBM PowerPC Initialization and Boot Software</xs:documentation>
+                    <xs:documentation>Imlib2 License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Intel-ACPI">
+            <xs:enumeration value="Info-ZIP">
                 <xs:annotation>
-                    <xs:documentation>Intel ACPI Software License Agreement</xs:documentation>
+                    <xs:documentation>Info-ZIP License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="Inner-Net-2.0">
+                <xs:annotation>
+                    <xs:documentation>Inner Net License v2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Intel">
@@ -1142,9 +1437,14 @@
                     <xs:documentation>Intel Open Source License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Info-ZIP">
+            <xs:enumeration value="Intel-ACPI">
                 <xs:annotation>
-                    <xs:documentation>Info-ZIP License</xs:documentation>
+                    <xs:documentation>Intel ACPI Software License Agreement</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="Interbase-1.0">
+                <xs:annotation>
+                    <xs:documentation>Interbase Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="IPA">
@@ -1152,9 +1452,9 @@
                     <xs:documentation>IPA Font License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="IJG">
+            <xs:enumeration value="IPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Independent JPEG Group License</xs:documentation>
+                    <xs:documentation>IBM Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="ISC">
@@ -1162,11 +1462,21 @@
                     <xs:documentation>ISC License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="Jam">
+                <xs:annotation>
+                    <xs:documentation>Jam License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="JasPer-2.0">
                 <xs:annotation>
                     <xs:documentation>JasPer License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="JPL-image">
+                <xs:annotation>
+                    <xs:documentation>JPL Image Use Policy</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="JPNIC">
                 <xs:annotation>
                     <xs:documentation>Japan Network Information Center License</xs:documentation>
@@ -1177,6 +1487,16 @@
                     <xs:documentation>JSON License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="Kazlib">
+                <xs:annotation>
+                    <xs:documentation>Kazlib License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="Knuth-CTAN">
+                <xs:annotation>
+                    <xs:documentation>Knuth CTAN License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="LAL-1.2">
                 <xs:annotation>
                     <xs:documentation>Licence Art Libre 1.2</xs:documentation>
@@ -1192,14 +1512,24 @@
                     <xs:documentation>Latex2e License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="Latex2e-translated-notice">
+                <xs:annotation>
+                    <xs:documentation>Latex2e with translated notice permission</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="Leptonica">
                 <xs:annotation>
                     <xs:documentation>Leptonica License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="HPND-sell-variant">
+            <xs:enumeration value="LGPL-2.0">
                 <xs:annotation>
-                    <xs:documentation>Historical Permission Notice and Disclaimer - sell variant</xs:documentation>
+                    <xs:documentation>GNU Library General Public License v2 only</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="LGPL-2.0+">
+                <xs:annotation>
+                    <xs:documentation>GNU Library General Public License v2 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="LGPL-2.0-only">
@@ -1212,14 +1542,14 @@
                     <xs:documentation>GNU Library General Public License v2 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Imlib2">
+            <xs:enumeration value="LGPL-2.1">
                 <xs:annotation>
-                    <xs:documentation>Imlib2 License</xs:documentation>
+                    <xs:documentation>GNU Lesser General Public License v2.1 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="IPL-1.0">
+            <xs:enumeration value="LGPL-2.1+">
                 <xs:annotation>
-                    <xs:documentation>IBM Public License v1.0</xs:documentation>
+                    <xs:documentation>GNU Lesser General Public License v2.1 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="LGPL-2.1-only">
@@ -1232,19 +1562,19 @@
                     <xs:documentation>GNU Lesser General Public License v2.1 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LGPL-2.0+">
+            <xs:enumeration value="LGPL-3.0">
                 <xs:annotation>
-                    <xs:documentation>GNU Library General Public License v2 or later</xs:documentation>
+                    <xs:documentation>GNU Lesser General Public License v3.0 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LGPL-2.0">
+            <xs:enumeration value="LGPL-3.0+">
                 <xs:annotation>
-                    <xs:documentation>GNU Library General Public License v2 only</xs:documentation>
+                    <xs:documentation>GNU Lesser General Public License v3.0 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="CECILL-B">
+            <xs:enumeration value="LGPL-3.0-only">
                 <xs:annotation>
-                    <xs:documentation>CeCILL-B Free Software License Agreement</xs:documentation>
+                    <xs:documentation>GNU Lesser General Public License v3.0 only</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="LGPL-3.0-or-later">
@@ -1252,14 +1582,14 @@
                     <xs:documentation>GNU Lesser General Public License v3.0 or later</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LGPL-3.0-only">
+            <xs:enumeration value="LGPLLR">
                 <xs:annotation>
-                    <xs:documentation>GNU Lesser General Public License v3.0 only</xs:documentation>
+                    <xs:documentation>Lesser General Public License For Linguistic Resources</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LGPLLR">
+            <xs:enumeration value="Libpng">
                 <xs:annotation>
-                    <xs:documentation>Lesser General Public License For Linguistic Resources</xs:documentation>
+                    <xs:documentation>libpng License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="libpng-2.0">
@@ -1267,44 +1597,64 @@
                     <xs:documentation>PNG Reference Library version 2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Libpng">
+            <xs:enumeration value="libselinux-1.0">
                 <xs:annotation>
-                    <xs:documentation>libpng License</xs:documentation>
+                    <xs:documentation>libselinux public domain notice</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="libselinux-1.0">
+            <xs:enumeration value="libtiff">
                 <xs:annotation>
-                    <xs:documentation>libselinux public domain notice</xs:documentation>
+                    <xs:documentation>libtiff License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LGPL-3.0+">
+            <xs:enumeration value="libutil-David-Nugent">
                 <xs:annotation>
-                    <xs:documentation>GNU Lesser General Public License v3.0 or later</xs:documentation>
+                    <xs:documentation>libutil David Nugent License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="EFL-1.0">
+            <xs:enumeration value="LiLiQ-P-1.1">
                 <xs:annotation>
-                    <xs:documentation>Eiffel Forum License v1.0</xs:documentation>
+                    <xs:documentation>Licence Libre du Québec – Permissive version 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="libtiff">
+            <xs:enumeration value="LiLiQ-R-1.1">
                 <xs:annotation>
-                    <xs:documentation>libtiff License</xs:documentation>
+                    <xs:documentation>Licence Libre du Québec – Réciprocité version 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.3-no-invariants-or-later">
+            <xs:enumeration value="LiLiQ-Rplus-1.1">
+                <xs:annotation>
+                    <xs:documentation>Licence Libre du Québec – Réciprocité forte version 1.1</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="Linux-man-pages-1-para">
+                <xs:annotation>
+                    <xs:documentation>Linux man-pages - 1 paragraph</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="Linux-man-pages-copyleft">
+                <xs:annotation>
+                    <xs:documentation>Linux man-pages Copyleft</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="Linux-man-pages-copyleft-2-para">
+                <xs:annotation>
+                    <xs:documentation>Linux man-pages Copyleft - 2 paragraphs</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="Linux-man-pages-copyleft-var">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.3 or later - no invariants</xs:documentation>
+                    <xs:documentation>Linux man-pages Copyleft Variant</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LiLiQ-Rplus-1.1">
+            <xs:enumeration value="Linux-OpenIB">
                 <xs:annotation>
-                    <xs:documentation>Licence Libre du Québec – Réciprocité forte version 1.1</xs:documentation>
+                    <xs:documentation>Linux Kernel Variant of OpenIB.org license</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LiLiQ-R-1.1">
+            <xs:enumeration value="LOOP">
                 <xs:annotation>
-                    <xs:documentation>Licence Libre du Québec – Réciprocité version 1.1</xs:documentation>
+                    <xs:documentation>Common Lisp LOOP License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="LPL-1.0">
@@ -1312,19 +1662,19 @@
                     <xs:documentation>Lucent Public License Version 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LiLiQ-P-1.1">
+            <xs:enumeration value="LPL-1.02">
                 <xs:annotation>
-                    <xs:documentation>Licence Libre du Québec – Permissive version 1.1</xs:documentation>
+                    <xs:documentation>Lucent Public License v1.02</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Linux-OpenIB">
+            <xs:enumeration value="LPPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Linux Kernel Variant of OpenIB.org license</xs:documentation>
+                    <xs:documentation>LaTeX Project Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LPPL-1.0">
+            <xs:enumeration value="LPPL-1.1">
                 <xs:annotation>
-                    <xs:documentation>LaTeX Project Public License v1.0</xs:documentation>
+                    <xs:documentation>LaTeX Project Public License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="LPPL-1.2">
@@ -1337,14 +1687,19 @@
                     <xs:documentation>LaTeX Project Public License v1.3a</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LPL-1.02">
+            <xs:enumeration value="LPPL-1.3c">
                 <xs:annotation>
-                    <xs:documentation>Lucent Public License v1.02</xs:documentation>
+                    <xs:documentation>LaTeX Project Public License v1.3c</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LPPL-1.3c">
+            <xs:enumeration value="LZMA-SDK-9.11-to-9.20">
                 <xs:annotation>
-                    <xs:documentation>LaTeX Project Public License v1.3c</xs:documentation>
+                    <xs:documentation>LZMA SDK License (versions 9.11 to 9.20)</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="LZMA-SDK-9.22">
+                <xs:annotation>
+                    <xs:documentation>LZMA SDK License (versions 9.22 and beyond)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="MakeIndex">
@@ -1352,19 +1707,19 @@
                     <xs:documentation>MakeIndex License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LGPL-2.1+">
+            <xs:enumeration value="Martin-Birgmeier">
                 <xs:annotation>
-                    <xs:documentation>GNU Library General Public License v2.1 or later</xs:documentation>
+                    <xs:documentation>Martin Birgmeier License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="LPPL-1.1">
+            <xs:enumeration value="metamail">
                 <xs:annotation>
-                    <xs:documentation>LaTeX Project Public License v1.1</xs:documentation>
+                    <xs:documentation>metamail License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MIT-CMU">
+            <xs:enumeration value="Minpack">
                 <xs:annotation>
-                    <xs:documentation>CMU License</xs:documentation>
+                    <xs:documentation>Minpack License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="MirOS">
@@ -1372,19 +1727,24 @@
                     <xs:documentation>The MirOS Licence</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MIT-advertising">
+            <xs:enumeration value="MIT">
                 <xs:annotation>
-                    <xs:documentation>Enlightenment License (e16)</xs:documentation>
+                    <xs:documentation>MIT License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MIT-Modern-Variant">
+            <xs:enumeration value="MIT-0">
                 <xs:annotation>
-                    <xs:documentation>MIT License Modern Variant</xs:documentation>
+                    <xs:documentation>MIT No Attribution</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MIT">
+            <xs:enumeration value="MIT-advertising">
                 <xs:annotation>
-                    <xs:documentation>MIT License</xs:documentation>
+                    <xs:documentation>Enlightenment License (e16)</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="MIT-CMU">
+                <xs:annotation>
+                    <xs:documentation>CMU License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="MIT-enna">
@@ -1392,14 +1752,29 @@
                     <xs:documentation>enna License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="MIT-feh">
+                <xs:annotation>
+                    <xs:documentation>feh License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="MIT-Festival">
+                <xs:annotation>
+                    <xs:documentation>MIT Festival Variant</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="MIT-Modern-Variant">
+                <xs:annotation>
+                    <xs:documentation>MIT License Modern Variant</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="MIT-open-group">
                 <xs:annotation>
                     <xs:documentation>MIT Open Group variant</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MIT-feh">
+            <xs:enumeration value="MIT-Wu">
                 <xs:annotation>
-                    <xs:documentation>feh License</xs:documentation>
+                    <xs:documentation>MIT Tom Wu Variant</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="MITNFA">
@@ -1407,9 +1782,14 @@
                     <xs:documentation>MIT +no-false-attribs license</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MPL-1.0">
+            <xs:enumeration value="Motosoto">
                 <xs:annotation>
-                    <xs:documentation>Mozilla Public License 1.0</xs:documentation>
+                    <xs:documentation>Motosoto License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="mpi-permissive">
+                <xs:annotation>
+                    <xs:documentation>mpi Permissive License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="mpich2">
@@ -1417,6 +1797,16 @@
                     <xs:documentation>mpich2 License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="MPL-1.0">
+                <xs:annotation>
+                    <xs:documentation>Mozilla Public License 1.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="MPL-1.1">
+                <xs:annotation>
+                    <xs:documentation>Mozilla Public License 1.1</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="MPL-2.0">
                 <xs:annotation>
                     <xs:documentation>Mozilla Public License 2.0</xs:documentation>
@@ -1427,6 +1817,21 @@
                     <xs:documentation>Mozilla Public License 2.0 (no copyleft exception)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="mplus">
+                <xs:annotation>
+                    <xs:documentation>mplus Font License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="MS-LPL">
+                <xs:annotation>
+                    <xs:documentation>Microsoft Limited Public License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="MS-PL">
+                <xs:annotation>
+                    <xs:documentation>Microsoft Public License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="MS-RL">
                 <xs:annotation>
                     <xs:documentation>Microsoft Reciprocal License</xs:documentation>
@@ -1437,9 +1842,9 @@
                     <xs:documentation>Matrix Template Library License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MPL-1.1">
+            <xs:enumeration value="MulanPSL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Mozilla Public License 1.1</xs:documentation>
+                    <xs:documentation>Mulan Permissive Software License, Version 1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="MulanPSL-2.0">
@@ -1447,9 +1852,9 @@
                     <xs:documentation>Mulan Permissive Software License, Version 2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Motosoto">
+            <xs:enumeration value="Multics">
                 <xs:annotation>
-                    <xs:documentation>Motosoto License</xs:documentation>
+                    <xs:documentation>Multics License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Mup">
@@ -1457,14 +1862,14 @@
                     <xs:documentation>Mup License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MulanPSL-1.0">
+            <xs:enumeration value="NAIST-2003">
                 <xs:annotation>
-                    <xs:documentation>Mulan Permissive Software License, Version 1</xs:documentation>
+                    <xs:documentation>Nara Institute of Science and Technology License (2003)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NAIST-2003">
+            <xs:enumeration value="NASA-1.3">
                 <xs:annotation>
-                    <xs:documentation>Nara Institute of Science and Technology License (2003)</xs:documentation>
+                    <xs:documentation>NASA Open Source Agreement 1.3</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Naumen">
@@ -1472,14 +1877,14 @@
                     <xs:documentation>Naumen Public License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Multics">
+            <xs:enumeration value="NBPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Multics License</xs:documentation>
+                    <xs:documentation>Net Boolean Public License v1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NBPL-1.0">
+            <xs:enumeration value="NCGL-UK-2.0">
                 <xs:annotation>
-                    <xs:documentation>Net Boolean Public License v1</xs:documentation>
+                    <xs:documentation>Non-Commercial Government Licence</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="NCSA">
@@ -1497,9 +1902,9 @@
                     <xs:documentation>NetCDF license</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NASA-1.3">
+            <xs:enumeration value="Newsletr">
                 <xs:annotation>
-                    <xs:documentation>NASA Open Source Agreement 1.3</xs:documentation>
+                    <xs:documentation>Newsletr License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="NGPL">
@@ -1507,9 +1912,9 @@
                     <xs:documentation>Nethack General Public License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NIST-PD-fallback">
+            <xs:enumeration value="NICTA-1.0">
                 <xs:annotation>
-                    <xs:documentation>NIST Public Domain Notice with license fallback</xs:documentation>
+                    <xs:documentation>NICTA Public Software License, Version 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="NIST-PD">
@@ -1517,9 +1922,24 @@
                     <xs:documentation>NIST Public Domain Notice</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Newsletr">
+            <xs:enumeration value="NIST-PD-fallback">
                 <xs:annotation>
-                    <xs:documentation>Newsletr License</xs:documentation>
+                    <xs:documentation>NIST Public Domain Notice with license fallback</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="NIST-Software">
+                <xs:annotation>
+                    <xs:documentation>NIST Software License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="NLOD-1.0">
+                <xs:annotation>
+                    <xs:documentation>Norwegian Licence for Open Government Data (NLOD) 1.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="NLOD-2.0">
+                <xs:annotation>
+                    <xs:documentation>Norwegian Licence for Open Government Data (NLOD) 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="NLPL">
@@ -1542,29 +1962,24 @@
                     <xs:documentation>Noweb License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NLOD-1.0">
-                <xs:annotation>
-                    <xs:documentation>Norwegian Licence for Open Government Data</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
             <xs:enumeration value="NPL-1.0">
                 <xs:annotation>
                     <xs:documentation>Netscape Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NCGL-UK-2.0">
+            <xs:enumeration value="NPL-1.1">
                 <xs:annotation>
-                    <xs:documentation>Non-Commercial Government Licence</xs:documentation>
+                    <xs:documentation>Netscape Public License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NRL">
+            <xs:enumeration value="NPOSL-3.0">
                 <xs:annotation>
-                    <xs:documentation>NRL License</xs:documentation>
+                    <xs:documentation>Non-Profit Open Software License 3.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NTP-0">
+            <xs:enumeration value="NRL">
                 <xs:annotation>
-                    <xs:documentation>NTP No Attribution</xs:documentation>
+                    <xs:documentation>NRL License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="NTP">
@@ -1572,9 +1987,9 @@
                     <xs:documentation>NTP License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="GFDL-1.3-or-later">
+            <xs:enumeration value="NTP-0">
                 <xs:annotation>
-                    <xs:documentation>GNU Free Documentation License v1.3 or later</xs:documentation>
+                    <xs:documentation>NTP No Attribution</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Nunit">
@@ -1587,14 +2002,19 @@
                     <xs:documentation>Open Use of Data Agreement v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="NPL-1.1">
+            <xs:enumeration value="OCCT-PL">
                 <xs:annotation>
-                    <xs:documentation>Netscape Public License v1.1</xs:documentation>
+                    <xs:documentation>Open CASCADE Technology Public License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OCCT-PL">
+            <xs:enumeration value="OCLC-2.0">
                 <xs:annotation>
-                    <xs:documentation>Open CASCADE Technology Public License</xs:documentation>
+                    <xs:documentation>OCLC Research Public License 2.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="ODbL-1.0">
+                <xs:annotation>
+                    <xs:documentation>Open Data Commons Open Database License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="ODC-By-1.0">
@@ -1602,14 +2022,19 @@
                     <xs:documentation>Open Data Commons Attribution License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OFL-1.0-no-RFN">
+            <xs:enumeration value="OFFIS">
                 <xs:annotation>
-                    <xs:documentation>SIL Open Font License 1.0 with no Reserved Font Name</xs:documentation>
+                    <xs:documentation>OFFIS License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OCLC-2.0">
+            <xs:enumeration value="OFL-1.0">
                 <xs:annotation>
-                    <xs:documentation>OCLC Research Public License 2.0</xs:documentation>
+                    <xs:documentation>SIL Open Font License 1.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="OFL-1.0-no-RFN">
+                <xs:annotation>
+                    <xs:documentation>SIL Open Font License 1.0 with no Reserved Font Name</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="OFL-1.0-RFN">
@@ -1617,9 +2042,9 @@
                     <xs:documentation>SIL Open Font License 1.0 with Reserved Font Name</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OFL-1.0">
+            <xs:enumeration value="OFL-1.1">
                 <xs:annotation>
-                    <xs:documentation>SIL Open Font License 1.0</xs:documentation>
+                    <xs:documentation>SIL Open Font License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="OFL-1.1-no-RFN">
@@ -1632,9 +2057,9 @@
                     <xs:documentation>SIL Open Font License 1.1 with Reserved Font Name</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OFL-1.1">
+            <xs:enumeration value="OGC-1.0">
                 <xs:annotation>
-                    <xs:documentation>SIL Open Font License 1.1</xs:documentation>
+                    <xs:documentation>OGC Software License, Version 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="OGDL-Taiwan-1.0">
@@ -1642,9 +2067,9 @@
                     <xs:documentation>Taiwan Open Government Data License, version 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OGC-1.0">
+            <xs:enumeration value="OGL-Canada-2.0">
                 <xs:annotation>
-                    <xs:documentation>OGC Software License, Version 1.0</xs:documentation>
+                    <xs:documentation>Open Government Licence - Canada</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="OGL-UK-1.0">
@@ -1682,19 +2107,19 @@
                     <xs:documentation>Open LDAP Public License v1.3</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OGL-Canada-2.0">
+            <xs:enumeration value="OLDAP-1.4">
                 <xs:annotation>
-                    <xs:documentation>Open Government Licence - Canada</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v1.4</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-2.0.1">
+            <xs:enumeration value="OLDAP-2.0">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v2.0.1</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-2.0">
+            <xs:enumeration value="OLDAP-2.0.1">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v2.0.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="OLDAP-2.1">
@@ -1702,6 +2127,11 @@
                     <xs:documentation>Open LDAP Public License v2.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="OLDAP-2.2">
+                <xs:annotation>
+                    <xs:documentation>Open LDAP Public License v2.2</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="OLDAP-2.2.1">
                 <xs:annotation>
                     <xs:documentation>Open LDAP Public License v2.2.1</xs:documentation>
@@ -1712,14 +2142,9 @@
                     <xs:documentation>Open LDAP Public License 2.2.2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-2.2">
-                <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v2.2</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="ODbL-1.0">
+            <xs:enumeration value="OLDAP-2.3">
                 <xs:annotation>
-                    <xs:documentation>Open Data Commons Open Database License v1.0</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v2.3</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="OLDAP-2.4">
@@ -1727,14 +2152,14 @@
                     <xs:documentation>Open LDAP Public License v2.4</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-1.4">
+            <xs:enumeration value="OLDAP-2.5">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v1.4</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v2.5</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-2.3">
+            <xs:enumeration value="OLDAP-2.6">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v2.3</xs:documentation>
+                    <xs:documentation>Open LDAP Public License v2.6</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="OLDAP-2.7">
@@ -1747,19 +2172,24 @@
                     <xs:documentation>Open LDAP Public License v2.8</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="OLFL-1.3">
+                <xs:annotation>
+                    <xs:documentation>Open Logistics Foundation License Version 1.3</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="OML">
                 <xs:annotation>
                     <xs:documentation>Open Market License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OpenSSL">
+            <xs:enumeration value="OpenPBS-2.3">
                 <xs:annotation>
-                    <xs:documentation>OpenSSL License</xs:documentation>
+                    <xs:documentation>OpenPBS v2.3 Software License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-2.6">
+            <xs:enumeration value="OpenSSL">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v2.6</xs:documentation>
+                    <xs:documentation>OpenSSL License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="OPL-1.0">
@@ -1767,6 +2197,21 @@
                     <xs:documentation>Open Public License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="OPL-UK-3.0">
+                <xs:annotation>
+                    <xs:documentation>United    Kingdom Open Parliament Licence v3.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="OPUBL-1.0">
+                <xs:annotation>
+                    <xs:documentation>Open Publication License v1.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="OSET-PL-2.1">
+                <xs:annotation>
+                    <xs:documentation>OSET Public License version 2.1</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="OSL-1.0">
                 <xs:annotation>
                     <xs:documentation>Open Software License 1.0</xs:documentation>
@@ -1782,14 +2227,14 @@
                     <xs:documentation>Open Software License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OSET-PL-2.1">
+            <xs:enumeration value="OSL-2.1">
                 <xs:annotation>
-                    <xs:documentation>OSET Public License version 2.1</xs:documentation>
+                    <xs:documentation>Open Software License 2.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OSL-2.1">
+            <xs:enumeration value="OSL-3.0">
                 <xs:annotation>
-                    <xs:documentation>Open Software License 2.1</xs:documentation>
+                    <xs:documentation>Open Software License 3.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Parity-6.0.0">
@@ -1812,9 +2257,9 @@
                     <xs:documentation>PHP License v3.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OSL-3.0">
+            <xs:enumeration value="PHP-3.01">
                 <xs:annotation>
-                    <xs:documentation>Open Software License 3.0</xs:documentation>
+                    <xs:documentation>PHP License v3.01</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Plexus">
@@ -1822,9 +2267,9 @@
                     <xs:documentation>Plexus Classworlds License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MS-PL">
+            <xs:enumeration value="PolyForm-Noncommercial-1.0.0">
                 <xs:annotation>
-                    <xs:documentation>Microsoft Public License</xs:documentation>
+                    <xs:documentation>PolyForm Noncommercial License 1.0.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="PolyForm-Small-Business-1.0.0">
@@ -1832,9 +2277,9 @@
                     <xs:documentation>PolyForm Small Business License 1.0.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="PolyForm-Noncommercial-1.0.0">
+            <xs:enumeration value="PostgreSQL">
                 <xs:annotation>
-                    <xs:documentation>PolyForm Noncommercial License 1.0.0</xs:documentation>
+                    <xs:documentation>PostgreSQL License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="PSF-2.0">
@@ -1847,14 +2292,19 @@
                     <xs:documentation>psfrag License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="PostgreSQL">
+            <xs:enumeration value="psutils">
                 <xs:annotation>
-                    <xs:documentation>PostgreSQL License</xs:documentation>
+                    <xs:documentation>psutils License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="psutils">
+            <xs:enumeration value="Python-2.0">
                 <xs:annotation>
-                    <xs:documentation>psutils License</xs:documentation>
+                    <xs:documentation>Python License 2.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="Python-2.0.1">
+                <xs:annotation>
+                    <xs:documentation>Python License 2.0.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Qhull">
@@ -1867,14 +2317,19 @@
                     <xs:documentation>Q Public License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="QPL-1.0-INRIA-2004">
+                <xs:annotation>
+                    <xs:documentation>Q Public License 1.0 - INRIA 2004 variant</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="Rdisc">
                 <xs:annotation>
                     <xs:documentation>Rdisc License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Python-2.0">
+            <xs:enumeration value="RHeCos-1.1">
                 <xs:annotation>
-                    <xs:documentation>Python License 2.0</xs:documentation>
+                    <xs:documentation>Red Hat eCos Public License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="RPL-1.1">
@@ -1887,9 +2342,9 @@
                     <xs:documentation>Reciprocal Public License 1.5</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="RHeCos-1.1">
+            <xs:enumeration value="RPSL-1.0">
                 <xs:annotation>
-                    <xs:documentation>Red Hat eCos Public License v1.1</xs:documentation>
+                    <xs:documentation>RealNetworks Public Source License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="RSA-MD">
@@ -1922,9 +2377,9 @@
                     <xs:documentation>SCEA Shared Source License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Sendmail-8.23">
+            <xs:enumeration value="SchemeReport">
                 <xs:annotation>
-                    <xs:documentation>Sendmail License 8.23</xs:documentation>
+                    <xs:documentation>Scheme Language Report License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Sendmail">
@@ -1932,6 +2387,11 @@
                     <xs:documentation>Sendmail License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="Sendmail-8.23">
+                <xs:annotation>
+                    <xs:documentation>Sendmail License 8.23</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="SGI-B-1.0">
                 <xs:annotation>
                     <xs:documentation>SGI Free Software License B v1.0</xs:documentation>
@@ -1947,6 +2407,11 @@
                     <xs:documentation>SGI Free Software License B v2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="SGP4">
+                <xs:annotation>
+                    <xs:documentation>SGP4 Permission Notice</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="SHL-0.5">
                 <xs:annotation>
                     <xs:documentation>Solderpad Hardware License v0.5</xs:documentation>
@@ -1962,14 +2427,14 @@
                     <xs:documentation>Simple Public License 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SISSL-1.2">
+            <xs:enumeration value="SISSL">
                 <xs:annotation>
-                    <xs:documentation>Sun Industry Standards Source License v1.2</xs:documentation>
+                    <xs:documentation>Sun Industry Standards Source License v1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SISSL">
+            <xs:enumeration value="SISSL-1.2">
                 <xs:annotation>
-                    <xs:documentation>Sun Industry Standards Source License v1.1</xs:documentation>
+                    <xs:documentation>Sun Industry Standards Source License v1.2</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Sleepycat">
@@ -1992,6 +2457,11 @@
                     <xs:documentation>SNIA Public License 1.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="snprintf">
+                <xs:annotation>
+                    <xs:documentation>snprintf License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="Spencer-86">
                 <xs:annotation>
                     <xs:documentation>Spencer License 86</xs:documentation>
@@ -2017,24 +2487,29 @@
                     <xs:documentation>SSH OpenSSH license</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="PHP-3.01">
+            <xs:enumeration value="SSH-short">
                 <xs:annotation>
-                    <xs:documentation>PHP License v3.01</xs:documentation>
+                    <xs:documentation>SSH short notice</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SSH-short">
+            <xs:enumeration value="SSPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>SSH short notice</xs:documentation>
+                    <xs:documentation>Server Side Public License, v 1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="MIT-0">
+            <xs:enumeration value="StandardML-NJ">
                 <xs:annotation>
-                    <xs:documentation>MIT No Attribution</xs:documentation>
+                    <xs:documentation>Standard ML of New Jersey License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="RPSL-1.0">
+            <xs:enumeration value="SugarCRM-1.1.3">
                 <xs:annotation>
-                    <xs:documentation>RealNetworks Public Source License v1.0</xs:documentation>
+                    <xs:documentation>SugarCRM Public License v1.1.3</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="SunPro">
+                <xs:annotation>
+                    <xs:documentation>SunPro License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="SWL">
@@ -2042,9 +2517,14 @@
                     <xs:documentation>Scheme Widget Library (SWL) Software License Agreement</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SugarCRM-1.1.3">
+            <xs:enumeration value="Symlinks">
                 <xs:annotation>
-                    <xs:documentation>SugarCRM Public License v1.1.3</xs:documentation>
+                    <xs:documentation>Symlinks License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="TAPR-OHL-1.0">
+                <xs:annotation>
+                    <xs:documentation>TAPR Open Hardware License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="TCL">
@@ -2057,9 +2537,9 @@
                     <xs:documentation>TCP Wrappers License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="SSPL-1.0">
+            <xs:enumeration value="TermReadKey">
                 <xs:annotation>
-                    <xs:documentation>Server Side Public License, v 1</xs:documentation>
+                    <xs:documentation>TermReadKey License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="TMate">
@@ -2067,19 +2547,44 @@
                     <xs:documentation>TMate Open Source License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="TORQUE-1.1">
+                <xs:annotation>
+                    <xs:documentation>TORQUE v2.5+ Software License v1.1</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="TOSL">
                 <xs:annotation>
                     <xs:documentation>Trusster Open Source License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="TORQUE-1.1">
+            <xs:enumeration value="TPDL">
                 <xs:annotation>
-                    <xs:documentation>TORQUE v2.5+ Software License v1.1</xs:documentation>
+                    <xs:documentation>Time::ParseDate License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="TAPR-OHL-1.0">
+            <xs:enumeration value="TPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>TAPR Open Hardware License v1.0</xs:documentation>
+                    <xs:documentation>THOR Public License 1.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="TTWL">
+                <xs:annotation>
+                    <xs:documentation>Text-Tabs+Wrap License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="TU-Berlin-1.0">
+                <xs:annotation>
+                    <xs:documentation>Technische Universitaet Berlin License 1.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="TU-Berlin-2.0">
+                <xs:annotation>
+                    <xs:documentation>Technische Universitaet Berlin License 2.0</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="UCAR">
+                <xs:annotation>
+                    <xs:documentation>UCAR License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="UCL-1.0">
@@ -2102,14 +2607,9 @@
                     <xs:documentation>Unicode Terms of Use</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="TU-Berlin-1.0">
-                <xs:annotation>
-                    <xs:documentation>Technische Universitaet Berlin License 1.0</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="UPL-1.0">
+            <xs:enumeration value="UnixCrypt">
                 <xs:annotation>
-                    <xs:documentation>Universal Permissive License v1.0</xs:documentation>
+                    <xs:documentation>UnixCrypt License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Unlicense">
@@ -2117,9 +2617,9 @@
                     <xs:documentation>The Unlicense</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="VOSTROM">
+            <xs:enumeration value="UPL-1.0">
                 <xs:annotation>
-                    <xs:documentation>VOSTROM Public License for Open Source</xs:documentation>
+                    <xs:documentation>Universal Permissive License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Vim">
@@ -2127,14 +2627,14 @@
                     <xs:documentation>Vim License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="VSL-1.0">
+            <xs:enumeration value="VOSTROM">
                 <xs:annotation>
-                    <xs:documentation>Vovida Software License v1.0</xs:documentation>
+                    <xs:documentation>VOSTROM Public License for Open Source</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="W3C-20150513">
+            <xs:enumeration value="VSL-1.0">
                 <xs:annotation>
-                    <xs:documentation>W3C Software Notice and Document License (2015-05-13)</xs:documentation>
+                    <xs:documentation>Vovida Software License v1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="W3C">
@@ -2147,9 +2647,14 @@
                     <xs:documentation>W3C Software Notice and License (1998-07-20)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Wsuipa">
+            <xs:enumeration value="W3C-20150513">
                 <xs:annotation>
-                    <xs:documentation>Wsuipa License</xs:documentation>
+                    <xs:documentation>W3C Software Notice and Document License (2015-05-13)</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="w3m">
+                <xs:annotation>
+                    <xs:documentation>w3m License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Watcom-1.0">
@@ -2157,21 +2662,51 @@
                     <xs:documentation>Sybase Open Watcom Public License 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="Widget-Workshop">
+                <xs:annotation>
+                    <xs:documentation>Widget Workshop License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="Wsuipa">
+                <xs:annotation>
+                    <xs:documentation>Wsuipa License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="WTFPL">
                 <xs:annotation>
                     <xs:documentation>Do What The F*ck You Want To Public License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="wxWindows">
+                <xs:annotation>
+                    <xs:documentation>wxWindows Library License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="X11">
                 <xs:annotation>
                     <xs:documentation>X11 License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="X11-distribute-modifications-variant">
+                <xs:annotation>
+                    <xs:documentation>X11 License Distribution Modification Variant</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="Xdebug-1.03">
+                <xs:annotation>
+                    <xs:documentation>Xdebug License v 1.03</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="Xerox">
                 <xs:annotation>
                     <xs:documentation>Xerox License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="Xfig">
+                <xs:annotation>
+                    <xs:documentation>Xfig License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="XFree86-1.1">
                 <xs:annotation>
                     <xs:documentation>XFree86 License 1.1</xs:documentation>
@@ -2182,6 +2717,11 @@
                     <xs:documentation>xinetd License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="xlock">
+                <xs:annotation>
+                    <xs:documentation>xlock License</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="Xnet">
                 <xs:annotation>
                     <xs:documentation>X.Net License</xs:documentation>
@@ -2217,9 +2757,9 @@
                     <xs:documentation>Zend License v2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="TU-Berlin-2.0">
+            <xs:enumeration value="Zimbra-1.3">
                 <xs:annotation>
-                    <xs:documentation>Technische Universitaet Berlin License 2.0</xs:documentation>
+                    <xs:documentation>Zimbra Public License v1.3</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Zimbra-1.4">
@@ -2227,14 +2767,14 @@
                     <xs:documentation>Zimbra Public License v1.4</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="zlib-acknowledgement">
+            <xs:enumeration value="Zlib">
                 <xs:annotation>
-                    <xs:documentation>zlib/libpng License with Acknowledgement</xs:documentation>
+                    <xs:documentation>zlib License</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Zlib">
+            <xs:enumeration value="zlib-acknowledgement">
                 <xs:annotation>
-                    <xs:documentation>zlib License</xs:documentation>
+                    <xs:documentation>zlib/libpng License with Acknowledgement</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="ZPL-1.1">
@@ -2252,65 +2792,35 @@
                     <xs:documentation>Zope Public License 2.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="wxWindows">
-                <xs:annotation>
-                    <xs:documentation>wxWindows Library License</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="Zimbra-1.3">
-                <xs:annotation>
-                    <xs:documentation>Zimbra Public License v1.3</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="gSOAP-1.3b">
-                <xs:annotation>
-                    <xs:documentation>gSOAP Public License v1.3b</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="Interbase-1.0">
-                <xs:annotation>
-                    <xs:documentation>Interbase Public License v1.0</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="LGPL-2.1">
-                <xs:annotation>
-                    <xs:documentation>GNU Lesser General Public License v2.1 only</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="LGPL-3.0">
-                <xs:annotation>
-                    <xs:documentation>GNU Lesser General Public License v3.0 only</xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="NPOSL-3.0">
+            <!-- Exceptions -->
+            <xs:enumeration value="389-exception">
                 <xs:annotation>
-                    <xs:documentation>Non-Profit Open Software License 3.0</xs:documentation>
+                    <xs:documentation>389 Directory Server Exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="OLDAP-2.5">
+            <xs:enumeration value="Asterisk-exception">
                 <xs:annotation>
-                    <xs:documentation>Open LDAP Public License v2.5</xs:documentation>
+                    <xs:documentation>Asterisk exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="StandardML-NJ">
+            <xs:enumeration value="Autoconf-exception-2.0">
                 <xs:annotation>
-                    <xs:documentation>Standard ML of New Jersey License</xs:documentation>
+                    <xs:documentation>Autoconf exception 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <!-- Exceptions -->
-            <xs:enumeration value="389-exception">
+            <xs:enumeration value="Autoconf-exception-3.0">
                 <xs:annotation>
-                    <xs:documentation>389 Directory Server Exception</xs:documentation>
+                    <xs:documentation>Autoconf exception 3.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Autoconf-exception-2.0">
+            <xs:enumeration value="Autoconf-exception-generic">
                 <xs:annotation>
-                    <xs:documentation>Autoconf exception 2.0</xs:documentation>
+                    <xs:documentation>Autoconf generic exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
-            <xs:enumeration value="Autoconf-exception-3.0">
+            <xs:enumeration value="Autoconf-exception-macro">
                 <xs:annotation>
-                    <xs:documentation>Autoconf exception 3.0</xs:documentation>
+                    <xs:documentation>Autoconf macro exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
             <xs:enumeration value="Bison-exception-2.2">
@@ -2333,6 +2843,11 @@
                     <xs:documentation>CLISP exception 2.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="cryptsetup-OpenSSL-exception">
+                <xs:annotation>
+                    <xs:documentation>cryptsetup OpenSSL exception</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="DigiRule-FOSS-exception">
                 <xs:annotation>
                     <xs:documentation>DigiRule FOSS License Exception</xs:documentation>
@@ -2373,11 +2888,21 @@
                     <xs:documentation>GCC Runtime Library exception 3.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="GNAT-exception">
+                <xs:annotation>
+                    <xs:documentation>GNAT exception</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="gnu-javamail-exception">
                 <xs:annotation>
                     <xs:documentation>GNU JavaMail exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="GPL-3.0-interface-exception">
+                <xs:annotation>
+                    <xs:documentation>GPL-3.0 Interface Exception</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="GPL-3.0-linking-exception">
                 <xs:annotation>
                     <xs:documentation>GPL-3.0 Linking Exception</xs:documentation>
@@ -2393,16 +2918,36 @@
                     <xs:documentation>GPL Cooperation Commitment 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="GStreamer-exception-2005">
+                <xs:annotation>
+                    <xs:documentation>GStreamer Exception (2005)</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="GStreamer-exception-2008">
+                <xs:annotation>
+                    <xs:documentation>GStreamer Exception (2008)</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="i2p-gpl-java-exception">
                 <xs:annotation>
                     <xs:documentation>i2p GPL+Java Exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="KiCad-libraries-exception">
+                <xs:annotation>
+                    <xs:documentation>KiCad Libraries Exception</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="LGPL-3.0-linking-exception">
                 <xs:annotation>
                     <xs:documentation>LGPL-3.0 Linking Exception</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="libpri-OpenH323-exception">
+                <xs:annotation>
+                    <xs:documentation>libpri OpenH323 exception</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="Libtool-exception">
                 <xs:annotation>
                     <xs:documentation>Libtool Exception</xs:documentation>
@@ -2413,6 +2958,11 @@
                     <xs:documentation>Linux Syscall Note</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="LLGPL">
+                <xs:annotation>
+                    <xs:documentation>LLGPL Preamble</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="LLVM-exception">
                 <xs:annotation>
                     <xs:documentation>LLVM Exception</xs:documentation>
@@ -2458,6 +3008,11 @@
                     <xs:documentation>PS/PDF font exception (2017-08-17)</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="QPL-1.0-INRIA-2004-exception">
+                <xs:annotation>
+                    <xs:documentation>INRIA QPL 1.0 2004 variant exception</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="Qt-GPL-exception-1.0">
                 <xs:annotation>
                     <xs:documentation>Qt GPL exception 1.0</xs:documentation>
@@ -2483,6 +3038,11 @@
                     <xs:documentation>Solderpad Hardware License v2.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="SWI-exception">
+                <xs:annotation>
+                    <xs:documentation>SWI exception</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="Swift-exception">
                 <xs:annotation>
                     <xs:documentation>Swift Exception</xs:documentation>
@@ -2498,11 +3058,21 @@
                     <xs:documentation>Universal FOSS Exception, Version 1.0</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="vsftpd-openssl-exception">
+                <xs:annotation>
+                    <xs:documentation>vsftpd OpenSSL exception</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="WxWindows-exception-3.1">
                 <xs:annotation>
                     <xs:documentation>WxWindows Library Exception 3.1</xs:documentation>
                 </xs:annotation>
             </xs:enumeration>
+            <xs:enumeration value="x11vnc-openssl-exception">
+                <xs:annotation>
+                    <xs:documentation>x11vnc OpenSSL Exception</xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
         </xs:restriction>
     </xs:simpleType>
 

From dbc0ed67d51abd3777ec1831b90137014efbdd4d Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sat, 16 Sep 2023 17:53:50 +0200
Subject: [PATCH 18/41] cleanups and tets

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 .github/workflows/python.yml  | 27 ++++++++++++---------------
 cyclonedx/validation/json.py  |  3 +--
 deps.lowest.r                 |  9 ---------
 tests/base.py                 |  4 ++--
 tests/test_schema__res.py     |  2 +-
 tests/test_validation_json.py | 35 ++++++++++++++++++++++++-----------
 tools/schema-downloader.py    |  2 +-
 tox.ini                       | 10 +++++-----
 8 files changed, 46 insertions(+), 46 deletions(-)
 delete mode 100644 deps.lowest.r

diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml
index c94d51b68..7f48466de 100644
--- a/.github/workflows/python.yml
+++ b/.github/workflows/python.yml
@@ -49,21 +49,21 @@ jobs:
         run: poetry run tox run -e flake8 -s false
 
   static-code-analysis:
-    name: StaticCodingAnalysis (py${{ matrix.python-version}} ${{ matrix.toxenv-factor }})
+    name: StaticCodingAnalysis (py${{ matrix.python-version}} ${{ matrix.toxenv-factors }})
     runs-on: ${{ matrix.os }}
     timeout-minutes: 10
     strategy:
       fail-fast: false
       matrix:
         include:
-          - # test with the locked dependencies
+          - # test with the latest dependencies
             os: ubuntu-latest
             python-version: '3.11'
-            toxenv-factor: 'locked'
+            toxenv-factors: 'current'
           - # test with the lowest dependencies
             os: ubuntu-latest
             python-version: '3.8'
-            toxenv-factor: 'lowest'
+            toxenv-factors: 'lowest'
     steps:
       - name: Checkout
         # see https://github.com/actions/checkout
@@ -82,10 +82,10 @@ jobs:
       - name: Install dependencies
         run: poetry install --no-root
       - name: Run tox
-        run: poetry run tox run -e mypy-${{ matrix.toxenv-factor }} -s false
+        run: poetry run tox run -e mypy${{ matrix.toxenv-factors }} -s false
 
   build-and-test:
-    name: Test (${{ matrix.os }} py${{ matrix.python-version }} ${{ matrix.toxenv-factor }})
+    name: Test (${{ matrix.os }} py${{ matrix.python-version }} ${{ matrix.toxenv-factors }})
     runs-on: ${{ matrix.os }}
     timeout-minutes: 15
     strategy:
@@ -97,12 +97,9 @@ jobs:
           - "3.10"
           - "3.9"
           - "3.8"  # lowest supported
-        toxenv-factor: ['locked']
-        include:
-          - # test with the lowest dependencies
-            os: ubuntu-latest
-            python-version: '3.8'
-            toxenv-factor: 'lowest'
+        toxenv-factors:
+          - '-allExtras'
+          - '-noExtras'
     steps:
       - name: Disabled Git auto EOL CRLF transforms
         run: |
@@ -134,14 +131,14 @@ jobs:
       - name: Ensure build successful
         run: poetry build
       - name: Run tox
-        run: poetry run tox run -e py-${{ matrix.toxenv-factor }} -s false
+        run: poetry run tox run -e py-${{ matrix.toxenv-factors }} -s false
       - name: Generate coverage reports
         shell: bash
         run: |
           set -eux
           poetry run coverage report
-          poetry run coverage xml -o "$REPORTS_DIR/coverage.${{ matrix.os }}_py${{ matrix.python-version }}_${{ matrix.toxenv-factor }}.cobertura.xml"
-          # poetry run coverage lcov -o "$REPORTS_DIR/coverage.${{ matrix.os }}_py${{ matrix.python-version }}_${{ matrix.toxenv-factor }}.lcov.xml"
+          poetry run coverage xml -o "$REPORTS_DIR/coverage.${{ matrix.os }}_py${{ matrix.python-version }}_${{ matrix.toxenv-factors }}.cobertura.xml"
+          # poetry run coverage lcov -o "$REPORTS_DIR/coverage.${{ matrix.os }}_py${{ matrix.python-version }}_${{ matrix.toxenv-factors }}.lcov.xml"
       - name: Artifact reports
         if: ${{ ! cancelled() }}
         # see https://github.com/actions/upload-artifact
diff --git a/cyclonedx/validation/json.py b/cyclonedx/validation/json.py
index cb3ed1072..c6f05dfd3 100644
--- a/cyclonedx/validation/json.py
+++ b/cyclonedx/validation/json.py
@@ -18,7 +18,7 @@
 
 from abc import ABC
 from json import loads as json_loads
-from typing import TYPE_CHECKING, Any, Never, Optional, Tuple
+from typing import TYPE_CHECKING, Any, Optional, Tuple
 
 from ..schema._res import BOM_JSON as _S_BOM, BOM_JSON_STRICT as _S_BOM_STRICT, JSF as _S_JSF, SPDX_JSON as _S_SPPDX
 from . import MissingOptionalDependencyException, ValidationError, _BaseValidator
@@ -28,7 +28,6 @@
     from jsonschema.exceptions import ValidationError as JsonValidationError  # type: ignore
     from jsonschema.validators import Draft7Validator  # type: ignore
     from referencing import Registry
-    from referencing.exceptions import NoSuchResource
     from referencing.jsonschema import DRAFT7
 
     if TYPE_CHECKING:
diff --git a/deps.lowest.r b/deps.lowest.r
deleted file mode 100644
index d4d29f737..000000000
--- a/deps.lowest.r
+++ /dev/null
@@ -1,9 +0,0 @@
-# exactly pinned dependencies to the lowest version regardless of python_version
-# see pyptoject file for ranges
-
-packageurl-python == 0.11.1
-py-serializable == 0.11.1
-jsonschema == 4.0.0
-lxml == 4.0.0
-
-# file name is a untypical one, so dependabot does not bump this file
diff --git a/tests/base.py b/tests/base.py
index 91b5c4f0f..7acc11da7 100644
--- a/tests/base.py
+++ b/tests/base.py
@@ -32,7 +32,7 @@
 from xmldiff.actions import MoveNode
 
 from cyclonedx.output import SchemaVersion
-from cyclonedx.schema import _RES_DIR as CDX_SCHEMA_DIRECTORY
+from cyclonedx.schema._res import __DIR as CDX_SCHEMA_DIRECTORY
 from cyclonedx.validation import MissingOptionalDependencyException
 from cyclonedx.validation.json import JsonValidator
 
@@ -89,7 +89,7 @@ class BaseXmlTestCase(TestCase):
 
     def assertValidAgainstSchema(self, bom_xml: str, schema_version: SchemaVersion) -> None:
         # rework access
-        xsd_fn = os.path.join(CDX_SCHEMA_DIRECTORY, f'bom-{schema_version.name.replace("_", ".").replace("V", "")}.xsd')
+        xsd_fn = os.path.join(CDX_SCHEMA_DIRECTORY, f'bom-{schema_version.to_version()}.SNAPSHOT.xsd')
         with open(xsd_fn) as xsd_fd:
             xsd_doc = etree.parse(xsd_fd)
 
diff --git a/tests/test_schema__res.py b/tests/test_schema__res.py
index 89622a4bb..0ac92db2a 100644
--- a/tests/test_schema__res.py
+++ b/tests/test_schema__res.py
@@ -40,5 +40,5 @@ def _dp_files() -> Generator:
 class SchemaRes(TestCase):
 
     @idata(_dp_files())
-    def test_file_exists(self, file) -> None:
+    def test_file_exists(self, file: str) -> None:
         self.assertTrue(isfile(file), file)
diff --git a/tests/test_validation_json.py b/tests/test_validation_json.py
index 7e213aa19..583a597ba 100644
--- a/tests/test_validation_json.py
+++ b/tests/test_validation_json.py
@@ -25,6 +25,7 @@
 from ddt import data, ddt, idata, unpack
 
 from cyclonedx.schema import SchemaVersion
+from cyclonedx.validation import MissingOptionalDependencyException
 from cyclonedx.validation.json import JsonStrictValidator, JsonValidator
 
 from . import TESTDATA_DIRECTORY
@@ -55,8 +56,11 @@ def test_validate_no_none(self, schema_version: SchemaVersion, test_data_file: s
         validator = JsonValidator(schema_version)
         with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), test_data_file), 'r') as tdfh:
             test_data = tdfh.read()
-        error = validator.validate_str(test_data)
-        self.assertIsNone(error)
+        try:
+            validation_error = validator.validate_str(test_data)
+        except MissingOptionalDependencyException:
+            self.skipTest('MissingOptionalDependencyException')
+        self.assertIsNone(validation_error)
 
     @idata(_dp('invalid'))
     @unpack
@@ -64,13 +68,16 @@ def test_validate_expected_error(self, schema_version: SchemaVersion, test_data_
         validator = JsonValidator(schema_version)
         with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), test_data_file), 'r') as tdfh:
             test_data = tdfh.read()
-        error = validator.validate_str(test_data)
-        self.assertIsNotNone(error)
-        self.assertIsNotNone(error.data)
+        try:
+            validation_error = validator.validate_str(test_data)
+        except MissingOptionalDependencyException:
+            self.skipTest('MissingOptionalDependencyException')
+        self.assertIsNotNone(validation_error)
+        self.assertIsNotNone(validation_error.data)
 
 
 @ddt
-class TestJsonValidator(TestCase):
+class TestJsonStrictValidator(TestCase):
 
     @data(*UNSUPPORTED_SCHEMA_VERSIONS)
     def test_throws_with_unsupported_schema_version(self, schema_version: SchemaVersion) -> None:
@@ -83,8 +90,11 @@ def test_validate_no_none(self, schema_version: SchemaVersion, test_data_file: s
         validator = JsonStrictValidator(schema_version)
         with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), test_data_file), 'r') as tdfh:
             test_data = tdfh.read()
-        error = validator.validate_str(test_data)
-        self.assertIsNone(error)
+        try:
+            validation_error = validator.validate_str(test_data)
+        except MissingOptionalDependencyException:
+            self.skipTest('MissingOptionalDependencyException')
+        self.assertIsNone(validation_error)
 
     @idata(_dp('invalid'))
     @unpack
@@ -92,6 +102,9 @@ def test_validate_expected_error(self, schema_version: SchemaVersion, test_data_
         validator = JsonStrictValidator(schema_version)
         with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), test_data_file), 'r') as tdfh:
             test_data = tdfh.read()
-        error = validator.validate_str(test_data)
-        self.assertIsNotNone(error)
-        self.assertIsNotNone(error.data)
+        try:
+            validation_error = validator.validate_str(test_data)
+        except MissingOptionalDependencyException:
+            self.skipTest('MissingOptionalDependencyException')
+        self.assertIsNotNone(validation_error)
+        self.assertIsNotNone(validation_error.data)
diff --git a/tools/schema-downloader.py b/tools/schema-downloader.py
index 735a306c7..c3768173a 100644
--- a/tools/schema-downloader.py
+++ b/tools/schema-downloader.py
@@ -18,7 +18,7 @@
 from urllib.request import urlretrieve
 import re
 
-SOURCE_ROOT = 'https://raw.githubusercontent.com/CycloneDX/specification/1.4/schema/'
+SOURCE_ROOT = 'https://raw.githubusercontent.com/CycloneDX/specification/master/schema/'
 TARGET_ROOT = join(dirname(__file__), '..', 'cyclonedx', 'schema', '_res')
 
 bom_xsd = {
diff --git a/tox.ini b/tox.ini
index 5f6bc97eb..16ee611d3 100644
--- a/tox.ini
+++ b/tox.ini
@@ -7,8 +7,8 @@
 minversion = 4.0
 envlist =
     flake8
-    mypy-{locked,lowest}
-    py{311,310,39,38}-{locked,lowest}
+    mypy-{current,lowest}
+    py{311,310,39,38}-{allExtras,noExtras}
 skip_missing_interpreters = True
 usedevelop = False
 download = False
@@ -19,8 +19,8 @@ skip_install = True
 allowlist_externals = poetry
 commands_pre =
     {envpython} --version
-    poetry install -v
-    lowest: poetry run pip install -U -r deps.lowest.r
+    !noExtras: poetry install -v --all-extras
+    noExtras: poetry install -v
     poetry run pip freeze
 commands =
     poetry run coverage run --source=cyclonedx -m unittest discover -t . -s tests -v
@@ -28,7 +28,7 @@ setenv =
     PYTHONHASHSEED=0
     CDX_TEST_RECREATE_SNAPSHOTS={env:CDX_TEST_RECREATE_SNAPSHOTS:}
 
-[testenv:mypy{,-locked,-lowest}]
+[testenv:mypy{,-current,-lowest}]
 commands =
     # mypy config is in own file: `.mypy.ini`
     !lowest: poetry run mypy

From 207dd19a9e6b228f5b87bda9ab0264de0b0944b6 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sat, 16 Sep 2023 18:02:37 +0200
Subject: [PATCH 19/41] compat fixes

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 .github/workflows/python.yml  |  4 ++--
 tests/test_validation_json.py | 10 +++++-----
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml
index 7f48466de..5ebcb875b 100644
--- a/.github/workflows/python.yml
+++ b/.github/workflows/python.yml
@@ -59,11 +59,11 @@ jobs:
           - # test with the latest dependencies
             os: ubuntu-latest
             python-version: '3.11'
-            toxenv-factors: 'current'
+            toxenv-factors: '-current'
           - # test with the lowest dependencies
             os: ubuntu-latest
             python-version: '3.8'
-            toxenv-factors: 'lowest'
+            toxenv-factors: '-lowest'
     steps:
       - name: Checkout
         # see https://github.com/actions/checkout
diff --git a/tests/test_validation_json.py b/tests/test_validation_json.py
index 583a597ba..00c91851b 100644
--- a/tests/test_validation_json.py
+++ b/tests/test_validation_json.py
@@ -38,7 +38,7 @@
 def _dp(prefix: str) -> Generator:
     return (
         (sv, tf) for sv in SchemaVersion if sv not in UNSUPPORTED_SCHEMA_VERSIONS
-        for tf in iglob(f'{prefix}-*.json', root_dir=join(RELEVANT_TESTDATA_DIRECTORY, sv.to_version()))
+        for tf in iglob(join(RELEVANT_TESTDATA_DIRECTORY, sv.to_version(), f'{prefix}-*.json'))
     )
 
 
@@ -54,7 +54,7 @@ def test_throws_with_unsupported_schema_version(self, schema_version: SchemaVers
     @unpack
     def test_validate_no_none(self, schema_version: SchemaVersion, test_data_file: str) -> None:
         validator = JsonValidator(schema_version)
-        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), test_data_file), 'r') as tdfh:
+        with open(join(test_data_file), 'r') as tdfh:
             test_data = tdfh.read()
         try:
             validation_error = validator.validate_str(test_data)
@@ -66,7 +66,7 @@ def test_validate_no_none(self, schema_version: SchemaVersion, test_data_file: s
     @unpack
     def test_validate_expected_error(self, schema_version: SchemaVersion, test_data_file: str) -> None:
         validator = JsonValidator(schema_version)
-        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), test_data_file), 'r') as tdfh:
+        with open(join(test_data_file), 'r') as tdfh:
             test_data = tdfh.read()
         try:
             validation_error = validator.validate_str(test_data)
@@ -88,7 +88,7 @@ def test_throws_with_unsupported_schema_version(self, schema_version: SchemaVers
     @unpack
     def test_validate_no_none(self, schema_version: SchemaVersion, test_data_file: str) -> None:
         validator = JsonStrictValidator(schema_version)
-        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), test_data_file), 'r') as tdfh:
+        with open(join(test_data_file), 'r') as tdfh:
             test_data = tdfh.read()
         try:
             validation_error = validator.validate_str(test_data)
@@ -100,7 +100,7 @@ def test_validate_no_none(self, schema_version: SchemaVersion, test_data_file: s
     @unpack
     def test_validate_expected_error(self, schema_version: SchemaVersion, test_data_file: str) -> None:
         validator = JsonStrictValidator(schema_version)
-        with open(join(RELEVANT_TESTDATA_DIRECTORY, schema_version.to_version(), test_data_file), 'r') as tdfh:
+        with open(join(test_data_file), 'r') as tdfh:
             test_data = tdfh.read()
         try:
             validation_error = validator.validate_str(test_data)

From f246747d27ae21182237dbfea8770af90acbd0a7 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sat, 16 Sep 2023 18:20:28 +0200
Subject: [PATCH 20/41] fix tox

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/validation/json.py | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/cyclonedx/validation/json.py b/cyclonedx/validation/json.py
index c6f05dfd3..a4dbdd25c 100644
--- a/cyclonedx/validation/json.py
+++ b/cyclonedx/validation/json.py
@@ -25,13 +25,13 @@
 
 _missing_deps_error: Optional[Tuple[MissingOptionalDependencyException, ImportError]] = None
 try:
-    from jsonschema.exceptions import ValidationError as JsonValidationError  # type: ignore
-    from jsonschema.validators import Draft7Validator  # type: ignore
-    from referencing import Registry
-    from referencing.jsonschema import DRAFT7
+    from jsonschema.exceptions import ValidationError as JsonValidationError  # type: ignore[import]
+    from jsonschema.validators import Draft7Validator  # type: ignore[import]
+    from referencing import Registry  # type: ignore[import]
+    from referencing.jsonschema import DRAFT7  # type: ignore[import]
 
     if TYPE_CHECKING:
-        from jsonschema.protocols import Validator as JsonSchemaValidator  # type: ignore
+        from jsonschema.protocols import Validator as JsonSchemaValidator  # type: ignore[import]
 except ImportError as err:
     _missing_deps_error = MissingOptionalDependencyException(
         'This functionality requires optional dependencies.\n'

From 53db34df898614304a5000e656f6419cc6a79865 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sat, 16 Sep 2023 18:23:19 +0200
Subject: [PATCH 21/41] typo

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/validation/json.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/cyclonedx/validation/json.py b/cyclonedx/validation/json.py
index a4dbdd25c..d55168c72 100644
--- a/cyclonedx/validation/json.py
+++ b/cyclonedx/validation/json.py
@@ -20,7 +20,7 @@
 from json import loads as json_loads
 from typing import TYPE_CHECKING, Any, Optional, Tuple
 
-from ..schema._res import BOM_JSON as _S_BOM, BOM_JSON_STRICT as _S_BOM_STRICT, JSF as _S_JSF, SPDX_JSON as _S_SPPDX
+from ..schema._res import BOM_JSON as _S_BOM, BOM_JSON_STRICT as _S_BOM_STRICT, JSF as _S_JSF, SPDX_JSON as _S_SPDX
 from . import MissingOptionalDependencyException, ValidationError, _BaseValidator
 
 _missing_deps_error: Optional[Tuple[MissingOptionalDependencyException, ImportError]] = None
@@ -79,7 +79,7 @@ def _validator(self) -> 'JsonSchemaValidator':
         @staticmethod
         def __make_validator_registry() -> Registry[Any]:
             schema_prefix = 'http://cyclonedx.org/schema/'
-            with open(_S_SPPDX) as spdx, open(_S_JSF) as jsf:
+            with open(_S_SPDX) as spdx, open(_S_JSF) as jsf:
                 return Registry().with_resources([
                     (f'{schema_prefix}spdx.SNAPSHOT.schema.json', DRAFT7.create_resource(json_loads(spdx.read()))),
                     (f'{schema_prefix}jsf-0.82.SNAPSHOT.schema.json', DRAFT7.create_resource(json_loads(jsf.read()))),

From 7d9f39402c277683494a8fb7f77b4ceed22f056a Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sat, 16 Sep 2023 18:29:19 +0200
Subject: [PATCH 22/41] qa

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/validation/json.py | 1 -
 1 file changed, 1 deletion(-)

diff --git a/cyclonedx/validation/json.py b/cyclonedx/validation/json.py
index d55168c72..be8da54c4 100644
--- a/cyclonedx/validation/json.py
+++ b/cyclonedx/validation/json.py
@@ -73,7 +73,6 @@ def _validator(self) -> 'JsonSchemaValidator':
                         json_loads(sf.read()),
                         registry=self.__make_validator_registry(),
                         format_checker=Draft7Validator.FORMAT_CHECKER)
-            assert self.__validator
             return self.__validator
 
         @staticmethod

From 65f8f717199dc7788b85bcd8933af2a24e3174b4 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Mon, 18 Sep 2023 14:34:53 +0200
Subject: [PATCH 23/41] fix ci

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 .github/workflows/python.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml
index 5ebcb875b..8612c1ddc 100644
--- a/.github/workflows/python.yml
+++ b/.github/workflows/python.yml
@@ -131,7 +131,7 @@ jobs:
       - name: Ensure build successful
         run: poetry build
       - name: Run tox
-        run: poetry run tox run -e py-${{ matrix.toxenv-factors }} -s false
+        run: poetry run tox run -e py${{ matrix.toxenv-factors }} -s false
       - name: Generate coverage reports
         shell: bash
         run: |

From 12955f72858e14ca1cb39f46e4b453e9b52b8809 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Tue, 19 Sep 2023 11:05:25 +0200
Subject: [PATCH 24/41] qa fixes

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/validation/json.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/cyclonedx/validation/json.py b/cyclonedx/validation/json.py
index be8da54c4..5e27b3f29 100644
--- a/cyclonedx/validation/json.py
+++ b/cyclonedx/validation/json.py
@@ -27,8 +27,8 @@
 try:
     from jsonschema.exceptions import ValidationError as JsonValidationError  # type: ignore[import]
     from jsonschema.validators import Draft7Validator  # type: ignore[import]
-    from referencing import Registry  # type: ignore[import]
-    from referencing.jsonschema import DRAFT7  # type: ignore[import]
+    from referencing import Registry
+    from referencing.jsonschema import DRAFT7
 
     if TYPE_CHECKING:
         from jsonschema.protocols import Validator as JsonSchemaValidator  # type: ignore[import]

From 646185af6825556aaefbf809c7e0501deed69580 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Tue, 19 Sep 2023 12:18:55 +0200
Subject: [PATCH 25/41] xml validator

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/validation/__init__.py |  2 +-
 cyclonedx/validation/json.py     |  9 ++--
 cyclonedx/validation/xml.py      | 64 +++++++++++++++++++++++++++
 tests/base.py                    | 24 +++-------
 tests/test_validation_json.py    |  4 +-
 tests/test_validation_xml.py     | 76 ++++++++++++++++++++++++++++++++
 tools/schema-downloader.py       |  6 +--
 7 files changed, 156 insertions(+), 29 deletions(-)
 create mode 100644 tests/test_validation_xml.py

diff --git a/cyclonedx/validation/__init__.py b/cyclonedx/validation/__init__.py
index 7e8603e3c..4afd457d9 100644
--- a/cyclonedx/validation/__init__.py
+++ b/cyclonedx/validation/__init__.py
@@ -41,7 +41,7 @@ class _BaseValidator(ABC):
     def __init__(self, schema_version: 'SchemaVersion') -> None:
         self.__schema_version = schema_version
         if not self._schema_file:
-            raise NotImplementedError(f'not implemented for schema {schema_version}')
+            raise ValueError(f'unsupported schema: {schema_version}')
 
     @property
     @abstractmethod
diff --git a/cyclonedx/validation/json.py b/cyclonedx/validation/json.py
index 5e27b3f29..e181443af 100644
--- a/cyclonedx/validation/json.py
+++ b/cyclonedx/validation/json.py
@@ -46,13 +46,12 @@ class __BaseJsonValidator(_BaseValidator, ABC):
         def validate_str(self, data: str) -> Optional[ValidationError]:
             raise self.__MDERROR[0]  # from functionality_not_implemented_error[1]
 
-        def validata_data(self, data: Any) -> Optional[ValidationError]:
-            raise self.__MDERROR[0]  # from functionality_not_implemented_error[1]
     else:
         def validate_str(self, data: str) -> Optional[ValidationError]:
-            return self.validata_data(json_loads(data))
+            return self._validata_data(
+                json_loads(data))
 
-        def validata_data(self, data: Any) -> Optional[ValidationError]:
+        def _validata_data(self, data: Any) -> Optional[ValidationError]:
             validator = self._validator  # may throw on error that MUST NOT be caught
             try:
                 validator.validate(data)
@@ -67,7 +66,7 @@ def _validator(self) -> 'JsonSchemaValidator':
             if not self.__validator:
                 schema_file = self._schema_file
                 if schema_file is None:
-                    raise NotImplementedError('mising schema file')
+                    raise NotImplementedError('missing schema file')
                 with open(schema_file) as sf:
                     self.__validator = Draft7Validator(
                         json_loads(sf.read()),
diff --git a/cyclonedx/validation/xml.py b/cyclonedx/validation/xml.py
index 5294f7ba6..05388659b 100644
--- a/cyclonedx/validation/xml.py
+++ b/cyclonedx/validation/xml.py
@@ -13,3 +13,67 @@
 # limitations under the License.
 #
 # SPDX-License-Identifier: Apache-2.0
+
+__all__ = ['XmlValidator']
+
+from abc import ABC
+from typing import Any, Optional, Tuple
+
+from ..schema._res import BOM_XML as _S_BOM
+from . import MissingOptionalDependencyException, ValidationError, _BaseValidator
+
+_missing_deps_error: Optional[Tuple[MissingOptionalDependencyException, ImportError]] = None
+try:
+    from lxml.etree import (  # type: ignore[import]
+        DocumentInvalid,
+        XMLParser,
+        XMLSchema,
+        fromstring as xml_fromstring,
+        parse as xml_parse,
+    )
+except ImportError as err:
+    _missing_deps_error = MissingOptionalDependencyException(
+        'This functionality requires optional dependencies.\n'
+        'Please install `cyclonedx-python-lib` with the extra "json-validation".\n'
+    ), err
+
+
+class __BaseXmlValidator(_BaseValidator, ABC):
+    if _missing_deps_error:
+        __MDERROR = _missing_deps_error
+
+        def validate_str(self, data: str) -> Optional[ValidationError]:
+            raise self.__MDERROR[0]  # from functionality_not_implemented_error[1]
+    else:
+        def validate_str(self, data: str) -> Optional[ValidationError]:
+            return self._validata_data(
+                xml_fromstring(bytes(data, encoding='utf8'), parser=self.__xml_parser))
+
+        def _validata_data(self, data: Any) -> Optional[ValidationError]:
+            validator = self._validator  # may throw on error that MUST NOT be caught
+            if not validator.validate(data):
+                return ValidationError(validator.error_log.last_error)
+            return None
+
+        __validator: Optional['XMLSchema'] = None
+
+        __xml_parser = XMLParser(
+            resolve_entities=False,
+            no_network=True,
+            huge_tree=True,
+            compact=True)
+
+        @property
+        def _validator(self) -> 'XMLSchema':
+            if not self.__validator:
+                schema_file = self._schema_file
+                if schema_file is None:
+                    raise NotImplementedError('missing schema file')
+                self.__validator = XMLSchema(file=schema_file)
+            return self.__validator
+
+
+class XmlValidator(__BaseXmlValidator):
+    @property
+    def _schema_file(self) -> Optional[str]:
+        return _S_BOM.get(self.schema_version)
diff --git a/tests/base.py b/tests/base.py
index 7acc11da7..3c1c2989f 100644
--- a/tests/base.py
+++ b/tests/base.py
@@ -19,7 +19,6 @@
 
 import io
 import json
-import os
 import xml.etree.ElementTree
 from datetime import datetime, timezone
 from typing import Any
@@ -27,14 +26,13 @@
 from uuid import uuid4
 
 from lxml import etree
-from lxml.etree import DocumentInvalid
 from xmldiff import main
 from xmldiff.actions import MoveNode
 
 from cyclonedx.output import SchemaVersion
-from cyclonedx.schema._res import __DIR as CDX_SCHEMA_DIRECTORY
 from cyclonedx.validation import MissingOptionalDependencyException
 from cyclonedx.validation.json import JsonValidator
+from cyclonedx.validation.xml import XmlValidator
 
 single_uuid: str = 'urn:uuid:{}'.format(uuid4())
 
@@ -88,22 +86,12 @@ def assertEqualJsonBom(self, a: str, b: str) -> None:
 class BaseXmlTestCase(TestCase):
 
     def assertValidAgainstSchema(self, bom_xml: str, schema_version: SchemaVersion) -> None:
-        # rework access
-        xsd_fn = os.path.join(CDX_SCHEMA_DIRECTORY, f'bom-{schema_version.to_version()}.SNAPSHOT.xsd')
-        with open(xsd_fn) as xsd_fd:
-            xsd_doc = etree.parse(xsd_fd)
-
-        xml_schema = etree.XMLSchema(xsd_doc)
-        schema_validates = False
         try:
-            schema_validates = xml_schema.validate(etree.parse(io.BytesIO(bytes(bom_xml, 'ascii'))))
-        except DocumentInvalid as e:
-            print(f'Failed to validate SBOM against schema: {str(e)}')
-
-        if not schema_validates:
-            print(xml_schema.error_log.last_error)
-        self.assertTrue(schema_validates, f'Failed to validate Generated SBOM against XSD Schema:'
-                                          f'{bom_xml}')
+            validation_error = XmlValidator(schema_version).validate_str(bom_xml)
+        except MissingOptionalDependencyException:
+            return  # some deps are missing - skip the validation
+        self.assertIsNone(validation_error,
+                          f'Failed to validate Generated SBOM against XSD Schema: {str(validation_error)}')
 
     def assertEqualXml(self, a: str, b: str) -> None:
         diff_results = main.diff_texts(a, b, diff_options={'F': 0.5})
diff --git a/tests/test_validation_json.py b/tests/test_validation_json.py
index 00c91851b..2e919e600 100644
--- a/tests/test_validation_json.py
+++ b/tests/test_validation_json.py
@@ -47,7 +47,7 @@ class TestJsonValidator(TestCase):
 
     @data(*UNSUPPORTED_SCHEMA_VERSIONS)
     def test_throws_with_unsupported_schema_version(self, schema_version: SchemaVersion) -> None:
-        with self.assertRaisesRegex(NotImplementedError, 'not implemented for schema'):
+        with self.assertRaisesRegex(ValueError, 'unsupported schema:'):
             JsonValidator(schema_version)
 
     @idata(_dp('valid'))
@@ -81,7 +81,7 @@ class TestJsonStrictValidator(TestCase):
 
     @data(*UNSUPPORTED_SCHEMA_VERSIONS)
     def test_throws_with_unsupported_schema_version(self, schema_version: SchemaVersion) -> None:
-        with self.assertRaisesRegex(NotImplementedError, 'not implemented for schema'):
+        with self.assertRaisesRegex(ValueError, 'unsupported schema:'):
             JsonStrictValidator(schema_version)
 
     @idata(_dp('valid'))
diff --git a/tests/test_validation_xml.py b/tests/test_validation_xml.py
new file mode 100644
index 000000000..e8f711276
--- /dev/null
+++ b/tests/test_validation_xml.py
@@ -0,0 +1,76 @@
+# encoding: utf-8
+
+# This file is part of CycloneDX Python Lib
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+# Copyright (c) OWASP Foundation. All Rights Reserved.
+
+from glob import iglob
+from os.path import join
+from typing import Generator
+from unittest import TestCase
+
+from ddt import data, ddt, idata, unpack
+
+from cyclonedx.schema import SchemaVersion
+from cyclonedx.validation import MissingOptionalDependencyException
+from cyclonedx.validation.xml import XmlValidator
+
+from . import TESTDATA_DIRECTORY
+
+RELEVANT_TESTDATA_DIRECTORY = join(TESTDATA_DIRECTORY, 'schemaTestData')
+
+UNSUPPORTED_SCHEMA_VERSIONS = set()
+
+
+def _dp(prefix: str) -> Generator:
+    return (
+        (sv, tf) for sv in SchemaVersion if sv not in UNSUPPORTED_SCHEMA_VERSIONS
+        for tf in iglob(join(RELEVANT_TESTDATA_DIRECTORY, sv.to_version(), f'{prefix}-*.xml'))
+    )
+
+
+@ddt
+class TestXmlValidator(TestCase):
+
+    @data(*UNSUPPORTED_SCHEMA_VERSIONS)
+    def test_throws_with_unsupported_schema_version(self, schema_version: SchemaVersion) -> None:
+        with self.assertRaisesRegex(ValueError, 'unsupported schema'):
+            XmlValidator(schema_version)
+
+    @idata(_dp('valid'))
+    @unpack
+    def test_validate_no_none(self, schema_version: SchemaVersion, test_data_file: str) -> None:
+        validator = XmlValidator(schema_version)
+        with open(join(test_data_file), 'r') as tdfh:
+            test_data = tdfh.read()
+        try:
+            validation_error = validator.validate_str(test_data)
+        except MissingOptionalDependencyException:
+            self.skipTest('MissingOptionalDependencyException')
+        self.assertIsNone(validation_error)
+
+    @idata(_dp('invalid'))
+    @unpack
+    def test_validate_expected_error(self, schema_version: SchemaVersion, test_data_file: str) -> None:
+        validator = XmlValidator(schema_version)
+        with open(join(test_data_file), 'r') as tdfh:
+            test_data = tdfh.read()
+        try:
+            validation_error = validator.validate_str(test_data)
+        except MissingOptionalDependencyException:
+            self.skipTest('MissingOptionalDependencyException')
+        self.assertIsNotNone(validation_error)
+        self.assertIsNotNone(validation_error.data)
diff --git a/tools/schema-downloader.py b/tools/schema-downloader.py
index c3768173a..b27982807 100644
--- a/tools/schema-downloader.py
+++ b/tools/schema-downloader.py
@@ -1,5 +1,8 @@
 # encoding: utf-8
 import re
+from os.path import dirname, join
+from urllib.request import urlretrieve
+
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
@@ -14,9 +17,6 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 
-from os.path import dirname, join
-from urllib.request import urlretrieve
-import re
 
 SOURCE_ROOT = 'https://raw.githubusercontent.com/CycloneDX/specification/master/schema/'
 TARGET_ROOT = join(dirname(__file__), '..', 'cyclonedx', 'schema', '_res')

From df4b329105898ffb6b68f6b863d732a448b0a86f Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Tue, 19 Sep 2023 12:39:01 +0200
Subject: [PATCH 26/41] examples

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 CONTRIBUTING.md                               |  2 +-
 cyclonedx/validation/xml.py                   |  8 +------
 docs/examples.rst                             |  6 ++---
 .../{build_and_serialize.py => complex.py}    | 23 +++++++++++++++----
 tests/base.py                                 |  1 -
 tox.ini                                       |  2 +-
 6 files changed, 25 insertions(+), 17 deletions(-)
 rename examples/{build_and_serialize.py => complex.py} (62%)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index c4cfa73b2..39dbcaf2e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -23,7 +23,7 @@ Get it all applied via:
 
 ```shell
 poetry run isort .
-poetry run autopep8 -ir cyclonedx/ tests/ typings/
+poetry run autopep8 -ir cyclonedx/ tests/ typings/ examples/
 ```
 
 ## Documentation
diff --git a/cyclonedx/validation/xml.py b/cyclonedx/validation/xml.py
index 05388659b..65a3e5ad1 100644
--- a/cyclonedx/validation/xml.py
+++ b/cyclonedx/validation/xml.py
@@ -24,13 +24,7 @@
 
 _missing_deps_error: Optional[Tuple[MissingOptionalDependencyException, ImportError]] = None
 try:
-    from lxml.etree import (  # type: ignore[import]
-        DocumentInvalid,
-        XMLParser,
-        XMLSchema,
-        fromstring as xml_fromstring,
-        parse as xml_parse,
-    )
+    from lxml.etree import XMLParser, XMLSchema, fromstring as xml_fromstring  # type: ignore[import]
 except ImportError as err:
     _missing_deps_error = MissingOptionalDependencyException(
         'This functionality requires optional dependencies.\n'
diff --git a/docs/examples.rst b/docs/examples.rst
index 0df9d8d11..a2b9c97b6 100644
--- a/docs/examples.rst
+++ b/docs/examples.rst
@@ -15,9 +15,9 @@
 Examples
 ========
 
-Build & Serialize
------------------
+Complex
+-------
 
-.. literalinclude:: ../examples/build_and_serialize.py
+.. literalinclude:: ../examples/complex.py
   :language: python
   :linenos:
diff --git a/examples/build_and_serialize.py b/examples/complex.py
similarity index 62%
rename from examples/build_and_serialize.py
rename to examples/complex.py
index 52567e667..aa9b9ae31 100644
--- a/examples/build_and_serialize.py
+++ b/examples/complex.py
@@ -4,6 +4,10 @@
 from cyclonedx.model.component import Component, ComponentType
 from cyclonedx.output.json import JsonV1Dot4
 from cyclonedx.output.xml import XmlV1Dot4
+from cyclonedx.schema import SchemaVersion
+from cyclonedx.validation import MissingOptionalDependencyException
+from cyclonedx.validation.json import JsonValidator
+from cyclonedx.validation.xml import XmlValidator
 from packageurl import PackageURL
 
 lc_factory = LicenseChoiceFactory(license_factory=LicenseFactory())
@@ -44,8 +48,19 @@
 
 # endregion build the BOM
 
-serializedJSON = JsonV1Dot4(bom).output_as_string()
-print(serializedJSON)
 
-serializedXML = XmlV1Dot4(bom).output_as_string()
-print(serializedXML)
+serialized_json = JsonV1Dot4(bom).output_as_string()
+print(serialized_json)
+try:
+    valid = JsonValidator(SchemaVersion.V1_4).validate_str(serialized_json)
+    print('JSON is', 'valid' if valid else 'invalid')
+except MissingOptionalDependencyException as error:
+    print('JSON-validation was skipped due to', error)
+
+serialized_xml = XmlV1Dot4(bom).output_as_string()
+print(serialized_xml)
+try:
+    valid = XmlValidator(SchemaVersion.V1_4).validate_str(serialized_xml)
+    print('XML is', 'valid' if valid else 'invalid')
+except MissingOptionalDependencyException as error:
+    print('XML-validation was skipped due to', error)
diff --git a/tests/base.py b/tests/base.py
index 3c1c2989f..a0bbb2b29 100644
--- a/tests/base.py
+++ b/tests/base.py
@@ -17,7 +17,6 @@
 # SPDX-License-Identifier: Apache-2.0
 # Copyright (c) OWASP Foundation. All Rights Reserved.
 
-import io
 import json
 import xml.etree.ElementTree
 from datetime import datetime, timezone
diff --git a/tox.ini b/tox.ini
index 16ee611d3..cc8a302dc 100644
--- a/tox.ini
+++ b/tox.ini
@@ -36,7 +36,7 @@ commands =
 
 [testenv:flake8]
 commands =
-    poetry run flake8 cyclonedx/ tests/ typings/
+    poetry run flake8 cyclonedx/ tests/ typings/ examples/
 
 [flake8]
 ## keep in sync with isort config - in `isort.cfg` file

From 4c0f74f22685833f3a92702c7ed40f57d2b1a535 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Tue, 19 Sep 2023 12:50:18 +0200
Subject: [PATCH 27/41] docs

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 docs/install.rst | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/docs/install.rst b/docs/install.rst
index 43123c612..64ca60ef7 100644
--- a/docs/install.rst
+++ b/docs/install.rst
@@ -25,3 +25,21 @@ Install from `pypi.org`_ as you would any other Python module using your preferr
 
 .. _pypi.org: https://pypi.org/project/cyclonedx-python-lib/
 .. _conda-forge: https://anaconda.org/conda-forge/cyclonedx-python-lib
+
+Extras
+------
+
+The following extras are available when installing the package:
+
+`json-validation`
+    Install the optional dependencies needed for JSON validation.
+`xml-validation`
+    Install the optional dependencies needed for JSON validation.
+`validation`
+    Install the optional dependencies needed for the validations above.
+
+They can be used when installing in order to include additional dependencies, e.g.:
+
+.. code-block:: bash
+
+    pip install 'cyclonedx-python-lib[validation]'

From eb9cd507dff6195573441a7ebc86ae216de80d6e Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Tue, 19 Sep 2023 12:59:25 +0200
Subject: [PATCH 28/41] extras foo

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 .github/workflows/python.yml | 13 ++++++++++---
 docs/install.rst             |  4 ++--
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml
index 8612c1ddc..fd9bd508d 100644
--- a/.github/workflows/python.yml
+++ b/.github/workflows/python.yml
@@ -171,9 +171,16 @@ jobs:
           coverage-reports: ${{ env.REPORTS_DIR }}/coverage.*
 
   examples:
-    name: Examples
+    name: Examples E${{ matrix.install-extras }}
     runs-on: ubuntu-latest
-    timeout-minutes: 15
+    timeout-minutes: 10
+    strategy:
+      fail-fast: false
+      matrix:
+        install-extras:
+          - '' # none
+          - json-validation
+          - xml-validation
     steps:
       - name: Checkout
         # see https://github.com/actions/checkout
@@ -194,7 +201,7 @@ jobs:
         with:
           poetry-version: ${{ env.POETRY_VERSION }}
       - name: Install package and prod dependencies
-        run: poetry install --only=main -vvv
+        run: poetry install --only=main --extras='${{ matrix.install-extras }}' -vvv
       - name: run all examples
         run: >
           find examples -type f -name '*.py' -print0
diff --git a/docs/install.rst b/docs/install.rst
index 64ca60ef7..e646dfdc7 100644
--- a/docs/install.rst
+++ b/docs/install.rst
@@ -29,12 +29,12 @@ Install from `pypi.org`_ as you would any other Python module using your preferr
 Extras
 ------
 
-The following extras are available when installing the package:
+The following extras are available when installing this package:
 
 `json-validation`
     Install the optional dependencies needed for JSON validation.
 `xml-validation`
-    Install the optional dependencies needed for JSON validation.
+    Install the optional dependencies needed for XML validation.
 `validation`
     Install the optional dependencies needed for the validations above.
 

From 3a68e56b1cfa23bea085896c122f71ed3a89e02b Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Tue, 19 Sep 2023 13:00:42 +0200
Subject: [PATCH 29/41] docs

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 docs/install.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/install.rst b/docs/install.rst
index e646dfdc7..62bbb625b 100644
--- a/docs/install.rst
+++ b/docs/install.rst
@@ -36,7 +36,7 @@ The following extras are available when installing this package:
 `xml-validation`
     Install the optional dependencies needed for XML validation.
 `validation`
-    Install the optional dependencies needed for the validations above.
+    Install the optional dependencies needed for all supported validations.
 
 They can be used when installing in order to include additional dependencies, e.g.:
 

From 1e0b27819fd373074fc25833bba0d2702cd8740d Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Tue, 19 Sep 2023 13:04:35 +0200
Subject: [PATCH 30/41] docs

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 CONTRIBUTING.md       | 4 +++-
 docs/contributing.rst | 6 +++---
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 39dbcaf2e..75fb111b8 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -5,6 +5,8 @@ But please read the
 [CycloneDX contributing guidelines](https://github.com/CycloneDX/.github/blob/master/CONTRIBUTING.md)
 first.
 
+See also: [contrib docs](docs/contributing.rst)
+
 ## Setup
 
 This project uses [poetry]. Have it installed and setup first.
@@ -12,7 +14,7 @@ This project uses [poetry]. Have it installed and setup first.
 To install dev-dependencies and tools:
 
 ```shell
-poetry install
+poetry install --all-extras
 ```
 
 ## Code style
diff --git a/docs/contributing.rst b/docs/contributing.rst
index 5a7f88a0a..ff1705b31 100644
--- a/docs/contributing.rst
+++ b/docs/contributing.rst
@@ -12,7 +12,7 @@ To install dev-dependencies and tools:
 
 .. code-block::
 
-   poetry install
+   poetry install --all-extras
 
 Code style
 ----------------------------------------------------
@@ -22,7 +22,7 @@ This project uses `PEP8`_ Style Guide for Python Code. This project loves sorted
 .. code-block::
 
     poetry run isort .
-    poetry run flake8 cyclonedx/ tests/ typings/
+    poetry run autopep8 -ir cyclonedx/ tests/ typings/ examples/
 
 
 Documentation
@@ -48,7 +48,7 @@ Run all tests in dedicated environments, via:
 
 .. code-block::
 
-    poetry run tox
+    poetry run tox run
 
 
 Sign your commits

From af01f2219a59982e10929c339f0283ba50b2bd74 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Tue, 19 Sep 2023 13:48:15 +0200
Subject: [PATCH 31/41] examples

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 examples/complex.py | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/examples/complex.py b/examples/complex.py
index aa9b9ae31..f39460c3c 100644
--- a/examples/complex.py
+++ b/examples/complex.py
@@ -1,3 +1,5 @@
+import sys
+
 from cyclonedx.factory.license import LicenseChoiceFactory, LicenseFactory
 from cyclonedx.model import OrganizationalEntity, XsUri
 from cyclonedx.model.bom import Bom
@@ -52,15 +54,21 @@
 serialized_json = JsonV1Dot4(bom).output_as_string()
 print(serialized_json)
 try:
-    valid = JsonValidator(SchemaVersion.V1_4).validate_str(serialized_json)
-    print('JSON is', 'valid' if valid else 'invalid')
+    validation_errors = JsonValidator(SchemaVersion.V1_4).validate_str(serialized_json)
+    if validation_errors:
+        print('', 'JSON ValidationError:', repr(validation_errors), sep='\n', file=sys.stderr)
+        sys.exit(2)
+    print('JSON valid')
 except MissingOptionalDependencyException as error:
     print('JSON-validation was skipped due to', error)
 
 serialized_xml = XmlV1Dot4(bom).output_as_string()
 print(serialized_xml)
 try:
-    valid = XmlValidator(SchemaVersion.V1_4).validate_str(serialized_xml)
-    print('XML is', 'valid' if valid else 'invalid')
+    validation_errors = XmlValidator(SchemaVersion.V1_4).validate_str(serialized_xml)
+    if validation_errors:
+        print('', 'JSON ValidationError:', repr(validation_errors), sep='\n', file=sys.stderr)
+        sys.exit(2)
+    print('JSON valid')
 except MissingOptionalDependencyException as error:
     print('XML-validation was skipped due to', error)

From 82d7cbf7b30cd0082abdf5c2ec77a72fa7e607ba Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Tue, 19 Sep 2023 16:24:48 +0200
Subject: [PATCH 32/41] docs

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 .isort.cfg                       |  2 +
 CONTRIBUTING.md                  |  2 -
 cyclonedx/exception/__init__.py  |  5 ++
 cyclonedx/validation/__init__.py | 32 +++++++-----
 cyclonedx/validation/json.py     | 26 ++++++++--
 cyclonedx/validation/xml.py      | 23 +++++++--
 docs/conf.py                     |  5 +-
 docs/contributing.rst            | 84 +-------------------------------
 docs/requirements.txt            |  6 +--
 examples/complex.py              |  5 +-
 tests/base.py                    |  2 +-
 tests/test_validation_json.py    |  2 +-
 12 files changed, 82 insertions(+), 112 deletions(-)

diff --git a/.isort.cfg b/.isort.cfg
index 2b28db047..7a30df968 100644
--- a/.isort.cfg
+++ b/.isort.cfg
@@ -20,3 +20,5 @@ src_paths =
     cyclonedx
     tests
     typings
+    examples
+    tools
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 75fb111b8..b8b34b7ab 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -5,8 +5,6 @@ But please read the
 [CycloneDX contributing guidelines](https://github.com/CycloneDX/.github/blob/master/CONTRIBUTING.md)
 first.
 
-See also: [contrib docs](docs/contributing.rst)
-
 ## Setup
 
 This project uses [poetry]. Have it installed and setup first.
diff --git a/cyclonedx/exception/__init__.py b/cyclonedx/exception/__init__.py
index dc915bfba..1845b0063 100644
--- a/cyclonedx/exception/__init__.py
+++ b/cyclonedx/exception/__init__.py
@@ -25,3 +25,8 @@ class CycloneDxException(Exception):
     Root exception thrown by this library.
     """
     pass
+
+
+class MissingOptionalDependencyException(CycloneDxException):
+    """Validation did not happen, due to missing dependencies."""
+    pass
diff --git a/cyclonedx/validation/__init__.py b/cyclonedx/validation/__init__.py
index 4afd457d9..78c96845f 100644
--- a/cyclonedx/validation/__init__.py
+++ b/cyclonedx/validation/__init__.py
@@ -15,17 +15,20 @@
 # SPDX-License-Identifier: Apache-2.0
 
 from abc import ABC, abstractmethod
-from typing import TYPE_CHECKING, Any, Optional
+from typing import TYPE_CHECKING, Any, Optional, Protocol
 
 if TYPE_CHECKING:
     from ..schema import SchemaVersion
 
 
-class MissingOptionalDependencyException(BaseException):
-    pass
+class ValidationError:
+    """Validation failed with this specific error.
 
+    Use :attr:`~data` to access the content.
+    """
+
+    data: Any
 
-class ValidationError:
     def __init__(self, data: Any) -> None:
         self.data = data
 
@@ -36,22 +39,29 @@ def __str__(self) -> str:
         return str(self.data)
 
 
-class _BaseValidator(ABC):
+class Validator(Protocol):
+    """Validator protocol"""
+
+    def validate_str(self, data: str) -> Optional[ValidationError]:
+        """Validate a string"""
+        ...
+
+
+class _BaseValidator(Validator, ABC):
+    """this class is non-public. changes without notice may happen."""
 
     def __init__(self, schema_version: 'SchemaVersion') -> None:
         self.__schema_version = schema_version
         if not self._schema_file:
             raise ValueError(f'unsupported schema: {schema_version}')
 
-    @property
-    @abstractmethod
-    def _schema_file(self) -> Optional[str]:
-        ...
-
     @property
     def schema_version(self) -> 'SchemaVersion':
+        """get the schema version."""
         return self.__schema_version
 
+    @property
     @abstractmethod
-    def validate_str(self, data: str) -> Optional[ValidationError]:
+    def _schema_file(self) -> Optional[str]:
+        """get the schema file according to schema version."""
         ...
diff --git a/cyclonedx/validation/json.py b/cyclonedx/validation/json.py
index e181443af..8b7cc1eea 100644
--- a/cyclonedx/validation/json.py
+++ b/cyclonedx/validation/json.py
@@ -20,8 +20,12 @@
 from json import loads as json_loads
 from typing import TYPE_CHECKING, Any, Optional, Tuple
 
+if TYPE_CHECKING:
+    from ..schema import SchemaVersion
+
+from ..exception import MissingOptionalDependencyException
 from ..schema._res import BOM_JSON as _S_BOM, BOM_JSON_STRICT as _S_BOM_STRICT, JSF as _S_JSF, SPDX_JSON as _S_SPDX
-from . import MissingOptionalDependencyException, ValidationError, _BaseValidator
+from . import ValidationError, _BaseValidator
 
 _missing_deps_error: Optional[Tuple[MissingOptionalDependencyException, ImportError]] = None
 try:
@@ -39,7 +43,16 @@
     ), err
 
 
-class __BaseJsonValidator(_BaseValidator, ABC):
+class _BaseJsonValidator(_BaseValidator, ABC):
+
+    def __init__(self, schema_version: 'SchemaVersion') -> None:
+        # this is the def that is used for generating the documentation
+        super().__init__(schema_version)
+
+    def validate_str(self, data: str) -> Optional[ValidationError]:
+        """Validate a string according to the schema version."""
+        # this is the def that is used for generating the documentation
+
     if _missing_deps_error:
         __MDERROR = _missing_deps_error
 
@@ -84,15 +97,20 @@ def __make_validator_registry() -> Registry[Any]:
                 ])
 
 
-class JsonValidator(__BaseJsonValidator):
+class JsonValidator(_BaseJsonValidator):
+    """Validator for CycloneDX documents in JSON format."""
 
     @property
     def _schema_file(self) -> Optional[str]:
         return _S_BOM.get(self.schema_version)
 
 
-class JsonStrictValidator(__BaseJsonValidator):
+class JsonStrictValidator(_BaseJsonValidator):
+    """Strict validator for CycloneDX documents in JSON format.
 
+    In contrast to :class:`~JsonValidator`,
+    the document must not have additional or unknown JSON properties.
+    """
     @property
     def _schema_file(self) -> Optional[str]:
         return _S_BOM_STRICT.get(self.schema_version)
diff --git a/cyclonedx/validation/xml.py b/cyclonedx/validation/xml.py
index 65a3e5ad1..c7775546d 100644
--- a/cyclonedx/validation/xml.py
+++ b/cyclonedx/validation/xml.py
@@ -17,10 +17,14 @@
 __all__ = ['XmlValidator']
 
 from abc import ABC
-from typing import Any, Optional, Tuple
+from typing import TYPE_CHECKING, Any, Optional, Tuple
 
+from ..exception import MissingOptionalDependencyException
 from ..schema._res import BOM_XML as _S_BOM
-from . import MissingOptionalDependencyException, ValidationError, _BaseValidator
+from . import ValidationError, _BaseValidator
+
+if TYPE_CHECKING:
+    from ..schema import SchemaVersion
 
 _missing_deps_error: Optional[Tuple[MissingOptionalDependencyException, ImportError]] = None
 try:
@@ -32,7 +36,16 @@
     ), err
 
 
-class __BaseXmlValidator(_BaseValidator, ABC):
+class _BaseXmlValidator(_BaseValidator, ABC):
+
+    def __init__(self, schema_version: 'SchemaVersion') -> None:
+        # this is the def that is used for generating the documentation
+        super().__init__(schema_version)
+
+    def validate_str(self, data: str) -> Optional[ValidationError]:
+        """Validate a string according to the schema version."""
+        # this is the def that is used for generating the documentation
+
     if _missing_deps_error:
         __MDERROR = _missing_deps_error
 
@@ -67,7 +80,9 @@ def _validator(self) -> 'XMLSchema':
             return self.__validator
 
 
-class XmlValidator(__BaseXmlValidator):
+class XmlValidator(_BaseXmlValidator):
+    """Validator for CycloneDX documents in XML format."""
+
     @property
     def _schema_file(self) -> Optional[str]:
         return _S_BOM.get(self.schema_version)
diff --git a/docs/conf.py b/docs/conf.py
index 9faa5c7ae..5abdefc51 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -31,15 +31,18 @@
 # ones.
 extensions = [
     "sphinx.ext.autodoc",
-    "sphinx.ext.viewcode",
+    # "sphinx.ext.viewcode",
     "autoapi.extension",
     "sphinx_rtd_theme",
     "m2r2"
 ]
 
+
 # Document Python Code
 autoapi_type = 'python'
 autoapi_dirs = ['../cyclonedx']
+# see https://sphinx-autoapi.readthedocs.io/en/latest/reference/config.html#confval-autoapi_options
+autoapi_options = ['show-module-summary', 'members', 'undoc-members', 'inherited-members', 'show-inheritance']
 
 source_suffix = ['.rst', '.md']
 
diff --git a/docs/contributing.rst b/docs/contributing.rst
index ff1705b31..4fc50161c 100644
--- a/docs/contributing.rst
+++ b/docs/contributing.rst
@@ -1,83 +1 @@
-Contributing
-====================================================
-
-Pull requests are welcome, but please read these contributing guidelines first.
-
-Setup
-----------------------------------------------------
-
-This project uses `poetry`_. Have it installed and setup first.
-
-To install dev-dependencies and tools:
-
-.. code-block::
-
-   poetry install --all-extras
-
-Code style
-----------------------------------------------------
-
-This project uses `PEP8`_ Style Guide for Python Code. This project loves sorted imports. Get it all applied via:
-
-.. code-block::
-
-    poetry run isort .
-    poetry run autopep8 -ir cyclonedx/ tests/ typings/ examples/
-
-
-Documentation
-----------------------------------------------------
-
-This project uses `Sphinx`_ to generate documentation which is automatically published to `readthedocs.io`_.
-
-Source for documentation is stored in the ``docs`` folder in `RST`_ format.
-
-You can generate the documentation locally by running:
-
-.. code-block::
-
-    cd docs
-    pip install -r requirements.txt
-    make html
-
-
-Testing
-----------------------------------------------------
-
-Run all tests in dedicated environments, via:
-
-.. code-block::
-
-    poetry run tox run
-
-
-Sign your commits
-----------------------------------------------------
-
-Please sign your commits, to show that you agree to publish your changes under the current terms and licenses of the
-project. We can't accept contributions, however great, if you do not sign your commits.
-
-.. code-block::
-
-    git commit --signed-off ...
-
-
-Pre-commit hooks
-----------------------------------------------------
-
-If you like to take advantage of `pre-commit hooks`_, you can do so to cover most of the topics on this page when
-contributing.
-
-.. code-block::
-
-    pre-commit install
-
-All our pre-commit checks will run locally before you can commit!
-
-
-.. _poetry: https://python-poetry.org
-.. _PEP8: https://www.python.org/dev/peps/pep-0008
-.. _Sphinx: https://www.sphinx-doc.org/
-.. _readthedocs.io: https://cyclonedx-python-library.readthedocs.io/
-.. _RST: https://en.wikipedia.org/wiki/ReStructuredText
-.. _pre-commit hooks: https://pre-commit.com
+.. mdinclude:: ../CONTRIBUTING.md
diff --git a/docs/requirements.txt b/docs/requirements.txt
index db0c3d0f7..dfba7e147 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,4 +1,4 @@
 m2r2>=0.3.2
-Sphinx>=4.3.2
-sphinx-autoapi>=1.8.4
-sphinx-rtd-theme>=1.0.0
\ No newline at end of file
+Sphinx>=7.2.6,<8
+sphinx-autoapi>=2.1.1,<3
+sphinx-rtd-theme>=1.3.0,<2
diff --git a/examples/complex.py b/examples/complex.py
index f39460c3c..f64b1652a 100644
--- a/examples/complex.py
+++ b/examples/complex.py
@@ -1,5 +1,8 @@
 import sys
 
+from packageurl import PackageURL
+
+from cyclonedx.exception import MissingOptionalDependencyException
 from cyclonedx.factory.license import LicenseChoiceFactory, LicenseFactory
 from cyclonedx.model import OrganizationalEntity, XsUri
 from cyclonedx.model.bom import Bom
@@ -7,10 +10,8 @@
 from cyclonedx.output.json import JsonV1Dot4
 from cyclonedx.output.xml import XmlV1Dot4
 from cyclonedx.schema import SchemaVersion
-from cyclonedx.validation import MissingOptionalDependencyException
 from cyclonedx.validation.json import JsonValidator
 from cyclonedx.validation.xml import XmlValidator
-from packageurl import PackageURL
 
 lc_factory = LicenseChoiceFactory(license_factory=LicenseFactory())
 
diff --git a/tests/base.py b/tests/base.py
index a0bbb2b29..fff18cdfc 100644
--- a/tests/base.py
+++ b/tests/base.py
@@ -28,8 +28,8 @@
 from xmldiff import main
 from xmldiff.actions import MoveNode
 
+from cyclonedx.exception import MissingOptionalDependencyException
 from cyclonedx.output import SchemaVersion
-from cyclonedx.validation import MissingOptionalDependencyException
 from cyclonedx.validation.json import JsonValidator
 from cyclonedx.validation.xml import XmlValidator
 
diff --git a/tests/test_validation_json.py b/tests/test_validation_json.py
index 2e919e600..ab00304e5 100644
--- a/tests/test_validation_json.py
+++ b/tests/test_validation_json.py
@@ -24,8 +24,8 @@
 
 from ddt import data, ddt, idata, unpack
 
+from cyclonedx.exception import MissingOptionalDependencyException
 from cyclonedx.schema import SchemaVersion
-from cyclonedx.validation import MissingOptionalDependencyException
 from cyclonedx.validation.json import JsonStrictValidator, JsonValidator
 
 from . import TESTDATA_DIRECTORY

From 9527999177be5b29797c926465facb5ed5f50d51 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Tue, 19 Sep 2023 17:27:42 +0200
Subject: [PATCH 33/41] docs

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/output/__init__.py     | 27 ++++++++++++++++-----------
 cyclonedx/validation/__init__.py | 30 ++++++++++++++++++++++++++----
 cyclonedx/validation/json.py     | 12 ++++--------
 cyclonedx/validation/xml.py      | 10 +++-------
 4 files changed, 49 insertions(+), 30 deletions(-)

diff --git a/cyclonedx/output/__init__.py b/cyclonedx/output/__init__.py
index 2f8658faa..8980fba02 100644
--- a/cyclonedx/output/__init__.py
+++ b/cyclonedx/output/__init__.py
@@ -19,26 +19,28 @@
 and according to different versions of the CycloneDX schema standard.
 """
 
-import importlib
 import os
 from abc import ABC, abstractmethod
-from typing import Iterable, Union, cast
+from typing import TYPE_CHECKING, Iterable, Union, cast
+
+if TYPE_CHECKING:
+    from ..model.bom import Bom
+    from ..model.component import Component
+    from ..schema import OutputFormat, SchemaVersion
 
-from ..model.bom import Bom
-from ..model.component import Component
-from ..schema import OutputFormat, SchemaVersion
 
 LATEST_SUPPORTED_SCHEMA_VERSION = SchemaVersion.V1_4
 
 
 class BaseOutput(ABC):
+    """BaseOutput"""
 
-    def __init__(self, bom: Bom, **kwargs: int) -> None:
+    def __init__(self, bom: 'Bom', **kwargs: int) -> None:
         super().__init__(**kwargs)
         self._bom = bom
         self._generated: bool = False
 
-    def _chained_components(self, container: Union[Bom, Component]) -> Iterable[Component]:
+    def _chained_components(self, container: Union['Bom', 'Component']) -> Iterable['Component']:
         for component in container.components:
             yield component
             yield from self._chained_components(component)
@@ -56,10 +58,10 @@ def generated(self) -> bool:
     def generated(self, generated: bool) -> None:
         self._generated = generated
 
-    def get_bom(self) -> Bom:
+    def get_bom(self) -> 'Bom':
         return self._bom
 
-    def set_bom(self, bom: Bom) -> None:
+    def set_bom(self, bom: 'Bom') -> None:
         self._bom = bom
 
     @abstractmethod
@@ -87,8 +89,9 @@ def output_to_file(self, filename: str, allow_overwrite: bool = False) -> None:
         f_out.close()
 
 
-def get_instance(bom: Bom, output_format: OutputFormat = OutputFormat.XML,
-                 schema_version: SchemaVersion = LATEST_SUPPORTED_SCHEMA_VERSION) -> BaseOutput:
+def get_instance(bom: 'Bom',
+                 output_format: 'OutputFormat' = OutputFormat.XML,
+                 schema_version: 'SchemaVersion' = LATEST_SUPPORTED_SCHEMA_VERSION) -> BaseOutput:
     """
     Helper method to quickly get the correct output class/formatter.
 
@@ -99,6 +102,8 @@ def get_instance(bom: Bom, output_format: OutputFormat = OutputFormat.XML,
     :param schema_version: SchemaVersion
     :return:
     """
+    import importlib
+
     try:
         module = importlib.import_module(f"cyclonedx.output.{output_format.value.lower()}")
         output_klass = getattr(module, f"{output_format.value}{schema_version.value}")
diff --git a/cyclonedx/validation/__init__.py b/cyclonedx/validation/__init__.py
index 78c96845f..66ee960d6 100644
--- a/cyclonedx/validation/__init__.py
+++ b/cyclonedx/validation/__init__.py
@@ -15,10 +15,10 @@
 # SPDX-License-Identifier: Apache-2.0
 
 from abc import ABC, abstractmethod
-from typing import TYPE_CHECKING, Any, Optional, Protocol
+from typing import TYPE_CHECKING, Any, Optional, Protocol, cast
 
 if TYPE_CHECKING:
-    from ..schema import SchemaVersion
+    from ..schema import OutputFormat, SchemaVersion
 
 
 class ValidationError:
@@ -47,8 +47,8 @@ def validate_str(self, data: str) -> Optional[ValidationError]:
         ...
 
 
-class _BaseValidator(Validator, ABC):
-    """this class is non-public. changes without notice may happen."""
+class BaseValidator(ABC):
+    """BaseValidator"""
 
     def __init__(self, schema_version: 'SchemaVersion') -> None:
         self.__schema_version = schema_version
@@ -65,3 +65,25 @@ def schema_version(self) -> 'SchemaVersion':
     def _schema_file(self) -> Optional[str]:
         """get the schema file according to schema version."""
         ...
+
+
+def get_instance(format: 'OutputFormat',
+                 schema_version: 'SchemaVersion') -> Validator:
+    """
+    Helper method to quickly get the correct validation class/validator.
+
+    Pass in your BOM and optionally an output format and schema version.
+
+    :param format: OutputFormat
+    :param schema_version: SchemaVersion
+    :return:
+    """
+    import importlib
+
+    try:
+        module = importlib.import_module(f"cyclonedx.validation.{format.value.lower()}")
+        output_klass = getattr(module, f"{format.value}{schema_version.value}")
+    except (ImportError, AttributeError) as e:
+        raise ValueError(f"Unknown format {format.value.lower()!r}: {e}") from None
+
+    return cast(Validator, output_klass(schema_version=schema_version))
diff --git a/cyclonedx/validation/json.py b/cyclonedx/validation/json.py
index 8b7cc1eea..34c1aca63 100644
--- a/cyclonedx/validation/json.py
+++ b/cyclonedx/validation/json.py
@@ -25,7 +25,7 @@
 
 from ..exception import MissingOptionalDependencyException
 from ..schema._res import BOM_JSON as _S_BOM, BOM_JSON_STRICT as _S_BOM_STRICT, JSF as _S_JSF, SPDX_JSON as _S_SPDX
-from . import ValidationError, _BaseValidator
+from . import BaseValidator, ValidationError, Validator
 
 _missing_deps_error: Optional[Tuple[MissingOptionalDependencyException, ImportError]] = None
 try:
@@ -43,16 +43,12 @@
     ), err
 
 
-class _BaseJsonValidator(_BaseValidator, ABC):
+class _BaseJsonValidator(BaseValidator, ABC):
 
     def __init__(self, schema_version: 'SchemaVersion') -> None:
         # this is the def that is used for generating the documentation
         super().__init__(schema_version)
 
-    def validate_str(self, data: str) -> Optional[ValidationError]:
-        """Validate a string according to the schema version."""
-        # this is the def that is used for generating the documentation
-
     if _missing_deps_error:
         __MDERROR = _missing_deps_error
 
@@ -97,7 +93,7 @@ def __make_validator_registry() -> Registry[Any]:
                 ])
 
 
-class JsonValidator(_BaseJsonValidator):
+class JsonValidator(_BaseJsonValidator, Validator):
     """Validator for CycloneDX documents in JSON format."""
 
     @property
@@ -105,7 +101,7 @@ def _schema_file(self) -> Optional[str]:
         return _S_BOM.get(self.schema_version)
 
 
-class JsonStrictValidator(_BaseJsonValidator):
+class JsonStrictValidator(_BaseJsonValidator, Validator):
     """Strict validator for CycloneDX documents in JSON format.
 
     In contrast to :class:`~JsonValidator`,
diff --git a/cyclonedx/validation/xml.py b/cyclonedx/validation/xml.py
index c7775546d..f49a75f46 100644
--- a/cyclonedx/validation/xml.py
+++ b/cyclonedx/validation/xml.py
@@ -21,7 +21,7 @@
 
 from ..exception import MissingOptionalDependencyException
 from ..schema._res import BOM_XML as _S_BOM
-from . import ValidationError, _BaseValidator
+from . import BaseValidator, ValidationError, Validator
 
 if TYPE_CHECKING:
     from ..schema import SchemaVersion
@@ -36,16 +36,12 @@
     ), err
 
 
-class _BaseXmlValidator(_BaseValidator, ABC):
+class _BaseXmlValidator(BaseValidator, ABC):
 
     def __init__(self, schema_version: 'SchemaVersion') -> None:
         # this is the def that is used for generating the documentation
         super().__init__(schema_version)
 
-    def validate_str(self, data: str) -> Optional[ValidationError]:
-        """Validate a string according to the schema version."""
-        # this is the def that is used for generating the documentation
-
     if _missing_deps_error:
         __MDERROR = _missing_deps_error
 
@@ -80,7 +76,7 @@ def _validator(self) -> 'XMLSchema':
             return self.__validator
 
 
-class XmlValidator(_BaseXmlValidator):
+class XmlValidator(_BaseXmlValidator, Validator):
     """Validator for CycloneDX documents in XML format."""
 
     @property

From 4ab585739147bf855dc09ff0dbe8851dea5c556b Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Tue, 19 Sep 2023 17:29:19 +0200
Subject: [PATCH 34/41] docs

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/validation/__init__.py | 10 +---------
 1 file changed, 1 insertion(+), 9 deletions(-)

diff --git a/cyclonedx/validation/__init__.py b/cyclonedx/validation/__init__.py
index 66ee960d6..c6f00b540 100644
--- a/cyclonedx/validation/__init__.py
+++ b/cyclonedx/validation/__init__.py
@@ -69,15 +69,7 @@ def _schema_file(self) -> Optional[str]:
 
 def get_instance(format: 'OutputFormat',
                  schema_version: 'SchemaVersion') -> Validator:
-    """
-    Helper method to quickly get the correct validation class/validator.
-
-    Pass in your BOM and optionally an output format and schema version.
-
-    :param format: OutputFormat
-    :param schema_version: SchemaVersion
-    :return:
-    """
+    """Helper method to quickly get the correct validation class/validator."""
     import importlib
 
     try:

From 4027fdb959acd2c891639f68ce5776d7d409b57b Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Tue, 19 Sep 2023 17:46:37 +0200
Subject: [PATCH 35/41] rb

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/output/__init__.py     | 27 +++++++++++----------------
 cyclonedx/validation/__init__.py | 16 +---------------
 2 files changed, 12 insertions(+), 31 deletions(-)

diff --git a/cyclonedx/output/__init__.py b/cyclonedx/output/__init__.py
index 8980fba02..2f8658faa 100644
--- a/cyclonedx/output/__init__.py
+++ b/cyclonedx/output/__init__.py
@@ -19,28 +19,26 @@
 and according to different versions of the CycloneDX schema standard.
 """
 
+import importlib
 import os
 from abc import ABC, abstractmethod
-from typing import TYPE_CHECKING, Iterable, Union, cast
-
-if TYPE_CHECKING:
-    from ..model.bom import Bom
-    from ..model.component import Component
-    from ..schema import OutputFormat, SchemaVersion
+from typing import Iterable, Union, cast
 
+from ..model.bom import Bom
+from ..model.component import Component
+from ..schema import OutputFormat, SchemaVersion
 
 LATEST_SUPPORTED_SCHEMA_VERSION = SchemaVersion.V1_4
 
 
 class BaseOutput(ABC):
-    """BaseOutput"""
 
-    def __init__(self, bom: 'Bom', **kwargs: int) -> None:
+    def __init__(self, bom: Bom, **kwargs: int) -> None:
         super().__init__(**kwargs)
         self._bom = bom
         self._generated: bool = False
 
-    def _chained_components(self, container: Union['Bom', 'Component']) -> Iterable['Component']:
+    def _chained_components(self, container: Union[Bom, Component]) -> Iterable[Component]:
         for component in container.components:
             yield component
             yield from self._chained_components(component)
@@ -58,10 +56,10 @@ def generated(self) -> bool:
     def generated(self, generated: bool) -> None:
         self._generated = generated
 
-    def get_bom(self) -> 'Bom':
+    def get_bom(self) -> Bom:
         return self._bom
 
-    def set_bom(self, bom: 'Bom') -> None:
+    def set_bom(self, bom: Bom) -> None:
         self._bom = bom
 
     @abstractmethod
@@ -89,9 +87,8 @@ def output_to_file(self, filename: str, allow_overwrite: bool = False) -> None:
         f_out.close()
 
 
-def get_instance(bom: 'Bom',
-                 output_format: 'OutputFormat' = OutputFormat.XML,
-                 schema_version: 'SchemaVersion' = LATEST_SUPPORTED_SCHEMA_VERSION) -> BaseOutput:
+def get_instance(bom: Bom, output_format: OutputFormat = OutputFormat.XML,
+                 schema_version: SchemaVersion = LATEST_SUPPORTED_SCHEMA_VERSION) -> BaseOutput:
     """
     Helper method to quickly get the correct output class/formatter.
 
@@ -102,8 +99,6 @@ def get_instance(bom: 'Bom',
     :param schema_version: SchemaVersion
     :return:
     """
-    import importlib
-
     try:
         module = importlib.import_module(f"cyclonedx.output.{output_format.value.lower()}")
         output_klass = getattr(module, f"{output_format.value}{schema_version.value}")
diff --git a/cyclonedx/validation/__init__.py b/cyclonedx/validation/__init__.py
index c6f00b540..d200eea13 100644
--- a/cyclonedx/validation/__init__.py
+++ b/cyclonedx/validation/__init__.py
@@ -47,7 +47,7 @@ def validate_str(self, data: str) -> Optional[ValidationError]:
         ...
 
 
-class BaseValidator(ABC):
+class BaseValidator(ABC, Validator):
     """BaseValidator"""
 
     def __init__(self, schema_version: 'SchemaVersion') -> None:
@@ -65,17 +65,3 @@ def schema_version(self) -> 'SchemaVersion':
     def _schema_file(self) -> Optional[str]:
         """get the schema file according to schema version."""
         ...
-
-
-def get_instance(format: 'OutputFormat',
-                 schema_version: 'SchemaVersion') -> Validator:
-    """Helper method to quickly get the correct validation class/validator."""
-    import importlib
-
-    try:
-        module = importlib.import_module(f"cyclonedx.validation.{format.value.lower()}")
-        output_klass = getattr(module, f"{format.value}{schema_version.value}")
-    except (ImportError, AttributeError) as e:
-        raise ValueError(f"Unknown format {format.value.lower()!r}: {e}") from None
-
-    return cast(Validator, output_klass(schema_version=schema_version))

From f33e3372c168458ecc848dd818991f1c89c429fc Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Tue, 19 Sep 2023 17:57:25 +0200
Subject: [PATCH 36/41] docs

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/validation/__init__.py | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/cyclonedx/validation/__init__.py b/cyclonedx/validation/__init__.py
index d200eea13..fc3a391a2 100644
--- a/cyclonedx/validation/__init__.py
+++ b/cyclonedx/validation/__init__.py
@@ -43,7 +43,12 @@ class Validator(Protocol):
     """Validator protocol"""
 
     def validate_str(self, data: str) -> Optional[ValidationError]:
-        """Validate a string"""
+        """Validate a string
+        :param data: the data string to validate
+        :return: validation error
+        :retval None: if `data` is valid
+        :retval ValidationError:  if `data` is invalid
+        """
         ...
 
 

From f770dca1e6a76055a4a9823331cc773505ea6b69 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Tue, 19 Sep 2023 18:01:00 +0200
Subject: [PATCH 37/41] docs

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/validation/__init__.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/cyclonedx/validation/__init__.py b/cyclonedx/validation/__init__.py
index fc3a391a2..f4abfb558 100644
--- a/cyclonedx/validation/__init__.py
+++ b/cyclonedx/validation/__init__.py
@@ -44,6 +44,7 @@ class Validator(Protocol):
 
     def validate_str(self, data: str) -> Optional[ValidationError]:
         """Validate a string
+
         :param data: the data string to validate
         :return: validation error
         :retval None: if `data` is valid

From 081293860e6c096132c3befacfd0334630309aed Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Tue, 19 Sep 2023 18:07:03 +0200
Subject: [PATCH 38/41] cleanup

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx/validation/__init__.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/cyclonedx/validation/__init__.py b/cyclonedx/validation/__init__.py
index f4abfb558..c6eada0ab 100644
--- a/cyclonedx/validation/__init__.py
+++ b/cyclonedx/validation/__init__.py
@@ -15,10 +15,10 @@
 # SPDX-License-Identifier: Apache-2.0
 
 from abc import ABC, abstractmethod
-from typing import TYPE_CHECKING, Any, Optional, Protocol, cast
+from typing import TYPE_CHECKING, Any, Optional, Protocol
 
 if TYPE_CHECKING:
-    from ..schema import OutputFormat, SchemaVersion
+    from ..schema import SchemaVersion
 
 
 class ValidationError:

From 24ad6930603126102c2c75a3d96c9b2569c401eb Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Tue, 19 Sep 2023 18:08:29 +0200
Subject: [PATCH 39/41] fix

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 tests/test_validation_xml.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/test_validation_xml.py b/tests/test_validation_xml.py
index e8f711276..b21797f98 100644
--- a/tests/test_validation_xml.py
+++ b/tests/test_validation_xml.py
@@ -25,7 +25,7 @@
 from ddt import data, ddt, idata, unpack
 
 from cyclonedx.schema import SchemaVersion
-from cyclonedx.validation import MissingOptionalDependencyException
+from cyclonedx.exception import MissingOptionalDependencyException
 from cyclonedx.validation.xml import XmlValidator
 
 from . import TESTDATA_DIRECTORY

From 638e18af2dfc37fbee3daf7184aba3fa962761d2 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Tue, 19 Sep 2023 18:09:47 +0200
Subject: [PATCH 40/41] docs ci

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 .github/workflows/python.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml
index fd9bd508d..6d6f69d2c 100644
--- a/.github/workflows/python.yml
+++ b/.github/workflows/python.yml
@@ -171,7 +171,7 @@ jobs:
           coverage-reports: ${{ env.REPORTS_DIR }}/coverage.*
 
   examples:
-    name: Examples E${{ matrix.install-extras }}
+    name: Examples E:${{ matrix.install-extras || '<none>' }}
     runs-on: ubuntu-latest
     timeout-minutes: 10
     strategy:

From 59f629289d1d24edb4325d1b88aac5abc26872c8 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Tue, 19 Sep 2023 18:11:22 +0200
Subject: [PATCH 41/41] isort

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 tests/test_validation_xml.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/test_validation_xml.py b/tests/test_validation_xml.py
index b21797f98..8f6ef247c 100644
--- a/tests/test_validation_xml.py
+++ b/tests/test_validation_xml.py
@@ -24,8 +24,8 @@
 
 from ddt import data, ddt, idata, unpack
 
-from cyclonedx.schema import SchemaVersion
 from cyclonedx.exception import MissingOptionalDependencyException
+from cyclonedx.schema import SchemaVersion
 from cyclonedx.validation.xml import XmlValidator
 
 from . import TESTDATA_DIRECTORY
