commit 08b5496980e65de5618f81304ecf60e73320fbf5 Author: kurogeek Date: Tue Oct 20 17:45:02 2026 +0000 Package Penpot 2.18.3 for Nix with NixOS module; afk devShell Vendored from debling/nix-penpot (MIT). Fixes on top: - pnpm fetchers: drop --config.fetch-* flags (UND_ERR_INVALID_ARG on pnpm 11.27) and pin real store hashes (frontend x3, exporter, mcp) - deps-lock.json: add transitive funcool/beicon2 v2.0 so fake-git resolves potok2's pin during the shadow-cljs classpath build - expose frontend pnpm stores via passthru for rehashing - x86_64-linux only; devShell ships afk, jj, git diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..220ef45 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.direnv/ +/result +/result-* +/penpot +/penpot-vm.qcow2 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..099ee6e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Denilson dos Santos Ebling + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..aa0d54d --- /dev/null +++ b/README.md @@ -0,0 +1,143 @@ +# penpot-nix + +Nix packages and a NixOS module for self-hosting [Penpot](https://penpot.app) +(pinned to release **2.18.3**). Every component is built from upstream +source: the Clojure API backend, the static frontend (served by nginx), the +headless-Chromium exporter, the MCP server and the Rust/WASM renderer. +One module wires the stack together with PostgreSQL and Valkey, either +provisioned locally or pointed at infrastructure you already run. + +Derived from [debling/nix-penpot](https://github.com/debling/nix-penpot) +(MIT, see [LICENSE](LICENSE)). `x86_64-linux` only. + +## Packages + +| Attribute | Output | +|-----------------------------|------------------------------------------------------------------------| +| `penpot-backend` | `bin/penpot-backend` (JVM wrapper), `bin/penpot-manage` | +| `penpot-frontend` | `dist/` static bundle (+ `plugins/`, `plugins/mcp/`), `config.js` | +| `penpot-exporter` | `bin/penpot-exporter` (node + nixpkgs chromium) | +| `penpot-mcp` | `bin/penpot-mcp` | +| `penpot-render-wasm` | `render-wasm.{js,wasm}`, `shared.js`, `worker/render.js` (frontend) | +| `penpot-render-wasm-export` | export flavor of the renderer (unused on 2.18.x) | + +The same packages are exposed as an overlay (`overlays.default`: +`pkgs.penpot-backend`, `pkgs.penpot-frontend`, `pkgs.penpot-exporter`, +`pkgs.penpot-mcp`). The module's package defaults resolve through the +overlay, so it is required. + +## Deploying on NixOS + +```nix +# flake.nix +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + penpot-nix.url = "git+https://"; + }; + + outputs = { self, nixpkgs, penpot-nix }: { + nixosConfigurations.myhost = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + modules = [ + ./configuration.nix + { nixpkgs.overlays = [ penpot-nix.overlays.default ]; } + penpot-nix.nixosModules.default + ]; + }; + }; +} +``` + +```nix +# configuration.nix +{ + services.penpot = { + enable = true; + publicUri = "https://penpot.example.com"; + secretKeyFile = "/run/secrets/penpot-secret-key"; + }; + networking.firewall.allowedTCPPorts = [ 80 443 ]; +} +``` + +That is a complete deployment: PostgreSQL and Valkey are provisioned +locally, the nginx vhost is generated, exporter and MCP run behind it. +Secrets are files loaded through systemd credentials; generate the master +key once (`openssl rand -base64 64 | tr -d '\n'`) and manage it with +agenix/sops-nix. + +Commonly tuned options (all documented inline in +[`modules/penpot.nix`](modules/penpot.nix)): + +| Option | Default | What it does | +|----------------------------------|-----------------------------|-------------------------------------------------------------| +| `publicUri` | – (required) | Public URL of the instance | +| `secretKeyFile` | – (required) | Master secret key file | +| `flags` | `[ "enable-prepl-server" ]` | Upstream feature flags | +| `admins` | `[ ]` | Emails granted admin on login | +| `database.createLocally` | `true` | Local PostgreSQL, or set `database.uri` for an external one | +| `redis.createLocally` | `true` | Local Valkey, or set `redis.uri` | +| `storage.backend` | `"fs"` | `"fs"` or `"s3"` (+ endpoint/bucket/keys) | +| `smtp.*` / `mailpit.enable` | off | Outgoing email, or a local throwaway SMTP sink | +| `exporter.enable` / `mcp.enable` | `true` | Toggle the auxiliary services | +| `nginx.forceHttps` | `false` | Force HTTPS (configure TLS yourself) | + +### Users and admins + +No default credentials. Register through the UI, or on the backend host: + +```bash +penpot-manage create-profile -n "Jane Doe" -e jane@example.org -p 'secret' +``` + +Admin rights come from `services.penpot.admins = [ "jane@example.org" ];`. + +## Trying it in a VM + +```bash +nix build .#nixosConfigurations.penpot-vm.config.system.build.vm +./result/bin/run-penpot-vm-vm +``` + +Host port 8080 → nginx, 8025 → mailpit UI. `curl http://127.0.0.1:8080/readyz` +once the backend is up (~1–2 min). Needs ~3 GB RAM. + +## Development + +```bash +direnv allow # or: nix develop — devShell ships the afk harness, jj, git +nix flake check --no-build +nix build .#checks.x86_64-linux.penpot-vm-test # end-to-end VM test +nix fmt +``` + +Development runs under [afk](https://github.com/DavHau/afk) (`afk` is on +PATH in the devShell). + +## Updating Penpot + +1. Bump `penpot.url` **and** `penpotVersion` in `flake.nix` (upstream's + `package.json` version is stale, so it is pinned by hand). +2. Regenerate `deps-lock.json` with clj-nix from a writable copy of the + penpot source with the `RELEASE` pins from `packages/frontend.nix` + (`pinDepsEdn`) applied: + ```bash + nix run github:jlesquembre/clj-nix/#deps-lock -- \ + --deps-include backend/deps.edn --deps-include common/deps.edn \ + --deps-include frontend/deps.edn --deps-include exporter/deps.edn \ + --alias-exclude outdated --alias-exclude jvm-repl + ``` +3. Rehash the fixed-output derivations (set to `lib.fakeHash`, build, copy + `got:`): `penpot-frontend.{frontendPnpmDeps,pluginsPnpmDeps,mcpPnpmDeps}`, + `penpot-exporter.pnpmDeps`, `penpot-mcp.pnpmDeps`, + `penpot-backend.builtinTemplates` (after `nix flake update penpot-files`), + and `cargoDeps` / Rust / Skia hashes in `packages/render-wasm.nix` if + `render-wasm/Cargo.lock`, the Rust version or the Skia URL changed. +4. Rebase `packages/patches/*` if `frontend/src/app/plugins/library.cljs` + moved. + +## License + +Nix code: MIT ([LICENSE](LICENSE)). Penpot: MPL-2.0. The remaining stack +(PostgreSQL, Valkey, Chromium, …) ships under its own licenses. diff --git a/deps-lock.json b/deps-lock.json new file mode 100644 index 0000000..4daa02b --- /dev/null +++ b/deps-lock.json @@ -0,0 +1,3983 @@ +{ + "lock-version": 4, + "git-deps": [ + { + "lib": "funcool/beicon2", + "url": "https://github.com/funcool/beicon.git", + "rev": "8744c664a96f5edddda7420deea46228ccf1f78c", + "tag": "v2.2", + "git-dir": "https/github.com/funcool/beicon", + "hash": "sha256-Qy2RrrtfdxXmP7mM687+8Z6tSnj2fRYgvUctIWy3+Q0=" + }, + { + "lib": "funcool/beicon2", + "url": "https://github.com/funcool/beicon.git", + "rev": "e7135e040c7bb72f4dee4eb758c7964fe9274c1d", + "tag": "v2.0", + "git-dir": "https/github.com/funcool/beicon", + "hash": "sha256-yRH+vjtozGWMKfgq1odWMLwphPFsP8cgRIln+Vas3D0=", + "ancestor?": { + "8744c664a96f5edddda7420deea46228ccf1f78c": true + } + }, + { + "lib": "funcool/datoteka", + "url": "https://github.com/funcool/datoteka", + "rev": "3372f3ab33034030a6118de74592b9fb22d8c7d0", + "tag": "4.0.0", + "git-dir": "https/github.com/funcool/datoteka", + "hash": "sha256-cViSrICvInAPtzqw2Bckh0IAhWCu6K2wru20IYQlmtc=" + }, + { + "lib": "funcool/potok2", + "url": "https://github.com/funcool/potok.git", + "rev": "0f7e15a26f202ac554fc436669147c1c5f311ff7", + "tag": "v2.2", + "git-dir": "https/github.com/funcool/potok", + "hash": "sha256-ci+YTm3EoWS1QsFsDBt2j1Esfo5WiQxCmVz3NNe0/Js=" + }, + { + "lib": "funcool/rumext", + "url": "https://github.com/funcool/rumext.git", + "rev": "27e5a1a13207363a549aacf323f7fe10b0079ae0", + "tag": "v2.25", + "git-dir": "https/github.com/funcool/rumext", + "hash": "sha256-fyUjwjP4IQDU9ZlO7IzUQw0fTf/P71KtbbQuJ7Q//xg=" + }, + { + "lib": "funcool/tubax", + "url": "https://github.com/funcool/tubax.git", + "rev": "2d9a986b7f3df27882e2306851df7cd2932ac310", + "tag": "v2025.11.28", + "git-dir": "https/github.com/funcool/tubax", + "hash": "sha256-OsKgDjSAr89B6OqAY5JIKVo6N1F7kzx8fOEjKg2szyc=" + }, + { + "lib": "funcool/yetti", + "url": "https://github.com/funcool/yetti.git", + "rev": "e810f87eeb74bdc0484c074d7b3e4632a23ac770", + "tag": "v11.11", + "git-dir": "https/github.com/funcool/yetti", + "hash": "sha256-OaPSc19QGJMQ9ceX28DS1w660qfCzHGJzHKQkOG2k6I=" + }, + { + "lib": "garden/garden", + "url": "https://github.com/noprompt/garden", + "rev": "05590ecb5f6fa670856f3d1ab400aa4961047480", + "git-dir": "https/github.com/noprompt/garden", + "hash": "sha256-tJmzBNBzh0xGovNghIBAIoYe39LZt/JpvtX1ev/rSfk=" + } + ], + "mvn-deps": [ + { + "mvn-path": "aero/aero/1.1.6/aero-1.1.6.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-9LCpJy2lDICRxVKcn+NVxHI08e65X+kiluLCP3h/PSI=" + }, + { + "mvn-path": "aero/aero/1.1.6/aero-1.1.6.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-WUXPjq14D3SX6G8piWPyeGgdUZrpshvpSfrFQg8F01A=" + }, + { + "mvn-path": "at/yawk/lz4/lz4-java/1.11.2/lz4-java-1.11.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-inRYZXk46baSIk24OqxFjBOr16Wat1w9Owi9IjOmRqI=" + }, + { + "mvn-path": "at/yawk/lz4/lz4-java/1.11.2/lz4-java-1.11.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-VfxtAnM84iOqLKc3BX8zj7I9WI5S7VcaJkVWYAbZJY8=" + }, + { + "mvn-path": "binaryage/devtools/1.0.7/devtools-1.0.7.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-StvSSp/Eww81icjbpgSQvurWxb89MOUbJii8/A3Wt2o=" + }, + { + "mvn-path": "binaryage/devtools/1.0.7/devtools-1.0.7.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-LhSfAbRAFn7MgA/yhVyK2xSCXiUO/6a3fw1eveaK/Fg=" + }, + { + "mvn-path": "borkdude/dynaload/0.3.5/dynaload-0.3.5.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-CIfAzbmvzs18SW6iWKMuQ6py52bz8GMuG9D1JFyowkw=" + }, + { + "mvn-path": "borkdude/dynaload/0.3.5/dynaload-0.3.5.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-XBwijxopsG0KfQNJD15k+vcTo8YWcpi6Fxz/wzz57Rg=" + }, + { + "mvn-path": "borkdude/edamame/1.5.37/edamame-1.5.37.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-TuYGDVJS0LlKcIOdvQy699fMToHZwnfSs1UvKAuXxag=" + }, + { + "mvn-path": "borkdude/edamame/1.5.37/edamame-1.5.37.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-ALbGpZQfZ2CIRW5VUez5OLBhJ+lSDPY7oxb1UwPhyG4=" + }, + { + "mvn-path": "buddy/buddy-core/1.11.423/buddy-core-1.11.423.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-D4n7XMeeTHOueqyVhvffuDAeM/xp4NpGEHnMRWElfdM=" + }, + { + "mvn-path": "buddy/buddy-core/1.12.0-430/buddy-core-1.12.0-430.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-FGWPoCUX/mf7HDR3zR+MdOH74tykcGGzwEl7DTUqSbQ=" + }, + { + "mvn-path": "buddy/buddy-core/1.12.0-430/buddy-core-1.12.0-430.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-LJt22dbMpCLNP8U4i04wkqlTG2OFdqh4Ee2XltwcTFY=" + }, + { + "mvn-path": "buddy/buddy-hashers/2.0.167/buddy-hashers-2.0.167.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-uZX2VryXdXdabYy0S10tDU93IqscRkImxX2x5cQxomQ=" + }, + { + "mvn-path": "buddy/buddy-hashers/2.0.167/buddy-hashers-2.0.167.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-wj2Io5aOkpj57CixhNrTZiaxoJ5yz8VrjV+C7qBhJ8M=" + }, + { + "mvn-path": "buddy/buddy-sign/3.6.1-359/buddy-sign-3.6.1-359.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-V93QyYENLv8/zzKCYEBHTsJ1e5I5qCumZ0Hxt2Ficps=" + }, + { + "mvn-path": "buddy/buddy-sign/3.6.1-359/buddy-sign-3.6.1-359.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-+BQIfVEmo6fwDfAa1/q0HwE1V7JidlW6wH36SHm/c1I=" + }, + { + "mvn-path": "camel-snake-kebab/camel-snake-kebab/0.4.3/camel-snake-kebab-0.4.3.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-gZHzNXdjENeFekCtMyVL5mrbNjgGsYE22IQxlpI6wsg=" + }, + { + "mvn-path": "camel-snake-kebab/camel-snake-kebab/0.4.3/camel-snake-kebab-0.4.3.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-LVp6g6ymqHa1ZOMHYD0CRaNxZ4osT0xoEH7dC5sLv7s=" + }, + { + "mvn-path": "cheshire/cheshire/5.13.0/cheshire-5.13.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-wAlhAWDKih2Kba1TB9BtFx0xjNQm7CSZkMF/6OC4muw=" + }, + { + "mvn-path": "cheshire/cheshire/5.13.0/cheshire-5.13.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-LaaIDz3x3lGTb/GfarGHaT5MAc3MVCiFWE5Z85qs6z4=" + }, + { + "mvn-path": "cider/piggieback/0.6.0/piggieback-0.6.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-L8BVJuA7DEBG0rJIXdYhqCOhNmrornPJW7F00EXKcPQ=" + }, + { + "mvn-path": "cider/piggieback/0.6.0/piggieback-0.6.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-Iz++ZjMTDvh3vHJjp/u9Zu+k1NBVGDeXRBTVy7i4H58=" + }, + { + "mvn-path": "clj-commons/clj-yaml/1.0.29/clj-yaml-1.0.29.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-Rg35UiK3m6CCMfEEiPp2Irm/wQe01DV8E89b0D0QNGE=" + }, + { + "mvn-path": "clj-commons/clj-yaml/1.0.29/clj-yaml-1.0.29.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-Ue4qlviPUuqu23aVx9vNS2C1Gg+0Z+/ufFl5rEh0GHk=" + }, + { + "mvn-path": "clj-time/clj-time/0.12.0/clj-time-0.12.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-W80Km+OjpCtVMpfHoWx+NNEIjdjLVm+Bk7qpdn/bL1s=" + }, + { + "mvn-path": "clj-time/clj-time/0.12.0/clj-time-0.12.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-5IimaydoUvXS4ensGsD8K/Lu/8i2yW3MJtVdKZW+nYA=" + }, + { + "mvn-path": "cljs-bean/cljs-bean/1.9.0/cljs-bean-1.9.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-+AnGacTryHoaxhuH3ycSrnNyzvsz+hs8uSL1gRfdK4k=" + }, + { + "mvn-path": "cljs-bean/cljs-bean/1.9.0/cljs-bean-1.9.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-LlBzQ7IZfDspABA7s4YuOPerwCtg5zw5k1baIJNF/+E=" + }, + { + "mvn-path": "clojure-humanize/clojure-humanize/0.2.2/clojure-humanize-0.2.2.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-Jiy16D/JdB88J3z9aRMMv4e+LB3bk0YpWfPXVEmBsvw=" + }, + { + "mvn-path": "clojure-humanize/clojure-humanize/0.2.2/clojure-humanize-0.2.2.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-p5rqR6+uKD5FQ2YJC2naPOOFY07OjgatqoWMJEq61dc=" + }, + { + "mvn-path": "clojurewerkz/scrypt/1.2.0/scrypt-1.2.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-vjrRy2bX1Wu2t2miWbKMh1Nn1ScMrtn/CL1NPa2MXB4=" + }, + { + "mvn-path": "clojurewerkz/scrypt/1.2.0/scrypt-1.2.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-5jscaPbkfo230knyPvy1KxbPuxRHMymu+IAM3H3qB9U=" + }, + { + "mvn-path": "com/andrewmcveigh/cljs-time/0.4.0/cljs-time-0.4.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-cxzmycIHOz946J0UR1fYIuITgqKDSTSBpMKFiHW37IU=" + }, + { + "mvn-path": "com/andrewmcveigh/cljs-time/0.4.0/cljs-time-0.4.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-e23XnFNjiQ2tmlvZW2GAH8qYxlk1bCGmz8I3ut0E0kU=" + }, + { + "mvn-path": "com/bhauman/cljs-test-display/0.1.1/cljs-test-display-0.1.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-wfIbDzHs05iSH0QtN0ydvKeCASKeeuIA5Ob2kw5MCYw=" + }, + { + "mvn-path": "com/bhauman/cljs-test-display/0.1.1/cljs-test-display-0.1.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-8A0G0Ydh+gYIoT/zoxWhs4Rqzc+6Y/bb30DXlryeV9g=" + }, + { + "mvn-path": "com/bhauman/rebel-readline/0.1.11/rebel-readline-0.1.11.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-zVfJWcAQbxX9H49WEP6K0AMHo13iwlmU8/2IMeaNVUE=" + }, + { + "mvn-path": "com/bhauman/rebel-readline/0.1.11/rebel-readline-0.1.11.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-jtA/cq9RbGa3T8n6pG+RZV2RJ8XPS8DU51T1r67sgxc=" + }, + { + "mvn-path": "com/clojure-goes-fast/clj-async-profiler/2.0.0-beta1/clj-async-profiler-2.0.0-beta1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-JXL1jM84bkYcW97RBWEi+llVx23Ijj8r+dTXuf0KbxQ=" + }, + { + "mvn-path": "com/clojure-goes-fast/clj-async-profiler/2.0.0-beta1/clj-async-profiler-2.0.0-beta1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-Y1reQIQLSc8XvUGkx2dyiIknPSWRVjnPUEqsO1p+4Ks=" + }, + { + "mvn-path": "com/cognitect/aws/api/0.8.824/api-0.8.824.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-RBmtWT9d0YUhAKpPs0r+H/VLHyQlGIZma6MNtcxBaew=" + }, + { + "mvn-path": "com/cognitect/aws/api/0.8.824/api-0.8.824.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-lPF0TXwF+fNYpJAonkbakNboLHAuqRDcyHZoBi8nkbg=" + }, + { + "mvn-path": "com/cognitect/aws/endpoints/871.2.44.12/endpoints-871.2.44.12.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Lhwq23mLdOCNw7t1VE5fmQflT0mW3Lqo0ZyJOqFq/yY=" + }, + { + "mvn-path": "com/cognitect/aws/endpoints/871.2.44.12/endpoints-871.2.44.12.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-SmV3zuMAjvFUj+DxjvmKV8B3lDAg7iwv4/Yuzub6QLc=" + }, + { + "mvn-path": "com/cognitect/aws/s3/871.2.43.0/s3-871.2.43.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-YTNB32oKKVGA79oZ/xDquJNLhgmreqgmjEoC9PMwYC0=" + }, + { + "mvn-path": "com/cognitect/aws/s3/871.2.43.0/s3-871.2.43.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-APBxjbsG2SvUfL+a8IqCms6Vo0RsR878O3PcMVFny1o=" + }, + { + "mvn-path": "com/cognitect/transit-clj/1.0.333/transit-clj-1.0.333.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-h2ulOH2EfKM1RH6jSt9UKxfRsHdI7L3JAahwv8x3qDM=" + }, + { + "mvn-path": "com/cognitect/transit-clj/1.1.363/transit-clj-1.1.363.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-vnISkDNKlgAvb75lZrBy/YmOYgveZCPtNhBunm9aVwE=" + }, + { + "mvn-path": "com/cognitect/transit-clj/1.1.363/transit-clj-1.1.363.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-bzbdiLF1U1+qT1iLgzYlW49/eW/XheSWo3+H3N+pgs8=" + }, + { + "mvn-path": "com/cognitect/transit-cljs/0.8.280/transit-cljs-0.8.280.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-FXrUww5BYhTCmZe68m3tJ30FxLQyGWd9KxADyAFoHBo=" + }, + { + "mvn-path": "com/cognitect/transit-cljs/0.8.280/transit-cljs-0.8.280.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-2i3EJFGnQrd3AFBqyfQhF6jDH0Roh4jA4SDOx8lUXak=" + }, + { + "mvn-path": "com/cognitect/transit-java/1.0.362/transit-java-1.0.362.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-0dY8gBS4tmQt0KrHBjNmv/y47d1Y4nYv2oyCtFtv58E=" + }, + { + "mvn-path": "com/cognitect/transit-java/1.1.406/transit-java-1.1.406.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-zWcQX3PAGQ91lxrM+2iUzK1o+4ipek/tkWb/sc/rBw4=" + }, + { + "mvn-path": "com/cognitect/transit-java/1.1.406/transit-java-1.1.406.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-73nrZYTkvnU8RDR711QPTitVk4GiFfEJsdc9XDs3qE0=" + }, + { + "mvn-path": "com/cognitect/transit-js/0.8.874/transit-js-0.8.874.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-rW5L0taVVl2nnrWAIMlmXSKFDWs5y4b4Mwu22ju/CQk=" + }, + { + "mvn-path": "com/cognitect/transit-js/0.8.874/transit-js-0.8.874.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-J7yW4q+cn66bWF0QAHRTLp9FRZ9R3QYJA50TjHqtUbg=" + }, + { + "mvn-path": "com/fasterxml/jackson/core/jackson-annotations/2.22/jackson-annotations-2.22.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Id21mIB9OlGodnBOuXnZKW4cam9Hqxgm/4jG1qEnotA=" + }, + { + "mvn-path": "com/fasterxml/jackson/core/jackson-annotations/2.22/jackson-annotations-2.22.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-OMO6UqDq3j4+rMWxNJnVbhA4zLrY7Eu3lCbcIUMrRtA=" + }, + { + "mvn-path": "com/fasterxml/jackson/core/jackson-core/2.21.1/jackson-core-2.21.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Dz+1656JcESawMuY4vjntRPS1OxbGk8C4id45Pe6uNc=" + }, + { + "mvn-path": "com/fasterxml/jackson/core/jackson-core/2.22.2/jackson-core-2.22.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-/xZ6Yxe+FYlXBsJmaPRbiY7+QKuHgJcGWCEP4Tk9UqY=" + }, + { + "mvn-path": "com/fasterxml/jackson/core/jackson-core/2.22.2/jackson-core-2.22.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-0oKc/vTDDSAOBNf2UAm0sRKkY4Kq30U0ow3X+QyxZOU=" + }, + { + "mvn-path": "com/fasterxml/jackson/core/jackson-databind/2.21.1/jackson-databind-2.21.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-vUgX0LkXlK/29LEWtXa/7ckne+LWxlHJVm9VIiLGpVA=" + }, + { + "mvn-path": "com/fasterxml/jackson/core/jackson-databind/2.22.2/jackson-databind-2.22.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-0NoUwSsWtdVHGaoXLYO1Qv9Kvriw+320dv3ozuznYMo=" + }, + { + "mvn-path": "com/fasterxml/jackson/core/jackson-databind/2.22.2/jackson-databind-2.22.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-qQOqxCIXJXgzQcjH0wzO5DwbWvZ/8BMl0sW8iG0AlB8=" + }, + { + "mvn-path": "com/fasterxml/jackson/dataformat/jackson-dataformat-cbor/2.17.0/jackson-dataformat-cbor-2.17.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-1wUMteYihI1b44KEixeS6CRNUp4kyEuhzCeqvySW/js=" + }, + { + "mvn-path": "com/fasterxml/jackson/dataformat/jackson-dataformat-cbor/2.17.0/jackson-dataformat-cbor-2.17.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Niz1VWDxh5GL5n6L0ej33T5VKZU/uPKNv1x/m8MInQE=" + }, + { + "mvn-path": "com/fasterxml/jackson/dataformat/jackson-dataformat-smile/2.17.0/jackson-dataformat-smile-2.17.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-5rK/KlPR+I7ALxgz2iTCCKopmHbkfTf3kgseg+IUuqs=" + }, + { + "mvn-path": "com/fasterxml/jackson/dataformat/jackson-dataformat-smile/2.17.0/jackson-dataformat-smile-2.17.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-5TCGlsx1wvikpUtqajPIVfLI1MpDA09HDfGBoxJv9Ag=" + }, + { + "mvn-path": "com/fasterxml/jackson/dataformat/jackson-dataformats-binary/2.17.0/jackson-dataformats-binary-2.17.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-En8herLMwy5yGiCNxdGNERJq+Q+tvdeL/Hjq4fcT/mY=" + }, + { + "mvn-path": "com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.21.2/jackson-datatype-jsr310-2.21.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-oIPVfNHEoo/vzGvQcXQHeet/wcIqPBtARRtUd8RD8C8=" + }, + { + "mvn-path": "com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.21.2/jackson-datatype-jsr310-2.21.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-0Fd4iCjfgV6Y4BjJsAQBoR4boyctNNmEdqc2rG2X734=" + }, + { + "mvn-path": "com/fasterxml/jackson/jackson-base/2.17.0/jackson-base-2.17.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-w9lEq1Kiy2/0VJ3O6wTUIajeYyo8yl3UVPq8f1KsMeI=" + }, + { + "mvn-path": "com/fasterxml/jackson/jackson-base/2.21.2/jackson-base-2.21.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-OMeJjHY7iZH/+9dpRZly4Bdr8MUFxzlRjHD3xX0W7tc=" + }, + { + "mvn-path": "com/fasterxml/jackson/jackson-base/2.22.2/jackson-base-2.22.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-qMgpgr3NZOW3zIV1oEWeq1PVNagwnWlmJ0yTU241QjQ=" + }, + { + "mvn-path": "com/fasterxml/jackson/jackson-bom/2.17.0/jackson-bom-2.17.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-SWSsYtWw5Ne/Vuz4sscC+pkUGCpfwtLnZvTPdoZP0qU=" + }, + { + "mvn-path": "com/fasterxml/jackson/jackson-bom/2.19.2/jackson-bom-2.19.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-IgBr5w/QGAmemcbCesCYIyDzoPPCzgU8VXA1eaXuowM=" + }, + { + "mvn-path": "com/fasterxml/jackson/jackson-bom/2.21.2/jackson-bom-2.21.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-vGxUnmMpJ7udigraIMhGe1AH07eXx/XbA6m2DR3lm+M=" + }, + { + "mvn-path": "com/fasterxml/jackson/jackson-bom/2.22.2/jackson-bom-2.22.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-qTrVuEYvjVkgsShkepufI2NCtP1OcSh9qfcYf9hkLwI=" + }, + { + "mvn-path": "com/fasterxml/jackson/jackson-parent/2.17/jackson-parent-2.17.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-rubeSpcoOwQOQ/Ta1XXnt0eWzZhNiSdvfsdWc4DIop0=" + }, + { + "mvn-path": "com/fasterxml/jackson/jackson-parent/2.19.3/jackson-parent-2.19.3.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-I9GGyNjNBgFdAixxDHFUI9Zg1J4pc7FYcLApzCYBhoI=" + }, + { + "mvn-path": "com/fasterxml/jackson/jackson-parent/2.21/jackson-parent-2.21.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-OFHfYn+utGiHuVYQRjC3Sou7X33iLpdM8VmC4g4Dc94=" + }, + { + "mvn-path": "com/fasterxml/jackson/jackson-parent/2.22/jackson-parent-2.22.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-fUWn77ad8ge+18xUuHoLsBLxCVLAlVcKJztJSF2g0Sk=" + }, + { + "mvn-path": "com/fasterxml/jackson/module/jackson-modules-java8/2.21.2/jackson-modules-java8-2.21.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-T0KMISebw0vUTVHCeWdB53r9f523/0qTGkPHsBocRZU=" + }, + { + "mvn-path": "com/fasterxml/oss-parent/58/oss-parent-58.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-VnDmrBxN3MnUE8+HmXpdou+qTSq+Q5Njr57xAqCgnkA=" + }, + { + "mvn-path": "com/fasterxml/oss-parent/69/oss-parent-69.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-OFbVhKqhyOM86UxnJE9x9vcFOKJZ/+jngXYbn6qth18=" + }, + { + "mvn-path": "com/fasterxml/oss-parent/75/oss-parent-75.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-/LvxwYyQR+aRfThPIGTiG0Klj8hfsFI6ni4BXv98YZ0=" + }, + { + "mvn-path": "com/fasterxml/oss-parent/79/oss-parent-79.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-kga33Wf7E4A2V2w9/KlHoqjz4sTS2cHy0d6lGbOk2uE=" + }, + { + "mvn-path": "com/github/ben-manes/caffeine/caffeine/3.2.4/caffeine-3.2.4.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-nZ0s/Wgf2Sct7T0nyZMNsS+J9zI0WXWqET68Iju/EiQ=" + }, + { + "mvn-path": "com/github/ben-manes/caffeine/caffeine/3.2.4/caffeine-3.2.4.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Yk7J/FOOGmGJZN+p+M+TRENWB8WORagYN456ZD1OCbM=" + }, + { + "mvn-path": "com/github/luben/zstd-jni/1.5.7-12/zstd-jni-1.5.7-12.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-M2YclDmgiYxMyETWdb71b26nLhEHkXPDz8jzUsbnPww=" + }, + { + "mvn-path": "com/github/luben/zstd-jni/1.5.7-12/zstd-jni-1.5.7-12.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-kvABhLKWCGZPe00pEUbWzenMbWg358nFPjg5XkTMtqo=" + }, + { + "mvn-path": "com/github/seancorfield/next.jdbc/1.3.1118/next.jdbc-1.3.1118.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-OHViv6htwaWkAqBqBOjjs1P4JVDSltdV5efOTBJCdcQ=" + }, + { + "mvn-path": "com/github/seancorfield/next.jdbc/1.3.1118/next.jdbc-1.3.1118.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-kjrKCtp4rAXY3eZXZQABApyEge1kyahbC7M/+1keEKs=" + }, + { + "mvn-path": "com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-GYidvfGyVLJgGl7mRbgUepdGRIgil2hMeYr+XWPXjf4=" + }, + { + "mvn-path": "com/google/code/gson/gson-parent/2.13.2/gson-parent-2.13.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-g6tSip1Q/XauuK1vcns+6ct2ZYYlV3TtFsqMTHbZ2s0=" + }, + { + "mvn-path": "com/google/code/gson/gson/2.13.2/gson-2.13.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-3QzhtVo+0ggMtw+cZVhQzahsIGhiMQAJ3LXlyVJlpeA=" + }, + { + "mvn-path": "com/google/code/gson/gson/2.13.2/gson-2.13.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-OqBqp8D5rwkpYaQtCVeOQyS+FGNIoO5u1HhX98Jne3Y=" + }, + { + "mvn-path": "com/google/errorprone/error_prone_annotations/2.41.0/error_prone_annotations-2.41.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-pW54K1tQgRrCBAc6NVoh2RWiEH/OE+xxEzGtA29mD8w=" + }, + { + "mvn-path": "com/google/errorprone/error_prone_annotations/2.41.0/error_prone_annotations-2.41.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-oVHfHi4LSGGNiwahgHSKKbOrs5sbI5b2och5pydIjG4=" + }, + { + "mvn-path": "com/google/errorprone/error_prone_annotations/2.50.0/error_prone_annotations-2.50.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-RmdySHfx03pokgLaGR4j76dlfGLu+TzNrEBuzP5c3Qo=" + }, + { + "mvn-path": "com/google/errorprone/error_prone_annotations/2.50.0/error_prone_annotations-2.50.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-caBoDSdzJLq0a+xLAPbxEcG3lKkx0NjNp5vLkkaYL5I=" + }, + { + "mvn-path": "com/google/errorprone/error_prone_parent/2.41.0/error_prone_parent-2.41.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-xTg4jXYKXByY3PBvbtPP5fEaZRgn21y9LtgojHlcrUI=" + }, + { + "mvn-path": "com/google/errorprone/error_prone_parent/2.50.0/error_prone_parent-2.50.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-q/RaAZ2xJbUP9VE07Cr5SuNRl2EDit8KYLm9e0uLYlQ=" + }, + { + "mvn-path": "com/google/guava/failureaccess/1.0.3/failureaccess-1.0.3.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-y/w5BrGbj1XdfP1t/gqkUy6DQlDX8IC9jSEaPiRrWcs=" + }, + { + "mvn-path": "com/google/guava/failureaccess/1.0.3/failureaccess-1.0.3.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-xUvv839tQtQ+FHItVKUiya1R75f8W3knfmKj6/iC87s=" + }, + { + "mvn-path": "com/google/guava/guava-parent/26.0-android/guava-parent-26.0-android.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-+GmKtGypls6InBr8jKTyXrisawNNyJjUWDdCNgAWzAQ=" + }, + { + "mvn-path": "com/google/guava/guava-parent/33.4.0-android/guava-parent-33.4.0-android.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ciDt5hAmWW+8cg7kuTJG+i0U8ygFhTK1nvBT3jl8fYM=" + }, + { + "mvn-path": "com/google/guava/guava-parent/33.7.1-jre/guava-parent-33.7.1-jre.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-QBXmFaVnR1XIjYES2LvXY+iv3lYb52xnkGme211WCPU=" + }, + { + "mvn-path": "com/google/guava/guava/33.7.1-jre/guava-33.7.1-jre.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-eW2OKKxk6DpHxMWTWo/sxGgmUKBLverXOO8PWjoObEY=" + }, + { + "mvn-path": "com/google/guava/guava/33.7.1-jre/guava-33.7.1-jre.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-tbOA2yMtjZVkV/Ekpf+O00lY4HTc0gZRQEtSKYau/tw=" + }, + { + "mvn-path": "com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-s3KgN9QjCqV/vv/e8w/WEj+cDC24XQrO0AyRuXTzP5k=" + }, + { + "mvn-path": "com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-GNSx2yYVPU5VB5zh92ux/gXNuGLvmVSojLzE/zi4Z5s=" + }, + { + "mvn-path": "com/google/j2objc/j2objc-annotations/3.1/j2objc-annotations-3.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-hNOhUFGEhfgUDqmbiphWVnSWKfZDPJK4DHWzaro7CZs=" + }, + { + "mvn-path": "com/google/j2objc/j2objc-annotations/3.1/j2objc-annotations-3.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-FFcIOFAANPwbR8ggXOHJ1rJVwczdLRr9zcv3XomySjM=" + }, + { + "mvn-path": "com/google/javascript/closure-compiler-main/v20250820/closure-compiler-main-v20250820.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-RTpfmhncT1tiQ5lFixbbzxInqVrqEWXHrjtzk6JSJrg=" + }, + { + "mvn-path": "com/google/javascript/closure-compiler-main/v20260824/closure-compiler-main-v20260824.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-0VdBRCsDTY2DjejP0UdikNHOkUwm6FZ2yYgJ+6kuvpQ=" + }, + { + "mvn-path": "com/google/javascript/closure-compiler-parent/v20250820/closure-compiler-parent-v20250820.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-TGLuEwK/LAQmDdxPd8klnb9XPzERw66RfUQTowmrGbA=" + }, + { + "mvn-path": "com/google/javascript/closure-compiler-parent/v20260824/closure-compiler-parent-v20260824.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-OS2l9LJD1tDkrwqJo0Kp2d7W+xyiVJChFJIy8vX2Y+U=" + }, + { + "mvn-path": "com/google/javascript/closure-compiler/v20250820/closure-compiler-v20250820.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Fx0kNU/+fc03j+Tfsw5Gc4WTkfTaEacLoE/awN1NgtI=" + }, + { + "mvn-path": "com/google/javascript/closure-compiler/v20250820/closure-compiler-v20250820.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-CWl7ACHLp1ZL6TDjz0+xBY02nFDr4pig8/CciwuBq60=" + }, + { + "mvn-path": "com/google/javascript/closure-compiler/v20260824/closure-compiler-v20260824.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-LVZkgMCvTnKIMtdTQZLyt0rW9f/z1I6zLfdsoMNZTag=" + }, + { + "mvn-path": "com/google/javascript/closure-compiler/v20260824/closure-compiler-v20260824.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-uo8WhYLV43Nzmokds98ysgiFLMXMLjZ4nJ6l8KCpdvE=" + }, + { + "mvn-path": "com/googlecode/java-diff-utils/diffutils/1.3.0/diffutils-1.3.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-YbpNxJrcqVJDvqoFaa3CojrttSkq54qgEYb6eC69xcI=" + }, + { + "mvn-path": "com/googlecode/java-diff-utils/diffutils/1.3.0/diffutils-1.3.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-L+Md1jCbD18ZW73EdJz8CvBl1h8Gz+GD39LyCSq4R7Y=" + }, + { + "mvn-path": "com/lambdaworks/scrypt/1.4.0/scrypt-1.4.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-moLSGAmfsUwQwOhufu/uvYwQTekgrNxHuLS3pob7c7Q=" + }, + { + "mvn-path": "com/lambdaworks/scrypt/1.4.0/scrypt-1.4.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ayT557tiVQJB4oYof1J6fcRjZpoLfPWs3lmemYQt5yE=" + }, + { + "mvn-path": "com/nextjournal/beholder/1.0.2/beholder-1.0.2.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-iQOMTbidIDu1sSpfsa2qkpXgWirEsk+u2ZbJNOqJ0Xo=" + }, + { + "mvn-path": "com/nextjournal/beholder/1.0.2/beholder-1.0.2.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-LRJkSGdQPfLoeGjLwU3deFKoaum2dW/QJ46lCK0d4u4=" + }, + { + "mvn-path": "com/sun/activation/all/1.2.0/all-1.2.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-HYUY46x1MqEE5Pe+d97zfJguUwcjxr2z1ncIzOKwwsQ=" + }, + { + "mvn-path": "com/sun/activation/all/2.0.1/all-2.0.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ZI1dYrYVP0LxkM7S1ucMHmRCVQyc/rZvvuCWHGYWssw=" + }, + { + "mvn-path": "com/sun/activation/jakarta.activation/2.0.1/jakarta.activation-2.0.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ueJLfdbgdJVWLqllMb4xMMltuk144d/Yitu96/QzKHE=" + }, + { + "mvn-path": "com/sun/activation/jakarta.activation/2.0.1/jakarta.activation-2.0.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-igaFktsI5oUyBP8LYlowFDjjw26l8a5lur/tIIUCeBo=" + }, + { + "mvn-path": "com/sun/mail/all/2.0.2/all-2.0.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-0Zi8FsYidzRJuqQqimilBWfI8xpxtxQYhU4OSMP52Z4=" + }, + { + "mvn-path": "com/sun/mail/jakarta.mail/2.0.2/jakarta.mail-2.0.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-U28K5d13TiV/MGTxmiuYKqVgcsB8Z1xw+YzcJiBHtLU=" + }, + { + "mvn-path": "com/sun/mail/jakarta.mail/2.0.2/jakarta.mail-2.0.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-rZvC+brXdyeGhSJE1AzdlUDCCdG3grWo4tf8lD+rxd0=" + }, + { + "mvn-path": "com/thheller/shadow-http/0.1.9/shadow-http-0.1.9.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-8g1mZ7A37Ol0By8BGiPsy3e6cCzB5Omt2oOyoXIWybo=" + }, + { + "mvn-path": "com/thheller/shadow-http/0.1.9/shadow-http-0.1.9.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-BlyBmz+Tx+e+nfCvFFZggm8P7O9i5nD0Hnphlp+Htb0=" + }, + { + "mvn-path": "com/unboundid/unboundid-ldapsdk/5.1.1/unboundid-ldapsdk-5.1.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-pDQyAxsORZLswWwh04LPvdn5jVAvFn9+/oaXq09Efrk=" + }, + { + "mvn-path": "com/unboundid/unboundid-ldapsdk/5.1.1/unboundid-ldapsdk-5.1.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-w6xcAY5WK8G4gm92pX0qY7sf0uKzCo8m7dSBPrEvztg=" + }, + { + "mvn-path": "com/yahoo/platform/yui/yuicompressor/2.4.8/yuicompressor-2.4.8.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-mA18L+GkTK0JhB1vSm96tt0GNBoQ0iRDMLmAKrTYE9I=" + }, + { + "mvn-path": "com/yahoo/platform/yui/yuicompressor/2.4.8/yuicompressor-2.4.8.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-TPwYEly4a/83z2zYAK+k68ryomzS+ZrGLtooqHO4s5c=" + }, + { + "mvn-path": "com/zaxxer/HikariCP/7.1.0/HikariCP-7.1.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-K+RcZBuEHoHfhykuGB8sIDUAxfDpoWdvE1knOH889As=" + }, + { + "mvn-path": "com/zaxxer/HikariCP/7.1.0/HikariCP-7.1.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-W43yaZkz6omKpQ1N70/CImsV5vTZk+NzoWBw9+1IAhY=" + }, + { + "mvn-path": "commons-codec/commons-codec/1.15/commons-codec-1.15.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-s+n21jp5AQm/DQVmEfvtHPaQVYJt7+uYlKcTadJG7WM=" + }, + { + "mvn-path": "commons-codec/commons-codec/1.15/commons-codec-1.15.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-yG7hmKNaNxVIeGD0Gcv2Qufk2ehxR3eUfb5qTjogq1g=" + }, + { + "mvn-path": "commons-codec/commons-codec/1.17.1/commons-codec-1.17.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-+fbLED8t3DyZqdgK2irnvwaFER/Wv/zLcgM9HaTm/yM=" + }, + { + "mvn-path": "commons-codec/commons-codec/1.17.1/commons-codec-1.17.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-f6DbTYFQ2vkylYuK6onuJKu00Y4jFqXeU1J4/BMVEqA=" + }, + { + "mvn-path": "commons-codec/commons-codec/1.18.0/commons-codec-1.18.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-dLkW2ksDhMYZ5t1MGN7+iqQ4f3lSBSU8+0u7L0WM3c4=" + }, + { + "mvn-path": "commons-codec/commons-codec/1.21.0/commons-codec-1.21.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-TahRy2q/uYv+nrd8Xl/Ef1QU+ii5TiG3/ZpkZwXcFn8=" + }, + { + "mvn-path": "commons-codec/commons-codec/1.21.0/commons-codec-1.21.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-sjBBa6b1v534/Lbn9KbCa4+w/oXONx0T1YRu03aDCbc=" + }, + { + "mvn-path": "commons-io/commons-io/2.16.1/commons-io-2.16.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-9B97qs1xaJZEes6XWGIfYsHGsKkdiazuSI2ib8R3yE8=" + }, + { + "mvn-path": "commons-io/commons-io/2.16.1/commons-io-2.16.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-V3fSkiUceJXASkxXAVaD7Ds1OhJIbJs+cXjpsLPDj/8=" + }, + { + "mvn-path": "commons-io/commons-io/2.20.0/commons-io-2.20.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-35C7oP48tYa38WTnj+j49No/LdXCf6ZF+IgQDMwl3XI=" + }, + { + "mvn-path": "commons-io/commons-io/2.20.0/commons-io-2.20.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-vb34EHLBkO6aixgaXFj1vZF6dQ+xOiVt679T9dvTOio=" + }, + { + "mvn-path": "compliment/compliment/0.8.0/compliment-0.8.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-vapF9qfX0hZcNA18vnF5Z+Oge8ESroR4mcasf63BHuo=" + }, + { + "mvn-path": "compliment/compliment/0.8.0/compliment-0.8.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-uarq8/sQYzHkk1NKT+b3yLdy9+PJKEXhQbkRDhsbu38=" + }, + { + "mvn-path": "criterium/criterium/0.4.6/criterium-0.4.6.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-r14UbxCZd9XNA1vAzjlOySebIySQBp8ErsaO5Mi8FY4=" + }, + { + "mvn-path": "criterium/criterium/0.4.6/criterium-0.4.6.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-Lb9Ysv6gyT1w02RS6Rf+soFUNpnPGzs+IrGl6cpol0k=" + }, + { + "mvn-path": "crypto-equality/crypto-equality/1.0.1/crypto-equality-1.0.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-7hXMC3bc9z+PyG0C6e/+1xYKimtAsvDp3nLj3SXtS98=" + }, + { + "mvn-path": "crypto-equality/crypto-equality/1.0.1/crypto-equality-1.0.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-Yy5XAtXTVhk9GKUN4KJhoZwUqtYIc05GToWjYA509Es=" + }, + { + "mvn-path": "crypto-random/crypto-random/1.2.1/crypto-random-1.2.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-XBKIRte2bVPF6XJnc7hy9+AoRP9lGplqXjRSoVI65Sw=" + }, + { + "mvn-path": "crypto-random/crypto-random/1.2.1/crypto-random-1.2.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-2OgLA0KFMl6QX1RkmhWYtoe5pKmaOk9LlO7TWXyyEEg=" + }, + { + "mvn-path": "dawran6/emoji/0.2.0/emoji-0.2.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-qFoOGQusxRw2GmRpHWfYvVrfSuzPN4FzZVtjJMqbfdw=" + }, + { + "mvn-path": "dawran6/emoji/0.2.0/emoji-0.2.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-l7KmJ+SdW3iGAvbFJ/F5TBDkvdvysWiXh/g9P9T4Ajo=" + }, + { + "mvn-path": "dev/weavejester/cljfmt/0.13.0/cljfmt-0.13.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-JrR6biafbRqMIVzwhvcuYK7gpOtO6sw+CQdSQyNqt7g=" + }, + { + "mvn-path": "dev/weavejester/cljfmt/0.13.0/cljfmt-0.13.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-M+OK7KqWzeLkgCwUlM+vQV/GKhxKYDYHbBqlJ8VtHMM=" + }, + { + "mvn-path": "environ/environ/1.2.0/environ-1.2.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-1MHn6pEYjPR0AEv68o7Nv3Qglngh1FuYV1IdeUVwsvI=" + }, + { + "mvn-path": "environ/environ/1.2.0/environ-1.2.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-kw4TwBIP8H5JgUkwqQyCfvyM2IlTiIBKBi0SjbT84s0=" + }, + { + "mvn-path": "eu/maveniverse/maven/mima/context/2.4.44/context-2.4.44.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-gfDatMXwz1mlP6+LhklgsWKdfX8XTwwm7WMZ4v7BmE0=" + }, + { + "mvn-path": "eu/maveniverse/maven/mima/context/2.4.44/context-2.4.44.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-EeJVfdVWB0JsYK9F2PA/xLxddEhMT9SZiutBtATerz8=" + }, + { + "mvn-path": "eu/maveniverse/maven/mima/extensions/extensions/2.4.44/extensions-2.4.44.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-81T1IDsnUMaITrFWTvntZBMTWj6m3fpEBeWDUKU+SYI=" + }, + { + "mvn-path": "eu/maveniverse/maven/mima/extensions/mhc4/2.4.44/mhc4-2.4.44.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-pDOAyyEjtgbSRA0U273+kgjR3D82VZcZgp+Ux5HCiF8=" + }, + { + "mvn-path": "eu/maveniverse/maven/mima/extensions/mhc4/2.4.44/mhc4-2.4.44.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-R6PmpKpHrurrM+dN/wTys+fBKT3b1Oi1ZgHM09vVJAg=" + }, + { + "mvn-path": "eu/maveniverse/maven/mima/extensions/mmr/2.4.44/mmr-2.4.44.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-bd9E6nbJrWCv79CfElW5eT7e5jVgvORpmiQKvxaKqvI=" + }, + { + "mvn-path": "eu/maveniverse/maven/mima/extensions/mmr/2.4.44/mmr-2.4.44.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-vUPigm9Nz5g02HKwo7Tpoyo9YqP1vVwNNY9aFB2VjOo=" + }, + { + "mvn-path": "eu/maveniverse/maven/mima/mima/2.4.44/mima-2.4.44.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Mm5P/cQqwQeN4XPfSrZ+PFxglAKyCsT7neLrWKpjjOQ=" + }, + { + "mvn-path": "eu/maveniverse/maven/mima/runtime/runtime/2.4.44/runtime-2.4.44.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-EIQsu6ugdbYqDg++RNldpT1a5Pk75gbVMqVbJpTkl0c=" + }, + { + "mvn-path": "eu/maveniverse/maven/mima/runtime/standalone-shared/2.4.44/standalone-shared-2.4.44.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ruXnwHf3lo2pvwuhG9IFdOBU7XXqcQZabdRVLah7IaI=" + }, + { + "mvn-path": "eu/maveniverse/maven/mima/runtime/standalone-shared/2.4.44/standalone-shared-2.4.44.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-RWTJRMySzrqgtgRFZ/j0My7ZTDadse5cYEj9VnKd7S4=" + }, + { + "mvn-path": "eu/maveniverse/maven/mima/runtime/standalone-static/2.4.44/standalone-static-2.4.44.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-6fKYHp8ycjt0VprFqCmr0ONL9qWWHR5leNeyhP7cNuQ=" + }, + { + "mvn-path": "eu/maveniverse/maven/mima/runtime/standalone-static/2.4.44/standalone-static-2.4.44.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-lmX+putJbSGSPFNiCnK8Eaoot85KqfdDwA/VhH4m/yU=" + }, + { + "mvn-path": "eu/maveniverse/maven/parent/parent/52/parent-52.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-7AwmlNmVghhQaGH3CkwgLvp0bXZ1s6Yd3Nlb5DcV9qs=" + }, + { + "mvn-path": "expound/expound/0.9.0/expound-0.9.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-1qNyYJkY4DUb+mqL1pPRi8GZ6Lp6r67BHola+uAY+Vw=" + }, + { + "mvn-path": "expound/expound/0.9.0/expound-0.9.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-kJSODD3MvE8aCvaABWue2JizAcvtLd4/9CR5eWmXxdk=" + }, + { + "mvn-path": "fipp/fipp/0.6.26/fipp-0.6.26.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-p+xjV7gTIRMv0HwvV+/rAhFEFVlDY9g6FDE6GU9fVTU=" + }, + { + "mvn-path": "fipp/fipp/0.6.27/fipp-0.6.27.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-ugagpDW5XBNQMTr+1z3s6r5TXwbF/pw6Ffrcc4Tzlvk=" + }, + { + "mvn-path": "fipp/fipp/0.6.29/fipp-0.6.29.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-22eJoDXAE84RqZHrOBiILWjUf6ap7uRiey4NnhvvBfI=" + }, + { + "mvn-path": "fipp/fipp/0.6.29/fipp-0.6.29.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-OqX0rRj77alJ4fa8hN3RHgnc6rR/JUwJCJY6o4LwCcU=" + }, + { + "mvn-path": "fipp/fipp/0.6.8/fipp-0.6.8.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-rvszzweiE9RL6FjpAnnf+9I67a0MV31St9irKBOpe0o=" + }, + { + "mvn-path": "frankiesardo/linked/1.3.0/linked-1.3.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-+VKx2VpfXMEFrI/5ZlbdElQNXqKOMfaOEBd4gg8gTTo=" + }, + { + "mvn-path": "frankiesardo/linked/1.3.0/linked-1.3.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-lonczS2VlUlRVfGt2Gp+TolAmpehycO3HI3rZcr7kiU=" + }, + { + "mvn-path": "funcool/cuerdas/2026.415/cuerdas-2026.415.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-Cj5FToYWnHdHd50uVgovDJ+jcDO048Fgv1VOqBOWa38=" + }, + { + "mvn-path": "funcool/cuerdas/2026.415/cuerdas-2026.415.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-VxMBcuV+az/JMmkBXe91X82Dk5sDBLMM5kNsSjF1vCs=" + }, + { + "mvn-path": "funcool/okulary/2022.04.11-16/okulary-2022.04.11-16.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-oGk48cctYN9H6flYQ00EEE13Zng4ADWKV+/uREUQUvA=" + }, + { + "mvn-path": "funcool/okulary/2022.04.11-16/okulary-2022.04.11-16.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-/W9zGdROKN1+/Hdx3vwMs/BjZ3ibl39RC6086pPY97Q=" + }, + { + "mvn-path": "funcool/promesa/12.0.1/promesa-12.0.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-NTZ+KAcouuG9lrOSkRPT/wmqU0LPXTkoR/u5kwpfqxk=" + }, + { + "mvn-path": "funcool/promesa/12.0.1/promesa-12.0.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-unbolnx1hkx4DjiyyTplEy0h2+MZADVg6FvhkD6d/tU=" + }, + { + "mvn-path": "hawk/hawk/0.2.11/hawk-0.2.11.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-6UPy8MSHxsWmsg5wzpHdXzHkBIlXCRe7oT/OpzyaekM=" + }, + { + "mvn-path": "hawk/hawk/0.2.11/hawk-0.2.11.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-q4PzoWHUY53W2TZWihPpw+qXB4QWWVnS1iW3WlvIxFg=" + }, + { + "mvn-path": "hiccup/hiccup/1.0.5/hiccup-1.0.5.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-D9Sn5HRh29rnILaEsZcWTrtpO7Y1jI4UZ/+nhwdsB/w=" + }, + { + "mvn-path": "hiccup/hiccup/1.0.5/hiccup-1.0.5.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-OGBZ1P4rXyKX6peRwllnGDM6eQAIgsOfyZqXSEPA5VI=" + }, + { + "mvn-path": "instaparse/instaparse/1.5.0/instaparse-1.5.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-wrzW86dNGhFJc+asceNTb2sDXyn3aenR7FKP/l5WzCc=" + }, + { + "mvn-path": "instaparse/instaparse/1.5.0/instaparse-1.5.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-7Vh2tzj7zXYdGd03xiyTExP/beuWSi8Nn1NmRKkw9bQ=" + }, + { + "mvn-path": "integrant/integrant/1.0.1/integrant-1.0.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-dHxoCJNqPEcXakMdx6T89cQKH7ZQf9LmZtMO4fzr7f0=" + }, + { + "mvn-path": "integrant/integrant/1.0.1/integrant-1.0.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-zaEWby3a9q8gwevhNdchEwERgzbUG9NgqSBQ83C3Wdo=" + }, + { + "mvn-path": "io/aviso/pretty/1.4.4/pretty-1.4.4.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-rPhPtW+jNgJze/PNvQVMxBd7qhhqPqKTZgbYBlwiv5I=" + }, + { + "mvn-path": "io/aviso/pretty/1.4.4/pretty-1.4.4.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-u6SOZ0Pm5kP41vpVp/KnimIMiE21Bz2eiMFORL1zXIs=" + }, + { + "mvn-path": "io/github/clojure/tools.build/0.10.14/tools.build-0.10.14.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-6VMp7ucqLy/yLBrEGsaZcJ7PhguKoHCfrbIzF1Gp10w=" + }, + { + "mvn-path": "io/github/clojure/tools.build/0.10.14/tools.build-0.10.14.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-4BiPCtmZAsn3ewQ3duxCA15BMylYkNv+lgvCROTtXxg=" + }, + { + "mvn-path": "io/lettuce/lettuce-core/7.7.0.RELEASE/lettuce-core-7.7.0.RELEASE.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-4DtgB82Ir1m/U+3uTTgwjTOx7w1MR0aZjPmFWuw/Qio=" + }, + { + "mvn-path": "io/lettuce/lettuce-core/7.7.0.RELEASE/lettuce-core-7.7.0.RELEASE.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-0GitI16NgsBLViEXTplx+UxmHQNWG1l8nAMbi0qjcsc=" + }, + { + "mvn-path": "io/methvin/directory-watcher/0.17.3/directory-watcher-0.17.3.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-BSPdOKOTpjt15DIP9SMDSgrDzqaX9hUaesiok8MiUx4=" + }, + { + "mvn-path": "io/methvin/directory-watcher/0.17.3/directory-watcher-0.17.3.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Y/C4zR1No0m2Dfk4kdHgDF0/0sm9M9jlvu0HWijNiFQ=" + }, + { + "mvn-path": "io/micrometer/micrometer-commons/1.14.2/micrometer-commons-1.14.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-0f8ihwtRpZodMEdYCpnHA7Fl4BrpM8BrcT7JoYJsx1M=" + }, + { + "mvn-path": "io/micrometer/micrometer-commons/1.14.2/micrometer-commons-1.14.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-HDrtea9XGxvzlB0S0yG6M/UXSGNfO0esvKIGeugBl8Q=" + }, + { + "mvn-path": "io/micrometer/micrometer-core/1.14.2/micrometer-core-1.14.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-DqyyHIdwyPtMbuevfVI1Y0PffgEp8jcNO9oHj0YGQPE=" + }, + { + "mvn-path": "io/micrometer/micrometer-core/1.14.2/micrometer-core-1.14.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-sDxRi7qLRMvsJbSIIKGkC+07VJHhpcSjg+1dJsKiy14=" + }, + { + "mvn-path": "io/micrometer/micrometer-observation/1.14.2/micrometer-observation-1.14.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-fGOcmgKDJ/NiNgwyRuUGE/jhIAMVdc61V7K6X+rJF6o=" + }, + { + "mvn-path": "io/micrometer/micrometer-observation/1.14.2/micrometer-observation-1.14.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-pDt8H+O60uvUlhCI7gkJrZP+JSbgCCPGcWLIW9v79+8=" + }, + { + "mvn-path": "io/netty/netty-bom/4.2.17.Final/netty-bom-4.2.17.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-CVGqNb3L9tvIevdaZ+mvQ8AWh+1XH3fC6RlUF8Ov6Wk=" + }, + { + "mvn-path": "io/netty/netty-buffer/4.1.135.Final/netty-buffer-4.1.135.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-KhlPmfyT0HxNRC0ErHG9LcVtMYjNDkJwzcKpU9GVa/k=" + }, + { + "mvn-path": "io/netty/netty-buffer/4.1.135.Final/netty-buffer-4.1.135.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Po4IRLteQzMLL/EoMkLHHNMIDU+nW8cnWPYK6bBKiyA=" + }, + { + "mvn-path": "io/netty/netty-buffer/4.2.13.Final/netty-buffer-4.2.13.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Oemrnsr/F4iYpes3VoCW8e/U92invRYuDN4+76GRN9U=" + }, + { + "mvn-path": "io/netty/netty-buffer/4.2.13.Final/netty-buffer-4.2.13.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Yt/PT90uME/FBPdtdPgOoJbQ8BQmdL5SLwgmqMjBCIs=" + }, + { + "mvn-path": "io/netty/netty-codec-base/4.2.13.Final/netty-codec-base-4.2.13.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-oEB9Hpt36YB6q/Nn4GYCR1+qtWe/y44H/1vSLCTNkj4=" + }, + { + "mvn-path": "io/netty/netty-codec-base/4.2.13.Final/netty-codec-base-4.2.13.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-wu4mG6Bl8P702h+Ec8OPDvj4et/0WU/TwLpVY5TGkL0=" + }, + { + "mvn-path": "io/netty/netty-codec-dns/4.2.13.Final/netty-codec-dns-4.2.13.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-cD8RttHF+FZqoje3SQRv6fIBko8wX1QeIdRFKZ4/SeU=" + }, + { + "mvn-path": "io/netty/netty-codec-dns/4.2.13.Final/netty-codec-dns-4.2.13.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Hwz+QEk9PIxgKrrv+gBK7xm+ntkoOEeabsabErUu8lc=" + }, + { + "mvn-path": "io/netty/netty-codec-http/4.1.135.Final/netty-codec-http-4.1.135.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-QBhSnT1q7PQES5jHXZqQyRg53fSceqSExayByQoV2gI=" + }, + { + "mvn-path": "io/netty/netty-codec-http/4.1.135.Final/netty-codec-http-4.1.135.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-hOlZqAfGtFbRqWumsKvLWnU+YurAaz7HBRyVlJzvXlo=" + }, + { + "mvn-path": "io/netty/netty-codec-http/4.1.137.Final/netty-codec-http-4.1.137.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-BTW7WnNkcr71yUjRXrJzxKufeWZW/Hxda5gq2SvdvUk=" + }, + { + "mvn-path": "io/netty/netty-codec-http/4.1.137.Final/netty-codec-http-4.1.137.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-iyDZ6aS1nvi1gTbmptk2KZFolg5G1moA8tYBI/YwdEc=" + }, + { + "mvn-path": "io/netty/netty-codec-http2/4.1.137.Final/netty-codec-http2-4.1.137.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-V23c+1G3jobxRcmlK2DlALGh1aJXyv7IqlQW/7oES0k=" + }, + { + "mvn-path": "io/netty/netty-codec-http2/4.1.137.Final/netty-codec-http2-4.1.137.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-AtP341IHfjZjvRiL9TqUShQ05BDqWC5XMe2sT5anDVg=" + }, + { + "mvn-path": "io/netty/netty-codec/4.1.135.Final/netty-codec-4.1.135.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-clIXEmTbtbuO0453+JZDsx48q8lhROwntogkNdcYph4=" + }, + { + "mvn-path": "io/netty/netty-codec/4.1.135.Final/netty-codec-4.1.135.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-x/uq9/1cQl4MqmAq3EoVS3GJUGKCXWnXl2a75Rp8o70=" + }, + { + "mvn-path": "io/netty/netty-codec/4.1.137.Final/netty-codec-4.1.137.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-mYe2pmCwprHw15FIXa4zGAs9HGNofABv5tP9Al6eN5g=" + }, + { + "mvn-path": "io/netty/netty-codec/4.1.137.Final/netty-codec-4.1.137.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-bTicq4aDRN/nKZ9aok+C/AosrA5D/SB90XizNMJ2Adg=" + }, + { + "mvn-path": "io/netty/netty-common/4.1.135.Final/netty-common-4.1.135.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-JndcqVggcRQDzwZfouwBNKCgT/VBfGiMAjeu5otVg40=" + }, + { + "mvn-path": "io/netty/netty-common/4.1.135.Final/netty-common-4.1.135.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-APj/eo9ZfTQW2BCvLvDOuJvSplN4B4oKFsvZwsYfO+Q=" + }, + { + "mvn-path": "io/netty/netty-common/4.2.13.Final/netty-common-4.2.13.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-zM/73WhYa1Rzxn1qw3FFYl56u/rjBOelEmFldrAYdpc=" + }, + { + "mvn-path": "io/netty/netty-common/4.2.13.Final/netty-common-4.2.13.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-TPnL+fjxoCYGdMHoLKZxMlaDc2T3GtpAFV3js59GaPQ=" + }, + { + "mvn-path": "io/netty/netty-handler/4.1.135.Final/netty-handler-4.1.135.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-JF504EtvTo75iFMVJBLjvxSZzm/PFTKbeYyM42w1N+I=" + }, + { + "mvn-path": "io/netty/netty-handler/4.1.135.Final/netty-handler-4.1.135.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-t0zG6uHhsCQbYtH8WYxYO75QWDrLsEISqana7sAknnI=" + }, + { + "mvn-path": "io/netty/netty-handler/4.2.13.Final/netty-handler-4.2.13.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-UO/DCuyi7yExHyUCOJ5QC/wWjDEe2xrgSi201rtdf38=" + }, + { + "mvn-path": "io/netty/netty-handler/4.2.13.Final/netty-handler-4.2.13.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Jtl2fmONzZoFozXm9OthDlgTyT3gpZDQKXskh/bnjVU=" + }, + { + "mvn-path": "io/netty/netty-parent/4.1.135.Final/netty-parent-4.1.135.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-V/uiz0XXFR8AGcEtqX5BRRWpso+vpawzKuQp3GwJAD4=" + }, + { + "mvn-path": "io/netty/netty-parent/4.1.137.Final/netty-parent-4.1.137.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-J+P3RID9xL/2Rpq56Zg/Sh5C+hWJo34TtewpDiqRPms=" + }, + { + "mvn-path": "io/netty/netty-parent/4.2.13.Final/netty-parent-4.2.13.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-mNPrSN3hqOByTJPQ0t94711qzLim/IncrrGdES3m1JE=" + }, + { + "mvn-path": "io/netty/netty-resolver-dns/4.2.13.Final/netty-resolver-dns-4.2.13.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-93gVs0I7NROFare0OsP2x0Opwi7SOUb3wFb/bwojgoI=" + }, + { + "mvn-path": "io/netty/netty-resolver-dns/4.2.13.Final/netty-resolver-dns-4.2.13.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-dOHyJKrdDHcDoLez6JWGnWuO4nHjeXeRCik6HQc84BA=" + }, + { + "mvn-path": "io/netty/netty-resolver/4.1.135.Final/netty-resolver-4.1.135.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-d90DhllltsErnlIb3eyC8DXK6zMVbgnBWCicUJQxhIE=" + }, + { + "mvn-path": "io/netty/netty-resolver/4.1.135.Final/netty-resolver-4.1.135.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-RMZCOXM1fpFJek9r2jdSQgaKQDud74N6waCT+GbhXPc=" + }, + { + "mvn-path": "io/netty/netty-resolver/4.2.13.Final/netty-resolver-4.2.13.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-LNaNanRq6y7JKSP6Fo0lBSbXrT2+GHfnvL5uis2ywZM=" + }, + { + "mvn-path": "io/netty/netty-resolver/4.2.13.Final/netty-resolver-4.2.13.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-lV/OcNXcXJJ19ZDBiwHG3XNvUfswp6wmUcF6XSwk+iA=" + }, + { + "mvn-path": "io/netty/netty-transport-classes-epoll/4.1.137.Final/netty-transport-classes-epoll-4.1.137.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-VQSVVLeZ3I5TvyNP/6NuAB97W2XDKZS5vVn8Y1bxxS8=" + }, + { + "mvn-path": "io/netty/netty-transport-classes-epoll/4.1.137.Final/netty-transport-classes-epoll-4.1.137.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-sQmHkSGgepzvpr6e+bpFxX4jMVMpf23fBijlcSBiyG0=" + }, + { + "mvn-path": "io/netty/netty-transport-native-unix-common/4.1.135.Final/netty-transport-native-unix-common-4.1.135.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-p4lQdfESYR0WQKWWwmeKKKq5LVaBwcFHVbEJuJmPmV4=" + }, + { + "mvn-path": "io/netty/netty-transport-native-unix-common/4.1.135.Final/netty-transport-native-unix-common-4.1.135.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-b6Ovt4OL+/mLfSCErih4Zc2HDez2eSnVjHk1fROwbQ4=" + }, + { + "mvn-path": "io/netty/netty-transport-native-unix-common/4.2.13.Final/netty-transport-native-unix-common-4.2.13.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-BSuEKSdqyWvR8QZ86WO05XxifKMxBx9N8uY/dZI09rE=" + }, + { + "mvn-path": "io/netty/netty-transport-native-unix-common/4.2.13.Final/netty-transport-native-unix-common-4.2.13.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-83wLjQqB+2ATRBp/nCPa946VSow2FHtk74QEBALKpFY=" + }, + { + "mvn-path": "io/netty/netty-transport/4.1.135.Final/netty-transport-4.1.135.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-a95zTR7AcxQu7TGx5ozV1o+/JB4GCzfwehZOXssVYxw=" + }, + { + "mvn-path": "io/netty/netty-transport/4.1.135.Final/netty-transport-4.1.135.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-uXVK9JgypuamxkfcTZwOjHeVSg1c3zoVHuEjM/ikkHE=" + }, + { + "mvn-path": "io/netty/netty-transport/4.2.13.Final/netty-transport-4.2.13.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-2bIgC/5uR8LfovCVLfb739Qr9YvdkAfprBfHiSdDiMU=" + }, + { + "mvn-path": "io/netty/netty-transport/4.2.13.Final/netty-transport-4.2.13.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-IRedvy5VGbMeKDuuPN1wtS7ylknfmy5hLCGwylczVP4=" + }, + { + "mvn-path": "io/opentelemetry/opentelemetry-bom/1.49.0/opentelemetry-bom-1.49.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-RPy6c5ErlQ0+yIEp444DwYG5dfW17nPXureGaks3bFA=" + }, + { + "mvn-path": "io/projectreactor/reactor-core/3.6.6/reactor-core-3.6.6.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-RPBV+9Aztsl2xT+y4EtZAn55+yMSw30uqlTHfqHqgP4=" + }, + { + "mvn-path": "io/projectreactor/reactor-core/3.6.6/reactor-core-3.6.6.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-wWemkvYffqe8JLAi7lGZSW2QC0ZAhF6DX903KcY6Jp4=" + }, + { + "mvn-path": "io/prometheus/parent/0.16.0/parent-0.16.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-citVEZCXsE1xFHnftg3VSye1kgoa63cCAnxEohX/xZY=" + }, + { + "mvn-path": "io/prometheus/simpleclient/0.16.0/simpleclient-0.16.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-IsN08jf3vE/bHw7C2jecC6AOaa0v/otq3lQ9cwYtN38=" + }, + { + "mvn-path": "io/prometheus/simpleclient/0.16.0/simpleclient-0.16.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-/sCA0HqxWHXZccSugflR2mG1z/mZHPUOUwuo/KR3CXM=" + }, + { + "mvn-path": "io/prometheus/simpleclient_common/0.16.0/simpleclient_common-0.16.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-66bsJs5+QMu4cl4F+4Mkep9PRJRbnnUi4zdd3me58Fk=" + }, + { + "mvn-path": "io/prometheus/simpleclient_common/0.16.0/simpleclient_common-0.16.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-d/ARCc4VB710Q+InJzdnSydST6rLDcuW47jt4LarnrY=" + }, + { + "mvn-path": "io/prometheus/simpleclient_hotspot/0.16.0/simpleclient_hotspot-0.16.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-E08VbP60TL04ZAZYBu9dtVQ8aK9XjR1+5ZKD4umFP3M=" + }, + { + "mvn-path": "io/prometheus/simpleclient_hotspot/0.16.0/simpleclient_hotspot-0.16.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-0haTfecjEg+3pMiLksW+oZEa+4i6dtDUjxdprYW2dek=" + }, + { + "mvn-path": "io/prometheus/simpleclient_httpserver/0.16.0/simpleclient_httpserver-0.16.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-yrh94QtqR0FRzO68O2NDKalz/7YCzm7+8sD9l6kDZcg=" + }, + { + "mvn-path": "io/prometheus/simpleclient_httpserver/0.16.0/simpleclient_httpserver-0.16.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-PGR/1vVhohsZ7ZcdBBn9Ri2fg/k0e8ChBaHCie6qqsQ=" + }, + { + "mvn-path": "io/prometheus/simpleclient_jetty/0.16.0/simpleclient_jetty-0.16.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-pejr3A30t4Cze1p6szmBJjlYTxYk8nnbmEsm4aix/Qc=" + }, + { + "mvn-path": "io/prometheus/simpleclient_jetty/0.16.0/simpleclient_jetty-0.16.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-I+FhLJPDbRNDf3zur1oRjdHs/ibmgYhdyAINpfKLV/I=" + }, + { + "mvn-path": "io/prometheus/simpleclient_tracer/0.16.0/simpleclient_tracer-0.16.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-OBK7IrlfgbTDRg6eTnXDunL6ReRDqfzlMghCqr0OmcI=" + }, + { + "mvn-path": "io/prometheus/simpleclient_tracer_common/0.16.0/simpleclient_tracer_common-0.16.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-6Ep4SsjiTxgu5i2oC2tcgUB3S3W/pL+cw9O4OQ22JfY=" + }, + { + "mvn-path": "io/prometheus/simpleclient_tracer_common/0.16.0/simpleclient_tracer_common-0.16.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-X5AHXOz80RKB3pzLSJaNEhKyRnDWhP/IQEQaUq6HXv8=" + }, + { + "mvn-path": "io/prometheus/simpleclient_tracer_otel/0.16.0/simpleclient_tracer_otel-0.16.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-oqhMWb7zeWu3+cbyrot96LkFMT7ygYCsPef/Yd1o3z8=" + }, + { + "mvn-path": "io/prometheus/simpleclient_tracer_otel/0.16.0/simpleclient_tracer_otel-0.16.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-frl58dwz6L5OWtFDDlQJcYpBeDwmd5qzEFJg9rQ20EY=" + }, + { + "mvn-path": "io/prometheus/simpleclient_tracer_otel_agent/0.16.0/simpleclient_tracer_otel_agent-0.16.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-etK7QN90p3LZ9URaPQNXm0nWs3pH1ekPbPP1ns9BrQY=" + }, + { + "mvn-path": "io/prometheus/simpleclient_tracer_otel_agent/0.16.0/simpleclient_tracer_otel_agent-0.16.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-VSj4WIQ1SulNm8BnR+f1iS0JLAtVBVrnBWZo6gyhznw=" + }, + { + "mvn-path": "io/smallrye/common/smallrye-common-annotation/2.14.0/smallrye-common-annotation-2.14.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-PH/erJDtes+XsD62PY4yhunw+mbIRQYT00U2RXJdsBA=" + }, + { + "mvn-path": "io/smallrye/common/smallrye-common-annotation/2.14.0/smallrye-common-annotation-2.14.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-8hRfZJEp6csGb5KXpTyyHiCfNivdPExfOmXFJtwfXHY=" + }, + { + "mvn-path": "io/smallrye/common/smallrye-common-bom/2.14.0/smallrye-common-bom-2.14.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-V/8fgoHTWxVSzuNPPjyKBb7RjVOLoXcCZkk8zpIAj6E=" + }, + { + "mvn-path": "io/smallrye/common/smallrye-common-constraint/2.14.0/smallrye-common-constraint-2.14.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ELtyRDWUx4CoDgEce1ocokbhOGBEfM4ni268RIut384=" + }, + { + "mvn-path": "io/smallrye/common/smallrye-common-constraint/2.14.0/smallrye-common-constraint-2.14.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-f5CNkE4f54+fIP50iQLJFVm9COuvZrffRcmn9VxJbrY=" + }, + { + "mvn-path": "io/smallrye/common/smallrye-common-cpu/2.14.0/smallrye-common-cpu-2.14.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-HuIcRtnAuMvdHkiWg/vZl2wNzpO45aWvBUOZdXfrmWk=" + }, + { + "mvn-path": "io/smallrye/common/smallrye-common-cpu/2.14.0/smallrye-common-cpu-2.14.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-QY7WujNZ0jQw0cEQQzoHlvElLVmYLvDGydFYZ6kRlsQ=" + }, + { + "mvn-path": "io/smallrye/common/smallrye-common-function/2.14.0/smallrye-common-function-2.14.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-8ODGwhPEBmWzwpzt5zP2aPN+OKpfOrQzXFUZH9wMNZ0=" + }, + { + "mvn-path": "io/smallrye/common/smallrye-common-function/2.14.0/smallrye-common-function-2.14.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-naC/5qtDYqtfbJjMayVuVBohHU9hYR1DIQS1mp5Nbig=" + }, + { + "mvn-path": "io/smallrye/common/smallrye-common-parent/2.14.0/smallrye-common-parent-2.14.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-UZcefyokqgPu9JuY7+t0dJS/vs4YzRrp+ZYP/X/pZwI=" + }, + { + "mvn-path": "io/smallrye/smallrye-build-parent/47/smallrye-build-parent-47.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-1xrwHMwBPiiKiVx5tegErdaADy3r6NWXUSAaYsqt5Bk=" + }, + { + "mvn-path": "io/smallrye/smallrye-parent/47/smallrye-parent-47.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-5kq1jZ4QolJiHzARt1x+dbNHmlvOiBoiuO+msH4EhDI=" + }, + { + "mvn-path": "io/undertow/undertow-core/2.4.0.Final/undertow-core-2.4.0.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-VHD4/3xqAFINBJaDQYSEBmhC5Ym8EXKcSvE0SM5MPRo=" + }, + { + "mvn-path": "io/undertow/undertow-core/2.4.0.Final/undertow-core-2.4.0.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-K3vG05C6SLSw/y5ZNhjt2z2RtL1Adq21oR6I1+XU7Gc=" + }, + { + "mvn-path": "io/undertow/undertow-parent/2.4.0.Final/undertow-parent-2.4.0.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-q/cD79elNZd72Xd7RPIunmFofA6sQSfaaa49VhpjvwU=" + }, + { + "mvn-path": "io/whitfin/siphash/3.0.0/siphash-3.0.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-qlifGe2BrPUVzejKqRFncUdRVVwBFBovvCMsA2BzE0c=" + }, + { + "mvn-path": "io/whitfin/siphash/3.0.0/siphash-3.0.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-1Uz9/rrP5G3S16SSmGgZbaEU9VxlCGQ0Tok6p5W4kzA=" + }, + { + "mvn-path": "jakarta/platform/jakarta.jakartaee-bom/9.1.0/jakarta.jakartaee-bom-9.1.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-35jgJmIZ/buCVigm15o6IHdqi6Aqp4fw8HZaU4ZUyKQ=" + }, + { + "mvn-path": "jakarta/platform/jakartaee-api-parent/9.1.0/jakartaee-api-parent-9.1.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-p3AsSHAmgCeEtXl7YjMKi41lkr8PRzeyXGel6sgmWcA=" + }, + { + "mvn-path": "java-http-clj/java-http-clj/0.4.3/java-http-clj-0.4.3.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-fenBCmo630N05TAHHWiP/BDN0wHeCjKehUgAn7FvZaI=" + }, + { + "mvn-path": "java-http-clj/java-http-clj/0.4.3/java-http-clj-0.4.3.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-xZwoFDzpJ76OptQKmOHQ7LuHLK35xFmmWJHWHNPvLGs=" + }, + { + "mvn-path": "javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Q/3vC1ts6zGwQksgi5MMdKtY+sLO63s/b9OuuLXKQ5M=" + }, + { + "mvn-path": "javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-2ikm88i+iYZDzBCs3sbeCwNRpX+yc1dw+gF3sGrecbk=" + }, + { + "mvn-path": "javax/xml/bind/jaxb-api-parent/2.4.0-b180830.0359/jaxb-api-parent-2.4.0-b180830.0359.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ctEy4shY0iMPFdBI8ek6J5xAxOnshLxW+fLz61r0tLg=" + }, + { + "mvn-path": "javax/xml/bind/jaxb-api/2.4.0-b180830.0359/jaxb-api-2.4.0-b180830.0359.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-VrnpcCdTdjAHQ1Fi6niAVe/P78hquSDwMsBBHcVHuDY=" + }, + { + "mvn-path": "javax/xml/bind/jaxb-api/2.4.0-b180830.0359/jaxb-api-2.4.0-b180830.0359.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-sck/wwHX9f5M3hPRlTKZJR2jfv/8kfUjg1UEw/+HNwc=" + }, + { + "mvn-path": "joda-time/joda-time/2.9.3/joda-time-2.9.3.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-oF9biwIYAqcZGbGHAq698oYUgYiz7p0m5uxA6NAHFIc=" + }, + { + "mvn-path": "joda-time/joda-time/2.9.3/joda-time-2.9.3.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-9qpQOtQfI9ANaCVgVOPaf7QIHKALMrLJplDu9QtQx48=" + }, + { + "mvn-path": "lambdaisland/clj-diff/1.4.78/clj-diff-1.4.78.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-oovG5LKVI8wppHLlfm6rlYD6DQNorXvliypH6JGhRZw=" + }, + { + "mvn-path": "lambdaisland/clj-diff/1.4.78/clj-diff-1.4.78.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-2QZ6mFjx7+UGI232PUr3CzsQenqd+xcRsbqEpxs32w0=" + }, + { + "mvn-path": "lambdaisland/deep-diff2/2.11.216/deep-diff2-2.11.216.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-U2zJZmPIO66EtkgwwfyY41uRyu2DRmXH0ogNfluw5Rg=" + }, + { + "mvn-path": "lambdaisland/deep-diff2/2.11.216/deep-diff2-2.11.216.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-ok3nYS+8XCcCTPJIkqaO1SQH6v2ENwK2GZJdH0c4D20=" + }, + { + "mvn-path": "lambdaisland/kaocha/1.91.1392/kaocha-1.91.1392.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-W7EV1MqxeIVqyTyt6lV9vpZrLRc+TWQKnmNfiPoieug=" + }, + { + "mvn-path": "lambdaisland/kaocha/1.91.1392/kaocha-1.91.1392.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-p6+0cuuFYlJU5YlhGIbnuHt1d6yOZXx/FhwAM6wCyzg=" + }, + { + "mvn-path": "lambdaisland/tools.namespace/0.3.256/tools.namespace-0.3.256.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-jt141ljkjv97etTTE995zZnqiZfoFnyt0g2hwmuOU8M=" + }, + { + "mvn-path": "lambdaisland/tools.namespace/0.3.256/tools.namespace-0.3.256.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-n+46BXjy57A8898EXgyplEyyqf/S5qocf140ZbglV64=" + }, + { + "mvn-path": "lambdaisland/uri/1.19.155/uri-1.19.155.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-DFn8E1wk2EUNxod+YT0mSQtSu286jbzxHiFsITGRpJA=" + }, + { + "mvn-path": "lambdaisland/uri/1.19.155/uri-1.19.155.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-4SeT+NhAXB4o/WBM9oPJq8qFYDFURL2UHKutDhM83d8=" + }, + { + "mvn-path": "markdown-clj/markdown-clj/1.12.9/markdown-clj-1.12.9.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-AaRSPT0FcpHZs0hc4+Wya2MgO+8lBcoJD92zJ/Q1jHI=" + }, + { + "mvn-path": "markdown-clj/markdown-clj/1.12.9/markdown-clj-1.12.9.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-3/hUkXkvwAXPz6y1ezKVeT+eoACfMXEkuskSh/G45+E=" + }, + { + "mvn-path": "me/flowthing/pp/2026-03-01.107/pp-2026-03-01.107.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-snTuVL1PkySNSHoAyi0MS948jr0l6ifs3p0xL5q1bPQ=" + }, + { + "mvn-path": "me/flowthing/pp/2026-03-01.107/pp-2026-03-01.107.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-HSSeyyWV/eC218bYB8YOx3okf7CJFCtRSZvU0izuK5g=" + }, + { + "mvn-path": "meta-merge/meta-merge/1.0.0/meta-merge-1.0.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-1/7i4+PXBuDlRWLnKqNxIQjXAYahLLwJDhBoBYLrAsc=" + }, + { + "mvn-path": "meta-merge/meta-merge/1.0.0/meta-merge-1.0.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-sAogZY/OzCvRNBAx85T1LWjFP7SAxEVBNMyqwgTqWTE=" + }, + { + "mvn-path": "metosin/jsonista/1.0.0/jsonista-1.0.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-9H3qoN+dc0z+E/AWMy4HxecFg9puOGcjPksy2lT3slY=" + }, + { + "mvn-path": "metosin/jsonista/1.0.0/jsonista-1.0.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-rZOX8Hh87nJyXc/SCj4SyYXnw+C5mMAvXKhvZl+F4QA=" + }, + { + "mvn-path": "metosin/malli/0.20.1/malli-0.20.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-RaaMI4tsXRl2KXUPGmPMWqbQRUVrCpRcjJ1ayAZ9gd4=" + }, + { + "mvn-path": "metosin/malli/0.20.1/malli-0.20.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-B+fEOtVMMuJa8MZjN10cdiwuZE/4Lbb9nCn6LYIaa8g=" + }, + { + "mvn-path": "metosin/reitit-core/0.10.1/reitit-core-0.10.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-7gBhQkwe2ZlzVO//GWsSNeq1O9ydlm9aA3l183eqrrU=" + }, + { + "mvn-path": "metosin/reitit-core/0.10.1/reitit-core-0.10.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-sXrrlJWKnQFn7pKvBRPz3yuqWBpdN2TzhML3hOMioGY=" + }, + { + "mvn-path": "mockery/mockery/0.1.4/mockery-0.1.4.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-bcejt2YgW71fcqilLYlZoXCnpKilN6L+ebIhnPeV8sY=" + }, + { + "mvn-path": "mockery/mockery/0.1.4/mockery-0.1.4.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-1YJ3ruapKAdmG6EVm8DVjmPmGM7zj+rEmDfORyKX/O0=" + }, + { + "mvn-path": "mvxcvi/arrangement/2.1.0/arrangement-2.1.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-83JROF0iDfiVHmjVJVq7UZetvL2PxrPT/KhyojOfOcg=" + }, + { + "mvn-path": "mvxcvi/arrangement/2.1.0/arrangement-2.1.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-fWiMhmYYFAo78Am00FcK7acJA0h7dlH7VNBHf5TT2Is=" + }, + { + "mvn-path": "net/incongru/watchservice/barbary-watchservice/1.0/barbary-watchservice-1.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-VMbKvYIJPIUV9uFOQ9lL/n6fx5XRV4nzlDoUGNgmOrU=" + }, + { + "mvn-path": "net/incongru/watchservice/barbary-watchservice/1.0/barbary-watchservice-1.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-k7OxHaltUXiIDfjFBT8Yz8eByv8Nnd9LPGRyRKnRws8=" + }, + { + "mvn-path": "net/java/dev/jna/jna/5.12.1/jna-5.12.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-kagUrE9A1g3ukdhC4aith0xiGXmEQD0OPDDTnlXPU7M=" + }, + { + "mvn-path": "net/java/dev/jna/jna/5.12.1/jna-5.12.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Zf8lhJuthZVUtQMXeS9Wia20UprkAx6aUkYxnLK4U1Y=" + }, + { + "mvn-path": "net/java/jvnet-parent/1/jvnet-parent-1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-KBRAgRJo5l2eJms8yJgpfiFOBPCXQNA4bO60qJI9Y78=" + }, + { + "mvn-path": "net/java/jvnet-parent/5/jvnet-parent-5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-GvaZ+Nndq2f5oNIC+9eRXrA2Klpt/V/8VMr6NGXJywo=" + }, + { + "mvn-path": "nrepl/nrepl/1.3.1/nrepl-1.3.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-rZ57tFC9Hsz+QypViWDng0vFsR28ea+z+tTTpbQwfFo=" + }, + { + "mvn-path": "nrepl/nrepl/1.3.1/nrepl-1.3.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-YXGdz9qqc3r4vPzjQl81fYS/QnS8Ej7UjsJI8iQKabY=" + }, + { + "mvn-path": "nrepl/nrepl/1.7.0/nrepl-1.7.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-0HOQJ3GQ4Kl04Ul/1EhQBaSWT59ValC9UwUJ9IumXBs=" + }, + { + "mvn-path": "nrepl/nrepl/1.7.0/nrepl-1.7.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-UofmkoVVR+4tOkzzRvpQvPdjoL8CoNravB76uI3aHog=" + }, + { + "mvn-path": "org/agrona/agrona/1.22.0/agrona-1.22.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-1CKlfonMtq4PlILvoW9d0LmT2sDbOGD1SwM/IfRSBs8=" + }, + { + "mvn-path": "org/agrona/agrona/1.22.0/agrona-1.22.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-CNyyrEmvedF3WZfAm6LqnKRWQMcnhAHDUWfCoccSTNo=" + }, + { + "mvn-path": "org/apache/apache/21/apache-21.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-rxDBCNoBTxfK+se1KytLWjocGCZfoq+XoyXZFDU3s4A=" + }, + { + "mvn-path": "org/apache/apache/23/apache-23.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-vBBiTgYj82V3+sVjnKKTbTJA7RUvttjVM6tNJwVDSRw=" + }, + { + "mvn-path": "org/apache/apache/27/apache-27.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-srD8aeIqZQw4kvHDZtdwdvKVdcZzjfTHpwpEhESEzfk=" + }, + { + "mvn-path": "org/apache/apache/31/apache-31.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-VV0MnqppwEKv+SSSe5OB6PgXQTbTVe6tRFIkRS5ikcw=" + }, + { + "mvn-path": "org/apache/apache/32/apache-32.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-z9hywOwn9Trmj0PbwP7N7YrddzB5pTr705DkB7Qs5y8=" + }, + { + "mvn-path": "org/apache/apache/34/apache-34.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-NnGunU0GKuO7mFcxx2CIuy9vfXJU4tME7p9pC5dlEyg=" + }, + { + "mvn-path": "org/apache/apache/35/apache-35.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-6il9zRFBNui46LYwIw1Sp2wvxp9sXbJdZysYVwAHKLg=" + }, + { + "mvn-path": "org/apache/apache/37/apache-37.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Uk7EeHr/c69rOp+voVTH8YgbZIKZtmP9v8rdoShvI1M=" + }, + { + "mvn-path": "org/apache/apache/38/apache-38.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-mwpfKN37S3UAo3AivugkXv3QRPuaPXn7gnVQkj7MxLU=" + }, + { + "mvn-path": "org/apache/commons/commons-fileupload2-core/2.0.0-M4/commons-fileupload2-core-2.0.0-M4.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-0oXNjN3j2UZiCLN8d1BFSwsoDqdzsZsFCuHi3bCeaZE=" + }, + { + "mvn-path": "org/apache/commons/commons-fileupload2-core/2.0.0-M4/commons-fileupload2-core-2.0.0-M4.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-nVr4glJx8ilRBfsNqBBjCO0oCevs9QMIecG2dIXqjc8=" + }, + { + "mvn-path": "org/apache/commons/commons-fileupload2/2.0.0-M4/commons-fileupload2-2.0.0-M4.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-1OvVB1KVvvXrUL7AnQ6iN8VXDbZd5dfVfGMoJBxNoYY=" + }, + { + "mvn-path": "org/apache/commons/commons-parent/52/commons-parent-52.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ddvo806Y5MP/QtquSi+etMvNO18QR9VEYKzpBtu0UC4=" + }, + { + "mvn-path": "org/apache/commons/commons-parent/69/commons-parent-69.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-1Q2pw5vcqCPWGNG0oDtz8ZZJf8uGFv0NpyfIYjWSqbs=" + }, + { + "mvn-path": "org/apache/commons/commons-parent/71/commons-parent-71.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-lbe+cPMWrkyiL2+90I3iGC6HzYdKZQ3nw9M4anR6gqM=" + }, + { + "mvn-path": "org/apache/commons/commons-parent/84/commons-parent-84.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-kjn7lxAdsnBw5Jg9ENM6DpHPZ2ytkb9TgVQiw1Ye+bE=" + }, + { + "mvn-path": "org/apache/commons/commons-parent/85/commons-parent-85.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-0Yn/LAAn6Wu2XTHm8iftKvlmFps2rx6XPdW6CJJtx7U=" + }, + { + "mvn-path": "org/apache/commons/commons-parent/93/commons-parent-93.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-qItfYWWmWb+DVEGDe8xcU+mf3nm5LPu4aYjOKVTNUmc=" + }, + { + "mvn-path": "org/apache/commons/commons-parent/96/commons-parent-96.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-LNMom0TvpTBS2c2vPwVUSDOlIKaC+cf/1AOgC7sVf5o=" + }, + { + "mvn-path": "org/apache/commons/commons-pool2/2.13.1/commons-pool2-2.13.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-93pQYNaTapFEAjWEIy+d4/Ikjxq/4Vbp0xeV8YdwZ08=" + }, + { + "mvn-path": "org/apache/commons/commons-pool2/2.13.1/commons-pool2-2.13.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-id6chq9E+BY/aoJutxuAyT6QR53ouNkim8JD5aSOXgM=" + }, + { + "mvn-path": "org/apache/groovy/groovy-bom/4.0.27/groovy-bom-4.0.27.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-qkTrUr/f5h0ns+RQ0rNI2I3qo0N6tNnUmoQJU0j59vs=" + }, + { + "mvn-path": "org/apache/httpcomponents/client5/httpclient5-parent/5.6.4/httpclient5-parent-5.6.4.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-BTBVl+ggj9/MgmkY252tNqQsex3cs2YAjC8Jde0tcZI=" + }, + { + "mvn-path": "org/apache/httpcomponents/client5/httpclient5/5.6.4/httpclient5-5.6.4.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ve9fiEEUXNdsTGBf8wG8hA7qDVKSMyt7iSqTMWwNjuE=" + }, + { + "mvn-path": "org/apache/httpcomponents/client5/httpclient5/5.6.4/httpclient5-5.6.4.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-28CEQEONXopgAEGpth4knwx9nYa5mOcqmgOQC0xkqkQ=" + }, + { + "mvn-path": "org/apache/httpcomponents/core5/httpcore5-h2/5.4.3/httpcore5-h2-5.4.3.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-x9twJrji3qORMrBKYGn2Zx4oWDCbIKFG7Fx91u1zoLY=" + }, + { + "mvn-path": "org/apache/httpcomponents/core5/httpcore5-h2/5.4.3/httpcore5-h2-5.4.3.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-BagbqwxpX/eaOB5KHfCm9YK6VWstjWC+hMTcipyfUCc=" + }, + { + "mvn-path": "org/apache/httpcomponents/core5/httpcore5-parent/5.4.3/httpcore5-parent-5.4.3.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-KqDD9ps3nUm2lsxZePvhV3PsyQp7ORBteBDlVNBUd4s=" + }, + { + "mvn-path": "org/apache/httpcomponents/core5/httpcore5/5.4.3/httpcore5-5.4.3.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-GL+7q7R437Z/Ma6vQow4fzw99lRYLhMJ9wjuHzCGgwo=" + }, + { + "mvn-path": "org/apache/httpcomponents/core5/httpcore5/5.4.3/httpcore5-5.4.3.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-pIPvmVmcxf4sYQWpHiqnrEbBw1e1Wb63bHBFMm3L09E=" + }, + { + "mvn-path": "org/apache/httpcomponents/httpclient/4.5.14/httpclient-4.5.14.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-yLx+HFGm1M5y9A0uu6vxxLaL/nbnMhBLBDgbSTR46dY=" + }, + { + "mvn-path": "org/apache/httpcomponents/httpclient/4.5.14/httpclient-4.5.14.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-8YNVr0z4CopO8E69dCpH6Qp+rwgMclsgldvE/F2977c=" + }, + { + "mvn-path": "org/apache/httpcomponents/httpcomponents-client/4.5.14/httpcomponents-client-4.5.14.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-W60d5PEBRHZZ+J0ImGjMutZKaMxQPS1lQQtR9pBKoGE=" + }, + { + "mvn-path": "org/apache/httpcomponents/httpcomponents-core/4.4.16/httpcomponents-core-4.4.16.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-8tdaLC1COtGFOb8hZW1W+IpAkZRKZi/K8VnVrig9t/c=" + }, + { + "mvn-path": "org/apache/httpcomponents/httpcomponents-parent/11/httpcomponents-parent-11.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-qQH4exFcVQcMfuQ+//Y+IOewLTCvJEOuKSvx9OUy06o=" + }, + { + "mvn-path": "org/apache/httpcomponents/httpcomponents-parent/14/httpcomponents-parent-14.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Xc62qyBqQZF5Jz8V0NK0cvlHK7t0fGyLfpbar3jMRSc=" + }, + { + "mvn-path": "org/apache/httpcomponents/httpcore/4.4.16/httpcore-4.4.16.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-bJs90UKgncRo4jrTmq1vdaDyuFElEERp8CblKkdORk8=" + }, + { + "mvn-path": "org/apache/httpcomponents/httpcore/4.4.16/httpcore-4.4.16.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-PLrYSbNdrP5s7DGtraLGI8AmwyYRQbDSbux+OZxs1/o=" + }, + { + "mvn-path": "org/apache/logging/log4j/log4j-api/2.26.1/log4j-api-2.26.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-8YEKRwTMzgGdArugKdwCpPKsDJl/ZHtGXn1AnBkn+CI=" + }, + { + "mvn-path": "org/apache/logging/log4j/log4j-api/2.26.1/log4j-api-2.26.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-yKuGj5xTIjO9EvMRzqkKP23mXqB6eqRww+K7+Dtcefs=" + }, + { + "mvn-path": "org/apache/logging/log4j/log4j-bom/2.26.1/log4j-bom-2.26.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-RBWtGJ3QTbVJWKQ+I7N8w5eh7e6eiIIUuL1H++gZBy4=" + }, + { + "mvn-path": "org/apache/logging/log4j/log4j-core/2.26.1/log4j-core-2.26.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-LsjDv1ptfIm+hiARai/Jc/fdoa0CYa05PE1HJu39Pcs=" + }, + { + "mvn-path": "org/apache/logging/log4j/log4j-core/2.26.1/log4j-core-2.26.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Gj/ZpEZ8OrmxJ+cUG+8Sm2JCj+Ey9/klw69/Uk3XqLU=" + }, + { + "mvn-path": "org/apache/logging/log4j/log4j-jul/2.26.1/log4j-jul-2.26.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-asVM44vfAzTTa5/zBDPCplDjd0e5B9bgQOnUfRJlnp8=" + }, + { + "mvn-path": "org/apache/logging/log4j/log4j-jul/2.26.1/log4j-jul-2.26.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-D9l04jQShz1g5GcFys4dE2mCDVLMvz7JkyYsUOcGkhM=" + }, + { + "mvn-path": "org/apache/logging/log4j/log4j-slf4j2-impl/2.26.1/log4j-slf4j2-impl-2.26.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-y9+0wrzBDwknxhA221SSQlDzkk7NE+qRPO/k+ZwI+mY=" + }, + { + "mvn-path": "org/apache/logging/log4j/log4j-slf4j2-impl/2.26.1/log4j-slf4j2-impl-2.26.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-JXsPxXdjRUr4cYqT/SRcoF4GsoMGArYJC/vhke3RHRE=" + }, + { + "mvn-path": "org/apache/logging/log4j/log4j-web/2.26.1/log4j-web-2.26.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-qt+uDsWx3oWBde0USmVrcdWwvzabPMdviaPZw3/JeLk=" + }, + { + "mvn-path": "org/apache/logging/log4j/log4j-web/2.26.1/log4j-web-2.26.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-/Zj1Z58yazTRw2N6Q8IlP+tBFffejO+ar5Z3zaOLSw4=" + }, + { + "mvn-path": "org/apache/logging/log4j/log4j/2.26.1/log4j-2.26.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-6kcFcl/ZS/XevikR1Op68giYYD9oNU5kskYaDySeRF0=" + }, + { + "mvn-path": "org/apache/maven/maven-artifact/3.9.16/maven-artifact-3.9.16.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-VMwcHvky49SpAzUhEbQrTTw+2Oeh0N5ztiUwnZw60+g=" + }, + { + "mvn-path": "org/apache/maven/maven-artifact/3.9.16/maven-artifact-3.9.16.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-hdMTu7285n4Zmq20M24QDEChR4gRQupDaM3r6vwCuuw=" + }, + { + "mvn-path": "org/apache/maven/maven-builder-support/3.9.16/maven-builder-support-3.9.16.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ApcjhOrjSVgBVl/SeruEz9dajm0suxrgxVZ1LrwrHN4=" + }, + { + "mvn-path": "org/apache/maven/maven-builder-support/3.9.16/maven-builder-support-3.9.16.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-yDZq+IPu7A4v0T4UzYJFlpKEtuZt8TH3t8A9Jw9y9hM=" + }, + { + "mvn-path": "org/apache/maven/maven-model-builder/3.9.16/maven-model-builder-3.9.16.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ACvobR9Ts29VmgeGA0oXWY1xCH8ZNfIFofnlHU3RJLM=" + }, + { + "mvn-path": "org/apache/maven/maven-model-builder/3.9.16/maven-model-builder-3.9.16.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-bipZ6t13skT+YPxgt+06my3ucE1EpPW6yk+dO+blPhA=" + }, + { + "mvn-path": "org/apache/maven/maven-model/3.9.16/maven-model-3.9.16.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-9Z2GpQfCQb8Xu/BQBQ0bi5wNNNUBCn4jhsPKt8g7k94=" + }, + { + "mvn-path": "org/apache/maven/maven-model/3.9.16/maven-model-3.9.16.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ZIg//P2R3arbQYF0AjaoI7/giA4MIPW+7nS8Mqk5FKc=" + }, + { + "mvn-path": "org/apache/maven/maven-parent/47/maven-parent-47.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-gtARK6GQf/X9E6JIWCnJffZsaoHgdTWaVhpCL30VgtM=" + }, + { + "mvn-path": "org/apache/maven/maven-parent/48/maven-parent-48.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-zJ7thLkKlsvDOu/syT+suaSflgrWeJCRYsV5NWz+Esk=" + }, + { + "mvn-path": "org/apache/maven/maven-repository-metadata/3.9.16/maven-repository-metadata-3.9.16.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-vD3UE7iaFraV81pdBJa1jqJ4fDC3tgYsEw0k1tdkcg8=" + }, + { + "mvn-path": "org/apache/maven/maven-repository-metadata/3.9.16/maven-repository-metadata-3.9.16.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-HAGLvWzVE7Q99d1kyCV5sUxBTTX5ngagw4eLBa4HCRI=" + }, + { + "mvn-path": "org/apache/maven/maven-resolver-provider/3.9.16/maven-resolver-provider-3.9.16.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-cqLWqtNwjixwi2WbKSrpWHpNFw7Ij0hGYpAxhzAiERg=" + }, + { + "mvn-path": "org/apache/maven/maven-resolver-provider/3.9.16/maven-resolver-provider-3.9.16.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-M3I7ukX/KhWBvChAg2t9nJqiYq9nb09hIi4Xm1bqiBg=" + }, + { + "mvn-path": "org/apache/maven/maven-settings-builder/3.9.16/maven-settings-builder-3.9.16.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Im8cuwtNQU7/dz+xUaiXeDfJgHPhTVljeU5s9GTmrbs=" + }, + { + "mvn-path": "org/apache/maven/maven-settings-builder/3.9.16/maven-settings-builder-3.9.16.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-vOlGJAvyl5gvUkZmZ0rP9cFIeKJISfHzw0ic0dgp7Ug=" + }, + { + "mvn-path": "org/apache/maven/maven-settings/3.9.16/maven-settings-3.9.16.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Mirlsj9Le2zniWvTOnkxQ9u7vMFsRHXi1+672PdV2pI=" + }, + { + "mvn-path": "org/apache/maven/maven-settings/3.9.16/maven-settings-3.9.16.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-09+BH+V4MpM63vkMEZy/OruUGITPhAzJd3qmOc8aFF0=" + }, + { + "mvn-path": "org/apache/maven/maven/3.9.16/maven-3.9.16.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-WnYeMtPztdZacDRcq0oydzDB0gALuTW65ydtzI+oFzg=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver-api/1.9.27/maven-resolver-api-1.9.27.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-qJXSIig2ZqcyDdx2YV4uk6Qfq9k86aa/nd7jknK7h7Q=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver-api/1.9.27/maven-resolver-api-1.9.27.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-mNwDH3Xyybfv7vNE4cdLs9AJxYTjboKg7D0mPSv+83M=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver-connector-basic/1.9.27/maven-resolver-connector-basic-1.9.27.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-O9mOOkJvmtyuOeN4bbIp4r534Ip0Ps2b4Vxe13vjpiU=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver-connector-basic/1.9.27/maven-resolver-connector-basic-1.9.27.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-SU/XtbSLndZf9iTvOMkA58qrTYFVZ9yhum+52AJ4oZ8=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver-impl/1.9.27/maven-resolver-impl-1.9.27.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-KV1I6iqLs671GIiWfxBftiUZl9ER8Twy0okZ/ZsclR4=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver-impl/1.9.27/maven-resolver-impl-1.9.27.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-zptH6K61jkbf0F64/Q/j6/4VKgb/DyO7QhJ9FXbNaRQ=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver-named-locks/1.9.27/maven-resolver-named-locks-1.9.27.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-s57NTamP2sUGjm9dFpEKcfTk1I6V4X0Qf2YD4Y8rP98=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver-named-locks/1.9.27/maven-resolver-named-locks-1.9.27.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Qe8scXDrBnLLe8l8qnZbrVOG1J2Tu+iuQwiHI4yOZpo=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver-spi/1.9.27/maven-resolver-spi-1.9.27.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-HKsC9FvFjV9NjghOrwMvE+oaX8kCHYvXT4Ng67ZZPlo=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver-spi/1.9.27/maven-resolver-spi-1.9.27.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-xjEONgu1tUOqDHpokrGOlkrdb+rzkXrIjIUmTtN3xnY=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver-supplier/1.9.27/maven-resolver-supplier-1.9.27.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-LamAyojo4V8pUaMqUHaPCl4gLwdXGPjdvVWBI+hZTc0=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver-supplier/1.9.27/maven-resolver-supplier-1.9.27.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ZghDq0Mt4aclVPFYOURLnzCkB0GZaqcBTbsAiyGHfj0=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver-transport-file/1.9.27/maven-resolver-transport-file-1.9.27.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-OYgmG9MeLnntqAKzlxmS/ORHVrAClVegXHuHHTw93vc=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver-transport-file/1.9.27/maven-resolver-transport-file-1.9.27.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-SDIJnrOlNbGZA6iYuwP0zGVIht6wdmG9OPjLPwAuvlQ=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver-transport-http/1.9.27/maven-resolver-transport-http-1.9.27.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-cj89nXF6aT0KrFieJmuZX3bpxj7dSOzIoM+ehqd+RZw=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver-transport-http/1.9.27/maven-resolver-transport-http-1.9.27.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-p+rm1UpJDu3yhhk9fygPfpfYlYjafVrfEX8BMwmNvi4=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver-util/1.9.27/maven-resolver-util-1.9.27.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-dKElSPDWqtE8coZmKIwegSAcJL0Fu05OyMFVhRezeac=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver-util/1.9.27/maven-resolver-util-1.9.27.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-srPHd0zcYYh9qBS0IzjJQhururmx6Hw+ZJOIX/2lMjE=" + }, + { + "mvn-path": "org/apache/maven/resolver/maven-resolver/1.9.27/maven-resolver-1.9.27.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-iSS0FxHM4Fj4PEbXmtg9bgTtzxPtVjHsERNWVuC4f1Y=" + }, + { + "mvn-path": "org/bouncycastle/bc-jdk18on-bom/1.84/bc-jdk18on-bom-1.84.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-8O7pMr+yRrDfvrwIkmE2TGA9ut6tGPxV/WNCwXxW80w=" + }, + { + "mvn-path": "org/bouncycastle/bcpkix-jdk18on/1.78.1/bcpkix-jdk18on-1.78.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-S0jqCE5SMrnXnryhiHud4DexJJMYB81gcQdIwq7gjMk=" + }, + { + "mvn-path": "org/bouncycastle/bcpkix-jdk18on/1.78.1/bcpkix-jdk18on-1.78.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-CVIrr36Zuqk6JRXRbPHLlT+iJ41+PEbIvv8n3AQXKDE=" + }, + { + "mvn-path": "org/bouncycastle/bcprov-jdk18on/1.78.1/bcprov-jdk18on-1.78.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-rdWRXmrPxqtYNuH9il4hxkiFNqjB8h84bus78oC3Atc=" + }, + { + "mvn-path": "org/bouncycastle/bcprov-jdk18on/1.78.1/bcprov-jdk18on-1.78.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-KJEtE5+e7RQcOUNx++W6b//5HnjxycuDSPlEok0gTtI=" + }, + { + "mvn-path": "org/bouncycastle/bcutil-jdk18on/1.78.1/bcutil-jdk18on-1.78.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-2fpW+XsPdhzjvI2ddMXXE3qYe/W9Or/hAD+br6RaHS8=" + }, + { + "mvn-path": "org/bouncycastle/bcutil-jdk18on/1.78.1/bcutil-jdk18on-1.78.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-dB1Vy0XEwsiJtaQ2t0fcIVKSMTLkJr5u9VUA7uf6UxI=" + }, + { + "mvn-path": "org/checkerframework/checker-qual/3.55.1/checker-qual-3.55.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-hXZYyL3L/3lJSajZki+I1j7jdRwgPHzX0h6pf550Uog=" + }, + { + "mvn-path": "org/checkerframework/checker-qual/3.55.1/checker-qual-3.55.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Yn2SqpL9TWu4wrVry7OFQ0F/SdOLWmL720rv9VHnt2A=" + }, + { + "mvn-path": "org/clojars/pntblnk/clj-ldap/0.0.17/clj-ldap-0.0.17.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-d+ygGVO56kwcrLssTcym1P3PsFmOq3UlqYgkHL025nI=" + }, + { + "mvn-path": "org/clojars/pntblnk/clj-ldap/0.0.17/clj-ldap-0.0.17.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-DpL90WPauoqhSf2UH5BFHY2DLo+NtNsWOlToM7LZALw=" + }, + { + "mvn-path": "org/clojure/clojure/1.10.3/clojure-1.10.3.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-fxJHLa7Y9rUXSYqqKrE6ViR1w+31FHjkWBzHYemJeaM=" + }, + { + "mvn-path": "org/clojure/clojure/1.10.3/clojure-1.10.3.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-GJwAxDNAdJai+7DsyzeQjJSVXZHq0b5IFWdE7MGBbZQ=" + }, + { + "mvn-path": "org/clojure/clojure/1.11.0/clojure-1.11.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-PiH6daB+yd278bK1A1bPGAcQ0DmN6qT0TpHNYwRVWUc=" + }, + { + "mvn-path": "org/clojure/clojure/1.11.0/clojure-1.11.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-SQjMS0yeYsmoFJb5PLWsb2lBd8xkXc87jOXkkavOHro=" + }, + { + "mvn-path": "org/clojure/clojure/1.11.1/clojure-1.11.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-I4G26UI6tGUVFFWUSQPROlYkPWAGuRlK/Bv0+HEMtN4=" + }, + { + "mvn-path": "org/clojure/clojure/1.11.1/clojure-1.11.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-IMRaGr7b2L4grvk2BQrjGgjBZ0CzL4dAuIOM3pb/y4o=" + }, + { + "mvn-path": "org/clojure/clojure/1.11.2/clojure-1.11.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-iPqZkT1pIs+39kn1xGdQOHfLb8yMwW02948mSAhLqZc=" + }, + { + "mvn-path": "org/clojure/clojure/1.11.2/clojure-1.11.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-FzbP/xCV4dT+/raogrut9ttB7+MV8pbw/aMtt//EExE=" + }, + { + "mvn-path": "org/clojure/clojure/1.11.3/clojure-1.11.3.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-nDBUCTKOK5boXdK160t1gQxnt2unCuTQ9t3pvPtVsbc=" + }, + { + "mvn-path": "org/clojure/clojure/1.11.3/clojure-1.11.3.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-DA2+Ge4NKpxXMQzr3dNWRD8NFlFMQmBHsGLjpXwNuK0=" + }, + { + "mvn-path": "org/clojure/clojure/1.11.4/clojure-1.11.4.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-/H/xtmENDjSUp1zBHvgYEL2kAqwVcBL+TjuJlYbPQTM=" + }, + { + "mvn-path": "org/clojure/clojure/1.11.4/clojure-1.11.4.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-a6YADmhI+Cw5y5tJqyqmo6Vi9MJNUrMeUZCuZJXwwwk=" + }, + { + "mvn-path": "org/clojure/clojure/1.12.0/clojure-1.12.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-xFMzAGRBoFnqn9sTQfxsH0C5IaENzNgmZTEeSKA4R2M=" + }, + { + "mvn-path": "org/clojure/clojure/1.12.0/clojure-1.12.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-KfRiqonLl2RXWEGKXwjUwagrc1yW569JgX0WqpuQgVA=" + }, + { + "mvn-path": "org/clojure/clojure/1.12.1/clojure-1.12.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-h+7qnjVdhsBFc4r0lNaD4J6RTLBGeuQNRqZrh6NsctQ=" + }, + { + "mvn-path": "org/clojure/clojure/1.12.1/clojure-1.12.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-JUvpyKuMzDArR9fFaj/KEUl+WcMFvxX6YFTD3/TrkZ0=" + }, + { + "mvn-path": "org/clojure/clojure/1.12.2/clojure-1.12.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-pYv4B+zv7K6iIri4tH4UNo7o4yy0VAs//v/4yglTSA0=" + }, + { + "mvn-path": "org/clojure/clojure/1.12.2/clojure-1.12.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-55suCRfnPnPCX7N5PzFV+PD4jYAvUMJf1Sl3l3rDQiA=" + }, + { + "mvn-path": "org/clojure/clojure/1.12.3/clojure-1.12.3.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-yyoaPbHCzXbvT6SlRdWmXxCxtIt/dnLwoQn1R28FcWY=" + }, + { + "mvn-path": "org/clojure/clojure/1.12.3/clojure-1.12.3.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-q2CmyyuMxXyG21ECte4p8hWsg8/20wEblV+fxb5dAZ0=" + }, + { + "mvn-path": "org/clojure/clojure/1.12.4/clojure-1.12.4.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-S4Hpum2jjEXZzFgCPGdAYrjJ8HFPM/8A3tIuapSdoXc=" + }, + { + "mvn-path": "org/clojure/clojure/1.12.4/clojure-1.12.4.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-xRh5Bi5B/58hr6DkCbGZ/+nyo8aucizf7F/Z26BeQXI=" + }, + { + "mvn-path": "org/clojure/clojure/1.12.5/clojure-1.12.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-397hMUYCFqhP7yLlN7sNBXmWX49wM410gyPf8m+OWos=" + }, + { + "mvn-path": "org/clojure/clojure/1.12.5/clojure-1.12.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-J4xR2XfBloST2NTLDFxg4sslUNYEhcOBPPFh5Wr2iFg=" + }, + { + "mvn-path": "org/clojure/clojurescript/1.12.145/clojurescript-1.12.145.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-zIeVo/egI41Ke2lBO5acsS7YzLepmR6eBtEHdD+NVec=" + }, + { + "mvn-path": "org/clojure/clojurescript/1.12.145/clojurescript-1.12.145.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-+eyywe2BBt+AXdM+TZFFC/4WM9yd/LWxfgPNSHj5E2k=" + }, + { + "mvn-path": "org/clojure/core.async/1.8.741/core.async-1.8.741.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-KISJpPDlgPQ+GRPLqEKzKVnvAeLRvDoB2y6Xx5ycZVo=" + }, + { + "mvn-path": "org/clojure/core.async/1.8.741/core.async-1.8.741.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-pZ4vAaRcQ4vR0FDx0xVDFdn0ah1rwJfMx2JdCGNa6OE=" + }, + { + "mvn-path": "org/clojure/core.async/1.9.865/core.async-1.9.865.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-VQ3kJEJl+eeamoaCYwxoGhAQKyv1Gf1kZh4+nxkrgoQ=" + }, + { + "mvn-path": "org/clojure/core.async/1.9.865/core.async-1.9.865.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-l0cjTJKXpWrv5tBzYVMAZqMIVOoGgnMN558tMbEjc1c=" + }, + { + "mvn-path": "org/clojure/core.cache/1.1.234/core.cache-1.1.234.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-upBxBE7bewCSiLLF+ACn3NkYsPFyXFuoAEaSON+XL2M=" + }, + { + "mvn-path": "org/clojure/core.cache/1.1.234/core.cache-1.1.234.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-RJ/b2nzIjsXeInB2oUBFLoDbsHlSJbSbDJ6UDEuRIRk=" + }, + { + "mvn-path": "org/clojure/core.memoize/1.1.266/core.memoize-1.1.266.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-V5KiHW2QofXmjUoQ9lYHqiH2xITrnRpCHO/B+Kwm8Y4=" + }, + { + "mvn-path": "org/clojure/core.memoize/1.1.266/core.memoize-1.1.266.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Zvek3RbClguOR180PR5yTZlBxza6YQFtH+Gzxdiaz+4=" + }, + { + "mvn-path": "org/clojure/core.rrb-vector/0.0.11/core.rrb-vector-0.0.11.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-AVogETZIpsDLm1gNAMr9oGS3vnB5ZAGZw5pjbOoGnqE=" + }, + { + "mvn-path": "org/clojure/core.rrb-vector/0.1.2/core.rrb-vector-0.1.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-UfmOunss1C7jDzgmkl3N6HkRZ/dvcSMprlG4gkToE44=" + }, + { + "mvn-path": "org/clojure/core.rrb-vector/0.1.2/core.rrb-vector-0.1.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-juK6yvw4QzWMznZRDXMyQhK7NRn61XgE7Oq9w3rFCR8=" + }, + { + "mvn-path": "org/clojure/core.specs.alpha/0.2.56/core.specs.alpha-0.2.56.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-/PRCveArBKhj8vzFjuaiowxM8Mlw99q4VjTwq3ERZrY=" + }, + { + "mvn-path": "org/clojure/core.specs.alpha/0.2.56/core.specs.alpha-0.2.56.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-AarxdIP/HHSCySoHKV1+e8bjszIt9EsptXONAg/wB0A=" + }, + { + "mvn-path": "org/clojure/core.specs.alpha/0.2.62/core.specs.alpha-0.2.62.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Bu6owHC75FwVhWfkQ0OWgbyMRukSNBT4G/oyukLWy8g=" + }, + { + "mvn-path": "org/clojure/core.specs.alpha/0.2.62/core.specs.alpha-0.2.62.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-F3i70Ti9GFkLgFS+nZGdG+toCfhbduXGKFtn1Ad9MA4=" + }, + { + "mvn-path": "org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-63OsCM9JuoQMiLpnvu8RM2ylVDM9lAiAjXiUbg/rnds=" + }, + { + "mvn-path": "org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-M0EOuKpz1S2Vez3G4KZfOZisBiPL2BPZDDPm5onEJCk=" + }, + { + "mvn-path": "org/clojure/data.csv/1.1.1/data.csv-1.1.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-WDeITDYjfMa4tT7KXl8BO43r5RxseaO5CE9r2TDsOIo=" + }, + { + "mvn-path": "org/clojure/data.csv/1.1.1/data.csv-1.1.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-nHOrKcfAfKW0Xcqu3tf5HRRgdiLhPntsbg2SKKQtOmI=" + }, + { + "mvn-path": "org/clojure/data.fressian/1.1.1/data.fressian-1.1.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-RfxmIaoStYBeJMFyTyO3XbcTzd2bYBm5awno5/VcQ/Q=" + }, + { + "mvn-path": "org/clojure/data.fressian/1.1.1/data.fressian-1.1.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-xVgm1t4sv/aI7nBqpYdC5wDmfj1ag/9vtl6tYFMdJUc=" + }, + { + "mvn-path": "org/clojure/data.json/0.2.6/data.json-0.2.6.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-/Fe/UH6xwY8Hg0QgCh5Z6BDeZOz5Oa65s1tC/NMyt60=" + }, + { + "mvn-path": "org/clojure/data.json/2.5.2/data.json-2.5.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-CTjHMJYdMrMx6n5c18aoIsCoid73nRw/KvTdIB/d3rM=" + }, + { + "mvn-path": "org/clojure/data.json/2.5.2/data.json-2.5.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-gYyHeAJwKIq6pyOb7N0G0ZZe84R15kOEZuxn/PwRf5o=" + }, + { + "mvn-path": "org/clojure/data.priority-map/1.2.0/data.priority-map-1.2.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-pFI2JqHMxPzg0e/m3xaJf8PjS1hzjwRi5FNq8X3qAvA=" + }, + { + "mvn-path": "org/clojure/data.priority-map/1.2.0/data.priority-map-1.2.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-5AFU7xhg1RsLC7ksuzVJKxJskie8LRWPB2jaSyCTsTo=" + }, + { + "mvn-path": "org/clojure/data.xml/0.2.0-alpha11/data.xml-0.2.0-alpha11.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-YY+blyJU91nqbWVja10G6BoMoDkoNsp6OHISXfTC4UM=" + }, + { + "mvn-path": "org/clojure/data.xml/0.2.0-alpha11/data.xml-0.2.0-alpha11.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-z0sAEybAC+mfP0Z50b4srEtiZkftuOOcFFiGBsFVD2g=" + }, + { + "mvn-path": "org/clojure/google-closure-library-third-party/0.0-20250515-f04e4c0e/google-closure-library-third-party-0.0-20250515-f04e4c0e.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-SZqLXub/xjYyvedFqYAjlnp6Zsy2rXZBESH7J0XY06M=" + }, + { + "mvn-path": "org/clojure/google-closure-library-third-party/0.0-20250515-f04e4c0e/google-closure-library-third-party-0.0-20250515-f04e4c0e.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-TX1OZAz3yokzJgwVADhNHi/CFKtRNvLGiV5ZNUS6qtY=" + }, + { + "mvn-path": "org/clojure/google-closure-library/0.0-20250515-f04e4c0e/google-closure-library-0.0-20250515-f04e4c0e.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-RRzDKmiXRIySWpxyM4p6VzqHS9PaCzhe2ofoHAYNfho=" + }, + { + "mvn-path": "org/clojure/google-closure-library/0.0-20250515-f04e4c0e/google-closure-library-0.0-20250515-f04e4c0e.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-d/hqGjVnAj14PBUCtCi/6+QEmHPd88SCowGYnPopPvc=" + }, + { + "mvn-path": "org/clojure/java.classpath/1.0.0/java.classpath-1.0.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-wU4OEDBKXlz9LMdC+976wfUpPuxgcML/6JA/tcf+fW8=" + }, + { + "mvn-path": "org/clojure/java.classpath/1.0.0/java.classpath-1.0.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-C+AThRRX/CTENM5FU0ZD8iblwQgASGJT/Tc/LglUXig=" + }, + { + "mvn-path": "org/clojure/java.classpath/1.1.1/java.classpath-1.1.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-UYvStrjCvvmG4j1znGbf3lmyMPUIhcpa7l7YuKfks4g=" + }, + { + "mvn-path": "org/clojure/java.classpath/1.1.1/java.classpath-1.1.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-k1UR4Mo24bHRCCdnPNI0u3Xmxc60JmZpqvXiyaWR1CE=" + }, + { + "mvn-path": "org/clojure/java.data/1.4.120/java.data-1.4.120.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-jRby4LVCDXfks0Ra2KT4ggWVj201POdpxdDkhZlOkxc=" + }, + { + "mvn-path": "org/clojure/java.data/1.4.120/java.data-1.4.120.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-x7W1UmyHqlPmcBYPsK1FMYeqCmLKbJGODX8xAbSuf2w=" + }, + { + "mvn-path": "org/clojure/math.numeric-tower/0.0.4/math.numeric-tower-0.0.4.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Crctj8l20hUlovMsUs37nJgIqefvjbewgDrKQ4GMgqU=" + }, + { + "mvn-path": "org/clojure/math.numeric-tower/0.0.4/math.numeric-tower-0.0.4.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-CngK5eJjqbgkFceq+FEk0QCfokGKfsEdjJ4DqwbWIpA=" + }, + { + "mvn-path": "org/clojure/pom.contrib/0.1.2/pom.contrib-0.1.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-RoC9g43MuowXwlgXE0fxb1uq5rXft4Grc4K8Y4X/gAY=" + }, + { + "mvn-path": "org/clojure/pom.contrib/0.2.2/pom.contrib-0.2.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-4OoifEnFw+MHVM0m/MV75+Telz/kOqXMZmdAHsXBAyM=" + }, + { + "mvn-path": "org/clojure/pom.contrib/0.3.0/pom.contrib-0.3.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-fxgrOypUPgV0YL+T/8XpzvasUn3xoTdqfZki6+ee8Rk=" + }, + { + "mvn-path": "org/clojure/pom.contrib/1.1.0/pom.contrib-1.1.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-EOzku1+YKQENwWVh9C67g7ry9HYFtR+RBbkvPKoIlxU=" + }, + { + "mvn-path": "org/clojure/pom.contrib/1.2.0/pom.contrib-1.2.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-CRbXpBVYuVAKQnyIb6KYJ6zlJZIGvjrTPmTilvwaYRE=" + }, + { + "mvn-path": "org/clojure/pom.contrib/1.3.0/pom.contrib-1.3.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-g5qUXfrO6lvVB5+CSPM0bdIULesJFGyj9dG/riYxCWc=" + }, + { + "mvn-path": "org/clojure/pom.contrib/1.4.0/pom.contrib-1.4.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-CZNnaHYIH0kbpa+C+mtaA3o77joSWgLW1eJ6op81Z4c=" + }, + { + "mvn-path": "org/clojure/spec.alpha/0.2.194/spec.alpha-0.2.194.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-z2iZ+YUpjGSxPqEplGrZAo3uja3w6rmuGORVAn04JJw=" + }, + { + "mvn-path": "org/clojure/spec.alpha/0.2.194/spec.alpha-0.2.194.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-WhHw4eizwFLmUcSYxpRbRNs1Nb8sGHGf3PZd8fiLE+Y=" + }, + { + "mvn-path": "org/clojure/spec.alpha/0.3.218/spec.alpha-0.3.218.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Z+yJjrVcZqlXpVJ53YXRN2u5lL2HZosrDeHrO5foquA=" + }, + { + "mvn-path": "org/clojure/spec.alpha/0.3.218/spec.alpha-0.3.218.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-bY3hTDrIdXYMX/kJVi/5hzB3AxxquTnxyxOeFp/pB1g=" + }, + { + "mvn-path": "org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-lM2ZtupjlkHzevSGCmQ7btOZ7lqL5dcXz/C2Y8jXUHc=" + }, + { + "mvn-path": "org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-PLp+DcwIXEzpLd3/6iJhJP+sF4vnm9A3m1suMKlpy+o=" + }, + { + "mvn-path": "org/clojure/test.check/1.1.3/test.check-1.1.3.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-iwY3sTmCc0dC+z9NEp8KnZ49dSsa7AxvZc7UVV9ytkk=" + }, + { + "mvn-path": "org/clojure/test.check/1.1.3/test.check-1.1.3.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-pPIf6yOG+/zUKlIgDRTA94u+9omfdIzO/LCkSZ4P3sU=" + }, + { + "mvn-path": "org/clojure/tools.analyzer.jvm/1.3.2/tools.analyzer.jvm-1.3.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-2KLVkgWiEoHzBfPVQ5/8MCGCwwf5vpYqds6BSmYgaT0=" + }, + { + "mvn-path": "org/clojure/tools.analyzer.jvm/1.3.2/tools.analyzer.jvm-1.3.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-5dqkmyeBCTnjogdvW2GDf/MdIi2W/7YieNRhn919MMg=" + }, + { + "mvn-path": "org/clojure/tools.analyzer.jvm/1.3.3/tools.analyzer.jvm-1.3.3.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ceJwlE7TlTZD+Lb2YgNRx1hrdDAQiIXi+/CBFFRjJDE=" + }, + { + "mvn-path": "org/clojure/tools.analyzer.jvm/1.3.3/tools.analyzer.jvm-1.3.3.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-NT2ndQ/qM5159BD1IPByEABLXAsXfooxDz2HjW5pIKM=" + }, + { + "mvn-path": "org/clojure/tools.analyzer/1.2.0/tools.analyzer-1.2.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-eAGlp+9P139WDDCmOFlER8Oqce54t/CIVTt5Gb0AM7s=" + }, + { + "mvn-path": "org/clojure/tools.analyzer/1.2.0/tools.analyzer-1.2.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-iCMhqlKL6Q+9ikOlem76axkg+i6g7cf++kHzzTf3IQU=" + }, + { + "mvn-path": "org/clojure/tools.cli/1.1.230/tools.cli-1.1.230.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-v7Yh5LAaW4vOEWpgcIQNzdWUnomceEaNgRtuiqqf0cc=" + }, + { + "mvn-path": "org/clojure/tools.cli/1.4.256/tools.cli-1.4.256.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Ki0Xaapc7VqkDpLI/1aOonUTmLDqRVIDCHdOwjF6vO4=" + }, + { + "mvn-path": "org/clojure/tools.cli/1.4.256/tools.cli-1.4.256.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-/qEx3Gd2IhiOYSq+ReiSocpFmL7w8URl04ul1Y9+qd4=" + }, + { + "mvn-path": "org/clojure/tools.deps.edn/0.9.27/tools.deps.edn-0.9.27.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-0eQMYSpg86+wJfYOu7/6x/kmwKrwRsIEdV8gc3btUJ8=" + }, + { + "mvn-path": "org/clojure/tools.deps.edn/0.9.27/tools.deps.edn-0.9.27.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-pYloE8XP+XC6XCSQkHxVGjkAOp1dS4EZ4tzzM3odo6E=" + }, + { + "mvn-path": "org/clojure/tools.deps.maven-s3-transporter/0.1.3/tools.deps.maven-s3-transporter-0.1.3.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-+rRkazHZHV4YQ7zIsoEaJ4xs73kDVfhWt1JOflqgdUg=" + }, + { + "mvn-path": "org/clojure/tools.deps.maven-s3-transporter/0.1.3/tools.deps.maven-s3-transporter-0.1.3.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-dW5QF33mDLDl0PB4LUiXo8QcR48ooO44N05kkMm/yqE=" + }, + { + "mvn-path": "org/clojure/tools.deps/0.31.1629/tools.deps-0.31.1629.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-QUrSMEaUnDmMAzJuKJg2tPSZJG0Ihhw+xgDq40KwESk=" + }, + { + "mvn-path": "org/clojure/tools.deps/0.31.1629/tools.deps-0.31.1629.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-RD2wjmJKW+kvTxXTabgpMMscMlLGoU3L0BKH3J7Emvw=" + }, + { + "mvn-path": "org/clojure/tools.gitlibs/2.6.217/tools.gitlibs-2.6.217.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-UIsn4S8GCeYQRklvfs/uKzZGmHY8V1TjOz54eBtpooY=" + }, + { + "mvn-path": "org/clojure/tools.gitlibs/2.6.217/tools.gitlibs-2.6.217.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-0JyMRjmXNExq5mDjadoFvxvpZaYyKZN5aB3et4P4vs4=" + }, + { + "mvn-path": "org/clojure/tools.logging/1.3.1/tools.logging-1.3.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-E/uX6iRyBW6gZg1Pjoi09mSGws//OAuChZqzzTNZKTU=" + }, + { + "mvn-path": "org/clojure/tools.logging/1.3.1/tools.logging-1.3.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-A/4nG3X8Tivpwf/mwLRWTb8DHEIn6zTs9TyjorHqHqE=" + }, + { + "mvn-path": "org/clojure/tools.namespace/1.5.1/tools.namespace-1.5.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-boncDPmD5nDqdaLXfUMlWZvh1MMM8KgnUnLNrBlcxAE=" + }, + { + "mvn-path": "org/clojure/tools.namespace/1.5.1/tools.namespace-1.5.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-rE1dF5dtq8rcaNg4PQh8XsKAjOKlu6xROKIHNS4kMPI=" + }, + { + "mvn-path": "org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-rvXugot8sUocWPRbn4oQ/zQMV2mSXqDvXDXR5J2SC+o=" + }, + { + "mvn-path": "org/clojure/tools.reader/1.5.2/tools.reader-1.5.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-y5btDv3wuLw2JjLLdAZ+8iX2sD8/R4yLpEGC9qF6N7Y=" + }, + { + "mvn-path": "org/clojure/tools.reader/1.5.2/tools.reader-1.5.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-uZlvXJtX4jSGPzlfzmT5fTBQtPWFMKYhWllpsILSFOc=" + }, + { + "mvn-path": "org/clojure/tools.reader/1.6.0/tools.reader-1.6.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-A23BVfO2JUjfPak0eRqp2Ow2VyqcZkzizH9lUYVkNr4=" + }, + { + "mvn-path": "org/clojure/tools.reader/1.6.0/tools.reader-1.6.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-mGRly/l5AhPGigugOvNs+3bGljKD/GU31XAC3plHeHc=" + }, + { + "mvn-path": "org/codehaus/plexus/plexus-cipher/2.0/plexus-cipher-2.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-mn8bXFqe/9Yerf2HMUUqL3ao55ER+sOR73XqgBvqIDo=" + }, + { + "mvn-path": "org/codehaus/plexus/plexus-cipher/2.0/plexus-cipher-2.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-BIQvMxsCJbhaXiBDlxDSKOp6YwKr5tU8nJhG+8W/mf8=" + }, + { + "mvn-path": "org/codehaus/plexus/plexus-interpolation/1.29/plexus-interpolation-1.29.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-CI1ETbzt+zhGMNhoZpfs48QB1vM8j4s6pyWeocaZaHg=" + }, + { + "mvn-path": "org/codehaus/plexus/plexus-interpolation/1.29/plexus-interpolation-1.29.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-zg1WNCl7seBl3d/ciipWdXF8COj0eD7c9YFUNxFRaTg=" + }, + { + "mvn-path": "org/codehaus/plexus/plexus-sec-dispatcher/2.0/plexus-sec-dispatcher-2.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-hzE5lgxMeAF23aWAsAOixL+CGIvc5buZI04iTves/Os=" + }, + { + "mvn-path": "org/codehaus/plexus/plexus-sec-dispatcher/2.0/plexus-sec-dispatcher-2.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-myi7MHAXk4qU0GyFsrCZvEaRK4WdCE+yk+Vp9DLq23w=" + }, + { + "mvn-path": "org/codehaus/plexus/plexus-utils/3.6.1/plexus-utils-3.6.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-BaY+/9Z+LWudYQzILivXRzKJ00gC5XpSmygRDyivVnk=" + }, + { + "mvn-path": "org/codehaus/plexus/plexus-utils/3.6.1/plexus-utils-3.6.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-yDlzc3ga9kCnbF2ojxZ0KTtPyaI5HQdo7j/HkYg7BA0=" + }, + { + "mvn-path": "org/codehaus/plexus/plexus/24/plexus-24.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-iaG8eeRsNasQi34hW7LFwhX/jzrxrjz++C2aKzOwbFE=" + }, + { + "mvn-path": "org/codehaus/plexus/plexus/25/plexus-25.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-+qeUfCAglnrQySslnun6Nh0F6QzQNtF8NwmLse2uo6M=" + }, + { + "mvn-path": "org/codehaus/plexus/plexus/8/plexus-8.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-/6NJ2wTnq/ZYhb3FogYvQZfA/50/H04qpXILdyM/dCw=" + }, + { + "mvn-path": "org/eclipse/ee4j/project/1.0.6/project-1.0.6.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Tn2DKdjafc8wd52CQkG+FF8nEIky9aWiTrkHZ3vI1y0=" + }, + { + "mvn-path": "org/eclipse/ee4j/project/1.0.7/project-1.0.7.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-IFwDmkLLrjVW776wSkg+s6PPlVC9db+EJg3I8oIY8QU=" + }, + { + "mvn-path": "org/eclipse/jetty/jetty-bom/9.4.45.v20220203/jetty-bom-9.4.45.v20220203.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-6GaLKkTnymO8Jr36Iyevfj+X9wncvMXnsQnYH+w6VbY=" + }, + { + "mvn-path": "org/flatland/ordered/1.15.12/ordered-1.15.12.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-NwD9NzndCSj5SRi3EEWl+IxD+Vr+Z+GjVeuGPi+ZJeA=" + }, + { + "mvn-path": "org/flatland/ordered/1.15.12/ordered-1.15.12.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-vWUBX+NY7K6ZF+LJ46oSAAY6ika0F5KVjRo1R13H8Oo=" + }, + { + "mvn-path": "org/fressian/fressian/0.6.8/fressian-0.6.8.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Npv9hRrCPLWzGXkVZ9EB3gcMr9dv4nZer1qUjvY2mRU=" + }, + { + "mvn-path": "org/fressian/fressian/0.6.8/fressian-0.6.8.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-UEQwJEwUqoCXVhyztVZJSuxo5NItDZ2iXZLKeHLa/WQ=" + }, + { + "mvn-path": "org/hdrhistogram/HdrHistogram/2.2.2/HdrHistogram-2.2.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ItHUMWxOwTpotVnpjIJW1pBxWTcx2pYTZkD4ZPoU+tg=" + }, + { + "mvn-path": "org/hdrhistogram/HdrHistogram/2.2.2/HdrHistogram-2.2.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-JiM0ZTf3BvIgWbkRcgnLBoGwJBFFs1x10sXj7EGCZ2Y=" + }, + { + "mvn-path": "org/jboss/jboss-parent/23/jboss-parent-23.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-bPr6FVv0aJ5KySbQDxDwWBbpqyVXOUNt/kLZk1KpVhM=" + }, + { + "mvn-path": "org/jboss/jboss-parent/34/jboss-parent-34.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-SnwiYk4BxsRbAh/EYJ6INagHxaai2WFeiq5j6iCtSFk=" + }, + { + "mvn-path": "org/jboss/jboss-parent/43/jboss-parent-43.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-PDredvuIOs25qKAzVdHfQGb/ucjHjwmyGenA/Co/Qxc=" + }, + { + "mvn-path": "org/jboss/jboss-parent/50/jboss-parent-50.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-T8NBJJkZz8/LIY64Zw+uXV/rqa+dyXLaoXo7qvSJFAU=" + }, + { + "mvn-path": "org/jboss/jboss-parent/51/jboss-parent-51.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Lh91oQ4VgfMvj/1mKRQU5ZkMfJZruwedu1IVGEmpzM4=" + }, + { + "mvn-path": "org/jboss/logging/jboss-logging/3.6.2.Final/jboss-logging-3.6.2.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-9CPge//Oc78rbMhy8wmBwG/pz9WoagtPX73RHP4BSOA=" + }, + { + "mvn-path": "org/jboss/logging/jboss-logging/3.6.2.Final/jboss-logging-3.6.2.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-N3C1wQ/QiQBVVTq+mzf8niXgrn9VaxNEKbNCR7oaJAk=" + }, + { + "mvn-path": "org/jboss/shrinkwrap/shrinkwrap-bom/1.2.6/shrinkwrap-bom-1.2.6.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-HArIAaoxJb3l6IFrqHijJDJZw5bS845nbihSqcxVADY=" + }, + { + "mvn-path": "org/jboss/threads/jboss-threads/3.9.2/jboss-threads-3.9.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-rA/QRGhhIgFBQyZ9NogkWFLKB8bER0MgyRcgYqWvZjQ=" + }, + { + "mvn-path": "org/jboss/threads/jboss-threads/3.9.2/jboss-threads-3.9.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-qs5T/VV6Kass8SlBr2LXrSmqObuLGEYDx50sycMe/v0=" + }, + { + "mvn-path": "org/jboss/xnio/xnio-all/3.8.16.Final/xnio-all-3.8.16.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-N4WVxwPU7C3gsx6r8srQhxSfNHK8RsqDpvAnmxd3RRw=" + }, + { + "mvn-path": "org/jboss/xnio/xnio-api/3.8.16.Final/xnio-api-3.8.16.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-NXIJj+FofavZDwIiCA+xWPY8p3HELvHTmXRDSEn3i8Q=" + }, + { + "mvn-path": "org/jboss/xnio/xnio-api/3.8.16.Final/xnio-api-3.8.16.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-rTWKhTspPiUCRfkr2qnn9Rokv20VjR0SuYybQWr1J60=" + }, + { + "mvn-path": "org/jboss/xnio/xnio-nio/3.8.16.Final/xnio-nio-3.8.16.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-zuGtlnT/RhX0kqMUqYbHe3wiOuAyVcd6rMYMbOpi1Zw=" + }, + { + "mvn-path": "org/jboss/xnio/xnio-nio/3.8.16.Final/xnio-nio-3.8.16.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-k+JZm2FdarytEYxCDdUj2nFPCq9whZLwMI0NQ/e38i0=" + }, + { + "mvn-path": "org/jline/jline-native/3.30.0/jline-native-3.30.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-3nCyK5PSSRx8ijDT8/IbumeIcbCoIbkTq+7hWgeN4/k=" + }, + { + "mvn-path": "org/jline/jline-native/3.30.0/jline-native-3.30.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-0yKbGh9GNRjV/lHbfHrlf/rbsAN6LyozuRQ7pDmJ/XM=" + }, + { + "mvn-path": "org/jline/jline-parent/3.30.0/jline-parent-3.30.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-cXg92KBYQZWeuOU6NOvM1ejGBr29a7cTeVrhoCU79KA=" + }, + { + "mvn-path": "org/jline/jline-reader/3.30.0/jline-reader-3.30.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-wO6kE6A+6VIKWCoC4FK7vbzJxkfVuo4checGVp6jjPk=" + }, + { + "mvn-path": "org/jline/jline-reader/3.30.0/jline-reader-3.30.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-SeZAojFXMZtrPC1r+HjjiEkKmUwBIEvfq+zw/3T5fuE=" + }, + { + "mvn-path": "org/jline/jline-terminal-ffm/3.30.0/jline-terminal-ffm-3.30.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-hXeHvU5HHuYc8jLvRDvZt6wWXk9EYuRLruZDV8SffBU=" + }, + { + "mvn-path": "org/jline/jline-terminal-ffm/3.30.0/jline-terminal-ffm-3.30.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-fxJO7JG8MiFglBf3OxvKOHYdHLi6YPDBXgeUNS0Fw30=" + }, + { + "mvn-path": "org/jline/jline-terminal-jni/3.30.0/jline-terminal-jni-3.30.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-QP9/LaXjWQXPzhonUQFA1qrBNefFrOWiPUm2hZRWtEs=" + }, + { + "mvn-path": "org/jline/jline-terminal-jni/3.30.0/jline-terminal-jni-3.30.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-7Y/fkf3wFDEfWuGxgLRcUDA4Zr7MXXE5hknzkhfNoOA=" + }, + { + "mvn-path": "org/jline/jline-terminal/3.30.0/jline-terminal-3.30.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-UYkw0kSLuq3yU6isJj3vF+EgI1xb1d9EZ9jYym6EPSU=" + }, + { + "mvn-path": "org/jline/jline-terminal/3.30.0/jline-terminal-3.30.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-LTi3e/R9whqz8O7NFI8kE/fflL3kjq/Qz5mePuGvJ0A=" + }, + { + "mvn-path": "org/jsoup/jsoup/1.23.2/jsoup-1.23.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-6djIVoVmgEJ/CW0VbwKkFCiZhckwmY/LUZzlvjm0IAM=" + }, + { + "mvn-path": "org/jsoup/jsoup/1.23.2/jsoup-1.23.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-P/KL6v1ITpw0XgdJ1pfSqjHyms5UtdTaToN15tj+GAI=" + }, + { + "mvn-path": "org/jspecify/jspecify/1.0.1/jspecify-1.0.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Bw118mH+TFuCAlCDZnFffy1GYPiMjvfm01deSMloO2Y=" + }, + { + "mvn-path": "org/jspecify/jspecify/1.0.1/jspecify-1.0.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-VbOL8aex2OpRjPL0866aqiNuYbvwtr0x/7SXU6BZ3V4=" + }, + { + "mvn-path": "org/junit/junit-bom/5.10.2/junit-bom-5.10.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Fp3ZBKSw9lIM/+ZYzGIpK/6fPBSpifqSEgckzeQ6mWg=" + }, + { + "mvn-path": "org/junit/junit-bom/5.10.3/junit-bom-5.10.3.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-EJN9RMQlmEy4c5Il00cS4aMUVkHKk6w/fvGG+iX2urw=" + }, + { + "mvn-path": "org/junit/junit-bom/5.11.0-M2/junit-bom-5.11.0-M2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Sj/8Sk7c/sLLXWGZInBqlAcWF5hXGTn4VN/ac+ThfMg=" + }, + { + "mvn-path": "org/junit/junit-bom/5.11.4/junit-bom-5.11.4.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-GdS3R7IEgFMltjNFUylvmGViJ3pKwcteWTpeTE9eQRU=" + }, + { + "mvn-path": "org/junit/junit-bom/5.12.2/junit-bom-5.12.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-zvgP7IZFT2gGv7DfJGabXG8y4styhTnqhZ9H39ybvBc=" + }, + { + "mvn-path": "org/junit/junit-bom/5.13.1/junit-bom-5.13.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-+mhFHqgwVy7UP/5R11tqBfel5mWmAqUfSda+AgY6ZfM=" + }, + { + "mvn-path": "org/junit/junit-bom/5.13.3/junit-bom-5.13.3.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-47k+m7iHGWnPEcDo/xD1B4QdsYhcoQV44pCEb2YP1o4=" + }, + { + "mvn-path": "org/junit/junit-bom/5.13.4/junit-bom-5.13.4.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-16CKmbJQLwu2jNTh+YTwv2kySqogi9D3M2bAP8NUikI=" + }, + { + "mvn-path": "org/junit/junit-bom/5.14.1/junit-bom-5.14.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-AbAd+jZlULQKxXYFSKfXKLYQnRfEUeg4ZNHl4M6GLJQ=" + }, + { + "mvn-path": "org/junit/junit-bom/5.14.2/junit-bom-5.14.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-7S3MeFW9RgvMyTob8Mli5jtWb/fY8d7Q8fJZO6gYOq8=" + }, + { + "mvn-path": "org/junit/junit-bom/5.14.3/junit-bom-5.14.3.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-CKAoVuSHyTV/mynjh0X4roBYSBEectFarQNSM48WMuE=" + }, + { + "mvn-path": "org/junit/junit-bom/5.14.4/junit-bom-5.14.4.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Vwbo8poKB/Vu+76koGcHk0FBlLuNJNgUO6Hnh6LzKFY=" + }, + { + "mvn-path": "org/la4j/la4j/0.6.0/la4j-0.6.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-wTS8hDWlPHUtIzc5yaYwUhrMvl6rUGu80sPcKZnyLtA=" + }, + { + "mvn-path": "org/la4j/la4j/0.6.0/la4j-0.6.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-GNr/BWVagMboQzxyjZ4if4cO9DDEUbJaVlEMpWpWekI=" + }, + { + "mvn-path": "org/latencyutils/LatencyUtils/2.0.3/LatencyUtils-2.0.3.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-oyqf+gay9OAcU2D4+d97xdlFSl03PNjzYTR/paVxZew=" + }, + { + "mvn-path": "org/latencyutils/LatencyUtils/2.0.3/LatencyUtils-2.0.3.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-jwwBU3kLhK9sCTFtVpvRBu4PAIuTk+gLpHj1v2Vziig=" + }, + { + "mvn-path": "org/mockito/mockito-bom/4.11.0/mockito-bom-4.11.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-2FMadGyYj39o7V8YjN6pRQBq6pk+xd+eUk4NJ9YUkdo=" + }, + { + "mvn-path": "org/msgpack/msgpack-core/0.9.12/msgpack-core-0.9.12.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Jh544yIn0pjyXDKK7NUyp4nUh9gHP5e6m2qm2+QaK+M=" + }, + { + "mvn-path": "org/msgpack/msgpack-core/0.9.12/msgpack-core-0.9.12.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-QOy3zxhJEA12WVxAczXjf1GKLF1Mwei5s2KC85XF7R0=" + }, + { + "mvn-path": "org/ow2/asm/asm/9.2/asm-9.2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-udT+TXGTjfOIOfDspCqqpkz4sxPWeNoDbwyzyhmbR/U=" + }, + { + "mvn-path": "org/ow2/asm/asm/9.2/asm-9.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-37EqGyJL8Bvh/WBAIEZviUJBvLZF3M45Xt2M1vilDfQ=" + }, + { + "mvn-path": "org/ow2/asm/asm/9.9.1/asm-9.9.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-bzgoohXJIAWaXvovtVwjPWxU7FytypnOGxvdEAd8fd0=" + }, + { + "mvn-path": "org/ow2/asm/asm/9.9.1/asm-9.9.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-rKaN7pui9s2Q/95yjv3H4+v89Z8/Qfv+JI0tAdW4Zq8=" + }, + { + "mvn-path": "org/ow2/ow2/1.5.1/ow2-1.5.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Mh3bt+5v5PU96mtM1tt0FU1r+kI5HB92OzYbn0hazwU=" + }, + { + "mvn-path": "org/ow2/ow2/1.5/ow2-1.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-D4obEW52C4/mOJxRuE5LB6cPwRCC1Pk25FO1g91QtDs=" + }, + { + "mvn-path": "org/passay/passay-parent/2.0.0/passay-parent-2.0.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-RPfp0rTN3r9KrBSnoCQF9mg9DyLgaPaZXVNNYKaWndI=" + }, + { + "mvn-path": "org/passay/passay/2.0.0/passay-2.0.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-YfF6Y9dVoVjn6vbtkADGu9da5mPX5wT5QfuOXMJvpWI=" + }, + { + "mvn-path": "org/passay/passay/2.0.0/passay-2.0.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-RGmYgibZw2hi+v/I2cWsrz5UK4TwYpafSFXyjHsBDNY=" + }, + { + "mvn-path": "org/postgresql/postgresql/42.7.13/postgresql-42.7.13.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-bg5MwtjK6QIIT4orGHKLBzpv2dH4fJ2L/48pjBgYW5M=" + }, + { + "mvn-path": "org/postgresql/postgresql/42.7.13/postgresql-42.7.13.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-OVdBfsruNCUhthMQ/cIb03/Li7o/dUfs6beP0DzVPyY=" + }, + { + "mvn-path": "org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-91yll3ibPaxY9hhXuawuEDSmj6Zy2zUFWo+0UJ4yXyg=" + }, + { + "mvn-path": "org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-VLoj2HotQ4VAyZ74eUoIVvxXOiVrSYZ4KDw8Z+8Yrag=" + }, + { + "mvn-path": "org/ring-clojure/ring-core-protocols/1.15.3/ring-core-protocols-1.15.3.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-les1EK5xBCc4p2eSaymVSGXgEtqI8Tu/roI7+9d9Avw=" + }, + { + "mvn-path": "org/ring-clojure/ring-core-protocols/1.15.3/ring-core-protocols-1.15.3.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-5AT9lCnTs+9UKPXPgw8HlY79V6hVp8nsaAmwPzwvG1M=" + }, + { + "mvn-path": "org/ring-clojure/ring-core-protocols/1.15.4/ring-core-protocols-1.15.4.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-S5djnX9TYTGENXVBWDeFW9Z+mBN2fOeX5XIoosKJThQ=" + }, + { + "mvn-path": "org/ring-clojure/ring-core-protocols/1.15.4/ring-core-protocols-1.15.4.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-uX1n/33rQPdtyOIo7T1Tt/Uthn/oP39T6V4XAdts0yw=" + }, + { + "mvn-path": "org/ring-clojure/ring-websocket-protocols/1.15.3/ring-websocket-protocols-1.15.3.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-aE4bRgOaRFIp5+kA13+WJ+QK6WUUlbE3PHCEVVoRAeQ=" + }, + { + "mvn-path": "org/ring-clojure/ring-websocket-protocols/1.15.3/ring-websocket-protocols-1.15.3.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-SK+Ln7xwzgCgM5lFhckR5IND3PkmILZ7Ji9iT6UDm5g=" + }, + { + "mvn-path": "org/ring-clojure/ring-websocket-protocols/1.15.4/ring-websocket-protocols-1.15.4.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-bmjAnjHAoQk/ZdquCdaNPLSDreNPxG8cgNzAP8yjees=" + }, + { + "mvn-path": "org/ring-clojure/ring-websocket-protocols/1.15.4/ring-websocket-protocols-1.15.4.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-FWIlY/ZXgqTXvWMHl7Jwy8X0+GJP+hXwzVB8SLwfq3c=" + }, + { + "mvn-path": "org/slf4j/jcl-over-slf4j/1.7.36/jcl-over-slf4j-1.7.36.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-q1fKj9IjdywXNl0SH1npTsvwrlnQjAOjy1uBBxwBkZU=" + }, + { + "mvn-path": "org/slf4j/jcl-over-slf4j/1.7.36/jcl-over-slf4j-1.7.36.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-vZYkPX1CGM18x9RcDjD6E0gKGk+R01bt19/pPx/7aOY=" + }, + { + "mvn-path": "org/slf4j/slf4j-api/2.0.17/slf4j-api-2.0.17.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-FQxAKH987NwhuTgMqsmOkoxPM8Aj22s0jfHFrJdwJr8=" + }, + { + "mvn-path": "org/slf4j/slf4j-api/2.0.18/slf4j-api-2.0.18.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-RFCP0VdlAGiMeQsZCs3Rb+xPjHmj4LkAr9cFA88FX1U=" + }, + { + "mvn-path": "org/slf4j/slf4j-api/2.0.18/slf4j-api-2.0.18.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-bCx/LAJ3TMK3thn70t94c82tKXGJJuRHVLh/cNHrQ8s=" + }, + { + "mvn-path": "org/slf4j/slf4j-bom/2.0.17/slf4j-bom-2.0.17.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-940ntkK0uIbrg5/BArXNn+fzDzdZn/5oGFvk4WCQMek=" + }, + { + "mvn-path": "org/slf4j/slf4j-bom/2.0.18/slf4j-bom-2.0.18.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-khmqtgFXUSbE5m4TMesrDGwXozCsTVoH480R1YCgwS0=" + }, + { + "mvn-path": "org/slf4j/slf4j-nop/1.7.36/slf4j-nop-1.7.36.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-whSViweBbLRBKzDHvb1DCP/ca6KoN2e486kinL2SdNY=" + }, + { + "mvn-path": "org/slf4j/slf4j-nop/1.7.36/slf4j-nop-1.7.36.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-IKD3wGACDXX+9EcK5pSGYdQY69XqRUnGir7fIO6Gy2U=" + }, + { + "mvn-path": "org/slf4j/slf4j-parent/1.7.36/slf4j-parent-1.7.36.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-uziNN/vN083mTDzt4hg4aTIY3EUfBAQMXfNgp47X6BI=" + }, + { + "mvn-path": "org/slf4j/slf4j-parent/2.0.17/slf4j-parent-2.0.17.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-lc1x6FLf2ykSbli3uTnVfsKy5gJDkYUuC1Rd7ggrvzs=" + }, + { + "mvn-path": "org/slf4j/slf4j-parent/2.0.18/slf4j-parent-2.0.18.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-CziWvtrSye2Wl+3L6h2gxUzSOKcjWDqBNYqDv7eC6fo=" + }, + { + "mvn-path": "org/sonatype/oss/oss-parent/7/oss-parent-7.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-tR+IZ8kranIkmVV/w6H96ne9+e9XRyL+kM5DailVlFQ=" + }, + { + "mvn-path": "org/sonatype/oss/oss-parent/9/oss-parent-9.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-+0AmX5glSCEv+C42LllzKyGH7G8NgBgohcFO8fmCgno=" + }, + { + "mvn-path": "org/springframework/spring-framework-bom/5.3.39/spring-framework-bom-5.3.39.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-9tSBCT51dny6Gsfh2zj49pLL4+OHRGkzcada6yHGFIs=" + }, + { + "mvn-path": "org/tcrawley/dynapath/1.1.0/dynapath-1.1.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-n8eqO+Y4XaOtIqBlJvFaXTNdnonUDzm/L5oA4Lu9iug=" + }, + { + "mvn-path": "org/tcrawley/dynapath/1.1.0/dynapath-1.1.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-5OPOTeIWKm8U9QjB0Nv0s9tsrBk5E+kVeAhcGLesJho=" + }, + { + "mvn-path": "org/wildfly/client/wildfly-client-config/1.0.1.Final/wildfly-client-config-1.0.1.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-gKTpY86U67BD7LDywOd9Mn8j3IfYE1C4Y3Uu7fosO7M=" + }, + { + "mvn-path": "org/wildfly/client/wildfly-client-config/1.0.1.Final/wildfly-client-config-1.0.1.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-6HXRTGUNTWchLybTP8xbsrhqAoOfGFVjCcN8XFULvKY=" + }, + { + "mvn-path": "org/wildfly/common/wildfly-common/1.5.4.Final/wildfly-common-1.5.4.Final.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-n9o8r4vVKN7Fbrxw2vePWp/10L/OqLPkGreug4dH5Go=" + }, + { + "mvn-path": "org/wildfly/common/wildfly-common/1.5.4.Final/wildfly-common-1.5.4.Final.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-5uGiImN0fokpANH1Aj4dDf6LFtZe/shy8gV3oGl+01c=" + }, + { + "mvn-path": "org/xerial/sqlite-jdbc/3.53.4.0/sqlite-jdbc-3.53.4.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-vLH1Hjb5QIZ+gzQvnvv1lorESmvvTTl7tK97F7Rc0vs=" + }, + { + "mvn-path": "org/xerial/sqlite-jdbc/3.53.4.0/sqlite-jdbc-3.53.4.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-/1iFVroGqmilaAYvLLnSQ93h9jHq/SAQz+8jyrBqerk=" + }, + { + "mvn-path": "org/yaml/snakeyaml/2.3/snakeyaml-2.3.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Y6dv5mtlI2C9TCwQfm8CWNqn1LtJIAi6jCb80jD/kUY=" + }, + { + "mvn-path": "org/yaml/snakeyaml/2.3/snakeyaml-2.3.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-D1omWgYzGwBJ41K+MsoyLeGLF/PU27cGNdQNppLjWC8=" + }, + { + "mvn-path": "pl/tkowalcz/tjahzi/core/0.9.43/core-0.9.43.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-6rqZQLCEb//Oa9AZUpb3nHcPy/0o24jR6J6RIFZlXNw=" + }, + { + "mvn-path": "pl/tkowalcz/tjahzi/core/0.9.43/core-0.9.43.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-n16ZVHQfVqXSHPz4zY88JI2Q4JVKGWYD4ZlCDBr1ZRs=" + }, + { + "mvn-path": "pl/tkowalcz/tjahzi/log4j2-appender/0.9.43/log4j2-appender-0.9.43.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Y222Ur8dd9t1QAkCeYKpQrc1Nn4TtCZgYv2IvtxAuws=" + }, + { + "mvn-path": "pl/tkowalcz/tjahzi/log4j2-appender/0.9.43/log4j2-appender-0.9.43.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-3igmV1hYOO495o0NU/DJRE7KkyKGY1HIeN2uW7NIPMY=" + }, + { + "mvn-path": "pl/tkowalcz/tjahzi/tjahzi-parent/0.9.43/tjahzi-parent-0.9.43.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ffFGML5eqYj/FP7EbMG1Cg71kgQhuBbK4u5xzwNZRCc=" + }, + { + "mvn-path": "pretty-spec/pretty-spec/0.1.4/pretty-spec-0.1.4.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-hvGRtdQ7MqSZJty1RL6q78+Sf8UYSzanbK8hC4ZjwaE=" + }, + { + "mvn-path": "pretty-spec/pretty-spec/0.1.4/pretty-spec-0.1.4.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-GncKsOPWTdKD15EHpwa0aZ9v2xWi3VVnJ8XxS5bCbyI=" + }, + { + "mvn-path": "progrock/progrock/0.1.2/progrock-0.1.2.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-Aln+tbAkduswC31k5UPrVM5Kw9yuU5gxDxZCdo/VPyo=" + }, + { + "mvn-path": "progrock/progrock/0.1.2/progrock-0.1.2.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-6rULcjyeeEkPWDy5n7HUa8KA/xH9X4Ujub7XamTq8CM=" + }, + { + "mvn-path": "redis/clients/authentication/redis-authx-core/0.1.1-beta2/redis-authx-core-0.1.1-beta2.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-zFbtsIs9+FYs3awQjcphkH0hzErQTeBen10bAQWDkK8=" + }, + { + "mvn-path": "redis/clients/authentication/redis-authx-core/0.1.1-beta2/redis-authx-core-0.1.1-beta2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ts6SnYo8uaOsuaueqQioOyDvMVbVTdNYnxkkMir/+yU=" + }, + { + "mvn-path": "rewrite-clj/rewrite-clj/1.1.48/rewrite-clj-1.1.48.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-p1KzkyJd+YBJD6Id/z5XPs00wYrczUWZAQTXyr4spBE=" + }, + { + "mvn-path": "rewrite-clj/rewrite-clj/1.1.48/rewrite-clj-1.1.48.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-/TmXuG2r6EMKYGVAEYyTb3Ufr3/28W591+m/MtpzWJI=" + }, + { + "mvn-path": "ring/ring-codec/1.3.0/ring-codec-1.3.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-oxdtWPK54uTixsdcBtHfKxYiR+4JupjVJVR+nlnIgO8=" + }, + { + "mvn-path": "ring/ring-codec/1.3.0/ring-codec-1.3.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-7NTqazbyzHjn3jGoUIS5rmFdWLihb9Gj4GuVT9HVxxQ=" + }, + { + "mvn-path": "ring/ring-core/1.15.3/ring-core-1.15.3.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-TY2XCYiY4z6Lt40/DyiwscjO3m2IujpOw17ljpdAB7w=" + }, + { + "mvn-path": "ring/ring-core/1.15.3/ring-core-1.15.3.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-NPKQlHc3j00ir6LHeUH8RXmAijy6lZsG8euvHtMa1x0=" + }, + { + "mvn-path": "selmer/selmer/1.13.5/selmer-1.13.5.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-IksEbH2B7EDQhh3noWR38cYa7iGYF223PMArsuVfGiM=" + }, + { + "mvn-path": "selmer/selmer/1.13.5/selmer-1.13.5.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-712+i9+p1UrjrxDbXS3DMNe1nshAhoi+tdzFZ0DwnwY=" + }, + { + "mvn-path": "slingshot/slingshot/0.12.2/slingshot-0.12.2.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-porCK/LqPNVM4023D9aYRNYx71SfZFDCeMMOb3nfY/M=" + }, + { + "mvn-path": "slingshot/slingshot/0.12.2/slingshot-0.12.2.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-SrxOK5ppxzvTc+gy0/AOWQZ4Q/+DUe/V7rsfOCTbnFE=" + }, + { + "mvn-path": "software/amazon/awssdk/annotations/2.54.5/annotations-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-RihZtIrA3EvSPcHGiy5NM6JDxlfBGfRfJIpUqDwLyug=" + }, + { + "mvn-path": "software/amazon/awssdk/annotations/2.54.5/annotations-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-webK+YzUdn66zGc4PlYTOsKRB+sk9q3KSPnDq5dlvvU=" + }, + { + "mvn-path": "software/amazon/awssdk/apache5-client/2.54.5/apache5-client-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-C6UZ0lfC3mPS3cM5UBzP56sGQ2eBEL37scBV+nqk69A=" + }, + { + "mvn-path": "software/amazon/awssdk/apache5-client/2.54.5/apache5-client-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-vH9nTdMWX3hJvvEDsEd+3pEcAdASBjGwXWVgNU9zKik=" + }, + { + "mvn-path": "software/amazon/awssdk/arns/2.54.5/arns-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-IXNpfvtIyy6e0OppBXMy3WSODVx9bAgZky3z8EGMQaE=" + }, + { + "mvn-path": "software/amazon/awssdk/arns/2.54.5/arns-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-uRw1NbwBidoLQTbKwIC/oy37Az0EAoM4D0zsfuYCEl8=" + }, + { + "mvn-path": "software/amazon/awssdk/auth/2.54.5/auth-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-SUDEdAUX6fVjPQnC0ag0Y5uT8s+AP0ArmPVdk1O8xyE=" + }, + { + "mvn-path": "software/amazon/awssdk/auth/2.54.5/auth-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-0+mqnlr3QPWQ+eHLqRRua1uVjPognKNrGVmywqcUJxo=" + }, + { + "mvn-path": "software/amazon/awssdk/aws-core/2.54.5/aws-core-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-LgEABrs7gfAJEvYutkr1olYUbis9Mg7brdklLcoklE8=" + }, + { + "mvn-path": "software/amazon/awssdk/aws-core/2.54.5/aws-core-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-t97r06cw1Sl7325fp3HeC9LfpzMqV3pfHC2Q5sJBqWU=" + }, + { + "mvn-path": "software/amazon/awssdk/aws-query-protocol/2.54.5/aws-query-protocol-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-As0WTbxYOGsj/iv6xGiFtUtzjJ2NX28vP19mr8MzWX0=" + }, + { + "mvn-path": "software/amazon/awssdk/aws-query-protocol/2.54.5/aws-query-protocol-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-3GAhABawRYlYtmWj4OYodrWWmCO10rHuv+m0jqz3ziA=" + }, + { + "mvn-path": "software/amazon/awssdk/aws-sdk-java-pom/2.54.5/aws-sdk-java-pom-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-oOKqC9N4LDoFOtVyWh69qf6M9dGvY742ujRdIvvWQf0=" + }, + { + "mvn-path": "software/amazon/awssdk/aws-xml-protocol/2.54.5/aws-xml-protocol-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-KqOYw/OeDb7hYA/S/JCb+sqHkl4KOa5kj5WFtyBDQes=" + }, + { + "mvn-path": "software/amazon/awssdk/aws-xml-protocol/2.54.5/aws-xml-protocol-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-i0dDFZYbBGZtHRdOFkz695TWR5QOtyb2tR8lr+DwlyU=" + }, + { + "mvn-path": "software/amazon/awssdk/bom-internal/2.54.5/bom-internal-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ckhvSi3UdzRZe4292KEnk3bPtnkrsK1wjiNOVAw2xWw=" + }, + { + "mvn-path": "software/amazon/awssdk/checksums-spi/2.54.5/checksums-spi-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-mB2eUL6sOJ/3gVT7CGn961S+8sINTKC0U2XGlqfVAKQ=" + }, + { + "mvn-path": "software/amazon/awssdk/checksums-spi/2.54.5/checksums-spi-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-r0ypOTm7aPToomujseg2BxS7T1hXAdYpiDSQebfW0ZA=" + }, + { + "mvn-path": "software/amazon/awssdk/checksums/2.54.5/checksums-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-2z/6/3zUW0BIOZREiBA5vIvmgZRWoY5eMh2elyArQ1E=" + }, + { + "mvn-path": "software/amazon/awssdk/checksums/2.54.5/checksums-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-4a/Bb2lb+sxpFeUpSqtqHJhJVJ7av3XJL8LrJGayPEk=" + }, + { + "mvn-path": "software/amazon/awssdk/core/2.54.5/core-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-rhy6psKUdWqqwwa+9qBjPeteJbU8Ft7isi+8gIjzNAg=" + }, + { + "mvn-path": "software/amazon/awssdk/crt-core/2.54.5/crt-core-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-MEi/GS0qs5LXctdvalh7wjeiMIPGpMbGk6zaLKYnDUA=" + }, + { + "mvn-path": "software/amazon/awssdk/crt-core/2.54.5/crt-core-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ym/Ju9W1Bb8uzrHwvMBRhrTDT/eh0ghLOk9LFKpXom4=" + }, + { + "mvn-path": "software/amazon/awssdk/endpoints-spi/2.54.5/endpoints-spi-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-JfOnX7OrX5QNvwkhxshFAIaY7Bw9T5RYda0ut0vJAzc=" + }, + { + "mvn-path": "software/amazon/awssdk/endpoints-spi/2.54.5/endpoints-spi-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-pOq2I8E0+YTCXnW3e0xe82FQRHH6Kg1Fl4E4I6nTBiE=" + }, + { + "mvn-path": "software/amazon/awssdk/http-auth-aws-eventstream/2.54.5/http-auth-aws-eventstream-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-gsBOJsJJv6v46tiL8IqF/Ed3n2bfO0lZAChhzXjihSM=" + }, + { + "mvn-path": "software/amazon/awssdk/http-auth-aws-eventstream/2.54.5/http-auth-aws-eventstream-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-LMzagG5Y3MxPyhhflKL4fuOmj1ksAiiQfrttmBTx8iU=" + }, + { + "mvn-path": "software/amazon/awssdk/http-auth-aws/2.54.5/http-auth-aws-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-NOWkDQhkmDkR1spuXWwBcZwcCsc2Wx7OSJDbN2xmwK0=" + }, + { + "mvn-path": "software/amazon/awssdk/http-auth-aws/2.54.5/http-auth-aws-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-/i/AI+70g/Q58ISImhDeeqeQZGyVY8bPxBatcY/k1UM=" + }, + { + "mvn-path": "software/amazon/awssdk/http-auth-spi/2.54.5/http-auth-spi-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-O++xJMpB2dOBdMir0HxpxufiuRI4vGShSulGd7jpptA=" + }, + { + "mvn-path": "software/amazon/awssdk/http-auth-spi/2.54.5/http-auth-spi-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-cFbTeQsXGMFw5B++RngdgAcAsTfdRxNGgrBZbGI67+8=" + }, + { + "mvn-path": "software/amazon/awssdk/http-auth/2.54.5/http-auth-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-C8sBOEgOMQoN7kf5K4pgp7uxi1yeUBoOPaJxr/JoDL8=" + }, + { + "mvn-path": "software/amazon/awssdk/http-auth/2.54.5/http-auth-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-YpR7vJoSmwrdGbojOs3fAxrKr9nUY71zGsWFUiN2/9k=" + }, + { + "mvn-path": "software/amazon/awssdk/http-client-spi/2.54.5/http-client-spi-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-PsK7GZlaM9rLZje/38erb78RqZEYWHZKhImYu4d6/vw=" + }, + { + "mvn-path": "software/amazon/awssdk/http-client-spi/2.54.5/http-client-spi-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-76Y5Qm+mBOUzFpRlOwGs5wvr6ewvN1gJnWreg9aUzfo=" + }, + { + "mvn-path": "software/amazon/awssdk/http-clients/2.54.5/http-clients-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-LFvMcVDCq3LnWYrRUiq2QD4yQ/M0fN9SQoRCdxZagRY=" + }, + { + "mvn-path": "software/amazon/awssdk/identity-spi/2.54.5/identity-spi-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-0IstTOMgN6SBvaLsrjZAwFWKHZXOYBtrHVm9qsY+vhQ=" + }, + { + "mvn-path": "software/amazon/awssdk/identity-spi/2.54.5/identity-spi-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-uaCCetDdgMqqrdgilzzcgEhC73noO3jybdmtD3nXJ6U=" + }, + { + "mvn-path": "software/amazon/awssdk/json-utils/2.54.5/json-utils-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-+FJztCDoXl845fDOqH5xblVvjx6UaMawj4DJlx/pIN8=" + }, + { + "mvn-path": "software/amazon/awssdk/json-utils/2.54.5/json-utils-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-6FrSa6b8karOl2ZY04UBFW2kANZ5Xlk7eeU7zjNl0ho=" + }, + { + "mvn-path": "software/amazon/awssdk/metrics-spi/2.54.5/metrics-spi-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-kqxxjayadZ58Wd3ZkthjZS49EbFSK6fB/SdlYlZI56A=" + }, + { + "mvn-path": "software/amazon/awssdk/metrics-spi/2.54.5/metrics-spi-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-5FGxhgcyGWuKybvl8aY47wksHFVytcbuVVcYwoHaCZw=" + }, + { + "mvn-path": "software/amazon/awssdk/netty-nio-client/2.54.5/netty-nio-client-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-/4IqRNk7WNWY6YcfJ+DwbwQCopqrPsZfLkxcbGQW0rY=" + }, + { + "mvn-path": "software/amazon/awssdk/netty-nio-client/2.54.5/netty-nio-client-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-53pXf3Cp5oERhFY4bBcCaH4FwI1RRM1CzMiD9W7KnCM=" + }, + { + "mvn-path": "software/amazon/awssdk/profiles/2.54.5/profiles-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-oIC/YnSus0EZkmYWXeyj3wnJ+1sMI8c7E9RhG0YHyZQ=" + }, + { + "mvn-path": "software/amazon/awssdk/profiles/2.54.5/profiles-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-JT4emcl8aI561rXSOPRckKUhPGIr7AxPLP4mM2/6fvg=" + }, + { + "mvn-path": "software/amazon/awssdk/protocol-core/2.54.5/protocol-core-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-DFtxFPBhkTPpiHxfERi0Iil3V7NUJSjJaluMNyNtV48=" + }, + { + "mvn-path": "software/amazon/awssdk/protocol-core/2.54.5/protocol-core-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-GOQ2xgUkwWySBp1cnImtns/L3psAeSUA1zBeUSGRIzU=" + }, + { + "mvn-path": "software/amazon/awssdk/protocols/2.54.5/protocols-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-am1XbJy/+LYfSD0vhRvt81kwqfJOV+AD9GZ62pvhhZ0=" + }, + { + "mvn-path": "software/amazon/awssdk/regions/2.54.5/regions-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-oKK9VMyRdTgVr9dPuj0Z+oV/dEiGeto1GPjyVyUvwPE=" + }, + { + "mvn-path": "software/amazon/awssdk/regions/2.54.5/regions-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-DsqXCWCWHlJ1jAVHc54u4Ne8wirNg2nE+K7Jk8V9XUQ=" + }, + { + "mvn-path": "software/amazon/awssdk/retries-spi/2.54.5/retries-spi-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-FCcgdujjbLpZHhdjkYfLvoIpWG5vFnGXKzXmDJM3hCU=" + }, + { + "mvn-path": "software/amazon/awssdk/retries-spi/2.54.5/retries-spi-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ncWCjb5ankhY3F8GfKT8TUvh6BMfz6+sn0rugviOjxo=" + }, + { + "mvn-path": "software/amazon/awssdk/retries/2.54.5/retries-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-qIjGQPpuAwA03aXV/uLRf2n1dCpkF2QZJOwXMqG0JeU=" + }, + { + "mvn-path": "software/amazon/awssdk/retries/2.54.5/retries-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-wx6ICr8WIdV4uxNjQ6qHSCQK3+AIb3x/HsNa9J4XXNc=" + }, + { + "mvn-path": "software/amazon/awssdk/s3/2.54.5/s3-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-AZaWBw2Zq6ciGuyrzqiRRGRo2Q8svDUd/LT+W3kyljc=" + }, + { + "mvn-path": "software/amazon/awssdk/s3/2.54.5/s3-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-npU8zMmPcfwQUhpOMxUwgdgQbCBV6/wBwxCYHuli/H0=" + }, + { + "mvn-path": "software/amazon/awssdk/sdk-core/2.54.5/sdk-core-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-xhrqd7S9wDcFF+QIOWaA701O77QZwIG55/o8C304F7A=" + }, + { + "mvn-path": "software/amazon/awssdk/sdk-core/2.54.5/sdk-core-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-DZI4hc5QloahlCALHtxe4e3Ed7rFiojTIFkhr21FiHc=" + }, + { + "mvn-path": "software/amazon/awssdk/services/2.54.5/services-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Eyx5NbKFVt1ifXV4wodPZGHC0/OHsrrnZFN019n9iAI=" + }, + { + "mvn-path": "software/amazon/awssdk/sts/2.54.5/sts-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Ohbkchg6tcTSPDuHtYy83ueMlBk5HciOMphqx1tdZ6g=" + }, + { + "mvn-path": "software/amazon/awssdk/sts/2.54.5/sts-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-D6Oep/7eWl1PGy6K0VGYHFB3zH3TY/s/BLf4x1e/1eA=" + }, + { + "mvn-path": "software/amazon/awssdk/third-party-jackson-core/2.54.5/third-party-jackson-core-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Nyb05QVabc26XWIO/6X+cwGUmdlruCSLA7Tur4vmDj8=" + }, + { + "mvn-path": "software/amazon/awssdk/third-party-jackson-core/2.54.5/third-party-jackson-core-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-F2UXjoWI2zvc4mmdtizIqxURaMA0Y3Seer5BjTAHLm0=" + }, + { + "mvn-path": "software/amazon/awssdk/third-party/2.54.5/third-party-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-IG0yyFWyumxMJkex6ZE9AIROpN0uMrcnbDa7DaeVk/8=" + }, + { + "mvn-path": "software/amazon/awssdk/utils-lite/2.54.5/utils-lite-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-s0/n/drcWvxpa6X6vNqwbnqB+KqliuYA8AQnv91Q5J4=" + }, + { + "mvn-path": "software/amazon/awssdk/utils-lite/2.54.5/utils-lite-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Xt27eZKRuxKdlOeDDWbqp5LNWQIlWg9BVHTKw0bH20w=" + }, + { + "mvn-path": "software/amazon/awssdk/utils/2.54.5/utils-2.54.5.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-maX+OsI486Vb2Hcx3giMdB82snddGlqLwRDpwQd85mU=" + }, + { + "mvn-path": "software/amazon/awssdk/utils/2.54.5/utils-2.54.5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-cnQQE743xHGu4hgBL1YNGQt9G59zolhEmKidRwOFQfE=" + }, + { + "mvn-path": "software/amazon/eventstream/eventstream/1.0.1/eventstream-1.0.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-DDfY5pYRfwLDAhkbgRCw0Osg+kEvzjTDomnsc8Fs6CI=" + }, + { + "mvn-path": "software/amazon/eventstream/eventstream/1.0.1/eventstream-1.0.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-+UYMt5Sgp69oJ377V2lWno5mUVJQJ2w35ip+i9SyV8w=" + }, + { + "mvn-path": "thheller/shadow-client/1.4.0/shadow-client-1.4.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-6a0/WDKpA2VbOeDXARZYYZmj8kLjD0P6WrEVexZR8VY=" + }, + { + "mvn-path": "thheller/shadow-client/1.4.0/shadow-client-1.4.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-F+iii6ZBWeGqI7lm1AlejvFgsxyV+tUILX6gxQk7woM=" + }, + { + "mvn-path": "thheller/shadow-cljs/3.5.0/shadow-cljs-3.5.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-uiKCPbHedwEc8//f8PpnXdU/H0GuIa+dgQOJd/S8XSM=" + }, + { + "mvn-path": "thheller/shadow-cljs/3.5.0/shadow-cljs-3.5.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-RrAT1UDxpm9WhMGudEtsx+Yqx101h210fO0hhdIdcGo=" + }, + { + "mvn-path": "thheller/shadow-cljsjs/0.0.22/shadow-cljsjs-0.0.22.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-9juguqM38FUFRY0zTM7EqHKK/lWGi7cctMFOOF5kkq4=" + }, + { + "mvn-path": "thheller/shadow-cljsjs/0.0.22/shadow-cljsjs-0.0.22.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-32Mnoa/pNzj7gKZZAAKCJHrjJDmDPaS3zCmtk79PSek=" + }, + { + "mvn-path": "thheller/shadow-util/0.7.0/shadow-util-0.7.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-5WaQHnDWvxoS57m7Bn5Ls4lRoqAzKtKRVY798zNezYE=" + }, + { + "mvn-path": "thheller/shadow-util/0.7.0/shadow-util-0.7.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-iJ4LqL0WcCHYxsUz/DzlwkDXxkZUROoxjdrtW5RWQPg=" + }, + { + "mvn-path": "tigris/tigris/0.1.2/tigris-0.1.2.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-SapkjttsFOVwlaEbOR6u5gZXgyP7eXVfkjMaxjAPl6A=" + }, + { + "mvn-path": "tigris/tigris/0.1.2/tigris-0.1.2.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-H9VZA1l1INzUrnbmoz7/XjWmFUIrutKo7ZrDMqr75KA=" + }, + { + "mvn-path": "weavejester/dependency/1.0.0/dependency-1.0.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-XxpuyFNiyj3VVUj25hocVNmbLc0vv9/EdIBK5m0TbpI=" + }, + { + "mvn-path": "weavejester/dependency/1.0.0/dependency-1.0.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-5NIafyzna3LBsVI8OHFubwOWmDYklwz18sPRfLp9WzY=" + }, + { + "mvn-repo": "https://repo1.maven.org/maven2/", + "mvn-path": "org/clojure/clojure/1.12.6/clojure-1.12.6.jar", + "hash": "sha256-IbV42ziajnSyhs55xKf4bsZB4m2IsS8Y1pAwkWsOGMo=" + }, + { + "mvn-repo": "https://repo1.maven.org/maven2/", + "mvn-path": "org/clojure/clojure/1.12.6/clojure-1.12.6.pom", + "hash": "sha256-a4Xep1oJ8esIyMwYobMSCj/QSKY0N1ehtr6Xmrb5EM8=" + }, + { + "mvn-repo": "https://repo1.maven.org/maven2/", + "mvn-path": "org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar", + "hash": "sha256-0+9XXj5JeWeNwBvx3M5RAhSTtNEft/G+itmCh3wWocA=" + }, + { + "mvn-repo": "https://repo1.maven.org/maven2/", + "mvn-path": "org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.pom", + "hash": "sha256-+wRqnCKUN5KLsRwtJ8i113PriiXmDL0lPZhSEN7cJoQ=" + } + ] +} \ No newline at end of file diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..a031f70 --- /dev/null +++ b/flake.lock @@ -0,0 +1,347 @@ +{ + "nodes": { + "afk": { + "inputs": { + "llm-agents": "llm-agents", + "nixpkgs": [ + "nixpkgs" + ], + "superpowers": "superpowers", + "wrappers": "wrappers" + }, + "locked": { + "lastModified": 1792156344, + "narHash": "sha256-A9FdczKIes4uhqbpEh1yHY6RI6V2UqAou22SBgLDY/Y=", + "owner": "DavHau", + "repo": "afk", + "rev": "c1cc2da48640276ed39fd9035aef5005577cdde4", + "type": "github" + }, + "original": { + "owner": "DavHau", + "repo": "afk", + "type": "github" + } + }, + "bun2nix": { + "inputs": { + "flake-parts": [ + "afk", + "llm-agents", + "flake-parts" + ], + "nixpkgs": [ + "afk", + "llm-agents", + "nixpkgs" + ], + "systems": [ + "afk", + "llm-agents", + "systems" + ], + "treefmt-nix": [ + "afk", + "llm-agents", + "treefmt-nix" + ] + }, + "locked": { + "lastModified": 1790001035, + "narHash": "sha256-1/SLBjSYBzDdDhvLQ83wrzBakyS/xNGgtxHGNuveOEQ=", + "owner": "Mic92", + "repo": "bun2nix", + "rev": "07a5bfc8ac36c5370199343fa620b69f63186e33", + "type": "github" + }, + "original": { + "owner": "Mic92", + "ref": "llm-agents", + "repo": "bun2nix", + "type": "github" + } + }, + "clj-nix": { + "inputs": { + "devshell": "devshell", + "nix-fetcher-data": "nix-fetcher-data", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1776760934, + "narHash": "sha256-WVzvTigFwWcJ0VkAFMzA3jE8kbHGahCJ0FJFqVYhPqM=", + "owner": "jlesquembre", + "repo": "clj-nix", + "rev": "2b1290ee56e9bbd50e9b5874c985d34ad2f1b458", + "type": "github" + }, + "original": { + "owner": "jlesquembre", + "repo": "clj-nix", + "rev": "2b1290ee56e9bbd50e9b5874c985d34ad2f1b458", + "type": "github" + } + }, + "devshell": { + "inputs": { + "nixpkgs": [ + "clj-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1768818222, + "narHash": "sha256-460jc0+CZfyaO8+w8JNtlClB2n4ui1RbHfPTLkpwhU8=", + "owner": "numtide", + "repo": "devshell", + "rev": "255a2b1725a20d060f566e4755dbf571bbbb5f76", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "afk", + "llm-agents", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1790898470, + "narHash": "sha256-zTwuwezD0w3hpga6a6P8emidzAZFyWqlNeRBlpWOOl8=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "024633cd702b10285db5cb19b40ad48d2399ba60", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1719745305, + "narHash": "sha256-xwgjVUpqSviudEkpQnioeez1Uo2wzrsMaJKJClh+Bls=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "c3c5ecc05edc7dafba779c6c1a61cd08ac6583e9", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "llm-agents": { + "inputs": { + "bun2nix": "bun2nix", + "flake-parts": "flake-parts", + "nixpkgs": [ + "afk", + "nixpkgs" + ], + "systems": "systems", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1792149628, + "narHash": "sha256-z6OJhOCXlLXdP1GdqS+6wLe/blU6KGZFrib+b/nxYE8=", + "ref": "refs/heads/main", + "rev": "e85b99217baf13a38fc887b31338b1833f1159c0", + "shallow": true, + "type": "git", + "url": "https://github.com/numtide/llm-agents.nix" + }, + "original": { + "shallow": true, + "type": "git", + "url": "https://github.com/numtide/llm-agents.nix" + } + }, + "nix-fetcher-data": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": [ + "clj-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1755022803, + "narHash": "sha256-/QtBdVfZlrRJW5enUoWlBE2wrLXJBMJ45X0rZh0jiaU=", + "owner": "jlesquembre", + "repo": "nix-fetcher-data", + "rev": "9da3926b1459d6ff15268072d1c51351b82811b9", + "type": "github" + }, + "original": { + "owner": "jlesquembre", + "repo": "nix-fetcher-data", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1792210252, + "narHash": "sha256-Mh0PUaIv4nFY+8wAGonaEh8iBzwsmdNlwjVHmFg1Biw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "09063bd1f2b36fd9fd793c36dfade7bd40a93dfc", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1717284937, + "narHash": "sha256-lIbdfCsf8LMFloheeE6N31+BMIeixqyQWbSr2vk79EQ=", + "type": "tarball", + "url": "https://github.com/NixOS/nixpkgs/archive/eb9ceca17df2ea50a250b6b27f7bf6ab0186f198.tar.gz" + }, + "original": { + "type": "tarball", + "url": "https://github.com/NixOS/nixpkgs/archive/eb9ceca17df2ea50a250b6b27f7bf6ab0186f198.tar.gz" + } + }, + "penpot": { + "flake": false, + "locked": { + "lastModified": 1791289550, + "narHash": "sha256-K5PkVl/3+CTtmFIrHRG3kMzPlkZZA5QYeyXHzGVb9wI=", + "owner": "penpot", + "repo": "penpot", + "rev": "ff7a66f51938b2293260ea27a64e2c4e0833b5e3", + "type": "github" + }, + "original": { + "owner": "penpot", + "ref": "2.18.3", + "repo": "penpot", + "type": "github" + } + }, + "penpot-files": { + "flake": false, + "locked": { + "lastModified": 1791873278, + "narHash": "sha256-KrfH2lXbbC50kw4T6cPZssk1PcUqKzZ5qHQo0JbxbbE=", + "owner": "penpot", + "repo": "penpot-files", + "rev": "be9b1c33ff7546f2a5246b4c52a96f1183c2fe35", + "type": "github" + }, + "original": { + "owner": "penpot", + "ref": "main", + "repo": "penpot-files", + "type": "github" + } + }, + "root": { + "inputs": { + "afk": "afk", + "clj-nix": "clj-nix", + "nixpkgs": "nixpkgs", + "penpot": "penpot", + "penpot-files": "penpot-files" + } + }, + "superpowers": { + "flake": false, + "locked": { + "lastModified": 1790359587, + "narHash": "sha256-BWPiXoXV+jePP+wn/Z+Af4iehIL7oei00plaWaTzq8s=", + "ref": "main", + "rev": "8ca22dba9a94f28898bbce59f2537ff4d87c747d", + "shallow": true, + "type": "git", + "url": "https://github.com/obra/superpowers.git" + }, + "original": { + "ref": "main", + "shallow": true, + "type": "git", + "url": "https://github.com/obra/superpowers.git" + } + }, + "systems": { + "locked": { + "lastModified": 1791244623, + "narHash": "sha256-uuanbkFk8a313Zfrxdcz8Us/yQtaxNnKJtX8v0ZPpd8=", + "owner": "nix-systems", + "repo": "default", + "rev": "d36eeed142f88b5a636f2e3856a53c61654cf29b", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "afk", + "llm-agents", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1791885023, + "narHash": "sha256-C3alQ2MEt0zVrUSho5NUDo3jmhbff72++bfwoqT9Omo=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0d6d739a833ba9a9c93034862e4a7b061a062a1c", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "wrappers": { + "inputs": { + "nixpkgs": [ + "afk", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1783783341, + "narHash": "sha256-zoxaqE02t2HdbDnDAAPbEJGFKDEaot52CepH5v39+f0=", + "ref": "refs/heads/main", + "rev": "b85926076618a9a57f450df8a660fba5880aeb21", + "shallow": true, + "type": "git", + "url": "https://github.com/lassulus/wrappers" + }, + "original": { + "shallow": true, + "type": "git", + "url": "https://github.com/lassulus/wrappers" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..20f6ecb --- /dev/null +++ b/flake.nix @@ -0,0 +1,197 @@ +{ + description = "penpot-nix — Nix packages and NixOS module for self-hosting Penpot"; + + nixConfig = { + extra-substituters = [ "https://nix-penpot.cachix.org" ]; + extra-trusted-public-keys = [ + "nix-penpot.cachix.org-1:cbXoCSnLa6QmBex5EYzUSsswqSZA6RvJWl0dR+WgOns=" + ]; + }; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + penpot.url = "github:penpot/penpot/2.18.3"; + penpot.flake = false; + + # Clojure dependency locking (deps-lock.json) + eval-time dep cache + # (mk-deps-cache) + offline git shim (fake-git). Pinned to a main + # commit: the only release (0.4.0, 2024) predates our toolchain. + # Only the overlay's clojure helpers are used (mk-deps-cache, fake-git, + # deps-lock, clj-builder); clj-nix's own apps/devshells stay unevaluated. + clj-nix.url = "github:jlesquembre/clj-nix/2b1290ee56e9bbd50e9b5874c985d34ad2f1b458"; + clj-nix.inputs.nixpkgs.follows = "nixpkgs"; + + # Onboarding template files fetched by the backend build. No tags + # upstream, so track main; the locked rev makes it immutable. Bump with + # `nix flake update penpot-files` (see builtinTemplates in + # packages/backend.nix for the rehash procedure). + penpot-files.url = "github:penpot/penpot-files/main"; + penpot-files.flake = false; + + # Development harness: https://github.com/DavHau/afk + afk.url = "github:DavHau/afk"; + afk.inputs.nixpkgs.follows = "nixpkgs"; + }; + + outputs = + { + self, + nixpkgs, + penpot, + penpot-files, + clj-nix, + afk, + }: + let + systems = [ "x86_64-linux" ]; + + forAllSystems = nixpkgs.lib.genAttrs systems; + + pkgsFor = + system: + import nixpkgs { + inherit system; + overlays = [ + # Provides mk-deps-cache, fake-git, deps-lock, clj-builder. + clj-nix.overlays.default + ]; + }; + + penpotVersion = + # Keep in sync with the `penpot` input pin. Upstream leaves + # package.json's version stale ("2.17.0" even for 2.18.3), so + # mkPenpotVersion's package.json read lies; pin the real release + # instead. Changing this also changes asset version-tag URLs. + "2.18.3"; + in + { + lib = { + mkPenpotVersion = + src: + let + pkg = builtins.readFile (src + "/package.json"); + pkgVersion = builtins.match ".*\"version\": \"([^\"]+)\".*" pkg; + in + if pkgVersion != null then + builtins.head pkgVersion + else if src ? shortRev then + src.shortRev + else + "dev"; + + # Restrict a source tree to a set of top-level paths (directories or + # files). `paths` entries are matched against the path relative to + # `src`, so "backend" keeps "backend" itself and everything below it. + # + # Type: Path -> [String] -> Path + subSrc = + src: paths: + nixpkgs.lib.cleanSourceWith { + src = nixpkgs.lib.cleanSource src; + filter = + path: _type: + let + rel = nixpkgs.lib.removePrefix "${toString src}/" (toString path); + in + rel == "" || nixpkgs.lib.any (p: rel == p || nixpkgs.lib.hasPrefix "${p}/" rel) paths; + }; + }; + + overlays.default = final: _prev: { + penpot-backend = self.packages.${final.stdenv.hostPlatform.system}.penpot-backend; + penpot-frontend = self.packages.${final.stdenv.hostPlatform.system}.penpot-frontend; + penpot-exporter = self.packages.${final.stdenv.hostPlatform.system}.penpot-exporter; + penpot-mcp = self.packages.${final.stdenv.hostPlatform.system}.penpot-mcp; + }; + + packages = forAllSystems ( + system: + let + pkgs = pkgsFor system; + callPackage = pkgs.callPackage; + penpotRenderWasm = callPackage ./packages/render-wasm.nix { + inherit penpot; + version = penpotVersion; + }; + in + { + penpot-backend = callPackage ./packages/backend.nix { + inherit penpot penpot-files; + version = penpotVersion; + inherit (self.lib) subSrc; + }; + penpot-render-wasm = penpotRenderWasm; + # Exposed separately so CI/flake-check keeps building the export + # flavor (nothing consumes it on the 2.17.x line). + penpot-render-wasm-export = penpotRenderWasm.passthru.export; + penpot-frontend = callPackage ./packages/frontend.nix { + inherit penpot; + version = penpotVersion; + inherit (self.lib) subSrc; + }; + penpot-exporter = callPackage ./packages/exporter.nix { + inherit penpot; + version = penpotVersion; + inherit (self.lib) subSrc; + }; + penpot-mcp = callPackage ./packages/mcp.nix { + inherit penpot; + version = penpotVersion; + inherit (self.lib) subSrc; + }; + default = self.packages.${system}.penpot-backend; + } + ); + + nixosModules = { + default = self.nixosModules.penpot; + penpot = import ./modules/penpot.nix; + }; + + nixosConfigurations.penpot-vm = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + modules = [ + { nixpkgs.overlays = [ self.overlays.default ]; } + self.nixosModules.default + ./tests/vm.nix + ]; + }; + + checks = forAllSystems ( + system: + let + pkgs = pkgsFor system; + in + { + # Full end-to-end VM test of the module (boots PostgreSQL, Valkey, + # backend, nginx, exporter and MCP, then probes every endpoint). + penpot-vm-test = pkgs.testers.nixosTest ( + import ./tests/vm-test.nix { + inherit (pkgs) lib; + inherit self; + } + ); + } + ); + + devShells = forAllSystems ( + system: + let + pkgs = pkgsFor system; + in + { + default = pkgs.mkShell { + packages = [ + afk.packages.${system}.afk + pkgs.jujutsu + pkgs.git + pkgs.nixfmt-tree + ]; + }; + } + ); + + formatter = forAllSystems (system: (pkgsFor system).nixfmt-tree); + }; +} diff --git a/modules/penpot.nix b/modules/penpot.nix new file mode 100644 index 0000000..6c13103 --- /dev/null +++ b/modules/penpot.nix @@ -0,0 +1,1210 @@ +# NixOS module for self-hosting Penpot. +# +# Maps the upstream docker-compose +# (https://github.com/penpot/penpot/blob/develop/docker/images/docker-compose.yaml) +# deployment (backend + frontend + exporter + mcp + postgres + valkey +# + optional SMTP sink) onto native NixOS services. Infrastructure +# dependencies (PostgreSQL, Valkey) can be either provisioned by this +# module or reused from an existing setup; secrets are supplied +# through files and injected via systemd credentials. +{ + config, + lib, + pkgs, + ... +}: +let + inherit (lib) + concatStringsSep + mkAfter + mkBefore + mkDefault + mkEnableOption + mkIf + mkMerge + mkOption + optional + optionalAttrs + optionalString + types + ; + + cfg = config.services.penpot; + + penpotUser = "penpot"; + penpotGroup = "penpot"; + + # Assets directory used by the filesystem object-storage backend, shared + # between the backend (read/write) and the nginx vhost (read, via the + # /internal/assets alias). + assetsDir = cfg.storage.fs.directory; + + # Which components to start. + exporterEnabled = cfg.exporter.enable; + mcpEnabled = cfg.mcp.enable; + + # Parse "scheme://host[:port][/path][?query]" into components, or null. + parseUri = + uri: + let + m = builtins.match "[a-zA-Z][a-zA-Z0-9+.-]*://([^/:?#]+)(:([0-9]+))?(/[^?#]*)?(\\?.*)?" uri; + in + if m == null then + null + else + { + host = builtins.head m; + port = if builtins.elemAt m 2 == null then null else lib.toInt (builtins.elemAt m 2); + path = builtins.elemAt m 3; + }; + + isHttpUri = lib.hasPrefix "http://" (lib.toLower cfg.publicUri); + parsedPublicUri = parseUri cfg.publicUri; + vhostName = if parsedPublicUri != null then parsedPublicUri.host else null; + hasListenPort = + parsedPublicUri != null + && parsedPublicUri.port != null + && parsedPublicUri.port != 80 + && parsedPublicUri.port != 443; + + # Rendered frontend configuration (the equivalent of the upstream + # `js/config.js` generated by the nginx entrypoint at container start). + # Flags and the public URI are not secret, so this lives in the store. + # Quotes and backslashes are escaped since both are interpolated into a + # JS string literal. + frontendConfigJs = pkgs.writeText "penpot-frontend-config.js" ( + concatStringsSep "\n" ( + [ "// Frontend configuration" ] + ++ [ + (optionalString (penpotFlags != "") + ''var penpotFlags = "${lib.escape [ ''\"'' ''\\'' ] penpotFlags}";'' + ) + ''var penpotPublicURI = "${lib.escape [ ''\"'' ''\\'' ] cfg.publicUri}";'' + (optionalString (cfg.oidc.name != null) + ''var penpotOIDCName = "${lib.escape [ ''\"'' ''\\'' ] cfg.oidc.name}";'' + ) + ] + ) + + "\n" + ); + + # Extra flags derived from the module configuration, always appended after + # the user-provided ones. `lib.unique` guards against duplicates when the + # user already sets one of the derived flags. + derivedFlags = concatStringsSep " " ( + lib.unique ( + cfg.flags + ++ optional (smtpConfigured) "enable-smtp" + ++ optional mcpEnabled "enable-mcp" + ++ optional isHttpUri "disable-secure-session-cookies" + ++ optional (cfg.allowedOrigins != [ ]) "enable-cors" + ) + ); + penpotFlags = derivedFlags; + + databaseCreateLocally = cfg.database.createLocally; + databaseUri = "postgresql://127.0.0.1/${cfg.database.name}"; + databaseUriFinal = if databaseCreateLocally then databaseUri else cfg.database.uri; + + redisCreateLocally = cfg.redis.createLocally; + redisUri = if redisCreateLocally then "redis://127.0.0.1:6379/0" else cfg.redis.uri; + + smtpConfigured = cfg.smtp.host != null || cfg.mailpit.enable; + + # IPv6 literal hosts are not recognized by parseUri (bracketed form), + # so loopback detection covers the name/IP forms only. + isLoopbackUri = + uri: + let + parsed = parseUri uri; + host = if parsed != null then parsed.host else null; + in + host != null + && builtins.elem host [ + "localhost" + "127.0.0.1" + ]; + + # The exporter/mcp units only get the loopback network ACL when every + # peer they must reach is itself on loopback; an unparseable or external + # address (or a nonexistent redis) turns the ACL off. + exporterLoopbackOnly = + isLoopbackUri cfg.exporter.internalUri + && (redisCreateLocally || (cfg.redis.uri != null && isLoopbackUri cfg.redis.uri)); + + mcpLoopbackOnly = cfg.mcp.redisUri == null || isLoopbackUri cfg.mcp.redisUri; + + smtpPort = if cfg.mailpit.enable && cfg.smtp.host == null then 1025 else cfg.smtp.port; + smtpHost = if cfg.mailpit.enable && cfg.smtp.host == null then "127.0.0.1" else cfg.smtp.host; + smtpTls = if cfg.smtp.tls then "true" else "false"; + smtpSsl = if cfg.smtp.ssl then "true" else "false"; + + backendEnv = { + PENPOT_FLAGS = penpotFlags; + PENPOT_PUBLIC_URI = cfg.publicUri; + PENPOT_HTTP_SERVER_MAX_BODY_SIZE = toString cfg.httpMaxBodySize; + # Loopback-only: the nginx vhost is the only intended client. Override + # via `services.penpot.environment` for split deployments. + PENPOT_HTTP_SERVER_HOST = "127.0.0.1"; + PENPOT_DATABASE_URI = databaseUriFinal; + PENPOT_REDIS_URI = redisUri; + PENPOT_TELEMETRY_ENABLED = if cfg.telemetry.enable then "true" else "false"; + } + // optionalAttrs (cfg.telemetry.enable) { + PENPOT_TELEMETRY_REFERER = "nixos"; + } + // optionalAttrs (databaseCreateLocally || cfg.database.username != null) { + PENPOT_DATABASE_USERNAME = + if databaseCreateLocally then cfg.database.user else cfg.database.username; + } + // optionalAttrs (cfg.allowedOrigins != [ ]) { + PENPOT_ALLOWED_ORIGINS = concatStringsSep "," cfg.allowedOrigins; + } + // optionalAttrs (cfg.admins != [ ]) { + PENPOT_ADMINS = concatStringsSep "," cfg.admins; + } + // optionalAttrs (cfg.storage.backend == "fs") { + PENPOT_OBJECTS_STORAGE_BACKEND = "fs"; + PENPOT_OBJECTS_STORAGE_FS_DIRECTORY = assetsDir; + } + // optionalAttrs (cfg.storage.backend == "s3") { + PENPOT_OBJECTS_STORAGE_BACKEND = "s3"; + PENPOT_OBJECTS_STORAGE_S3_ENDPOINT = cfg.storage.s3.endpoint; + PENPOT_OBJECTS_STORAGE_S3_BUCKET = cfg.storage.s3.bucket; + } + // optionalAttrs (cfg.storage.backend == "s3" && cfg.storage.s3.accessKeyId != null) { + AWS_ACCESS_KEY_ID = cfg.storage.s3.accessKeyId; + } + // optionalAttrs smtpConfigured { + PENPOT_SMTP_DEFAULT_FROM = cfg.smtp.from; + PENPOT_SMTP_DEFAULT_REPLY_TO = cfg.smtp.replyTo; + PENPOT_SMTP_HOST = smtpHost; + PENPOT_SMTP_PORT = toString smtpPort; + PENPOT_SMTP_TLS = smtpTls; + PENPOT_SMTP_SSL = smtpSsl; + } + // optionalAttrs (cfg.smtp.username != null) { + PENPOT_SMTP_USERNAME = cfg.smtp.username; + } + // optionalAttrs (cfg.jvmOpts != [ ]) { + JAVA_OPTS = concatStringsSep " " cfg.jvmOpts; + } + // cfg.environment; + + exporterEnv = { + PENPOT_FLAGS = penpotFlags; + PENPOT_PUBLIC_URI = cfg.publicUri; + PENPOT_INTERNAL_URI = cfg.exporter.internalUri; + PENPOT_REDIS_URI = redisUri; + PENPOT_TEMPDIR = "/run/penpot-exporter"; + # Chromium's crashpad needs a writable $HOME even with --disable-breakpad + # (it writes its crash database below it at startup). ProtectSystem=strict + # leaves the service user's passwd home (/var/lib/penpot) read-only, so + # every browser launch would die with SIGTRAP and exhaust the exporter's + # browser pool ("ResourceRequest timed out"). Point HOME at the unit's + # writable RuntimeDirectory instead. + HOME = "/run/penpot-exporter"; + # NOTE: the exporter's http server ignores this variable (it always + # binds all interfaces); loopback isolation is enforced by the unit's + # IPAddressAllow/IPAddressDeny below. + PENPOT_HTTP_SERVER_HOST = "127.0.0.1"; + } + // cfg.environment; + + mcpEnv = { + # Loopback-only: nginx proxies /mcp/* to this server. + PENPOT_MCP_SERVER_HOST = "127.0.0.1"; + } + // optionalAttrs (cfg.mcp.redisUri != null) { + PENPOT_MCP_REDIS_URI = cfg.mcp.redisUri; + }; + + # --- Secret handling ------------------------------------------------------ + # All credentials are sourced from files through systemd's LoadCredential + # mechanism. Each unit loads only the credentials it needs and its + # `script` preamble exports them under the PENPOT_*/AWS_* names the + # services expect. Values are stripped of CR/LF so multi-line secret + # files cannot corrupt the environment. + + backendCredentials = [ + "secret-key:${cfg.secretKeyFile}" + ] + ++ optional (cfg.database.passwordFile != null) "database-password:${cfg.database.passwordFile}" + ++ optional (cfg.smtp.passwordFile != null) "smtp-password:${cfg.smtp.passwordFile}" + ++ optional ( + cfg.storage.backend == "s3" && cfg.storage.s3.secretAccessKeyFile != null + ) "s3-secret-key:${cfg.storage.s3.secretAccessKeyFile}"; + + exporterCredentials = [ "secret-key:${cfg.secretKeyFile}" ]; + + loadSecretKeySnippet = '' + export PENPOT_SECRET_KEY="$(tr -d '\r\n' < "$CREDENTIALS_DIRECTORY/secret-key")" + ''; + + backendLoadSecretsSnippet = '' + ${loadSecretKeySnippet} + ${optionalString (cfg.database.passwordFile != null) '' + export PENPOT_DATABASE_PASSWORD="$(tr -d '\r\n' < "$CREDENTIALS_DIRECTORY/database-password")" + ''} + ${optionalString (cfg.smtp.passwordFile != null) '' + export PENPOT_SMTP_PASSWORD="$(tr -d '\r\n' < "$CREDENTIALS_DIRECTORY/smtp-password")" + ''} + ${optionalString (cfg.storage.backend == "s3" && cfg.storage.s3.secretAccessKeyFile != null) '' + export AWS_SECRET_ACCESS_KEY="$(tr -d '\r\n' < "$CREDENTIALS_DIRECTORY/s3-secret-key")" + ''} + ''; + + # Hardening shared by all Penpot services; each unit's serviceConfig + # merges this and adds its own settings. + commonServiceConfig = { + PrivateTmp = true; + NoNewPrivileges = true; + ProtectSystem = "strict"; + ProtectHome = true; + ProtectKernelTunables = true; + ProtectKernelModules = true; + ProtectControlGroups = true; + ProtectKernelLogs = true; + RestrictAddressFamilies = [ + "AF_UNIX" + "AF_INET" + "AF_INET6" + ]; + LockPersonality = true; + RestrictRealtime = true; + SystemCallArchitectures = "native"; + Restart = "on-failure"; + RestartSec = 5; + }; + + backendUri = "http://127.0.0.1:6060"; + exporterUri = "http://127.0.0.1:6061"; + mcpUri = "http://127.0.0.1:4401"; + mcpWsUri = "http://127.0.0.1:4402"; + + # The security headers are re-included inside locations that set their own + # add_header directives, mirroring the upstream docker image (nginx drops + # inherited add_header lines when a location defines its own). + securityHeaders = pkgs.writeText "penpot-nginx-security-headers.conf" '' + add_header X-Content-Type-Options "nosniff" always; + add_header Referrer-Policy "strict-origin-when-cross-origin" always; + add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always; + add_header X-Frame-Options SAMEORIGIN always; + ''; + + nginxVhost = mkIf cfg.nginx.enable { + services.nginx.enable = mkDefault true; + # Host-wide (the option only exists at this level); mkDefault lets the + # user override it. + services.nginx.recommendedGzipSettings = mkDefault true; + services.nginx.virtualHosts.${vhostName} = { + serverName = vhostName; + listen = mkIf hasListenPort [ + { + addr = "0.0.0.0"; + port = parsedPublicUri.port; + } + { + addr = "[::]"; + port = parsedPublicUri.port; + } + ]; + forceSSL = cfg.nginx.forceHttps; + root = "${cfg.package.frontend}/dist"; + extraConfig = '' + client_max_body_size ${toString cfg.httpMaxBodySize}; + server_tokens off; + proxy_hide_header X-Powered-By; + # Upstream nginx.conf.template http-level settings. + proxy_connect_timeout 300s; + proxy_send_timeout 300s; + proxy_read_timeout 300s; + send_timeout 300s; + # The recommended gzip settings are enabled above at http level; + # this vhost needs a wider type list than that (nginx replaces, + # not extends, an inherited gzip_types), repeating it plus the + # penpot API's application/transit+json. + gzip_types application/atom+xml application/geo+json application/javascript application/json application/ld+json application/manifest+json application/rdf+xml application/transit+json application/vnd.ms-fontobject application/wasm application/x-rss+xml application/x-web-app-manifest+json application/xhtml+xml application/xliff+xml application/xml font/collection font/otf font/ttf image/bmp image/svg+xml image/vnd.microsoft.icon text/cache-manifest text/calendar text/css text/csv text/javascript text/markdown text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/xml; + charset utf-8; + etag off; + include ${securityHeaders}; + ''; + locations = mkMerge [ + { + "= /js/config.js" = { + alias = frontendConfigJs; + extraConfig = '' + include ${securityHeaders}; + add_header Cache-Control "no-store, no-cache, max-age=0" always; + ''; + }; + + "~* \\.(js|css|jpg|png|svg|gif|ttf|woff|woff2|wasm|map)$" = { + extraConfig = '' + include ${securityHeaders}; + add_header Cache-Control "public, max-age=604800" always; + ''; + }; + + "^~ /assets" = { + proxyPass = "${backendUri}/assets"; + recommendedProxySettings = true; + extraConfig = '' + recursive_error_pages on; + proxy_intercept_errors on; + error_page 301 302 307 = @handle_redirect; + ''; + }; + + "@handle_redirect" = { + extraConfig = '' + set $redirect_uri "$upstream_http_location"; + set $redirect_host "$upstream_http_x_host"; + set $redirect_cache_control "$upstream_http_cache_control"; + set $real_mtype "$upstream_http_x_mtype"; + + proxy_buffering off; + + proxy_set_header Host "$redirect_host"; + proxy_set_header Authorization ""; + proxy_hide_header etag; + proxy_hide_header x-amz-id-2; + proxy_hide_header x-amz-request-id; + proxy_hide_header x-amz-meta-server-side-encryption; + proxy_hide_header x-amz-server-side-encryption; + proxy_ssl_server_name on; + proxy_pass $redirect_uri; + + include ${securityHeaders}; + add_header x-internal-redirect "$redirect_uri"; + add_header x-cache-control "$redirect_cache_control"; + add_header cache-control "$redirect_cache_control"; + add_header content-type "$real_mtype"; + ''; + }; + + "^~ /api" = { + proxyPass = "${backendUri}/api"; + recommendedProxySettings = true; + extraConfig = '' + proxy_buffering off; + ''; + }; + + # Static plugin files (trailing slash keeps gixy's alias-traversal + # check happy; bare /plugins requests get a nginx directory 301). + "^~ /plugins/" = { + alias = "${cfg.package.frontend}/dist/plugins/"; + }; + + "= /readyz" = { + proxyPass = backendUri; + recommendedProxySettings = true; + extraConfig = '' + access_log off; + ''; + }; + + "^~ /ws/notifications" = { + proxyPass = "${backendUri}/ws/notifications"; + proxyWebsockets = true; + recommendedProxySettings = true; + }; + + "/" = { + tryFiles = "$uri /index.html$is_args$args /index.html =404"; + extraConfig = '' + include ${securityHeaders}; + add_header Cache-Control "no-store, no-cache, max-age=0" always; + ''; + }; + } + # Filesystem storage: internal alias serving assets directly. Both + # the location and the alias end in "/" (the backend x-accel-redirect + # paths use the "/internal/assets/" base) to avoid alias traversal. + (mkIf (cfg.nginx.enable && cfg.storage.backend == "fs") { + "^~ /internal/assets/" = { + extraConfig = '' + internal; + alias ${assetsDir}/; + include ${securityHeaders}; + add_header x-internal-redirect "$upstream_http_x_accel_redirect"; + ''; + }; + }) + (mkIf exporterEnabled { + "^~ /api/export" = { + proxyPass = exporterUri; + recommendedProxySettings = true; + }; + }) + # Upstream nginx-mcp-locations.conf.template. Unlike upstream, the + # stream/sse proxy targets keep the original query string (SSE + # session ids travel in it); the variable proxy_pass passes the URI + # through verbatim, like the upstream `set`+`proxy_pass` pairing. + (mkIf mcpEnabled { + "^~ /mcp/ws" = { + proxyPass = mcpWsUri; + proxyWebsockets = true; + recommendedProxySettings = true; + }; + "^~ /mcp/stream" = { + proxyPass = "${mcpUri}/mcp$is_args$args"; + recommendedProxySettings = true; + }; + "^~ /mcp/sse" = { + proxyPass = "${mcpUri}/sse$is_args$args"; + recommendedProxySettings = true; + }; + }) + ]; + }; + }; +in +{ + options.services.penpot = { + enable = mkEnableOption "Penpot, the open-source design and prototyping platform"; + + package = mkOption { + description = "Penpot component packages to use."; + type = types.submodule { + options = { + backend = mkOption { + description = "The Penpot backend (Clojure API server) package."; + type = types.package; + default = pkgs.penpot-backend; + defaultText = lib.literalExpression "pkgs.penpot-backend"; + }; + frontend = mkOption { + description = "The Penpot frontend (static site) package."; + type = types.package; + default = pkgs.penpot-frontend; + defaultText = lib.literalExpression "pkgs.penpot-frontend"; + }; + exporter = mkOption { + description = "The Penpot exporter (headless Chromium rendering) package."; + type = types.package; + default = pkgs.penpot-exporter; + defaultText = lib.literalExpression "pkgs.penpot-exporter"; + }; + mcp = mkOption { + description = "The Penpot MCP (Model Context Protocol) server package."; + type = types.package; + default = pkgs.penpot-mcp; + defaultText = lib.literalExpression "pkgs.penpot-mcp"; + }; + }; + }; + }; + + publicUri = mkOption { + description = '' + Public URI of this Penpot instance ({env}`PENPOT_PUBLIC_URI`), + e.g. `https://penpot.example.com`. Must be set when + {option}`services.penpot.enable` is true. + ''; + type = types.nullOr types.str; + default = null; + example = "https://penpot.example.com"; + }; + + flags = mkOption { + description = '' + Penpot feature flags ({env}`PENPOT_FLAGS`). See the + [upstream configuration docs](https://help.penpot.app/technical-guide/configuration/) + for available flags. `enable-smtp`, `enable-mcp`, + `disable-secure-session-cookies` (for plain-HTTP deployments) and + `enable-cors` (when {option}`services.penpot.allowedOrigins` is + set) are appended automatically based on the module configuration, + and the resulting list is deduplicated. + ''; + type = types.listOf types.str; + default = [ "enable-prepl-server" ]; + example = [ + "enable-prepl-server" + "enable-login-with-oidc" + "enable-registration" + ]; + }; + + secretKeyFile = mkOption { + description = '' + File containing the master secret key ({env}`PENPOT_SECRET_KEY`). + Used to derive HTTP session keys and invitation tokens. Generate one + with e.g. `openssl rand -base64 64`. Required. + ''; + type = types.nullOr types.path; + default = null; + example = "/run/secrets/penpot-secret-key"; + }; + + httpMaxBodySize = mkOption { + description = '' + Maximum HTTP body size accepted by the backend and the nginx vhost + ({env}`PENPOT_HTTP_SERVER_MAX_BODY_SIZE`), in bytes. Defaults to + 350 MiB like upstream. + ''; + type = types.int; + default = 367001600; + }; + + jvmOpts = mkOption { + description = "Extra JVM options for the backend ({env}`JAVA_OPTS`)."; + type = types.listOf types.str; + default = [ ]; + example = [ + "-Xms512m" + "-Xmx4g" + ]; + }; + + environment = mkOption { + description = '' + Extra environment variables for the backend and the exporter, + intended for upstream {env}`PENPOT_*` settings not covered by + module options (e.g. OIDC, LDAP or mail settings). Values are + written into the systemd unit, so do not put secrets here; use the + corresponding `*File` options instead. + ''; + type = types.attrsOf types.str; + default = { }; + example = { + PENPOT_OIDC_CLIENT_ID = "penpot"; + PENPOT_OIDC_BASE_URI = "https://idp.example.com"; + }; + }; + + telemetry.enable = mkOption { + description = '' + Whether to enable the anonymized usage telemetry reports + ({env}`PENPOT_TELEMETRY_ENABLED`). + ''; + type = types.bool; + default = false; + }; + + oidc.name = mkOption { + description = '' + Display name for the OIDC login button on the login page + ({env}`PENPOT_OIDC_NAME`). The remaining OIDC settings are passed + via {option}`services.penpot.environment`. + ''; + type = types.nullOr types.str; + default = null; + }; + + admins = mkOption { + description = '' + Email addresses of instance administrators + ({env}`PENPOT_ADMINS`). The flag returned to the UI is computed + at login time, and authorization for administrative operations is + checked against this allowlist on every request, so changes apply + to already-logged-in sessions for backend authorizations, but the + UI shows the updated role after the next login. Registration always + creates non-admin users; there are no default credentials. + ''; + type = types.listOf types.str; + default = [ ]; + example = [ "admin@example.org" ]; + }; + + allowedOrigins = mkOption { + description = '' + Explicit CORS allowlist ({env}`PENPOT_ALLOWED_ORIGINS`) for browsers + reaching the API from a different origin than + {option}`services.penpot.publicUri`. When non-empty, the + `enable-cors` flag is added and the backend answers preflights for + exactly these origins (fail-closed). Note that origins are matched + verbatim, scheme and port included, the browser always sends the + port for non-default ports. A standard single-origin deployment + needs nothing here: the UI and the API are both served from + {option}`services.penpot.publicUri`, so the browser never sends + cross-origin preflights. + ''; + type = types.listOf types.str; + default = [ ]; + example = [ "https://plugins.example.com" ]; + }; + + database = mkOption { + description = "PostgreSQL configuration for Penpot."; + type = types.submodule { + options = { + createLocally = + mkEnableOption '' + a local PostgreSQL instance ({option}`services.postgresql`) with + a dedicated database and role. Set to false to reuse an external + server, in which case {option}`services.penpot.database.uri` + must be provided. + '' + // { + default = true; + }; + name = mkOption { + description = "Database name used by Penpot."; + type = types.strMatching "[a-zA-Z_][a-zA-Z0-9_$]*"; + default = "penpot"; + }; + user = mkOption { + description = '' + Database role used by Penpot. With `createLocally` the backend + connects over loopback TCP: without a password file a scoped + `trust` pg_hba rule authenticates this role, with one the role + password is provisioned from + {option}`services.penpot.database.passwordFile`. + ''; + type = types.strMatching "[a-zA-Z_][a-zA-Z0-9_$]*"; + default = "penpot"; + }; + uri = mkOption { + description = '' + Database connection URI ({env}`PENPOT_DATABASE_URI`) for + external servers, e.g. + `postgresql://db.example.com:5432/penpot`. + ''; + type = types.nullOr types.str; + default = null; + }; + username = mkOption { + description = '' + Database user for external servers + ({env}`PENPOT_DATABASE_USERNAME`). + ''; + type = types.nullOr types.str; + default = null; + }; + passwordFile = mkOption { + description = '' + File containing the database password + ({env}`PENPOT_DATABASE_PASSWORD`). With `createLocally` this + switches the local connection from the scoped `trust` rule to + the default md5 auth (the role password is provisioned from + this file on boot). Required for external servers that + authenticate by password. + ''; + type = types.nullOr types.path; + default = null; + }; + }; + }; + }; + + redis = mkOption { + description = "Valkey/Redis configuration for Penpot."; + type = types.submodule { + options = { + createLocally = + mkEnableOption '' + a local Valkey instance ({option}`services.redis`) used for + websocket notifications and export job queues. Set to false to + reuse an external server, in which case + {option}`services.penpot.redis.uri` must be provided. + '' + // { + default = true; + }; + uri = mkOption { + description = '' + Redis connection URI ({env}`PENPOT_REDIS_URI`) for external + servers, e.g. `redis://cache.example.com:6379/0`. + ''; + type = types.nullOr types.str; + default = null; + }; + }; + }; + }; + + storage = mkOption { + description = "Storage backend for design assets and files."; + type = types.submodule { + options = { + backend = mkOption { + description = '' + Object-storage backend ({env}`PENPOT_OBJECTS_STORAGE_BACKEND`). + ''; + type = types.enum [ + "fs" + "s3" + ]; + default = "fs"; + }; + fs = mkOption { + description = "Filesystem backend settings."; + type = types.submodule { + options = { + directory = mkOption { + description = '' + Directory storing assets. Backed by the + `penpot` systemd state directory by default; the nginx + vhost serves it through the `/internal/assets` alias. + ''; + type = types.str; + default = "/var/lib/penpot/assets"; + }; + }; + }; + }; + s3 = mkOption { + description = "S3-compatible backend settings."; + type = types.submodule { + options = { + endpoint = mkOption { + description = "S3 endpoint ({env}`PENPOT_OBJECTS_STORAGE_S3_ENDPOINT`)."; + type = types.nullOr types.str; + default = null; + example = "https://s3.amazonaws.com"; + }; + bucket = mkOption { + description = "S3 bucket name ({env}`PENPOT_OBJECTS_STORAGE_S3_BUCKET`)."; + type = types.nullOr types.str; + default = null; + }; + accessKeyId = mkOption { + description = "S3 access key ID ({env}`AWS_ACCESS_KEY_ID`)."; + type = types.nullOr types.str; + default = null; + }; + secretAccessKeyFile = mkOption { + description = '' + File containing the S3 secret access key + ({env}`AWS_SECRET_ACCESS_KEY`). + ''; + type = types.nullOr types.path; + default = null; + }; + }; + }; + }; + }; + }; + }; + + smtp = mkOption { + description = "Outgoing SMTP configuration for invitation and verification emails."; + type = types.submodule { + options = { + host = mkOption { + description = "SMTP server host ({env}`PENPOT_SMTP_HOST`)."; + type = types.nullOr types.str; + default = null; + }; + port = mkOption { + description = "SMTP server port ({env}`PENPOT_SMTP_PORT`)."; + type = types.port; + default = 25; + }; + username = mkOption { + description = "SMTP username ({env}`PENPOT_SMTP_USERNAME`), if required."; + type = types.nullOr types.str; + default = null; + }; + passwordFile = mkOption { + description = '' + File containing the SMTP password + ({env}`PENPOT_SMTP_PASSWORD`), if required. + ''; + type = types.nullOr types.path; + default = null; + }; + tls = mkOption { + description = "Whether to use STARTTLS ({env}`PENPOT_SMTP_TLS`)."; + type = types.bool; + default = false; + }; + ssl = mkOption { + description = "Whether to use implicit TLS ({env}`PENPOT_SMTP_SSL`)."; + type = types.bool; + default = false; + }; + from = mkOption { + description = "Sender address ({env}`PENPOT_SMTP_DEFAULT_FROM`)."; + type = types.str; + default = "no-reply@example.com"; + }; + replyTo = mkOption { + description = "Reply-to address ({env}`PENPOT_SMTP_DEFAULT_REPLY_TO`)."; + type = types.str; + default = "no-reply@example.com"; + }; + }; + }; + }; + + mailpit.enable = + mkEnableOption '' + a local [mailpit](https://mailpit.axllent.org/) instance as a + throwaway SMTP sink (the equivalent of the upstream `mailcatch` + service). Emails are readable at `http://127.0.0.1:8025`. Only for + evaluation setups; use {option}`services.penpot.smtp` in production. + If {option}`services.penpot.smtp.host` is also set, the explicit SMTP + configuration wins and mailpit is only provisioned (not used for + sending). + '' + // { + default = false; + }; + + exporter = mkOption { + description = "Penpot exporter (headless design export service)."; + type = types.submodule { + options = { + enable = mkEnableOption "the Penpot exporter service" // { + default = true; + }; + internalUri = mkOption { + description = '' + URI the exporter uses to fetch pages from the frontend vhost + ({env}`PENPOT_INTERNAL_URI`). Defaults to the public URI's + host over plain HTTP, so the request's Host header routes it + to this module's vhost. With + {option}`services.penpot.nginx.forceHttps` enabled the plain + HTTP fetch is redirected to TLS, override this (or serve + plain HTTP on a vhost alias) so the exporter can follow it. + Also override it if that host is not reachable from the + machine itself; the value must then be a name the vhost + answers to (add one via + {option}`services.nginx.virtualHosts..serverAliases`). + ''; + type = types.str; + default = "http://${vhostName}${optionalString hasListenPort ":${toString parsedPublicUri.port}"}"; + defaultText = lib.literalExpression '' + "http://" + host of publicUri + (if it has an explicit port then ":" else "") + ''; + }; + }; + }; + }; + + mcp = mkOption { + description = "Penpot MCP (Model Context Protocol) server."; + type = types.submodule { + options = { + enable = mkEnableOption "the Penpot MCP server" // { + default = true; + }; + redisUri = mkOption { + description = '' + Optional Redis URI enabling the multi-instance task routing + bridge ({env}`PENPOT_MCP_REDIS_URI`). Unset by default, which + runs the server in single-instance mode like upstream. + ''; + type = types.nullOr types.str; + default = null; + }; + }; + }; + }; + + nginx = mkOption { + description = "Reverse-proxy (nginx) configuration for the frontend."; + type = types.submodule { + options = { + enable = + mkEnableOption '' + the nginx vhost serving the frontend and proxying the backend, + exporter and MCP services. Required by both of them, since they + fetch rendered pages from the vhost. + '' + // { + default = true; + }; + forceHttps = mkOption { + description = '' + Whether to force HTTPS on the vhost + ({option}`services.nginx.virtualHosts..forceSSL`). + Only meaningful once TLS termination is configured for the + vhost (e.g. via Let's Encrypt); see the nginx NixOS module. + ''; + type = types.bool; + default = false; + }; + }; + }; + }; + }; + + config = mkIf cfg.enable (mkMerge [ + { + # The administrative CLI (create/update/delete-profile, change + # passwords, ...) talks to the backend prepl server on + # 127.0.0.1:6063, so it works out of the box on the machine running + # the backend. Requires the enable-prepl-server flag (default). + environment.systemPackages = [ cfg.package.backend ]; + } + + { + users.users.${penpotUser} = { + isSystemUser = true; + group = penpotGroup; + home = "/var/lib/penpot"; + description = "Penpot service user"; + }; + users.groups.${penpotGroup} = { }; + } + + (mkIf (cfg.storage.backend == "fs") { + # Ensure the assets directory exists before any unit runs (required by + # the backend unit's ReadWritePaths) with correct ownership. + systemd.tmpfiles.rules = [ + "d '${assetsDir}' 0755 ${penpotUser} ${penpotGroup} - -" + ]; + }) + + { + systemd.services.penpot-backend = { + description = "Penpot backend API server"; + wantedBy = [ "multi-user.target" ]; + requires = optional databaseCreateLocally "penpot-db-setup.service"; + wants = [ + "network-online.target" + ] + ++ optional databaseCreateLocally "postgresql-setup.service" + ++ optional redisCreateLocally "redis-penpot.service"; + after = [ + "network-online.target" + ] + ++ optional databaseCreateLocally "postgresql-setup.service" + ++ optional databaseCreateLocally "penpot-db-setup.service" + ++ optional redisCreateLocally "redis-penpot.service"; + environment = backendEnv; + serviceConfig = commonServiceConfig // { + User = penpotUser; + Group = penpotGroup; + StateDirectory = "penpot"; + # A custom storage.fs.directory may live outside the state + # directory; grant write access explicitly. Note that the nginx + # vhost must be able to READ this path as well. + ReadWritePaths = mkIf (cfg.storage.backend == "fs") [ assetsDir ]; + RestrictSUIDSGID = true; + TimeoutStopSec = 30; + LoadCredential = backendCredentials; + }; + script = '' + ${backendLoadSecretsSnippet} + exec ${lib.getExe cfg.package.backend} + ''; + }; + } + + { + systemd.services.penpot-exporter = mkIf exporterEnabled { + description = "Penpot exporter (headless design export)"; + wantedBy = [ "multi-user.target" ]; + wants = [ "network-online.target" ]; + after = [ "network-online.target" ]; + environment = exporterEnv; + serviceConfig = commonServiceConfig // { + User = penpotUser; + Group = penpotGroup; + RuntimeDirectory = "penpot-exporter"; + RuntimeDirectoryMode = "0750"; + # The exporter's http server binds all interfaces; when every + # peer (vhost, redis) is on loopback, restrict the service to + # loopback traffic at the network level. Otherwise restrict + # access through the system firewall (on by default). + IPAddressDeny = mkIf exporterLoopbackOnly [ "any" ]; + IPAddressAllow = mkIf exporterLoopbackOnly [ "localhost" ]; + # Playwright launches Chromium; allow its process model. + KillMode = "mixed"; + TimeoutStopSec = 15; + LoadCredential = exporterCredentials; + }; + script = '' + ${loadSecretKeySnippet} + exec ${lib.getExe cfg.package.exporter} + ''; + }; + + systemd.services.penpot-mcp = mkIf mcpEnabled { + description = "Penpot MCP (Model Context Protocol) server"; + wantedBy = [ "multi-user.target" ]; + wants = [ "network-online.target" ]; + after = [ "network-online.target" ]; + environment = mcpEnv; + serviceConfig = commonServiceConfig // { + User = penpotUser; + Group = penpotGroup; + ExecStart = "${cfg.package.mcp}/bin/penpot-mcp"; + RuntimeDirectory = "penpot-mcp"; + RuntimeDirectoryMode = "0700"; + # The websocket listener binds all interfaces (only the HTTP + # server honors PENPOT_MCP_SERVER_HOST); when the configured redis + # (if any) is on loopback, restrict the service to loopback + # traffic. Otherwise restrict access through the system firewall. + IPAddressDeny = mkIf mcpLoopbackOnly [ "any" ]; + IPAddressAllow = mkIf mcpLoopbackOnly [ "localhost" ]; + # The server does not close its websocket listener on SIGTERM; + # let systemd escalate to SIGKILL after a short grace period. + TimeoutStopSec = 5; + }; + }; + } + + { + # Dependency services when provisioned locally. + services.postgresql = mkIf databaseCreateLocally { + enable = mkDefault true; + ensureDatabases = [ cfg.database.name ]; + ensureUsers = [ + { + name = cfg.database.user; + ensureClauses.login = true; + } + ]; + }; + } + + # pgjdbc has no built-in unix-socket support, so the backend connects + # over loopback TCP. Without an explicit password file the penpot + # database is reachable from loopback without a password (a scoped + # `trust` rule, inserted before the module defaults); with one, the + # role password is provisioned below and the default md5 rule applies. + { + services.postgresql.authentication = mkBefore ( + optionalString (databaseCreateLocally && cfg.database.passwordFile == null) '' + host ${cfg.database.name} ${cfg.database.user} 127.0.0.1/32 trust + '' + ); + } + + # Provisioning that must run after the generic postgresql setup (which + # creates the database and role): the penpot role owns its database and + # schema (PostgreSQL 15+ no longer grants CREATE on `public` to other + # roles), and the optional role password comes from a credential. + { + systemd.services.penpot-db-setup = mkIf databaseCreateLocally { + description = "Provision the Penpot database ownership and credentials"; + wantedBy = [ "multi-user.target" ]; + after = [ "postgresql-setup.service" ]; + requires = [ "postgresql-setup.service" ]; + path = [ config.services.postgresql.package ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + User = "postgres"; + Group = "postgres"; + LoadCredential = optional ( + cfg.database.passwordFile != null + ) "database-password:${cfg.database.passwordFile}"; + }; + # The database name and role are constrained to plain SQL + # identifiers by their option types, so interpolating them into the + # statements below is injection-safe. The password (free-form) is + # escaped by doubling single quotes. + script = '' + psql --dbname=postgres --command="ALTER DATABASE ${cfg.database.name} OWNER TO ${cfg.database.user}" + psql --dbname=${cfg.database.name} --command="GRANT ALL ON SCHEMA public TO ${cfg.database.user}" + ${optionalString (cfg.database.passwordFile != null) '' + dbpass="$(tr -d '\r\n' < "$CREDENTIALS_DIRECTORY/database-password")" + # Piped via stdin so the password never appears in ps output. + printf 'ALTER ROLE ${cfg.database.user} PASSWORD %s\n' "'$(printf '%s' "$dbpass" | sed "s/'/'''/g")'" \ + | psql --dbname=postgres + ''} + ''; + }; + } + + { + # The redis NixOS module only offers a top-level package option in + # this nixpkgs, so this is shared with any other configured redis + # servers. mkDefault lets the user override it. + services.redis.package = mkDefault pkgs.valkey; + + services.redis.servers.penpot = mkIf redisCreateLocally { + enable = mkDefault true; + bind = "127.0.0.1"; + port = 6379; + settings = { + maxmemory = "128mb"; + maxmemory-policy = "volatile-lfu"; + }; + }; + } + + { + services.mailpit.instances.penpot = mkIf cfg.mailpit.enable { + listen = mkDefault "127.0.0.1:8025"; + smtp = mkDefault "127.0.0.1:1025"; + }; + + # Validation. + assertions = [ + { + assertion = cfg.publicUri != null && cfg.publicUri != ""; + message = "services.penpot.publicUri must be set (e.g. https://penpot.example.com)."; + } + { + assertion = cfg.secretKeyFile != null; + message = "services.penpot.secretKeyFile must point to a file containing the Penpot master secret key."; + } + { + assertion = + parsedPublicUri == null + || parsedPublicUri.path == null + || parsedPublicUri.path == "/" + || parsedPublicUri.path == ""; + message = "services.penpot.publicUri must not contain a path component; Penpot does not support subpath deployments."; + } + { + assertion = !databaseCreateLocally || cfg.database.uri == null; + message = "services.penpot.database.uri must not be set when services.penpot.database.createLocally is enabled."; + } + { + assertion = databaseCreateLocally || cfg.database.uri != null; + message = "services.penpot.database.uri must be set when services.penpot.database.createLocally is disabled."; + } + { + assertion = !redisCreateLocally || cfg.redis.uri == null; + message = "services.penpot.redis.uri must not be set when services.penpot.redis.createLocally is enabled."; + } + { + assertion = redisCreateLocally || cfg.redis.uri != null; + message = "services.penpot.redis.uri must be set when services.penpot.redis.createLocally is disabled."; + } + { + assertion = !exporterEnabled || cfg.nginx.enable; + message = "services.penpot.exporter requires services.penpot.nginx.enable (it fetches pages from the vhost)."; + } + { + assertion = !mcpEnabled || cfg.nginx.enable; + message = "services.penpot.mcp requires services.penpot.nginx.enable (the frontend proxies /mcp/* to it)."; + } + { + assertion = + !(cfg.storage.backend == "s3") + || (cfg.storage.s3.endpoint != null && cfg.storage.s3.bucket != null); + message = "services.penpot.storage.s3.endpoint and .bucket must be set when storage.backend is \"s3\"."; + } + { + assertion = vhostName != null; + message = '' + services.penpot.publicUri is not a supported URI (cannot derive + the vhost host name). Hostname-only hosts are expected; IPv6 + literal hosts are not supported. + ''; + } + { + assertion = !databaseCreateLocally || config.services.postgresql.enable; + message = "services.penpot.database.createLocally requires services.postgresql.enable."; + } + { + assertion = !redisCreateLocally || config.services.redis.servers.penpot.enable or false; + message = "services.penpot.redis.createLocally requires services.redis.servers.penpot.enable."; + } + { + assertion = !cfg.nginx.enable || config.services.nginx.enable; + message = "services.penpot.nginx.enable requires services.nginx.enable."; + } + ]; + + warnings = + optional isHttpUri "services.penpot.publicUri is plain HTTP; the disable-secure-session-cookies flag has been added automatically. Use HTTPS in production." + ++ + optional (databaseCreateLocally && cfg.database.passwordFile == null) + "services.penpot.database.createLocally has no password file; the penpot database accepts loopback connections without a password (scoped pg_hba trust rule). Set services.penpot.database.passwordFile for stricter auth."; + } + + nginxVhost + ]); +} diff --git a/packages/backend-woff-tools.nix b/packages/backend-woff-tools.nix new file mode 100644 index 0000000..6f6ea5d --- /dev/null +++ b/packages/backend-woff-tools.nix @@ -0,0 +1,47 @@ +# sfnt2woff / woff2sfnt, Jonathan Kew's reference WOFF <-> sfnt converters. +# Required by the Penpot backend for font format conversion, but not packaged +# in nixpkgs. Upstream's page (people.mozilla.org/~jkew/woff) is offline, so +# this uses the source mirror several distributions rely on. +{ + lib, + stdenv, + fetchFromGitHub, + zlib, +}: + +stdenv.mkDerivation { + pname = "woff-tools"; + version = "20091003"; + + src = fetchFromGitHub { + owner = "wget"; + repo = "woff-tools"; + rev = "20091003"; + hash = "sha256-GDF07R4dNfVz9S1bWkDndq4Zy916kkuaWu6nXYlZRkU="; + }; + + buildInputs = [ zlib ]; + + installPhase = '' + runHook preInstall + + install -Dm755 sfnt2woff $out/bin/sfnt2woff + install -Dm755 woff2sfnt $out/bin/woff2sfnt + install -Dm644 LICENSE $out/share/licenses/woff-tools/LICENSE + + runHook postInstall + ''; + + meta = { + description = "Convert TrueType/OpenType (sfnt) fonts to WOFF format and back"; + homepage = "https://github.com/wget/woff-tools"; + # woff.c carries the classic Mozilla tri-license. + license = with lib.licenses; [ + mpl11 + gpl2Plus + lgpl21Plus + ]; + platforms = lib.platforms.linux; + mainProgram = "sfnt2woff"; + }; +} diff --git a/packages/backend.nix b/packages/backend.nix new file mode 100644 index 0000000..638be00 --- /dev/null +++ b/packages/backend.nix @@ -0,0 +1,244 @@ +# Penpot backend (Clojure API server), packaged as the upstream source +# uberjar. Reproduces `backend/scripts/build`: a non-AOT uberjar executed +# through `clojure.main`, shipped with the log4j2 config and the onboarding +# template files mapped from the pinned penpot-files flake input. +# +# The uberjar is repacked by packages/jar-strip-deterministic.py (in the penpot +# checkout), replacing stripJavaArchivesHook, whose reorder is O(n^2) and took +# ~32 minutes on this jar. +# +# Output contract: +# $out/share/penpot-backend/{penpot.jar,log4j2.xml,version.txt,manage.py} +# $out/share/penpot-backend/builtin-templates/ +# $out/bin/penpot-backend (java wrapper, cwd = share dir) +# $out/bin/penpot-manage (manage.py CLI via python3 + tabulate) +{ + lib, + stdenv, + makeWrapper, + callPackage, + clojure, + jdk25_headless, + babashka, + imagemagick, + fontforge, + woff2, + fontconfig, + util-linux, + python3, + penpot, + penpot-files, + version, + subSrc, +}: + +let + src = subSrc penpot [ + "backend" + "common" + "CHANGES.md" + ]; + + # Replaces stripJavaArchivesHook: a stdlib-python deterministic repack of the + # uberjar, replicating strip-nondeterminism's jar/zip handlers (see the + # script's docstring for the full list). Its per-member reorder is O(n^2), + # which cost ~32 minutes on this jar's 54000 entries; this does it in ~20 s. + jarNormalizer = ./jar-strip-deterministic.py; +in +let + # sfnt2woff/woff2sfnt are not in nixpkgs; see backend-woff-tools.nix. + woff-tools = callPackage ./backend-woff-tools.nix { }; + + # The clojure CLI with a JDK matching the runtime (upstream run.sh flags + # need >= 24; the nixpkgs default CLI bundles JDK 21). + clojureJdk25 = clojure.override { jdk = jdk25_headless; }; + + magickPolicy = callPackage ./imagemagick-policy.nix { inherit penpot; }; + + pythonEnv = python3.withPackages (ps: [ ps.tabulate ]); + + # NOTE: upstream's docker image runs Zulu JDK 26 at 2.17.x; any JDK >= 24 + # satisfies the run.sh flags, so the nixpkgs JDK 25 is used here. Revisit + # when bumping the penpot input. + # Binaries the backend shells out to at runtime (image/font processing), + # baked into the wrapper's PATH. + # util-linux: provides prlimit; upstream runs font-processing subprocesses + # under it (app.media.local/exec-font!), see also app.util.shell/prlimit-cmd. + runtimeBinPath = lib.makeBinPath [ + imagemagick + fontforge + woff2 + woff-tools + fontconfig + util-linux + ]; + + # Offline Clojure dependencies: eval-time cache from deps-lock.json + # (no fixed-output derivation) + fake-git shim + short-SHA expansion. + cljOffline = callPackage ./clj-offline.nix { }; + + builtinTemplates = stdenv.mkDerivation { + name = "penpot-backend-builtin-templates"; + src = "${src}/backend"; + + nativeBuildInputs = [ + babashka + ]; + + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + # The file contents come from the pinned penpot-files flake input, so + # this hash only changes when that input (or the template list in + # onboarding.edn) changes. On a penpot input bump: run + # `nix flake update penpot-files` first (a missing file fails the build + # loudly), then set to lib.fakeHash, build once, copy the `got:` hash + # from the failure message. + outputHash = "sha256-b03i34xCfKHie5AjT7is3o9kqIzcSU/nPl7mV1gu+u0="; + dontFixup = true; + + dontBuild = true; + + installPhase = '' + runHook preInstall + + export HOME="$TMPDIR/home" + mkdir -p "$HOME" + + # Map onboarding.edn (id, file-uri) pairs to files from the pinned + # penpot-files input. EDN-native parsing via babashka; basenames are + # URL-decoded (upstream file-uris contain %20 etc.). + cat > "$TMPDIR/map-templates.clj" <<'EOF' + (require '[babashka.fs :as fs] + '[clojure.edn :as edn] + '[clojure.string :as str]) + (import '[java.net URLDecoder]) + + (let [[defs-path files-dir dest] *command-line-args* + data (edn/read-string (slurp defs-path))] + (fs/create-dirs dest) + (doseq [{:keys [id file-uri]} data] + ;; Basename of file-uri, minus any query/fragment; literal `+` + ;; is protected before URL-decoding (`URLDecoder` maps `+` to + ;; space, but upstream names use `%20` for spaces). + (let [fname (-> file-uri + (str/split #"/") last + (str/split #"[?#]") first + (str/replace "+" "%2B") + (URLDecoder/decode "UTF-8")) + src-file (fs/file files-dir fname)] + (when-not (fs/exists? src-file) + (println (format "template file %s (id: %s) not found" fname id)) + (System/exit 1)) + (println (format "=> installing %s" id)) + (fs/copy src-file (fs/file dest id))))) + EOF + + bb "$TMPDIR/map-templates.clj" \ + resources/app/onboarding.edn \ + "${penpot-files}" \ + "$out/templates" + + runHook postInstall + ''; + }; +in +stdenv.mkDerivation { + pname = "penpot-backend"; + inherit version src; + + nativeBuildInputs = [ + clojureJdk25 + cljOffline.fake-git + cljOffline.clj-builder + makeWrapper + # Repacks the jar deterministically during fixup. Replaces + # stripJavaArchivesHook, whose O(n^2) member reorder needs ~32 minutes on + # this jar (54000 entries); see jarNormalizer above. + python3 + ]; + + configurePhase = '' + runHook preConfigure + + # Offline dependency resolution from the eval-time clj-nix cache. + ${cljOffline.setup} + + runHook postConfigure + ''; + + buildPhase = '' + runHook preBuild + + ( + cd backend + mkdir -p target/classes + echo "$version" > target/classes/version.txt + cp ../CHANGES.md target/classes/changelog.md + clojure -T:build jar + ) + + runHook postBuild + ''; + + installPhase = /* sh */ '' + runHook preInstall + + share="$out/share/penpot-backend" + mkdir -p "$share" "$out/bin" + + install -Dm644 backend/target/penpot.jar "$share/penpot.jar" + install -Dm644 backend/resources/log4j2.xml "$share/log4j2.xml" + cp -r "${builtinTemplates}/templates" "$share/builtin-templates" + echo "$version" > "$share/version.txt" + + # Deterministic repack (see jarNormalizer). The uber task stamps + # entries with wall-clock time, so this can't be skipped. + python3 ${jarNormalizer} "$share/penpot.jar" + + # manage.py hardcodes the prepl endpoint as the argparse default; patch + # it to honor the PREPL_URI environment variable instead. + install -Dm755 backend/scripts/manage.py "$share/manage.py" + substituteInPlace "$share/manage.py" \ + --replace-fail 'import argparse' 'import argparse + import os' \ + --replace-fail 'default="tcp://localhost:6063"' 'default=os.environ.get("PREPL_URI", "tcp://localhost:6063")' + + # Flags mirror backend/scripts/run.template.sh, except + # --add-opens=java.base/java.nio (not upstream; needed by + # yetti/lettuce for direct NIO buffer access on modern JDKs). + # $JAVA_OPTS and $PENPOT_ENTRYPOINT are embedded verbatim by + # makeWrapper and expand at runtime, like in the upstream run.sh. + makeWrapper "${jdk25_headless}/bin/java" "$out/bin/penpot-backend" \ + --chdir "$share" \ + --prefix PATH : "${runtimeBinPath}" \ + --set MAGICK_CONFIGURE_PATH "${magickPolicy}/etc/ImageMagick-7" \ + --set-default PENPOT_ENTRYPOINT app.main \ + --add-flags '-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager' \ + --add-flags '-Dlog4j2.configurationFile=log4j2.xml' \ + --add-flags '-XX:-OmitStackTraceInFastThrow' \ + --add-flags '--sun-misc-unsafe-memory-access=allow' \ + --add-flags '--enable-native-access=ALL-UNNAMED' \ + --add-flags '--add-opens=java.base/java.nio=ALL-UNNAMED' \ + --add-flags '--enable-preview' \ + --add-flags '$JAVA_OPTS' \ + --add-flags '-jar penpot.jar -m $PENPOT_ENTRYPOINT' + + makeWrapper "${pythonEnv}/bin/python" "$out/bin/penpot-manage" \ + --add-flags "$share/manage.py" + + runHook postInstall + ''; + + passthru = { + inherit builtinTemplates; + version = version; + }; + + meta = { + description = "Penpot backend API server (Clojure uberjar)"; + homepage = "https://penpot.app"; + license = lib.licenses.mpl20; + platforms = lib.platforms.linux; + mainProgram = "penpot-backend"; + }; +} diff --git a/packages/clj-offline.nix b/packages/clj-offline.nix new file mode 100644 index 0000000..75b3a6a --- /dev/null +++ b/packages/clj-offline.nix @@ -0,0 +1,46 @@ +# Shared offline Clojure dependency wiring, backed by clj-nix. +# +# `mk-deps-cache` materializes `deps-lock.json` (committed at the repo root) +# purely at eval time — `fetchurl` per Maven artifact, `fetchgit` per git +# dep — so consumer builds resolve fully offline and deterministically, with +# no fixed-output derivation involved. +# +# Consumers: point tools.deps at the cache (same recipe as clj-nix's own +# builder), expand short `:git/sha` pins to full SHAs from the lock, and +# keep `fake-git` (a `git` shim answering rev-parse/tag/merge-base from lock +# metadata) on PATH for any stray git invocation. +{ + mk-deps-cache, + fake-git, + clj-builder, +}: +let + cache = mk-deps-cache { + lockfile = ../deps-lock.json; + }; +in +{ + inherit cache fake-git clj-builder; + + # Shell fragment for consumer preBuild/configure phases. Must run in the + # project root (the directory `deps-lock.json` is copied into), before any + # `clojure` invocation. Uses a writable HOME with symlinks into the + # read-only cache (pnpm and friends need a writable HOME; clojure + # resolution follows the symlinks). + setup = '' + export HOME="$TMPDIR/home" + mkdir -p "$HOME" + ln -sfn "${cache}/.m2" "$HOME/.m2" + ln -sfn "${cache}/.gitlibs" "$HOME/.gitlibs" + ln -sfn "${cache}/.clojure" "$HOME/.clojure" + # The JVM resolves user.home from /etc/passwd rather than $HOME; force + # it so tools.deps resolves from the cache instead of attempting + # network downloads. + export JAVA_TOOL_OPTIONS="-Duser.home=$HOME" + export CLJ_CONFIG="$HOME/.clojure" + export CLJ_CACHE="$TMPDIR/cp_cache" + export GITLIBS="$HOME/.gitlibs" + cp "${../deps-lock.json}" deps-lock.json + clj-builder patch-git-sha "$(pwd)" + ''; +} diff --git a/packages/exporter.nix b/packages/exporter.nix new file mode 100644 index 0000000..8abd8f1 --- /dev/null +++ b/packages/exporter.nix @@ -0,0 +1,223 @@ +# Penpot exporter: the ClojureScript -> Node.js headless export service +# (renders designs via Playwright/Chromium, talks to redis + the Penpot +# internal API). +# +# Upstream builds this with a pnpm workspace + shadow-cljs and ships the +# `target/` dir of exporter/scripts/build as the runtime bundle. This package +# reproduces that bundle with everything materialized offline: node_modules +# from a pre-fetched pnpm store and maven/git deps from the eval-time +# clj-nix cache, and chromium comes +# from nixpkgs instead of `playwright install`. (The render-wasm based +# exporter rendering postdates the 2.17.x line this package tracks, so the +# wasm artifacts are not consumed here.) +{ + lib, + stdenv, + runCommand, + callPackage, + penpot, + version, + subSrc, + nodejs_24, + pnpm_11, + fetchPnpmDeps, + pnpmConfigHook, + clojure, + jdk25_headless, + chromium, + makeWrapper, + imagemagick, + poppler-utils, + potrace, + netpbm, + makeFontsConf, + noto-fonts-color-emoji, + unifont, + liberation_ttf, + freefont_ttf, + ipafont, + wqy_zenhei, + tlwg, +}: + +let + # The exporter workspace plus the `common` cljs sources it compiles in + # (exporter/deps.edn and shadow-cljs.edn reference ../common). + src = subSrc penpot [ + "exporter" + "common" + ]; + + # exporter/deps.edn's :shadow-cljs alias passes + # `--sun-misc-unsafe-memory-access=allow` to the JVM; that option needs + # JDK >= 23 while nixpkgs' default clojure bundles JDK 21. + clojureJdk25 = clojure.override { jdk = jdk25_headless; }; + + # npm dependencies of the exporter workspace, fetched once into a pnpm + # store in a fixed-output derivation and materialized offline in the main + # build via pnpmConfigHook. Lifecycle scripts are skipped: nothing in this + # dependency set needs them for runtime (playwright's postinstall is + # informational only), and the playwright browser download is replaced by + # the browsers dir below. + exporterSrc = subSrc penpot [ "exporter" ]; + + # Same storeDir workaround as frontend.nix: 2.18 adds a shared + # `storeDir: ../.pnpm-store` to the workspace's pnpm-workspace.yaml, which + # breaks the per-workspace fixed-output fetch and the offline install; + # strip it in this pre-fetch source copy (and again in the consumer build's + # postPatch below). Named "source" so the dir-source unpack lands where + # sourceRoot expects it. + exporterSrcP = runCommand "source" { } '' + mkdir "$out" + cp -r "${exporterSrc}"/. "$out"/ + chmod -R u+w "$out" + find "$out" -name pnpm-workspace.yaml -exec sed -i '/^storeDir:/d' {} + + ''; + + pnpmDeps = fetchPnpmDeps { + pname = "penpot-exporter"; + inherit version; + src = exporterSrcP; + sourceRoot = "source/exporter"; + pnpm = pnpm_11; + # fetcherVersion 4 is required for pnpm 11 (older fetchers are rejected). + fetcherVersion = 4; + hash = "sha256-fGjKhjCEb4+2Nwd5xppow6YfjmgFQjXddHlsSSmr6Eo="; + }; + + # Offline Clojure dependencies: eval-time cache from deps-lock.json + # (no fixed-output derivation) + fake-git shim + short-SHA expansion. + cljOffline = callPackage ./clj-offline.nix { }; + + magickPolicy = callPackage ./imagemagick-policy.nix { inherit penpot; }; + + # Fonts matching the upstream exporter image (docker/Dockerfile.exporter): + # emoji, bitmap fallback (covers the cyrillic/scalable X fonts), latin, + # gothic, Thai (tlwg) and CJK coverage. + fontsConf = makeFontsConf { + fontDirectories = [ + noto-fonts-color-emoji + unifont + liberation_ttf + freefont_ttf + ipafont + wqy_zenhei + tlwg + ]; + }; + + # Executable path layouts that playwright-core resolves below + # $PLAYWRIGHT_BROWSERS_PATH (see its registry: EXECUTABLE_PATHS differ + # between linux-x64 and linux-arm64). NOTE: these paths are + # registry-version-dependent; re-verify against the vendored + # playwright-core when the lockfile bumps playwright. + # The headless-shell slot is served by the full chromium build (nixpkgs + # does not package the separate headless shell). + chromeDir = if stdenv.hostPlatform.isx86_64 then "chrome-linux64" else "chrome-linux"; + headlessShellDir = + if stdenv.hostPlatform.isx86_64 then "chrome-headless-shell-linux64" else "chrome-linux"; + headlessShellBin = + if stdenv.hostPlatform.isx86_64 then "chrome-headless-shell" else "headless_shell"; +in +stdenv.mkDerivation (finalAttrs: { + pname = "penpot-exporter"; + inherit version; + + inherit src; + + nativeBuildInputs = [ + clojureJdk25 + cljOffline.fake-git + cljOffline.clj-builder + makeWrapper + nodejs_24 + pnpm_11 + pnpmConfigHook + ]; + + env.NODE_ENV = "production"; + + inherit pnpmDeps; + + dontConfigure = true; + # pnpmConfigHook is invoked manually inside installPhase (configure is + # disabled), after cd'ing into the exporter workspace. + dontPnpmConfigure = true; + dontBuild = true; + + installPhase = '' + runHook preInstall + + # Offline clojure dependency caches for the shadow-cljs release build. + # Runs at the source root so patch-git-sha sees exporter/deps.edn and + # common/deps.edn. The JVM resolves user.home from /etc/passwd rather + # than $HOME; force it so tools.deps resolves from the eval-time cache + # instead of attempting network downloads. + ${cljOffline.setup} + + cd exporter + + # Strip 2.18's shared pnpm storeDir so the offline install uses the + # fetched store (see the note on exporterSrcP). + find .. -name pnpm-workspace.yaml -maxdepth 3 -exec sed -i '/^storeDir:/d' {} + + + # Materialize node_modules offline from the pre-fetched pnpm store. + pnpmConfigHook + + clojure -M:dev:shadow-cljs release main + + # The compiled app.js carries a literal %version% placeholder + # (upstream exporter/scripts/build substitutes it the same way). + sed -i "s/%version%/${finalAttrs.version}/g" target/app.js + + # Assemble the runtime dir (the equivalent of upstream's target/). + mkdir -p $out/lib/penpot-exporter + cp target/app.js target/app.js.map $out/lib/penpot-exporter/ + cp package.json pnpm-lock.yaml $out/lib/penpot-exporter/ + # Upstream ships pnpm-workspace.yaml emptied out; keep the same. + touch $out/lib/penpot-exporter/pnpm-workspace.yaml + cp -a --preserve=links node_modules $out/lib/penpot-exporter/node_modules + + # Pre-materialized playwright browser dir: playwright-core resolves + # $PLAYWRIGHT_BROWSERS_PATH/chromium-/... from its own + # browsers.json, so derive the revision from the exporter's tree and + # point both chromium flavors at the nixpkgs build. + pwRevision=$(node -p "JSON.parse(require('fs').readFileSync(process.argv[1], 'utf8')).browsers.find(b => b.name === 'chromium').revision" \ + node_modules/.pnpm/playwright-core@*/node_modules/playwright-core/browsers.json) + browsers=$out/lib/penpot-exporter-browsers + mkdir -p $browsers/chromium-$pwRevision/${chromeDir} + ln -s ${chromium}/bin/chromium $browsers/chromium-$pwRevision/${chromeDir}/chrome + mkdir -p $browsers/chromium_headless_shell-$pwRevision/${headlessShellDir} + ln -s ${chromium}/bin/chromium \ + $browsers/chromium_headless_shell-$pwRevision/${headlessShellDir}/${headlessShellBin} + + mkdir -p $out/bin + makeWrapper ${nodejs_24}/bin/node $out/bin/penpot-exporter \ + --add-flags "$out/lib/penpot-exporter/app.js" \ + --chdir $out/lib/penpot-exporter \ + --prefix PATH : ${ + lib.makeBinPath [ + imagemagick + poppler-utils + potrace + netpbm + nodejs_24 + ] + } \ + --set NODE_ENV production \ + --set MAGICK_CONFIGURE_PATH "${magickPolicy}/etc/ImageMagick-7" \ + --set FONTCONFIG_FILE ${fontsConf} \ + --set PLAYWRIGHT_BROWSERS_PATH $out/lib/penpot-exporter-browsers + + runHook postInstall + ''; + + passthru.version = finalAttrs.version; + + meta = { + description = "Penpot exporter service (headless design export via Chromium)"; + license = lib.licenses.mpl20; + platforms = lib.platforms.linux; + mainProgram = "penpot-exporter"; + }; +}) diff --git a/packages/frontend.nix b/packages/frontend.nix new file mode 100644 index 0000000..a3efe5f --- /dev/null +++ b/packages/frontend.nix @@ -0,0 +1,247 @@ +# Penpot frontend: compiles the upstream ClojureScript/JS monorepo into the +# static site served by nginx ($out/dist, mirroring upstream `bundles/frontend`). +# +# Mirrors upstream `frontend/scripts/build`: +# 1. render-wasm artifacts are placed where the wasm cljs glue expects them +# (instead of building the wasm in-tree). +# 2. MCP plugin is built (its own pnpm workspace). +# 3. Official plugins are built (their own pnpm workspace); the plugins +# runtime library is built first since the cljs build links it. +# 4. shadow-cljs release build of the `main` and `worker` builds. +# 5. esbuild bundling of the JS libs. +# 6. Asset compilation (styles, sprites, translations, templates, ...). +# 7. Finalization: worker render.js cache-busting, rsync into dist, +# plugins, version.txt. +{ + lib, + callPackage, + penpot, + version, + subSrc, + stdenv, + stdenvNoCC, + runCommand, + nodejs_24, + pnpm_11, + clojure, + jdk25_headless, + rsync, + patchelf, + fetchPnpmDeps, + pnpmConfigHook, + # Named renderWasm (not `wasm`) so pkgs.callPackage cannot auto-fill it + # with nixpkgs' unrelated `pkgs.wasm` (the OCaml interpreter). + renderWasm ? callPackage ./render-wasm.nix { inherit penpot version; }, +}: + +let + src = subSrc penpot [ + "frontend" + "common" + "mcp" + "plugins" + ]; + + # The frontend workspace links `../plugins/libs/plugins-runtime` during + # install, so plugins/ must be present in its fetch source too. + frontendSrc = subSrc penpot [ + "frontend" + "plugins" + ]; + pluginsSrc = subSrc penpot [ "plugins" ]; + mcpSrc = subSrc penpot [ "mcp" ]; + + # One pnpm store per workspace (fetched once, reused for the offline + # installs in the main build via pnpmConfigHook). + # + # 2.18 adds a shared `storeDir: ../.pnpm-store` to every workspace's + # pnpm-workspace.yaml; our fetches and consumer installs are per-workspace, + # so strip that line before the fixed-output fetch (the main build removes + # it again in postPatch). + patchedPnpmSrc = + name: wsrc: + # Named "source" (see the note on `mcpSrcP` in mcp.nix): the deps FOD + # relies on the dir-source unpack landing at /build/source so that + # sourceRoot = "source/" resolves. + runCommand "source" { } '' + mkdir "$out" + cp -r "${wsrc}"/. "$out"/ + chmod -R u+w "$out" + find "$out" -name pnpm-workspace.yaml -exec sed -i '/^storeDir:/d' {} + + ''; + + fetchWorkspaceDeps = + pname: sourceRoot: wsrc: hash: + fetchPnpmDeps { + inherit pname sourceRoot hash; + pnpm = pnpm_11; + fetcherVersion = 4; + src = patchedPnpmSrc pname wsrc; + }; + + frontendPnpmDeps = + fetchWorkspaceDeps "penpot-frontend-frontend" "source/frontend" frontendSrc + "sha256-zZxUFuyWLMxIse5AjPwEAmq/fJ9tbGYkcG2kG68HV4U="; + pluginsPnpmDeps = + fetchWorkspaceDeps "penpot-frontend-plugins" "source/plugins" pluginsSrc + "sha256-Tq6aSL0lHFCfQo5H94d+XNGeY2oMNYG2J8YOQhYl3T8="; + mcpPnpmDeps = + fetchWorkspaceDeps "penpot-frontend-mcp" "source/mcp" mcpSrc + "sha256-99ef/Qk3tx+etEqepQQVqAW3XL7T1Kr6qQJ7Uxf1z0Y="; + + # Upstream's deps.edn passes --sun-misc-unsafe-memory-access=allow, which + # needs a newer JDK than the one the clojure CLI wrapper ships with. + clojureJdk25 = clojure.override { jdk = jdk25_headless; }; + + # Upstream leaves a few dev deps on "RELEASE"; pin them so the lockfile + # generation and the (offline) shadow-cljs build resolve the same + # deterministic, purely local maven versions. + pinDepsEdn = '' + sed -i frontend/deps.edn \ + -e 's|binaryage/devtools {:mvn/version "RELEASE"}|binaryage/devtools {:mvn/version "1.0.7"}|' \ + -e 's|org.clojure/tools.namespace {:mvn/version "RELEASE"}|org.clojure/tools.namespace {:mvn/version "1.5.1"}|' \ + -e 's|com.bhauman/rebel-readline {:mvn/version "RELEASE"}|com.bhauman/rebel-readline {:mvn/version "0.1.11"}|' + ''; + + # Offline Clojure dependencies: eval-time cache from deps-lock.json + # (no fixed-output derivation) + fake-git shim + short-SHA expansion. + # Resolution runs offline from the cache on every build; no cpcache needed. + cljOffline = callPackage ./clj-offline.nix { }; +in +stdenvNoCC.mkDerivation { + pname = "penpot-frontend"; + inherit version; + inherit src; + + # Local carries of upstream plugin API fixes (see the patches for the + # upstream issue references). Remove once the `penpot` input contains them. + patches = [ + ./patches/plugin-library-name-path.patch + ./patches/plugin-typography-lineheight.patch + ]; + + nativeBuildInputs = [ + nodejs_24 + pnpm_11 + pnpmConfigHook + clojureJdk25 + cljOffline.fake-git + cljOffline.clj-builder + rsync + patchelf + ]; + + # pnpmConfigHook is invoked once per workspace in preBuild instead + # (dontPnpmConfigure disables the implicit single-workspace run). + dontPnpmConfigure = true; + + postPatch = '' + ${pinDepsEdn} + # 2.18's shared pnpm store config would redirect the offline installs + # away from the fetched per-workspace stores. + find . -name pnpm-workspace.yaml -exec sed -i '/^storeDir:/d' {} + + ''; + + env = { + NODE_ENV = "production"; + # Baked into the cljs output (app.config/compiled-version-tag). + VERSION = version; + # Upstream appends the wall-clock build time (VERSION_TAG = + # "$VERSION-$BUILD_TS"); a plain version keeps the build deterministic + # while still busting caches. TEMPORARY: the -fix suffix forces clients + # to fetch the patched bundle while the local patches are carried. + VERSION_TAG = "${version}-fix2"; + # _helpers.js embeds these in the bundle when set; pin them for + # reproducibility (upstream exports the wall clock). + BUILD_DATE = "Thu Jan 01 00:00:00 UTC 1970"; + BUILD_TS = "0"; + }; + + preBuild = '' + # pnpmConfigHook honors two variables: $pnpmRoot (where the workspace + # lives; the hook pushd's into it) and $pnpmDeps (the fetched store, + # visible to the hook via bash dynamic scoping from the local). + installWorkspace() { + local pnpmRoot="$1" pnpmDeps="$2" + pnpmConfigHook + } + + installWorkspace frontend ${frontendPnpmDeps} + installWorkspace plugins ${pluginsPnpmDeps} + installWorkspace mcp ${mcpPnpmDeps} + + # sass-embedded ships a prebuilt dart VM expecting the host loader. + sassPkg=${ + if stdenvNoCC.hostPlatform.isx86_64 then "sass-embedded-linux-x64" else "sass-embedded-linux-arm64" + } + patchelf --set-interpreter "$(cat ${stdenv.cc.bintools}/nix-support/dynamic-linker)" \ + frontend/node_modules/.pnpm/$sassPkg@*/node_modules/$sassPkg/dart-sass/src/dart + ''; + + buildPhase = '' + runHook preBuild + + # 1. render-wasm artifacts. + mkdir -p frontend/src/app/render_wasm/api frontend/resources/public/js/worker + install -m644 ${renderWasm}/render-wasm.js ${renderWasm}/render-wasm.wasm frontend/resources/public/js/ + install -m644 ${renderWasm}/worker/render.js frontend/resources/public/js/worker/render.js + install -m644 ${renderWasm}/shared.js frontend/src/app/render_wasm/api/shared.js + + # 2. MCP plugin. + (cd mcp && WS_URI=/mcp/ws pnpm run --filter mcp-plugin build) + + # 3. Official plugins. + (cd plugins/libs/plugins-runtime && pnpm run build) + (cd plugins && pnpm run build:plugins) + + # 4. Main cljs build, resolving offline from the eval-time clj-nix cache. + ${cljOffline.setup} + + (cd frontend && pnpm run build:app:main) + (cd frontend && pnpm run build:app:libs) + (cd frontend && pnpm run build:app:assets) + + # 5. Finalize the compiled assets (the dist assembly itself happens in + # installPhase). + sed -i "s|\./render.js|./render.js?version=$version|g" frontend/resources/public/js/worker/main*.js + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + mkdir -p $out/dist + rsync -a frontend/resources/public/ $out/dist/ + rsync -a plugins/dist/apps/ $out/dist/plugins/ + mkdir -p $out/dist/plugins/mcp + rsync -a mcp/packages/plugin/dist/ $out/dist/plugins/mcp/ + echo "$version" > $out/dist/version.txt + install -m644 ${penpot}/LICENSE $out/dist/LICENSE + + # The NixOS module re-renders flags into the config template at system + # build time; upstream also serves it from dist/js/config.js. + install -m644 ${penpot}/docker/images/files/config.js $out/config.js + install -m644 ${penpot}/docker/images/files/config.js $out/dist/js/config.js + + runHook postInstall + ''; + + # The pnpm stores are exposed so a version bump can rehash them directly + # (`nix build .#penpot-frontend.` with hash = lib.fakeHash). + passthru = { + inherit + version + frontendPnpmDeps + pluginsPnpmDeps + mcpPnpmDeps + ; + }; + + meta = { + description = "Penpot frontend static bundle"; + homepage = "https://penpot.app"; + license = lib.licenses.mpl20; + platforms = lib.platforms.linux; + }; +} diff --git a/packages/imagemagick-policy.nix b/packages/imagemagick-policy.nix new file mode 100644 index 0000000..366d27b --- /dev/null +++ b/packages/imagemagick-policy.nix @@ -0,0 +1,11 @@ +# Hardened ImageMagick policy shipped by the upstream images (resource caps +# and PS/EPS/PDF/XPS coders disabled); nixpkgs' default policy is +# unrestricted and the backend/exporter process user-controlled content. +{ + runCommand, + penpot, +}: +runCommand "penpot-imagemagick-policy" { } '' + install -Dm644 "${penpot}/docker/images/files/imagemagick-policy.xml" \ + "$out/etc/ImageMagick-7/policy.xml" +'' diff --git a/packages/jar-strip-deterministic.py b/packages/jar-strip-deterministic.py new file mode 100644 index 0000000..9ab30ff --- /dev/null +++ b/packages/jar-strip-deterministic.py @@ -0,0 +1,228 @@ +#!/usr/bin/env python3 +"""Deterministic repack of a jar, replicating stripJavaArchivesHook for the +penpot backend uberjar. + +Nix's stripJavaArchivesHook runs strip-nondeterminism, which drives the +perl Archive::Zip module. Two problems made it unusable here: + + * its per-member removeMember/addMember reorder loop is O(n^2) in the entry + count (linear member search + full array rebuild per entry), so the + 54000-entry, 109 MB penpot jar spent ~32 minutes there; + * Archive::Zip derives the DOS timestamps with localtime, so the result + depended on the build machine's timezone. + +This script reproduces the same semantics (jar.pm + zip.pm handlers) with the +stdlib zipfile module: read each entry once, sort the entry list, write it in a +single pass. The result is byte-identical across runs and timezones, and costs +seconds instead of minutes. + +Semantics replicated from strip-nondeterminism: + * entry order: META-INF/ first, then META-INF/MANIFEST.MF, then lexicographic + * canonical time: Archive::Zip SAFE_EPOCH (1980-01-01 12:01:00 local), used + here as a fixed UTC tuple so the output never depends on $TZ + * .clj entries are stamped 2 DOS seconds (1 unix second) earlier, so that + Clojure never mistakes a .clj for a stale .class + * META-INF/MANIFEST.MF: drop Bnd-LastModified:/Built-By: lines + * .html with a `