diff --git a/.agents/_TOC.md b/.agents/_TOC.md
index 065df133a9..83375f417f 100644
--- a/.agents/_TOC.md
+++ b/.agents/_TOC.md
@@ -13,4 +13,4 @@
11. [Advanced safety rules](advanced-safety-rules.md)
12. [Refactoring guidelines](refactoring-guidelines.md)
13. [Common tasks](common-tasks.md)
-14. [Java to Kotlin conversion](java-kotlin-conversion.md)
+14. [Java to Kotlin conversion](skills/java-to-kotlin/SKILL.md)
diff --git a/.agents/quick-reference-card.md b/.agents/quick-reference-card.md
index 6c25b9a7f6..e2be69cb81 100644
--- a/.agents/quick-reference-card.md
+++ b/.agents/quick-reference-card.md
@@ -3,7 +3,6 @@
```
🔑 Key Information:
- Kotlin/Java project with CQRS architecture
-- Use ChatGPT for documentation, Codex for code generation, GPT-4o for complex analysis
- Follow coding guidelines in Spine Event Engine docs
- Always include tests with code changes
- Version bump required for all PRs
diff --git a/.agents/skills/bump-gradle/SKILL.md b/.agents/skills/bump-gradle/SKILL.md
new file mode 100644
index 0000000000..e5d09269fd
--- /dev/null
+++ b/.agents/skills/bump-gradle/SKILL.md
@@ -0,0 +1,117 @@
+---
+name: bump-gradle
+description: >
+ Update the Gradle wrapper version used by this repository. Use when asked to
+ upgrade Gradle, bump the Gradle wrapper, move the project to the latest
+ Gradle release from the official release notes, run the Gradle build, and
+ commit Gradle wrapper and dependency report changes separately.
+---
+
+# Bump Gradle
+
+Use the official Gradle release notes as the source of truth for both the
+latest version and the wrapper update command:
+
+https://docs.gradle.org/current/release-notes.html#upgrade-instructions
+
+Always check that page at task time. Do not rely on remembered Gradle versions.
+
+## Checklist
+
+1. Work from the target repository root.
+
+ Confirm `./gradlew` and `gradle/wrapper/gradle-wrapper.properties` exist
+ before changing anything. Inspect `git status --short` and preserve unrelated
+ user changes. If Gradle wrapper files are already modified, inspect the diff
+ and continue only when those edits are part of the same requested Gradle
+ bump; otherwise ask before overwriting or staging them.
+
+2. Read the latest Gradle version from the release notes.
+
+ Open the Upgrade instructions section at the URL above. Use the version in
+ the release heading and the wrapper command shown there. They should agree;
+ if they do not, stop and report the mismatch.
+
+3. Run the wrapper update command.
+
+ Substitute the version from the release notes:
+
+ ```bash
+ ./gradlew wrapper --gradle-version=GRADLE_VERSION && ./gradlew wrapper
+ ```
+
+ For example, if the release notes say Gradle `9.5.1`, run:
+
+ ```bash
+ ./gradlew wrapper --gradle-version=9.5.1 && ./gradlew wrapper
+ ```
+
+4. Run the build.
+
+ ```bash
+ ./gradlew clean build
+ ```
+
+ If the wrapper update or build fails, do not commit partial changes. Report
+ the failing command and the relevant error output.
+
+5. Commit only Gradle-related files.
+
+ Inspect `git status --short` and `git diff --name-only`. Stage only files
+ created or updated by the Gradle wrapper bump, normally:
+
+ ```text
+ gradle/wrapper/gradle-wrapper.properties
+ gradle/wrapper/gradle-wrapper.jar
+ gradlew
+ gradlew.bat
+ ```
+
+ Include other Gradle-owned files only when they are directly required by the
+ wrapper update and are clearly part of the same change. Do not stage
+ dependency reports or unrelated build output in this commit.
+
+ Commit with the exact subject, replacing `GRADLE_VERSION`:
+
+ ```text
+ Bump Gradle -> `GRADLE_VERSION`
+ ```
+
+ Example:
+
+ ```bash
+ git commit -m 'Bump Gradle -> `9.5.1`'
+ ```
+
+ If no Gradle-related files changed, do not create an empty commit; report
+ that the wrapper was already current after verification.
+
+6. Commit dependency reports separately when the build updates them.
+
+ Stage only generated dependency report files. In repositories using this
+ config, the usual paths are:
+
+ ```text
+ docs/dependencies/pom.xml
+ docs/dependencies/dependencies.md
+ ```
+
+ Include other changed files only when they are clearly generated dependency
+ reports from the build. Commit them separately with:
+
+ ```text
+ Update dependency reports
+ ```
+
+7. Verify the final branch state.
+
+ Confirm the recent commit subjects and make sure no owned Gradle bump or
+ dependency report changes remain unstaged:
+
+ ```bash
+ git log --format=%s -2
+ git status --short
+ ```
+
+ Leave unrelated pre-existing user changes alone and mention them separately
+ in the final response.
diff --git a/.agents/skills/bump-gradle/agents/openai.yaml b/.agents/skills/bump-gradle/agents/openai.yaml
new file mode 100644
index 0000000000..6edf97877f
--- /dev/null
+++ b/.agents/skills/bump-gradle/agents/openai.yaml
@@ -0,0 +1,4 @@
+interface:
+ display_name: "Bump Gradle"
+ short_description: "Update the Gradle wrapper safely"
+ default_prompt: "Use $bump-gradle to update this repository to the latest Gradle wrapper version from the official release notes, build, and split Gradle/report commits."
diff --git a/.agents/skills/bump-version/SKILL.md b/.agents/skills/bump-version/SKILL.md
new file mode 100644
index 0000000000..7143c3e9fa
--- /dev/null
+++ b/.agents/skills/bump-version/SKILL.md
@@ -0,0 +1,118 @@
+---
+name: bump-version
+description: >
+ Bump the project version in `version.gradle.kts` following the Spine SDK
+ versioning policy. Use when starting a new branch, before opening a PR, or
+ when CI rejects a branch for a missing/insufficient version increment. Covers
+ locating the published version value, choosing the increment, committing the
+ bump, rebuilding reports, and resolving version conflicts.
+---
+
+# Bump the project version
+
+The authoritative policy is [Spine SDK Versioning][version-policy]. In this
+skill's target repository, CI runs the `Version Guard` workflow, which invokes
+`checkVersionIncrement` through `IncrementGuard`. The task fails if the current
+project version already exists in the Maven repository. It does not compare git
+branches or inspect commit subjects; the checks below are agent-side guardrails.
+
+## Checklist
+
+1. Work from the target repository root.
+
+ Confirm `version.gradle.kts` exists before editing. If it is absent, stop and
+ report that this skill does not apply to the current checkout.
+
+ Inspect `git status --short` before changing files. Preserve unrelated user
+ changes and stage only the version/report files this workflow owns.
+
+2. Locate `version.gradle.kts` and update the value that feeds
+ `versionToPublish`.
+
+ The published version may be a literal:
+
+ ```kotlin
+ val versionToPublish: String by extra("2.0.0-SNAPSHOT.182")
+ ```
+
+ Or it may come from another variable:
+
+ ```kotlin
+ val compilerVersion: String by extra("2.0.0-SNAPSHOT.043")
+ val versionToPublish by extra(compilerVersion)
+ ```
+
+ In the second case, update the source value (`compilerVersion` here), not
+ only the `versionToPublish` alias.
+
+3. Choose the increment.
+
+ For the normal snapshot-line PR, increment the trailing snapshot number by
+ one: `2.0.0-SNAPSHOT.182` -> `2.0.0-SNAPSHOT.183`. Preserve existing
+ zero-padding: `2.0.0-SNAPSHOT.009` -> `2.0.0-SNAPSHOT.010`.
+
+ For a breaking snapshot-line PR, advance to the next multiple of 10 that is
+ strictly greater than the current value: `.187` -> `.190`, and `.180` ->
+ `.190`.
+
+ For release-line work, follow the [policy][version-policy]: urgent fixes bump `PATCH`;
+ feature work or significant fixes bump `MINOR` and reset `PATCH` to `0`.
+
+4. Commit only the `version.gradle.kts` change with this subject:
+
+ ```text
+ Bump version -> `2.0.0-SNAPSHOT.183`
+ ```
+
+ Use the actual new version in the subject. Do not include unrelated files in
+ this commit.
+
+5. Run the build to verify the bump and regenerate reports:
+
+ ```bash
+ ./gradlew clean build
+ ```
+
+ Repos using this config commonly finalize `generatePom` and
+ `mergeAllLicenseReports` after `build`, which updates
+ `docs/dependencies/pom.xml` and `docs/dependencies/dependencies.md` when
+ those reports are configured.
+
+6. If `docs/dependencies/pom.xml` or `docs/dependencies/dependencies.md` changed,
+ commit those generated files separately:
+
+ ```text
+ Update dependency reports
+ ```
+
+ If the PR has the `License Reports` workflow, make sure the branch modifies
+ `docs/dependencies/pom.xml` and `docs/dependencies/dependencies.md`.
+
+7. Validate the branch state.
+
+ ```bash
+ BASE=master
+ git fetch --quiet origin "$BASE"
+ RANGE="$(git merge-base HEAD origin/$BASE)..HEAD"
+ git log --format=%s "$RANGE" | grep '^Bump version ->'
+ git diff --name-only "$RANGE" -- version.gradle.kts | grep '^version.gradle.kts$'
+ ```
+
+ Use the actual merge target for `BASE` when it is not `master`.
+ Also confirm `git status --short` has no uncommitted changes created by the
+ version bump or report regeneration.
+
+## Conflict Rule
+
+When merging a base branch into a feature branch:
+
+- If the base branch version is lower, keep the feature branch version.
+- If the base branch version is greater than or equal to the feature branch
+ version, set the feature branch version to `base + 1`, or apply the breaking
+ change rounding rule.
+
+Do not require a completely clean worktree if unrelated user changes are
+present. Instead, make sure no uncommitted changes were created by the version
+bump or report regeneration.
+
+[version-policy]: https://github.com/SpineEventEngine/documentation/wiki/Versioning
diff --git a/.agents/skills/bump-version/agents/openai.yaml b/.agents/skills/bump-version/agents/openai.yaml
new file mode 100644
index 0000000000..12f6e4f9b8
--- /dev/null
+++ b/.agents/skills/bump-version/agents/openai.yaml
@@ -0,0 +1,4 @@
+interface:
+ display_name: "Bump Version"
+ short_description: "Bump Spine project versions safely"
+ default_prompt: "Use $bump-version to bump the project version in version.gradle.kts, commit the version change, rebuild dependency reports, and verify the branch."
diff --git a/.agents/java-kotlin-conversion.md b/.agents/skills/java-to-kotlin/SKILL.md
similarity index 88%
rename from .agents/java-kotlin-conversion.md
rename to .agents/skills/java-to-kotlin/SKILL.md
index 95cf929543..d3abdc2f7b 100644
--- a/.agents/java-kotlin-conversion.md
+++ b/.agents/skills/java-to-kotlin/SKILL.md
@@ -1,3 +1,11 @@
+---
+name: java-to-kotlin
+description: >
+ Convert Java code to Kotlin, including Java API comments from Javadoc to KDoc.
+ Use when asked to migrate Java files, classes, methods, nullability semantics,
+ or common Java patterns into idiomatic Kotlin while preserving behavior.
+---
+
# 🪄 Converting Java code to Kotlin
* Java code API comments are Javadoc format.
diff --git a/.agents/skills/java-to-kotlin/agents/openai.yaml b/.agents/skills/java-to-kotlin/agents/openai.yaml
new file mode 100644
index 0000000000..252920fedc
--- /dev/null
+++ b/.agents/skills/java-to-kotlin/agents/openai.yaml
@@ -0,0 +1,4 @@
+interface:
+ display_name: "Java to Kotlin"
+ short_description: "Convert Java code to idiomatic Kotlin"
+ default_prompt: "Use $java-to-kotlin to convert Java code to Kotlin while preserving behavior, nullability, and API documentation wording."
diff --git a/.agents/skills/move-files/SKILL.md b/.agents/skills/move-files/SKILL.md
new file mode 100644
index 0000000000..2885f4828f
--- /dev/null
+++ b/.agents/skills/move-files/SKILL.md
@@ -0,0 +1,49 @@
+---
+name: move-files
+description: >
+ Move or rename any files/directories in a repo: preserve history, update all
+ references and build metadata, verify no stale paths remain.
+---
+
+# Move Files
+
+## Workflow
+
+1. Preflight.
+ - Run `git status --short`.
+ - Map each `source -> destination`.
+ - Classify scope: simple same-module moves stay targeted; package, module, or
+ cross-module moves need broader inspection.
+ - Ask before ambiguous mappings, destination conflicts, or unclear semantic
+ package/module changes.
+
+2. Search before moving.
+ - Search all old identifiers: paths, names, resource refs, doc links.
+ - For Gradle/module/source-set moves, check `settings.gradle.kts`,
+ `build.gradle.kts`, and `buildSrc`.
+ - For Kotlin/Java, update package declarations only when package intent
+ changes.
+
+3. Move safely.
+ - Prefer `git mv` for tracked files in the repo.
+ - Use filesystem moves only for untracked/generated/out-of-git files.
+ - Create parent directories first.
+ - For case-only renames, move through a temporary name.
+
+4. Repair references.
+ - Update all references: imports, build metadata, docs, resources, and scripts.
+ - Start search scope narrow: affected directory, then module, then repo-wide.
+ - Prefer precise edits; avoid broad replacements on generic names.
+
+5. Verify.
+ - Re-run targeted searches for old tokens.
+ - Run `git status --short` and confirm the delta matches the move.
+ - Run focused validation for moved files, or state what could not run.
+
+## Repo Notes
+
+Follow `.agents/project-structure-expectations.md` for module/source-set/test moves.
+
+## Report
+
+Return: `Moved[]`, `UpdatedRefs[]`, `Verification[]`, `Risks[]`.
diff --git a/.agents/skills/move-files/agents/openai.yaml b/.agents/skills/move-files/agents/openai.yaml
new file mode 100644
index 0000000000..ba90a9f8f2
--- /dev/null
+++ b/.agents/skills/move-files/agents/openai.yaml
@@ -0,0 +1,4 @@
+interface:
+ display_name: "Move Files"
+ short_description: "Move files safely across a repo"
+ default_prompt: "Use $move-files to relocate files or directories in this repository while preserving history, updating references, and verifying the result."
diff --git a/.agents/skills/update-copyright/SKILL.md b/.agents/skills/update-copyright/SKILL.md
new file mode 100644
index 0000000000..6afc4c7cf2
--- /dev/null
+++ b/.agents/skills/update-copyright/SKILL.md
@@ -0,0 +1,16 @@
+---
+name: update-copyright
+description: >
+ Update source file copyright headers from the IntelliJ IDEA copyright profile,
+ replacing `today.year` with the current year.
+ Automatically apply when source files are modified in a change set.
+---
+
+# Copyright Update
+
+**Command:** `python3 .agents/skills/update-copyright/scripts/update_copyright.py`
+
+1. Scope: explicit files/dirs from the user, or all tracked source files if none given.
+2. No explicit paths → run with `--dry-run` first, then without.
+3. Relay stdout (notice source, file count, changed paths) to the user.
+4. Never add a copyright header to a file that does not already have one.
diff --git a/.agents/skills/update-copyright/agents/openai.yaml b/.agents/skills/update-copyright/agents/openai.yaml
new file mode 100644
index 0000000000..246dd647f7
--- /dev/null
+++ b/.agents/skills/update-copyright/agents/openai.yaml
@@ -0,0 +1,4 @@
+interface:
+ display_name: "Copyright Update"
+ short_description: "Refresh source copyright headers"
+ default_prompt: "Use $update-copyright to refresh source file copyright headers from the IntelliJ IDEA copyright profile in this repository."
diff --git a/.agents/skills/update-copyright/scripts/update_copyright.py b/.agents/skills/update-copyright/scripts/update_copyright.py
new file mode 100755
index 0000000000..2dbf8bbc48
--- /dev/null
+++ b/.agents/skills/update-copyright/scripts/update_copyright.py
@@ -0,0 +1,389 @@
+#!/usr/bin/env python3
+"""Update source copyright headers from IntelliJ IDEA copyright profiles."""
+
+from __future__ import annotations
+
+import argparse
+import datetime as dt
+import html
+import re
+import subprocess
+import sys
+from pathlib import Path
+from xml.etree import ElementTree as ET
+
+
+BLOCK_EXTENSIONS = {
+ ".c",
+ ".cc",
+ ".cpp",
+ ".cs",
+ ".css",
+ ".cxx",
+ ".dart",
+ ".go",
+ ".gradle",
+ ".groovy",
+ ".h",
+ ".hh",
+ ".hpp",
+ ".java",
+ ".js",
+ ".jsx",
+ ".kt",
+ ".kts",
+ ".less",
+ ".m",
+ ".mm",
+ ".proto",
+ ".rs",
+ ".scala",
+ ".scss",
+ ".swift",
+ ".ts",
+ ".tsx",
+}
+HASH_EXTENSIONS = {
+ ".bash",
+ ".bzl",
+ ".properties",
+ ".pl",
+ ".py",
+ ".rb",
+ ".sh",
+ ".toml",
+ ".yaml",
+ ".yml",
+ ".zsh",
+}
+XML_EXTENSIONS = {
+ ".fxml",
+ ".pom",
+ ".wsdl",
+ ".xml",
+ ".xsd",
+ ".xsl",
+ ".xslt",
+}
+EXCLUDED_DIRS = {
+ ".agents",
+ ".git",
+ ".gradle",
+ ".idea",
+ ".kotlin",
+ "build",
+ "generated",
+ "out",
+ "tmp",
+}
+EXCLUDED_FILES = {
+ "gradlew",
+ "gradlew.bat",
+}
+
+
+def parse_args() -> argparse.Namespace:
+ parser = argparse.ArgumentParser(
+ description=(
+ "Update source copyright headers from "
+ ".idea/copyright/profiles_settings.xml."
+ )
+ )
+ parser.add_argument(
+ "paths",
+ nargs="*",
+ help="Files or directories to update. Defaults to tracked source files.",
+ )
+ parser.add_argument(
+ "--root",
+ type=Path,
+ default=Path.cwd(),
+ help="Repository root. Defaults to the current working directory.",
+ )
+ parser.add_argument(
+ "--year",
+ default=str(dt.date.today().year),
+ help="Year to substitute for today.year. Defaults to the current year.",
+ )
+ parser.add_argument(
+ "--dry-run",
+ action="store_true",
+ help="Report files that would change without writing them.",
+ )
+ parser.add_argument(
+ "--check",
+ action="store_true",
+ help="Exit with status 1 if any file would change; do not write files.",
+ )
+ return parser.parse_args()
+
+
+def profile_filename(profile_name: str) -> str:
+ stem = re.sub(r"[^A-Za-z0-9]+", "_", profile_name).strip("_")
+ if not stem:
+ raise ValueError("The default copyright profile name is empty.")
+ return f"{stem}.xml"
+
+
+def load_notice(root: Path, year: str) -> tuple[str, Path]:
+ settings_path = root / ".idea" / "copyright" / "profiles_settings.xml"
+ if not settings_path.is_file():
+ raise FileNotFoundError(f"Missing {settings_path}")
+
+ settings_root = ET.parse(settings_path).getroot()
+ settings = settings_root.find(".//settings")
+ if settings is None:
+ raise ValueError(f"{settings_path} does not contain a settings tag.")
+
+ default_profile = settings.get("default")
+ if not default_profile:
+ raise ValueError(f"{settings_path} settings tag has no default attribute.")
+
+ profile_path = settings_path.parent / profile_filename(default_profile)
+ if not profile_path.is_file():
+ raise FileNotFoundError(
+ f"Default profile {default_profile!r} resolves to missing {profile_path}"
+ )
+
+ profile_root = ET.parse(profile_path).getroot()
+ notice = None
+ for option in profile_root.findall(".//option"):
+ if option.get("name") == "notice":
+ notice = option.get("value")
+ break
+ if notice is None:
+ raise ValueError(f"{profile_path} has no option named 'notice'.")
+
+ decoded = html.unescape(notice)
+ decoded = decoded.replace("${today.year}", year)
+ decoded = decoded.replace("$today.year", year)
+ decoded = decoded.replace("today.year", year)
+ return decoded.rstrip(), profile_path
+
+
+def style_for(path: Path) -> str | None:
+ name = path.name
+ suffix = path.suffix.lower()
+ if name.endswith((".sh.template", ".bash.template", ".zsh.template")):
+ return "hash"
+ if suffix in BLOCK_EXTENSIONS:
+ return "block"
+ if suffix in HASH_EXTENSIONS:
+ return "hash"
+ if suffix in XML_EXTENSIONS:
+ return "xml"
+ return None
+
+
+def is_excluded(path: Path) -> bool:
+ if path.name in EXCLUDED_FILES:
+ return True
+ parts = path.parts
+ if len(parts) >= 2 and parts[0] == "gradle" and parts[1] == "wrapper":
+ return True
+ return any(part in EXCLUDED_DIRS for part in parts)
+
+
+def tracked_files(root: Path) -> list[Path]:
+ try:
+ result = subprocess.run(
+ ["git", "-C", str(root), "ls-files", "-z"],
+ check=True,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ )
+ except (FileNotFoundError, subprocess.CalledProcessError):
+ return [
+ path.relative_to(root)
+ for path in root.rglob("*")
+ if path.is_file() and not is_excluded(path.relative_to(root))
+ ]
+
+ paths = []
+ for item in result.stdout.decode("utf-8").split("\0"):
+ if not item:
+ continue
+ path = Path(item)
+ if (root / path).is_file():
+ paths.append(path)
+ return paths
+
+
+def expand_requested_paths(root: Path, requested: list[str]) -> list[Path]:
+ if not requested:
+ paths = tracked_files(root)
+ else:
+ paths = []
+ for item in requested:
+ path = (root / item).resolve()
+ if not path.exists():
+ raise FileNotFoundError(f"Path does not exist: {item}")
+ if not path.is_relative_to(root):
+ raise ValueError(
+ f"Path is outside the repository root: {item!r} "
+ f"(resolved to {path}, root is {root})"
+ )
+ if path.is_dir():
+ for child in path.rglob("*"):
+ if child.is_file():
+ paths.append(child.relative_to(root))
+ else:
+ paths.append(path.relative_to(root))
+
+ unique = sorted(set(paths), key=lambda p: p.as_posix())
+ return [
+ path
+ for path in unique
+ if style_for(path) is not None and not is_excluded(path)
+ ]
+
+
+def newline_for(text: str) -> str:
+ return "\r\n" if "\r\n" in text else "\n"
+
+
+def build_header(notice: str, style: str, newline: str) -> str:
+ lines = notice.splitlines()
+ if style == "block":
+ body = newline.join(f" * {line}" if line else " *" for line in lines)
+ return f"/*{newline}{body}{newline} */{newline}{newline}"
+ if style == "hash":
+ body = newline.join(f"# {line}" if line else "#" for line in lines)
+ return f"{body}{newline}{newline}"
+ if style == "xml":
+ body = newline.join(f" ~ {line}" if line else " ~" for line in lines)
+ return f"{newline}{newline}"
+ raise ValueError(f"Unsupported comment style: {style}")
+
+
+def split_leading_directive(text: str, style: str, newline: str) -> tuple[str, str]:
+ if style == "hash" and text.startswith("#!"):
+ line_end = text.find("\n")
+ if line_end == -1:
+ return text + newline + newline, ""
+ prefix = text[: line_end + 1] + newline
+ return prefix, strip_leading_blank_lines(text[line_end + 1 :])
+
+ if style == "xml" and text.startswith("")
+ if close != -1:
+ line_end = text.find("\n", close)
+ if line_end == -1:
+ return text + newline + newline, ""
+ prefix = text[: line_end + 1] + newline
+ return prefix, strip_leading_blank_lines(text[line_end + 1 :])
+
+ return "", strip_leading_blank_lines(text)
+
+
+def strip_leading_blank_lines(text: str) -> str:
+ return re.sub(r"^(?:[ \t]*\r?\n)+", "", text)
+
+
+def strip_existing_header(text: str, style: str) -> tuple[str, bool]:
+ if style == "block" and text.startswith("/*"):
+ close = text.find("*/")
+ if close != -1:
+ candidate = text[: close + 2]
+ if is_copyright_header(candidate):
+ return strip_leading_blank_lines(text[close + 2 :]), True
+
+ if style == "xml" and text.startswith("")
+ if close != -1:
+ candidate = text[: close + 3]
+ if is_copyright_header(candidate):
+ return strip_leading_blank_lines(text[close + 3 :]), True
+
+ if style == "hash":
+ lines = text.splitlines(keepends=True)
+ end = 0
+ for line in lines:
+ stripped = line.strip()
+ if stripped == "" or stripped.startswith("#"):
+ end += len(line)
+ continue
+ break
+ candidate = text[:end]
+ if candidate and is_copyright_header(candidate):
+ return strip_leading_blank_lines(text[end:]), True
+
+ return text, False
+
+
+def is_copyright_header(text: str) -> bool:
+ limited = text[:5000]
+ return "Copyright" in limited and (
+ "Licensed under" in limited or "All rights reserved" in limited
+ )
+
+
+def updated_text(text: str, notice: str, style: str) -> str:
+ original = text
+ bom = "\ufeff" if text.startswith("\ufeff") else ""
+ if bom:
+ text = text[1:]
+ newline = newline_for(text)
+ prefix, body = split_leading_directive(text, style, newline)
+ body, had_header = strip_existing_header(body, style)
+ if not had_header:
+ return original
+ return bom + prefix + build_header(notice, style, newline) + body
+
+
+def update_file(root: Path, path: Path, notice: str, dry_run: bool) -> bool:
+ absolute = root / path
+ style = style_for(path)
+ if style is None:
+ return False
+
+ try:
+ text = absolute.read_text(encoding="utf-8")
+ except FileNotFoundError:
+ print(f"Skipping missing file: {path}", file=sys.stderr)
+ return False
+ except UnicodeDecodeError:
+ print(f"Skipping non-UTF-8 file: {path}", file=sys.stderr)
+ return False
+
+ next_text = updated_text(text, notice, style)
+ if next_text == text:
+ return False
+
+ if not dry_run:
+ with absolute.open("w", encoding="utf-8", newline="") as file:
+ file.write(next_text)
+ return True
+
+
+def main() -> int:
+ args = parse_args()
+ root = args.root.resolve()
+ notice, profile_path = load_notice(root, args.year)
+ try:
+ paths = expand_requested_paths(root, args.paths)
+ except (FileNotFoundError, ValueError) as exc:
+ print(f"error: {exc}", file=sys.stderr)
+ return 2
+ dry_run = args.dry_run or args.check
+
+ changed = [
+ path
+ for path in paths
+ if update_file(root, path, notice, dry_run=dry_run)
+ ]
+
+ rel_profile = profile_path.relative_to(root)
+ action = "Would update" if dry_run else "Updated"
+ print(f"Notice source: {rel_profile}")
+ print(f"{action} {len(changed)} file(s).")
+ for path in changed:
+ print(path.as_posix())
+
+ if args.check and changed:
+ return 1
+ return 0
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/.agents/skills/update-copyright/tests/test_update_copyright.py b/.agents/skills/update-copyright/tests/test_update_copyright.py
new file mode 100644
index 0000000000..8770b3275e
--- /dev/null
+++ b/.agents/skills/update-copyright/tests/test_update_copyright.py
@@ -0,0 +1,130 @@
+from __future__ import annotations
+
+import subprocess
+import sys
+import tempfile
+import unittest
+from pathlib import Path
+
+
+SCRIPT = Path(__file__).resolve().parents[1] / "scripts" / "update_copyright.py"
+
+
+class UpdateCopyrightTest(unittest.TestCase):
+ def test_default_run_leaves_plain_source_without_header_unchanged(self) -> None:
+ with tempfile.TemporaryDirectory() as temp_dir:
+ root = Path(temp_dir)
+ self.write_profile(root)
+ source = root / "Foo.java"
+ original = "class Foo {}\n"
+ source.write_text(original, encoding="utf-8")
+
+ subprocess.run(["git", "init", "-q"], cwd=root, check=True)
+ subprocess.run(["git", "add", "Foo.java"], cwd=root, check=True)
+
+ result = self.run_script(root)
+
+ self.assertEqual(result.returncode, 0, result.stderr)
+ self.assertIn("Updated 0 file(s).", result.stdout)
+ self.assertEqual(result.stderr, "")
+ self.assertEqual(source.read_text(encoding="utf-8"), original)
+
+ def test_existing_header_is_updated(self) -> None:
+ with tempfile.TemporaryDirectory() as temp_dir:
+ root = Path(temp_dir)
+ self.write_profile(root)
+ source = root / "Foo.java"
+ source.write_text(
+ "/*\n"
+ " * Copyright 2024 ACME\n"
+ " * All rights reserved\n"
+ " */\n"
+ "\n"
+ "class Foo {}\n",
+ encoding="utf-8",
+ )
+
+ result = self.run_script(root, "--year", "2026", "Foo.java")
+
+ self.assertEqual(result.returncode, 0, result.stderr)
+ self.assertIn("Updated 1 file(s).", result.stdout)
+ self.assertIn("Foo.java", result.stdout)
+ self.assertEqual(result.stderr, "")
+ self.assertEqual(
+ source.read_text(encoding="utf-8"),
+ "/*\n"
+ " * Copyright 2026 ACME\n"
+ " * All rights reserved\n"
+ " */\n"
+ "\n"
+ "class Foo {}\n",
+ )
+
+ def test_default_run_skips_tracked_files_deleted_from_working_tree(self) -> None:
+ with tempfile.TemporaryDirectory() as temp_dir:
+ root = Path(temp_dir)
+ self.write_profile(root)
+ source = root / "Foo.java"
+ source.write_text("class Foo {}\n", encoding="utf-8")
+
+ subprocess.run(["git", "init", "-q"], cwd=root, check=True)
+ subprocess.run(["git", "add", "Foo.java"], cwd=root, check=True)
+ source.unlink()
+
+ result = subprocess.run(
+ [
+ sys.executable,
+ str(SCRIPT),
+ "--root",
+ str(root),
+ "--dry-run",
+ ],
+ check=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ text=True,
+ )
+
+ self.assertEqual(result.returncode, 0, result.stderr)
+ self.assertIn("Would update 0 file(s).", result.stdout)
+ self.assertEqual(result.stderr, "")
+
+ @staticmethod
+ def run_script(root: Path, *args: str) -> subprocess.CompletedProcess[str]:
+ return subprocess.run(
+ [
+ sys.executable,
+ str(SCRIPT),
+ "--root",
+ str(root),
+ *args,
+ ],
+ check=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ text=True,
+ )
+
+ @staticmethod
+ def write_profile(root: Path) -> None:
+ copyright_dir = root / ".idea" / "copyright"
+ copyright_dir.mkdir(parents=True)
+ (copyright_dir / "profiles_settings.xml").write_text(
+ ''
+ ''
+ "\n",
+ encoding="utf-8",
+ )
+ (copyright_dir / "Default.xml").write_text(
+ ''
+ ""
+ ''
+ ""
+ "\n",
+ encoding="utf-8",
+ )
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/.agents/skills/writer/SKILL.md b/.agents/skills/writer/SKILL.md
index 5c720265b3..6b9d86f88e 100644
--- a/.agents/skills/writer/SKILL.md
+++ b/.agents/skills/writer/SKILL.md
@@ -3,7 +3,7 @@ name: writer
description: >
Write, edit, and restructure user-facing and developer-facing documentation.
Use when asked to create/update docs such as `README.md`, `docs/**`, and
- other Markdown documentation;
+ other Markdown documentation, including keeping docs navigation data in sync;
when drafting tutorials, guides, troubleshooting pages, or migration notes; and
when improving inline API documentation (KDoc) and examples.
---
@@ -24,10 +24,45 @@ description: >
- `docs/`: longer-form docs (follow existing conventions in that tree).
- Source KDoc: API usage, examples, and semantics that belong with the code.
+## Keep docs navigation in sync
+
+- When adding, removing, moving, or renaming a page under
+ `docs/content/docs//`, keep the current version's matching
+ `sidenav.yml` in sync.
+- Use `docs/data/versions.yml` to identify the current documentation version for
+ that section. The current version is the entry with `is_main: true`; its
+ `version_id` maps to `docs/data/docs///sidenav.yml`.
+- Do not update historical version entries or their navigation files unless the
+ user explicitly asks to edit that historical version.
+- Map page files to `file_path` values relative to the current version's
+ `content_path`, without `.md`; `_index.md` maps to its directory path, such as
+ `01-getting-started/_index.md` -> `01-getting-started`.
+- Keep each `page` label aligned with the page frontmatter `title` unless the
+ existing navigation intentionally uses a shorter reader-facing label.
+- Preserve the existing ordering, nesting, keys, comments, and YAML quoting
+ style. Remove nav entries for deleted pages and update `file_path` values for
+ moved pages.
+- If a docs content change should not appear in navigation, say so explicitly in
+ the final response.
+
## Follow local documentation conventions
- Follow `.agents/documentation-guidelines.md` and `.agents/documentation-tasks.md`.
- Use fenced code blocks for commands and examples; format file/dir names as code.
+- When referencing a documentation page or section in body prose, use typographic
+ double quotation marks only if the visible reference text is the actual page or
+ section title, such as the “Getting started” page or the “Troubleshooting”
+ section. The title normally starts with a capital letter. Do not add these
+ quotes around generic or descriptive links such as “this page”, “the next
+ section”, “declaring constraints”, or `4.3`, even if they point to a page or
+ section. Do not add these quotes in “What’s next” sections or navigation
+ elements. Keep file paths, identifiers, frontmatter values, navigation labels,
+ and Markdown link labels in their expected syntax.
+- In Markdown files, prefer footnote-style reference links for external `https://`
+ targets instead of inline links. Write readable body text like
+ `[label][short-id]`, then place the URL definition near the end of the file,
+ such as `[short-id]: https://example.com/long/path`. Keep reference IDs short
+ and descriptive. Inline links are still fine for local relative paths.
- Avoid widows, runts, orphans, and rivers by reflowing paragraphs when needed.
## Make docs actionable
@@ -48,4 +83,3 @@ description: >
- For code changes, follow `.agents/running-builds.md`.
- For documentation-only changes in Kotlin/Java sources, prefer `./gradlew dokka`.
-
diff --git a/.agents/version-policy.md b/.agents/version-policy.md
index 65dc457490..95ac4513e7 100644
--- a/.agents/version-policy.md
+++ b/.agents/version-policy.md
@@ -1,30 +1,15 @@
# Version policy
-## We use semver
-The version of the project is kept in the `version.gradle.kts` file in the root of the project.
+The project follows the [Spine SDK Versioning policy][wiki-versioning].
+The version is kept in `version.gradle.kts` at the project root and follows
+[Semantic Versioning 2.0.0][semver] with Spine-specific extensions
+(snapshot `NUMBER`, patch, and flavor suffixes).
-The version numbers in these files follow the conventions of
-[Semantic Versioning 2.0.0](https://semver.org/).
+PRs without a version bump fail CI.
-## Quick checklist for versioning
-1. Increment the patch version in `version.gradle.kts`.
- Retain zero-padding if applicable:
- - Example: `"2.0.0-SNAPSHOT.009"` → `"2.0.0-SNAPSHOT.010"`
-2. Commit the version bump separately with this comment:
- ```text
- Bump version → `$newVersion`
- ```
-3. Rebuild using `./gradlew clean build`.
-4. Update `pom.xml`, `dependencies.md` and commit changes with: `Update dependency reports`
+For the bump procedure — version-number selection, the commit-message
+convention, the rebuild, dependency-report updates, and conflict resolution —
+use the [`bump-version`](skills/bump-version/SKILL.md) skill.
-Remember: PRs without version bumps will fail CI (conflict resolution detailed above).
-
-## Resolving conflicts in `version.gradle.kts`
-A branch conflict over the version number should be resolved as described below.
- * If a merged branch has a number which is less than that of the current branch, the version of
- the current branch stays.
- * If the merged branch has the number which is greater or equal to that of the current branch,
- the number should be increased by one.
-
-## When to bump the version?
- - When a new branch is created.
+[semver]: https://semver.org/
+[wiki-versioning]: https://github.com/SpineEventEngine/documentation/wiki/Versioning
diff --git a/.claude/skills b/.claude/skills
new file mode 120000
index 0000000000..2b7a412b8f
--- /dev/null
+++ b/.claude/skills
@@ -0,0 +1 @@
+../.agents/skills
\ No newline at end of file
diff --git a/.github/workflows/build-on-ubuntu.yml b/.github/workflows/build-on-ubuntu.yml
index f8c24933f9..cd6b93714c 100644
--- a/.github/workflows/build-on-ubuntu.yml
+++ b/.github/workflows/build-on-ubuntu.yml
@@ -1,10 +1,10 @@
-name: Build under Ubuntu
+name: Ubuntu CI
on: push
jobs:
build:
- name: Build under Ubuntu
+ name: Build on Ubuntu
runs-on: ubuntu-latest
steps:
diff --git a/.github/workflows/build-on-windows.yml b/.github/workflows/build-on-windows.yml
index 4e6b57f1fd..91a0bfef32 100644
--- a/.github/workflows/build-on-windows.yml
+++ b/.github/workflows/build-on-windows.yml
@@ -1,11 +1,11 @@
-name: Build under Windows
+name: Windows CI
on: pull_request
jobs:
build:
- name: Build under Windows
runs-on: windows-latest
+ name: Build on Windows
steps:
- uses: actions/checkout@v4
diff --git a/.github/workflows/ensure-reports-updated.yml b/.github/workflows/ensure-reports-updated.yml
index fdd8b8e673..315cd202b7 100644
--- a/.github/workflows/ensure-reports-updated.yml
+++ b/.github/workflows/ensure-reports-updated.yml
@@ -1,6 +1,6 @@
# Ensures that the license report files were modified in this PR.
-name: Ensure license reports updated
+name: License Reports
on:
pull_request:
@@ -8,18 +8,18 @@ on:
- '**'
jobs:
- build:
- name: Ensure license reports updated
+ check:
+ name: Ensure license reports are updated
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
- # Configure the checkout of all branches, so that it is possible to run the comparison.
+ # Configure the checkout of all branches so that it is possible to run the comparison.
fetch-depth: 0
# Check out the `config` submodule to fetch the required script file.
submodules: true
- - name: Check that both `pom.xml` and license report files are modified
+ - name: Check that dependency report files are modified
shell: bash
run: chmod +x ./config/scripts/ensure-reports-updated.sh && ./config/scripts/ensure-reports-updated.sh
diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml
index 858cebbcc4..50eb05eb15 100644
--- a/.github/workflows/gradle-wrapper-validation.yml
+++ b/.github/workflows/gradle-wrapper-validation.yml
@@ -1,4 +1,4 @@
-name: Validate Gradle Wrapper
+name: Gradle Wrapper validation
on:
push:
branches:
@@ -9,7 +9,7 @@ on:
jobs:
validation:
- name: Gradle Wrapper Validation
+ name: Validate Gradle Wrapper
runs-on: ubuntu-latest
steps:
- name: Checkout latest code
diff --git a/.github/workflows/increment-guard.yml b/.github/workflows/increment-guard.yml
index 1993841a65..38ce6f4d3e 100644
--- a/.github/workflows/increment-guard.yml
+++ b/.github/workflows/increment-guard.yml
@@ -1,7 +1,7 @@
# Ensures that the current lib version is not yet published but executing the Gradle
# `checkVersionIncrement` task.
-name: Check version increment
+name: Version Guard
on:
push:
@@ -9,7 +9,7 @@ on:
- '**'
jobs:
- build:
+ check:
name: Check version increment
runs-on: ubuntu-latest
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 7de0c5101e..f7218c618e 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -6,7 +6,9 @@ on:
jobs:
publish:
+ name: Publish to Maven repositories
runs-on: ubuntu-latest
+
steps:
- uses: actions/checkout@v4
with:
diff --git a/.github/workflows/remove-obsolete-artifacts-from-packages.yaml b/.github/workflows/remove-obsolete-artifacts-from-packages.yaml
index fe8ad849d0..f706171007 100644
--- a/.github/workflows/remove-obsolete-artifacts-from-packages.yaml
+++ b/.github/workflows/remove-obsolete-artifacts-from-packages.yaml
@@ -34,7 +34,7 @@ env:
jobs:
retrieve-package-names:
- name: Retrieve the package names published from this repository
+ name: Retrieve package names
runs-on: ubuntu-latest
outputs:
package-names: ${{ steps.request-package-names.outputs.package-names }}
@@ -54,7 +54,7 @@ jobs:
echo "package-names=$(<./package-names.json)" >> $GITHUB_OUTPUT
delete-obsolete-artifacts:
- name: Remove obsolete artifacts published from this repository to GitHub Packages
+ name: Delete obsolete artifacts
needs: retrieve-package-names
runs-on: ubuntu-latest
strategy:
diff --git a/.gitignore b/.gitignore
index 48de9f27a3..5f85d295e8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,6 +39,7 @@
# Internal tool directories.
.fleet/
+.junie/memory/
# Kotlin temp directories.
**/.kotlin/
@@ -130,3 +131,7 @@ pubspec.lock
/tmp
.gradle-test-kit/
+
+# Python cache
+__pycache__/
+*.pyc
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index 0bd1d9dc2b..7be402da6f 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -255,6 +255,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.junie/guidelines.md b/.junie/guidelines.md
index 459e28ecae..5160f499e6 100644
--- a/.junie/guidelines.md
+++ b/.junie/guidelines.md
@@ -10,7 +10,7 @@ Also follow the Junie-specific rules described below.
## Junie Assistance Tips
-When working with Junie AI on the Spine Tool-Base project:
+When working with Junie AI on the Spine family of projects:
1. **Project Navigation**: Use `search_project` to find relevant files and code segments.
2. **Code Understanding**: Request file structure with `get_file_structure` before editing.
diff --git a/.junie/skills b/.junie/skills
new file mode 120000
index 0000000000..2b7a412b8f
--- /dev/null
+++ b/.junie/skills
@@ -0,0 +1 @@
+../.agents/skills
\ No newline at end of file
diff --git a/base/src/main/kotlin/io/spine/string/Placeholder.kt b/base/src/main/kotlin/io/spine/string/Placeholder.kt
new file mode 100644
index 0000000000..798bbd1b92
--- /dev/null
+++ b/base/src/main/kotlin/io/spine/string/Placeholder.kt
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * 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
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.string
+
+/**
+ * A named placeholder that can appear in a [TemplateString].
+ *
+ * @property name The placeholder name as it appears in a template string (e.g., `field.path`).
+ */
+public data class Placeholder(public val name: String) {
+
+ /**
+ * How this placeholder appears in the "code" of a template string,
+ * surrounded by a dollar sign and curly braces (e.g., `${field.path}`).
+ */
+ public val placed: String
+ get() = "\${$name}"
+
+ /**
+ * The placeholder [name] wrapped in backticks for use in diagnostic messages.
+ */
+ public val quoted: String
+ get() = "`$name`"
+
+ override fun toString(): String = name
+
+ public companion object {
+
+ /**
+ * Matches a template placeholder of the form `${name}`.
+ *
+ * Group 1 captures the placeholder name — one or more characters
+ * between `${` and the next `}`. Any character except `}` is allowed
+ * in the name, which permits dotted and underscored identifiers such
+ * as `${my.key}` or `${my_key}`.
+ */
+ internal val regex: Regex = Regex("\\$\\{([^}]+)}")
+
+ /**
+ * Extracts all placeholders used within the given [template] string
+ * in the order they appear, keeping every occurrence (so a placeholder
+ * referenced more than once is returned multiple times).
+ */
+ public fun extractPlaceholders(template: String): List =
+ regex.findAll(template)
+ .map { Placeholder(it.groupValues[1]) }
+ .toList()
+ }
+}
diff --git a/base/src/main/kotlin/io/spine/string/TemplateStringExts.kt b/base/src/main/kotlin/io/spine/string/TemplateStringExts.kt
new file mode 100644
index 0000000000..7fb57ae290
--- /dev/null
+++ b/base/src/main/kotlin/io/spine/string/TemplateStringExts.kt
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * 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
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+@file:JvmName("TemplateStrings")
+
+package io.spine.string
+
+import io.spine.string.Placeholder.Companion.extractPlaceholders
+
+/**
+ * Returns a template string with all placeholders substituted with
+ * their actual values.
+ *
+ * Placeholder values may themselves reference other placeholders using
+ * the same `${key}` syntax, and such references are resolved transitively.
+ * For example, given `withPlaceholders = "${greeting}"` and
+ * `placeholderValue = { "greeting": "Hello, ${name}!", "name": "World" }`,
+ * the result is `"Hello, World!"`.
+ *
+ * For example, for a template string with the following values:
+ *
+ * ```
+ * with_placeholders = "My dog's name is ${dog.name}."
+ * placeholder_value = { "dog.name": "Fido" }
+ * ```
+ *
+ * This method will return "My dog's name is Fido."
+ *
+ * @throws IllegalArgumentException If a placeholder used in the template
+ * (directly or via another placeholder's value) has no corresponding entry
+ * in the placeholder map, or if placeholder references form a cycle.
+ */
+public fun TemplateString.format(): String {
+ requireComplete {
+ "Cannot format the given `TemplateString`: `$withPlaceholders`. " +
+ "Missing value for the following placeholders: ${it.joinQuoted()}."
+ }
+ return resolve(strict = true)
+}
+
+/**
+ * Returns a template string with all placeholders substituted with
+ * their actual values, without validating that all placeholders have
+ * corresponding values.
+ *
+ * This method does not check whether every placeholder in the template has a matching value
+ * in the placeholder map. Any placeholders without a corresponding value will remain
+ * unchanged in the resulting string.
+ *
+ * Placeholder values may reference other placeholders using the same `${key}` syntax;
+ * such references are resolved transitively in a deterministic, key-driven order
+ * (independent of the underlying map's iteration order). If a chain of references
+ * forms a cycle, the offending placeholder is left unresolved as literal `${key}` text.
+ *
+ * For example, for a template string with the following values:
+ *
+ * ```
+ * withPlaceholders = "My dog's name is ${dog.name} and its breed is ${dog.breed}."
+ * placeholderValue = { "dog.name": "Fido" }
+ * ```
+ *
+ * This method will return "My dog's name is Fido and its breed is ${dog.breed}.".
+ */
+public fun TemplateString.formatUnsafe(): String =
+ resolve(strict = false)
+
+/**
+ * Substitutes placeholders in this template's [TemplateString.withPlaceholders]
+ * using [TemplateString.placeholderValueMap], resolving nested references.
+ *
+ * Resolution is recursive and driven by the placeholders that actually appear in
+ * the template (and, transitively, in values), so the result does not depend on
+ * the iteration order of the underlying value map.
+ *
+ * @param strict When `true`, missing transitive references and reference cycles
+ * raise [IllegalArgumentException]. When `false`, both are left as literal
+ * `${key}` text in the output.
+ */
+private fun TemplateString.resolve(strict: Boolean): String =
+ replaceIn(withPlaceholders) { placeholder ->
+ resolvePlaceholder(placeholder, strict, linkedSetOf())
+ }
+
+@Suppress("ReturnCount")
+private fun TemplateString.resolvePlaceholder(
+ placeholder: Placeholder,
+ strict: Boolean,
+ visiting: LinkedHashSet
+): String {
+ if (!placeholderValueMap.containsKey(placeholder.name)) {
+ if (strict) {
+ throw IllegalArgumentException(
+ "No value for placeholder ${placeholder.quoted} " +
+ "referenced from a placeholder value."
+ )
+ }
+ return placeholder.placed
+ }
+ if (!visiting.add(placeholder)) {
+ if (strict) {
+ val chain = (visiting.dropWhile { it != placeholder } + placeholder)
+ .joinToString(" -> ") { it.quoted }
+ throw IllegalArgumentException(
+ "Cyclic placeholder references detected: $chain."
+ )
+ }
+ return placeholder.placed
+ }
+ try {
+ val value = placeholderValueMap.getValue(placeholder.name)
+ return replaceIn(value) { p ->
+ resolvePlaceholder(p, strict, visiting)
+ }
+ } finally {
+ visiting.remove(placeholder)
+ }
+}
+
+/**
+ * Makes sure that each placeholder used in this template's
+ * [TemplateString.withPlaceholders] has a corresponding entry in
+ * [TemplateString.placeholderValueMap].
+ *
+ * @param lazyMessage The message to use in [IllegalArgumentException] if the check fails.
+ * @throws IllegalArgumentException If any placeholder lacks a value.
+ */
+public fun TemplateString.requireComplete(
+ lazyMessage: (List) -> String =
+ { "Missing value for the following template placeholders: ${it.joinQuoted()}." }
+) {
+ val missing = extractPlaceholders(withPlaceholders)
+ .filter { it.name !in placeholderValueMap }
+ .distinct()
+ if (missing.isNotEmpty()) {
+ throw IllegalArgumentException(lazyMessage(missing))
+ }
+}
+
+private fun Iterable.joinQuoted(): String =
+ joinToString { it.quoted }
+
+/**
+ * Replaces every placeholder occurrence in [template] with the string
+ * produced by [transform], returning the resulting string.
+ */
+private fun replaceIn(template: String, transform: (Placeholder) -> String): String =
+ Placeholder.regex.replace(template) { match -> transform(Placeholder(match.groupValues[1])) }
diff --git a/base/src/main/proto/spine/string/template_string.proto b/base/src/main/proto/spine/string/template_string.proto
new file mode 100644
index 0000000000..345bd2a947
--- /dev/null
+++ b/base/src/main/proto/spine/string/template_string.proto
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * 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
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+syntax = "proto3";
+
+package spine.string;
+
+import "spine/options.proto";
+
+option (type_url_prefix) = "type.spine.io";
+option java_multiple_files = true;
+option java_outer_classname = "TemplateStringProto";
+option java_package = "io.spine.string";
+
+// Represents a template string with placeholders and a map for further substituting
+// those placeholders with the actual values.
+//
+// Placeholders are specified using the format `${key}`, where `key` is the identifier
+// for the value to be substituted from the `placeholder_value` map. There are no
+// expectations about the identifier format. It can be `myKey`, `my.key`, `my_key`, etc.
+//
+// Example usage:
+// template_string = "My dog's name is ${dog.name}."
+// placeholder_values = { "dog.name": "Fido" }
+//
+// After substitution, the final output would be:
+// "My dog's name is Fido."
+//
+// Each placeholder `key` referenced in the template string must have a corresponding entry
+// in the `placeholder_value` map. However, the `placeholder_value` map is not restricted to
+// containing only the placeholders used in the template. Additional entries in the map
+// that do not correspond to placeholders in the template string are permitted.
+//
+message TemplateString {
+
+ // The template string that may contain one or more placeholders.
+ string with_placeholders = 1;
+
+ // A map that provides values for placeholders referenced in `with_placeholders`.
+ //
+ // The keys in this map should match the placeholder keys inside `with_placeholders`
+ // excluding the `${}` placeholder markers.
+ //
+ // All placeholders present in `with_placeholders` must have corresponding entries
+ // in this map. Otherwise, the template is considered invalid.
+ //
+ map placeholder_value = 2;
+}
diff --git a/base/src/test/kotlin/io/spine/string/PlaceholderSpec.kt b/base/src/test/kotlin/io/spine/string/PlaceholderSpec.kt
new file mode 100644
index 0000000000..1660bc3a41
--- /dev/null
+++ b/base/src/test/kotlin/io/spine/string/PlaceholderSpec.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * 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
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.string
+
+import io.kotest.matchers.shouldBe
+import org.junit.jupiter.api.DisplayName
+import org.junit.jupiter.api.Test
+
+@DisplayName("`Placeholder` should")
+internal class PlaceholderSpec {
+
+ private val placeholder = Placeholder("dog.name")
+
+ @Test
+ fun `expose its 'placed' form as it appears in a template string`() {
+ placeholder.placed shouldBe "\${dog.name}"
+ }
+
+ @Test
+ fun `expose its 'quoted' form for diagnostic messages`() {
+ placeholder.quoted shouldBe "`dog.name`"
+ }
+
+ @Test
+ fun `return its name from 'toString()'`() {
+ placeholder.toString() shouldBe "dog.name"
+ }
+}
diff --git a/base/src/test/kotlin/io/spine/string/TemplateStringExtsSpec.kt b/base/src/test/kotlin/io/spine/string/TemplateStringExtsSpec.kt
new file mode 100644
index 0000000000..fe959f4839
--- /dev/null
+++ b/base/src/test/kotlin/io/spine/string/TemplateStringExtsSpec.kt
@@ -0,0 +1,300 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * 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
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.string
+
+import io.kotest.matchers.shouldBe
+import io.kotest.matchers.string.shouldContain
+import org.junit.jupiter.api.DisplayName
+import org.junit.jupiter.api.Nested
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.assertDoesNotThrow
+import org.junit.jupiter.api.assertThrows
+
+@DisplayName("`TemplateString` extensions should")
+internal class TemplateStringExtsSpec {
+
+ @Nested inner class
+ `format the template string` {
+
+ @Test
+ fun `returning the correct result`() {
+ val template = templateString {
+ withPlaceholders = "My dog's name is \${dog.name}."
+ placeholderValue["dog.name"] = "Fido"
+ }
+ template.format() shouldBe "My dog's name is Fido."
+ }
+
+ @Test
+ fun `substituting multiple placeholders`() {
+ val template = templateString {
+ withPlaceholders = "\${greeting}, \${name}!"
+ placeholderValue["greeting"] = "Hello"
+ placeholderValue["name"] = "World"
+ }
+ template.format() shouldBe "Hello, World!"
+ }
+
+ @Test
+ fun `substituting the same placeholder more than once`() {
+ val template = templateString {
+ withPlaceholders = "\${word} \${word} \${word}"
+ placeholderValue["word"] = "tick"
+ }
+ template.format() shouldBe "tick tick tick"
+ }
+
+ @Test
+ fun `returning an empty string if given an empty template`() {
+ TemplateString.getDefaultInstance().format() shouldBe ""
+ }
+
+ @Test
+ fun `returning the template as-is when no placeholders are present`() {
+ val template = templateString {
+ withPlaceholders = "Just a plain string."
+ }
+ template.format() shouldBe "Just a plain string."
+ }
+
+ @Test
+ fun `throwing when a placeholder has no value`() {
+ assertThrows {
+ val template = templateString {
+ withPlaceholders = "My dog's name is \${dog.name}."
+ }
+ template.format()
+ }
+ }
+
+ @Test
+ fun `ignore when a placeholder with a value is not used`() {
+ assertDoesNotThrow {
+ val template = templateString {
+ withPlaceholders = "My dog's name is Fido."
+ placeholderValue["dog.name"] = "Fido"
+ }
+ template.format()
+ }
+ }
+ }
+
+ @Nested inner class
+ `validate the template against placeholders` {
+
+ private val message = { missingPlaceholders: List -> "$missingPlaceholders" }
+ private val templateText = "\${val1}, \${val2}, \${val3}, \${val4}, \${val5}"
+ private val fooPlaceholders = mapOf("val1" to "Foo", "val2" to "Foo", "val3" to "Foo")
+ private val barPlaceholders = mapOf("val4" to "Bar", "val5" to "Bar")
+
+ @Test
+ fun `failing if the template has non-presentable placeholder`() {
+ val template = templateString {
+ withPlaceholders = templateText
+ placeholderValue.putAll(fooPlaceholders)
+ }
+ val exception = assertThrows {
+ template.requireComplete(message)
+ }
+ exception.message shouldBe message(listOf(Placeholder("val4"), Placeholder("val5")))
+ }
+
+ @Test
+ fun `bypassing the template if all placeholders are present`() {
+ val template = templateString {
+ withPlaceholders = templateText
+ placeholderValue.putAll(fooPlaceholders + barPlaceholders)
+ }
+ assertDoesNotThrow {
+ template.requireComplete(message)
+ }
+ }
+
+ @Test
+ fun `accepting an empty template`() {
+ assertDoesNotThrow {
+ TemplateString.getDefaultInstance().requireComplete()
+ }
+ }
+ }
+
+ @Nested inner class
+ `extract placeholders from the template` {
+
+ @Test
+ fun `returning every occurrence in the order they appear`() {
+ val template = "\${a} and \${b} and \${a}"
+ Placeholder.extractPlaceholders(template) shouldBe
+ listOf(Placeholder("a"), Placeholder("b"), Placeholder("a"))
+ }
+
+ @Test
+ fun `preserving the order of repeated placeholders across the template`() {
+ val template = "\${b}-\${a}-\${b}-\${c}-\${a}-\${b}"
+ Placeholder.extractPlaceholders(template) shouldBe listOf(
+ Placeholder("b"),
+ Placeholder("a"),
+ Placeholder("b"),
+ Placeholder("c"),
+ Placeholder("a"),
+ Placeholder("b"),
+ )
+ }
+
+ @Test
+ fun `returning an empty list for a plain string`() {
+ Placeholder.extractPlaceholders("no placeholders here") shouldBe emptyList()
+ }
+
+ @Test
+ fun `supporting dotted, underscored, and mixed identifiers`() {
+ val template = "\${my.key}-\${my_key}-\${myKey}"
+ Placeholder.extractPlaceholders(template) shouldBe
+ listOf(Placeholder("my.key"), Placeholder("my_key"), Placeholder("myKey"))
+ }
+ }
+
+ @Test
+ fun `format with missing placeholders`() {
+ val template = templateString {
+ withPlaceholders = "My dog's name is \${dog.name} and its breed is \${dog.breed}."
+ placeholderValue["dog.name"] = "Fido"
+ }
+ template.formatUnsafe() shouldBe "My dog's name is Fido and its breed is \${dog.breed}."
+ }
+
+ @Nested inner class
+ `resolve placeholders referenced from other placeholder values` {
+
+ @Test
+ fun `via 'format', resolving a transitive chain`() {
+ val template = templateString {
+ withPlaceholders = "\${greeting}"
+ placeholderValue["greeting"] = "Hello, \${name}!"
+ placeholderValue["name"] = "World"
+ }
+ template.format() shouldBe "Hello, World!"
+ }
+
+ @Test
+ fun `via 'format', not depending on map iteration order`() {
+ // A value containing placeholder-looking text must not be re-substituted
+ // based on the order keys happen to be iterated.
+ val template = templateString {
+ withPlaceholders = "\${a} then \${b}"
+ placeholderValue["a"] = "\${b}"
+ placeholderValue["b"] = "literal-b"
+ }
+ template.format() shouldBe "literal-b then literal-b"
+ }
+
+ @Test
+ fun `via 'format', throwing on a reference cycle`() {
+ val template = templateString {
+ withPlaceholders = "\${a}"
+ placeholderValue["a"] = "\${b}"
+ placeholderValue["b"] = "\${a}"
+ }
+ val exception = assertThrows { template.format() }
+ exception.message shouldContain "Cyclic"
+ exception.message shouldContain "`a`"
+ exception.message shouldContain "`b`"
+ }
+
+ @Test
+ fun `via 'format', throwing on a three-step reference cycle`() {
+ val template = templateString {
+ withPlaceholders = "\${a}"
+ placeholderValue["a"] = "\${b}"
+ placeholderValue["b"] = "\${c}"
+ placeholderValue["c"] = "\${a}"
+ }
+ val exception = assertThrows { template.format() }
+ exception.message shouldContain "`a` -> `b` -> `c` -> `a`"
+ }
+
+ @Test
+ fun `via 'formatUnsafe', leaving a three-step reference cycle unresolved`() {
+ val template = templateString {
+ withPlaceholders = "\${a}"
+ placeholderValue["a"] = "\${b}"
+ placeholderValue["b"] = "\${c}"
+ placeholderValue["c"] = "\${a}"
+ }
+ template.formatUnsafe() shouldBe "\${a}"
+ }
+
+ @Test
+ fun `via 'format', throwing on a self-reference cycle`() {
+ val template = templateString {
+ withPlaceholders = "\${a}"
+ placeholderValue["a"] = "x-\${a}-x"
+ }
+ assertThrows { template.format() }
+ }
+
+ @Test
+ fun `via 'format', throwing on a transitively missing reference`() {
+ val template = templateString {
+ withPlaceholders = "\${a}"
+ placeholderValue["a"] = "see \${b}"
+ }
+ val exception = assertThrows { template.format() }
+ exception.message shouldContain "`b`"
+ }
+
+ @Test
+ fun `via 'formatUnsafe', resolving a transitive chain`() {
+ val template = templateString {
+ withPlaceholders = "\${greeting}"
+ placeholderValue["greeting"] = "Hello, \${name}!"
+ placeholderValue["name"] = "World"
+ }
+ template.formatUnsafe() shouldBe "Hello, World!"
+ }
+
+ @Test
+ fun `via 'formatUnsafe', leaving a reference cycle unresolved`() {
+ val template = templateString {
+ withPlaceholders = "\${a}"
+ placeholderValue["a"] = "\${b}"
+ placeholderValue["b"] = "\${a}"
+ }
+ // The cycle is broken by leaving the repeated key as literal text.
+ template.formatUnsafe() shouldBe "\${a}"
+ }
+
+ @Test
+ fun `via 'formatUnsafe', leaving a transitively missing reference as-is`() {
+ val template = templateString {
+ withPlaceholders = "\${a}"
+ placeholderValue["a"] = "see \${b}"
+ }
+ template.formatUnsafe() shouldBe "see \${b}"
+ }
+ }
+}
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
index fdcb94aee2..56f3530450 100644
--- a/buildSrc/build.gradle.kts
+++ b/buildSrc/build.gradle.kts
@@ -36,9 +36,6 @@ plugins {
java
groovy
`kotlin-dsl`
-
- // https://github.com/jk1/Gradle-License-Report/releases
- id("com.github.jk1.dependency-license-report").version("2.9")
}
repositories {
@@ -65,7 +62,12 @@ val jacksonVersion = "2.18.3"
*/
val googleAuthToolVersion = "2.1.5"
-val licenseReportVersion = "2.7"
+/**
+ * Generates reports about the licenses of the dependencies for a Gradle project.
+ *
+ * https://github.com/jk1/Gradle-License-Report
+ */
+val licenseReportVersion = "3.1.2"
val grGitVersion = "4.1.1"
@@ -113,7 +115,7 @@ val protobufPluginVersion = "0.9.6"
* @see
* Dokka Releases
*/
-val dokkaVersion = "2.1.0"
+val dokkaVersion = "2.2.0"
/**
* The version of Detekt Gradle Plugin.
@@ -135,11 +137,23 @@ val koverVersion = "0.9.1"
/**
* The version of the Shadow Plugin.
*
- * `7.1.2` is the last version compatible with Gradle 7.x. Newer versions require Gradle v8.x.
- *
* @see Shadow Plugin releases
*/
-val shadowVersion = "9.2.2"
+val shadowVersion = "9.4.1"
+
+/**
+ * The version of JUnit used to test the build scripts.
+ *
+ * @see [io.spine.dependency.test.JUnit]
+ */
+val junitVersion = "6.0.3"
+
+/**
+ * The version of Kotest used to test the build scripts.
+ *
+ * @see [io.spine.dependency.test.Kotest]
+ */
+val kotestVersion = "6.1.11"
configurations.all {
resolutionStrategy {
@@ -193,9 +207,9 @@ dependencies {
implementation(it)
}
- testImplementation(platform("org.junit:junit-bom:5.11.4"))
+ testImplementation(platform("org.junit:junit-bom:$junitVersion"))
testImplementation("org.junit.jupiter:junit-jupiter")
- testImplementation("io.kotest:kotest-assertions-core:6.0.4")
+ testImplementation("io.kotest:kotest-assertions-core:$kotestVersion")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/build/Dokka.kt b/buildSrc/src/main/kotlin/io/spine/dependency/build/Dokka.kt
index ba0433aaf0..6b4822dcd0 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/build/Dokka.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/Dokka.kt
@@ -26,6 +26,8 @@
package io.spine.dependency.build
+import io.spine.dependency.local.Spine
+
// https://github.com/Kotlin/dokka
@Suppress("unused", "ConstPropertyName")
object Dokka {
@@ -35,7 +37,7 @@ object Dokka {
* When changing the version, also change the version used in the
* `buildSrc/build.gradle.kts`.
*/
- const val version = "2.1.0"
+ const val version = "2.2.0"
object GradlePlugin {
const val id = "org.jetbrains.dokka"
@@ -76,7 +78,7 @@ object Dokka {
* Custom Dokka Plugins
*/
object SpineExtensions {
- private const val group = "io.spine.tools"
+ private const val group = Spine.toolsGroup
const val version = "2.0.0-SNAPSHOT.7"
const val lib = "$group:spine-dokka-extensions:$version"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/build/LicenseReport.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/JetBrainsAnnotations.kt
similarity index 71%
rename from buildSrc/src/main/kotlin/io/spine/dependency/build/LicenseReport.kt
rename to buildSrc/src/main/kotlin/io/spine/dependency/lib/JetBrainsAnnotations.kt
index 826f86853a..f1a66e2a53 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/build/LicenseReport.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/JetBrainsAnnotations.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,17 +24,19 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package io.spine.dependency.build
+package io.spine.dependency.lib
-// https://github.com/jk1/Gradle-License-Report
-@Suppress("unused")
-object LicenseReport {
- private const val version = "3.0.1"
- const val lib = "com.github.jk1:gradle-license-report:$version"
-
- object GradlePlugin {
- const val version = LicenseReport.version
- const val id = "com.github.jk1.dependency-license-report"
- const val lib = LicenseReport.lib
- }
+/**
+ * Annotations library from JetBrains.
+ *
+ * https://github.com/JetBrains/java-annotations
+ */
+object JetBrainsAnnotations {
+ /**
+ * The version of the library transitively used.
+ */
+ const val version = "23.0.0"
+ const val groupId = "org.jetbrains"
+ const val artifactId = "annotations"
+ const val lib = "$groupId:$artifactId:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt
index b999a75d2c..463cbf2b1f 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt
@@ -33,8 +33,8 @@ package io.spine.dependency.local
*/
@Suppress("ConstPropertyName", "unused")
object Base {
- const val version = "2.0.0-SNAPSHOT.386"
- const val versionForBuildScript = "2.0.0-SNAPSHOT.386"
+ const val version = "2.0.0-SNAPSHOT.387"
+ const val versionForBuildScript = "2.0.0-SNAPSHOT.387"
const val group = Spine.group
private const val prefix = "spine"
const val libModule = "$prefix-base"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt
index 31cbfb3fac..330917d7c1 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt
@@ -60,7 +60,7 @@ import io.spine.dependency.Dependency
)
object Compiler : Dependency() {
const val pluginGroup = Spine.group
- override val group = "io.spine.tools"
+ override val group = Spine.toolsGroup
const val pluginId = "io.spine.compiler"
/**
@@ -72,7 +72,7 @@ object Compiler : Dependency() {
* The version of the Compiler dependencies.
*/
override val version: String
- private const val fallbackVersion = "2.0.0-SNAPSHOT.041"
+ private const val fallbackVersion = "2.0.0-SNAPSHOT.043"
/**
* The distinct version of the Compiler used by other build tools.
@@ -81,7 +81,7 @@ object Compiler : Dependency() {
* transitive dependencies, this is the version used to build the project itself.
*/
val dogfoodingVersion: String
- private const val fallbackDfVersion = "2.0.0-SNAPSHOT.041"
+ private const val fallbackDfVersion = "2.0.0-SNAPSHOT.043"
/**
* The artifact for the Compiler Gradle plugin.
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvm.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvm.kt
index 2e0b6973b5..1f95edc473 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvm.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvm.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -39,7 +39,7 @@ typealias CoreJava = CoreJvm
@Suppress("ConstPropertyName", "unused")
object CoreJvm {
const val group = Spine.group
- const val version = "2.0.0-SNAPSHOT.372"
+ const val version = "2.0.0-SNAPSHOT.373"
const val coreArtifact = "spine-core"
const val clientArtifact = "spine-client"
@@ -50,9 +50,9 @@ object CoreJvm {
const val server = "$group:$serverArtifact:$version"
@Deprecated("Use `serverTestLib` instead.", ReplaceWith("serverTestLib"))
- const val testUtilServer = "${Spine.toolsGroup}:spine-server-testlib:$version"
+ const val testUtilServer = "${Spine.toolsGroup}:server-testlib:$version"
- const val coreTestLib = "${Spine.toolsGroup}:spine-core-testlib:$version"
- const val clientTestLib = "${Spine.toolsGroup}:spine-client-testlib:$version"
- const val serverTestLib = "${Spine.toolsGroup}:spine-server-testlib:$version"
+ const val coreTestLib = "${Spine.toolsGroup}:core-testlib:$version"
+ const val clientTestLib = "${Spine.toolsGroup}:client-testlib:$version"
+ const val serverTestLib = "${Spine.toolsGroup}:server-testlib:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt
index 344e8a13fc..6e77a80e4d 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt
@@ -39,19 +39,19 @@ package io.spine.dependency.local
object CoreJvmCompiler {
/**
- * The Compiler belongs to the `tools` group.
+ * The Compiler belongs the `tools` group.
*/
const val group = Spine.toolsGroup
/**
* The version used to in the build classpath.
*/
- const val dogfoodingVersion = "2.0.0-SNAPSHOT.058"
+ const val dogfoodingVersion = "2.0.0-SNAPSHOT.063"
/**
* The version to be used for integration tests.
*/
- const val version = "2.0.0-SNAPSHOT.058"
+ const val version = "2.0.0-SNAPSHOT.062"
/**
* The ID of the Gradle plugin.
@@ -61,33 +61,20 @@ object CoreJvmCompiler {
/**
* The library with the [dogfoodingVersion].
*/
- val pluginLib = pluginLibNew(dogfoodingVersion)
+ val pluginLib = pluginLib(dogfoodingVersion)
/**
- * The library with the given [version].
- *
- * This is the notation before the version `2.0.0-SNAPSHOT.013`
+ * The name of the published fat JAR artifact.
*/
- @Deprecated("Use `pluginLibNew()` instead.")
- fun pluginLib(version: String): String = "$group:core-jvm-plugins:$version:all"
+ const val fatJarArtifact = "core-jvm-plugins"
/**
* The library with the given [version].
- *
- * @since 2.0.0-SNAPSHOT.013
- */
- fun pluginLibNew(version: String): String = "$group:core-jvm-plugins:$version"
-
- /** The artifact reference for forcing in configurations. */
- const val pluginsArtifact: String = "$group:core-jvm-plugins:$version"
-
- /**
- * The `core-jvm-base` artifact with the [version].
*/
- val base = base(version)
+ fun pluginLib(version: String): String = "$group:core-jvm-plugins:$version"
/**
- * The `core-jvm-base` artifact with the given [version].
+ * The artifact reference for forcing in configurations.
*/
- fun base(version: String): String = "$group:core-jvm-base:$version"
+ val pluginsArtifact: String = pluginLib(version)
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt
index 3bb11408c1..04d19ea52d 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -33,7 +33,7 @@ package io.spine.dependency.local
*/
@Suppress("ConstPropertyName", "unused")
object Logging {
- const val version = "2.0.0-SNAPSHOT.411"
+ const val version = "2.0.0-SNAPSHOT.417"
const val group = Spine.group
const val loggingArtifact = "spine-logging"
@@ -46,7 +46,7 @@ object Logging {
const val grpcContext = "$group:spine-logging-grpc-context:$version"
const val smokeTest = "$group:spine-logging-smoke-test:$version"
- const val testLib = "${Spine.toolsGroup}:spine-logging-testlib:$version"
+ const val testLib = "${Spine.toolsGroup}:logging-testlib:$version"
// Transitive dependencies.
// Make `public` and use them to force a version in a particular repository, if needed.
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoTap.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoTap.kt
index 3b4df10097..8ead987800 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoTap.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoTap.kt
@@ -37,7 +37,7 @@ package io.spine.dependency.local
"MemberVisibilityCanBePrivate" /* The properties are used directly by other subprojects. */,
)
object ProtoTap {
- const val group = "io.spine.tools"
+ const val group = Spine.toolsGroup
const val version = "0.14.0"
const val gradlePluginId = "io.spine.prototap"
const val api = "$group:prototap-api:$version"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/TestLib.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/TestLib.kt
index d3fe7c6937..355399a525 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/TestLib.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/TestLib.kt
@@ -33,8 +33,8 @@ package io.spine.dependency.local
*/
@Suppress("ConstPropertyName")
object TestLib {
- const val version = "2.0.0-SNAPSHOT.211"
+ const val version = "2.0.0-SNAPSHOT.213"
const val group = Spine.toolsGroup
- const val artifact = "spine-testlib"
+ const val artifact = "base-testlib"
const val lib = "$group:$artifact:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt
index 363e8a3056..4e285fa9d2 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt
@@ -40,11 +40,12 @@ import io.spine.dependency.Dependency
)
object Time : Dependency() {
override val group = Spine.group
- override val version = "2.0.0-SNAPSHOT.234"
+ override val version = "2.0.0-SNAPSHOT.238"
private const val infix = "spine-time"
fun lib(version: String): String = "$group:$infix:$version"
val lib get() = lib(version)
+ const val libArtifact: String = infix
fun javaExtensions(version: String): String = "$group:$infix-java:$version"
val javaExtensions get() = javaExtensions(version)
@@ -55,6 +56,12 @@ object Time : Dependency() {
fun testLib(version: String): String = "${Spine.toolsGroup}:time-testlib:$version"
val testLib get() = testLib(version)
+ fun validation(version: String): String = "${Spine.toolsGroup}:time-validation:$version"
+ val validation get() = validation(version)
+
+ fun gradlePlugin(version: String): String = "${Spine.toolsGroup}:time-gradle-plugin:$version"
+ val gradlePlugin get() = gradlePlugin(version)
+
override val modules: List
get() = listOf(
lib,
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt
index 872127af22..12f3e0d274 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt
@@ -34,8 +34,8 @@ package io.spine.dependency.local
@Suppress("ConstPropertyName", "unused")
object ToolBase {
const val group = Spine.toolsGroup
- const val version = "2.0.0-SNAPSHOT.375"
- const val dogfoodingVersion = "2.0.0-SNAPSHOT.375"
+ const val version = "2.0.0-SNAPSHOT.378"
+ const val dogfoodingVersion = "2.0.0-SNAPSHOT.378"
const val lib = "$group:tool-base:$version"
const val classicCodegen = "$group:classic-codegen:$version"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt
index cf429bf432..600deeda75 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -36,7 +36,7 @@ object Validation {
/**
* The version of the Validation library artifacts.
*/
- const val version = "2.0.0-SNAPSHOT.408"
+ const val version = "2.0.0-SNAPSHOT.415"
/**
* The last version of Validation compatible with ProtoData.
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/test/Kotest.kt b/buildSrc/src/main/kotlin/io/spine/dependency/test/Kotest.kt
index bc5a36c120..f857bcd888 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/test/Kotest.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/Kotest.kt
@@ -35,29 +35,23 @@ package io.spine.dependency.test
*/
@Suppress("unused", "ConstPropertyName")
object Kotest {
- const val version = "6.0.4"
+ const val version = "6.1.11"
const val group = "io.kotest"
const val gradlePluginId = "io.kotest"
const val assertions = "$group:kotest-assertions-core:$version"
const val runnerJUnit5 = "$group:kotest-runner-junit5:$version"
const val runnerJUnit5Jvm = "$group:kotest-runner-junit5-jvm:$version"
- const val frameworkApi = "$group:kotest-framework-api:$version"
- const val datatest = "$group:kotest-framework-datatest:$version"
const val frameworkEngine = "$group:kotest-framework-engine:$version"
+ const val common = "$group:kotest-common:$version"
- // https://plugins.gradle.org/plugin/io.kotest.multiplatform
- @Deprecated("The plugin is deprecated. Use `io.kotest` plugin instead.")
- object MultiplatformGradlePlugin {
- const val version = "6.0.0.M4"
- const val id = "io.kotest.multiplatform"
- const val classpath = "$group:kotest-framework-multiplatform-plugin-gradle:$version"
- }
-
- // https://github.com/kotest/kotest-gradle-plugin
- @Deprecated("The repository is archived. Use `io.kotest.multiplatform` plugin instead.")
- object JvmGradlePlugin {
- const val version = "0.4.11"
- const val id = "io.kotest"
- const val classpath = "$group:kotest-gradle-plugin:$version"
- }
+ /**
+ * @deprecated Use `frameworkEngine` instead.
+ */
+ @Deprecated("Use `frameworkEngine` instead.", ReplaceWith("frameworkEngine"))
+ const val frameworkApi = "$group:kotest-framework-api:$version"
+ /**
+ * @deprecated The dependency was merged into the core framework.
+ */
+ @Deprecated("The dependency was merged into the core framework.")
+ const val datatest = "$group:kotest-framework-datatest:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt b/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt
index deda203638..afccc24b53 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -36,10 +36,6 @@ import org.gradle.api.tasks.SourceSetContainer
import org.gradle.kotlin.dsl.findByType
import org.gradle.kotlin.dsl.getByType
-/**
- * This file contains extension methods and properties for the Gradle `Project`.
- */
-
/**
* Logs the result of the function using the project logger at `INFO` level.
*/
@@ -86,8 +82,9 @@ fun Project.getTask(name: String): T {
/**
* Obtains Maven artifact ID of this [Project].
*
- * The method checks if [SpinePublishing] extension is configured upon this project. If yes,
- * returns [SpinePublishing.artifactId] for the project. Otherwise, a project's name is returned.
+ * The property getter checks if [SpinePublishing] extension is configured upon this project.
+ * If yes, it returns [SpinePublishing.artifactId] for the project.
+ * Otherwise, a project's name is returned.
*/
val Project.artifactId: String
get() {
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/docs/UpdatePluginVersion.kt b/buildSrc/src/main/kotlin/io/spine/gradle/docs/UpdatePluginVersion.kt
index a7f269f94a..0277bcd281 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/docs/UpdatePluginVersion.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/docs/UpdatePluginVersion.kt
@@ -93,8 +93,9 @@ abstract class UpdatePluginVersion : DefaultTask() {
@Suppress("MemberNameEqualsClassName")
private fun updatePluginVersion(file: File, id: String, version: String) {
val content = file.readText()
- // Regex to match: id("plugin-id") version "version-number"
- val regex = """id\("$id"\)\s+version\s+"([^"]+)"""".toRegex()
+ val pluginId = Regex.escape(id)
+ // Regex to match: id("pluginId") version "version-number"
+ val regex = """id\("$pluginId"\)\s+version\s+"([^"]+)"""".toRegex()
if (regex.containsMatchIn(content)) {
val updatedContent = regex.replace(content) {
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPages.kt b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPages.kt
index cdfd2c4698..860dfbed1e 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPages.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPages.kt
@@ -107,15 +107,7 @@ class UpdateGitHubPages : Plugin {
override fun apply(project: Project) {
val extension = UpdateGitHubPagesExtension.createIn(project)
project.afterEvaluate {
- //TODO:2025-11-20:alexander.yevsyukov: Remove this line and uncomment the below block
- // when new publishing procedure is finalized.
registerTasks(extension)
-// val projectVersion = project.version.toString()
-// if (projectVersion.isSnapshot()) {
-// registerNoOpTask()
-// } else {
-// registerTasks(extension)
-// }
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublicationHandler.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublicationHandler.kt
index 5b3bbe1290..5dd8dc54ef 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublicationHandler.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublicationHandler.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,7 +26,9 @@
package io.spine.gradle.publish
+import DocumentationSettings
import LicenseSettings
+import io.spine.gradle.artifactId
import io.spine.gradle.isSnapshot
import io.spine.gradle.repo.Repository
import io.spine.gradle.report.pom.InceptionYear
@@ -125,25 +127,49 @@ sealed class PublicationHandler(
}
/**
- * Copies the attributes of Gradle [Project] to this [MavenPublication].
+ * Copies the attributes of the [project] to this [MavenPublication].
*
* The following project attributes are copied:
* * [group][Project.getGroup];
* * [version][Project.getVersion];
* * [description][Project.getDescription].
*
- * Also, this function adds the [artifactPrefix][SpinePublishing.artifactPrefix] to
- * the [artifactId][MavenPublication.setArtifactId] of this publication,
- * if the prefix is not added yet.
+ * The [artifactId] is derived from the project
+ * [extension property][io.spine.gradle.artifactId] of the same name, combined with
+ * the platform-specific suffix already present in the publication's artifact ID.
+ * This preserves Kotlin Multiplatform suffixes such as `-jvm`.
*
- * Finally, the Apache Software License 2.0 is set as the only license
- * under which the published artifact is distributed.
+ * For example, if the project artifact ID is `spine-logging` and the publication's
+ * current artifact ID is `logging-jvm` (set by the KMP plugin), the resulting
+ * artifact ID will be `spine-logging-jvm`.
+ *
+ * The Apache Software License 2.0 is set as the only license
+ * under which the published artifact is distributed via [LicenseSettings]
+ *
+ * The source control management attributes are obtained from [DocumentationSettings].
+ *
+ * @see LicenseSettings
+ * @see DocumentationSettings
*/
protected fun MavenPublication.copyProjectAttributes() {
groupId = project.group.toString()
- val prefix = project.spinePublishing.artifactPrefix
- if (!artifactId.startsWith(prefix)) {
- artifactId = prefix + artifactId
+ // Add the proper prefix to the `artifactId`.
+ // The default `artifactId` is either `project.name` or
+ // the `project.name` with the platform suffix of a KMM distribution.
+ artifactId = if (artifactId.startsWith(project.name)) {
+ val platformSuffix = artifactId.removePrefix(project.name)
+ val replacedId = project.artifactId + platformSuffix
+ project.logger.info(
+ "The project `${project.name}` got modified artifact: `$replacedId`."
+ )
+ replacedId
+ } else {
+ project.logger.info(
+ "The `artifactId` for the project `${project.name}` stays: `$artifactId`."
+ )
+ // This is an unlikely case of `artifactId` being set to something unrelated
+ // to the project name. Let's keep it as is.
+ artifactId
}
version = project.version.toString()
pom.description.set(project.description)
@@ -152,7 +178,9 @@ sealed class PublicationHandler(
license {
name.set(LicenseSettings.name)
url.set(LicenseSettings.url)
- distribution.set(LicenseSettings.url)
+ // It's either `"repo"` or `"manual"`.
+ // https://maven.apache.org/ref/3.9.15/maven-model/apidocs/org/apache/maven/model/License.html#setDistribution(java.lang.String)
+ distribution.set("repo")
}
}
pom.scm {
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/ShadowJarExts.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/ShadowJarExts.kt
index 87157fdf60..0fa60fdc0c 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/ShadowJarExts.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/ShadowJarExts.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,54 +24,59 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+@file:Suppress("ConstPropertyName")
+
package io.spine.gradle.publish
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
+import org.gradle.api.file.DuplicatesStrategy
/**
- * Calls [ShadowJar.mergeServiceFiles] for the files we use in the Spine SDK.
+ * Configures a `ShadowJar` task for Spine SDK publishing.
*/
-fun ShadowJar.handleMergingServiceFiles() {
- ServiceFiles.all.forEach {
- append(it)
- }
+@Suppress("unused")
+fun ShadowJar.setup() {
+ duplicatesStrategy = DuplicatesStrategy.INCLUDE // Required for service-file merging.
+ mergeServiceFiles()
+ append(DESC_REF)
+ deduplicateEntries()
}
-@Suppress("ConstPropertyName")
-private object ServiceFiles {
-
- /**
- * Files containing references to descriptor set files.
- */
- private const val descriptorSetReferences = "desc.ref"
-
- private const val servicesDir = "META-INF/services"
- /**
- * Providers of custom Protobuf options introduced by the libraries.
- */
- private const val optionProviders = "$servicesDir/io.spine.option.OptionsProvider"
+/**
+ * The name of a descriptor set reference file.
+ */
+private const val DESC_REF = "desc.ref"
- /**
- * KSP symbol processor provider.
- */
- private const val kspSymbolProcessorProviders =
- "$servicesDir/com.google.devtools.ksp.KspSymbolProcessorProvider"
+/**
+ * Installs a first-copy-wins exclusion predicate for all JAR entries except those
+ * registered for merging, such as service files, descriptor set references, etc.
+ *
+ * Shadow's [org.gradle.api.file.DuplicatesStrategy.INCLUDE] must remain on the task so
+ * that every copy of a merged file reaches its
+ * [AppendingTransformer][com.github.jengelman.gradle.plugins.shadow.transformers.AppendingTransformer].
+ * All other entries — `.class` files, settings JSONs, Kotlin module descriptors,
+ * Maven metadata, etc. — are deduplicated here to suppress duplicate-entry warnings
+ * and keep the fat JAR size minimal.
+ */
+private fun ShadowJar.deduplicateEntries() {
+ val seenPaths = mutableSetOf()
+ doFirst { seenPaths.clear() }
+ eachFile {
+ val needsMerging = path.isServiceFile || path.isDescriptorSetReference
+ if (!needsMerging && !seenPaths.add(path)) {
+ exclude()
+ }
+ }
+}
- /**
- * Message routing setup classes generated by the Compiler for JVM.
- */
- private const val routeSetupPackage = "io.spine.server.route.setup"
- private const val routeSetupPrefix = "$servicesDir/$routeSetupPackage"
- private const val commandRoutingSetupClasses = "$routeSetupPrefix.CommandRoutingSetup"
- private const val eventRoutingSetupClasses = "$routeSetupPrefix.EventRoutingSetup"
- private const val stateRoutingSetupClasses = "$routeSetupPrefix.StateRoutingSetup"
+/**
+ * Returns `true` for file paths containing references to descriptor set files.
+ */
+private val String.isDescriptorSetReference: Boolean
+ get() = contains(DESC_REF)
- val all = arrayOf(
- descriptorSetReferences,
- optionProviders,
- kspSymbolProcessorProviders,
- commandRoutingSetupClasses,
- eventRoutingSetupClasses,
- stateRoutingSetupClasses
- )
-}
+/**
+ * Tells if the path belongs to a service file.
+ */
+private val String.isServiceFile: Boolean
+ get() = contains("META-INF/services")
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/SpinePublishing.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/SpinePublishing.kt
index 37fdf5f7db..a12c1d20ff 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/SpinePublishing.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/SpinePublishing.kt
@@ -28,6 +28,7 @@
package io.spine.gradle.publish
+import io.spine.dependency.local.Spine
import io.spine.gradle.repo.Repository
import java.util.Locale
import org.gradle.api.Project
@@ -148,10 +149,8 @@ import org.gradle.kotlin.dsl.findByType
*/
fun Project.spinePublishing(block: SpinePublishing.() -> Unit): SpinePublishing {
apply()
- val name = SpinePublishing::class.java.simpleName
- .replaceFirstChar { it.lowercase(Locale.getDefault()) }
val extension = with(extensions) {
- findByType() ?: create(name, project)
+ findByType() ?: create(SpinePublishing.extensionName, project)
}
extension.run {
block()
@@ -191,6 +190,12 @@ open class SpinePublishing(private val project: Project) {
* to a tool module's artifact ID.
*/
const val NONE_PREFIX = "NONE"
+
+ /**
+ * The name of the extension registered in a Gradle project.
+ */
+ public val extensionName: String = SpinePublishing::class.java.simpleName
+ .replaceFirstChar { it.lowercase(Locale.ROOT) }
}
private val testJar = TestJar()
@@ -345,13 +350,14 @@ open class SpinePublishing(private val project: Project) {
*
* @see modules
*/
- private fun projectsToPublish(): Collection {
+ fun projectsToPublish(): Set {
if (project.subprojects.isEmpty()) {
return setOf(project)
}
return modules.union(modulesWithCustomPublishing)
.map { name -> project.project(name) }
.ifEmpty { setOf(project) }
+ .toSet()
}
/**
@@ -415,22 +421,27 @@ open class SpinePublishing(private val project: Project) {
* @see toolArtifactPrefix
*/
fun artifactId(project: Project): String {
- if (project.isTool) {
+ val result = if (project.isTool) {
check(!toolArtifactPrefix.isEmpty()) {
"Artifact prefix cannot be empty for tool modules. " +
"Please set the `toolArtifactPrefix` property in `spinePublishing`. " +
"Use `\"NONE\"` to have an empty prefix for tool modules."
}
val prefix =
- if (toolArtifactPrefix == NONE_PREFIX) { "" }
- else { toolArtifactPrefix }
- return "$prefix${project.name}"
+ if (toolArtifactPrefix == NONE_PREFIX) {
+ ""
+ } else {
+ toolArtifactPrefix
+ }
+ "$prefix${project.name}"
+ } else {
+ "$artifactPrefix${project.name}"
}
- return "$artifactPrefix${project.name}"
+ return result
}
private val Project.isTool: Boolean
- get() = group == "io.spine.tools"
+ get() = group == Spine.toolsGroup
/**
* Ensures that all modules, marked as included into [testJar] publishing,
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/LicenseReporter.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/LicenseReporter.kt
index 5f18b9575f..14c280b7df 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/LicenseReporter.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/LicenseReporter.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -29,6 +29,7 @@ package io.spine.gradle.report.license
import com.github.jk1.license.LicenseReportExtension
import com.github.jk1.license.LicenseReportExtension.ALL
import com.github.jk1.license.LicenseReportPlugin
+import io.spine.dependency.local.Spine
import io.spine.gradle.applyPlugin
import io.spine.gradle.getTask
import java.io.File
@@ -42,7 +43,7 @@ import org.gradle.kotlin.dsl.the
*
* Transitive dependencies are included.
*
- * The output file is placed to the root folder of the root Gradle project.
+ * The output file is placed under `docs/dependencies` of the root Gradle project.
*
* Usage:
*
@@ -85,10 +86,10 @@ object LicenseReporter {
with(project.the()) {
outputDir = reportOutputDir.absolutePath
excludeGroups = arrayOf(
- "io.spine",
+ Spine.group,
"io.spine.gcloud",
"io.spine.protodata",
- "io.spine.tools",
+ Spine.toolsGroup,
"io.spine.validation"
)
configurations = ALL
@@ -145,7 +146,7 @@ object LicenseReporter {
/**
* Merges the license reports from all [sourceProjects] into a single file under
- * the [rootProject]'s root directory.
+ * the [rootProject]'s dependency report directory.
*/
private fun mergeReports(
sourceProjects: Iterable,
@@ -164,7 +165,8 @@ object LicenseReporter {
}
println("Merging the license reports from all projects.")
val mergedContent = paths.joinToString("\n\n\n") { (File(it)).readText() }
- val output = File("${rootProject.rootDir}/${Paths.outputFilename}")
+ val output = Paths.outputFile(rootProject.rootDir, Paths.outputFilename)
+ output.parentFile.mkdirs()
output.writeText(mergedContent)
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Paths.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Paths.kt
index 975a73b0e2..1d16327529 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Paths.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Paths.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,15 +26,23 @@
package io.spine.gradle.report.license
+import java.io.File
+
/**
- * Filesystem paths used by [LicenseReporter].
+ * Filesystem paths used by [LicenseReporter] and
+ * [PomGenerator][io.spine.gradle.report.pom.PomGenerator].
*/
internal object Paths {
+ /**
+ * The directory in the root project to which dependency reports are written.
+ */
+ internal const val outputDirectory = "docs/dependencies"
+
/**
* The output filename of the license report.
*
- * The file with this name is placed to the root folder of the root Gradle project —
+ * The file with this name is placed under [outputDirectory] of the root Gradle project —
* as the result of the [LicenseReporter] work.
*
* Its contents describe the licensing information for each of the Java dependencies
@@ -46,4 +54,10 @@ internal object Paths {
* The path to a directory, to which a per-project report is generated.
*/
internal const val relativePath = "reports/dependency-license/dependency"
+
+ /**
+ * Obtains a dependency report file under [outputDirectory] of the root project directory.
+ */
+ internal fun outputFile(rootDirectory: File, filename: String): File =
+ rootDirectory.resolve(outputDirectory).resolve(filename)
}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/PomGenerator.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/PomGenerator.kt
index 6e986e1364..7ffeda1896 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/PomGenerator.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/PomGenerator.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,6 +26,7 @@
package io.spine.gradle.report.pom
+import io.spine.gradle.report.license.Paths
import org.gradle.api.Project
import org.gradle.api.plugins.BasePlugin
@@ -41,7 +42,7 @@ import org.gradle.api.plugins.BasePlugin
* The generated `pom.xml` is not usable for Maven build tasks and is merely a
* description of project dependencies.
*
- * Configures the `build` task to generate the `pom.xml` file.
+ * Configures the `build` task to generate the `pom.xml` file under `docs/dependencies`.
*
* Note that the generated `pom.xml` includes the group ID, artifact ID and the version of the
* project this script was applied to. In case you want to override the default values, do so in
@@ -63,6 +64,8 @@ import org.gradle.api.plugins.BasePlugin
@Suppress("unused")
object PomGenerator {
+ private const val pomFilename = "pom.xml"
+
/**
* Configures the generator for the passed [project].
*/
@@ -81,8 +84,8 @@ object PomGenerator {
val task = project.tasks.register("generatePom") {
doLast {
- val pomFile = project.projectDir.resolve("pom.xml")
- project.delete(pomFile)
+ val pomFile = Paths.outputFile(project.rootDir, pomFilename)
+ pomFile.parentFile.mkdirs()
val projectData = project.metadata()
val writer = PomXmlWriter(projectData)
diff --git a/buildSrc/src/main/kotlin/jvm-module.gradle.kts b/buildSrc/src/main/kotlin/jvm-module.gradle.kts
index 11696c1aa6..a7b2cd44ae 100644
--- a/buildSrc/src/main/kotlin/jvm-module.gradle.kts
+++ b/buildSrc/src/main/kotlin/jvm-module.gradle.kts
@@ -30,6 +30,8 @@ import io.spine.dependency.build.Dokka
import io.spine.dependency.build.ErrorProne
import io.spine.dependency.build.JSpecify
import io.spine.dependency.lib.Guava
+import io.spine.dependency.lib.Jackson
+import io.spine.dependency.lib.Kotlin
import io.spine.dependency.lib.Protobuf
import io.spine.dependency.local.Reflect
import io.spine.dependency.test.Jacoco
@@ -130,7 +132,13 @@ fun Module.forceConfigurations() {
excludeProtobufLite()
all {
resolutionStrategy {
+ val cfg = this@all
+ val rs = this@resolutionStrategy
+ Jackson.forceArtifacts(project, cfg, rs)
+ Jackson.DataFormat.forceArtifacts(project, cfg, rs)
force(
+ Jackson.annotations,
+ Kotlin.bom,
Dokka.BasePlugin.lib,
Reflect.lib,
)
diff --git a/buildSrc/src/main/kotlin/kmp-module.gradle.kts b/buildSrc/src/main/kotlin/kmp-module.gradle.kts
index 4f7ec63982..9bc0fd34b3 100644
--- a/buildSrc/src/main/kotlin/kmp-module.gradle.kts
+++ b/buildSrc/src/main/kotlin/kmp-module.gradle.kts
@@ -25,6 +25,8 @@
*/
import io.spine.dependency.boms.BomsPlugin
+import io.spine.dependency.lib.Jackson
+import io.spine.dependency.lib.Kotlin
import io.spine.dependency.local.Reflect
import io.spine.dependency.local.TestLib
import io.spine.dependency.test.JUnit
@@ -82,7 +84,12 @@ fun Project.forceConfigurations() {
forceVersions()
all {
resolutionStrategy {
+ val cfg = this@all
+ val rs = this@resolutionStrategy
+ Jackson.forceArtifacts(project, cfg, rs)
+ Jackson.DataFormat.forceArtifacts(project, cfg, rs)
force(
+ Kotlin.bom,
Reflect.lib
)
}
@@ -123,7 +130,6 @@ kotlin {
implementation(kotlin("test-annotations-common"))
implementation(Kotest.assertions)
implementation(Kotest.frameworkEngine)
- implementation(Kotest.datatest)
}
}
val jvmTest by getting {
diff --git a/buildSrc/src/test/kotlin/io/spine/gradle/docs/UpdatePluginVersionTest.kt b/buildSrc/src/test/kotlin/io/spine/gradle/docs/UpdatePluginVersionTest.kt
index b34ca71fce..1674b3d34a 100644
--- a/buildSrc/src/test/kotlin/io/spine/gradle/docs/UpdatePluginVersionTest.kt
+++ b/buildSrc/src/test/kotlin/io/spine/gradle/docs/UpdatePluginVersionTest.kt
@@ -26,14 +26,15 @@
package io.spine.gradle.docs
-import io.kotest.matchers.shouldBe
import io.kotest.matchers.string.shouldContain
import java.io.File
import org.gradle.testfixtures.ProjectBuilder
import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.io.TempDir
+@DisplayName("`UpdatePluginVersion` should")
class UpdatePluginVersionTest {
@TempDir
diff --git a/buildSrc/src/test/kotlin/io/spine/gradle/publish/SpinePublishingTest.kt b/buildSrc/src/test/kotlin/io/spine/gradle/publish/SpinePublishingTest.kt
index 37f58e0403..52663c2e61 100644
--- a/buildSrc/src/test/kotlin/io/spine/gradle/publish/SpinePublishingTest.kt
+++ b/buildSrc/src/test/kotlin/io/spine/gradle/publish/SpinePublishingTest.kt
@@ -156,10 +156,9 @@ class SpinePublishingTest {
// Let's use it instead of creating a second one with a different name.
extension.modules = setOf("sub")
- // Subproject's extension must be named 'SpinePublishing'
- // to be found by SpinePublishing::class.java.simpleName
- val extensionName = SpinePublishing::class.java.simpleName
- val subExtension = subproject.extensions.create(extensionName, subproject)
+ val extensionName = SpinePublishing.extensionName
+ val subExtension =
+ subproject.extensions.create(extensionName, subproject)
val exception = shouldThrow {
subExtension.configured()
diff --git a/buildSrc/src/test/kotlin/io/spine/gradle/report/license/DependencyReportOutputTest.kt b/buildSrc/src/test/kotlin/io/spine/gradle/report/license/DependencyReportOutputTest.kt
new file mode 100644
index 0000000000..b17c66f069
--- /dev/null
+++ b/buildSrc/src/test/kotlin/io/spine/gradle/report/license/DependencyReportOutputTest.kt
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * 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
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.gradle.report.license
+
+import io.kotest.matchers.shouldBe
+import io.spine.gradle.report.pom.PomGenerator
+import java.io.File
+import org.gradle.api.Project
+import org.gradle.api.Task
+import org.gradle.api.plugins.BasePlugin
+import org.gradle.testfixtures.ProjectBuilder
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.DisplayName
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.io.TempDir
+
+@DisplayName("Dependency reports should")
+class DependencyReportOutputTest {
+
+ @TempDir
+ lateinit var projectDir: File
+
+ private lateinit var project: Project
+
+ @BeforeEach
+ fun setUp() {
+ project = ProjectBuilder.builder()
+ .withProjectDir(projectDir)
+ .build()
+ project.group = "io.spine"
+ project.version = "2.0.0"
+ }
+
+ @Test
+ fun `write the generated POM under docs-dependencies`() {
+ projectDir.resolve("pom.xml").writeText("legacy POM")
+
+ PomGenerator.applyTo(project)
+
+ project.tasks.named("generatePom").get()
+ .executeActions()
+
+ val pomFile = projectDir.resolve("docs/dependencies/pom.xml")
+ pomFile.exists() shouldBe true
+ }
+
+ @Test
+ fun `merge license reports under docs-dependencies`() {
+ projectDir.resolve("dependencies.md").writeText("legacy report")
+
+ project.pluginManager.apply(BasePlugin::class.java)
+ val subproject = subproject("sub")
+ LicenseReporter.generateReportIn(subproject)
+ val sourceReport = subproject.layout.buildDirectory.asFile.get()
+ .resolve(Paths.relativePath)
+ .resolve(Paths.outputFilename)
+ sourceReport.parentFile.mkdirs()
+ sourceReport.writeText("license report")
+
+ LicenseReporter.mergeAllReports(project)
+
+ project.tasks.named("mergeAllLicenseReports").get()
+ .executeActions()
+
+ val reportFile = projectDir.resolve("docs/dependencies/dependencies.md")
+ reportFile.readText() shouldBe "license report"
+ }
+
+ private fun subproject(name: String): Project {
+ val subprojectDir = projectDir.resolve(name)
+ subprojectDir.mkdirs()
+ return ProjectBuilder.builder()
+ .withName(name)
+ .withParent(project)
+ .withProjectDir(subprojectDir)
+ .build()
+ }
+
+ private fun Task.executeActions() {
+ actions.forEach {
+ it.execute(this)
+ }
+ }
+}
diff --git a/config b/config
index 3986ebdd1e..fbec334fc0 160000
--- a/config
+++ b/config
@@ -1 +1 @@
-Subproject commit 3986ebdd1ebece40e9433122ab9d46b4253fca03
+Subproject commit fbec334fc0caa4bfd7f39aab0267ee058494fafa
diff --git a/docs/dependencies/dependencies.md b/docs/dependencies/dependencies.md
new file mode 100644
index 0000000000..20f4e7dd16
--- /dev/null
+++ b/docs/dependencies/dependencies.md
@@ -0,0 +1,3361 @@
+
+
+# Dependencies of `io.spine:spine-annotations:2.0.0-SNAPSHOT.388`
+
+## Runtime
+1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
+ * **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-bom. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jspecify. **Name** : jspecify. **Version** : 1.0.0.
+ * **Project URL:** [http://jspecify.org/](http://jspecify.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+## Compile, tests, and tooling
+1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson-bom](https://github.com/FasterXML/jackson-bom)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-annotations. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-xml. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson-dataformat-xml](https://github.com/FasterXML/jackson-dataformat-xml)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.woodstox. **Name** : woodstox-core. **Version** : 6.5.1.
+ * **Project URL:** [https://github.com/FasterXML/woodstox](https://github.com/FasterXML/woodstox)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 3.0.5.
+ * **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.github.kevinstern. **Name** : software-and-algorithms. **Version** : 1.0.
+ * **Project URL:** [https://www.github.com/KevinStern/software-and-algorithms](https://www.github.com/KevinStern/software-and-algorithms)
+ * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
+
+1. **Group** : com.github.oowekyala.ooxml. **Name** : nice-xml-messages. **Version** : 3.1.
+ * **Project URL:** [https://github.com/oowekyala/nice-xml-messages](https://github.com/oowekyala/nice-xml-messages)
+ * **License:** [MIT License](https://github.com/oowekyala/nice-xml-messages/tree/master/LICENSE)
+
+1. **Group** : com.google.auto. **Name** : auto-common. **Version** : 1.2.2.
+ * **Project URL:** [https://github.com/google/auto/tree/main/common](https://github.com/google/auto/tree/main/common)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.auto.service. **Name** : auto-service-annotations. **Version** : 1.1.1.
+ * **Project URL:** [https://github.com/google/auto/tree/main/service](https://github.com/google/auto/tree/main/service)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.auto.value. **Name** : auto-value-annotations. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/google/auto/tree/main/value](https://github.com/google/auto/tree/main/value)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
+ * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.13.0.
+ * **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_annotation](https://errorprone.info/error_prone_annotation)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_check_api](https://errorprone.info/error_prone_check_api)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_core](https://errorprone.info/error_prone_core)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_type_annotations](https://errorprone.info/error_prone_type_annotations)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : javac. **Version** : 9+181-r4173-1.
+ * **Project URL:** [https://github.com/google/error-prone-javac](https://github.com/google/error-prone-javac)
+ * **License:** [GNU General Public License, version 2, with the Classpath Exception](http://openjdk.java.net/legal/gplv2+ce.html)
+
+1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
+ * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
+ * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.flogger. **Name** : flogger-system-backend. **Version** : 0.7.4.
+ * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
+ * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.googlejavaformat. **Name** : google-java-format. **Version** : 1.19.1.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
+ * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava. **Version** : 33.5.0-jre.
+ * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 33.5.0-jre.
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 2.8.
+ * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.puppycrawl.tools. **Name** : checkstyle. **Version** : 10.12.1.
+ * **Project URL:** [https://checkstyle.org/](https://checkstyle.org/)
+ * **License:** [LGPL-2.1+](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt)
+
+1. **Group** : com.soywiz.korlibs.korte. **Name** : korte-jvm. **Version** : 4.0.10.
+ * **Project URL:** [https://github.com/korlibs/korge-next](https://github.com/korlibs/korge-next)
+ * **License:** [MIT](https://raw.githubusercontent.com/korlibs/korge-next/master/korge/LICENSE.txt)
+
+1. **Group** : commons-beanutils. **Name** : commons-beanutils. **Version** : 1.9.4.
+ * **Project URL:** [https://commons.apache.org/proper/commons-beanutils/](https://commons.apache.org/proper/commons-beanutils/)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : commons-codec. **Name** : commons-codec. **Version** : 1.16.0.
+ * **Project URL:** [https://commons.apache.org/proper/commons-codec/](https://commons.apache.org/proper/commons-codec/)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : commons-collections. **Name** : commons-collections. **Version** : 3.2.2.
+ * **Project URL:** [http://commons.apache.org/collections/](http://commons.apache.org/collections/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : dev.drewhamilton.poko. **Name** : poko-annotations. **Version** : 0.17.1.
+ * **Project URL:** [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : dev.drewhamilton.poko. **Name** : poko-annotations-jvm. **Version** : 0.17.1.
+ * **Project URL:** [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : info.picocli. **Name** : picocli. **Version** : 4.7.4.
+ * **Project URL:** [https://picocli.info](https://picocli.info)
+ * **License:** [The Apache Software License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.davidburstrom.contester. **Name** : contester-breakpoint. **Version** : 0.2.0.
+ * **Project URL:** [https://github.com/davidburstrom/contester](https://github.com/davidburstrom/contester)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k. **Version** : 0.6.0.
+ * **Project URL:** [https://detekt.github.io/detekt](https://detekt.github.io/detekt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k-jvm. **Version** : 0.6.0.
+ * **Project URL:** [https://detekt.github.io/detekt](https://detekt.github.io/detekt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.eisop. **Name** : dataflow-errorprone. **Version** : 3.41.0-eisop1.
+ * **Project URL:** [https://eisop.github.io/](https://eisop.github.io/)
+ * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
+
+1. **Group** : io.github.java-diff-utils. **Name** : java-diff-utils. **Version** : 4.12.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-api. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-cli. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-core. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-metrics. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-parser. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-psi-utils. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-html. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-md. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-sarif. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-txt. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-xml. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-complexity. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-coroutines. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-documentation. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-empty. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-errorprone. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-exceptions. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-naming. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-performance. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-style. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-tooling. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-utils. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : javax.inject. **Name** : javax.inject. **Version** : 1.
+ * **Project URL:** [http://code.google.com/p/atinject/](http://code.google.com/p/atinject/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : junit. **Name** : junit. **Version** : 4.13.2.
+ * **Project URL:** [http://junit.org](http://junit.org)
+ * **License:** [Eclipse Public License 1.0](http://www.eclipse.org/legal/epl-v10.html)
+
+1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 12.2.
+ * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
+ * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
+
+1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 12.5.
+ * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
+ * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-ant. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-core. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-java. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
+
+1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.11.1.
+ * **Project URL:** [https://www.antlr.org/](https://www.antlr.org/)
+ * **License:** [BSD-3-Clause](https://www.antlr.org/license.html)
+
+1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.9.3.
+ * **Project URL:** [http://www.antlr.org](http://www.antlr.org)
+ * **License:** [The BSD License](http://www.antlr.org/license.html)
+
+1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.17.0.
+ * **Project URL:** [https://commons.apache.org/proper/commons-lang/](https://commons.apache.org/proper/commons-lang/)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.httpcomponents.client5. **Name** : httpclient5. **Version** : 5.1.3.
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.httpcomponents.core5. **Name** : httpcore5. **Version** : 5.1.3.
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.httpcomponents.core5. **Name** : httpcore5-h2. **Version** : 5.1.3.
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2.
+ * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.3.
+ * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
+ * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
+ * **License:** [The MIT License](http://opensource.org/licenses/MIT)
+
+1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.40.0.
+ * **Project URL:** [https://checkerframework.org/](https://checkerframework.org/)
+ * **License:** [The MIT License](http://opensource.org/licenses/MIT)
+
+1. **Group** : org.codehaus.woodstox. **Name** : stax2-api. **Version** : 4.2.1.
+ * **Project URL:** [https://github.com/FasterXML/stax2-api](https://github.com/FasterXML/stax2-api)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The BSD License](http://www.opensource.org/licenses/bsd-license.php)
+
+1. **Group** : org.freemarker. **Name** : freemarker. **Version** : 2.3.32.
+ * **Project URL:** [https://freemarker.apache.org/](https://freemarker.apache.org/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.hamcrest. **Name** : hamcrest. **Version** : 3.0.
+ * **Project URL:** [http://hamcrest.org/JavaHamcrest/](http://hamcrest.org/JavaHamcrest/)
+ * **License:** [BSD-3-Clause](https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE)
+
+1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 3.0.
+ * **Project URL:** [http://hamcrest.org/JavaHamcrest/](http://hamcrest.org/JavaHamcrest/)
+ * **License:** [BSD-3-Clause](https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE)
+
+1. **Group** : org.jacoco. **Name** : org.jacoco.agent. **Version** : 0.8.13.
+ * **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
+
+1. **Group** : org.jacoco. **Name** : org.jacoco.core. **Version** : 0.8.13.
+ * **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
+
+1. **Group** : org.jacoco. **Name** : org.jacoco.report. **Version** : 0.8.13.
+ * **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
+
+1. **Group** : org.javassist. **Name** : javassist. **Version** : 3.28.0-GA.
+ * **Project URL:** [http://www.javassist.org/](http://www.javassist.org/)
+ * **License:** [Apache License 2.0](http://www.apache.org/licenses/)
+ * **License:** [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html)
+ * **License:** [MPL 1.1](http://www.mozilla.org/MPL/MPL-1.1.html)
+
+1. **Group** : org.jcommander. **Name** : jcommander. **Version** : 1.85.
+ * **Project URL:** [https://jcommander.org](https://jcommander.org)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
+ * **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : markdown. **Version** : 0.7.3.
+ * **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : markdown-jvm. **Version** : 0.7.3.
+ * **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-kotlin-symbols. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-markdown. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : javadoc-plugin. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : templating-plugin. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.intellij.deps. **Name** : trove4j. **Version** : 1.0.20200330.
+ * **Project URL:** [https://github.com/JetBrains/intellij-deps-trove4j](https://github.com/JetBrains/intellij-deps-trove4j)
+ * **License:** [GNU LESSER GENERAL PUBLIC LICENSE 2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : abi-tools. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : abi-tools-api. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-bom. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-api. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-compat. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-cri-impl. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-impl. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-runner. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-client. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-abi-reader. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-metadata-jvm. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-tooling-core. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu. **Version** : 0.29.0.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu-jvm. **Version** : 0.29.0.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.6.4.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-test. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-test-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.8.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.9.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-core. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-core-jvm. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-json. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-json-jvm. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jsoup. **Name** : jsoup. **Version** : 1.16.1.
+ * **Project URL:** [https://jsoup.org/](https://jsoup.org/)
+ * **License:** [The MIT License](https://jsoup.org/license)
+
+1. **Group** : org.jspecify. **Name** : jspecify. **Version** : 1.0.0.
+ * **Project URL:** [http://jspecify.org/](http://jspecify.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.junit. **Name** : junit-bom. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit-pioneer. **Name** : junit-pioneer. **Version** : 2.3.0.
+ * **Project URL:** [https://junit-pioneer.org/](https://junit-pioneer.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-engine. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.platform. **Name** : junit-platform-engine. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.platform. **Name** : junit-platform-launcher. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.opentest4j. **Name** : opentest4j. **Version** : 1.3.0.
+ * **Project URL:** [https://github.com/ota4j-team/opentest4j](https://github.com/ota4j-team/opentest4j)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.6.
+ * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
+ * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.ow2.asm. **Name** : asm-commons. **Version** : 9.6.
+ * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
+ * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.ow2.asm. **Name** : asm-tree. **Version** : 9.6.
+ * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
+ * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 4.0.1.
+ * **Project URL:** [https://github.com/hrldcpr/pcollections](https://github.com/hrldcpr/pcollections)
+ * **License:** [The MIT License](https://opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 4.0.2.
+ * **Project URL:** [https://github.com/hrldcpr/pcollections](https://github.com/hrldcpr/pcollections)
+ * **License:** [The MIT License](https://opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.reflections. **Name** : reflections. **Version** : 0.10.2.
+ * **Project URL:** [https://github.com/ronmamo/reflections](https://github.com/ronmamo/reflections)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [WTFPL](http://www.wtfpl.net/)
+
+1. **Group** : org.slf4j. **Name** : jul-to-slf4j. **Version** : 1.7.36.
+ * **Project URL:** [http://www.slf4j.org](http://www.slf4j.org)
+ * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.snakeyaml. **Name** : snakeyaml-engine. **Version** : 2.7.
+ * **Project URL:** [https://bitbucket.org/snakeyaml/snakeyaml-engine](https://bitbucket.org/snakeyaml/snakeyaml-engine)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.xmlresolver. **Name** : xmlresolver. **Version** : 5.1.2.
+ * **Project URL:** [https://github.com/xmlresolver/xmlresolver](https://github.com/xmlresolver/xmlresolver)
+ * **License:** [Apache License version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : org.xmlresolver. **Name** : xmlresolver. **Version** : 5.2.2.
+ * **Project URL:** [https://github.com/xmlresolver/xmlresolver](https://github.com/xmlresolver/xmlresolver)
+ * **License:** [Apache License version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+
+The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
+
+This report was generated on **Fri May 15 21:01:29 WEST 2026** using
+[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
+[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
+
+
+
+
+# Dependencies of `io.spine:spine-base:2.0.0-SNAPSHOT.388`
+
+## Runtime
+1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
+ * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.13.0.
+ * **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
+ * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava. **Version** : 33.5.0-jre.
+ * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 2.8.
+ * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
+ * **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-bom. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jspecify. **Name** : jspecify. **Version** : 1.0.0.
+ * **Project URL:** [http://jspecify.org/](http://jspecify.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+## Compile, tests, and tooling
+1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson-bom](https://github.com/FasterXML/jackson-bom)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-bom](https://github.com/FasterXML/jackson-bom)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-annotations. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-xml. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson-dataformat-xml](https://github.com/FasterXML/jackson-dataformat-xml)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.woodstox. **Name** : woodstox-core. **Version** : 6.5.1.
+ * **Project URL:** [https://github.com/FasterXML/woodstox](https://github.com/FasterXML/woodstox)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 3.0.5.
+ * **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.github.kevinstern. **Name** : software-and-algorithms. **Version** : 1.0.
+ * **Project URL:** [https://www.github.com/KevinStern/software-and-algorithms](https://www.github.com/KevinStern/software-and-algorithms)
+ * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
+
+1. **Group** : com.github.oowekyala.ooxml. **Name** : nice-xml-messages. **Version** : 3.1.
+ * **Project URL:** [https://github.com/oowekyala/nice-xml-messages](https://github.com/oowekyala/nice-xml-messages)
+ * **License:** [MIT License](https://github.com/oowekyala/nice-xml-messages/tree/master/LICENSE)
+
+1. **Group** : com.google.auto. **Name** : auto-common. **Version** : 1.2.2.
+ * **Project URL:** [https://github.com/google/auto/tree/main/common](https://github.com/google/auto/tree/main/common)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.auto.service. **Name** : auto-service-annotations. **Version** : 1.1.1.
+ * **Project URL:** [https://github.com/google/auto/tree/main/service](https://github.com/google/auto/tree/main/service)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.auto.value. **Name** : auto-value-annotations. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/google/auto/tree/main/value](https://github.com/google/auto/tree/main/value)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
+ * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.13.0.
+ * **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.devtools.ksp. **Name** : symbol-processing. **Version** : 2.3.6.
+ * **Project URL:** [https://goo.gle/ksp](https://goo.gle/ksp)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.devtools.ksp. **Name** : symbol-processing-api. **Version** : 2.3.6.
+ * **Project URL:** [https://goo.gle/ksp](https://goo.gle/ksp)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_annotation](https://errorprone.info/error_prone_annotation)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_check_api](https://errorprone.info/error_prone_check_api)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_core](https://errorprone.info/error_prone_core)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_type_annotations](https://errorprone.info/error_prone_type_annotations)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : javac. **Version** : 9+181-r4173-1.
+ * **Project URL:** [https://github.com/google/error-prone-javac](https://github.com/google/error-prone-javac)
+ * **License:** [GNU General Public License, version 2, with the Classpath Exception](http://openjdk.java.net/legal/gplv2+ce.html)
+
+1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
+ * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
+ * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.flogger. **Name** : flogger-system-backend. **Version** : 0.7.4.
+ * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
+ * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.googlejavaformat. **Name** : google-java-format. **Version** : 1.19.1.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
+ * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava. **Version** : 33.5.0-jre.
+ * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 33.5.0-jre.
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 2.8.
+ * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protoc. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.puppycrawl.tools. **Name** : checkstyle. **Version** : 10.12.1.
+ * **Project URL:** [https://checkstyle.org/](https://checkstyle.org/)
+ * **License:** [LGPL-2.1+](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt)
+
+1. **Group** : com.soywiz.korlibs.korte. **Name** : korte-jvm. **Version** : 4.0.10.
+ * **Project URL:** [https://github.com/korlibs/korge-next](https://github.com/korlibs/korge-next)
+ * **License:** [MIT](https://raw.githubusercontent.com/korlibs/korge-next/master/korge/LICENSE.txt)
+
+1. **Group** : com.squareup. **Name** : kotlinpoet. **Version** : 1.17.0.
+ * **Project URL:** [https://github.com/square/kotlinpoet](https://github.com/square/kotlinpoet)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.squareup. **Name** : kotlinpoet-jvm. **Version** : 1.17.0.
+ * **Project URL:** [https://github.com/square/kotlinpoet](https://github.com/square/kotlinpoet)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : commons-beanutils. **Name** : commons-beanutils. **Version** : 1.9.4.
+ * **Project URL:** [https://commons.apache.org/proper/commons-beanutils/](https://commons.apache.org/proper/commons-beanutils/)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : commons-codec. **Name** : commons-codec. **Version** : 1.16.0.
+ * **Project URL:** [https://commons.apache.org/proper/commons-codec/](https://commons.apache.org/proper/commons-codec/)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : commons-collections. **Name** : commons-collections. **Version** : 3.2.2.
+ * **Project URL:** [http://commons.apache.org/collections/](http://commons.apache.org/collections/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : dev.drewhamilton.poko. **Name** : poko-annotations. **Version** : 0.17.1.
+ * **Project URL:** [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : dev.drewhamilton.poko. **Name** : poko-annotations-jvm. **Version** : 0.17.1.
+ * **Project URL:** [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : dev.zacsweers.autoservice. **Name** : auto-service-ksp. **Version** : 1.2.0.
+ * **Project URL:** [https://github.com/ZacSweers/auto-service-ksp](https://github.com/ZacSweers/auto-service-ksp)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : info.picocli. **Name** : picocli. **Version** : 4.7.4.
+ * **Project URL:** [https://picocli.info](https://picocli.info)
+ * **License:** [The Apache Software License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.davidburstrom.contester. **Name** : contester-breakpoint. **Version** : 0.2.0.
+ * **Project URL:** [https://github.com/davidburstrom/contester](https://github.com/davidburstrom/contester)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k. **Version** : 0.6.0.
+ * **Project URL:** [https://detekt.github.io/detekt](https://detekt.github.io/detekt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k-jvm. **Version** : 0.6.0.
+ * **Project URL:** [https://detekt.github.io/detekt](https://detekt.github.io/detekt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.eisop. **Name** : dataflow-errorprone. **Version** : 3.41.0-eisop1.
+ * **Project URL:** [https://eisop.github.io/](https://eisop.github.io/)
+ * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
+
+1. **Group** : io.github.java-diff-utils. **Name** : java-diff-utils. **Version** : 4.12.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-api. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-cli. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-core. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-metrics. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-parser. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-psi-utils. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-html. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-md. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-sarif. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-txt. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-xml. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-complexity. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-coroutines. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-documentation. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-empty. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-errorprone. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-exceptions. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-naming. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-performance. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-style. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-tooling. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-utils. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : javax.inject. **Name** : javax.inject. **Version** : 1.
+ * **Project URL:** [http://code.google.com/p/atinject/](http://code.google.com/p/atinject/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : junit. **Name** : junit. **Version** : 4.13.2.
+ * **Project URL:** [http://junit.org](http://junit.org)
+ * **License:** [Eclipse Public License 1.0](http://www.eclipse.org/legal/epl-v10.html)
+
+1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 12.2.
+ * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
+ * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
+
+1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 12.5.
+ * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
+ * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-ant. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-core. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-java. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
+
+1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.11.1.
+ * **Project URL:** [https://www.antlr.org/](https://www.antlr.org/)
+ * **License:** [BSD-3-Clause](https://www.antlr.org/license.html)
+
+1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.9.3.
+ * **Project URL:** [http://www.antlr.org](http://www.antlr.org)
+ * **License:** [The BSD License](http://www.antlr.org/license.html)
+
+1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.17.0.
+ * **Project URL:** [https://commons.apache.org/proper/commons-lang/](https://commons.apache.org/proper/commons-lang/)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.httpcomponents.client5. **Name** : httpclient5. **Version** : 5.1.3.
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.httpcomponents.core5. **Name** : httpcore5. **Version** : 5.1.3.
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.httpcomponents.core5. **Name** : httpcore5-h2. **Version** : 5.1.3.
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.logging.log4j. **Name** : log4j-api. **Version** : 2.20.0.
+ * **Project URL:** [https://www.apache.org/](https://www.apache.org/)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.logging.log4j. **Name** : log4j-core. **Version** : 2.20.0.
+ * **Project URL:** [https://www.apache.org/](https://www.apache.org/)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2.
+ * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.3.
+ * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
+ * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
+ * **License:** [The MIT License](http://opensource.org/licenses/MIT)
+
+1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.40.0.
+ * **Project URL:** [https://checkerframework.org/](https://checkerframework.org/)
+ * **License:** [The MIT License](http://opensource.org/licenses/MIT)
+
+1. **Group** : org.codehaus.woodstox. **Name** : stax2-api. **Version** : 4.2.1.
+ * **Project URL:** [https://github.com/FasterXML/stax2-api](https://github.com/FasterXML/stax2-api)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The BSD License](http://www.opensource.org/licenses/bsd-license.php)
+
+1. **Group** : org.freemarker. **Name** : freemarker. **Version** : 2.3.32.
+ * **Project URL:** [https://freemarker.apache.org/](https://freemarker.apache.org/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.hamcrest. **Name** : hamcrest. **Version** : 3.0.
+ * **Project URL:** [http://hamcrest.org/JavaHamcrest/](http://hamcrest.org/JavaHamcrest/)
+ * **License:** [BSD-3-Clause](https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE)
+
+1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 3.0.
+ * **Project URL:** [http://hamcrest.org/JavaHamcrest/](http://hamcrest.org/JavaHamcrest/)
+ * **License:** [BSD-3-Clause](https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE)
+
+1. **Group** : org.jacoco. **Name** : org.jacoco.agent. **Version** : 0.8.13.
+ * **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
+
+1. **Group** : org.jacoco. **Name** : org.jacoco.core. **Version** : 0.8.13.
+ * **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
+
+1. **Group** : org.jacoco. **Name** : org.jacoco.report. **Version** : 0.8.13.
+ * **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
+
+1. **Group** : org.javassist. **Name** : javassist. **Version** : 3.28.0-GA.
+ * **Project URL:** [http://www.javassist.org/](http://www.javassist.org/)
+ * **License:** [Apache License 2.0](http://www.apache.org/licenses/)
+ * **License:** [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html)
+ * **License:** [MPL 1.1](http://www.mozilla.org/MPL/MPL-1.1.html)
+
+1. **Group** : org.jcommander. **Name** : jcommander. **Version** : 1.85.
+ * **Project URL:** [https://jcommander.org](https://jcommander.org)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
+ * **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : markdown. **Version** : 0.7.3.
+ * **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : markdown-jvm. **Version** : 0.7.3.
+ * **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-kotlin-symbols. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-markdown. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : javadoc-plugin. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : templating-plugin. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.intellij.deps. **Name** : trove4j. **Version** : 1.0.20200330.
+ * **Project URL:** [https://github.com/JetBrains/intellij-deps-trove4j](https://github.com/JetBrains/intellij-deps-trove4j)
+ * **License:** [GNU LESSER GENERAL PUBLIC LICENSE 2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : abi-tools. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : abi-tools-api. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-bom. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-api. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-compat. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-cri-impl. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-impl. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-runner. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-client. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-abi-reader. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-metadata-jvm. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-tooling-core. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu. **Version** : 0.29.0.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu-jvm. **Version** : 0.29.0.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.6.4.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-test. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-test-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.8.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.9.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-core. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-core-jvm. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-json. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-json-jvm. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jsoup. **Name** : jsoup. **Version** : 1.16.1.
+ * **Project URL:** [https://jsoup.org/](https://jsoup.org/)
+ * **License:** [The MIT License](https://jsoup.org/license)
+
+1. **Group** : org.jspecify. **Name** : jspecify. **Version** : 1.0.0.
+ * **Project URL:** [http://jspecify.org/](http://jspecify.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.junit. **Name** : junit-bom. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit-pioneer. **Name** : junit-pioneer. **Version** : 2.3.0.
+ * **Project URL:** [https://junit-pioneer.org/](https://junit-pioneer.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-engine. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.platform. **Name** : junit-platform-engine. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.platform. **Name** : junit-platform-launcher. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.opentest4j. **Name** : opentest4j. **Version** : 1.3.0.
+ * **Project URL:** [https://github.com/ota4j-team/opentest4j](https://github.com/ota4j-team/opentest4j)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.6.
+ * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
+ * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.ow2.asm. **Name** : asm-commons. **Version** : 9.6.
+ * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
+ * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.ow2.asm. **Name** : asm-tree. **Version** : 9.6.
+ * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
+ * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 4.0.1.
+ * **Project URL:** [https://github.com/hrldcpr/pcollections](https://github.com/hrldcpr/pcollections)
+ * **License:** [The MIT License](https://opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 4.0.2.
+ * **Project URL:** [https://github.com/hrldcpr/pcollections](https://github.com/hrldcpr/pcollections)
+ * **License:** [The MIT License](https://opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.reflections. **Name** : reflections. **Version** : 0.10.2.
+ * **Project URL:** [https://github.com/ronmamo/reflections](https://github.com/ronmamo/reflections)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [WTFPL](http://www.wtfpl.net/)
+
+1. **Group** : org.slf4j. **Name** : jul-to-slf4j. **Version** : 1.7.36.
+ * **Project URL:** [http://www.slf4j.org](http://www.slf4j.org)
+ * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.snakeyaml. **Name** : snakeyaml-engine. **Version** : 2.7.
+ * **Project URL:** [https://bitbucket.org/snakeyaml/snakeyaml-engine](https://bitbucket.org/snakeyaml/snakeyaml-engine)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.xmlresolver. **Name** : xmlresolver. **Version** : 5.1.2.
+ * **Project URL:** [https://github.com/xmlresolver/xmlresolver](https://github.com/xmlresolver/xmlresolver)
+ * **License:** [Apache License version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : org.xmlresolver. **Name** : xmlresolver. **Version** : 5.2.2.
+ * **Project URL:** [https://github.com/xmlresolver/xmlresolver](https://github.com/xmlresolver/xmlresolver)
+ * **License:** [Apache License version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+
+The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
+
+This report was generated on **Fri May 15 21:01:29 WEST 2026** using
+[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
+[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
+
+
+
+
+# Dependencies of `io.spine:spine-environment:2.0.0-SNAPSHOT.388`
+
+## Runtime
+1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
+ * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.13.0.
+ * **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
+ * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava. **Version** : 33.5.0-jre.
+ * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 2.8.
+ * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
+ * **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-bom. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu. **Version** : 0.29.0.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu-jvm. **Version** : 0.29.0.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jspecify. **Name** : jspecify. **Version** : 1.0.0.
+ * **Project URL:** [http://jspecify.org/](http://jspecify.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+## Compile, tests, and tooling
+1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson-bom](https://github.com/FasterXML/jackson-bom)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-annotations. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-xml. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson-dataformat-xml](https://github.com/FasterXML/jackson-dataformat-xml)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.woodstox. **Name** : woodstox-core. **Version** : 6.5.1.
+ * **Project URL:** [https://github.com/FasterXML/woodstox](https://github.com/FasterXML/woodstox)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 3.0.5.
+ * **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.github.kevinstern. **Name** : software-and-algorithms. **Version** : 1.0.
+ * **Project URL:** [https://www.github.com/KevinStern/software-and-algorithms](https://www.github.com/KevinStern/software-and-algorithms)
+ * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
+
+1. **Group** : com.github.oowekyala.ooxml. **Name** : nice-xml-messages. **Version** : 3.1.
+ * **Project URL:** [https://github.com/oowekyala/nice-xml-messages](https://github.com/oowekyala/nice-xml-messages)
+ * **License:** [MIT License](https://github.com/oowekyala/nice-xml-messages/tree/master/LICENSE)
+
+1. **Group** : com.google.auto. **Name** : auto-common. **Version** : 1.2.2.
+ * **Project URL:** [https://github.com/google/auto/tree/main/common](https://github.com/google/auto/tree/main/common)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.auto.service. **Name** : auto-service-annotations. **Version** : 1.1.1.
+ * **Project URL:** [https://github.com/google/auto/tree/main/service](https://github.com/google/auto/tree/main/service)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.auto.value. **Name** : auto-value-annotations. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/google/auto/tree/main/value](https://github.com/google/auto/tree/main/value)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
+ * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.13.0.
+ * **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_annotation](https://errorprone.info/error_prone_annotation)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_check_api](https://errorprone.info/error_prone_check_api)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_core](https://errorprone.info/error_prone_core)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_type_annotations](https://errorprone.info/error_prone_type_annotations)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : javac. **Version** : 9+181-r4173-1.
+ * **Project URL:** [https://github.com/google/error-prone-javac](https://github.com/google/error-prone-javac)
+ * **License:** [GNU General Public License, version 2, with the Classpath Exception](http://openjdk.java.net/legal/gplv2+ce.html)
+
+1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
+ * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
+ * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.flogger. **Name** : flogger-system-backend. **Version** : 0.7.4.
+ * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
+ * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.googlejavaformat. **Name** : google-java-format. **Version** : 1.19.1.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
+ * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava. **Version** : 33.5.0-jre.
+ * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 33.5.0-jre.
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 2.8.
+ * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.puppycrawl.tools. **Name** : checkstyle. **Version** : 10.12.1.
+ * **Project URL:** [https://checkstyle.org/](https://checkstyle.org/)
+ * **License:** [LGPL-2.1+](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt)
+
+1. **Group** : com.soywiz.korlibs.korte. **Name** : korte-jvm. **Version** : 4.0.10.
+ * **Project URL:** [https://github.com/korlibs/korge-next](https://github.com/korlibs/korge-next)
+ * **License:** [MIT](https://raw.githubusercontent.com/korlibs/korge-next/master/korge/LICENSE.txt)
+
+1. **Group** : commons-beanutils. **Name** : commons-beanutils. **Version** : 1.9.4.
+ * **Project URL:** [https://commons.apache.org/proper/commons-beanutils/](https://commons.apache.org/proper/commons-beanutils/)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : commons-codec. **Name** : commons-codec. **Version** : 1.16.0.
+ * **Project URL:** [https://commons.apache.org/proper/commons-codec/](https://commons.apache.org/proper/commons-codec/)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : commons-collections. **Name** : commons-collections. **Version** : 3.2.2.
+ * **Project URL:** [http://commons.apache.org/collections/](http://commons.apache.org/collections/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : dev.drewhamilton.poko. **Name** : poko-annotations. **Version** : 0.17.1.
+ * **Project URL:** [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : dev.drewhamilton.poko. **Name** : poko-annotations-jvm. **Version** : 0.17.1.
+ * **Project URL:** [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : info.picocli. **Name** : picocli. **Version** : 4.7.4.
+ * **Project URL:** [https://picocli.info](https://picocli.info)
+ * **License:** [The Apache Software License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.davidburstrom.contester. **Name** : contester-breakpoint. **Version** : 0.2.0.
+ * **Project URL:** [https://github.com/davidburstrom/contester](https://github.com/davidburstrom/contester)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k. **Version** : 0.6.0.
+ * **Project URL:** [https://detekt.github.io/detekt](https://detekt.github.io/detekt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k-jvm. **Version** : 0.6.0.
+ * **Project URL:** [https://detekt.github.io/detekt](https://detekt.github.io/detekt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.eisop. **Name** : dataflow-errorprone. **Version** : 3.41.0-eisop1.
+ * **Project URL:** [https://eisop.github.io/](https://eisop.github.io/)
+ * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
+
+1. **Group** : io.github.java-diff-utils. **Name** : java-diff-utils. **Version** : 4.12.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-api. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-cli. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-core. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-metrics. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-parser. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-psi-utils. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-html. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-md. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-sarif. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-txt. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-xml. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-complexity. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-coroutines. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-documentation. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-empty. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-errorprone. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-exceptions. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-naming. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-performance. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-style. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-tooling. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-utils. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : javax.inject. **Name** : javax.inject. **Version** : 1.
+ * **Project URL:** [http://code.google.com/p/atinject/](http://code.google.com/p/atinject/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : junit. **Name** : junit. **Version** : 4.13.2.
+ * **Project URL:** [http://junit.org](http://junit.org)
+ * **License:** [Eclipse Public License 1.0](http://www.eclipse.org/legal/epl-v10.html)
+
+1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 12.2.
+ * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
+ * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
+
+1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 12.5.
+ * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
+ * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-ant. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-core. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-java. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
+
+1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.11.1.
+ * **Project URL:** [https://www.antlr.org/](https://www.antlr.org/)
+ * **License:** [BSD-3-Clause](https://www.antlr.org/license.html)
+
+1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.9.3.
+ * **Project URL:** [http://www.antlr.org](http://www.antlr.org)
+ * **License:** [The BSD License](http://www.antlr.org/license.html)
+
+1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.17.0.
+ * **Project URL:** [https://commons.apache.org/proper/commons-lang/](https://commons.apache.org/proper/commons-lang/)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.httpcomponents.client5. **Name** : httpclient5. **Version** : 5.1.3.
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.httpcomponents.core5. **Name** : httpcore5. **Version** : 5.1.3.
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.httpcomponents.core5. **Name** : httpcore5-h2. **Version** : 5.1.3.
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2.
+ * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.3.
+ * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
+ * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
+ * **License:** [The MIT License](http://opensource.org/licenses/MIT)
+
+1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.40.0.
+ * **Project URL:** [https://checkerframework.org/](https://checkerframework.org/)
+ * **License:** [The MIT License](http://opensource.org/licenses/MIT)
+
+1. **Group** : org.codehaus.woodstox. **Name** : stax2-api. **Version** : 4.2.1.
+ * **Project URL:** [https://github.com/FasterXML/stax2-api](https://github.com/FasterXML/stax2-api)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The BSD License](http://www.opensource.org/licenses/bsd-license.php)
+
+1. **Group** : org.freemarker. **Name** : freemarker. **Version** : 2.3.32.
+ * **Project URL:** [https://freemarker.apache.org/](https://freemarker.apache.org/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.hamcrest. **Name** : hamcrest. **Version** : 3.0.
+ * **Project URL:** [http://hamcrest.org/JavaHamcrest/](http://hamcrest.org/JavaHamcrest/)
+ * **License:** [BSD-3-Clause](https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE)
+
+1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 3.0.
+ * **Project URL:** [http://hamcrest.org/JavaHamcrest/](http://hamcrest.org/JavaHamcrest/)
+ * **License:** [BSD-3-Clause](https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE)
+
+1. **Group** : org.jacoco. **Name** : org.jacoco.agent. **Version** : 0.8.13.
+ * **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
+
+1. **Group** : org.jacoco. **Name** : org.jacoco.core. **Version** : 0.8.13.
+ * **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
+
+1. **Group** : org.jacoco. **Name** : org.jacoco.report. **Version** : 0.8.13.
+ * **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
+
+1. **Group** : org.javassist. **Name** : javassist. **Version** : 3.28.0-GA.
+ * **Project URL:** [http://www.javassist.org/](http://www.javassist.org/)
+ * **License:** [Apache License 2.0](http://www.apache.org/licenses/)
+ * **License:** [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html)
+ * **License:** [MPL 1.1](http://www.mozilla.org/MPL/MPL-1.1.html)
+
+1. **Group** : org.jcommander. **Name** : jcommander. **Version** : 1.85.
+ * **Project URL:** [https://jcommander.org](https://jcommander.org)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
+ * **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : markdown. **Version** : 0.7.3.
+ * **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : markdown-jvm. **Version** : 0.7.3.
+ * **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-kotlin-symbols. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-markdown. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : javadoc-plugin. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : templating-plugin. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.intellij.deps. **Name** : trove4j. **Version** : 1.0.20200330.
+ * **Project URL:** [https://github.com/JetBrains/intellij-deps-trove4j](https://github.com/JetBrains/intellij-deps-trove4j)
+ * **License:** [GNU LESSER GENERAL PUBLIC LICENSE 2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : abi-tools. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : abi-tools-api. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-bom. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-api. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-compat. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-cri-impl. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-impl. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-runner. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-client. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-abi-reader. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-metadata-jvm. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-tooling-core. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu. **Version** : 0.29.0.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu-jvm. **Version** : 0.29.0.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.6.4.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-test. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-test-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.8.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.9.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-core. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-core-jvm. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-json. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-json-jvm. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jsoup. **Name** : jsoup. **Version** : 1.16.1.
+ * **Project URL:** [https://jsoup.org/](https://jsoup.org/)
+ * **License:** [The MIT License](https://jsoup.org/license)
+
+1. **Group** : org.jspecify. **Name** : jspecify. **Version** : 1.0.0.
+ * **Project URL:** [http://jspecify.org/](http://jspecify.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.junit. **Name** : junit-bom. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit-pioneer. **Name** : junit-pioneer. **Version** : 2.3.0.
+ * **Project URL:** [https://junit-pioneer.org/](https://junit-pioneer.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-engine. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.platform. **Name** : junit-platform-engine. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.platform. **Name** : junit-platform-launcher. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.opentest4j. **Name** : opentest4j. **Version** : 1.3.0.
+ * **Project URL:** [https://github.com/ota4j-team/opentest4j](https://github.com/ota4j-team/opentest4j)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.6.
+ * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
+ * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.ow2.asm. **Name** : asm-commons. **Version** : 9.6.
+ * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
+ * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.ow2.asm. **Name** : asm-tree. **Version** : 9.6.
+ * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
+ * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 4.0.1.
+ * **Project URL:** [https://github.com/hrldcpr/pcollections](https://github.com/hrldcpr/pcollections)
+ * **License:** [The MIT License](https://opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 4.0.2.
+ * **Project URL:** [https://github.com/hrldcpr/pcollections](https://github.com/hrldcpr/pcollections)
+ * **License:** [The MIT License](https://opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.reflections. **Name** : reflections. **Version** : 0.10.2.
+ * **Project URL:** [https://github.com/ronmamo/reflections](https://github.com/ronmamo/reflections)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [WTFPL](http://www.wtfpl.net/)
+
+1. **Group** : org.slf4j. **Name** : jul-to-slf4j. **Version** : 1.7.36.
+ * **Project URL:** [http://www.slf4j.org](http://www.slf4j.org)
+ * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.snakeyaml. **Name** : snakeyaml-engine. **Version** : 2.7.
+ * **Project URL:** [https://bitbucket.org/snakeyaml/snakeyaml-engine](https://bitbucket.org/snakeyaml/snakeyaml-engine)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.xmlresolver. **Name** : xmlresolver. **Version** : 5.1.2.
+ * **Project URL:** [https://github.com/xmlresolver/xmlresolver](https://github.com/xmlresolver/xmlresolver)
+ * **License:** [Apache License version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : org.xmlresolver. **Name** : xmlresolver. **Version** : 5.2.2.
+ * **Project URL:** [https://github.com/xmlresolver/xmlresolver](https://github.com/xmlresolver/xmlresolver)
+ * **License:** [Apache License version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+
+The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
+
+This report was generated on **Fri May 15 21:01:29 WEST 2026** using
+[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
+[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
+
+
+
+
+# Dependencies of `io.spine:spine-format:2.0.0-SNAPSHOT.388`
+
+## Runtime
+1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-bom](https://github.com/FasterXML/jackson-bom)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-annotations. **Version** : 2.20.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-yaml. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-dataformats-text](https://github.com/FasterXML/jackson-dataformats-text)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-guava. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-datatypes-collections](https://github.com/FasterXML/jackson-datatypes-collections)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jdk8. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jsr310. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
+ * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.13.0.
+ * **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
+ * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava. **Version** : 33.5.0-jre.
+ * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 2.8.
+ * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
+ * **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-bom. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jspecify. **Name** : jspecify. **Version** : 1.0.0.
+ * **Project URL:** [http://jspecify.org/](http://jspecify.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.yaml. **Name** : snakeyaml. **Version** : 2.4.
+ * **Project URL:** [https://bitbucket.org/snakeyaml/snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+## Compile, tests, and tooling
+1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson-bom](https://github.com/FasterXML/jackson-bom)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-bom](https://github.com/FasterXML/jackson-bom)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-annotations. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-annotations. **Version** : 2.20.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-xml. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson-dataformat-xml](https://github.com/FasterXML/jackson-dataformat-xml)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-yaml. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-dataformats-text](https://github.com/FasterXML/jackson-dataformats-text)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-guava. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-datatypes-collections](https://github.com/FasterXML/jackson-datatypes-collections)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jdk8. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jsr310. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.15.3.
+ * **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.woodstox. **Name** : woodstox-core. **Version** : 6.5.1.
+ * **Project URL:** [https://github.com/FasterXML/woodstox](https://github.com/FasterXML/woodstox)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 3.0.5.
+ * **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.github.kevinstern. **Name** : software-and-algorithms. **Version** : 1.0.
+ * **Project URL:** [https://www.github.com/KevinStern/software-and-algorithms](https://www.github.com/KevinStern/software-and-algorithms)
+ * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
+
+1. **Group** : com.github.oowekyala.ooxml. **Name** : nice-xml-messages. **Version** : 3.1.
+ * **Project URL:** [https://github.com/oowekyala/nice-xml-messages](https://github.com/oowekyala/nice-xml-messages)
+ * **License:** [MIT License](https://github.com/oowekyala/nice-xml-messages/tree/master/LICENSE)
+
+1. **Group** : com.google.auto. **Name** : auto-common. **Version** : 1.2.2.
+ * **Project URL:** [https://github.com/google/auto/tree/main/common](https://github.com/google/auto/tree/main/common)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.auto.service. **Name** : auto-service-annotations. **Version** : 1.1.1.
+ * **Project URL:** [https://github.com/google/auto/tree/main/service](https://github.com/google/auto/tree/main/service)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.auto.value. **Name** : auto-value-annotations. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/google/auto/tree/main/value](https://github.com/google/auto/tree/main/value)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
+ * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.13.0.
+ * **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_annotation](https://errorprone.info/error_prone_annotation)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_check_api](https://errorprone.info/error_prone_check_api)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_core](https://errorprone.info/error_prone_core)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_type_annotations](https://errorprone.info/error_prone_type_annotations)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : javac. **Version** : 9+181-r4173-1.
+ * **Project URL:** [https://github.com/google/error-prone-javac](https://github.com/google/error-prone-javac)
+ * **License:** [GNU General Public License, version 2, with the Classpath Exception](http://openjdk.java.net/legal/gplv2+ce.html)
+
+1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
+ * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
+ * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.flogger. **Name** : flogger-system-backend. **Version** : 0.7.4.
+ * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
+ * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.googlejavaformat. **Name** : google-java-format. **Version** : 1.19.1.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
+ * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava. **Version** : 33.5.0-jre.
+ * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 33.5.0-jre.
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 2.8.
+ * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.puppycrawl.tools. **Name** : checkstyle. **Version** : 10.12.1.
+ * **Project URL:** [https://checkstyle.org/](https://checkstyle.org/)
+ * **License:** [LGPL-2.1+](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt)
+
+1. **Group** : com.soywiz.korlibs.korte. **Name** : korte-jvm. **Version** : 4.0.10.
+ * **Project URL:** [https://github.com/korlibs/korge-next](https://github.com/korlibs/korge-next)
+ * **License:** [MIT](https://raw.githubusercontent.com/korlibs/korge-next/master/korge/LICENSE.txt)
+
+1. **Group** : commons-beanutils. **Name** : commons-beanutils. **Version** : 1.9.4.
+ * **Project URL:** [https://commons.apache.org/proper/commons-beanutils/](https://commons.apache.org/proper/commons-beanutils/)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : commons-codec. **Name** : commons-codec. **Version** : 1.16.0.
+ * **Project URL:** [https://commons.apache.org/proper/commons-codec/](https://commons.apache.org/proper/commons-codec/)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : commons-collections. **Name** : commons-collections. **Version** : 3.2.2.
+ * **Project URL:** [http://commons.apache.org/collections/](http://commons.apache.org/collections/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : dev.drewhamilton.poko. **Name** : poko-annotations. **Version** : 0.17.1.
+ * **Project URL:** [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : dev.drewhamilton.poko. **Name** : poko-annotations-jvm. **Version** : 0.17.1.
+ * **Project URL:** [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : info.picocli. **Name** : picocli. **Version** : 4.7.4.
+ * **Project URL:** [https://picocli.info](https://picocli.info)
+ * **License:** [The Apache Software License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.davidburstrom.contester. **Name** : contester-breakpoint. **Version** : 0.2.0.
+ * **Project URL:** [https://github.com/davidburstrom/contester](https://github.com/davidburstrom/contester)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k. **Version** : 0.6.0.
+ * **Project URL:** [https://detekt.github.io/detekt](https://detekt.github.io/detekt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k-jvm. **Version** : 0.6.0.
+ * **Project URL:** [https://detekt.github.io/detekt](https://detekt.github.io/detekt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.eisop. **Name** : dataflow-errorprone. **Version** : 3.41.0-eisop1.
+ * **Project URL:** [https://eisop.github.io/](https://eisop.github.io/)
+ * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
+
+1. **Group** : io.github.java-diff-utils. **Name** : java-diff-utils. **Version** : 4.12.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-api. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-cli. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-core. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-metrics. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-parser. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-psi-utils. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-html. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-md. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-sarif. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-txt. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-xml. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-complexity. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-coroutines. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-documentation. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-empty. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-errorprone. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-exceptions. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-naming. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-performance. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-style. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-tooling. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-utils. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : javax.inject. **Name** : javax.inject. **Version** : 1.
+ * **Project URL:** [http://code.google.com/p/atinject/](http://code.google.com/p/atinject/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : junit. **Name** : junit. **Version** : 4.13.2.
+ * **Project URL:** [http://junit.org](http://junit.org)
+ * **License:** [Eclipse Public License 1.0](http://www.eclipse.org/legal/epl-v10.html)
+
+1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 12.2.
+ * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
+ * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
+
+1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 12.5.
+ * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
+ * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-ant. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-core. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-java. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
+
+1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.11.1.
+ * **Project URL:** [https://www.antlr.org/](https://www.antlr.org/)
+ * **License:** [BSD-3-Clause](https://www.antlr.org/license.html)
+
+1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.9.3.
+ * **Project URL:** [http://www.antlr.org](http://www.antlr.org)
+ * **License:** [The BSD License](http://www.antlr.org/license.html)
+
+1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.17.0.
+ * **Project URL:** [https://commons.apache.org/proper/commons-lang/](https://commons.apache.org/proper/commons-lang/)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.httpcomponents.client5. **Name** : httpclient5. **Version** : 5.1.3.
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.httpcomponents.core5. **Name** : httpcore5. **Version** : 5.1.3.
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.httpcomponents.core5. **Name** : httpcore5-h2. **Version** : 5.1.3.
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2.
+ * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.3.
+ * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
+ * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
+ * **License:** [The MIT License](http://opensource.org/licenses/MIT)
+
+1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.40.0.
+ * **Project URL:** [https://checkerframework.org/](https://checkerframework.org/)
+ * **License:** [The MIT License](http://opensource.org/licenses/MIT)
+
+1. **Group** : org.codehaus.woodstox. **Name** : stax2-api. **Version** : 4.2.1.
+ * **Project URL:** [https://github.com/FasterXML/stax2-api](https://github.com/FasterXML/stax2-api)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The BSD License](http://www.opensource.org/licenses/bsd-license.php)
+
+1. **Group** : org.freemarker. **Name** : freemarker. **Version** : 2.3.32.
+ * **Project URL:** [https://freemarker.apache.org/](https://freemarker.apache.org/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.hamcrest. **Name** : hamcrest. **Version** : 3.0.
+ * **Project URL:** [http://hamcrest.org/JavaHamcrest/](http://hamcrest.org/JavaHamcrest/)
+ * **License:** [BSD-3-Clause](https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE)
+
+1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 3.0.
+ * **Project URL:** [http://hamcrest.org/JavaHamcrest/](http://hamcrest.org/JavaHamcrest/)
+ * **License:** [BSD-3-Clause](https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE)
+
+1. **Group** : org.jacoco. **Name** : org.jacoco.agent. **Version** : 0.8.13.
+ * **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
+
+1. **Group** : org.jacoco. **Name** : org.jacoco.core. **Version** : 0.8.13.
+ * **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
+
+1. **Group** : org.jacoco. **Name** : org.jacoco.report. **Version** : 0.8.13.
+ * **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
+
+1. **Group** : org.javassist. **Name** : javassist. **Version** : 3.28.0-GA.
+ * **Project URL:** [http://www.javassist.org/](http://www.javassist.org/)
+ * **License:** [Apache License 2.0](http://www.apache.org/licenses/)
+ * **License:** [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html)
+ * **License:** [MPL 1.1](http://www.mozilla.org/MPL/MPL-1.1.html)
+
+1. **Group** : org.jcommander. **Name** : jcommander. **Version** : 1.85.
+ * **Project URL:** [https://jcommander.org](https://jcommander.org)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
+ * **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : markdown. **Version** : 0.7.3.
+ * **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : markdown-jvm. **Version** : 0.7.3.
+ * **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-kotlin-symbols. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-markdown. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : javadoc-plugin. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : templating-plugin. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.intellij.deps. **Name** : trove4j. **Version** : 1.0.20200330.
+ * **Project URL:** [https://github.com/JetBrains/intellij-deps-trove4j](https://github.com/JetBrains/intellij-deps-trove4j)
+ * **License:** [GNU LESSER GENERAL PUBLIC LICENSE 2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : abi-tools. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : abi-tools-api. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-bom. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-api. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-compat. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-cri-impl. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-impl. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-runner. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-client. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-abi-reader. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-metadata-jvm. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-tooling-core. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu. **Version** : 0.29.0.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu-jvm. **Version** : 0.29.0.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.6.4.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-test. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-test-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.8.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.9.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-core. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-core-jvm. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-json. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-json-jvm. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jsoup. **Name** : jsoup. **Version** : 1.16.1.
+ * **Project URL:** [https://jsoup.org/](https://jsoup.org/)
+ * **License:** [The MIT License](https://jsoup.org/license)
+
+1. **Group** : org.jspecify. **Name** : jspecify. **Version** : 1.0.0.
+ * **Project URL:** [http://jspecify.org/](http://jspecify.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.junit. **Name** : junit-bom. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit-pioneer. **Name** : junit-pioneer. **Version** : 2.3.0.
+ * **Project URL:** [https://junit-pioneer.org/](https://junit-pioneer.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-engine. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.platform. **Name** : junit-platform-engine. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.platform. **Name** : junit-platform-launcher. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.opentest4j. **Name** : opentest4j. **Version** : 1.3.0.
+ * **Project URL:** [https://github.com/ota4j-team/opentest4j](https://github.com/ota4j-team/opentest4j)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.6.
+ * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
+ * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.ow2.asm. **Name** : asm-commons. **Version** : 9.6.
+ * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
+ * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.ow2.asm. **Name** : asm-tree. **Version** : 9.6.
+ * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
+ * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 4.0.1.
+ * **Project URL:** [https://github.com/hrldcpr/pcollections](https://github.com/hrldcpr/pcollections)
+ * **License:** [The MIT License](https://opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 4.0.2.
+ * **Project URL:** [https://github.com/hrldcpr/pcollections](https://github.com/hrldcpr/pcollections)
+ * **License:** [The MIT License](https://opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.reflections. **Name** : reflections. **Version** : 0.10.2.
+ * **Project URL:** [https://github.com/ronmamo/reflections](https://github.com/ronmamo/reflections)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [WTFPL](http://www.wtfpl.net/)
+
+1. **Group** : org.slf4j. **Name** : jul-to-slf4j. **Version** : 1.7.36.
+ * **Project URL:** [http://www.slf4j.org](http://www.slf4j.org)
+ * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.snakeyaml. **Name** : snakeyaml-engine. **Version** : 2.7.
+ * **Project URL:** [https://bitbucket.org/snakeyaml/snakeyaml-engine](https://bitbucket.org/snakeyaml/snakeyaml-engine)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.xmlresolver. **Name** : xmlresolver. **Version** : 5.1.2.
+ * **Project URL:** [https://github.com/xmlresolver/xmlresolver](https://github.com/xmlresolver/xmlresolver)
+ * **License:** [Apache License version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : org.xmlresolver. **Name** : xmlresolver. **Version** : 5.2.2.
+ * **Project URL:** [https://github.com/xmlresolver/xmlresolver](https://github.com/xmlresolver/xmlresolver)
+ * **License:** [Apache License version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : org.yaml. **Name** : snakeyaml. **Version** : 2.4.
+ * **Project URL:** [https://bitbucket.org/snakeyaml/snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+
+The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
+
+This report was generated on **Fri May 15 21:01:29 WEST 2026** using
+[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
+[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
\ No newline at end of file
diff --git a/docs/dependencies/pom.xml b/docs/dependencies/pom.xml
new file mode 100644
index 0000000000..30c20f7c47
--- /dev/null
+++ b/docs/dependencies/pom.xml
@@ -0,0 +1,330 @@
+
+
+4.0.0
+
+io.spine
+base-libraries
+2.0.0-SNAPSHOT.388
+
+2015
+
+
+
+ Apache License, Version 2.0
+ https://www.apache.org/licenses/LICENSE-2.0.txt
+ repo
+
+
+
+
+
+ com.fasterxml.jackson
+ jackson-bom
+ 2.20.0
+ compile
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ null
+ compile
+
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-yaml
+ null
+ compile
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-guava
+ null
+ compile
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jdk8
+ null
+ compile
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+ null
+ compile
+
+
+ com.google.guava
+ guava
+ 33.5.0-jre
+ compile
+
+
+ com.google.protobuf
+ protobuf-java
+ 4.34.1
+ compile
+
+
+ com.google.protobuf
+ protobuf-java-util
+ 4.34.1
+ compile
+
+
+ com.google.protobuf
+ protobuf-kotlin
+ 4.34.1
+ compile
+
+
+ io.spine
+ spine-logging
+ 2.0.0-SNAPSHOT.417
+ compile
+
+
+ io.spine
+ spine-reflect
+ 2.0.0-SNAPSHOT.200
+ compile
+
+
+ org.jetbrains.kotlin
+ kotlin-bom
+ 2.3.20
+ compile
+
+
+ org.jetbrains.kotlin
+ kotlin-reflect
+ 2.3.20
+ compile
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib
+ 2.3.20
+ compile
+
+
+ org.jetbrains.kotlinx
+ kotlinx-coroutines-bom
+ 1.10.2
+ compile
+
+
+ org.jspecify
+ jspecify
+ 1.0.0
+ compile
+
+
+ com.fasterxml.jackson.module
+ jackson-module-kotlin
+ null
+ runtime
+
+
+ com.google.guava
+ guava-testlib
+ 33.5.0-jre
+ test
+
+
+ io.kotest
+ kotest-assertions-core
+ 6.1.11
+ test
+
+
+ io.spine
+ spine-logging-smoke-test
+ 2.0.0-SNAPSHOT.417
+ test
+
+
+ io.spine.tools
+ base-testlib
+ 2.0.0-SNAPSHOT.213
+ test
+
+
+ io.spine.tools
+ logging-testlib
+ 2.0.0-SNAPSHOT.417
+ test
+
+
+ org.junit
+ junit-bom
+ 6.0.3
+ test
+
+
+ org.junit-pioneer
+ junit-pioneer
+ 2.3.0
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ 6.0.3
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ 6.0.3
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-params
+ 6.0.3
+ test
+
+
+ com.google.auto.service
+ auto-service-annotations
+ 1.1.1
+ provided
+
+
+ com.google.devtools.ksp
+ symbol-processing
+ 2.3.6
+
+
+ com.google.devtools.ksp
+ symbol-processing-api
+ 2.3.6
+
+
+ com.google.errorprone
+ error_prone_annotations
+ 2.36.0
+ provided
+
+
+ com.google.errorprone
+ error_prone_core
+ 2.36.0
+
+
+ com.google.errorprone
+ error_prone_type_annotations
+ 2.36.0
+ provided
+
+
+ com.google.protobuf
+ protoc
+ 4.34.1
+
+
+ com.puppycrawl.tools
+ checkstyle
+ 10.12.1
+
+
+ dev.zacsweers.autoservice
+ auto-service-ksp
+ 1.2.0
+
+
+ io.gitlab.arturbosch.detekt
+ detekt-cli
+ 1.23.8
+
+
+ io.spine.tools
+ spine-dokka-extensions
+ 2.0.0-SNAPSHOT.7
+
+
+ net.sourceforge.pmd
+ pmd-ant
+ 7.12.0
+
+
+ net.sourceforge.pmd
+ pmd-java
+ 7.12.0
+
+
+ org.checkerframework
+ checker-qual
+ 3.40.0
+ provided
+
+
+ org.jacoco
+ org.jacoco.agent
+ 0.8.13
+
+
+ org.jacoco
+ org.jacoco.ant
+ 0.8.13
+
+
+ org.jacoco
+ org.jacoco.report
+ 0.8.13
+
+
+ org.jetbrains.dokka
+ all-modules-page-plugin
+ 2.2.0
+
+
+ org.jetbrains.dokka
+ analysis-kotlin-symbols
+ 2.2.0
+
+
+ org.jetbrains.dokka
+ dokka-base
+ 2.2.0
+
+
+ org.jetbrains.dokka
+ dokka-core
+ 2.2.0
+
+
+ org.jetbrains.dokka
+ javadoc-plugin
+ 2.2.0
+
+
+ org.jetbrains.dokka
+ templating-plugin
+ 2.2.0
+
+
+ org.jetbrains.kotlin
+ kotlin-build-tools-compat
+ 2.3.20
+
+
+ org.jetbrains.kotlin
+ kotlin-build-tools-impl
+ 2.3.20
+
+
+ org.jetbrains.kotlin
+ kotlin-scripting-compiler-embeddable
+ 2.3.20
+
+
+
+
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index d997cfc60f..b1b8ef56b4 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index c61a118f7d..df6a6ad763 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,7 +1,9 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip
networkTimeout=10000
+retries=0
+retryBackOffMs=500
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
index 739907dfd1..b9bb139f79 100755
--- a/gradlew
+++ b/gradlew
@@ -57,7 +57,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
-# https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
diff --git a/gradlew.bat b/gradlew.bat
index c4bdd3ab8e..24c62d56f2 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -23,8 +23,8 @@
@rem
@rem ##########################################################################
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
+@rem Set local scope for the variables, and ensure extensions are enabled
+setlocal EnableExtensions
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@@ -51,7 +51,7 @@ echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
-goto fail
+"%COMSPEC%" /c exit 1
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
@@ -65,7 +65,7 @@ echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
-goto fail
+"%COMSPEC%" /c exit 1
:execute
@rem Setup the command line
@@ -73,21 +73,10 @@ goto fail
@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
+@rem endlocal doesn't take effect until after the line is parsed and variables are expanded
+@rem which allows us to clear the local environment before executing the java command
+endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel
-:end
-@rem End local scope for the variables with windows NT shell
-if %ERRORLEVEL% equ 0 goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-set EXIT_CODE=%ERRORLEVEL%
-if %EXIT_CODE% equ 0 set EXIT_CODE=1
-if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
-exit /b %EXIT_CODE%
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
+:exitWithErrorLevel
+@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts
+"%COMSPEC%" /c exit %ERRORLEVEL%
diff --git a/version.gradle.kts b/version.gradle.kts
index 6c1deba47d..4d0b5b19fc 100644
--- a/version.gradle.kts
+++ b/version.gradle.kts
@@ -24,4 +24,4 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-val versionToPublish: String by extra("2.0.0-SNAPSHOT.387")
+val versionToPublish: String by extra("2.0.0-SNAPSHOT.388")